271 lines
12 KiB
Plaintext
271 lines
12 KiB
Plaintext
@namespace Oqtane.Modules.Admin.Profiles
|
|
@inherits ModuleBase
|
|
@inject NavigationManager NavigationManager
|
|
@inject IProfileService ProfileService
|
|
@inject ISettingService SettingService
|
|
@inject IStringLocalizer<Edit> Localizer
|
|
@inject IStringLocalizer<SharedResources> SharedLocalizer
|
|
|
|
<form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
|
|
<div class="container">
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="name" HelpText="The name of this profile item" ResourceKey="Name">Name: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="name" class="form-control" @bind="@_name" maxlength="50" required />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="title" HelpText="The title of the profile item to display to the user" ResourceKey="Title">Title: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="title" class="form-control" @bind="@_title" maxlength="50" required />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="description" HelpText="The help text displayed to the user for this profile item" ResourceKey="Description">Description: </Label>
|
|
<div class="col-sm-9">
|
|
<textarea id="description" class="form-control" @bind="@_description" rows="3" maxlength="256" required></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="category" HelpText="The category of this profile item (for grouping)" ResourceKey="Category">Category: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="category" class="form-control" @bind="@_category" maxlength="50" />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="order" HelpText="The index order of where this profile item should be displayed" ResourceKey="Order">Order: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="order" class="form-control" @bind="@_vieworder" min="0" max="9999" type="number" required />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="length" HelpText="The max number of characters this profile item should accept (enter zero for unlimited)" ResourceKey="Length">Length: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="length" class="form-control" @bind="@_maxlength" min="0" max="524288" type="number" required />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="rows" HelpText="The number of rows for text entry (one is the default)" ResourceKey="Rows">Rows: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="rows" class="form-control" @bind="@_rows" min="1" max="10" type="number" required />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="defaultVal" HelpText="The default value for this profile item" ResourceKey="DefaultValue">Default Value: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="defaultVal" class="form-control" @bind="@_defaultvalue" maxlength="2000" />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="options" HelpText="A comma delimited list of options. Options can contain a key and value if they are seperated by a colon (ie. key:value). You can also dynamically load your options from Settings." ResourceKey="Options">Options: </Label>
|
|
<div class="col-sm-9">
|
|
<div class="input-group">
|
|
@if (_optiontype == "Settings")
|
|
{
|
|
<input id="options" class="form-control" @bind="@_options" maxlength="2000" />
|
|
}
|
|
else
|
|
{
|
|
<select id="entityName" class="form-select" @bind="@_options">
|
|
<option value=""><@SharedLocalizer["Not Specified"]></option>
|
|
@foreach (var entityname in _entitynames)
|
|
{
|
|
<option value="@entityname">@entityname</option>
|
|
}
|
|
</select>
|
|
}
|
|
<button type="button" class="btn btn-secondary" @onclick="ToggleOptionType">@Localizer[_optiontype]</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="required" HelpText="Should a user be required to provide a value for this profile item?" ResourceKey="Required">Required? </Label>
|
|
<div class="col-sm-9">
|
|
<select id="required" class="form-select" @bind="@_isrequired" required>
|
|
<option value="True">@SharedLocalizer["Yes"]</option>
|
|
<option value="False">@SharedLocalizer["No"]</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="validation" HelpText="Optionally provide a regular expression (RegExp) for validating the value entered" ResourceKey="Validation">Validation: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="validation" class="form-control" @bind="@_validation" maxlength="200" />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="autocomplete" HelpText="The HTML autocomplete attribute allows you to specify browser behavior for automated user assistance in filling out form field values. Allowable values are blank (default), 'on', 'off', or any value from the standardized taxonomy defined for this attribute." ResourceKey="Autocomplete">Autocomplete: </Label>
|
|
<div class="col-sm-9">
|
|
<input id="autocomplete" class="form-control" @bind="@_autocomplete" maxlength="30" />
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="private" HelpText="Should this profile item be visible to all users?" ResourceKey="Private">Private? </Label>
|
|
<div class="col-sm-9">
|
|
<select id="private" class="form-select" @bind="@_isprivate" required>
|
|
<option value="True">@SharedLocalizer["Yes"]</option>
|
|
<option value="False">@SharedLocalizer["No"]</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<br />
|
|
<button type="button" class="btn btn-success" @onclick="SaveProfile">@SharedLocalizer["Save"]</button>
|
|
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@SharedLocalizer["Cancel"]</NavLink>
|
|
@if (PageState.QueryString.ContainsKey("id"))
|
|
{
|
|
<br />
|
|
<br />
|
|
<AuditInfo CreatedBy="@createdby" CreatedOn="@createdon" ModifiedBy="@modifiedby" ModifiedOn="@modifiedon"></AuditInfo>
|
|
}
|
|
</form>
|
|
|
|
@code {
|
|
private int _profileid = -1;
|
|
private ElementReference form;
|
|
private bool validated = false;
|
|
private string _name = string.Empty;
|
|
private string _title = string.Empty;
|
|
private string _description = string.Empty;
|
|
private string _category = string.Empty;
|
|
private string _vieworder = "0";
|
|
private string _maxlength = "0";
|
|
private string _rows = "1";
|
|
private string _defaultvalue = string.Empty;
|
|
private string _options = string.Empty;
|
|
private string _optiontype = "Settings";
|
|
private List<string> _entitynames;
|
|
private string _validation = string.Empty;
|
|
private string _autocomplete = string.Empty;
|
|
private string _isrequired = "False";
|
|
private string _isprivate = "False";
|
|
private string createdby;
|
|
private DateTime createdon;
|
|
private string modifiedby;
|
|
private DateTime modifiedon;
|
|
|
|
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
|
|
|
|
public override string Actions => "Add,Edit";
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
try
|
|
{
|
|
_entitynames = await SettingService.GetEntityNamesAsync();
|
|
|
|
if (PageState.QueryString.ContainsKey("id"))
|
|
{
|
|
_profileid = Int32.Parse(PageState.QueryString["id"]);
|
|
var profile = await ProfileService.GetProfileAsync(_profileid);
|
|
if (profile != null)
|
|
{
|
|
_name = profile.Name;
|
|
_title = profile.Title;
|
|
_description = profile.Description;
|
|
_category = profile.Category;
|
|
_vieworder = profile.ViewOrder.ToString();
|
|
_maxlength = profile.MaxLength.ToString();
|
|
_rows = profile.Rows.ToString();
|
|
_defaultvalue = profile.DefaultValue;
|
|
_options = profile.Options;
|
|
if (_options.StartsWith("EntityName:"))
|
|
{
|
|
_optiontype = "Options";
|
|
_options = _options.Substring(11);
|
|
}
|
|
_validation = profile.Validation;
|
|
_autocomplete = profile.Autocomplete;
|
|
_isrequired = profile.IsRequired.ToString();
|
|
_isprivate = profile.IsPrivate.ToString();
|
|
createdby = profile.CreatedBy;
|
|
createdon = profile.CreatedOn;
|
|
modifiedby = profile.ModifiedBy;
|
|
modifiedon = profile.ModifiedOn;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error Loading Profile {ProfileId} {Error}", _profileid, ex.Message);
|
|
AddModuleMessage(Localizer["Error.Profile.Load"], MessageType.Error);
|
|
}
|
|
}
|
|
|
|
private void ToggleOptionType()
|
|
{
|
|
if (_optiontype == "Options")
|
|
{
|
|
_optiontype = "Settings";
|
|
}
|
|
else
|
|
{
|
|
_optiontype = "Options";
|
|
}
|
|
}
|
|
|
|
private async Task SaveProfile()
|
|
{
|
|
validated = true;
|
|
var interop = new Interop(JSRuntime);
|
|
if (await interop.FormValid(form))
|
|
{
|
|
try
|
|
{
|
|
Profile profile;
|
|
if (_profileid != -1)
|
|
{
|
|
profile = await ProfileService.GetProfileAsync(_profileid);
|
|
}
|
|
else
|
|
{
|
|
profile = new Profile();
|
|
}
|
|
|
|
profile.SiteId = PageState.Site.SiteId;
|
|
profile.Name = _name;
|
|
profile.Title = _title;
|
|
profile.Description = _description;
|
|
profile.Category = _category;
|
|
profile.ViewOrder = int.Parse(_vieworder);
|
|
profile.MaxLength = int.Parse(_maxlength);
|
|
profile.Rows = int.Parse(_rows);
|
|
profile.DefaultValue = _defaultvalue;
|
|
if (_optiontype == "Options" && !string.IsNullOrEmpty(_options))
|
|
{
|
|
profile.Options = "EntityName:" + _options;
|
|
}
|
|
else
|
|
{
|
|
profile.Options = _options;
|
|
}
|
|
profile.Validation = _validation;
|
|
profile.Autocomplete = _autocomplete;
|
|
profile.IsRequired = (_isrequired == null ? false : Boolean.Parse(_isrequired));
|
|
profile.IsPrivate = (_isprivate == null ? false : Boolean.Parse(_isprivate));
|
|
|
|
if (_profileid != -1)
|
|
{
|
|
profile = await ProfileService.UpdateProfileAsync(profile);
|
|
}
|
|
else
|
|
{
|
|
profile = await ProfileService.AddProfileAsync(profile);
|
|
}
|
|
|
|
await logger.LogInformation("Profile Saved {Profile}", profile);
|
|
NavigationManager.NavigateTo(NavigateUrl());
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error Saving Profile {ProfleId} {Error}", _profileid, ex.Message);
|
|
AddModuleMessage(Localizer["Error.Profile.Save"], MessageType.Error);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
|
|
}
|
|
}
|
|
}
|