Skip to content

Commit 0619ac1

Browse files
Enhance news management features and UI improvements
- Added new permission for managing news items in `PermissionExtensions.cs`. - Refactored `Create.cshtml` and `Edit.cshtml` to use a new panel layout and updated button structures. - Introduced `CreateOrUpdate.TabComments.cshtml` with a Kendo Grid for comment management. - Updated `CreateOrUpdate.TabInfo.cshtml` and `CreateOrUpdate.TabSeo.cshtml` to use custom components for better consistency. - Implemented a tabbed interface in `CreateOrUpdate.cshtml` for improved navigation. - Simplified layout in `Preview.cshtml` for displaying news item details. - Enhanced store-specific logic in `NewsController.cs` to enforce access permissions based on user stores. - Modified `DefaultLanguage.xml` (binary file changes).
1 parent d23ae58 commit 0619ac1

File tree

10 files changed

+340
-306
lines changed

10 files changed

+340
-306
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ public static IEnumerable<DefaultPermission> DefaultPermissions()
212212
StandardPermission.ManageShipments,
213213
StandardPermission.ManageMerchandiseReturns,
214214
StandardPermission.ManageCheckoutAttribute,
215-
StandardPermission.ManageReports
215+
StandardPermission.ManageReports,
216+
StandardPermission.ManageNews
216217
]
217218
},
218219

src/Web/Grand.Web.Store/Areas/Store/Views/News/Create.cshtml

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
1-
@model NewsItemModel
1+
@model NewsItemModel
22
@{
3+
//page title
34
ViewBag.Title = Loc["Admin.Content.News.NewsItems.AddNew"];
45
Layout = Constants.LayoutStore;
56
}
7+
<form asp-area="@Constants.AreaStore" asp-controller="News" asp-action="Create" method="post">
68

7-
<form asp-area="Store" asp-controller="News" asp-action="Create" method="post">
89
<div class="row">
910
<div class="col-md-12">
10-
<div class="card">
11-
<div class="card-header">
12-
<h3 class="card-title">
13-
<i class="fa fa-plus"></i>
11+
<div class="x_panel light form-fit">
12+
<div class="x_title">
13+
<div class="caption">
14+
<i class="fa fa-hacker-news"></i>
1415
@Loc["Admin.Content.News.NewsItems.AddNew"]
15-
</h3>
16-
<div class="card-tools">
17-
<a href="@Url.Action("List")" class="btn btn-secondary btn-sm">
18-
<i class="fa fa-arrow-left"></i> @Loc["Admin.Content.News.NewsItems.BackToList"]
19-
</a>
16+
<small>
17+
<i class="fa fa-arrow-circle-left"></i>@Html.ActionLink(Loc["Admin.Content.News.NewsItems.BackToList"], "List")
18+
</small>
19+
</div>
20+
<div class="actions">
21+
<div class="btn-group btn-group-devided">
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+
<vc:admin-widget widget-zone="news_details_buttons" additional-data="null"/>
29+
</div>
2030
</div>
2131
</div>
22-
<div class="card-body">
32+
<div class="x_content form">
2333
<partial name="Partials/CreateOrUpdate" model="Model"/>
2434
</div>
25-
<div class="card-footer">
26-
<div class="float-right">
27-
<button class="btn btn-success" type="submit" name="save">
28-
<i class="fa fa-check"></i> @Loc["Admin.Common.Save"]
29-
</button>
30-
<button class="btn btn-info" type="submit" name="save-continue">
31-
<i class="fa fa-check-circle"></i> @Loc["Admin.Common.SaveContinue"]
32-
</button>
33-
</div>
34-
</div>
3535
</div>
3636
</div>
3737
</div>
Lines changed: 30 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,46 @@
1-
@model NewsItemModel
1+
@model NewsItemModel
22
@{
3+
//page title
34
ViewBag.Title = Loc["Admin.Content.News.NewsItems.EditNewsItemDetails"];
45
Layout = Constants.LayoutStore;
56
}
7+
<form asp-area="@Constants.AreaStore" asp-controller="News" asp-action="Edit" method="post">
68

7-
<form asp-area="Store" asp-controller="News" asp-action="Edit" method="post">
89
<div class="row">
910
<div class="col-md-12">
10-
<div class="card">
11-
<div class="card-header">
12-
<h3 class="card-title">
13-
<i class="fa fa-edit"></i>
11+
<div class="x_panel light form-fit">
12+
<div class="x_title">
13+
<div class="caption">
14+
<i class="fa fa-hacker-news"></i>
1415
@Loc["Admin.Content.News.NewsItems.EditNewsItemDetails"] - @Model.Title
15-
</h3>
16-
<div class="card-tools">
17-
<a href="@Url.Action("List")" class="btn btn-secondary btn-sm">
18-
<i class="fa fa-arrow-left"></i> @Loc["Admin.Content.News.NewsItems.BackToList"]
19-
</a>
20-
<a href="@Url.Action("Preview", new { id = Model.Id })" class="btn btn-info btn-sm" target="_blank">
21-
<i class="fa fa-eye"></i> @Loc["Admin.Common.Preview"]
22-
</a>
16+
<small>
17+
<i class="fa fa-arrow-circle-left"></i>@Html.ActionLink(Loc["Admin.Content.News.NewsItems.BackToList"], "List")
18+
</small>
19+
</div>
20+
<div class="actions">
21+
<div class="btn-group btn-group-devided">
22+
<button type="button" onclick="window.open('@Url.RouteUrl("NewsItem", new { Model.SeName })','_blank');" class="btn purple">
23+
<i class="fa fa-eye"></i>
24+
@Loc["Admin.Common.Preview"]
25+
</button>
26+
<button class="btn btn-success" type="submit" name="save">
27+
<i class="fa fa-check"></i> @Loc["Admin.Common.Save"]
28+
</button>
29+
<button class="btn btn-success" type="submit" name="save-continue">
30+
<i class="fa fa-check-circle"></i> @Loc["Admin.Common.SaveContinue"]
31+
</button>
32+
<span id="newsitem-delete" class="btn red">
33+
<i class="fa fa-trash-o"></i> @Loc["Admin.Common.Delete"]
34+
</span>
35+
<vc:admin-widget widget-zone="news_details_buttons" additional-data="Model"/>
36+
</div>
2337
</div>
2438
</div>
25-
<div class="card-body">
39+
<div class="x_content form">
2640
<partial name="Partials/CreateOrUpdate" model="Model"/>
2741
</div>
28-
<div class="card-footer">
29-
<div class="float-left">
30-
<button type="button" class="btn btn-danger" onclick="deleteNews()">
31-
<i class="fa fa-trash"></i> @Loc["Admin.Common.Delete"]
32-
</button>
33-
</div>
34-
<div class="float-right">
35-
<button class="btn btn-success" type="submit" name="save">
36-
<i class="fa fa-check"></i> @Loc["Admin.Common.Save"]
37-
</button>
38-
<button class="btn btn-info" type="submit" name="save-continue">
39-
<i class="fa fa-check-circle"></i> @Loc["Admin.Common.SaveContinue"]
40-
</button>
41-
</div>
42-
</div>
4342
</div>
4443
</div>
4544
</div>
4645
</form>
47-
48-
<script>
49-
function deleteNews() {
50-
if (confirm('@Loc["Admin.Common.AreYouSure"]')) {
51-
var postData = {
52-
id: '@Model.Id'
53-
};
54-
addAntiForgeryToken(postData);
55-
56-
$.ajax({
57-
cache: false,
58-
type: "POST",
59-
url: "@(Url.Action("Delete", "News"))",
60-
data: postData,
61-
success: function (data) {
62-
window.location = '@Url.Action("List")';
63-
},
64-
error: function (xhr, ajaxOptions, thrownError) {
65-
alert('Failed to delete news item');
66-
}
67-
});
68-
}
69-
}
70-
</script>
46+
<admin-delete-confirmation button-id="newsitem-delete"/>
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
@model NewsItemModel
2+
@inject AdminAreaSettings adminAreaSettings
3+
<vc:admin-widget widget-zone="news_details_comments_list" additional-data="Model"/>
4+
@if (!string.IsNullOrEmpty(Model.Id))
5+
{
6+
<div class="panel panel-default">
7+
<vc:admin-widget widget-zone="news_details_comments_top" additional-data="Model"/>
8+
<div class="panel-body">
9+
<div id="comments-grid"></div>
10+
</div>
11+
<vc:admin-widget widget-zone="news_details_comments_bottom" additional-data="Model"/>
12+
</div>
13+
<script>
14+
$(document).ready(function () {
15+
$("#comments-grid").kendoGrid({
16+
dataSource: {
17+
transport: {
18+
read: {
19+
url: "@Url.Action("Comments", "News", new { filterByNewsItemId = Model.Id, area = Constants.AreaStore })",
20+
type: "POST",
21+
dataType: "json",
22+
data: addAntiForgeryToken
23+
},
24+
destroy: {
25+
url: "@Html.Raw(Url.Action("CommentDelete", "News", new { area = Constants.AreaStore }))",
26+
type: "POST",
27+
dataType: "json",
28+
data: addAntiForgeryToken
29+
}
30+
},
31+
schema: {
32+
data: "Data",
33+
total: "Total",
34+
errors: "Errors",
35+
model: {
36+
id: "Id",
37+
fields: {
38+
//do not implicitly specify all fields
39+
//we do it only for fields which implicitly require it
40+
//otherwise, they'll be formatted wrong way
41+
CreatedOn: {type: "date" }
42+
}
43+
}
44+
},
45+
error: function(e) {
46+
display_kendoui_grid_error(e);
47+
// Cancel the changes
48+
this.cancelChanges();
49+
},
50+
pageSize: @(adminAreaSettings.DefaultGridPageSize),
51+
serverPaging: true,
52+
serverFiltering: true,
53+
serverSorting: true
54+
},
55+
pageable: {
56+
refresh: true,
57+
pageSizes: [@(adminAreaSettings.GridPageSizes)]
58+
},
59+
editable: {
60+
confirmation: true,
61+
mode: "inline"
62+
},
63+
scrollable: false,
64+
columns: [{
65+
field: "CustomerId",
66+
title: "@Loc["Admin.Content.News.Comments.Fields.Customer"]",
67+
width: 200,
68+
template: '<a class="k-link" href="@Url.Action("Edit", "Customer", new { area = Constants.AreaStore })/#=CustomerId#">#:kendo.htmlEncode(CustomerInfo)#</a>'
69+
}, {
70+
field: "CommentTitle",
71+
title: "@Loc["Admin.Content.News.Comments.Fields.CommentTitle"]"
72+
}, {
73+
field: "CommentText",
74+
title: "@Loc["Admin.Content.News.Comments.Fields.CommentText"]",
75+
encoded: false
76+
}, {
77+
field: "CreatedOn",
78+
title: "@Loc["Admin.Content.News.Comments.Fields.CreatedOn"]",
79+
width: 200,
80+
type: "date",
81+
format: "{0:G}"
82+
}, {
83+
command: { name: "destroy", text: "@Loc["Admin.Common.Delete"]" },
84+
title: "@Loc["Admin.Common.Delete"]",
85+
width: 100
86+
}]
87+
});
88+
});
89+
</script>
90+
}
91+
else
92+
{
93+
<div class="note note-info">
94+
@Loc["Admin.Content.News.NewsItems.SaveBeforeEdit"]
95+
</div>
96+
}

0 commit comments

Comments
 (0)