init: initial commit
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
using Server.Infrastructure.Messages;
|
||||
|
||||
namespace Server.Infrastructure;
|
||||
|
||||
public abstract class BasePageModel :
|
||||
Microsoft.AspNetCore.Mvc.RazorPages.PageModel, IMessageHandler
|
||||
{
|
||||
public BasePageModel() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public bool AddPageError(string? message)
|
||||
{
|
||||
return AddMessage
|
||||
(type: MessageType.PageError, message: message);
|
||||
}
|
||||
|
||||
public bool AddPageWarning(string? message)
|
||||
{
|
||||
return AddMessage
|
||||
(type: MessageType.PageWarning, message: message);
|
||||
}
|
||||
|
||||
public bool AddPageSuccess(string? message)
|
||||
{
|
||||
return AddMessage
|
||||
(type: MessageType.PageSuccess, message: message);
|
||||
}
|
||||
|
||||
public bool AddToastError(string? message)
|
||||
{
|
||||
return AddMessage
|
||||
(type: MessageType.ToastError, message: message);
|
||||
}
|
||||
|
||||
public bool AddToastWarning(string? message)
|
||||
{
|
||||
return AddMessage
|
||||
(type: MessageType.ToastWarning, message: message);
|
||||
}
|
||||
|
||||
public bool AddToastSuccess(string? message)
|
||||
{
|
||||
return AddMessage
|
||||
(type: MessageType.ToastSuccess, message: message);
|
||||
}
|
||||
|
||||
public bool AddMessage(MessageType type, string? message)
|
||||
{
|
||||
return Utility.AddMessage
|
||||
(tempData: TempData, type: type, message: message);
|
||||
}
|
||||
|
||||
protected string SetReturnUrl(string? returnUrl)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value: returnUrl))
|
||||
{
|
||||
returnUrl = "./Index";
|
||||
}
|
||||
|
||||
return returnUrl;
|
||||
}
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
using Microsoft.Extensions.Options;
|
||||
using Server.Infrastructure.Settings;
|
||||
|
||||
namespace Server.Infrastructure.Extensions.ServiceCollections;
|
||||
|
||||
public static class ConfigurationExtensions
|
||||
{
|
||||
public static WebApplicationBuilder AddConfiguration(this WebApplicationBuilder builder)
|
||||
{
|
||||
builder.Services.Configure<ApplicationSettings>
|
||||
(builder.Configuration.GetSection(key: ApplicationSettings.KeyName))
|
||||
.AddSingleton
|
||||
(implementationFactory: serviceType =>
|
||||
{
|
||||
var result =
|
||||
serviceType.GetRequiredService
|
||||
<IOptions<ApplicationSettings>>().Value;
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
return builder;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,407 @@
|
||||
namespace Server.Infrastructure;
|
||||
|
||||
public static class HtmlHelpers
|
||||
{
|
||||
static HtmlHelpers()
|
||||
{
|
||||
}
|
||||
|
||||
public static string DefaultValue
|
||||
{
|
||||
get
|
||||
{
|
||||
//return null;
|
||||
//return string.Empty;
|
||||
return "-----";
|
||||
}
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayInteger
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, long? value)
|
||||
{
|
||||
if (value.HasValue == false)
|
||||
{
|
||||
return html.Raw(value: DefaultValue);
|
||||
}
|
||||
|
||||
var result =
|
||||
value.Value.ToString(format: "#,##0");
|
||||
|
||||
//result =
|
||||
// Convert.DigitsToUnicode(value: result);
|
||||
|
||||
return html.Raw(value: result);
|
||||
}
|
||||
|
||||
//public static Microsoft.AspNetCore.Html
|
||||
// .IHtmlContent Ub_DisplayRowNumberWithTd
|
||||
// (this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, long? value)
|
||||
//{
|
||||
// var td =
|
||||
// new Microsoft.AspNetCore.Mvc
|
||||
// .Rendering.TagBuilder(tagName: "td");
|
||||
|
||||
// td.AddCssClass(value: "text-center");
|
||||
|
||||
// var innerHtml =
|
||||
// Ub_DisplayInteger(html: html, value: value);
|
||||
|
||||
// td.InnerHtml.AppendHtml(content: innerHtml);
|
||||
|
||||
// return td;
|
||||
//}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayStringWithTd
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, string? value)
|
||||
{
|
||||
var td =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "td");
|
||||
|
||||
td.AddCssClass("align-middle text-center");
|
||||
|
||||
td.InnerHtml.Append(value!);
|
||||
|
||||
return td;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayStringWithTh
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, string? value)
|
||||
{
|
||||
var td =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "th");
|
||||
|
||||
td.AddCssClass("align-middle text-center");
|
||||
|
||||
td.InnerHtml.Append(value!);
|
||||
|
||||
return td;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayBoolean
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, bool? value)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass("d-flex justify-content-center align-items-center");
|
||||
|
||||
var input =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "input");
|
||||
|
||||
input.AddCssClass("form-check-input m-0");
|
||||
|
||||
input.Attributes.Add
|
||||
(key: "type", value: "checkbox");
|
||||
|
||||
input.Attributes.Add
|
||||
(key: "disabled", value: "disabled");
|
||||
|
||||
if (value.HasValue && value.Value)
|
||||
{
|
||||
input.Attributes.Add
|
||||
(key: "checked", value: "checked");
|
||||
}
|
||||
|
||||
div.InnerHtml.AppendHtml(content: input);
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayBooleanWithTd
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, bool? value)
|
||||
{
|
||||
var td =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "td");
|
||||
|
||||
td.AddCssClass("align-middle text-center");
|
||||
|
||||
var innerHtml =
|
||||
html.Ub_DisplayBoolean(value: value);
|
||||
|
||||
td.InnerHtml.AppendHtml(content: innerHtml);
|
||||
|
||||
return td;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayIntegerWithTd
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, long? value)
|
||||
{
|
||||
var td =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "td");
|
||||
|
||||
td.Attributes.Add
|
||||
(key: "dir", value: "ltr");
|
||||
|
||||
var innerHtml =
|
||||
html.Ub_DisplayInteger(value: value);
|
||||
|
||||
td.AddCssClass("align-middle text-center");
|
||||
|
||||
td.InnerHtml.AppendHtml(content: innerHtml);
|
||||
|
||||
return td;
|
||||
}
|
||||
|
||||
//public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayDateTime
|
||||
// (this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, System.DateTime? value)
|
||||
//{
|
||||
// if (value.HasValue == false)
|
||||
// {
|
||||
// return html.Raw(value: DefaultValue);
|
||||
// }
|
||||
|
||||
// var result =
|
||||
// value.Value.ToString
|
||||
// (format: "yyyy/MM/dd - HH:mm:ss");
|
||||
|
||||
// result =
|
||||
// Convert.DigitsToUnicode(value: result);
|
||||
|
||||
// return html.Raw(value: result);
|
||||
//}
|
||||
|
||||
//public static Microsoft.AspNetCore.Html.IHtmlContent Ub_DisplayDateTimeWithTd
|
||||
// (this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, System.DateTime? value)
|
||||
//{
|
||||
// var td =
|
||||
// new Microsoft.AspNetCore.Mvc
|
||||
// .Rendering.TagBuilder(tagName: "td");
|
||||
|
||||
// td.Attributes.Add
|
||||
// (key: "dir", value: "ltr");
|
||||
|
||||
// var innerHtml =
|
||||
// Ub_DisplayDateTime(html: html, value: value);
|
||||
|
||||
// td.InnerHtml.AppendHtml(content: innerHtml);
|
||||
|
||||
// return td;
|
||||
//}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_GetLinkCaptionForList
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconList();
|
||||
|
||||
var span =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "span");
|
||||
|
||||
span.AddCssClass(value: "mx-1");
|
||||
|
||||
span.InnerHtml.Append(unencoded: "[");
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.AppendHtml(content: icon);
|
||||
span.InnerHtml.Append(unencoded: Resources.ButtonCaptions.BackToList);
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.Append(unencoded: "]");
|
||||
|
||||
return span;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_GetLinkCaptionForDetails
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconDetails();
|
||||
|
||||
var span =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "span");
|
||||
|
||||
span.AddCssClass(value: "mx-1");
|
||||
|
||||
span.InnerHtml.Append(unencoded: "[");
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.AppendHtml(content: icon);
|
||||
span.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Details);
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.Append(unencoded: "]");
|
||||
|
||||
return span;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_GetLinkCaptionForCreate
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconCreate();
|
||||
|
||||
var span =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "span");
|
||||
|
||||
//span.AddCssClass(value: "mx-1");
|
||||
|
||||
//span.InnerHtml.Append(unencoded: "[");
|
||||
//span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.AppendHtml(content: icon);
|
||||
span.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Create);
|
||||
//span.InnerHtml.Append(unencoded: " ");
|
||||
//span.InnerHtml.Append(unencoded: "]");
|
||||
|
||||
return span;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_GetLinkCaptionForUpdate
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconUpdate();
|
||||
|
||||
var span =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "span");
|
||||
|
||||
span.AddCssClass(value: "mx-1");
|
||||
|
||||
span.InnerHtml.Append(unencoded: "[");
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.AppendHtml(content: icon);
|
||||
span.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Update);
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.Append(unencoded: "]");
|
||||
|
||||
return span;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_GetLinkCaptionForDelete
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconDelete();
|
||||
|
||||
var span =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "span");
|
||||
|
||||
span.AddCssClass(value: "mx-1");
|
||||
|
||||
span.InnerHtml.Append(unencoded: "[");
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.AppendHtml(content: icon);
|
||||
span.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Delete);
|
||||
span.InnerHtml.Append(unencoded: " ");
|
||||
span.InnerHtml.Append(unencoded: "]");
|
||||
|
||||
return span;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_GetIconDetails
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconDetails();
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent Ub_GetIconCreate
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconCreate();
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent DtatGetIconUpdate
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconUpdate();
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Html.IHtmlContent DtatGetIconDelete
|
||||
(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html)
|
||||
{
|
||||
if (html is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(html));
|
||||
}
|
||||
|
||||
var icon =
|
||||
TagHelpers.Utility.GetIconDelete();
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
//------------------ Custom's
|
||||
|
||||
//public static Microsoft.AspNetCore.Html.IHtmlContent TextClickTo(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper html, string action, string iconClass, string to)
|
||||
//{
|
||||
// if (html is null)
|
||||
// {
|
||||
// throw new System
|
||||
// .ArgumentNullException(paramName: nameof(html));
|
||||
// }
|
||||
|
||||
// var p =
|
||||
// new Microsoft.AspNetCore.Mvc
|
||||
// .Rendering.TagBuilder(tagName: "p");
|
||||
|
||||
// p.AddCssClass("d-flex align-items-center fw-light");
|
||||
|
||||
// var i = $"<i class=\"flex-center border rounded fs-4 mx-2 p-1 {iconClass}\"></i>";
|
||||
|
||||
// var format = Resources.Messages.Information.ClickToThe;
|
||||
|
||||
// p.InnerHtml.AppendHtml(string.Format(format, i, action, to));
|
||||
|
||||
// return p;
|
||||
//}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
namespace Server.Infrastructure.Messages;
|
||||
|
||||
public interface IMessageHandler
|
||||
{
|
||||
bool AddPageError(string? message);
|
||||
|
||||
bool AddPageWarning(string? message);
|
||||
|
||||
bool AddPageSuccess(string? message);
|
||||
|
||||
|
||||
|
||||
bool AddToastError(string? message);
|
||||
|
||||
bool AddToastWarning(string? message);
|
||||
|
||||
bool AddToastSuccess(string? message);
|
||||
|
||||
|
||||
|
||||
bool AddMessage(MessageType type, string? message);
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
namespace Server.Infrastructure.Messages;
|
||||
|
||||
public enum MessageType : byte
|
||||
{
|
||||
PageError,
|
||||
PageWarning,
|
||||
PageSuccess,
|
||||
|
||||
ToastError,
|
||||
ToastWarning,
|
||||
ToastSuccess,
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
namespace Server.Infrastructure.Messages;
|
||||
|
||||
|
||||
public static class Utility
|
||||
{
|
||||
static Utility()
|
||||
{
|
||||
}
|
||||
|
||||
public static bool AddMessage
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionary tempData,
|
||||
MessageType type, string? message)
|
||||
{
|
||||
message =
|
||||
Framework.DataType.String.Fix(message);
|
||||
|
||||
if (message == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// **************************************************
|
||||
// به دلایل خیلی زیادی، کد ذیل به صورتی که ملاحظه میکنید
|
||||
// نوشته شده است، لذا در آن هیچگونه تغییری اعمال نکنید
|
||||
// **************************************************
|
||||
System.Collections.Generic.List<string>? list;
|
||||
|
||||
var tempDataItems =
|
||||
(tempData[key: type.ToString()] as
|
||||
System.Collections.Generic.IList<string>);
|
||||
|
||||
if (tempDataItems == null)
|
||||
{
|
||||
list = new System.Collections.Generic.List<string>();
|
||||
}
|
||||
else
|
||||
{
|
||||
list =
|
||||
tempDataItems as
|
||||
System.Collections.Generic.List<string>;
|
||||
|
||||
if (list == null)
|
||||
{
|
||||
list = tempDataItems.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
tempData[key: type.ToString()] = list;
|
||||
// **************************************************
|
||||
|
||||
if (list.Contains(item: message))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
list.Add(item: message);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
namespace Server.Infrastructure.Settings;
|
||||
|
||||
public class ApplicationSettings : object
|
||||
{
|
||||
public static readonly string KeyName = nameof(ApplicationSettings);
|
||||
|
||||
public ApplicationSettings() : base()
|
||||
{
|
||||
ToastSettings =
|
||||
new ToastSettings();
|
||||
|
||||
CultureSettings =
|
||||
new CultureSettings();
|
||||
}
|
||||
|
||||
// **********
|
||||
public string? Version { get; set; }
|
||||
// **********
|
||||
|
||||
// **********
|
||||
public string? MasterPassword { get; set; }
|
||||
// **********
|
||||
|
||||
// **********
|
||||
public string[]? ActivationKeys { get; set; }
|
||||
// **********
|
||||
|
||||
// **********
|
||||
public ToastSettings ToastSettings { get; set; }
|
||||
// **********
|
||||
|
||||
// **********
|
||||
public CultureSettings CultureSettings { get; set; }
|
||||
// **********
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
namespace Server.Infrastructure.Settings;
|
||||
|
||||
public class CultureSettings
|
||||
{
|
||||
public CultureSettings()
|
||||
{
|
||||
DefaultCulture = new CultureData()
|
||||
{
|
||||
Name = "فارسی - ایران",
|
||||
Culture = "fa-IR",
|
||||
};
|
||||
|
||||
SupportedCulture =
|
||||
new List<CultureData>();
|
||||
}
|
||||
|
||||
|
||||
// **********
|
||||
public CultureData DefaultCulture { get; set; }
|
||||
// **********
|
||||
|
||||
// **********
|
||||
public List<CultureData> SupportedCulture { get; set; }
|
||||
// **********
|
||||
|
||||
public class CultureData
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Culture { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
namespace Server.Infrastructure.Settings
|
||||
{
|
||||
public class ToastSettings : object
|
||||
{
|
||||
public ToastSettings() : base()
|
||||
{
|
||||
DelayStep = 1000;
|
||||
InitialDelay = 4000;
|
||||
|
||||
Style =
|
||||
"top-25 end-0 p-3 opacity-50";
|
||||
}
|
||||
|
||||
// **********
|
||||
public string Style { get; set; }
|
||||
// **********
|
||||
|
||||
// **********
|
||||
public int DelayStep { get; set; }
|
||||
// **********
|
||||
|
||||
// **********
|
||||
public int InitialDelay { get; set; }
|
||||
// **********
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
namespace Server.Infrastructure.TagHelpers.Buttons;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "button-create",
|
||||
ParentTag = "section-form-buttons",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ButtonCreateTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ButtonCreateTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var icon =
|
||||
Utility.GetIconCreate();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "button");
|
||||
|
||||
body.Attributes.Add
|
||||
(key: "type", value: "submit");
|
||||
|
||||
body.AddCssClass(value: "btn");
|
||||
body.AddCssClass(value: "btn-primary");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: icon);
|
||||
body.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Create);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
namespace Server.Infrastructure.TagHelpers.Buttons;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "button-delete",
|
||||
ParentTag = "section-form-buttons",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ButtonDeleteTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ButtonDeleteTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var icon =
|
||||
Utility.GetIconDelete();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "button");
|
||||
|
||||
body.Attributes.Add
|
||||
(key: "type", value: "submit");
|
||||
|
||||
body.AddCssClass(value: "btn");
|
||||
body.AddCssClass(value: "btn-danger");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: icon);
|
||||
body.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Delete);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
namespace Server.Infrastructure.TagHelpers.Buttons;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "button-reset",
|
||||
ParentTag = "section-form-buttons",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ButtonResetTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ButtonResetTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var icon =
|
||||
Utility.GetIconReset();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "button");
|
||||
|
||||
body.Attributes.Add
|
||||
(key: "type", value: "reset");
|
||||
|
||||
body.AddCssClass(value: "btn");
|
||||
body.AddCssClass(value: "btn-secondary");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: icon);
|
||||
body.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Reset);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
namespace Server.Infrastructure.TagHelpers.Buttons;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "button-save",
|
||||
ParentTag = "section-form-buttons",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ButtonSaveTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ButtonSaveTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var icon =
|
||||
Utility.GetIconUpdate();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "button");
|
||||
|
||||
body.Attributes.Add
|
||||
(key: "type", value: "submit");
|
||||
|
||||
body.AddCssClass(value: "btn");
|
||||
body.AddCssClass(value: "btn-primary");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: icon);
|
||||
body.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Save);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
namespace Server.Infrastructure.TagHelpers.Buttons;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "button-send",
|
||||
ParentTag = "section-form-buttons",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ButtonSendTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ButtonSendTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var icon =
|
||||
Utility.GetIconSend();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "button");
|
||||
|
||||
body.Attributes.Add
|
||||
(key: "type", value: "submit");
|
||||
|
||||
body.AddCssClass(value: "btn");
|
||||
body.AddCssClass(value: "btn-primary");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: icon);
|
||||
body.InnerHtml.Append(unencoded: Resources.ButtonCaptions.Send);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
namespace Server.Infrastructure.TagHelpers.Buttons;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "uni-button",
|
||||
ParentTag = "section-form-buttons",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ButtonSubmitCustomLabel :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public string Label { get; set; }
|
||||
public ButtonSubmitCustomLabel() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var icon =
|
||||
Utility.GetIconUpdate();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "button");
|
||||
|
||||
body.Attributes.Add
|
||||
(key: "type", value: "submit");
|
||||
|
||||
body.AddCssClass(value: "btn");
|
||||
body.AddCssClass(value: "btn-primary");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: icon);
|
||||
body.InnerHtml.Append(unencoded: Label);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
//using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
//namespace Infrastructure.TagHelpers.CheckThemOut;
|
||||
|
||||
//[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
// (tag: Constants.HtmlTag.TableData,
|
||||
// Attributes = "page-information-view-model")]
|
||||
//public class PagerTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
//{
|
||||
// #region Constructor(s)
|
||||
//#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
|
||||
// public PagerTagHelper
|
||||
//#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
|
||||
// (Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory urlHelperFactory) : base()
|
||||
// {
|
||||
// PageAction = "./Index";
|
||||
|
||||
// UrlHelperFactory = urlHelperFactory;
|
||||
// }
|
||||
// #endregion /Constructor(s)
|
||||
|
||||
// #region Property(ies)
|
||||
// public string PageClass { get; set; }
|
||||
|
||||
// public string? PageAction { get; set; }
|
||||
|
||||
// public string PageDefaultClass { get; set; }
|
||||
|
||||
// public string PageSelectedClass { get; set; }
|
||||
|
||||
// public bool PageClassesEnabled { get; set; }
|
||||
|
||||
// [Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
// [Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
// public Microsoft.AspNetCore.Mvc.Rendering.ViewContext ViewContext { get; set; }
|
||||
|
||||
// public ViewModels.Shared.PaginationViewModel PageInformationViewModel { get; set; }
|
||||
|
||||
// protected Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory UrlHelperFactory { get; }
|
||||
// #endregion /Property(ies)
|
||||
|
||||
// #region Process
|
||||
// // Development in progress...
|
||||
// public override
|
||||
// void
|
||||
// Process
|
||||
// (Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
// Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
// {
|
||||
// var urlHelper =
|
||||
// UrlHelperFactory.GetUrlHelper
|
||||
// (context: ViewContext);
|
||||
|
||||
// var result =
|
||||
// new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder
|
||||
// (tagName: Constants.HtmlTag.TableData);
|
||||
|
||||
// var ulTag =
|
||||
// new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder
|
||||
// (tagName: Constants.HtmlTag.Unorderedlist);
|
||||
|
||||
// ulTag.AddCssClass(value: "pagination");
|
||||
|
||||
// // **************************************************
|
||||
// var liTag = BuildListItemTag();
|
||||
|
||||
// var aTag =
|
||||
// BuildAnchorTag(urlHelper: urlHelper,
|
||||
// caption: Resources.ButtonCaptions.Previous,
|
||||
// pageNumber: PageInformationViewModel.PageNumber - 1);
|
||||
|
||||
// if (PageInformationViewModel.PageNumber <= 1)
|
||||
// {
|
||||
// aTag.AddCssClass(value: Constants.CssClass.Disabled);
|
||||
// }
|
||||
// // **************************************************
|
||||
|
||||
|
||||
// // **************************************************
|
||||
// liTag.InnerHtml.AppendHtml(content: aTag);
|
||||
|
||||
// ulTag.InnerHtml.AppendHtml(content: liTag);
|
||||
// // **************************************************
|
||||
|
||||
// for (int index = 1; index <= PageInformationViewModel.PageCount; index++)
|
||||
// {
|
||||
// if (index == PageInformationViewModel.PageNumber ||
|
||||
// index == PageInformationViewModel.PageNumber - 1 ||
|
||||
// index == PageInformationViewModel.PageNumber + 1)
|
||||
// {
|
||||
// liTag =
|
||||
// BuildListItemTag();
|
||||
|
||||
// aTag = BuildAnchorTag
|
||||
// (pageNumber: index,
|
||||
// urlHelper: urlHelper, caption: index.ToString());
|
||||
|
||||
// liTag.InnerHtml.AppendHtml(content: aTag);
|
||||
|
||||
// ulTag.InnerHtml.AppendHtml(content: liTag);
|
||||
// }
|
||||
// }
|
||||
|
||||
// // **************************************************
|
||||
// liTag = BuildListItemTag();
|
||||
|
||||
// aTag = BuildAnchorTag
|
||||
// (urlHelper: urlHelper,
|
||||
// caption: Resources.ButtonCaptions.Next,
|
||||
// pageNumber: PageInformationViewModel.PageNumber + 1);
|
||||
|
||||
// if (PageInformationViewModel.PageNumber >= PageInformationViewModel.PageCount)
|
||||
// {
|
||||
// aTag.AddCssClass(value: Constants.CssClass.Disabled);
|
||||
// }
|
||||
// // **************************************************
|
||||
|
||||
// // **************************************************
|
||||
// liTag.InnerHtml.AppendHtml(content: aTag);
|
||||
// ulTag.InnerHtml.AppendHtml(content: liTag);
|
||||
// // **************************************************
|
||||
|
||||
// result.InnerHtml.AppendHtml(content: ulTag);
|
||||
|
||||
// output.Content.AppendHtml(htmlContent: result.InnerHtml);
|
||||
// }
|
||||
// #endregion /Process
|
||||
|
||||
// #region Build List Item Tag
|
||||
// private static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder BuildListItemTag()
|
||||
// {
|
||||
// var tag =
|
||||
// new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder
|
||||
// (tagName: Constants.HtmlTag.ListItem);
|
||||
|
||||
// tag.AddCssClass(value: "page-item");
|
||||
|
||||
// return tag;
|
||||
// }
|
||||
// #endregion /Build List Item Tag
|
||||
|
||||
// #region Build Anchor Tag
|
||||
// private
|
||||
// Microsoft.AspNetCore.Mvc.Rendering.TagBuilder
|
||||
// BuildAnchorTag
|
||||
// (string caption, int pageNumber, IUrlHelper urlHelper)
|
||||
// {
|
||||
// var tag =
|
||||
// new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder
|
||||
// (tagName: Constants.HtmlTag.Anchor);
|
||||
|
||||
// tag.Attributes["href"] =
|
||||
// // .Action -> using Microsoft.AspNetCore.Mvc
|
||||
// urlHelper.Action
|
||||
// (action: PageAction,
|
||||
// values: new { PageNumber = pageNumber, PageInformationViewModel.PageSize });
|
||||
|
||||
// if (PageClassesEnabled)
|
||||
// {
|
||||
// var style =
|
||||
// pageNumber ==
|
||||
// PageInformationViewModel.PageNumber ?
|
||||
// PageSelectedClass : PageDefaultClass;
|
||||
|
||||
// var cssClass =
|
||||
// $"{PageClass} {style}";
|
||||
|
||||
// tag.AddCssClass(value: cssClass);
|
||||
// }
|
||||
|
||||
// tag.InnerHtml.Append(unencoded: caption);
|
||||
|
||||
// return tag;
|
||||
// }
|
||||
// #endregion /Build Anchor Tag
|
||||
//}
|
||||
@@ -0,0 +1,5 @@
|
||||
https://bigfont.ca/taghelper-structure/
|
||||
https://www.yogihosting.com/aspnet-core-custom-tag-helpers/
|
||||
https://wesleycabus.be/writing-a-custom-taghelper-in-aspnet-5
|
||||
https://riptutorial.com/asp-net-core/example/11152/custom-tag-helper
|
||||
https://stackoverflow.com/questions/51904629/how-to-create-custom-tag-helper-containing-other-tag-helpers
|
||||
@@ -0,0 +1,106 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.FullCheckBox,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class FullCheckBoxTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public FullCheckBoxTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
if (ViewContext is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(ViewContext));
|
||||
}
|
||||
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var innerDiv =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
innerDiv.AddCssClass(value: "form-check");
|
||||
|
||||
div.InnerHtml.AppendHtml(content: innerDiv);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var checkBox =
|
||||
await
|
||||
Utility.GenerateCheckBoxAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
innerDiv.InnerHtml.AppendHtml(encoded: checkBox);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var label =
|
||||
await
|
||||
Utility.GenerateLabelAsync(generator: Generator,
|
||||
viewContext: ViewContext, @for: For, cssClass: "form-check-label");
|
||||
|
||||
innerDiv.InnerHtml.AppendHtml(encoded: label);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
|
||||
//private async System.Threading.Tasks.Task<string> CreateLabelElementAsync()
|
||||
//{
|
||||
// var tagBuilder =
|
||||
// Generator.GenerateLabel
|
||||
// (viewContext: ViewContext,
|
||||
// modelExplorer: For.ModelExplorer, expression: For.Name, labelText: null,
|
||||
// htmlAttributes: new { @class = });
|
||||
|
||||
// var writer =
|
||||
// new System.IO.StringWriter();
|
||||
|
||||
// tagBuilder.WriteTo(writer: writer,
|
||||
// encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
// var result =
|
||||
// writer.ToString();
|
||||
|
||||
// await writer.DisposeAsync();
|
||||
|
||||
// return result;
|
||||
//}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.FullInput,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class FullInputTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public FullInputTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new Exception
|
||||
(message: $"'{nameof(For)}' property is null ");
|
||||
}
|
||||
|
||||
if (ViewContext is null)
|
||||
{
|
||||
throw new Exception
|
||||
(message: $"'{nameof(ViewContext)}' property is null ");
|
||||
}
|
||||
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var label =
|
||||
await
|
||||
Utility.GenerateLabelAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: label);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
string? dirString = null;
|
||||
|
||||
var dirAttribute =
|
||||
output.Attributes["dir"];
|
||||
|
||||
if (dirAttribute is not null)
|
||||
{
|
||||
var dirValue =
|
||||
dirAttribute.Value;
|
||||
|
||||
if (dirValue is not null)
|
||||
{
|
||||
dirString =
|
||||
dirValue.ToString()?
|
||||
.Replace(oldValue: "{", newValue: string.Empty)
|
||||
.Replace(oldValue: "}", newValue: string.Empty);
|
||||
}
|
||||
}
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var textBox =
|
||||
await
|
||||
Utility.GenerateTextBoxAsync(generator: Generator,
|
||||
viewContext: ViewContext, @for: For, dir: dirString);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: textBox);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var validationMessage =
|
||||
await
|
||||
Utility.GenerateValidationMessageAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: validationMessage);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.FullPasswordInput,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class FullPasswordInputTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public FullPasswordInputTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
if (ViewContext is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(ViewContext));
|
||||
}
|
||||
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var label =
|
||||
await
|
||||
Utility.GenerateLabelAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: label);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var textBox =
|
||||
await
|
||||
Utility.GeneratePasswordTextBoxAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: textBox);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var validationMessage =
|
||||
await
|
||||
Utility.GenerateValidationMessageAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: validationMessage);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.FullSelect,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class FullSelectTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
|
||||
{
|
||||
public FullSelectTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-items")]
|
||||
public IEnumerable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>? Items { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-option-label")]
|
||||
public string? OptionLabel { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new Exception
|
||||
(message: $"'{nameof(For)}' property is null ");
|
||||
}
|
||||
|
||||
if (Items is null)
|
||||
{
|
||||
throw new Exception
|
||||
(message: $"'{nameof(Items)}' property is null ");
|
||||
}
|
||||
|
||||
if (ViewContext is null)
|
||||
{
|
||||
throw new Exception
|
||||
(message: $"'{nameof(ViewContext)}' property is null ");
|
||||
}
|
||||
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var label =
|
||||
await
|
||||
Utility.GenerateLabelAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: label);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var select =
|
||||
await
|
||||
Utility.GenerateSelectAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For, selectList: Items);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: select);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var validationMessage =
|
||||
await
|
||||
Utility.GenerateValidationMessageAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: validationMessage);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.FullTextArea,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class FullTextAreaTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public FullTextAreaTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
if (ViewContext is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(ViewContext));
|
||||
}
|
||||
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var label =
|
||||
await
|
||||
Utility.GenerateLabelAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: label);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var textBox =
|
||||
await
|
||||
Utility.GenerateTextAreaAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: textBox);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var validationMessage =
|
||||
await
|
||||
Utility.GenerateValidationMessageAsync
|
||||
(generator: Generator, viewContext: ViewContext, @for: For);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: validationMessage);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
using Framework.DataType;
|
||||
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
public class ModelExpressionConverter : object
|
||||
{
|
||||
public ModelExpressionConverter
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression modelExpression)
|
||||
{
|
||||
IsLeftToRight = false;
|
||||
HasBeenConverted = false;
|
||||
ModelExpression = modelExpression;
|
||||
|
||||
if (modelExpression.ModelExplorer.ModelType.IsEnum)
|
||||
{
|
||||
ConvertLong();
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (modelExpression.ModelExplorer.ModelType)
|
||||
{
|
||||
case Type typeGuid when typeGuid == typeof(Guid):
|
||||
{
|
||||
ConvertGuid();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case Type typeInt when typeInt == typeof(int):
|
||||
case Type typeByte when typeByte == typeof(byte):
|
||||
case Type typeLong when typeLong == typeof(long):
|
||||
{
|
||||
ConvertLong();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case Type typeDateTime when typeDateTime == typeof(DateTime):
|
||||
{
|
||||
ConvertDateTime();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case Type typeDateTimeOffset when typeDateTimeOffset == typeof(DateTimeOffset):
|
||||
case Type typeDateTimeOffsetOrNull when typeDateTimeOffsetOrNull == typeof(DateTimeOffset?):
|
||||
{
|
||||
ConvertDateTimeOffset();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string? Value { get; protected set; }
|
||||
|
||||
public bool IsLeftToRight { get; protected set; }
|
||||
|
||||
public bool HasBeenConverted { get; protected set; }
|
||||
|
||||
protected Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression ModelExpression { get; }
|
||||
|
||||
protected void ConvertGuid()
|
||||
{
|
||||
object value =
|
||||
ModelExpression.Model;
|
||||
|
||||
IsLeftToRight = true;
|
||||
HasBeenConverted = true;
|
||||
|
||||
if (value is null)
|
||||
{
|
||||
Value = Constants.Format.NullValue;
|
||||
return;
|
||||
}
|
||||
|
||||
Value = value.ToString();
|
||||
}
|
||||
|
||||
protected void ConvertLong()
|
||||
{
|
||||
object value =
|
||||
ModelExpression.Model;
|
||||
|
||||
IsLeftToRight = true;
|
||||
HasBeenConverted = true;
|
||||
|
||||
if (value is null)
|
||||
{
|
||||
Value = Constants.Format.NullValue;
|
||||
return;
|
||||
}
|
||||
|
||||
var valueInteget =
|
||||
Convert.ToInt64(value: value);
|
||||
|
||||
var result =
|
||||
valueInteget.ToString
|
||||
(format: Constants.Format.Integer);
|
||||
|
||||
result = result
|
||||
.ConvertDigitsToUnicode();
|
||||
|
||||
if (result is null)
|
||||
{
|
||||
Value = Constants.Format.NullValue;
|
||||
return;
|
||||
}
|
||||
|
||||
Value = result;
|
||||
}
|
||||
|
||||
protected void ConvertDateTime()
|
||||
{
|
||||
object value =
|
||||
ModelExpression.Model;
|
||||
|
||||
IsLeftToRight = true;
|
||||
HasBeenConverted = true;
|
||||
|
||||
if (value is null)
|
||||
{
|
||||
Value = Constants.Format.NullValue;
|
||||
return;
|
||||
}
|
||||
|
||||
var valueDateTime =
|
||||
(DateTime)value;
|
||||
|
||||
var result =
|
||||
valueDateTime.ToString
|
||||
(format: Constants.Format.DateTime);
|
||||
|
||||
result = result
|
||||
.ConvertDigitsToUnicode();
|
||||
|
||||
if (result is null)
|
||||
{
|
||||
Value = Constants.Format.NullValue;
|
||||
return;
|
||||
}
|
||||
|
||||
Value = result;
|
||||
}
|
||||
|
||||
protected void ConvertDateTimeOffset()
|
||||
{
|
||||
object value =
|
||||
ModelExpression.Model;
|
||||
|
||||
IsLeftToRight = true;
|
||||
HasBeenConverted = true;
|
||||
|
||||
if (value is null)
|
||||
{
|
||||
Value = Constants.Format.NullValue;
|
||||
return;
|
||||
}
|
||||
|
||||
var valueDateTime =
|
||||
(DateTimeOffset)value;
|
||||
|
||||
var result =
|
||||
valueDateTime.DateTime.ToString
|
||||
(format: Constants.Format.DateTime);
|
||||
|
||||
result = result
|
||||
.ConvertDigitsToUnicode();
|
||||
|
||||
if (result is null)
|
||||
{
|
||||
Value = Constants.Format.NullValue;
|
||||
return;
|
||||
}
|
||||
|
||||
Value = result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.ReadOnlyCheckBox,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ReadOnlyCheckBoxTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ReadOnlyCheckBoxTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var innerDiv =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
innerDiv.AddCssClass(value: "form-check");
|
||||
|
||||
div.InnerHtml.AppendHtml(content: innerDiv);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var textBoxElement =
|
||||
await
|
||||
CreateCheckBoxElementAsync();
|
||||
|
||||
innerDiv.InnerHtml.AppendHtml(encoded: textBoxElement);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var labelElement =
|
||||
await
|
||||
CreateLabelElementAsync();
|
||||
|
||||
innerDiv.InnerHtml.AppendHtml(encoded: labelElement);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
|
||||
private async Task<string> CreateLabelElementAsync()
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
var tagBuilder =
|
||||
Generator.GenerateLabel
|
||||
(viewContext: ViewContext,
|
||||
modelExplorer: For.ModelExplorer, expression: For.Name, labelText: null,
|
||||
htmlAttributes: new { @class = "form-check-label" });
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<string> CreateCheckBoxElementAsync()
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
Microsoft.AspNetCore.Mvc.Rendering.TagBuilder tagBuilder;
|
||||
|
||||
bool? isChecked = null;
|
||||
|
||||
if (For.Model is not null)
|
||||
{
|
||||
isChecked =
|
||||
Convert
|
||||
.ToBoolean(value: For.Model);
|
||||
}
|
||||
|
||||
tagBuilder =
|
||||
Generator.GenerateCheckBox
|
||||
(viewContext: ViewContext,
|
||||
modelExplorer: For.ModelExplorer,
|
||||
expression: For.Name, isChecked: isChecked, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass(value: "form-check-input");
|
||||
|
||||
tagBuilder.Attributes.Add(key: "disabled", value: null);
|
||||
//tagBuilder.Attributes.Add(key: "disabled", value: "disabled");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
/// <summary>
|
||||
/// https://stackoverflow.com/questions/51904629/how-to-create-custom-tag-helper-containing-other-tag-helpers
|
||||
/// https://stackoverflow.com/questions/47547844/tag-helper-embedded-in-another-tag-helpers-code-doesnt-render
|
||||
/// https://stackoverflow.com/questions/46681692/combine-taghelper-statements
|
||||
/// </summary>
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.ReadOnlyInput,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ReadOnlyInputTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ReadOnlyInputTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var labelElement =
|
||||
await
|
||||
CreateLabelElementAsync();
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: labelElement);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
string? dirString = null;
|
||||
|
||||
var dirAttribute =
|
||||
output.Attributes["dir"];
|
||||
|
||||
if (dirAttribute is not null)
|
||||
{
|
||||
var dirValue =
|
||||
dirAttribute.Value;
|
||||
|
||||
if (dirValue is not null)
|
||||
{
|
||||
dirString =
|
||||
dirValue.ToString()?
|
||||
.Replace(oldValue: "{", newValue: string.Empty)
|
||||
.Replace(oldValue: "}", newValue: string.Empty);
|
||||
}
|
||||
}
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var textBoxElement =
|
||||
await
|
||||
CreateTextBoxElementAsync(dir: dirString);
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: textBoxElement);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
|
||||
private async Task<string> CreateLabelElementAsync()
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
var tagBuilder =
|
||||
Generator.GenerateLabel
|
||||
(viewContext: ViewContext,
|
||||
modelExplorer: For.ModelExplorer, expression: For.Name, labelText: null,
|
||||
htmlAttributes: new { @class = "form-label" });
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer, encoder: Microsoft
|
||||
.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<string> CreateTextBoxElementAsync(string? dir = null)
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new Exception
|
||||
(message: $"'{nameof(For)}' property is null ");
|
||||
}
|
||||
|
||||
Microsoft.AspNetCore.Mvc.Rendering.TagBuilder tagBuilder;
|
||||
|
||||
var converter =
|
||||
new ModelExpressionConverter(modelExpression: For);
|
||||
|
||||
if (converter.HasBeenConverted)
|
||||
{
|
||||
tagBuilder =
|
||||
Generator.GenerateTextBox
|
||||
(viewContext: ViewContext,
|
||||
modelExplorer: For.ModelExplorer,
|
||||
expression: For.Name, value: converter.Value,
|
||||
format: null, htmlAttributes: null);
|
||||
}
|
||||
else
|
||||
{
|
||||
tagBuilder =
|
||||
Generator.GenerateTextBox
|
||||
(viewContext: ViewContext,
|
||||
modelExplorer: For.ModelExplorer,
|
||||
expression: For.Name, value: For.Model,
|
||||
format: null, htmlAttributes: null);
|
||||
}
|
||||
|
||||
tagBuilder.AddCssClass(value: "form-control");
|
||||
|
||||
tagBuilder.Attributes.Add(key: "disabled", value: null);
|
||||
//tagBuilder.Attributes.Add(key: "disabled", value: "disabled");
|
||||
//tagBuilder.Attributes.Add(key: "readonly", value: null);
|
||||
//tagBuilder.Attributes.Add(key: "readonly", value: "readonly");
|
||||
|
||||
if (converter.IsLeftToRight)
|
||||
{
|
||||
tagBuilder.AddCssClass(value: "ltr");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value: dir) == false)
|
||||
{
|
||||
tagBuilder.Attributes.Add(key: "dir", value: dir);
|
||||
}
|
||||
}
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer, encoder: Microsoft
|
||||
.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.ReadOnlyTextArea,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class ReadOnlyTextAreaTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public ReadOnlyTextAreaTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base()
|
||||
{
|
||||
Generator = generator;
|
||||
}
|
||||
|
||||
private Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator Generator { get; }
|
||||
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContext]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBound]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext? ViewContext { get; set; }
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeName(name: "asp-for")]
|
||||
public Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression? For { get; set; }
|
||||
|
||||
public override async Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "mb-3");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var labelElement =
|
||||
await
|
||||
CreateLabelElementAsync();
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: labelElement);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var textBoxElement =
|
||||
await
|
||||
CreateTextAreaElementAsync();
|
||||
|
||||
div.InnerHtml.AppendHtml(encoded: textBoxElement);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: div);
|
||||
// **************************************************
|
||||
}
|
||||
|
||||
private async Task<string> CreateLabelElementAsync()
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
var tagBuilder =
|
||||
Generator.GenerateLabel
|
||||
(viewContext: ViewContext,
|
||||
modelExplorer: For.ModelExplorer, expression: For.Name, labelText: null,
|
||||
htmlAttributes: new { @class = "form-label" });
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<string> CreateTextAreaElementAsync()
|
||||
{
|
||||
if (For is null)
|
||||
{
|
||||
throw new ArgumentNullException(paramName: nameof(For));
|
||||
}
|
||||
|
||||
Microsoft.AspNetCore.Mvc.Rendering.TagBuilder tagBuilder;
|
||||
|
||||
tagBuilder =
|
||||
Generator.GenerateTextArea
|
||||
(viewContext: ViewContext,
|
||||
modelExplorer: For.ModelExplorer,
|
||||
expression: For.Name, rows: 3, columns: 60, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass(value: "form-control");
|
||||
|
||||
tagBuilder.Attributes.Add(key: "disabled", value: null);
|
||||
//tagBuilder.Attributes.Add(key: "disabled", value: "disabled");
|
||||
//tagBuilder.Attributes.Add(key: "readonly", value: null);
|
||||
//tagBuilder.Attributes.Add(key: "readonly", value: "readonly");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-form-buttons",
|
||||
ParentTag = "section-form",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionFormButtonsTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionFormButtonsTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
body.AddCssClass(value: "mb-3");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "input",
|
||||
ParentTag = "section-form-check")]
|
||||
public class SectionFormCheckInputTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper
|
||||
{
|
||||
public SectionFormCheckInputTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-check-input", output: output);
|
||||
|
||||
//output.TagName = "input";
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "label",
|
||||
ParentTag = "section-form-check")]
|
||||
public class SectionFormCheckLabelTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.LabelTagHelper
|
||||
{
|
||||
public SectionFormCheckLabelTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-check-label", output: output);
|
||||
|
||||
//output.TagName = "label";
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-form-check",
|
||||
ParentTag = "fieldset",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionFormCheckTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionFormCheckTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var div =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
div.AddCssClass(value: "form-check");
|
||||
|
||||
div.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
body.AddCssClass(value: "mb-3");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: div);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "input",
|
||||
ParentTag = "section-form-field")]
|
||||
public class SectionFormFieldInputTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper
|
||||
{
|
||||
public SectionFormFieldInputTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-control", output: output);
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "label",
|
||||
ParentTag = "section-form-field")]
|
||||
public class SectionFormFieldLabelTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.LabelTagHelper
|
||||
{
|
||||
public SectionFormFieldLabelTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-label", output: output);
|
||||
|
||||
//output.TagName = "label";
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
namespace Server.Infrastructure.TagHelpers
|
||||
{
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "select",
|
||||
ParentTag = "section-form-field")]
|
||||
public class SectionFormFieldSelectTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.LabelTagHelper
|
||||
{
|
||||
public SectionFormFieldSelectTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-select", output: output);
|
||||
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-form-field",
|
||||
ParentTag = "fieldset",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionFormFieldTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionFormFieldTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "div");
|
||||
|
||||
body.AddCssClass(value: "mb-3");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "textarea",
|
||||
ParentTag = "section-form-field")]
|
||||
public class SectionFormFieldTextArea :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.TextAreaTagHelper
|
||||
{
|
||||
public SectionFormFieldTextArea
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-control", output: output);
|
||||
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "tinymce", output: output);
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "span",
|
||||
ParentTag = "section-form-field")]
|
||||
public class SectionFormFieldValidationMessageTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.ValidationMessageTagHelper
|
||||
{
|
||||
public SectionFormFieldValidationMessageTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "text-danger", output: output);
|
||||
|
||||
//output.TagName = "span";
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "a",
|
||||
ParentTag = "section-form-footer",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionFormFooterLinkTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionFormFooterLinkTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
output.Attributes.SetAttribute
|
||||
(name: "class", value: "text-decoration-none");
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-form-footer",
|
||||
ParentTag = "section-form",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionFormFooterTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionFormFooterTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var horizontalRule =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "hr");
|
||||
|
||||
horizontalRule.TagRenderMode =
|
||||
Microsoft.AspNetCore.Mvc.Rendering.TagRenderMode.SelfClosing;
|
||||
|
||||
horizontalRule.AddCssClass(value: "mt-4");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
body.AddCssClass(value: "mb-3");
|
||||
body.AddCssClass(value: "text-center");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.PreElement.AppendHtml(htmlContent: horizontalRule);
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-form-header",
|
||||
ParentTag = "fieldset",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionFormHeaderTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionFormHeaderTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var horizontalRule =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "hr")
|
||||
{
|
||||
TagRenderMode =
|
||||
Microsoft.AspNetCore.Mvc.Rendering.TagRenderMode.SelfClosing,
|
||||
};
|
||||
|
||||
horizontalRule.AddCssClass(value: "mt-4");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "legend");
|
||||
|
||||
body.AddCssClass(value: "text-center");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
// **************************************************
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
output.PostElement.AppendHtml(htmlContent: horizontalRule);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-form",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionFormTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionFormTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var divCol =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
divCol.AddCssClass(value: "col");
|
||||
//divCol.AddCssClass(value: "bg-light");
|
||||
divCol.AddCssClass(value: "rounded-3");
|
||||
divCol.AddCssClass(value: "shadow-lg");
|
||||
divCol.AddCssClass(value: "border border-2");
|
||||
|
||||
divCol.AddCssClass(value: "col-12 p-3");
|
||||
divCol.AddCssClass(value: "col-md-8 offset-md-2 p-md-4");
|
||||
//divCol.AddCssClass(value: "col-lg-6 offset-lg-3 p-lg-5");
|
||||
|
||||
divCol.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var divRow =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
divRow.AddCssClass(value: "row");
|
||||
divRow.AddCssClass(value: "my-0");
|
||||
divRow.AddCssClass(value: "my-sm-1");
|
||||
divRow.AddCssClass(value: "my-md-3");
|
||||
//divRow.AddCssClass(value: "my-lg-5");
|
||||
|
||||
divRow.InnerHtml.AppendHtml(content: divCol);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: divRow);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "a",
|
||||
ParentTag = "section-page-actions",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionPageActionsLink :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionPageActionsLink() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
output.Attributes.SetAttribute
|
||||
(name: "class", value: "btn btn-primary");
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-page-actions",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionPageActionsTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionPageActionsTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var divCol =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
divCol.AddCssClass(value: "col");
|
||||
|
||||
divCol.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var divRow =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
divRow.AddCssClass(value: "row");
|
||||
divRow.AddCssClass(value: "mb-3");
|
||||
|
||||
divRow.InnerHtml.AppendHtml(content: divCol);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: divRow);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-page-header",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionPageHeaderTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionPageHeaderTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
//public override void Process
|
||||
// (Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
// Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
//{
|
||||
// base.Process(context, output);
|
||||
//}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var horizontalRule =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "hr")
|
||||
{
|
||||
TagRenderMode =
|
||||
Microsoft.AspNetCore.Mvc.Rendering.TagRenderMode.SelfClosing,
|
||||
};
|
||||
|
||||
horizontalRule.AddCssClass(value: "mt-4");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "h3");
|
||||
|
||||
body.AddCssClass(value: "mt-3");
|
||||
body.AddCssClass(value: "mb-3");
|
||||
body.AddCssClass(value: "text-center");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: originalContents);
|
||||
//body.InnerHtml.AppendHtml(content: horizontalRule);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "section-table",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class SectionTableTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public SectionTableTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var divCol =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
divCol.AddCssClass(value: "col");
|
||||
divCol.AddCssClass(value: "table-responsive");
|
||||
|
||||
divCol.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var divRow =
|
||||
new Microsoft.AspNetCore.Mvc.Rendering.TagBuilder("div");
|
||||
|
||||
divRow.AddCssClass(value: "row");
|
||||
|
||||
divRow.InnerHtml.AppendHtml(content: divCol);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: divRow);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
namespace Server.Infrastructure.TagHelpers
|
||||
{
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.Input,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class SimpleInputTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper
|
||||
{
|
||||
public SimpleInputTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator: generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-control", output: output);
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
namespace Server.Infrastructure.TagHelpers
|
||||
{
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.Label,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class SimpleLabelTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.LabelTagHelper
|
||||
{
|
||||
public SimpleLabelTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-label", output: output);
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
namespace Server.Infrastructure.TagHelpers
|
||||
{
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.HtmlTargetElement(tag: Constants.TagHelper.TextArea,
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.WithoutEndTag)]
|
||||
public class SimpleTextAreaTagHelper :
|
||||
Microsoft.AspNetCore.Mvc.TagHelpers.TextAreaTagHelper
|
||||
{
|
||||
public SimpleTextAreaTagHelper
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator) : base(generator: generator)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
Utility.CreateOrMergeAttribute
|
||||
(name: "class", content: "form-control", output: output);
|
||||
|
||||
return base.ProcessAsync(context, output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "a",
|
||||
ParentTag = "table-actions",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class TableActionsLinkTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public TableActionsLinkTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Process
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
output.Attributes.SetAttribute
|
||||
(name: "class", value: "text-decoration-none");
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "table-actions",
|
||||
ParentTag = "tr",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class TableActionsTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public TableActionsTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
await
|
||||
output.GetChildContentAsync();
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
var body =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "td");
|
||||
|
||||
body.AddCssClass(value: "text-center");
|
||||
|
||||
body.InnerHtml.AppendHtml(content: originalContents);
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = null;
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor
|
||||
.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Content.SetHtmlContent(htmlContent: body);
|
||||
// **************************************************
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElement
|
||||
(tag: "table",
|
||||
ParentTag = "section-table",
|
||||
TagStructure = Microsoft.AspNetCore.Razor.TagHelpers.TagStructure.NormalOrSelfClosing)]
|
||||
public class TableTagHelper :
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
|
||||
{
|
||||
public TableTagHelper() : base()
|
||||
{
|
||||
}
|
||||
|
||||
public async override Task ProcessAsync
|
||||
(Microsoft.AspNetCore.Razor.TagHelpers.TagHelperContext context,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
// **************************************************
|
||||
var originalContents =
|
||||
(await
|
||||
output.GetChildContentAsync())
|
||||
.GetContent()
|
||||
;
|
||||
|
||||
originalContents =
|
||||
originalContents.Replace
|
||||
("thead", "thead class=\"table-primary text-center\"");
|
||||
|
||||
//originalContents =
|
||||
// originalContents.Replace
|
||||
// ("tbody", "tbody class=\"\"");
|
||||
|
||||
originalContents =
|
||||
originalContents.Replace
|
||||
("tfooter", "tfooter class=\"table-secondary\"");
|
||||
// **************************************************
|
||||
|
||||
// **************************************************
|
||||
output.TagName = "table";
|
||||
|
||||
output.TagMode =
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagMode.StartTagAndEndTag;
|
||||
|
||||
output.Attributes.SetAttribute
|
||||
(name: "class",
|
||||
value: "table table-bordered table-sm table-striped table-hover align-items-center");
|
||||
// **************************************************
|
||||
|
||||
output.Content.SetHtmlContent(encoded: originalContents);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,470 @@
|
||||
namespace Server.Infrastructure.TagHelpers;
|
||||
|
||||
public static class Utility
|
||||
{
|
||||
static Utility()
|
||||
{
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconList()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-card-list");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconDetails()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-zoom-in");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconCreate()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-plus-square");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconUpdate()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-pencil-fill");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconDelete()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-trash");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconReset()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-repeat");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconSend()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-send");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconSubmit()
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: "bi-hand-thumbs-up");
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static Microsoft.AspNetCore.Mvc.Rendering.TagBuilder GetIconCustom(string iconName)
|
||||
{
|
||||
var icon =
|
||||
new Microsoft.AspNetCore.Mvc
|
||||
.Rendering.TagBuilder(tagName: "i");
|
||||
|
||||
icon.AddCssClass(value: "mx-1");
|
||||
icon.AddCssClass(value: "bi");
|
||||
icon.AddCssClass(value: iconName);
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
public static void CreateOrMergeAttribute
|
||||
(string name, object content,
|
||||
Microsoft.AspNetCore.Razor.TagHelpers.TagHelperOutput output)
|
||||
{
|
||||
var currentAttribute =
|
||||
output.Attributes
|
||||
.Where(current => current.Name == name)
|
||||
.FirstOrDefault();
|
||||
|
||||
if (currentAttribute is null)
|
||||
{
|
||||
var attribute =
|
||||
new Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.TagHelperAttribute(name: name, value: content);
|
||||
|
||||
output.Attributes
|
||||
.Add(attribute: attribute);
|
||||
}
|
||||
else
|
||||
{
|
||||
var value =
|
||||
$"{currentAttribute.Value} {content}";
|
||||
|
||||
var newAttribute =
|
||||
new Microsoft.AspNetCore.Razor.TagHelpers
|
||||
.TagHelperAttribute(name: name, value: value,
|
||||
valueStyle: currentAttribute.ValueStyle);
|
||||
|
||||
output.Attributes
|
||||
.Remove(attribute: currentAttribute);
|
||||
|
||||
output.Attributes
|
||||
.Add(attribute: newAttribute);
|
||||
}
|
||||
}
|
||||
|
||||
public static async
|
||||
Task<string> GenerateLabelAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for, string? cssClass = null)
|
||||
{
|
||||
var tagBuilder =
|
||||
generator.GenerateLabel
|
||||
(viewContext: viewContext,
|
||||
modelExplorer: @for.ModelExplorer,
|
||||
expression: @for.Name, labelText: null, htmlAttributes: null);
|
||||
|
||||
if (cssClass is null)
|
||||
{
|
||||
tagBuilder.AddCssClass
|
||||
(value: "form-label");
|
||||
}
|
||||
else
|
||||
{
|
||||
tagBuilder.AddCssClass(value: cssClass);
|
||||
}
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async
|
||||
Task<string> GenerateTextBoxAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for,
|
||||
bool readOnly = false, string? dir = null)
|
||||
{
|
||||
var tagBuilder =
|
||||
generator.GenerateTextBox
|
||||
(viewContext: viewContext,
|
||||
modelExplorer: @for.ModelExplorer, expression: @for.Name,
|
||||
value: @for.Model, format: null, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass
|
||||
(value: "form-control");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(value: dir) == false)
|
||||
{
|
||||
tagBuilder.Attributes.Add(key: "dir", value: dir);
|
||||
}
|
||||
|
||||
if (@for.ModelExplorer.ModelType == typeof(short)
|
||||
||
|
||||
@for.ModelExplorer.ModelType == typeof(int)
|
||||
||
|
||||
@for.ModelExplorer.ModelType == typeof(long))
|
||||
{
|
||||
tagBuilder.AddCssClass(value: "ltr");
|
||||
|
||||
tagBuilder.Attributes.Remove(key: "type");
|
||||
tagBuilder.Attributes.Add(key: "type", value: "number");
|
||||
}
|
||||
|
||||
if (@for.ModelExplorer.ModelType == typeof(DateTime))
|
||||
{
|
||||
tagBuilder.AddCssClass(value: "ltr");
|
||||
|
||||
tagBuilder.Attributes.Remove(key: "type");
|
||||
tagBuilder.Attributes.Add(key: "type", value: "text");
|
||||
}
|
||||
|
||||
if (readOnly)
|
||||
{
|
||||
tagBuilder.Attributes.Add(key: "readonly", value: "readonly");
|
||||
}
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async
|
||||
Task<string> GeneratePasswordTextBoxAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for)
|
||||
{
|
||||
var tagBuilder =
|
||||
generator.GenerateTextBox
|
||||
(viewContext: viewContext,
|
||||
modelExplorer: @for.ModelExplorer, expression: @for.Name,
|
||||
value: @for.Model, format: null, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass
|
||||
(value: "form-control");
|
||||
|
||||
tagBuilder.AddCssClass(value: "ltr");
|
||||
|
||||
tagBuilder.Attributes.Remove(key: "type");
|
||||
tagBuilder.Attributes.Add(key: "type", value: "password");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static async
|
||||
Task<string> GenerateCheckBoxAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for)
|
||||
{
|
||||
bool? isChecked = null;
|
||||
|
||||
if (@for.Model is not null)
|
||||
{
|
||||
isChecked =
|
||||
Convert
|
||||
.ToBoolean(value: @for.Model);
|
||||
}
|
||||
|
||||
var tagBuilder =
|
||||
generator.GenerateCheckBox
|
||||
(viewContext: viewContext, modelExplorer: @for.ModelExplorer,
|
||||
expression: @for.Name, isChecked: isChecked, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass
|
||||
(value: "form-check-input");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async
|
||||
Task<string> GenerateSelectAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for,
|
||||
IEnumerable
|
||||
<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem> selectList)
|
||||
{
|
||||
var currentValues =
|
||||
new List<string>();
|
||||
|
||||
if (@for is null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
if (@for.Model is null)
|
||||
{
|
||||
//currentValues.Add(item: null);
|
||||
}
|
||||
else
|
||||
{
|
||||
var value = @for.Model.ToString();
|
||||
|
||||
if (value is not null)
|
||||
{
|
||||
currentValues.Add(item: value);
|
||||
}
|
||||
}
|
||||
|
||||
var tagBuilder =
|
||||
generator.GenerateSelect
|
||||
(viewContext: viewContext,
|
||||
modelExplorer: @for.ModelExplorer,
|
||||
optionLabel: null, expression: @for.Name, selectList: selectList,
|
||||
currentValues: currentValues, allowMultiple: false, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass
|
||||
(value: "form-select");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async
|
||||
Task<string> GenerateTextAreaAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for)
|
||||
{
|
||||
var tagBuilder =
|
||||
generator.GenerateTextArea
|
||||
(viewContext: viewContext, modelExplorer: @for.ModelExplorer,
|
||||
expression: @for.Name, rows: 3, columns: 60, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass
|
||||
(value: "form-control");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async
|
||||
Task<string> GenerateValidationMessageAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for)
|
||||
{
|
||||
var tagBuilder =
|
||||
generator.GenerateValidationMessage
|
||||
(viewContext: viewContext,
|
||||
modelExplorer: @for.ModelExplorer,
|
||||
expression: @for.Name, message: null, tag: null, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass(value: "text-danger");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async
|
||||
Task<string> GenerateSelectAsync
|
||||
(Microsoft.AspNetCore.Mvc.ViewFeatures.IHtmlGenerator generator,
|
||||
Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,
|
||||
Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression @for,
|
||||
IList
|
||||
<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem> @Items,
|
||||
string? @OptionLabel)
|
||||
{
|
||||
var tagBuilder =
|
||||
generator.GenerateSelect
|
||||
(viewContext: viewContext, modelExplorer: @for.ModelExplorer, optionLabel: @OptionLabel,
|
||||
expression: @for.Name, selectList: @Items, allowMultiple: false, htmlAttributes: null);
|
||||
|
||||
tagBuilder.AddCssClass
|
||||
(value: "form-control");
|
||||
|
||||
var writer =
|
||||
new StringWriter();
|
||||
|
||||
tagBuilder.WriteTo(writer: writer,
|
||||
encoder: Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.Default);
|
||||
|
||||
var result =
|
||||
writer.ToString();
|
||||
|
||||
await writer.DisposeAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
@page
|
||||
@model ErrorModel
|
||||
@{
|
||||
ViewData["Title"] = "Error";
|
||||
}
|
||||
|
||||
<h1 class="text-danger">Error.</h1>
|
||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
||||
|
||||
@if (Model.ShowRequestId)
|
||||
{
|
||||
<p>
|
||||
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
||||
</p>
|
||||
}
|
||||
|
||||
<h3>Development Mode</h3>
|
||||
<p>
|
||||
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
|
||||
</p>
|
||||
<p>
|
||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
||||
It can result in displaying sensitive information from exceptions to end users.
|
||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
||||
and restarting the app.
|
||||
</p>
|
||||
@@ -0,0 +1,28 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Server.Pages
|
||||
{
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
[IgnoreAntiforgeryToken]
|
||||
public class ErrorModel : PageModel
|
||||
{
|
||||
public string? RequestId { get; set; }
|
||||
|
||||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||
|
||||
private readonly ILogger<ErrorModel> _logger;
|
||||
|
||||
public ErrorModel(ILogger<ErrorModel> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void OnGet()
|
||||
{
|
||||
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
@page
|
||||
@model IndexModel
|
||||
@{
|
||||
ViewData["Title"] = "Home page";
|
||||
}
|
||||
|
||||
<div class="text-center d-flex flex-column w-25">
|
||||
<h2 class="text-start">Pages</h2>
|
||||
<a class="btn btn-secondary my-2" asp-page="Panel/Users/Index">[ Users ]</a>
|
||||
</div>
|
||||
@@ -0,0 +1,10 @@
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
|
||||
namespace Server.Pages;
|
||||
|
||||
public class IndexModel : PageModel
|
||||
{
|
||||
public void OnGet()
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
@page
|
||||
@model Server.Pages.Panel.Users.CreateModel
|
||||
|
||||
@{
|
||||
var pageTitle =
|
||||
$"{Resources.DataDictionary.CreateOf} {Resources.DataDictionary.User}";
|
||||
|
||||
ViewData[Constants.ViewDataKeyName.PageTitle] = pageTitle;
|
||||
}
|
||||
|
||||
<form method="post">
|
||||
|
||||
<section-form>
|
||||
|
||||
<fieldset>
|
||||
|
||||
<section-form-header>
|
||||
@(pageTitle)
|
||||
</section-form-header>
|
||||
|
||||
<partial name="PartialViews/_DisplayPageMessages" />
|
||||
|
||||
|
||||
<ub-full-input asp-for="CreateViewModel.Username" />
|
||||
|
||||
<ub-full-input asp-for="CreateViewModel.Password" />
|
||||
|
||||
<ub-full-input asp-for="CreateViewModel.Mobile" />
|
||||
|
||||
<ub-full-checkbox asp-for="CreateViewModel.IsActive" />
|
||||
|
||||
</fieldset>
|
||||
|
||||
<section-form-buttons>
|
||||
<button-create />
|
||||
<button-reset />
|
||||
</section-form-buttons>
|
||||
|
||||
</section-form>
|
||||
|
||||
</form>
|
||||
@@ -0,0 +1,29 @@
|
||||
using Application.Aggregates.Users;
|
||||
using Application.Aggregates.Users.ViewModels;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Server.Infrastructure;
|
||||
|
||||
namespace Server.Pages.Panel.Users;
|
||||
|
||||
public class CreateModel
|
||||
(UsersApplication usersApplication) : BasePageModel
|
||||
{
|
||||
[BindProperty]
|
||||
public CreateUserViewModel CreateViewModel { get; set; } = new();
|
||||
|
||||
public void OnGet()
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<IActionResult> OnPostAsync()
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return Page();
|
||||
}
|
||||
|
||||
await usersApplication.CreateAsync(CreateViewModel);
|
||||
|
||||
return RedirectToPage("Index");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
@page "{id:guid}"
|
||||
@model Server.Pages.Panel.Users.DeleteModel
|
||||
|
||||
@{
|
||||
var pageTitle =
|
||||
$"{Resources.DataDictionary.DeleteOf} {Resources.DataDictionary.User}";
|
||||
|
||||
ViewData[Constants.ViewDataKeyName.PageTitle] = pageTitle;
|
||||
}
|
||||
|
||||
|
||||
<form method="post">
|
||||
|
||||
<section-form>
|
||||
|
||||
<input hidden asp-for="DeleteViewModel.Id" dir="ltr" />
|
||||
|
||||
<fieldset disabled>
|
||||
|
||||
<section-form-header>
|
||||
@(pageTitle)
|
||||
</section-form-header>
|
||||
|
||||
<partial name="PartialViews/_DisplayPageMessages" />
|
||||
|
||||
<ub-full-input asp-for="DeleteViewModel.Username" />
|
||||
|
||||
<ub-full-input asp-for="DeleteViewModel.Password" />
|
||||
|
||||
<ub-full-input asp-for="DeleteViewModel.Mobile" />
|
||||
|
||||
<ub-full-checkbox asp-for="DeleteViewModel.IsActive" />
|
||||
|
||||
</fieldset>
|
||||
|
||||
<section-form-buttons>
|
||||
<button-delete />
|
||||
</section-form-buttons>
|
||||
|
||||
</section-form>
|
||||
|
||||
</form>
|
||||
@@ -0,0 +1,38 @@
|
||||
using Application.Aggregates.Users;
|
||||
using Application.Aggregates.Users.ViewModels;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Server.Infrastructure;
|
||||
|
||||
namespace Server.Pages.Panel.Users;
|
||||
|
||||
public class DeleteModel
|
||||
(UsersApplication usersApplication) : BasePageModel
|
||||
{
|
||||
[BindProperty]
|
||||
public UserViewModel DeleteViewModel { get; set; } = new();
|
||||
|
||||
public async Task<IActionResult> OnGetAsync(Guid id)
|
||||
{
|
||||
if (id == Guid.Empty)
|
||||
{
|
||||
return RedirectToPage("Index");
|
||||
}
|
||||
|
||||
DeleteViewModel =
|
||||
await usersApplication.GetAsync(id);
|
||||
|
||||
if (DeleteViewModel == null)
|
||||
{
|
||||
return RedirectToPage("Index");
|
||||
}
|
||||
|
||||
return Page();
|
||||
}
|
||||
|
||||
public async Task<IActionResult> OnPostAsync()
|
||||
{
|
||||
await usersApplication.DeleteAsync(DeleteViewModel.Id);
|
||||
|
||||
return RedirectToPage("Index");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
@page
|
||||
@model Server.Pages.Panel.Users.IndexModel
|
||||
|
||||
@{
|
||||
var pageTitle =
|
||||
Resources.DataDictionary.Users;
|
||||
|
||||
ViewData[Constants.ViewDataKeyName.PageTitle] = pageTitle;
|
||||
}
|
||||
|
||||
|
||||
<div class="my-2 float-end">
|
||||
<a class="btn btn-primary" asp-page="Create">@(Resources.ButtonCaptions.Create)</a>
|
||||
</div>
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
@(Html.Ub_DisplayStringWithTh(Resources.DataDictionary.UserName))
|
||||
@(Html.Ub_DisplayStringWithTh(Resources.DataDictionary.Password))
|
||||
@(Html.Ub_DisplayStringWithTh(Resources.DataDictionary.Mobile))
|
||||
@(Html.Ub_DisplayStringWithTh(Resources.DataDictionary.IsActive))
|
||||
<th scope="col"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var user in Model.Users)
|
||||
{
|
||||
<tr>
|
||||
@(Html.Ub_DisplayStringWithTd(user.Username))
|
||||
@(Html.Ub_DisplayStringWithTd(user.Password))
|
||||
@(Html.Ub_DisplayStringWithTd(user.Mobile))
|
||||
@(Html.Ub_DisplayBooleanWithTd(user.IsActive))
|
||||
<td>
|
||||
<div class="btn-group" role="group" aria-label="Basic example">
|
||||
<a asp-page="Update" asp-route-Id="@(user.Id)" class="btn btn-warning">@(Resources.ButtonCaptions.Edit)</a>
|
||||
<a asp-page="Delete" asp-route-Id="@(user.Id)" class="btn btn-danger">@(Resources.ButtonCaptions.Delete)</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,16 @@
|
||||
using Application.Aggregates.Users;
|
||||
using Application.Aggregates.Users.ViewModels;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
|
||||
namespace Server.Pages.Panel.Users;
|
||||
|
||||
public class IndexModel
|
||||
(UsersApplication usersApplication) : PageModel
|
||||
{
|
||||
public List<UserViewModel> Users { get; set; } = [];
|
||||
|
||||
public async Task OnGetAsync()
|
||||
{
|
||||
Users = await usersApplication.GetUsers();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
@page
|
||||
@model Server.Pages.Panel.Users.UpdateModel
|
||||
|
||||
@{
|
||||
var pageTitle =
|
||||
$"{Resources.DataDictionary.UpdateOf} {Resources.DataDictionary.User}";
|
||||
|
||||
ViewData[Constants.ViewDataKeyName.PageTitle] = pageTitle;
|
||||
}
|
||||
|
||||
|
||||
<form method="post">
|
||||
|
||||
<section-form>
|
||||
|
||||
<fieldset>
|
||||
|
||||
<section-form-header>
|
||||
@(pageTitle)
|
||||
</section-form-header>
|
||||
|
||||
<partial name="PartialViews/_DisplayPageMessages" />
|
||||
|
||||
<input hidden asp-for="UpdateViewModel.Id" />
|
||||
|
||||
<ub-full-input asp-for="UpdateViewModel.Username" />
|
||||
|
||||
<ub-full-input asp-for="UpdateViewModel.Password" />
|
||||
|
||||
<ub-full-input asp-for="UpdateViewModel.Mobile" />
|
||||
|
||||
<ub-full-checkbox asp-for="UpdateViewModel.IsActive" />
|
||||
|
||||
</fieldset>
|
||||
|
||||
<section-form-buttons>
|
||||
<button-save />
|
||||
<button-reset />
|
||||
</section-form-buttons>
|
||||
|
||||
</section-form>
|
||||
|
||||
</form>
|
||||
@@ -0,0 +1,41 @@
|
||||
using Application.Aggregates.Users;
|
||||
using Application.Aggregates.Users.ViewModels;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Server.Infrastructure;
|
||||
|
||||
namespace Server.Pages.Panel.Users;
|
||||
|
||||
public class UpdateModel
|
||||
(UsersApplication usersApplication) : BasePageModel
|
||||
{
|
||||
[BindProperty]
|
||||
public UserViewModel UpdateViewModel { get; set; } = new();
|
||||
|
||||
public async Task<IActionResult> OnGetAsync(Guid id)
|
||||
{
|
||||
if (id == Guid.Empty)
|
||||
{
|
||||
return RedirectToPage("Index");
|
||||
}
|
||||
|
||||
UpdateViewModel =
|
||||
await usersApplication.GetAsync(id);
|
||||
|
||||
if (UpdateViewModel == null)
|
||||
{
|
||||
return RedirectToPage("Index");
|
||||
}
|
||||
|
||||
return Page();
|
||||
}
|
||||
|
||||
public async Task<IActionResult> OnPostAsync()
|
||||
{
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
await usersApplication.UpdateAsync(UpdateViewModel);
|
||||
}
|
||||
|
||||
return RedirectToPage("Index");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
@page
|
||||
@model PrivacyModel
|
||||
@{
|
||||
ViewData["Title"] = "Privacy Policy";
|
||||
}
|
||||
<h1>@ViewData["Title"]</h1>
|
||||
|
||||
<p>Use this page to detail your site's privacy policy.</p>
|
||||
@@ -0,0 +1,20 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
|
||||
namespace Server.Pages
|
||||
{
|
||||
public class PrivacyModel : PageModel
|
||||
{
|
||||
private readonly ILogger<PrivacyModel> _logger;
|
||||
|
||||
public PrivacyModel(ILogger<PrivacyModel> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void OnGet()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
@using Server.Infrastructure.Messages
|
||||
@{
|
||||
// نکته مهم
|
||||
// در همه شرایط کار نمیکند List استفاده از کلاس
|
||||
var pageErrors =
|
||||
TempData[key: MessageType.PageError.ToString()] as
|
||||
System.Collections.Generic.IList<string>;
|
||||
|
||||
var pageWarnings =
|
||||
TempData[key: MessageType.PageWarning.ToString()] as
|
||||
System.Collections.Generic.IList<string>;
|
||||
|
||||
var pageSuccesses =
|
||||
TempData[key: MessageType.PageSuccess.ToString()] as
|
||||
System.Collections.Generic.IList<string>;
|
||||
|
||||
if (pageErrors != null && pageErrors.Count != 0)
|
||||
{
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<ul class="mb-0">
|
||||
@foreach (var message in pageErrors)
|
||||
{
|
||||
<li>@(message)</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
|
||||
if (pageWarnings != null && pageWarnings.Count != 0)
|
||||
{
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<ul class="mb-0">
|
||||
@foreach (var message in pageWarnings)
|
||||
{
|
||||
<li>@(message)</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
|
||||
if (pageSuccesses != null && pageSuccesses.Count != 0)
|
||||
{
|
||||
<div class="alert alert-success" role="alert">
|
||||
<ul class="mb-0">
|
||||
@foreach (var message in pageSuccesses)
|
||||
{
|
||||
<li>@(message)</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
@using Server.Infrastructure.Messages
|
||||
@using Server.Infrastructure.Settings
|
||||
|
||||
@inject ApplicationSettings applicationSettings
|
||||
|
||||
@{
|
||||
/// Version 3.0
|
||||
|
||||
var toastSettings =
|
||||
applicationSettings.ToastSettings;
|
||||
|
||||
int delayStep =
|
||||
toastSettings.DelayStep;
|
||||
|
||||
int delay =
|
||||
toastSettings.InitialDelay - delayStep;
|
||||
|
||||
// نکته مهم
|
||||
// در همه شرایط کار نمیکند List استفاده از کلاس
|
||||
var toastErrors =
|
||||
TempData[key: MessageType.ToastError.ToString()] as
|
||||
System.Collections.Generic.IList<string>;
|
||||
|
||||
var toastWarnings =
|
||||
TempData[key: MessageType.ToastWarning.ToString()] as
|
||||
System.Collections.Generic.IList<string>;
|
||||
|
||||
var toastSuccesses =
|
||||
TempData[key: MessageType.ToastSuccess.ToString()] as
|
||||
System.Collections.Generic.IList<string>;
|
||||
|
||||
if ((toastErrors == null || toastErrors.Count == 0) &&
|
||||
(toastWarnings == null || toastWarnings.Count == 0) &&
|
||||
(toastSuccesses == null || toastSuccesses.Count == 0))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
<div aria-live="polite" aria-atomic="true" class="posiiton-relative">
|
||||
<div class="toast-container position-absolute @(toastSettings.Style)" style="z-index: 10000;">
|
||||
|
||||
@{
|
||||
if (toastErrors != null)
|
||||
{
|
||||
foreach (var message in toastErrors)
|
||||
{
|
||||
delay += delayStep;
|
||||
|
||||
<div class="toast bg-danger text-white align-items-center border-0" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="@(delay)" data-bs-animation="true" data-bs-autohide="true">
|
||||
<div class="d-flex">
|
||||
<div class="toast-body">
|
||||
@(message)
|
||||
</div>
|
||||
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
if (toastWarnings != null)
|
||||
{
|
||||
foreach (var message in toastWarnings)
|
||||
{
|
||||
delay += delayStep;
|
||||
|
||||
<div class="toast bg-warning text-black align-items-center border-0" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="@(delay)" data-bs-animation="true" data-bs-autohide="true">
|
||||
<div class="d-flex">
|
||||
<div class="toast-body">
|
||||
@(message)
|
||||
</div>
|
||||
<button type="button" class="btn-close btn-close-black me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
if (toastSuccesses != null)
|
||||
{
|
||||
foreach (var message in toastSuccesses)
|
||||
{
|
||||
delay += delayStep;
|
||||
|
||||
<div class="toast bg-success text-white align-items-center border-0" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="@(delay)" data-bs-animation="true" data-bs-autohide="true">
|
||||
<div class="d-flex">
|
||||
<div class="toast-body">
|
||||
@(message)
|
||||
</div>
|
||||
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
window.addEventListener('load', (e) => {
|
||||
|
||||
var toastElements =
|
||||
document.querySelectorAll('.toast')
|
||||
|
||||
toastElements.forEach((toastElement, index) => {
|
||||
|
||||
let toast =
|
||||
new bootstrap.Toast(toastElement)
|
||||
|
||||
toast.show()
|
||||
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>@ViewData[Constants.ViewDataKeyName.PageTitle]</title>
|
||||
<script type="importmap"></script>
|
||||
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
|
||||
<link rel="stylesheet" href="~/Server.styles.css" asp-append-version="true" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" asp-area="" asp-page="/Index">Server</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
|
||||
<ul class="navbar-nav flex-grow-1">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
<div class="container">
|
||||
<main role="main" class="pb-3">
|
||||
@RenderBody()
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<footer class="border-top footer text-muted">
|
||||
<div class="container">
|
||||
© 2025 - Server - <a asp-area="" asp-page="/Privacy">Privacy</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
||||
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
|
||||
<script src="~/lib/jquery-validation-unobtrusive//dist/jquery.validate.unobtrusive.min.js"></script>
|
||||
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="~/js/site.js" asp-append-version="true"></script>
|
||||
|
||||
@await RenderSectionAsync("Scripts", required: false)
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,48 @@
|
||||
/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
||||
for details on configuring this project to bundle and minify static web assets. */
|
||||
|
||||
a.navbar-brand {
|
||||
white-space: normal;
|
||||
text-align: center;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0077cc;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
color: #fff;
|
||||
background-color: #1b6ec2;
|
||||
border-color: #1861ac;
|
||||
}
|
||||
|
||||
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
|
||||
color: #fff;
|
||||
background-color: #1b6ec2;
|
||||
border-color: #1861ac;
|
||||
}
|
||||
|
||||
.border-top {
|
||||
border-top: 1px solid #e5e5e5;
|
||||
}
|
||||
.border-bottom {
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
.box-shadow {
|
||||
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
|
||||
}
|
||||
|
||||
button.accept-policy {
|
||||
font-size: 1rem;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
.footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
line-height: 60px;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
|
||||
<script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script>
|
||||
@@ -0,0 +1,11 @@
|
||||
@namespace Server.Pages
|
||||
|
||||
@using Server
|
||||
@using Infrastructure
|
||||
@using Infrastructure.TagHelpers
|
||||
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
|
||||
@addTagHelper *, Server
|
||||
@addTagHelper *, Infrastructure.TagHelpers
|
||||
@addTagHelper *, Server.Infrastructure.TagHelpers
|
||||
@@ -0,0 +1,3 @@
|
||||
@{
|
||||
Layout = "_Layout";
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using Application.Aggregates.Users;
|
||||
using Domain.Aggregates.Users.Data;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Persistence;
|
||||
using Persistence.Repositories.Aggregates.Users;
|
||||
using Server.Infrastructure.Extensions.ServiceCollections;
|
||||
|
||||
namespace Server;
|
||||
|
||||
public class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
builder.Services.AddRazorPages();
|
||||
|
||||
// Add Settings
|
||||
builder.AddConfiguration();
|
||||
|
||||
// Add Database
|
||||
builder.Services.AddDbContext<DatabaseContext>(opt =>
|
||||
{
|
||||
opt.UseSqlite("Data Source=../../../db/database.db");
|
||||
});
|
||||
|
||||
// Add DI's
|
||||
builder.Services.AddScoped<IUserRepository, UserRepository>();
|
||||
builder.Services.AddScoped<UsersApplication>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
if (!app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseExceptionHandler("/Error");
|
||||
app.UseHsts();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.MapStaticAssets();
|
||||
app.MapRazorPages()
|
||||
.WithStaticAssets();
|
||||
|
||||
app.Run();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5162",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://localhost:7181;http://localhost:5162",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\Core\Application\Application.csproj" />
|
||||
<ProjectReference Include="..\..\Core\Constants\Constants.csproj" />
|
||||
<ProjectReference Include="..\..\Core\Resources\Resources.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"DetailedErrors": true,
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
html {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
html {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
|
||||
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
|
||||
}
|
||||
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
|
||||
.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
|
||||
color: var(--bs-secondary-color);
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
|
||||
text-align: start;
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.3 KiB |
@@ -0,0 +1,4 @@
|
||||
// Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
||||
// for details on configuring this project to bundle and minify static web assets.
|
||||
|
||||
// Write your JavaScript code.
|
||||
@@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2011-2021 Twitter, Inc.
|
||||
Copyright (c) 2011-2021 The Bootstrap Authors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+4084
File diff suppressed because it is too large
Load Diff
+1
File diff suppressed because one or more lines are too long
+6
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,597 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2024 The Bootstrap Authors
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root,
|
||||
[data-bs-theme=light] {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-primary-text-emphasis: #052c65;
|
||||
--bs-secondary-text-emphasis: #2b2f32;
|
||||
--bs-success-text-emphasis: #0a3622;
|
||||
--bs-info-text-emphasis: #055160;
|
||||
--bs-warning-text-emphasis: #664d03;
|
||||
--bs-danger-text-emphasis: #58151c;
|
||||
--bs-light-text-emphasis: #495057;
|
||||
--bs-dark-text-emphasis: #495057;
|
||||
--bs-primary-bg-subtle: #cfe2ff;
|
||||
--bs-secondary-bg-subtle: #e2e3e5;
|
||||
--bs-success-bg-subtle: #d1e7dd;
|
||||
--bs-info-bg-subtle: #cff4fc;
|
||||
--bs-warning-bg-subtle: #fff3cd;
|
||||
--bs-danger-bg-subtle: #f8d7da;
|
||||
--bs-light-bg-subtle: #fcfcfd;
|
||||
--bs-dark-bg-subtle: #ced4da;
|
||||
--bs-primary-border-subtle: #9ec5fe;
|
||||
--bs-secondary-border-subtle: #c4c8cb;
|
||||
--bs-success-border-subtle: #a3cfbb;
|
||||
--bs-info-border-subtle: #9eeaf9;
|
||||
--bs-warning-border-subtle: #ffe69c;
|
||||
--bs-danger-border-subtle: #f1aeb5;
|
||||
--bs-light-border-subtle: #e9ecef;
|
||||
--bs-dark-border-subtle: #adb5bd;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-emphasis-color: #000;
|
||||
--bs-emphasis-color-rgb: 0, 0, 0;
|
||||
--bs-secondary-color: rgba(33, 37, 41, 0.75);
|
||||
--bs-secondary-color-rgb: 33, 37, 41;
|
||||
--bs-secondary-bg: #e9ecef;
|
||||
--bs-secondary-bg-rgb: 233, 236, 239;
|
||||
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
|
||||
--bs-tertiary-color-rgb: 33, 37, 41;
|
||||
--bs-tertiary-bg: #f8f9fa;
|
||||
--bs-tertiary-bg-rgb: 248, 249, 250;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-color-rgb: 13, 110, 253;
|
||||
--bs-link-decoration: underline;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-link-hover-color-rgb: 10, 88, 202;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-color: #212529;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-xxl: 2rem;
|
||||
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
|
||||
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
|
||||
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
|
||||
--bs-focus-ring-width: 0.25rem;
|
||||
--bs-focus-ring-opacity: 0.25;
|
||||
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
|
||||
--bs-form-valid-color: #198754;
|
||||
--bs-form-valid-border-color: #198754;
|
||||
--bs-form-invalid-color: #dc3545;
|
||||
--bs-form-invalid-border-color: #dc3545;
|
||||
}
|
||||
|
||||
[data-bs-theme=dark] {
|
||||
color-scheme: dark;
|
||||
--bs-body-color: #dee2e6;
|
||||
--bs-body-color-rgb: 222, 226, 230;
|
||||
--bs-body-bg: #212529;
|
||||
--bs-body-bg-rgb: 33, 37, 41;
|
||||
--bs-emphasis-color: #fff;
|
||||
--bs-emphasis-color-rgb: 255, 255, 255;
|
||||
--bs-secondary-color: rgba(222, 226, 230, 0.75);
|
||||
--bs-secondary-color-rgb: 222, 226, 230;
|
||||
--bs-secondary-bg: #343a40;
|
||||
--bs-secondary-bg-rgb: 52, 58, 64;
|
||||
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
|
||||
--bs-tertiary-color-rgb: 222, 226, 230;
|
||||
--bs-tertiary-bg: #2b3035;
|
||||
--bs-tertiary-bg-rgb: 43, 48, 53;
|
||||
--bs-primary-text-emphasis: #6ea8fe;
|
||||
--bs-secondary-text-emphasis: #a7acb1;
|
||||
--bs-success-text-emphasis: #75b798;
|
||||
--bs-info-text-emphasis: #6edff6;
|
||||
--bs-warning-text-emphasis: #ffda6a;
|
||||
--bs-danger-text-emphasis: #ea868f;
|
||||
--bs-light-text-emphasis: #f8f9fa;
|
||||
--bs-dark-text-emphasis: #dee2e6;
|
||||
--bs-primary-bg-subtle: #031633;
|
||||
--bs-secondary-bg-subtle: #161719;
|
||||
--bs-success-bg-subtle: #051b11;
|
||||
--bs-info-bg-subtle: #032830;
|
||||
--bs-warning-bg-subtle: #332701;
|
||||
--bs-danger-bg-subtle: #2c0b0e;
|
||||
--bs-light-bg-subtle: #343a40;
|
||||
--bs-dark-bg-subtle: #1a1d20;
|
||||
--bs-primary-border-subtle: #084298;
|
||||
--bs-secondary-border-subtle: #41464b;
|
||||
--bs-success-border-subtle: #0f5132;
|
||||
--bs-info-border-subtle: #087990;
|
||||
--bs-warning-border-subtle: #997404;
|
||||
--bs-danger-border-subtle: #842029;
|
||||
--bs-light-border-subtle: #495057;
|
||||
--bs-dark-border-subtle: #343a40;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #6ea8fe;
|
||||
--bs-link-hover-color: #8bb9fe;
|
||||
--bs-link-color-rgb: 110, 168, 254;
|
||||
--bs-link-hover-color-rgb: 139, 185, 254;
|
||||
--bs-code-color: #e685b5;
|
||||
--bs-highlight-color: #dee2e6;
|
||||
--bs-highlight-bg: #664d03;
|
||||
--bs-border-color: #495057;
|
||||
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
|
||||
--bs-form-valid-color: #75b798;
|
||||
--bs-form-valid-border-color: #75b798;
|
||||
--bs-form-invalid-color: #ea868f;
|
||||
--bs-form-invalid-border-color: #ea868f;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: var(--bs-border-width) solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: var(--bs-heading-color);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-left: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
color: var(--bs-highlight-color);
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: var(--bs-secondary-color);
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: left;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
line-height: inherit;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
/* rtl:raw:
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
*/
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=bootstrap-reboot.css.map */
|
||||
+1
File diff suppressed because one or more lines are too long
+6
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+594
@@ -0,0 +1,594 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2024 The Bootstrap Authors
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root,
|
||||
[data-bs-theme=light] {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-primary-text-emphasis: #052c65;
|
||||
--bs-secondary-text-emphasis: #2b2f32;
|
||||
--bs-success-text-emphasis: #0a3622;
|
||||
--bs-info-text-emphasis: #055160;
|
||||
--bs-warning-text-emphasis: #664d03;
|
||||
--bs-danger-text-emphasis: #58151c;
|
||||
--bs-light-text-emphasis: #495057;
|
||||
--bs-dark-text-emphasis: #495057;
|
||||
--bs-primary-bg-subtle: #cfe2ff;
|
||||
--bs-secondary-bg-subtle: #e2e3e5;
|
||||
--bs-success-bg-subtle: #d1e7dd;
|
||||
--bs-info-bg-subtle: #cff4fc;
|
||||
--bs-warning-bg-subtle: #fff3cd;
|
||||
--bs-danger-bg-subtle: #f8d7da;
|
||||
--bs-light-bg-subtle: #fcfcfd;
|
||||
--bs-dark-bg-subtle: #ced4da;
|
||||
--bs-primary-border-subtle: #9ec5fe;
|
||||
--bs-secondary-border-subtle: #c4c8cb;
|
||||
--bs-success-border-subtle: #a3cfbb;
|
||||
--bs-info-border-subtle: #9eeaf9;
|
||||
--bs-warning-border-subtle: #ffe69c;
|
||||
--bs-danger-border-subtle: #f1aeb5;
|
||||
--bs-light-border-subtle: #e9ecef;
|
||||
--bs-dark-border-subtle: #adb5bd;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-emphasis-color: #000;
|
||||
--bs-emphasis-color-rgb: 0, 0, 0;
|
||||
--bs-secondary-color: rgba(33, 37, 41, 0.75);
|
||||
--bs-secondary-color-rgb: 33, 37, 41;
|
||||
--bs-secondary-bg: #e9ecef;
|
||||
--bs-secondary-bg-rgb: 233, 236, 239;
|
||||
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
|
||||
--bs-tertiary-color-rgb: 33, 37, 41;
|
||||
--bs-tertiary-bg: #f8f9fa;
|
||||
--bs-tertiary-bg-rgb: 248, 249, 250;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-color-rgb: 13, 110, 253;
|
||||
--bs-link-decoration: underline;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-link-hover-color-rgb: 10, 88, 202;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-color: #212529;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-xxl: 2rem;
|
||||
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
|
||||
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
|
||||
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
|
||||
--bs-focus-ring-width: 0.25rem;
|
||||
--bs-focus-ring-opacity: 0.25;
|
||||
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
|
||||
--bs-form-valid-color: #198754;
|
||||
--bs-form-valid-border-color: #198754;
|
||||
--bs-form-invalid-color: #dc3545;
|
||||
--bs-form-invalid-border-color: #dc3545;
|
||||
}
|
||||
|
||||
[data-bs-theme=dark] {
|
||||
color-scheme: dark;
|
||||
--bs-body-color: #dee2e6;
|
||||
--bs-body-color-rgb: 222, 226, 230;
|
||||
--bs-body-bg: #212529;
|
||||
--bs-body-bg-rgb: 33, 37, 41;
|
||||
--bs-emphasis-color: #fff;
|
||||
--bs-emphasis-color-rgb: 255, 255, 255;
|
||||
--bs-secondary-color: rgba(222, 226, 230, 0.75);
|
||||
--bs-secondary-color-rgb: 222, 226, 230;
|
||||
--bs-secondary-bg: #343a40;
|
||||
--bs-secondary-bg-rgb: 52, 58, 64;
|
||||
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
|
||||
--bs-tertiary-color-rgb: 222, 226, 230;
|
||||
--bs-tertiary-bg: #2b3035;
|
||||
--bs-tertiary-bg-rgb: 43, 48, 53;
|
||||
--bs-primary-text-emphasis: #6ea8fe;
|
||||
--bs-secondary-text-emphasis: #a7acb1;
|
||||
--bs-success-text-emphasis: #75b798;
|
||||
--bs-info-text-emphasis: #6edff6;
|
||||
--bs-warning-text-emphasis: #ffda6a;
|
||||
--bs-danger-text-emphasis: #ea868f;
|
||||
--bs-light-text-emphasis: #f8f9fa;
|
||||
--bs-dark-text-emphasis: #dee2e6;
|
||||
--bs-primary-bg-subtle: #031633;
|
||||
--bs-secondary-bg-subtle: #161719;
|
||||
--bs-success-bg-subtle: #051b11;
|
||||
--bs-info-bg-subtle: #032830;
|
||||
--bs-warning-bg-subtle: #332701;
|
||||
--bs-danger-bg-subtle: #2c0b0e;
|
||||
--bs-light-bg-subtle: #343a40;
|
||||
--bs-dark-bg-subtle: #1a1d20;
|
||||
--bs-primary-border-subtle: #084298;
|
||||
--bs-secondary-border-subtle: #41464b;
|
||||
--bs-success-border-subtle: #0f5132;
|
||||
--bs-info-border-subtle: #087990;
|
||||
--bs-warning-border-subtle: #997404;
|
||||
--bs-danger-border-subtle: #842029;
|
||||
--bs-light-border-subtle: #495057;
|
||||
--bs-dark-border-subtle: #343a40;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #6ea8fe;
|
||||
--bs-link-hover-color: #8bb9fe;
|
||||
--bs-link-color-rgb: 110, 168, 254;
|
||||
--bs-link-hover-color-rgb: 139, 185, 254;
|
||||
--bs-code-color: #e685b5;
|
||||
--bs-highlight-color: #dee2e6;
|
||||
--bs-highlight-bg: #664d03;
|
||||
--bs-border-color: #495057;
|
||||
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
|
||||
--bs-form-valid-color: #75b798;
|
||||
--bs-form-valid-border-color: #75b798;
|
||||
--bs-form-invalid-color: #ea868f;
|
||||
--bs-form-invalid-border-color: #ea868f;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: var(--bs-border-width) solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: var(--bs-heading-color);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
color: var(--bs-highlight-color);
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: var(--bs-secondary-color);
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: right;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
line-height: inherit;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: right;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
|
||||
+1
File diff suppressed because one or more lines are too long
+6
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+5402
File diff suppressed because it is too large
Load Diff
+1
File diff suppressed because one or more lines are too long
+6
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user