Merge pull request #2285 from umbraco/v15/feature/emm-global-condition-types

V15: Global condition types
This commit is contained in:
Niels Lyngsø
2024-09-13 14:33:31 +02:00
committed by GitHub
28 changed files with 137 additions and 108 deletions

View File

@@ -0,0 +1,13 @@
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
export type BlockWorkspaceHasSettingsConditionConfig =
UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceHasSettings'>;
export type BlockEntryShowContentEditConditionConfig =
UmbConditionConfigBase<'Umb.Condition.BlockEntryShowContentEdit'>;
declare global {
interface UmbExtensionConditionMap {
umbBlock: BlockEntryShowContentEditConditionConfig | BlockWorkspaceHasSettingsConditionConfig;
}
}

View File

@@ -4,19 +4,9 @@ import type { UmbSectionUserPermissionConditionConfig } from '../../section/cond
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,
WorkspaceContentTypeAliasConditionConfig,
} from '@umbraco-cms/backoffice/workspace';
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
import type { UmbDocumentUserPermissionConditionConfig } from '@umbraco-cms/backoffice/document';
/* TODO: in theory should't the core package import from other packages.
Are there any other way we can do this?
Niels: Sadly I don't see any other solutions currently. But are very open for ideas :-) now that I think about it maybe there is some ability to extend a global type, similar to the 'declare global' trick we use on Elements.
*/
// temp location to avoid circular dependencies
export type BlockWorkspaceHasSettingsConditionConfig =
UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceHasSettings'>;
@@ -34,7 +24,37 @@ export type ConditionTypes =
| UmbConditionConfigBase
| UmbDocumentUserPermissionConditionConfig
| UmbMultipleAppLanguageConditionConfig
| UmbSectionUserPermissionConditionConfig
| WorkspaceAliasConditionConfig
| WorkspaceContentTypeAliasConditionConfig
| WorkspaceEntityTypeConditionConfig;
| UmbSectionUserPermissionConditionConfig;
type UnionOfProperties<T> = T extends object ? T[keyof T] : never;
declare global {
/**
* This global type allows to declare condition types from its own module.
* @example
```js
declare global {
interface UmbExtensionConditionMap {
My_UNIQUE_CONDITION_NAME: MyExtensionConditionType;
}
}
```
If you have multiple types, you can declare them in this way:
```js
declare global {
interface UmbExtensionConditionMap {
My_UNIQUE_CONDITION_NAME: MyExtensionConditionTypeA | MyExtensionConditionTypeB;
}
}
```
*/
interface UmbExtensionConditionMap {
UMB_CORE: ConditionTypes;
}
/**
* This global type provides a union of all declared manifest types.
* If this is a local package that declares additional Manifest Types, then these will also be included in this union.
*/
type UmbExtensionCondition = UnionOfProperties<UmbExtensionConditionMap>;
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
/**
@@ -6,7 +5,9 @@ import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbr
* For example for content you may wish to create a new document etc
*/
// TODO: create interface for API
export interface ManifestCollectionAction extends ManifestElementAndApi, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestCollectionAction
extends ManifestElementAndApi,
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'collectionAction';
meta: MetaCollectionAction;
}

View File

@@ -1,7 +1,6 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestCollectionView extends ManifestElement, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestCollectionView extends ManifestElement, ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'collectionView';
meta: MetaCollectionView;
}

View File

@@ -1,7 +1,8 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestCollection extends ManifestElementAndApi, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestCollection
extends ManifestElementAndApi,
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'collection';
meta: MetaCollection;
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbAction } from '../../action/action.interface.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
@@ -24,7 +23,7 @@ export interface UmbCurrentUserAction<ArgsMetaType = never> extends UmbAction<Um
export interface ManifestCurrentUserAction<MetaType extends MetaCurrentUserAction = MetaCurrentUserAction>
extends ManifestElementAndApi<UmbControllerHostElement, UmbCurrentUserAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'currentUserAction';
meta: MetaType;
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbDashboardElement } from '../interfaces/index.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestDashboard
extends ManifestElement<UmbDashboardElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'dashboard';
meta: MetaDashboard;
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
import type { UmbEntityAction, UmbEntityActionElement } from '@umbraco-cms/backoffice/entity-action';
import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal';
@@ -9,7 +8,7 @@ import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@um
*/
export interface ManifestEntityAction<MetaType extends MetaEntityAction = MetaEntityAction>
extends ManifestElementAndApi<UmbEntityActionElement, UmbEntityAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'entityAction';
forEntityTypes: Array<string>;
meta: MetaType;

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbEntityBulkActionElement } from '../../entity-bulk-action/entity-bulk-action-element.interface.js';
import type { UmbEntityBulkAction } from '@umbraco-cms/backoffice/entity-bulk-action';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
@@ -9,7 +8,7 @@ import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbr
*/
export interface ManifestEntityBulkAction<MetaType extends MetaEntityBulkAction = MetaEntityBulkAction>
extends ManifestElementAndApi<UmbEntityBulkActionElement, UmbEntityBulkAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'entityBulkAction';
forEntityTypes: Array<string>;
meta: MetaType;

View File

@@ -1,10 +1,9 @@
import type { UmbMenuItemElement } from '../interfaces/menu-item-element.interface.js';
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestWithDynamicConditions, ManifestElement } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestMenuItem
extends ManifestElement<UmbMenuItemElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'menuItem';
meta: MetaMenuItem;
}

View File

@@ -1,11 +1,10 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbPropertyAction } from '../../property-action/components/property-action/property-action.interface.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestPropertyAction<MetaType extends MetaPropertyAction = MetaPropertyAction>
extends ManifestElementAndApi<UmbControllerHostElement, UmbPropertyAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'propertyAction';
forPropertyEditorUis: string[];
meta: MetaType;

View File

@@ -1,8 +1,7 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbApi, ManifestApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
// TODO: Consider adding a ClassType for this manifest. (Currently we cannot know the scope of a repository, therefor we are going with ExtensionApi for now.)
export interface ManifestRepository<ApiType extends UmbApi = UmbApi>
extends ManifestApi<ApiType>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'repository';
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbSectionSidebarAppElement } from '../interfaces/section-sidebar-app-element.interface.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestSectionSidebarApp
extends ManifestElement<UmbSectionSidebarAppElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'sectionSidebarApp';
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbSectionViewElement } from '../interfaces/section-view-element.interface.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestSectionView
extends ManifestElement<UmbSectionViewElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'sectionView';
meta: MetaSectionView;
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbSectionElement } from '../interfaces/index.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestSection
extends ManifestElement<UmbSectionElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'section';
meta: MetaSection;
}

View File

@@ -1,7 +1,6 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestTree extends ManifestElementAndApi, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestTree extends ManifestElementAndApi, ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'tree';
meta: MetaTree;
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbWorkspaceActionMenuItem } from '../../workspace/components/workspace-action-menu-item/workspace-action-menu-item.interface.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
@@ -6,7 +5,7 @@ import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbr
export interface ManifestWorkspaceActionMenuItem<
MetaType extends MetaWorkspaceActionMenuItem = MetaWorkspaceActionMenuItem,
> extends ManifestElementAndApi<UmbControllerHostElement, UmbWorkspaceActionMenuItem<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceActionMenuItem';
/**
* Define which workspace actions this menu item should be shown for.

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UUIInterfaceColor, UUIInterfaceLook } from '@umbraco-cms/backoffice/external/uui';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
import type { UmbWorkspaceAction } from '@umbraco-cms/backoffice/workspace';
@@ -6,7 +5,7 @@ import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controlle
export interface ManifestWorkspaceAction<MetaType extends MetaWorkspaceAction = MetaWorkspaceAction>
extends ManifestElementAndApi<UmbControllerHostElement, UmbWorkspaceAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceAction';
meta: MetaType;
}

View File

@@ -1,6 +1,7 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestApi, ManifestWithDynamicConditions, UmbApi } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestWorkspaceContext extends ManifestWithDynamicConditions<ConditionTypes>, ManifestApi<UmbApi> {
export interface ManifestWorkspaceContext
extends ManifestWithDynamicConditions<UmbExtensionCondition>,
ManifestApi<UmbApi> {
type: 'workspaceContext';
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestWorkspaceFooterApp
extends ManifestElementAndApi<UmbControllerHostElement, any>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceFooterApp';
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbWorkspaceViewElement } from '../interfaces/workspace-view-element.interface.js';
import type {
ManifestWithDynamicConditions,
@@ -8,7 +7,7 @@ import type {
export interface ManifestWorkspaceView<MetaType extends MetaWorkspaceView = MetaWorkspaceView>
extends ManifestWithView<UmbWorkspaceViewElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceView';
meta: MetaType;
}

View File

@@ -0,0 +1 @@
export const UMB_WORKSPACE_HAS_COLLECTION_CONDITION = 'Umb.Condition.WorkspaceHasCollection';

View File

@@ -1,5 +1 @@
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';
export type * from './types.js';

View File

@@ -0,0 +1,55 @@
import type { UMB_WORKSPACE_HAS_COLLECTION_CONDITION } from './const.js';
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
export type WorkspaceAliasConditionConfig = UmbConditionConfigBase<'Umb.Condition.WorkspaceAlias'> & {
/**
* Define the workspace that this extension should be available in
* @example
* "Umb.Workspace.Document"
*/
match?: string;
/**
* Define one or more workspaces that this extension should be available in
* @example
* ["Umb.Workspace.Document", "Umb.Workspace.Media"]
*/
oneOf?: Array<string>;
};
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 type WorkspaceEntityTypeConditionConfig = UmbConditionConfigBase<'Umb.Condition.WorkspaceEntityType'> & {
/**
* Define the workspace that this extension should be available in
* @example
* "Document"
*/
match: string;
};
export type WorkspaceHasCollectionConditionConfig = UmbConditionConfigBase<
typeof UMB_WORKSPACE_HAS_COLLECTION_CONDITION
>;
declare global {
interface UmbExtensionConditionMap {
umbWorkspaceAlias: WorkspaceAliasConditionConfig;
umbWorkspaceContentTypeAlias: WorkspaceContentTypeAliasConditionConfig;
umbWorkspaceEntityType: WorkspaceEntityTypeConditionConfig;
umbWorkspaceHasCollection: WorkspaceHasCollectionConditionConfig;
}
}

View File

@@ -1,8 +1,8 @@
import { UMB_WORKSPACE_CONTEXT, type UmbWorkspaceContext } from '../contexts/index.js';
import type { WorkspaceAliasConditionConfig } from './types.js';
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
import type {
ManifestCondition,
UmbConditionConfigBase,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
@@ -34,21 +34,6 @@ export class UmbWorkspaceAliasCondition
}
}
export type WorkspaceAliasConditionConfig = UmbConditionConfigBase<'Umb.Condition.WorkspaceAlias'> & {
/**
* Define the workspace that this extension should be available in
* @example
* "Umb.Workspace.Document"
*/
match?: string;
/**
* Define one or more workspaces that this extension should be available in
* @example
* ["Umb.Workspace.Document", "Umb.Workspace.Media"]
*/
oneOf?: Array<string>;
};
export const manifest: ManifestCondition = {
type: 'condition',
name: 'Workspace Alias Condition',

View File

@@ -1,9 +1,9 @@
import { UmbConditionBase } from '../../extension-registry/conditions/condition-base.controller.js';
import type { WorkspaceContentTypeAliasConditionConfig } from './types.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';
@@ -49,22 +49,6 @@ export class UmbWorkspaceContentTypeAliasCondition
}
}
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',

View File

@@ -1,8 +1,8 @@
import { UMB_WORKSPACE_CONTEXT } from '../contexts/index.js';
import type { WorkspaceEntityTypeConditionConfig } from './types.js';
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
import type {
ManifestCondition,
UmbConditionConfigBase,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
@@ -20,15 +20,6 @@ export class UmbWorkspaceEntityTypeCondition
}
}
export type WorkspaceEntityTypeConditionConfig = UmbConditionConfigBase<'Umb.Condition.WorkspaceEntityType'> & {
/**
* Define the workspace that this extension should be available in
* @example
* "Document"
*/
match: string;
};
export const manifest: ManifestCondition = {
type: 'condition',
name: 'Workspace Entity Type Condition',

View File

@@ -1,13 +1,16 @@
import { UMB_COLLECTION_WORKSPACE_CONTEXT } from '../contexts/tokens/collection-workspace.context-token.js';
import type { WorkspaceHasCollectionConditionConfig } from './types.js';
import { UMB_WORKSPACE_HAS_COLLECTION_CONDITION } from './const.js';
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
import type {
ManifestCondition,
UmbConditionConfigBase,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
const ObserveSymbol = Symbol();
export class UmbWorkspaceHasCollectionCondition
extends UmbConditionBase<WorkspaceHasCollectionConditionConfig>
implements UmbExtensionCondition
@@ -21,18 +24,12 @@ export class UmbWorkspaceHasCollectionCondition
(hasCollection) => {
this.permitted = hasCollection;
},
'observeHasCollection',
ObserveSymbol,
);
});
}
}
export type WorkspaceHasCollectionConditionConfig = UmbConditionConfigBase<
typeof UMB_WORKSPACE_HAS_COLLECTION_CONDITION
>;
export const UMB_WORKSPACE_HAS_COLLECTION_CONDITION = 'Umb.Condition.WorkspaceHasCollection';
export const manifest: ManifestCondition = {
type: 'condition',
name: 'Workspace Has Collection Condition',