diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/index.ts new file mode 100644 index 0000000000..a6d19b94f4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/index.ts @@ -0,0 +1 @@ +export { UMB_MEDIA_WORKSPACE_HAS_COLLECTION_CONDITION } from './media-workspace-has-collection.condition.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/manifests.ts new file mode 100644 index 0000000000..839a888d34 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/manifests.ts @@ -0,0 +1,3 @@ +import { manifest as mediaWorkspaceHasCollectionCondition } from './media-workspace-has-collection.condition.js'; + +export const manifests = [mediaWorkspaceHasCollectionCondition]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/media-workspace-has-collection.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/media-workspace-has-collection.condition.ts new file mode 100644 index 0000000000..570b4b8f1b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/conditions/media-workspace-has-collection.condition.ts @@ -0,0 +1,44 @@ +import { UMB_MEDIA_WORKSPACE_CONTEXT } from '../workspace/media-workspace.context-token.js'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import type { + ManifestCondition, + UmbConditionConfigBase, + UmbConditionControllerArguments, + UmbExtensionCondition, +} from '@umbraco-cms/backoffice/extension-api'; + +export class UmbMediaWorkspaceHasCollectionCondition extends UmbBaseController implements UmbExtensionCondition { + config: MediaWorkspaceHasCollectionConditionConfig; + permitted = false; + #onChange: () => void; + + constructor(args: UmbConditionControllerArguments) { + super(args.host); + this.config = args.config; + this.#onChange = args.onChange; + + this.consumeContext(UMB_MEDIA_WORKSPACE_CONTEXT, (context) => { + this.observe( + context.contentTypeCollection, + (collection) => { + this.permitted = !!collection?.id; + this.#onChange(); + }, + 'observeCollection', + ); + }); + } +} + +export type MediaWorkspaceHasCollectionConditionConfig = UmbConditionConfigBase< + typeof UMB_MEDIA_WORKSPACE_HAS_COLLECTION_CONDITION +>; + +export const UMB_MEDIA_WORKSPACE_HAS_COLLECTION_CONDITION = 'Umb.Condition.MediaWorkspaceHasCollection'; + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Media Workspace Has Collection Condition', + alias: UMB_MEDIA_WORKSPACE_HAS_COLLECTION_CONDITION, + api: UmbMediaWorkspaceHasCollectionCondition, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts index 33e13a490f..0f2adb8fd6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts @@ -7,6 +7,7 @@ export * from './tracked-reference/index.js'; export * from './user-permissions/index.js'; export * from './utils/index.js'; export * from './workspace/index.js'; +export * from './conditions/index.js'; export { UMB_MEDIA_TREE_ALIAS } from './tree/index.js'; export { UMB_MEDIA_COLLECTION_ALIAS } from './collection/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts index 91a3ed0a90..e0916a5e43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts @@ -1,4 +1,5 @@ import { manifests as collectionManifests } from './collection/manifests.js'; +import { manifests as conditionManifests } from './conditions/manifests.js'; import { manifests as entityActionsManifests } from './entity-actions/manifests.js'; import { manifests as entityBulkActionsManifests } from './entity-bulk-actions/manifests.js'; import { manifests as menuItemManifests } from './menu-item/manifests.js'; @@ -11,6 +12,7 @@ import { manifests as workspaceManifests } from './workspace/manifests.js'; export const manifests = [ ...collectionManifests, + ...conditionManifests, ...entityActionsManifests, ...entityBulkActionsManifests, ...menuItemManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts index 92427057b9..c8353c5745 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts @@ -1,9 +1,13 @@ import type { UmbMediaEntityType } from './entity.js'; +import type { UmbReferenceById } from '@umbraco-cms/backoffice/models'; import type { UmbVariantModel } from '@umbraco-cms/backoffice/variant'; import type { MediaUrlInfoModel, MediaValueModel } from '@umbraco-cms/backoffice/external/backend-api'; export interface UmbMediaDetailModel { - mediaType: { unique: string }; + mediaType: { + unique: string; + collection: UmbReferenceById | null; + }; entityType: UmbMediaEntityType; isTrashed: boolean; unique: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index 9c87b9b8e7..6344f36472 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -32,6 +32,7 @@ export class UmbMediaWorkspaceContext readonly unique = this.#currentData.asObservablePart((data) => data?.unique); readonly contentTypeUnique = this.#currentData.asObservablePart((data) => data?.mediaType.unique); + readonly contentTypeCollection = this.#currentData.asObservablePart((data) => data?.mediaType.collection); readonly variants = this.#currentData.asObservablePart((data) => data?.variants || []); readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []);