mirror of https://github.com/abpframework/abp.git
38 changed files with 11866 additions and 14 deletions
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,23 @@ |
|||||
|
@page |
||||
|
|
||||
|
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus |
||||
|
@using Volo.CmsKit.Admin.Web.Pages |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
||||
|
|
||||
|
@inherits CmsKitAdminPageBase |
||||
|
|
||||
|
@model CreateModalModel |
||||
|
|
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<abp-dynamic-form abp-model="ViewModel" asp-page="/CmsKit/Menus/CreateModal"> |
||||
|
<abp-modal> |
||||
|
<abp-modal-header title="@L["New"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel | AbpModalButtons.Save)"></abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,44 @@ |
|||||
|
using AutoMapper; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Validation; |
||||
|
using Volo.CmsKit.Admin.Menus; |
||||
|
using Volo.CmsKit.Menus; |
||||
|
|
||||
|
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus |
||||
|
{ |
||||
|
public class CreateModalModel : CmsKitAdminPageModel |
||||
|
{ |
||||
|
protected IMenuAdminAppService MenuAdminAppService { get; } |
||||
|
|
||||
|
[BindProperty] |
||||
|
public CreateMenuViewModel ViewModel { get; set; } |
||||
|
|
||||
|
public CreateModalModel(IMenuAdminAppService menuAdminAppService) |
||||
|
{ |
||||
|
MenuAdminAppService = menuAdminAppService; |
||||
|
} |
||||
|
|
||||
|
public async Task<IActionResult> OnPostAsync() |
||||
|
{ |
||||
|
var input = ObjectMapper.Map<CreateMenuViewModel, MenuCreateInput>(ViewModel); |
||||
|
|
||||
|
await MenuAdminAppService.CreateAsync(input); |
||||
|
|
||||
|
return NoContent(); |
||||
|
} |
||||
|
|
||||
|
[AutoMap(typeof(MenuCreateInput), ReverseMap = true)] |
||||
|
public class CreateMenuViewModel |
||||
|
{ |
||||
|
[Required] |
||||
|
[DynamicMaxLength(typeof(MenuConsts), nameof(MenuConsts.MaxNameLength))] |
||||
|
public string Name { get; set; } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
@page |
||||
|
|
||||
|
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus |
||||
|
@using Volo.CmsKit.Admin.Web.Pages |
||||
|
@using Volo.CmsKit.Admin.Web.Menus |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar |
||||
|
|
||||
|
@inherits CmsKitAdminPageBase |
||||
|
|
||||
|
@model IndexModel |
||||
|
|
||||
|
@{ |
||||
|
PageLayout.Content.Title = L["Blogs"].Value; |
||||
|
PageLayout.Content.BreadCrumb.Add(L["Menu:CMS"].Value); |
||||
|
PageLayout.Content.MenuItemName = CmsKitAdminMenus.Menus.MenusMenu; |
||||
|
} |
||||
|
|
||||
|
@section scripts { |
||||
|
<abp-script-bundle> |
||||
|
<abp-script src="/Pages/CmsKit/Menus/index.js" /> |
||||
|
</abp-script-bundle> |
||||
|
} |
||||
|
|
||||
|
@section content_toolbar { |
||||
|
@await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName }) |
||||
|
} |
||||
|
|
||||
|
<div id="CmsKitMenusWrapper"> |
||||
|
<abp-card> |
||||
|
<abp-card-body> |
||||
|
<abp-table striped-rows="true" id="MenusTable" class="nowrap"></abp-table> |
||||
|
</abp-card-body> |
||||
|
</abp-card> |
||||
|
</div> |
||||
@ -0,0 +1,13 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus |
||||
|
{ |
||||
|
public class IndexModel |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
@page |
||||
|
|
||||
|
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems |
||||
|
@using Volo.CmsKit.Admin.Web.Pages |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
||||
|
|
||||
|
@inherits CmsKitAdminPageBase |
||||
|
|
||||
|
@model CreateModalModel |
||||
|
|
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<abp-dynamic-form abp-model="ViewModel" asp-page="/CmsKit/Menus/MenuItems/CreateModal"> |
||||
|
<abp-modal> |
||||
|
<abp-modal-header title="@L["New"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel | AbpModalButtons.Save)"></abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,76 @@ |
|||||
|
using AutoMapper; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.CmsKit.Admin.Menus; |
||||
|
|
||||
|
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems |
||||
|
{ |
||||
|
public class CreateModalModel : CmsKitAdminPageModel |
||||
|
{ |
||||
|
protected IMenuAdminAppService MenuAdminAppService { get; } |
||||
|
|
||||
|
[BindProperty] |
||||
|
public MenuItemCreateViewModel ViewModel { get; set; } |
||||
|
|
||||
|
public CreateModalModel(IMenuAdminAppService menuAdminAppService) |
||||
|
{ |
||||
|
MenuAdminAppService = menuAdminAppService; |
||||
|
ViewModel = new MenuItemCreateViewModel(); |
||||
|
} |
||||
|
|
||||
|
public virtual Task OnGetAsync(Guid menuId, Guid? parentId) |
||||
|
{ |
||||
|
ViewModel.MenuId = menuId; |
||||
|
ViewModel.ParentId = parentId; |
||||
|
|
||||
|
return Task.CompletedTask; |
||||
|
} |
||||
|
|
||||
|
public virtual async Task<IActionResult> OnPostAsync() |
||||
|
{ |
||||
|
var input = ObjectMapper.Map<MenuItemCreateViewModel, MenuItemCreateInput>(ViewModel); |
||||
|
|
||||
|
var dto = await MenuAdminAppService.CreateMenuItemAsync(ViewModel.MenuId, input); |
||||
|
|
||||
|
return new OkObjectResult(dto); |
||||
|
} |
||||
|
|
||||
|
[AutoMap(typeof(MenuItemCreateInput), ReverseMap = true)] |
||||
|
public class MenuItemCreateViewModel |
||||
|
{ |
||||
|
[HiddenInput] |
||||
|
public Guid MenuId { get; set; } |
||||
|
|
||||
|
[HiddenInput] |
||||
|
public Guid? ParentId { get; set; } |
||||
|
|
||||
|
[Required] |
||||
|
public string DisplayName { get; set; } |
||||
|
|
||||
|
public bool IsActive { get; set; } |
||||
|
|
||||
|
[Required] |
||||
|
public string Url { get; set; } |
||||
|
|
||||
|
public Guid? PageId { get; set; } |
||||
|
|
||||
|
public string Icon { get; set; } |
||||
|
|
||||
|
public int Order { get; set; } |
||||
|
|
||||
|
public string Target { get; set; } |
||||
|
|
||||
|
public string ElementId { get; set; } |
||||
|
|
||||
|
public string CssClass { get; set; } |
||||
|
|
||||
|
public string RequiredPermissionName { get; set; } |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
@page |
||||
|
|
||||
|
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems |
||||
|
@using Volo.CmsKit.Admin.Web.Pages |
||||
|
@using Volo.CmsKit.Admin.Web.Menus |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Packages.JsTree |
||||
|
|
||||
|
@inherits CmsKitAdminPageBase |
||||
|
|
||||
|
@model IndexModel |
||||
|
|
||||
|
@{ |
||||
|
PageLayout.Content.Title = L["Blogs"].Value; |
||||
|
PageLayout.Content.BreadCrumb.Add(L["Menu:CMS"].Value); |
||||
|
PageLayout.Content.BreadCrumb.Add(L["Menu:Menus"].Value, "/Cms/Menus"); |
||||
|
PageLayout.Content.MenuItemName = CmsKitAdminMenus.Menus.MenusMenu; |
||||
|
} |
||||
|
|
||||
|
@section styles { |
||||
|
<abp-style-bundle name="@typeof(IndexModel).FullName"> |
||||
|
<abp-style type="typeof(JsTreeStyleContributor)" /> |
||||
|
</abp-style-bundle> |
||||
|
} |
||||
|
|
||||
|
@section scripts { |
||||
|
<abp-script-bundle name="@typeof(IndexModel).FullName"> |
||||
|
<abp-style type="typeof(JsTreeScriptContributor)" /> |
||||
|
<abp-script src="/Pages/CmsKit/Menus/MenuItems/index.js" /> |
||||
|
</abp-script-bundle> |
||||
|
} |
||||
|
|
||||
|
@section content_toolbar { |
||||
|
@await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName }) |
||||
|
} |
||||
|
|
||||
|
<div id="CmsKitMenuItemsWrapper" data-menu-id="@Model.Id"> |
||||
|
<abp-card> |
||||
|
<abp-card-body> |
||||
|
<abp-card-title> |
||||
|
@L["MenuItems"] |
||||
|
</abp-card-title> |
||||
|
<div id="MenuItemsEditTree"></div> |
||||
|
<div id="MenuItemsTreeEmptyInfo" class="text-muted">@L["NoMenuItems"]</div> |
||||
|
</abp-card-body> |
||||
|
</abp-card> |
||||
|
</div> |
||||
@ -0,0 +1,15 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems |
||||
|
{ |
||||
|
public class IndexModel : CmsKitAdminPageModel |
||||
|
{ |
||||
|
[BindProperty(SupportsGet = true)] |
||||
|
public Guid Id { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,415 @@ |
|||||
|
var _menuItem = {}; |
||||
|
$(function () { |
||||
|
var l = abp.localization.getResource("CmsKit"); |
||||
|
|
||||
|
var menuId = $('#CmsKitMenuItemsWrapper').data('menu-id'); |
||||
|
|
||||
|
var menuService = volo.cmsKit.admin.menus.menuAdmin; |
||||
|
|
||||
|
var createModal = new abp.ModalManager(abp.appPath + 'CmsKit/Menus/MenuItems/CreateModal'); |
||||
|
var updateModal = new abp.ModalManager(abp.appPath + 'CmsKit/Menus/MenuItems/UpdateModal'); |
||||
|
|
||||
|
var menuTree = { |
||||
|
|
||||
|
$tree: $('#MenuItemsEditTree'), |
||||
|
|
||||
|
|
||||
|
$emptyInfo: $('#MenuItemsTreeEmptyInfo'), |
||||
|
|
||||
|
show: function () { |
||||
|
menuTree.$emptyInfo.hide(); |
||||
|
menuTree.$tree.show(); |
||||
|
}, |
||||
|
|
||||
|
hide: function () { |
||||
|
menuTree.$emptyInfo.show(); |
||||
|
menuTree.$tree.hide(); |
||||
|
}, |
||||
|
|
||||
|
itemCount: 0, |
||||
|
|
||||
|
setItemCount: function (itemCount) { |
||||
|
menuTree.itemCount = itemCount; |
||||
|
if (itemCount) { |
||||
|
menuTree.show(); |
||||
|
} else { |
||||
|
menuTree.hide(); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
refreshItemCount: function () { |
||||
|
menuTree.setItemCount(menuTree.$tree.jstree('get_json').length); |
||||
|
}, |
||||
|
|
||||
|
selectedMenuItem: { |
||||
|
id: null, |
||||
|
displayName: null, |
||||
|
code: null, |
||||
|
|
||||
|
set: function (menuItemOnTree) { |
||||
|
if (!menuItemOnTree) { |
||||
|
menuTree.selectedMenuItem.id = null; |
||||
|
menuTree.selectedMenuItem.displayName = null; |
||||
|
menuTree.selectedMenuItem.IsActive = true; |
||||
|
menuTree.selectedMenuItem.Url = null; |
||||
|
menuTree.selectedMenuItem.Icon = null; |
||||
|
menuTree.selectedMenuItem.Order = 1; |
||||
|
menuTree.selectedMenuItem.Target = null; |
||||
|
menuTree.selectedMenuItem.ElementId = null; |
||||
|
menuTree.selectedMenuItem.CssClass = null; |
||||
|
menuTree.selectedMenuItem.RequiredPermissionName = null; |
||||
|
menuTree.selectedMenuItem.PageId = null; |
||||
|
} else { |
||||
|
menuTree.selectedMenuItem.id = menuItemOnTree.id; |
||||
|
menuTree.selectedMenuItem.displayName = menuItemOnTree.original.displayName; |
||||
|
menuTree.selectedMenuItem.IsActive = menuItemOnTree.original.IsActive; |
||||
|
menuTree.selectedMenuItem.Url = menuItemOnTree.original.Url; |
||||
|
menuTree.selectedMenuItem.Icon = menuItemOnTree.original.Icon; |
||||
|
menuTree.selectedMenuItem.Order = menuItemOnTree.original.Order; |
||||
|
menuTree.selectedMenuItem.Target = menuItemOnTree.original.Target; |
||||
|
menuTree.selectedMenuItem.ElementId = menuItemOnTree.original.ElementId; |
||||
|
menuTree.selectedMenuItem.CssClass = menuItemOnTree.original.CssClass; |
||||
|
menuTree.selectedMenuItem.RequiredPermissionName = menuItemOnTree.original.RequiredPermissionName; |
||||
|
menuTree.selectedMenuItem.PageId = menuItemOnTree.original.PageId; |
||||
|
} |
||||
|
|
||||
|
_menuItem.checkbox.setSelectedItem({ |
||||
|
id: menuTree.selectedMenuItem.id, |
||||
|
displayName: menuTree.selectedMenuItem.displayName, |
||||
|
isActive: menuTree.selectedMenuItem.IsActive, |
||||
|
url: menuTree.selectedMenuItem.Url, |
||||
|
icon: menuTree.selectedMenuItem.Icon, |
||||
|
order: menuTree.selectedMenuItem.Order, |
||||
|
target: menuTree.selectedMenuItem.Target, |
||||
|
elementId: menuTree.selectedMenuItem.ElementId, |
||||
|
cssClass: menuTree.selectedMenuItem.CssClass, |
||||
|
requiredPermissionName: menuTree.selectedMenuItem.RequiredPermissionName, |
||||
|
pageId: menuTree.selectedMenuItem.PageId |
||||
|
}); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
contextMenu: function (node) { |
||||
|
var items = { |
||||
|
edit: { |
||||
|
label: l('Edit'), |
||||
|
icon: 'fa fa-pencil', |
||||
|
_disabled: abp.auth.isGranted('CmsKit.Menus.Items.Update'), |
||||
|
action: function (data) { |
||||
|
var instance = $.jstree.reference(data.reference); |
||||
|
|
||||
|
updateModal.open({ |
||||
|
id: node.id, |
||||
|
menuId: menuId |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
addSubMenuItem: { |
||||
|
label: l('AddSubMenuItem'), |
||||
|
icon: 'fa fa-plus', |
||||
|
_disabled: abp.auth.isGranted('CmsKit.Menus.Items.Create'), |
||||
|
action: function () { |
||||
|
menuTree.addItem(node.id); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
'delete': { |
||||
|
label: l('Delete'), |
||||
|
icon: 'fa fa-remove', |
||||
|
_disabled: abp.auth.isGranted('CmsKit.Menus.Items.Delete'), |
||||
|
action: function (data) { |
||||
|
var instance = $.jstree.reference(data.reference); |
||||
|
|
||||
|
abp.message.confirm( |
||||
|
l('MenuItemDeletionConfirmationMessage', node.original.displayName), |
||||
|
l('AreYouSure'), |
||||
|
function (isConfirmed) { |
||||
|
if (isConfirmed) { |
||||
|
menuService |
||||
|
.deleteMenuItem(menuId, node.id) |
||||
|
.done(function () { |
||||
|
instance.delete_node(node); |
||||
|
menuTree.refreshItemCount(); |
||||
|
}) |
||||
|
.fail(function (err) { |
||||
|
setTimeout(function () { |
||||
|
abp.message.error(err.message); |
||||
|
}, 500); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return items; |
||||
|
}, |
||||
|
|
||||
|
addItem: function (parentId) { |
||||
|
var instance = $.jstree.reference(menuTree.$tree); |
||||
|
|
||||
|
createModal.open({ |
||||
|
menuId: menuId, |
||||
|
parentId: parentId, |
||||
|
}, function (newMenuItem) { |
||||
|
instance.create_node( |
||||
|
parentId ? instance.get_node(parentId) : '#', |
||||
|
{ |
||||
|
id: newMenuItem.id, |
||||
|
parent: newMenuItem.parentId ? newMenuItem.parentId : '#', |
||||
|
isActive: newMenuItem.isActive, |
||||
|
displayName: $.fn.dataTable.render.text().display(newMenuItem.displayName), |
||||
|
text: menuTree.generateTextOnTree(newMenuItem), |
||||
|
url: newMenuItem.url, |
||||
|
icon: newMenuItem.icon, |
||||
|
order: newMenuItem.order, |
||||
|
target: newMenuItem.target, |
||||
|
elementId: newMenuItem.elementId, |
||||
|
cssClass: newMenuItem.cssClass, |
||||
|
requiredPermissionName: newMenuItem.requiredPermissionName, |
||||
|
pageId: newMenuItem.pageId, |
||||
|
state: { |
||||
|
opened: true |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
menuTree.refreshItemCount(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
generateTextOnTree: function (item) { |
||||
|
var itemClass = ' ou-text-no-members'; |
||||
|
return '<span title="' + item.displayName + '" class="ou-text text-dark' + itemClass + '" data-menuitem-id="' + item.id + '">' + |
||||
|
$.fn.dataTable.render.text().display(item.displayName) + |
||||
|
' <i class="fa fa-caret-down text-muted"></i></span > '; |
||||
|
}, |
||||
|
|
||||
|
getTreeDataFromServer: function (callback) { |
||||
|
menuService.get(menuId).done(function (result) { |
||||
|
var treeData = _.map(result.items, function (item) { |
||||
|
return { |
||||
|
id: item.id, |
||||
|
parent: item.parentId ? item.parentId : '#', |
||||
|
isActive: item.isActive, |
||||
|
displayName: $.fn.dataTable.render.text().display(item.displayName), |
||||
|
url: item.url, |
||||
|
icon: item.icon, |
||||
|
order: item.order, |
||||
|
target: item.target, |
||||
|
elementId: item.elementId, |
||||
|
cssClass: item.cssClass, |
||||
|
requiredPermissionName: item.requiredPermissionName, |
||||
|
pageId: item.pageId, |
||||
|
text: menuTree.generateTextOnTree(item), |
||||
|
state: { |
||||
|
opened: true |
||||
|
} |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
callback(treeData); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
init: function () { |
||||
|
menuTree.getTreeDataFromServer(function (treeData) { |
||||
|
|
||||
|
menuTree.setItemCount(treeData.length); |
||||
|
|
||||
|
menuTree.$tree |
||||
|
.on('changed.jstree', function (e, data) { |
||||
|
if (data.selected.length != 1) { |
||||
|
menuTree.selectedMenuItem.set(null); |
||||
|
} else { |
||||
|
var selectedNode = data.instance.get_node(data.selected[0]); |
||||
|
menuTree.selectedMenuItem.set(selectedNode); |
||||
|
} |
||||
|
}) |
||||
|
.on('move_node.jstree', function (e, data) { |
||||
|
|
||||
|
var parentNodeName = (!data.parent || data.parent == '#') |
||||
|
? l('Root') |
||||
|
: menuTree.$tree.jstree('get_node', data.parent).original.displayName; |
||||
|
|
||||
|
abp.message.confirm( |
||||
|
l('MenuItemMoveConfirmMessage', data.node.original.displayName, parentNodeName), |
||||
|
l('AreYouSure'), |
||||
|
function (isConfirmed) { |
||||
|
if (isConfirmed) { |
||||
|
menuService |
||||
|
.moveMenuItem(menuId, data.node.id, { |
||||
|
newParentId: data.parent === '#' ? null : data.parent |
||||
|
}) |
||||
|
.done(function () { |
||||
|
menuTree.reload(); |
||||
|
}) |
||||
|
.fail(function (err) { |
||||
|
menuTree.$tree.jstree('refresh'); //rollback
|
||||
|
setTimeout(function () { |
||||
|
abp.message.error(err.message); |
||||
|
}, 500); |
||||
|
}); |
||||
|
} else { |
||||
|
menuTree.$tree.jstree('refresh'); //rollback
|
||||
|
} |
||||
|
} |
||||
|
); |
||||
|
}) |
||||
|
.jstree({ |
||||
|
'core': { |
||||
|
data: treeData, |
||||
|
multiple: false, |
||||
|
check_callback: function (operation, node, node_parent, node_position, more) { |
||||
|
return true; |
||||
|
}, |
||||
|
|
||||
|
contextmenu: { |
||||
|
items: menuTree.contextMenu, |
||||
|
'select_node': false |
||||
|
}, |
||||
|
|
||||
|
//sort: function (node1, node2) {
|
||||
|
// if (this.get_node(node2).original.displayName < this.get_node(node1).original.displayName) {
|
||||
|
// return 1;
|
||||
|
// }
|
||||
|
|
||||
|
// return -1;
|
||||
|
//},
|
||||
|
|
||||
|
plugins: [ |
||||
|
'types', |
||||
|
'contextmenu', |
||||
|
'wholerow', |
||||
|
'sort', |
||||
|
'dnd' |
||||
|
] |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
$('button[name=CreateMenuItem]').click(function (e) { |
||||
|
e.preventDefault(); |
||||
|
createModal.open({ menuId: menuId }); |
||||
|
}); |
||||
|
|
||||
|
createModal.onResult(function () { |
||||
|
menuTree.reload(); |
||||
|
}); |
||||
|
|
||||
|
updateModal.onResult(function (item) { |
||||
|
menuTree.reload(); |
||||
|
}); |
||||
|
|
||||
|
//menuTree.$tree.on('click', '.ou-text .fa-caret-down', function (e) {
|
||||
|
// e.preventDefault();
|
||||
|
// debugger;
|
||||
|
// var id = $(this).closest('.ou-text').attr('data-menuitem-id');
|
||||
|
// setTimeout(function () {
|
||||
|
// debugger;
|
||||
|
// menuTree.$tree.jstree('show_contextmenu', id);
|
||||
|
// }, 100);
|
||||
|
//});
|
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
reload: function () { |
||||
|
menuTree.getTreeDataFromServer(function (treeData) { |
||||
|
menuTree.setItemCount(treeData.length); |
||||
|
menuTree.$tree.jstree(true).settings.core.data = treeData; |
||||
|
menuTree.$tree.jstree('refresh'); |
||||
|
}); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
menuTree.init(); |
||||
|
|
||||
|
let selectedIds = []; |
||||
|
let selectedItem = {}; |
||||
|
let selectedCheckboxNames; |
||||
|
let selectAllHeaderTitle = '<div class="custom-checkbox custom-control no-height">' + |
||||
|
'<input type="checkbox" id="select_all" name="select-all" class="custom-control-input custom-selectbox" value="false" data-val="false">' + |
||||
|
'<label class="custom-control-label" for="select_all"></label></div>'; |
||||
|
|
||||
|
_menuItem.checkbox = { |
||||
|
initialize: function (selectedCbNames) { |
||||
|
selectedIds = []; |
||||
|
selectedCheckboxNames = selectedCbNames; |
||||
|
}, |
||||
|
getSelectedIds: function () { |
||||
|
return selectedIds; |
||||
|
}, |
||||
|
setSelectedItem: function (item) { |
||||
|
selectedItem = item; |
||||
|
}, |
||||
|
getSelectedItem: function () { |
||||
|
return selectedItem; |
||||
|
}, |
||||
|
getSelectAllHeaderTitle: function () { |
||||
|
return selectAllHeaderTitle; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
$(document).on('click', '.custom-selectbox', function (el) { |
||||
|
el.stopPropagation(); |
||||
|
if (!$(el.target).is(':checkbox')) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if ($(el.target).prop("checked") == true) { |
||||
|
checkAndAddAll(); |
||||
|
} else if ($(el.target).prop("checked") == false) { |
||||
|
uncheckAndRemoveAll(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
$(document).on('click', '.selectable', function (el) { |
||||
|
el.stopPropagation(); |
||||
|
selectDeselect(el); |
||||
|
}); |
||||
|
|
||||
|
const checkAndAddAll = function () { |
||||
|
$('table>tbody>').find('input[type="checkbox"]').prop("checked", true); |
||||
|
let selectedItems = $(`input[name="${selectedCheckboxNames}"]:checked`); |
||||
|
selectedIds = []; |
||||
|
for (var i = 0; typeof (selectedItems[i]) != 'undefined'; selectedIds.push(selectedItems[i++].getAttribute('id'))); |
||||
|
}; |
||||
|
|
||||
|
const uncheckAndRemoveAll = function () { |
||||
|
$('table>tbody>').find('input[type="checkbox"]').prop("checked", false); |
||||
|
selectedIds = []; |
||||
|
}; |
||||
|
|
||||
|
const addId = function (id) { |
||||
|
selectedIds.push(id); |
||||
|
}; |
||||
|
|
||||
|
const removeId = function (id) { |
||||
|
selectedIds = selectedIds.filter(function (e) { |
||||
|
return e !== id; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
const selectDeselect = function (el) { |
||||
|
$el = $(el); |
||||
|
if ($(el.target).is(':checkbox')) { |
||||
|
el.preventDefault(); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if (!$(el.target).is(':checkbox')) { |
||||
|
$el = $(el.target).parent().closest('tr').find('[type=checkbox]'); |
||||
|
|
||||
|
if ($el.prop("checked") == true) { |
||||
|
$el.prop("checked", false); |
||||
|
} else if ($el.prop("checked") == false) { |
||||
|
$el.prop("checked", true); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if ($el.prop("checked") == true) { |
||||
|
addId($el.attr('id')); |
||||
|
} else if ($el.prop("checked") == false) { |
||||
|
removeId($el.attr('id')); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,23 @@ |
|||||
|
@page |
||||
|
@using Volo.CmsKit.Admin.Web.Pages |
||||
|
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
||||
|
|
||||
|
@inherits CmsKitAdminPageBase |
||||
|
|
||||
|
@model UpdateModalModel |
||||
|
|
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<abp-dynamic-form abp-model="ViewModel" asp-page="/CmsKit/Menus/UpdateModal"> |
||||
|
<abp-modal> |
||||
|
<abp-modal-header title="@L["Edit"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-input asp-for="Id" /> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,53 @@ |
|||||
|
using AutoMapper; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using System; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Validation; |
||||
|
using Volo.CmsKit.Admin.Menus; |
||||
|
using Volo.CmsKit.Menus; |
||||
|
|
||||
|
namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus |
||||
|
{ |
||||
|
public class UpdateModalModel : CmsKitAdminPageModel |
||||
|
{ |
||||
|
protected IMenuAdminAppService MenuAdminAppService { get; } |
||||
|
|
||||
|
[HiddenInput] |
||||
|
[BindProperty(SupportsGet = true)] |
||||
|
public Guid Id { get; set; } |
||||
|
|
||||
|
[BindProperty] |
||||
|
public UpdateMenuViewModel ViewModel { get; set; } |
||||
|
|
||||
|
public UpdateModalModel(IMenuAdminAppService menuAdminAppService) |
||||
|
{ |
||||
|
MenuAdminAppService = menuAdminAppService; |
||||
|
} |
||||
|
|
||||
|
public async Task OnGetAsync() |
||||
|
{ |
||||
|
var menu = await MenuAdminAppService.GetAsync(Id); |
||||
|
|
||||
|
ViewModel = ObjectMapper.Map<MenuWithDetailsDto, UpdateMenuViewModel>(menu); |
||||
|
} |
||||
|
|
||||
|
public async Task<IActionResult> OnPostAsync() |
||||
|
{ |
||||
|
var input = ObjectMapper.Map<UpdateMenuViewModel, MenuUpdateInput>(ViewModel); |
||||
|
|
||||
|
await MenuAdminAppService.UpdateAsync(Id, input); |
||||
|
|
||||
|
return NoContent(); |
||||
|
} |
||||
|
|
||||
|
[AutoMap(typeof(MenuWithDetailsDto))] |
||||
|
[AutoMap(typeof(MenuUpdateInput), ReverseMap = true)] |
||||
|
public class UpdateMenuViewModel |
||||
|
{ |
||||
|
[Required] |
||||
|
[DynamicMaxLength(typeof(MenuConsts), nameof(MenuConsts.MaxNameLength))] |
||||
|
public string Name { get; set; } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1 @@ |
|||||
|
|
||||
@ -0,0 +1,76 @@ |
|||||
|
$(function () { |
||||
|
var l = abp.localization.getResource("CmsKit"); |
||||
|
|
||||
|
var createModal = new abp.ModalManager(abp.appPath + "CmsKit/Menus/CreateModal"); |
||||
|
var updateModal = new abp.ModalManager(abp.appPath + "CmsKit/Menus/UpdateModal"); |
||||
|
|
||||
|
var menusService = volo.cmsKit.admin.menus.menuAdmin; |
||||
|
|
||||
|
var dataTable = $("#MenusTable").DataTable(abp.libs.datatables.normalizeConfiguration({ |
||||
|
processing: true, |
||||
|
serverSide: true, |
||||
|
paging: true, |
||||
|
searching: false, |
||||
|
scrollCollapse: true, |
||||
|
scrollX: true, |
||||
|
ordering: true, |
||||
|
order: [[1, "desc"]], |
||||
|
ajax: abp.libs.datatables.createAjax(menusService.getList), |
||||
|
columnDefs: [ |
||||
|
{ |
||||
|
title: l("Details"), |
||||
|
targets: 0, |
||||
|
rowAction: { |
||||
|
items: [ |
||||
|
{ |
||||
|
text: l('MenuItems'), |
||||
|
visible: abp.auth.isGranted('CmsKit.Menus.Items'), |
||||
|
action: function (data) { |
||||
|
location.href = "/Cms/Menus/" + data.record.id + "/menu-items" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
text: l('Edit'), |
||||
|
visible: abp.auth.isGranted('CmsKit.Menus.Update'), |
||||
|
action: function (data) { |
||||
|
updateModal.open({ id: data.record.id }); |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
text: l('Delete'), |
||||
|
visible: abp.auth.isGranted('CmsKit.Menus.Delete'), |
||||
|
confirmMessage: function (data) { |
||||
|
return l("MenuDeletionConfirmationMessage", data.record.name) |
||||
|
}, |
||||
|
action: function (data) { |
||||
|
menusService |
||||
|
.delete(data.record.id) |
||||
|
.then(function () { |
||||
|
dataTable.ajax.reload(); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
title: l("Name"), |
||||
|
orderable: true, |
||||
|
data: "name" |
||||
|
} |
||||
|
] |
||||
|
})); |
||||
|
|
||||
|
$('#AbpContentToolbar button[name=CreateMenu]').on('click', function (e) { |
||||
|
e.preventDefault(); |
||||
|
createModal.open(); |
||||
|
}); |
||||
|
|
||||
|
createModal.onResult(function () { |
||||
|
dataTable.ajax.reload(); |
||||
|
}); |
||||
|
|
||||
|
updateModal.onResult(function () { |
||||
|
dataTable.ajax.reload(); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1 @@ |
|||||
|
|
||||
Loading…
Reference in new issue