Skip to content

Commit 9627ae1

Browse files
Add checkout attribute management functionality (by store) #570 (#609)
* Add checkout attribute management functionality (by store manager)
1 parent b675cc7 commit 9627ae1

File tree

15 files changed

+1267
-3
lines changed

15 files changed

+1267
-3
lines changed

src/Modules/Grand.Module.Installer/Extensions/PermissionExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ public static IEnumerable<DefaultPermission> DefaultPermissions()
211211
StandardPermission.ManagePaymentTransactions,
212212
StandardPermission.ManageShipments,
213213
StandardPermission.ManageMerchandiseReturns,
214+
StandardPermission.ManageCheckoutAttribute,
214215
StandardPermission.ManageReports
215216
]
216217
},

src/Web/Grand.Web.AdminShared/Interfaces/ICheckoutAttributeViewModelService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace Grand.Web.AdminShared.Interfaces;
55

66
public interface ICheckoutAttributeViewModelService
77
{
8-
Task<IEnumerable<CheckoutAttributeModel>> PrepareCheckoutAttributeListModel();
8+
Task<IEnumerable<CheckoutAttributeModel>> PrepareCheckoutAttributeListModel(string storeId = "");
99
Task<IEnumerable<CheckoutAttributeValueModel>> PrepareCheckoutAttributeValuesModel(string checkoutAttributeId);
1010
Task<CheckoutAttributeModel> PrepareCheckoutAttributeModel();
1111
Task<CheckoutAttributeValueModel> PrepareCheckoutAttributeValueModel(string checkoutAttributeId);

src/Web/Grand.Web.AdminShared/Services/CheckoutAttributeViewModelService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ public class CheckoutAttributeViewModelService(
2727
IEnumTranslationService enumTranslationService)
2828
: ICheckoutAttributeViewModelService
2929
{
30-
public virtual async Task<IEnumerable<CheckoutAttributeModel>> PrepareCheckoutAttributeListModel()
30+
public virtual async Task<IEnumerable<CheckoutAttributeModel>> PrepareCheckoutAttributeListModel(string storeId = "")
3131
{
32-
var checkoutAttributes = await checkoutAttributeService.GetAllCheckoutAttributes(ignoreAcl: true);
32+
var checkoutAttributes = await checkoutAttributeService.GetAllCheckoutAttributes(storeId: storeId, ignoreAcl: true);
3333
return checkoutAttributes.Select((Func<CheckoutAttribute, CheckoutAttributeModel>)(x =>
3434
{
3535
var attributeModel = x.ToModel();
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
@model CheckoutAttributeModel
2+
@{
3+
//page title
4+
ViewBag.Title = Loc["Admin.Orders.CheckoutAttributes.AddNew"];
5+
}
6+
<form asp-area="@Constants.AreaStore" asp-controller="CheckoutAttribute" asp-action="Create" method="post" id="checkoutattribute-form">
7+
8+
<div class="row">
9+
<div class="col-md-12">
10+
<div class="x_panel light form-fit">
11+
<div class="x_title">
12+
<div class="caption">
13+
<i class="fa fa-list-alt"></i>
14+
@Loc["Admin.Orders.CheckoutAttributes.AddNew"]
15+
<small>
16+
<i class="fa fa-arrow-circle-left"></i>@Html.ActionLink(Loc["Admin.Orders.CheckoutAttributes.BackToList"], "List")
17+
</small>
18+
</div>
19+
<div class="actions">
20+
<div class="btn-group btn-group-devided">
21+
<button class="btn btn-success" type="submit" name="save">
22+
<i class="fa fa-check"></i> @Loc["Admin.Common.Save"]
23+
</button>
24+
<button class="btn btn-success" type="submit" name="save-continue">
25+
<i class="fa fa-check-circle"></i> @Loc["Admin.Common.SaveContinue"]
26+
</button>
27+
<vc:admin-widget widget-zone="checkout_attribute_details_buttons" additional-data="null"/>
28+
</div>
29+
</div>
30+
</div>
31+
<div class="x_content form">
32+
<partial name="Partials/CreateOrUpdate" model="Model"/>
33+
</div>
34+
</div>
35+
</div>
36+
</div>
37+
</form>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
@model CheckoutAttributeModel
2+
3+
@{
4+
//page title
5+
ViewBag.Title = Loc["Admin.Orders.CheckoutAttributes.EditAttributeDetails"];
6+
}
7+
<form asp-area="@Constants.AreaStore" asp-controller="CheckoutAttribute" asp-action="Edit" method="post" id="checkoutattribute-form">
8+
9+
<div class="row">
10+
<div class="col-md-12">
11+
<div class="x_panel light form-fit">
12+
<div class="x_title">
13+
<div class="caption">
14+
<i class="fa fa-list-alt"></i>
15+
@Loc["Admin.Orders.CheckoutAttributes.EditAttributeDetails"] - @Model.Name
16+
<small>
17+
<i class="fa fa-arrow-circle-left"></i>@Html.ActionLink(Loc["Admin.Orders.CheckoutAttributes.BackToList"], "List")
18+
</small>
19+
</div>
20+
<div class="actions">
21+
<div class="btn-group btn-group-devided util-btn-margin-bottom-5">
22+
<button class="btn btn-success" type="submit" name="save">
23+
<i class="fa fa-check"></i> @Loc["Admin.Common.Save"]
24+
</button>
25+
<button class="btn btn-success" type="submit" name="save-continue">
26+
<i class="fa fa-check-circle"></i> @Loc["Admin.Common.SaveContinue"]
27+
</button>
28+
<span id="checkoutattribute-delete" class="btn red">
29+
<i class="fa fa-trash-o"></i> @Loc["Admin.Common.Delete"]
30+
</span>
31+
<vc:admin-widget widget-zone="checkout_attribute_details_buttons" additional-data="Model"/>
32+
</div>
33+
</div>
34+
</div>
35+
<div class="x_content form">
36+
<partial name="Partials/CreateOrUpdate" model="Model"/>
37+
</div>
38+
</div>
39+
</div>
40+
</div>
41+
</form>
42+
<admin-delete-confirmation button-id="checkoutattribute-delete"/>
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
@{
2+
//page title
3+
ViewBag.Title = Loc["Admin.Orders.CheckoutAttributes"];
4+
}
5+
6+
<div class="row">
7+
<div class="col-md-12">
8+
<div class="x_panel light form-fit">
9+
<div class="x_title">
10+
<div class="caption">
11+
<i class="fa fa-list-alt"></i>
12+
@Loc["Admin.Orders.CheckoutAttributes"]
13+
</div>
14+
<div class="actions btn-group btn-group-devided">
15+
<a href="@Url.Action("Create", new { area = Constants.AreaStore })" class="btn green">
16+
<i class="fa fa-plus"></i><span class="d-none d-sm-inline"> @Loc["Admin.Common.AddNew"] </span>
17+
</a>
18+
<vc:admin-widget widget-zone="checkout_attribute_list_buttons" additional-data="null"/>
19+
</div>
20+
21+
</div>
22+
<div class="x_content form">
23+
<div class="form-horizontal">
24+
<div class="form-body">
25+
<div class="x_content">
26+
<div id="checkoutattributes-grid"></div>
27+
</div>
28+
</div>
29+
</div>
30+
</div>
31+
</div>
32+
</div>
33+
</div>
34+
35+
<script>
36+
$(document).ready(function () {
37+
$("#checkoutattributes-grid").kendoGrid({
38+
dataSource: {
39+
transport: {
40+
read: {
41+
url: "@Html.Raw(Url.Action("List", "CheckoutAttribute", new { area = Constants.AreaStore }))",
42+
type: "POST",
43+
dataType: "json",
44+
data: addAntiForgeryToken
45+
}
46+
},
47+
schema: {
48+
data: "Data",
49+
total: "Total",
50+
errors: "Errors"
51+
},
52+
error: function(e) {
53+
display_kendoui_grid_error(e);
54+
// Cancel the changes
55+
this.cancelChanges();
56+
},
57+
serverPaging: true,
58+
serverFiltering: true,
59+
serverSorting: true
60+
},
61+
pageable: {
62+
refresh: true,
63+
numeric: false,
64+
previousNext: false,
65+
info: false
66+
},
67+
editable: {
68+
confirmation: false,
69+
mode: "inline"
70+
},
71+
scrollable: false,
72+
columns: [{
73+
field: "Name",
74+
title: "@Loc["Admin.Orders.CheckoutAttributes.Fields.Name"]",
75+
template: '<a class="k-link" href="@Url.Action("Edit", "CheckoutAttribute", new { area = Constants.AreaStore })/#=Id#">#=kendo.htmlEncode(Name)#</a>',
76+
}, {
77+
field: "AttributeControlTypeName",
78+
title: "@Loc["Admin.Orders.CheckoutAttributes.Fields.AttributeControlType"]",
79+
headerAttributes: { style: "text-align:center" },
80+
attributes: { style: "text-align:center" },
81+
width: 200,
82+
minScreenWidth: 750,
83+
},{
84+
field: "IsRequired",
85+
title: "@Loc["Admin.Orders.CheckoutAttributes.Fields.IsRequired"]",
86+
width: 100,
87+
headerAttributes: { style: "text-align:center" },
88+
attributes: { style: "text-align:center" },
89+
template: '# if(IsRequired) {# <i class="fa fa-check" aria-hidden="true" style="color:green"></i> #} else {# <i class="fa fa-times" aria-hidden="true" style="color:red"></i> #} #'
90+
}, {
91+
field: "DisplayOrder",
92+
title: "@Loc["Admin.Orders.CheckoutAttributes.Fields.DisplayOrder"]",
93+
width: 100,
94+
minScreenWidth: 750,
95+
}]
96+
});
97+
});
98+
</script>
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
@model CheckoutAttributeModel
2+
<vc:admin-widget widget-zone="checkout_attribute_details_condition_top" additional-data="Model"/>
3+
@{
4+
if (!string.IsNullOrEmpty(Model.Id))
5+
{
6+
<script>
7+
$(document).ready(function () {
8+
$("#@Html.IdFor(model => model.ConditionModel.EnableCondition)").click(toggleEnableCondition);
9+
toggleEnableCondition();
10+
});
11+
12+
function toggleEnableCondition() {
13+
if ($('#@Html.IdFor(model => model.ConditionModel.EnableCondition)').is(':checked')) {
14+
$('#pnlAttributes').show();
15+
} else {
16+
$('#pnlAttributes').hide();
17+
}
18+
}
19+
</script>
20+
21+
<div class="form-horizontal">
22+
<div class="form-body">
23+
<div class="form-group">
24+
<admin-label asp-for="ConditionModel.EnableCondition"/>
25+
<div class="col-md-9 col-sm-9">
26+
<label class="mt-checkbox mt-checkbox-outline control control-checkbox">
27+
<admin-input asp-for="ConditionModel.EnableCondition"/>
28+
<div class="control__indicator"></div>
29+
</label>
30+
<span asp-validation-for="ConditionModel.EnableCondition"></span>
31+
</div>
32+
</div>
33+
</div>
34+
</div>
35+
<div id="pnlAttributes">
36+
@if (Model.ConditionModel.ConditionAttributes.Count > 0)
37+
{
38+
<div class="form-horizontal">
39+
<div class="form-body">
40+
<div class="form-group">
41+
<admin-label asp-for="ConditionModel.SelectedAttributeId"/>
42+
<div class="col-md-9 col-sm-9">
43+
<admin-select asp-for="ConditionModel.SelectedAttributeId" asp-items="Model.ConditionModel.ConditionAttributes.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() })"/>
44+
<script>
45+
$(document).ready(function() {
46+
$("#@Html.IdFor(model => model.ConditionModel.SelectedAttributeId)").change(toggleConditionAttributes);
47+
toggleConditionAttributes();
48+
});
49+
function toggleConditionAttributes() {
50+
var selectedCheckoutAttributeId = $("#@Html.IdFor(model => model.ConditionModel.SelectedAttributeId)").val();
51+
$('[id^="pnl_attribute_values_"]').hide();
52+
$('#pnl_attribute_values_' + selectedCheckoutAttributeId).show();
53+
}
54+
</script>
55+
</div>
56+
</div>
57+
<div class="form-group">
58+
<label class="control-label col-md-3"></label>
59+
<div class="col-md-9 col-sm-9">
60+
@for (var i = 0; i < Model.ConditionModel.ConditionAttributes.Count; i++)
61+
{
62+
<input type="hidden" asp-for="@Model.ConditionModel.ConditionAttributes[i].Id"/>
63+
<div id="@($"pnl_attribute_values_{Model.ConditionModel.ConditionAttributes[i].Id}")">
64+
@switch (Model.ConditionModel.ConditionAttributes[i].AttributeControlType)
65+
{
66+
case AttributeControlType.DropdownList:
67+
<admin-select asp-for="@Model.ConditionModel.ConditionAttributes[i].SelectedValueId" asp-items="Model.ConditionModel.ConditionAttributes[i].Values"/>
68+
break;
69+
case AttributeControlType.RadioList:
70+
case AttributeControlType.ColorSquares:
71+
case AttributeControlType.ImageSquares:
72+
foreach (var value in Model.ConditionModel.ConditionAttributes[i].Values)
73+
{
74+
<div>
75+
<input type="radio" asp-for="@Model.ConditionModel.ConditionAttributes[i].SelectedValueId" value="@value.Value" checked="@value.Selected"/>
76+
<label class="control-label">@value.Text</label>
77+
</div>
78+
}
79+
80+
break;
81+
case AttributeControlType.Checkboxes:
82+
for (var j = 0; j < Model.ConditionModel.ConditionAttributes[i].Values.Count; j++)
83+
{
84+
<div>
85+
<label class="mt-checkbox mt-checkbox-outline control control-checkbox">
86+
<input type="hidden" asp-for="@Model.ConditionModel.ConditionAttributes[i].Values[j].Value"/>
87+
<admin-input asp-for="@Model.ConditionModel.ConditionAttributes[i].Values[j].Selected"/>
88+
@Model.ConditionModel.ConditionAttributes[i].Values[j].Text
89+
<div class="control__indicator"></div>
90+
</label>
91+
</div>
92+
}
93+
94+
break;
95+
case AttributeControlType.ReadonlyCheckboxes:
96+
case AttributeControlType.TextBox:
97+
case AttributeControlType.MultilineTextbox:
98+
case AttributeControlType.Datepicker:
99+
case AttributeControlType.FileUpload:
100+
default:
101+
//not supported as conditions
102+
break;
103+
}
104+
</div>
105+
}
106+
</div>
107+
</div>
108+
</div>
109+
</div>
110+
}
111+
else
112+
{
113+
<div class="note note-info">
114+
@Loc["Admin.Orders.CheckoutAttributes.Condition.NoAttributeExists"]
115+
</div>
116+
}
117+
</div>
118+
}
119+
else
120+
{
121+
<div class="note note-info">
122+
@Loc["Admin.Orders.CheckoutAttributes.Condition.SaveBeforeEdit"]
123+
</div>
124+
}
125+
}
126+
<vc:admin-widget widget-zone="checkout_attribute_details_condition_bottom" additional-data="Model"/>

0 commit comments

Comments
 (0)