Skip to content

Commit

Permalink
Added the ability to create and edit new permissions in the admin panel
Browse files Browse the repository at this point in the history
  • Loading branch information
support committed Sep 22, 2023
1 parent bf86275 commit e2b6494
Show file tree
Hide file tree
Showing 12 changed files with 559 additions and 72 deletions.
94 changes: 94 additions & 0 deletions src/Web/Grand.Web.Admin/Areas/Admin/Views/Permission/Create.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
@model PermissionCreateModel
@{
Layout = "";
//page title
ViewBag.Title = Loc["Admin.Configuration.Permissions.AddNew"];
}
<form id="PermissionPopup" asp-area="@Constants.AreaAdmin" asp-controller="Permission" asp-action="Create" method="post">

<div asp-validation-summary="All"></div>

<div class="row">
<div class="col-md-12">
<div class="x_panel light form-fit">
<div class="x_title">
<div class="caption">
<i class="fa fa-cubes"></i>
<text> @Loc["Admin.Configuration.Permissions.AddNew"]</text>
</div>
</div>
<div class="x_content form">
<div class="form-horizontal">
<div class="form-body">
<div class="form-group">
<admin-label asp-for="Name" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="Name" />
<span asp-validation-for="Name"></span>
</div>
</div>
<div class="form-group">
<admin-label asp-for="SystemName" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="SystemName" />
<span asp-validation-for="SystemName"></span>
</div>
</div>
<div class="form-group">
<admin-label asp-for="Area" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="Area" />
<span asp-validation-for="Area"></span>
</div>
</div>
<div class="form-group">
<admin-label asp-for="Category" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="Category" />
<span asp-validation-for="Category"></span>
</div>
</div>

<div class="form-group">
<div class="offset-sm-3 offset-md-3 col-md-9 col-sm-9">
<button class="btn btn-success" type="submit" name="save"><i class="fa fa-check"></i> @Loc["Admin.Common.Save"] </button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
var mfp = $.magnificPopup.instance;
$("#PermissionPopup").submit(function (e) {
e.preventDefault();
var form = $(this);
var url = form.attr('action');
$.ajax({
type: "POST",
url: url,
data: form.serialize(),
success: function (data) {
if (data == "") {
mfp.close();
location.reload();
} else {
$.magnificPopup.open({
items: {
src: data,
type: 'inline'
},
callbacks: {
open: function () {
$('.mfp-wrap').removeAttr('tabindex');
}
}
});
}
}
});
});
</script>
</form>
153 changes: 93 additions & 60 deletions src/Web/Grand.Web.Admin/Areas/Admin/Views/Permission/Index.cshtml

Large diffs are not rendered by default.

92 changes: 92 additions & 0 deletions src/Web/Grand.Web.Admin/Areas/Admin/Views/Permission/Update.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
@model PermissionUpdateModel
@{
Layout = "";
//page title
ViewBag.Title = Loc["Admin.Configuration.Permissions.AddNew"];
}
<form id="PermissionPopup" asp-area="@Constants.AreaAdmin" asp-controller="Permission" asp-action="Update" method="post">
<div asp-validation-summary="All"></div>
<input asp-for="Id" type="hidden" />
<div class="row">
<div class="col-md-12">
<div class="x_panel light form-fit">
<div class="x_title">
<div class="caption">
<i class="fa fa-cubes"></i>
<text> @Loc["Admin.Configuration.Permissions.Update"] @Model.SystemName</text>
</div>
</div>
<div class="x_content form">
<div class="form-horizontal">
<div class="form-body">
<div class="form-group">
<admin-label asp-for="Name" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="Name" />
<span asp-validation-for="Name"></span>
</div>
</div>
<div class="form-group">
<admin-label asp-for="SystemName" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="SystemName" asp-disabled="true" />
</div>
</div>
<div class="form-group">
<admin-label asp-for="Area" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="Area" />
<span asp-validation-for="Area"></span>
</div>
</div>
<div class="form-group">
<admin-label asp-for="Category" />
<div class="col-md-9 col-sm-9">
<admin-input asp-for="Category" />
<span asp-validation-for="Category"></span>
</div>
</div>

<div class="form-group">
<div class="offset-sm-3 offset-md-3 col-md-9 col-sm-9">
<button class="btn btn-success" type="submit" name="save"><i class="fa fa-check"></i> @Loc["Admin.Common.Save"] </button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
var mfp = $.magnificPopup.instance;
$("#PermissionPopup").submit(function (e) {
e.preventDefault();
var form = $(this);
var url = form.attr('action');
$.ajax({
type: "POST",
url: url,
data: form.serialize(),
success: function (data) {
if (data == "") {
mfp.close();
location.reload();
} else {
$.magnificPopup.open({
items: {
src: data,
type: 'inline'
},
callbacks: {
open: function () {
$('.mfp-wrap').removeAttr('tabindex');
}
}
});
}
}
});
});
</script>
</form>
53 changes: 41 additions & 12 deletions src/Web/Grand.Web.Admin/Controllers/PermissionController.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
using Grand.Business.Core.Extensions;
using DotLiquid.Util;
using Grand.Business.Core.Extensions;
using Grand.Business.Core.Interfaces.Common.Directory;
using Grand.Business.Core.Interfaces.Common.Localization;
using Grand.Business.Core.Interfaces.Common.Logging;
using Grand.Business.Core.Interfaces.Common.Security;
using Grand.Business.Core.Utilities.Common.Security;
using Grand.Web.Common.Models;
using Grand.Web.Common.Security.Authorization;
using Grand.Domain.Permissions;
using Grand.Infrastructure;
using Grand.Web.Admin.Extensions.Mapping;
using Grand.Web.Admin.Models.Permissions;
using MediatR;
using Microsoft.AspNetCore.Mvc;

namespace Grand.Web.Admin.Controllers
Expand All @@ -19,31 +19,24 @@ public class PermissionController : BaseAdminController
{
#region Fields

private readonly ILogger _logger;
private readonly IWorkContext _workContext;
private readonly IPermissionService _permissionService;
private readonly IGroupService _groupService;
private readonly ITranslationService _translationService;
private readonly IMediator _mediator;

#endregion

#region Constructors

public PermissionController(
ILogger logger,
IWorkContext workContext,
public PermissionController(IWorkContext workContext,
IPermissionService permissionService,
IGroupService groupService,
ITranslationService translationService,
IMediator mediator)
ITranslationService translationService)
{
_logger = logger;
_workContext = workContext;
_permissionService = permissionService;
_groupService = groupService;
_translationService = translationService;
_mediator = mediator;
}

#endregion
Expand Down Expand Up @@ -84,6 +77,42 @@ public async Task<IActionResult> Index()
return View(model);
}

public IActionResult Create()
{
return View(new PermissionCreateModel() { Area = "Area admin" });
}

[HttpPost]
public async Task<IActionResult> Create(PermissionCreateModel model)
{
if (!ModelState.IsValid) return View(model);

var permission = model.ToEntity();
await _permissionService.InsertPermission(permission);
return Content("");
}

public async Task<IActionResult> Update(string systemName)
{
if(string.IsNullOrEmpty(systemName)) return Content("SystemName is null");

var permission = await _permissionService.GetPermissionBySystemName(systemName);
if (permission == null) return Content("Permission not found");
PermissionUpdateModel model = permission.ToModel();
return View(model);
}

[HttpPost]
public async Task<IActionResult> Update(PermissionUpdateModel model)
{
if (!ModelState.IsValid) return View(model);

var permission = await _permissionService.GetPermissionById(model.Id);
permission = model.ToEntity(permission);
await _permissionService.UpdatePermission(permission);
return Content("");
}

[HttpPost, ActionName("Index")]
public async Task<IActionResult> PermissionsSave(IDictionary<string, string[]> model)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using Grand.Domain.Permissions;
using Grand.Infrastructure.Mapper;
using Grand.Web.Admin.Models.Permissions;

namespace Grand.Web.Admin.Extensions.Mapping
{
public static class PermissionMappingExtensions
{
public static Permission ToEntity(this PermissionCreateModel model)
{
return model.MapTo<PermissionCreateModel, Permission>();
}

public static PermissionUpdateModel ToModel(this Permission entity)
{
return entity.MapTo<Permission, PermissionUpdateModel>();
}

public static Permission ToEntity(this PermissionUpdateModel model, Permission destination)
{
return model.MapTo(destination);
}
}
}
23 changes: 23 additions & 0 deletions src/Web/Grand.Web.Admin/Mapper/PermissionProfile.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using AutoMapper;
using Grand.Domain.Permissions;
using Grand.Infrastructure.Mapper;
using Grand.Web.Admin.Models.Permissions;

namespace Grand.Web.Admin.Mapper;

public class PermissionProfile : Profile, IAutoMapperProfile
{
public PermissionProfile()
{
CreateMap<PermissionCreateModel, Permission>();
CreateMap<PermissionUpdateModel, Permission>()
.ForMember(dest => dest.Id, mo => mo.Ignore())
.ForMember(dest => dest.SystemName, mo => mo.Ignore())
.ForMember(dest => dest.Actions, mo => mo.Ignore())
.ForMember(dest => dest.CustomerGroups, mo => mo.Ignore());

CreateMap<Permission, PermissionUpdateModel>();
}

public int Order => 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Grand.Infrastructure.ModelBinding;
using Grand.Infrastructure.Models;

namespace Grand.Web.Admin.Models.Permissions;

public class PermissionCreateModel : BaseModel
{
/// <summary>
/// Gets or sets the permission name
/// </summary>
[GrandResourceDisplayName("Admin.Configuration.Permissions.Fields.Name")]
public string Name { get; set; }

/// <summary>
/// Gets or sets the permission system name
/// </summary>
[GrandResourceDisplayName("Admin.Configuration.Permissions.Fields.SystemName")]
public string SystemName { get; set; }

/// <summary>
/// Gets or sets the area name
/// </summary>
[GrandResourceDisplayName("Admin.Configuration.Permissions.Fields.Area")]
public string Area { get; set; }

/// <summary>
/// Gets or sets the permission category
/// </summary>
[GrandResourceDisplayName("Admin.Configuration.Permissions.Fields.Category")]
public string Category { get; set; }
}
Loading

0 comments on commit e2b6494

Please sign in to comment.