From b181e4f1ec5cfec7955e29fbae69d0be99ecc1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 2 Sep 2024 13:14:06 +0200 Subject: [PATCH 1/5] move type, refactor logic --- .../context/block-grid-entries.context.ts | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts index ebbec1134f..6c5ce9d51b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts @@ -20,6 +20,14 @@ import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/rou import { pathFolderName } from '@umbraco-cms/backoffice/utils'; import type { UmbNumberRangeValueType } from '@umbraco-cms/backoffice/models'; +interface UmbBlockGridAreaTypeInvalidRuleType { + groupKey?: string; + key?: string; + name: string; + amount: number; + minRequirement: number; + maxRequirement: number; +} export class UmbBlockGridEntriesContext extends UmbBlockEntriesContext< typeof UMB_BLOCK_GRID_MANAGER_CONTEXT, @@ -455,14 +463,7 @@ export class UmbBlockGridEntriesContext } } - #invalidBlockTypeLimits?: Array<{ - groupKey?: string; - key?: string; - name: string; - amount: number; - minRequirement: number; - maxRequirement: number; - }>; + #invalidBlockTypeLimits?: Array; getInvalidBlockTypeLimits() { return this.#invalidBlockTypeLimits ?? []; @@ -476,57 +477,56 @@ export class UmbBlockGridEntriesContext const layoutEntries = this._layoutEntries.getValue(); - this.#invalidBlockTypeLimits = []; + this.#invalidBlockTypeLimits = this.#areaType.specifiedAllowance + .map((rule) => { + const minAllowed = rule.minAllowed || 0; + const maxAllowed = rule.maxAllowed || 0; - const hasInvalidRules = this.#areaType.specifiedAllowance.some((rule) => { - const minAllowed = rule.minAllowed || 0; - const maxAllowed = rule.maxAllowed || 0; + // For block groups: + if (rule.groupKey) { + const groupElementTypeKeys = + this._manager + ?.getBlockTypes() + .filter((blockType) => blockType.groupKey === rule.groupKey && blockType.allowInAreas === true) + .map((x) => x.contentElementTypeKey) ?? []; + const groupAmount = layoutEntries.filter((entry) => { + const contentTypeKey = this._manager!.getContentTypeKeyOf(entry.contentUdi); + return contentTypeKey ? groupElementTypeKeys.indexOf(contentTypeKey) !== -1 : false; + }).length; - // For block groups: - if (rule.groupKey) { - const groupElementTypeKeys = - this._manager - ?.getBlockTypes() - .filter((blockType) => blockType.groupKey === rule.groupKey && blockType.allowInAreas === true) - .map((x) => x.contentElementTypeKey) ?? []; - const groupAmount = layoutEntries.filter((entry) => { - const contentTypeKey = this._manager!.getContentTypeKeyOf(entry.contentUdi); - return contentTypeKey ? groupElementTypeKeys.indexOf(contentTypeKey) !== -1 : false; - }).length; - - if (groupAmount < minAllowed || (maxAllowed > 0 && groupAmount > maxAllowed)) { - this.#invalidBlockTypeLimits!.push({ - groupKey: rule.groupKey, - name: this._manager!.getBlockGroupName(rule.groupKey) ?? '?', - amount: groupAmount, - minRequirement: minAllowed, - maxRequirement: maxAllowed, - }); - return true; + if (groupAmount < minAllowed || (maxAllowed > 0 && groupAmount > maxAllowed)) { + return { + groupKey: rule.groupKey, + name: this._manager!.getBlockGroupName(rule.groupKey) ?? '?', + amount: groupAmount, + minRequirement: minAllowed, + maxRequirement: maxAllowed, + }; + } } - } - // For specific elementTypes: - else if (rule.elementTypeKey) { - const amount = layoutEntries.filter((entry) => { - const contentTypeKey = this._manager!.getContentOf(entry.contentUdi)?.contentTypeKey; - return contentTypeKey === rule.elementTypeKey; - }).length; - if (amount < minAllowed || (maxAllowed > 0 ? amount > maxAllowed : false)) { - this.#invalidBlockTypeLimits!.push({ - key: rule.elementTypeKey, - name: this._manager!.getContentTypeNameOf(rule.elementTypeKey) ?? '?', - amount: amount, - minRequirement: minAllowed, - maxRequirement: maxAllowed, - }); - return true; + // For specific elementTypes: + else if (rule.elementTypeKey) { + const amount = layoutEntries.filter((entry) => { + const contentTypeKey = this._manager!.getContentOf(entry.contentUdi)?.contentTypeKey; + return contentTypeKey === rule.elementTypeKey; + }).length; + if (amount < minAllowed || (maxAllowed > 0 ? amount > maxAllowed : false)) { + return { + key: rule.elementTypeKey, + name: this._manager!.getContentTypeNameOf(rule.elementTypeKey) ?? '?', + amount: amount, + minRequirement: minAllowed, + maxRequirement: maxAllowed, + }; + } } - } - // Lets fail cause the rule was bad. - console.error('Invalid block type limit rule.', rule); - return false; - }); + // Lets fail cause the rule was bad. + console.error('Invalid block type limit rule.', rule); + return undefined; + }) + .filter((x) => x !== undefined) as Array; + const hasInvalidRules = this.#invalidBlockTypeLimits.length > 0; return hasInvalidRules === false; } From d8774bc495790e4303515e97007e299de304b189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 2 Sep 2024 14:13:25 +0200 Subject: [PATCH 2/5] notes for maybe future feature --- .../packages/core/validation/mixins/form-control.mixin.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts index e4f45a5518..e10264f44e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts @@ -164,7 +164,10 @@ export function UmbFormControlMixin< super(...args); this._internals = this.attachInternals(); - this.addEventListener('blur', () => { + this.addEventListener('blur', (e) => { + /*if (e.composedPath().some((x) => x === this)) { + return; + }*/ this.pristine = false; this.checkValidity(); }); From 5d8e0a969df13f25fd8f3d97c53187ae162a199c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 2 Sep 2024 14:13:38 +0200 Subject: [PATCH 3/5] avoid removing pristine on focus, instead on blur --- .../data-type-flow-input/data-type-flow-input.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts index e6579bf1f6..df1cc59049 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/components/data-type-flow-input/data-type-flow-input.element.ts @@ -101,7 +101,7 @@ export class UmbInputDataTypeElement extends UmbFormControlMixin(UmbLitElement, label="Select Property Editor" look="placeholder" color="default" - @focus=${() => { + @blur=${() => { this.pristine = false; }} .href=${this._createRoute}> From 9c84fabed3d22613e98f619a7da61655e70fb98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 2 Sep 2024 14:13:48 +0200 Subject: [PATCH 4/5] fix rule validation --- .../block/block-grid/context/block-grid-entries.context.ts | 4 +++- .../workspace/block-grid-type-workspace.modal-token.ts | 2 +- .../packages/block/block/context/block-manager.context.ts | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts index 6c5ce9d51b..21ef577a45 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/context/block-grid-entries.context.ts @@ -490,7 +490,7 @@ export class UmbBlockGridEntriesContext .filter((blockType) => blockType.groupKey === rule.groupKey && blockType.allowInAreas === true) .map((x) => x.contentElementTypeKey) ?? []; const groupAmount = layoutEntries.filter((entry) => { - const contentTypeKey = this._manager!.getContentTypeKeyOf(entry.contentUdi); + const contentTypeKey = this._manager!.getContentTypeKeyOfContentUdi(entry.contentUdi); return contentTypeKey ? groupElementTypeKeys.indexOf(contentTypeKey) !== -1 : false; }).length; @@ -503,6 +503,7 @@ export class UmbBlockGridEntriesContext maxRequirement: maxAllowed, }; } + return undefined; } // For specific elementTypes: else if (rule.elementTypeKey) { @@ -519,6 +520,7 @@ export class UmbBlockGridEntriesContext maxRequirement: maxAllowed, }; } + return undefined; } // Lets fail cause the rule was bad. diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-type-workspace.modal-token.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-type-workspace.modal-token.ts index f45bce646e..19d76caa88 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-type-workspace.modal-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/block-grid-type-workspace.modal-token.ts @@ -14,7 +14,7 @@ export const UMB_BLOCK_GRID_TYPE_WORKSPACE_MODAL = new UmbModalToken< type: 'sidebar', size: 'large', }, - data: { entityType: UMB_BLOCK_GRID_TYPE, preset: { allowAtRoot: true } }, + data: { entityType: UMB_BLOCK_GRID_TYPE, preset: { allowAtRoot: true, allowInAreas: true } }, }, // Recast the type, so the entityType data prop is not required: ) as UmbModalToken, UmbWorkspaceModalValue>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts index df113d9b81..f44da55be5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts @@ -139,6 +139,9 @@ export abstract class UmbBlockManagerContext< this.#contentTypes.appendOne(data); } + getContentTypeKeyOfContentUdi(contentUdi: string) { + return this.getContentOf(contentUdi)?.contentTypeKey; + } contentTypeOf(contentTypeKey: string) { return this.#contentTypes.asObservablePart((source) => source.find((x) => x.unique === contentTypeKey)); } @@ -148,9 +151,6 @@ export abstract class UmbBlockManagerContext< getContentTypeNameOf(contentTypeKey: string) { return this.#contentTypes.getValue().find((x) => x.unique === contentTypeKey)?.name; } - getContentTypeKeyOf(contentTypeKey: string) { - return this.#contentTypes.getValue().find((x) => x.unique === contentTypeKey)?.unique; - } getContentTypeHasProperties(contentTypeKey: string) { const properties = this.#contentTypes.getValue().find((x) => x.unique === contentTypeKey)?.properties; return properties ? properties.length > 0 : false; From 671b56e36f3c028faffc6296cf05533566215f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 2 Sep 2024 14:21:44 +0200 Subject: [PATCH 5/5] remove unused argument --- .../src/packages/core/validation/mixins/form-control.mixin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts index e10264f44e..e3b13b79be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/mixins/form-control.mixin.ts @@ -164,7 +164,7 @@ export function UmbFormControlMixin< super(...args); this._internals = this.attachInternals(); - this.addEventListener('blur', (e) => { + this.addEventListener('blur', () => { /*if (e.composedPath().some((x) => x === this)) { return; }*/