Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Condition for Content Type Alias #1550

22 changes: 22 additions & 0 deletions examples/entity-content-type-condition/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import type { ManifestWorkspaceView } from '@umbraco-cms/backoffice/extension-registry';

const workspace: ManifestWorkspaceView = {
type: 'workspaceView',
alias: 'Example.WorkspaceView.EntityContentTypeCondition',
name: 'Example Workspace View With Entity Content Type Condition',
element: () => import('./workspace-view.element.js'),
meta: {
icon: 'icon-bus',
label: 'Conditional',
pathname: 'conditional',
},
conditions: [
{
alias: 'Umb.Condition.WorkspaceContentTypeAlias',
//match : 'blogPost'
oneOf: ['blogPost', 'mediaType1'],
},
],
};

export const manifests = [workspace];
19 changes: 19 additions & 0 deletions examples/entity-content-type-condition/workspace-view.element.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';

@customElement('umb-example-entity-content-type-condition')
export class UmbWorkspaceViewElement extends UmbLitElement {
override render() {
return html`<p>
This is a conditional element that is only shown in workspaces based on it's entities content type.
</p>`;
}
}

export default UmbWorkspaceViewElement;

declare global {
interface HTMLElementTagNameMap {
'umb-example-entity-content-type-condition': UmbWorkspaceViewElement;
}
}
5 changes: 4 additions & 1 deletion src/packages/core/extension-registry/conditions/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type { UmbMultipleAppLanguageConditionConfig } from './multiple-app-langu
import type {
WorkspaceAliasConditionConfig,
WorkspaceEntityTypeConditionConfig,
WorkspaceContentTypeAliasConditionConfig,
} from '@umbraco-cms/backoffice/workspace';
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
import type { UmbDocumentUserPermissionConditionConfig } from '@umbraco-cms/backoffice/document';
Expand Down Expand Up @@ -35,4 +36,6 @@ export type ConditionTypes =
| UmbMultipleAppLanguageConditionConfig
| UmbSectionUserPermissionConditionConfig
| WorkspaceAliasConditionConfig
| WorkspaceEntityTypeConditionConfig;
| WorkspaceEntityTypeConditionConfig
| WorkspaceContentTypeAliasConditionConfig
| UmbConditionConfigBase;
2 changes: 1 addition & 1 deletion src/packages/core/extension-registry/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ import type { ManifestBackofficeEntryPoint } from './backoffice-entry-point.mode
import type { ManifestEntryPoint } from './entry-point.model.js';
import type { ManifestMonacoMarkdownEditorAction } from './monaco-markdown-editor-action.model.js';
import type { ManifestSectionRoute } from './section-route.model.js';
import type { ManifestBase, ManifestBundle, ManifestCondition } from '@umbraco-cms/backoffice/extension-api';
import type { ManifestPickerSearchResultItem } from './picker-search-result-item.model.js';
import type { ManifestBase, ManifestBundle, ManifestCondition } from '@umbraco-cms/backoffice/extension-api';

export type * from './app-entry-point.model.js';
export type * from './auth-provider.model.js';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ export class UmbPropertyTypeWorkspaceContext<PropertyTypeData extends UmbPropert
/**
* @function setPropertyValue
* @param {string} propertyAlias
* @param alias
* @param {PromiseLike<unknown>} value - value can be a promise resolving into the actual value or the raw value it self.
* @returns {Promise<void>}
* @description Set the value of this property.
Expand Down
2 changes: 2 additions & 0 deletions src/packages/core/workspace/conditions/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export type { WorkspaceAliasConditionConfig } from './workspace-alias.condition.js';
export type { WorkspaceEntityTypeConditionConfig } from './workspace-entity-type.condition.js';
export type { WorkspaceHasCollectionConditionConfig } from './workspace-has-collection.condition.js';
export type { WorkspaceContentTypeAliasConditionConfig as WorkspaceEntityContentTypeConditionConfig } from './workspace-content-type-alias.condition.js';
export type { WorkspaceContentTypeAliasConditionConfig } from './workspace-content-type-alias.condition.js';
2 changes: 2 additions & 0 deletions src/packages/core/workspace/conditions/manifests.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { manifest as workspaceAliasCondition } from './workspace-alias.condition.js';
import { manifest as workspaceEntityTypeCondition } from './workspace-entity-type.condition.js';
import { manifest as workspaceHasCollectionCondition } from './workspace-has-collection.condition.js';
import { manifest as workspaceContentTypeAliasCondition } from './workspace-content-type-alias.condition.js';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';

export const manifests: Array<ManifestTypes> = [
workspaceAliasCondition,
workspaceEntityTypeCondition,
workspaceHasCollectionCondition,
workspaceContentTypeAliasCondition,
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import { UmbConditionBase } from '../../extension-registry/conditions/condition-base.controller.js';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UMB_PROPERTY_STRUCTURE_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace';
import type {
ManifestCondition,
UmbConditionConfigBase,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';

const ObserveSymbol = Symbol();

/**
* Condition to apply workspace extension based on a content type alias
*/
export class UmbWorkspaceContentTypeAliasCondition
extends UmbConditionBase<WorkspaceContentTypeAliasConditionConfig>
implements UmbExtensionCondition
{
constructor(
host: UmbControllerHost,
args: UmbConditionControllerArguments<WorkspaceContentTypeAliasConditionConfig>,
) {
super(host, args);

let permissionCheck: ((contentTypeAliases: string[]) => boolean) | undefined = undefined;
if (this.config.match) {
permissionCheck = (contentTypeAliases: string[]) => contentTypeAliases.includes(this.config.match!);
} else if (this.config.oneOf) {
permissionCheck = (contentTypeAliases: string[]) =>
contentTypeAliases.some((item) => this.config.oneOf!.includes(item));
}

if (permissionCheck !== undefined) {
this.consumeContext(UMB_PROPERTY_STRUCTURE_WORKSPACE_CONTEXT, (context) => {
this.observe(
context.structure.contentTypeAliases,
(contentTypeAliases) => {
this.permitted = contentTypeAliases ? permissionCheck!(contentTypeAliases) : false;
},
ObserveSymbol,
);
});
} else {
throw new Error(
'Condition `Umb.Condition.WorkspaceContentTypeAlias` could not be initialized properly. Either "match" or "oneOf" must be defined',
);
}
}
}

export type WorkspaceContentTypeAliasConditionConfig =
UmbConditionConfigBase<'Umb.Condition.WorkspaceContentTypeAlias'> & {
/**
* Define a content type alias in which workspace this extension should be available
* @example
* Depends on implementation, but i.e. "article", "image", "blockPage"
*/
match?: string;
/**
* Define one or more content type aliases in which workspace this extension should be available
* @example
* ["article", "image", "blockPage"]
*/
oneOf?: Array<string>;
};

export const manifest: ManifestCondition = {
type: 'condition',
name: 'Workspace Content Type Alias Condition',
alias: 'Umb.Condition.WorkspaceContentTypeAlias',
api: UmbWorkspaceContentTypeAliasCondition,
};
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ export class UmbDocumentBlueprintWorkspaceContext
}
/**
* @function propertyValueByAlias
* @param variantId
* @param {string} propertyAlias
* @returns {Promise<Observable<ReturnType | undefined> | undefined>}
* @description Get an Observable for the value of this property.
Expand Down
Loading