diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/document-workspace-has-collection.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/document-workspace-has-collection.condition.ts new file mode 100644 index 0000000000..119d00365a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/document-workspace-has-collection.condition.ts @@ -0,0 +1,32 @@ +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import type { + UmbConditionConfigBase, + UmbConditionControllerArguments, + UmbExtensionCondition, +} from '@umbraco-cms/backoffice/extension-api'; + +export class UmbDocumentWorkspaceHasCollectionCondition extends UmbBaseController implements UmbExtensionCondition { + config: DocumentWorkspaceHasCollectionConditionConfig; + permitted = false; + #onChange: () => void; + + constructor(args: UmbConditionControllerArguments) { + super(args.host); + this.config = args.config; + this.#onChange = args.onChange; + + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => { + this.observe(context.structure.ownerContentType(), (contentType) => { + // TODO: [LK] Replace this check once the `.collection` is available from the Management API. + if (contentType?.unique === 'simple-document-type-id') { + this.permitted = true; + this.#onChange(); + } + }); + }); + } +} + +export type DocumentWorkspaceHasCollectionConditionConfig = + UmbConditionConfigBase<'Umb.Condition.DocumentWorkspaceHasCollection'>; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/index.ts new file mode 100644 index 0000000000..35e83ec884 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/index.ts @@ -0,0 +1 @@ +export * from './document-workspace-has-collection.condition.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/manifests.ts new file mode 100644 index 0000000000..d8e85e3dd1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/conditions/manifests.ts @@ -0,0 +1,11 @@ +import { UmbDocumentWorkspaceHasCollectionCondition } from './document-workspace-has-collection.condition.js'; +import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; + +const documentWorkspaceHasCollectionManifest: ManifestCondition = { + type: 'condition', + name: 'Document Workspace Has Collection Condition', + alias: 'Umb.Condition.DocumentWorkspaceHasCollection', + api: UmbDocumentWorkspaceHasCollectionCondition, +}; + +export const manifests = [documentWorkspaceHasCollectionManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts index 3c0db71634..500b000e79 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts @@ -8,6 +8,7 @@ export * from './user-permissions/index.js'; export * from './components/index.js'; export * from './entity.js'; export * from './entity-actions/index.js'; +export * from './conditions/index.js'; export { UMB_DOCUMENT_TREE_ALIAS } from './tree/index.js'; export { UMB_CONTENT_MENU_ALIAS } from './menu.manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts index ba7ad261ff..d796e827ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/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 menuItemManifests } from './menu-item/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; @@ -12,6 +13,7 @@ import { manifests as trackedReferenceManifests } from './tracked-reference/mani export const manifests = [ ...collectionManifests, + ...conditionManifests, ...menuItemManifests, ...treeManifests, ...repositoryManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index 0bab8a6794..e863cb5709 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -7,7 +7,6 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, ManifestWorkspaceView, - ManifestWorkspaceViewCollection, } from '@umbraco-cms/backoffice/extension-registry'; const workspace: ManifestWorkspace = { @@ -22,11 +21,28 @@ const workspace: ManifestWorkspace = { }; const workspaceViews: Array = [ + { + type: 'workspaceView', + alias: 'Umb.WorkspaceView.Document.Collection', + name: 'Document Workspace Collection View', + element: () => import('./views/collection/document-workspace-view-collection.element.js'), + weight: 300, + meta: { + label: 'Documents', + pathname: 'collection', + icon: 'icon-grid', + }, + conditions: [ + { + alias: 'Umb.Condition.DocumentWorkspaceHasCollection', + }, + ], + }, { type: 'workspaceView', alias: 'Umb.WorkspaceView.Document.Edit', name: 'Document Workspace Edit View', - js: () => import('./views/edit/document-workspace-view-edit.element.js'), + element: () => import('./views/edit/document-workspace-view-edit.element.js'), weight: 200, meta: { label: 'Content', @@ -44,7 +60,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.Document.Info', name: 'Document Workspace Info View', - js: () => import('./views/info/document-workspace-view-info.element.js'), + element: () => import('./views/info/document-workspace-view-info.element.js'), weight: 100, meta: { label: 'Info', @@ -60,25 +76,6 @@ const workspaceViews: Array = [ }, ]; -const workspaceViewCollections: Array = [ - /* - // TODO: Reenable this: - { - type: 'workspaceViewCollection', - alias: 'Umb.WorkspaceView.Document.Collection', - name: 'Document Workspace Collection View', - weight: 300, - meta: { - label: 'Documents', - pathname: 'collection', - icon: 'icon-grid', - entityType: UMB_DOCUMENT_ENTITY_TYPE, - repositoryAlias: DOCUMENT_REPOSITORY_ALIAS, - } - }, - */ -]; - const workspaceActions: Array = [ { type: 'workspaceAction', @@ -152,4 +149,4 @@ const workspaceActions: Array = [ */ ]; -export const manifests = [workspace, ...workspaceViews, ...workspaceViewCollections, ...workspaceActions]; +export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/collection/document-workspace-view-collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/collection/document-workspace-view-collection.element.ts new file mode 100644 index 0000000000..40c4702266 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/collection/document-workspace-view-collection.element.ts @@ -0,0 +1,34 @@ +import { css, customElement, html } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document'; +import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; + +@customElement('umb-document-workspace-view-collection') +export class UmbDocumentWorkspaceViewCollectionElement extends UmbLitElement implements UmbWorkspaceViewElement { + #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; + + constructor() { + super(); + + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#workspaceContext = workspaceContext; + + // TODO: [LK] Get the `dataTypeId` and get the configuration for the collection view. + }); + } + + render() { + return html``; + } + + static styles = [UmbTextStyles, css``]; +} + +export default UmbDocumentWorkspaceViewCollectionElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-workspace-view-collection': UmbDocumentWorkspaceViewCollectionElement; + } +}