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