conditions

This commit is contained in:
Niels Lyngsø
2024-09-27 10:43:17 +02:00
parent ad27f138b3
commit b77ca89c73
8 changed files with 147 additions and 6 deletions

View File

@@ -0,0 +1,30 @@
import { UMB_BLOCK_WORKSPACE_CONTEXT } from '../index.js';
import type { BlockEntryIsExposedConditionConfig } from './types.js';
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbConditionControllerArguments, UmbExtensionCondition } from '@umbraco-cms/backoffice/extension-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
export class UmbBlockEntryIsExposedCondition
extends UmbConditionBase<BlockEntryIsExposedConditionConfig>
implements UmbExtensionCondition
{
constructor(host: UmbControllerHost, args: UmbConditionControllerArguments<BlockEntryIsExposedConditionConfig>) {
super(host, args);
this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, (context) => {
this.observe(
context.exposed,
(exposed) => {
console.log('exposed', exposed);
if (exposed !== undefined) {
// Check if equal to match, if match not set it defaults to true.
this.permitted = exposed === (this.config.match !== undefined ? this.config.match : true);
}
},
'observeHasExpose',
);
});
}
}
export default UmbBlockEntryIsExposedCondition;

View File

@@ -13,4 +13,10 @@ export const manifests: Array<ManifestCondition> = [
alias: 'Umb.Condition.BlockEntryShowContentEdit',
api: () => import('./block-entry-show-content-edit.condition.js'),
},
{
type: 'condition',
name: 'Block Workspace Is Exposed Condition',
alias: 'Umb.Condition.BlockWorkspaceIsExposed',
api: () => import('./block-workspace-is-exposed.condition.js'),
},
];

View File

@@ -6,8 +6,16 @@ export type BlockWorkspaceHasSettingsConditionConfig =
export type BlockEntryShowContentEditConditionConfig =
UmbConditionConfigBase<'Umb.Condition.BlockEntryShowContentEdit'>;
export interface BlockEntryIsExposedConditionConfig
extends UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceIsExposed'> {
match?: boolean;
}
declare global {
interface UmbExtensionConditionMap {
umbBlock: BlockEntryShowContentEditConditionConfig | BlockWorkspaceHasSettingsConditionConfig;
umbBlock:
| BlockEntryShowContentEditConditionConfig
| BlockWorkspaceHasSettingsConditionConfig
| BlockEntryIsExposedConditionConfig;
}
}

View File

@@ -7,7 +7,13 @@ import {
UmbWorkspaceIsNewRedirectController,
type ManifestWorkspace,
} from '@umbraco-cms/backoffice/workspace';
import { UmbClassState, UmbObjectState, UmbStringState, observeMultiple } from '@umbraco-cms/backoffice/observable-api';
import {
UmbBooleanState,
UmbClassState,
UmbObjectState,
UmbStringState,
observeMultiple,
} from '@umbraco-cms/backoffice/observable-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UMB_MODAL_CONTEXT, type UmbModalContext } from '@umbraco-cms/backoffice/modal';
import { decodeFilePath, UmbReadOnlyVariantStateManager } from '@umbraco-cms/backoffice/utils';
@@ -60,6 +66,9 @@ export class UmbBlockWorkspaceContext<LayoutDataType extends UmbBlockLayoutBaseM
#variantId = new UmbClassState<UmbVariantId | undefined>(undefined);
readonly variantId = this.#variantId.asObservable();
#exposed = new UmbBooleanState<undefined>(undefined);
readonly exposed = this.#exposed.asObservable();
public readonly readOnlyState = new UmbReadOnlyVariantStateManager(this);
constructor(host: UmbControllerHost, workspaceArgs: { manifest: ManifestWorkspace }) {
@@ -106,6 +115,22 @@ export class UmbBlockWorkspaceContext<LayoutDataType extends UmbBlockLayoutBaseM
},
'observeBlockType',
);
this.observe(
observeMultiple([this.variantId, this.contentKey]),
([variantId, contentKey]) => {
if (!variantId || !contentKey) return;
this.observe(
manager.hasExposeOf(contentKey, variantId),
(exposed) => {
this.#exposed.setValue(exposed);
},
'observeHasExpose',
);
},
'observeVariantIdContentKey',
);
}).asPromise();
this.#retrieveBlockEntries = this.consumeContext(UMB_BLOCK_ENTRIES_CONTEXT, (context) => {

View File

@@ -5,11 +5,11 @@ export const manifests: Array<UmbExtensionManifest> = [
{
type: 'workspaceAction',
kind: 'default',
alias: 'Umb.WorkspaceAction.Block.Save',
name: 'Save Block Type Workspace Action',
alias: 'Umb.WorkspaceAction.Block.SubmitCreate',
name: 'Submit Create Block Workspace Action',
api: UmbSubmitWorkspaceAction,
meta: {
label: '#general_submit',
label: '#general_create',
look: 'primary',
color: 'positive',
},
@@ -18,6 +18,31 @@ export const manifests: Array<UmbExtensionManifest> = [
alias: 'Umb.Condition.WorkspaceAlias',
oneOf: [UMB_BLOCK_WORKSPACE_ALIAS],
},
{
alias: 'Umb.Condition.BlockWorkspaceIsExposed',
match: false,
},
],
},
{
type: 'workspaceAction',
kind: 'default',
alias: 'Umb.WorkspaceAction.Block.SubmitUpdate',
name: 'Submit Update Block Workspace Action',
api: UmbSubmitWorkspaceAction,
meta: {
label: '#general_update',
look: 'primary',
color: 'positive',
},
conditions: [
{
alias: 'Umb.Condition.WorkspaceAlias',
oneOf: [UMB_BLOCK_WORKSPACE_ALIAS],
},
{
alias: 'Umb.Condition.BlockWorkspaceIsExposed',
},
],
},
{

View File

@@ -1 +1,2 @@
export const UMB_WORKSPACE_HAS_COLLECTION_CONDITION = 'Umb.Condition.WorkspaceHasCollection';
export const UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION = 'Umb.Condition.WorkspaceEntityIsNew';

View File

@@ -1,5 +1,5 @@
import type { UMB_WORKSPACE_HAS_COLLECTION_CONDITION } from './const.js';
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
import type { UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION, UMB_WORKSPACE_HAS_COLLECTION_CONDITION } from './const.js';
export type WorkspaceAliasConditionConfig = UmbConditionConfigBase<'Umb.Condition.WorkspaceAlias'> & {
/**
@@ -45,6 +45,11 @@ export type WorkspaceHasCollectionConditionConfig = UmbConditionConfigBase<
typeof UMB_WORKSPACE_HAS_COLLECTION_CONDITION
>;
export interface WorkspaceEntityIsNewConditionConfig
extends UmbConditionConfigBase<typeof UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION> {
match: boolean;
}
declare global {
interface UmbExtensionConditionMap {
umbWorkspaceAlias: WorkspaceAliasConditionConfig;

View File

@@ -0,0 +1,41 @@
import { UMB_SUBMITTABLE_WORKSPACE_CONTEXT } from '../index.js';
import type { WorkspaceEntityIsNewConditionConfig } from './types.js';
import { UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION } from './const.js';
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
import type {
ManifestCondition,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
const ObserveSymbol = Symbol();
export class UmbWorkspaceEntityIsNewCondition
extends UmbConditionBase<WorkspaceEntityIsNewConditionConfig>
implements UmbExtensionCondition
{
constructor(host: UmbControllerHost, args: UmbConditionControllerArguments<WorkspaceEntityIsNewConditionConfig>) {
super(host, args);
this.consumeContext(UMB_SUBMITTABLE_WORKSPACE_CONTEXT, (context) => {
this.observe(
context.isNew,
(isNew) => {
if (isNew !== undefined) {
// Check if equal to match, if match not set it defaults to true.
this.permitted = isNew === (this.config.match !== undefined ? this.config.match : true);
}
},
ObserveSymbol,
);
});
}
}
export const manifest: ManifestCondition = {
type: 'condition',
name: 'Workspace Entity Is New Condition',
alias: UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION,
api: UmbWorkspaceEntityIsNewCondition,
};