Lots of progress

This commit is contained in:
2024-04-05 23:22:45 -05:00
parent 23ec66dd88
commit 96b48fb46a
16 changed files with 191 additions and 9 deletions

View File

@@ -4,4 +4,5 @@ public static class ContentTypes
public const string OapApplication = nameof(OapApplication); public const string OapApplication = nameof(OapApplication);
public const string OapApplicationForm = nameof(OapApplicationForm); public const string OapApplicationForm = nameof(OapApplicationForm);
public const string OapApplicationFormStep = nameof(OapApplicationFormStep); public const string OapApplicationFormStep = nameof(OapApplicationFormStep);
public const string OapExplanation = nameof(OapExplanation);
} }

View File

@@ -1,4 +1,5 @@
using Oap.OapApplication; using Oap.OapApplication;
using Oap.OapExplanation;
using OrchardCore.Autoroute.Models; using OrchardCore.Autoroute.Models;
using OrchardCore.ContentFields.Fields; using OrchardCore.ContentFields.Fields;
using OrchardCore.ContentFields.Settings; using OrchardCore.ContentFields.Settings;
@@ -114,5 +115,41 @@ public class Migrations : DataMigration
return 2; return 2;
} }
public async Task<int> UpdateFrom2Async()
{
await m_contentDefinitionManager
.AlterPartDefinitionAsync(nameof(OapExplanationPart), part => part
.Attachable());
await m_contentDefinitionManager
.AlterTypeDefinitionAsync(ContentTypes.OapExplanation, type => type
.WithPart<OapExplanationPart>()
.Stereotype("Widget"));
return 3;
}
public async Task<int> UpdateFrom3Async()
{
await m_contentDefinitionManager
.AlterPartDefinitionAsync(nameof(OapExplanationPart), part => part
.WithField(nameof(OapExplanationPart.Text), field => field
.OfType(nameof(HtmlField))
.WithDisplayName(nameof(OapExplanationPart.Text))
.WithDescription("A detailed explanation of a field.")));
return 4;
}
public async Task<int> UpdateFrom4Async()
{
await m_contentDefinitionManager
.AlterPartDefinitionAsync(nameof(OapExplanationPart), part => part
.WithField(nameof(OapExplanationPart.Text), field => field
.WithSettings(new ContentPartFieldSettings { Editor = "Wysiwyg" })));
return 5;
}
private readonly IContentDefinitionManager m_contentDefinitionManager; private readonly IContentDefinitionManager m_contentDefinitionManager;
} }

View File

@@ -2,6 +2,8 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Oap.OapApplication; using Oap.OapApplication;
using Oap.OapExplanation;
using OrchardCore.ContentManagement;
using OrchardCore.Data.Migration; using OrchardCore.Data.Migration;
namespace Oap.Content; namespace Oap.Content;
@@ -10,7 +12,8 @@ public class Startup : OrchardCore.Modules.StartupBase
{ {
public override void ConfigureServices(IServiceCollection services) public override void ConfigureServices(IServiceCollection services)
{ {
services.AddScoped<OapApplicationPart>(); services.AddContentPart<OapApplicationPart>();
services.AddContentPart<OapExplanationPart>();
services.AddDataMigration<Migrations>(); services.AddDataMigration<Migrations>();
} }

View File

@@ -0,0 +1,16 @@
@using OrchardCore.Forms.Models
@model OrchardCore.DisplayManagement.Views.ShapeViewModel<ButtonPart>
@{
var formElementPart = Model.Value.ContentItem.As<FormElementPart>();
var formInputElementPart = Model.Value.ContentItem.As<FormInputElementPart>();
var elementId = formElementPart.Id;
var elementName = formInputElementPart.Name;
var id = !string.IsNullOrEmpty(elementId) ? elementId : !string.IsNullOrEmpty(elementName) ? Html.GenerateIdFromName(elementName) : default(string);
}
<button
class="block cursor-pointer rounded-md bg-amber-300 px-4 py-2 text-gray-800 hover:bg-amber-500 disabled:cursor-not-allowed disabled:bg-gray-400 disabled:text-gray-600"
type="@Model.Value.Type"
name="@elementName"
id="@elementId">
@Model.Value.Text
</button>

View File

@@ -1,5 +1,5 @@
<h1 class="mb-6 border-b-2 border-solid border-black pb-1 text-center text-2xl font-bold"> <h1 class="mb-6 border-b-2 border-solid border-black pb-1 text-center text-2xl font-bold">
@Model.Header.TitlePart.Title Form Title
</h1> </h1>
<div class="flex flex-row gap-x-4"> <div class="flex flex-row gap-x-4">
@@ -7,4 +7,14 @@
<menu alias="alias:application-steps-menu" cache-id="application-steps-menu" cache-fixed-duration="00:05:00" cache-tag="alias:application-steps-menu" /> <menu alias="alias:application-steps-menu" cache-id="application-steps-menu" cache-fixed-duration="00:05:00" cache-tag="alias:application-steps-menu" />
</aside> </aside>
<div>
<h2 class="text-lg font-bold">
@Model.Header.TitlePart.Title
</h2>
@await DisplayAsync(Model.Content.HtmlBodyPart)
@await DisplayAsync(Model.Content.FlowPart)
</div>
</div> </div>

View File

@@ -0,0 +1,13 @@
@model OrchardCore.Flows.ViewModels.FlowPartViewModel
@inject OrchardCore.ContentManagement.Display.IContentItemDisplayManager ContentItemDisplayManager
@foreach (var widget in Model.FlowPart.Widgets)
{
var widgetContent = await ContentItemDisplayManager.BuildDisplayAsync(
widget,
Model.BuildPartDisplayContext.Updater,
Model.BuildPartDisplayContext.DisplayType,
Model.BuildPartDisplayContext.GroupId);
@await DisplayAsync(widgetContent)
}

View File

@@ -0,0 +1,8 @@
@using OrchardCore.Forms.Models
@model OrchardCore.DisplayManagement.Views.ShapeViewModel<LabelPart>
@{
var contentItem = Model.Value.ContentItem;
var formElementPart = contentItem.As<FormElementPart>();
}
<label id="@formElementPart.Id" for="@Model.Value.For">@contentItem.DisplayText</label>

View File

@@ -0,0 +1,3 @@
<p class="pl-4 my-2 text-sm text-gray-500">
@Html.Raw(Model.Html)
</p>

View File

@@ -0,0 +1,3 @@
<div class="flex justify-end">
@await DisplayAsync(Model.Content)
</div>

View File

@@ -0,0 +1,3 @@
<div class="flex flex-col gap-4">
@await DisplayAsync(Model.Content)
</div>

View File

@@ -0,0 +1,3 @@
<div class="grid grid-cols-2">
@await DisplayAsync(Model.Content)
</div>

View File

@@ -0,0 +1,3 @@
<div>
@await DisplayAsync(Model.Content)
</div>

View File

@@ -0,0 +1,3 @@
<div class="flex flex-col">
@await DisplayAsync(Model.Content)
</div>

View File

@@ -564,15 +564,25 @@ span.field-validation-error {
margin-top: 0.25rem; margin-top: 0.25rem;
margin-bottom: 0.25rem; margin-bottom: 0.25rem;
} }
.my-2 {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
.mb-6 { .mb-6 {
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
} }
.block {
display: block;
}
.flex { .flex {
display: flex; display: flex;
} }
.table { .table {
display: table; display: table;
} }
.grid {
display: grid;
}
.hidden { .hidden {
display: none; display: none;
} }
@@ -585,18 +595,39 @@ span.field-validation-error {
.max-w-screen-md { .max-w-screen-md {
max-width: 768px; max-width: 768px;
} }
.cursor-pointer {
cursor: pointer;
}
.grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.grid-rows-2 {
grid-template-rows: repeat(2, minmax(0, 1fr));
}
.flex-row { .flex-row {
flex-direction: row; flex-direction: row;
} }
.flex-col { .flex-col {
flex-direction: column; flex-direction: column;
} }
.justify-end {
justify-content: flex-end;
}
.gap-2 {
gap: 0.5rem;
}
.gap-4 {
gap: 1rem;
}
.gap-x-4 { .gap-x-4 {
column-gap: 1rem; column-gap: 1rem;
} }
.whitespace-nowrap { .whitespace-nowrap {
white-space: nowrap; white-space: nowrap;
} }
.rounded-md {
border-radius: 0.375rem;
}
.border-\[1px\] { .border-\[1px\] {
border-width: 1px; border-width: 1px;
} }
@@ -618,6 +649,10 @@ span.field-validation-error {
--tw-border-opacity: 1; --tw-border-opacity: 1;
border-right-color: rgb(255 255 255 / var(--tw-border-opacity)); border-right-color: rgb(255 255 255 / var(--tw-border-opacity));
} }
.bg-amber-300 {
--tw-bg-opacity: 1;
background-color: rgb(252 211 77 / var(--tw-bg-opacity));
}
.p-6 { .p-6 {
padding: 1.5rem; padding: 1.5rem;
} }
@@ -629,6 +664,14 @@ span.field-validation-error {
padding-left: 0.5rem; padding-left: 0.5rem;
padding-right: 0.5rem; padding-right: 0.5rem;
} }
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
}
.py-2 {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
.pb-1 { .pb-1 {
padding-bottom: 0.25rem; padding-bottom: 0.25rem;
} }
@@ -638,6 +681,9 @@ span.field-validation-error {
.pt-1 { .pt-1 {
padding-top: 0.25rem; padding-top: 0.25rem;
} }
.pl-4 {
padding-left: 1rem;
}
.text-center { .text-center {
text-align: center; text-align: center;
} }
@@ -652,6 +698,10 @@ span.field-validation-error {
font-size: 0.875rem; font-size: 0.875rem;
line-height: 1.25rem; line-height: 1.25rem;
} }
.text-lg {
font-size: 1.125rem;
line-height: 1.75rem;
}
.font-bold { .font-bold {
font-weight: 700; font-weight: 700;
} }
@@ -663,9 +713,28 @@ span.field-validation-error {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(107 114 128 / var(--tw-text-opacity)); color: rgb(107 114 128 / var(--tw-text-opacity));
} }
.text-gray-800 {
--tw-text-opacity: 1;
color: rgb(31 41 55 / var(--tw-text-opacity));
}
.hover\:bg-amber-500:hover {
--tw-bg-opacity: 1;
background-color: rgb(245 158 11 / var(--tw-bg-opacity));
}
.hover\:text-black:hover { .hover\:text-black:hover {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(0 0 0 / var(--tw-text-opacity)); color: rgb(0 0 0 / var(--tw-text-opacity));
} }
.disabled\:cursor-not-allowed:disabled {
cursor: not-allowed;
}
.disabled\:bg-gray-400:disabled {
--tw-bg-opacity: 1;
background-color: rgb(156 163 175 / var(--tw-bg-opacity));
}
.disabled\:text-gray-600:disabled {
--tw-text-opacity: 1;
color: rgb(75 85 99 / var(--tw-text-opacity));
}

View File

@@ -0,0 +1,8 @@
using OrchardCore.ContentFields.Fields;
using OrchardCore.ContentManagement;
namespace Oap.OapExplanation;
public class OapExplanationPart : ContentPart
{
public HtmlField Text { get; set; } = new();
}

View File

@@ -8,12 +8,11 @@ builder.Services
.AddOrchardCms() .AddOrchardCms()
.EnableFeature("OrchardCore.Tenants") .EnableFeature("OrchardCore.Tenants")
.AddSetupFeatures("OrchardCore.AutoSetup") .AddSetupFeatures("OrchardCore.AutoSetup")
// // Orchard Specific Pipeline .ConfigureServices(tenantServices =>
// .ConfigureServices( services => { tenantServices.ConfigureHtmlSanitizer((sanitizer) =>
// }) {
// .Configure( (app, routes, services) => { sanitizer.AllowedSchemes.Add("mailto");
// }) }));
;
var app = builder.Build(); var app = builder.Build();