diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-area-type-permission/block-grid-area-type-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-area-type-permission/block-grid-area-type-permission.element.ts index 645906e4d7..3af917e303 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-area-type-permission/block-grid-area-type-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/property-editors/block-grid-area-type-permission/block-grid-area-type-permission.element.ts @@ -7,6 +7,11 @@ import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-ed import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/data-type'; import type { UmbBlockTypeWithGroupKey } from '@umbraco-cms/backoffice/block-type'; import type { UUIComboboxElement, UUIComboboxEvent, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbRepositoryItemsManager } from '@umbraco-cms/backoffice/repository'; +import { + UMB_DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, + type UmbDocumentTypeItemModel, +} from '@umbraco-cms/backoffice/document-type'; @customElement('umb-property-editor-ui-block-grid-area-type-permission') export class UmbPropertyEditorUIBlockGridAreaTypePermissionElement @@ -24,20 +29,41 @@ export class UmbPropertyEditorUIBlockGridAreaTypePermissionElement @state() private _value: Array = []; + _blockTypes: Array = []; + @state() - private _blockTypes: Array = []; + private _blockTypesWithElementName: Array<{ type: UmbBlockTypeWithGroupKey; name: string }> = []; @state() private _blockGroups: Array = []; + #itemsManager = new UmbRepositoryItemsManager( + this, + UMB_DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS, + (x) => x.unique, + ); + constructor() { super(); + this.observe(this.#itemsManager.items, (items) => { + this._blockTypesWithElementName = items + .map((item) => { + const blockType = this._blockTypes.find((block) => block.contentElementTypeKey === item.unique); + if (blockType) { + return { type: blockType, name: item.name }; + } + return undefined; + }) + .filter((x) => x !== undefined) as Array<{ type: UmbBlockTypeWithGroupKey; name: string }>; + }); + this.consumeContext(UMB_DATA_TYPE_WORKSPACE_CONTEXT, async (context) => { this.observe( await context.propertyValueByAlias>('blocks'), (blockTypes) => { this._blockTypes = blockTypes ?? []; + this.#itemsManager.setUniques(blockTypes.map((block) => block.contentElementTypeKey)); }, 'observeBlockType', ); @@ -103,7 +129,7 @@ export class UmbPropertyEditorUIBlockGridAreaTypePermissionElement this._value, (permission) => permission, (permission, index) => { - const showCategoryHeader = this._blockGroups.length && this._blockTypes.length; + const showCategoryHeader = this._blockGroups.length > 0 && this._blockTypesWithElementName.length > 0; return html`
block.contentElementTypeKey, + this._blockTypesWithElementName, + (block) => block.type.contentElementTypeKey, (block) => html` - ${block.label} + .value=${block.type.contentElementTypeKey} + ?selected=${area.elementTypeKey === block.type.contentElementTypeKey}> + ${block.name} `, ); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/manifests.ts index 7b63b02b4e..48b22385bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/manifests.ts @@ -1,10 +1,12 @@ import type { ManifestTypes } from '../models/index.js'; import { manifest as menuAliasConditionManifest } from './menu-alias.condition.js'; +import { manifest as multipleAppLanguagesConditionManifest } from './multiple-app-languages.condition.js'; import { manifest as sectionAliasConditionManifest } from './section-alias.condition.js'; import { manifest as switchConditionManifest } from './switch.condition.js'; export const manifests: Array = [ menuAliasConditionManifest, + multipleAppLanguagesConditionManifest, sectionAliasConditionManifest, switchConditionManifest, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/menu-alias.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/menu-alias.condition.ts index f03bcd1173..5d08fb2b73 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/menu-alias.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/menu-alias.condition.ts @@ -17,9 +17,13 @@ export class UmbMenuAliasCondition extends UmbConditionBase { - this.observe(context.alias, (MenuAlias) => { - this.permitted = MenuAlias === this.config.match; - }); + this.observe( + context.alias, + (MenuAlias) => { + this.permitted = MenuAlias === this.config.match; + }, + 'observeAlias', + ); }); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/multiple-app-languages.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/multiple-app-languages.condition.ts new file mode 100644 index 0000000000..361cbbcb38 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/multiple-app-languages.condition.ts @@ -0,0 +1,37 @@ +import { UmbConditionBase } from './condition-base.controller.js'; +import { UMB_APP_LANGUAGE_CONTEXT } from '@umbraco-cms/backoffice/language'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { + ManifestCondition, + UmbConditionConfigBase, + UmbConditionControllerArguments, + UmbExtensionCondition, +} from '@umbraco-cms/backoffice/extension-api'; + +export type UmbMultipleAppLanguageConditionConfig = UmbConditionConfigBase; + +export class UmbMultipleAppLanguageCondition + extends UmbConditionBase + implements UmbExtensionCondition +{ + constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { + super(host, args); + + this.consumeContext(UMB_APP_LANGUAGE_CONTEXT, (context) => { + this.observe( + context.moreThanOneLanguage, + (moreThanOneLanguage) => { + this.permitted = moreThanOneLanguage; + }, + 'observeLanguages', + ); + }); + } +} + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Multiple App Languages Condition', + alias: 'Umb.Condition.MultipleAppLanguages', + api: UmbMultipleAppLanguageCondition, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/section-alias.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/section-alias.condition.ts index dc163ed815..b4fd34b93c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/section-alias.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/section-alias.condition.ts @@ -24,9 +24,13 @@ export class UmbSectionAliasCondition if (permissionCheck !== undefined) { this.consumeContext(UMB_SECTION_CONTEXT, (context) => { - this.observe(context.alias, (sectionAlias) => { - this.permitted = sectionAlias ? permissionCheck!(sectionAlias) : false; - }); + this.observe( + context.alias, + (sectionAlias) => { + this.permitted = sectionAlias ? permissionCheck!(sectionAlias) : false; + }, + 'observeAlias', + ); }); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts index 0481a6cb5f..f1e92fbe34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts @@ -3,6 +3,7 @@ import type { CollectionBulkActionPermissionConditionConfig } from '../../collec import type { UmbSectionUserPermissionConditionConfig } from '../../section/conditions/index.js'; import type { SectionAliasConditionConfig } from './section-alias.condition.js'; import type { SwitchConditionConfig } from './switch.condition.js'; +import type { UmbMultipleAppLanguageConditionConfig } from './multiple-app-languages.condition.js'; import type { WorkspaceAliasConditionConfig, WorkspaceEntityTypeConditionConfig, @@ -29,8 +30,9 @@ export type ConditionTypes = | CollectionBulkActionPermissionConditionConfig | SectionAliasConditionConfig | SwitchConditionConfig + | UmbConditionConfigBase | UmbDocumentUserPermissionConditionConfig + | UmbMultipleAppLanguageConditionConfig | UmbSectionUserPermissionConditionConfig | WorkspaceAliasConditionConfig - | WorkspaceEntityTypeConditionConfig - | UmbConditionConfigBase; + | WorkspaceEntityTypeConditionConfig; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/property-editors/document-type-picker/property-editor-ui-document-type-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/property-editors/document-type-picker/property-editor-ui-document-type-picker.element.ts index b73d7b9998..e1604bb787 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/property-editors/document-type-picker/property-editor-ui-document-type-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/property-editors/document-type-picker/property-editor-ui-document-type-picker.element.ts @@ -45,7 +45,7 @@ export class UmbPropertyEditorUIDocumentTypePickerElement extends UmbLitElement .min=${this.min} .max=${this.max} .value=${this.value} - ?elementTypesOnly=${this.onlyElementTypes} + .elementTypesOnly=${this.onlyElementTypes ?? false} ?showOpenButton=${this.showOpenButton} @change=${this.#onChange}> diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/manifests.ts index b29b0dde84..e67c16493d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/app-language-select/manifests.ts @@ -12,6 +12,9 @@ const entityActions: Array = [ alias: 'Umb.Condition.SectionAlias', match: 'Umb.Section.Content', }, + { + alias: 'Umb.Condition.MultipleAppLanguages', + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts index 1383eee7c8..6a0d4b7d8b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts @@ -12,6 +12,7 @@ import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; export class UmbAppLanguageContext extends UmbContextBase implements UmbApi { #languageCollectionRepository: UmbLanguageCollectionRepository; #languages = new UmbArrayState([], (x) => x.unique); + moreThanOneLanguage = this.#languages.asObservablePart((x) => x.length > 1); #appLanguage = new UmbObjectState(undefined); appLanguage = this.#appLanguage.asObservable(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts index 874d2b3764..0be8864bd5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts @@ -90,7 +90,7 @@ export class UmbWebhookDetailsWorkspaceViewElement extends UmbLitElement impleme slot="editor" @change=${this.#onTypesChange} .selection=${this._webhook?.contentTypes ?? []} - ?documentTypesOnly=${true}> + .documentTypesOnly=${true}> `; case 'Media': return html`