@namespace Oqtane.Modules.Controls @using System.Text.Json @inherits LocalizableComponent @inject IStringLocalizer SharedLocalizer @inject NavigationManager NavigationManager @if (PageState.RenderMode == RenderModes.Interactive || ModuleState.RenderMode == RenderModes.Interactive) { @if (_visible) {
} @if (_authorized) { if (Disabled) { } else { } } } else { @if (_visible) {
} @if (_authorized) { if (Disabled) { } else {
} } } @code { private bool _visible = false; private List _permissions; private bool _editmode = false; private bool _authorized = false; private string _iconSpan = string.Empty; private string _openIconSpan = string.Empty; private string _openText = string.Empty; [Parameter] public string Header { get; set; } // required [Parameter] public string Message { get; set; } // required [Parameter] public string Text { get; set; } // optional - defaults to Action if not specified [Parameter] public string Action { get; set; } // optional [Parameter] public SecurityAccessLevel? Security { get; set; } // optional - can be used to explicitly specify SecurityAccessLevel [Parameter] public string Permissions { get; set; } // deprecated - use PermissionList instead [Parameter] public List PermissionList { get; set; } // optional - can be used to specify permissions [Parameter] public string Class { get; set; } // optional [Parameter] public bool Disabled { get; set; } // optional [Parameter] public string EditMode { get; set; } // optional - specifies if an authorized user must be in edit mode to see the action - default is false [Parameter] public Action OnClick { get; set; } // required if an Action is specified - executes a method in the calling component [Parameter] public string IconName { get; set; } // optional - specifies an icon for the link - default is no icon [Parameter] public bool IconOnly { get; set; } // optional - specifies only icon in opening link [Parameter] public string Id { get; set; } // optional - specifies a unique id for the compoment - required when there are multiple component instances on a page in static rendering protected override void OnInitialized() { if (!string.IsNullOrEmpty(Permissions)) { PermissionList = JsonSerializer.Deserialize>(Permissions); } } protected override void OnParametersSet() { base.OnParametersSet(); if (string.IsNullOrEmpty(Text)) { Text = Action; } if (string.IsNullOrEmpty(Class)) { Class = "btn btn-success"; } if (!string.IsNullOrEmpty(EditMode)) { _editmode = bool.Parse(EditMode); } if (!string.IsNullOrEmpty(IconName)) { if (IconOnly) { _openText = string.Empty; } // Check if IconName starts with "oi oi-" bool startsWithOiOi = IconName.StartsWith("oi oi-"); if (!startsWithOiOi && !IconName.Contains(" ")) { IconName = "oi oi-" + IconName; } _openIconSpan = $"{(IconOnly ? "" : " ")}"; _iconSpan = $" "; } Text = Localize(nameof(Text), Text); Header = Localize(nameof(Header), Header); Message = Localize(nameof(Message), Message); _openText = Text; _permissions = (PermissionList == null) ? ModuleState.PermissionList : PermissionList; _authorized = IsAuthorized(); if (PageState.QueryString.ContainsKey("dialog")) { _visible = (PageState.QueryString["dialog"] == Id); } } private bool IsAuthorized() { bool authorized = false; if (PageState.EditMode || !_editmode) { SecurityAccessLevel security = SecurityAccessLevel.Host; if (Security == null) { string typename = ModuleState.ModuleType.Replace(Utilities.GetTypeNameLastSegment(ModuleState.ModuleType, 0) + ",", Action + ","); Type moduleType = Type.GetType(typename); if (moduleType != null) { var moduleobject = Activator.CreateInstance(moduleType) as IModuleControl; security = moduleobject.SecurityAccessLevel; } else { security = SecurityAccessLevel.Anonymous; // occurs when an action does not have a corresponding module control } } else { security = Security.Value; } switch (security) { case SecurityAccessLevel.Anonymous: authorized = true; break; case SecurityAccessLevel.View: authorized = UserSecurity.IsAuthorized(PageState.User,PermissionNames.View, _permissions); break; case SecurityAccessLevel.Edit: authorized = UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, _permissions); break; case SecurityAccessLevel.Admin: authorized = UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin); break; case SecurityAccessLevel.Host: authorized = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host); break; } } return authorized; } private void DisplayModal() { _visible = !_visible; if (PageState.RenderMode == RenderModes.Interactive || ModuleState.RenderMode == RenderModes.Interactive) { StateHasChanged(); } else { var parameters = new Dictionary(PageState.QueryString); if (parameters.ContainsKey("dialog")) parameters.Remove("dialog"); if (_visible) parameters.Add("dialog", Id); NavigationManager.NavigateTo(PageState.Route.AbsolutePath + Utilities.CreateQueryString(parameters)); } } private void Confirm() { OnClick(); DisplayModal(); } }