condition types

This commit is contained in:
Niels Lyngsø
2023-07-26 14:35:54 +02:00
parent a1328b996e
commit 638dad5b43
16 changed files with 78 additions and 40 deletions

View File

@@ -1,7 +1,7 @@
import type { UmbConditionConfig } from '../types.js';
import type { UmbConditionConfigBase } from '../types.js';
import { UmbController } from '@umbraco-cms/backoffice/controller-api';
export interface UmbExtensionCondition extends UmbController {
readonly permitted: boolean;
readonly config: UmbConditionConfig;
readonly config: UmbConditionConfigBase;
}

View File

@@ -1,5 +1,5 @@
import { expect, fixture } from '@open-wc/testing';
import type { ManifestCondition, ManifestWithDynamicConditions, UmbConditionConfig } from '../types.js';
import type { ManifestCondition, ManifestWithDynamicConditions, UmbConditionConfigBase } from '../types.js';
import { UmbExtensionRegistry } from '../registry/extension.registry.js';
import type { UmbExtensionCondition } from '../condition/extension-condition.interface.js';
import {
@@ -35,16 +35,16 @@ class UmbTestExtensionController extends UmbBaseExtensionController {
}
class UmbTestConditionAlwaysValid extends UmbBaseController implements UmbExtensionCondition {
config: UmbConditionConfig;
constructor(args: { host: UmbControllerHost; config: UmbConditionConfig }) {
config: UmbConditionConfigBase;
constructor(args: { host: UmbControllerHost; config: UmbConditionConfigBase }) {
super(args.host);
this.config = args.config;
}
permitted = true;
}
class UmbTestConditionAlwaysInvalid extends UmbBaseController implements UmbExtensionCondition {
config: UmbConditionConfig;
constructor(args: { host: UmbControllerHost; config: UmbConditionConfig }) {
config: UmbConditionConfigBase;
constructor(args: { host: UmbControllerHost; config: UmbConditionConfigBase }) {
super(args.host);
this.config = args.config;
}
@@ -143,7 +143,6 @@ describe('UmbBaseExtensionController', () => {
conditions: [
{
alias: 'Umb.Test.Condition.Valid',
value: 'Always valid condition',
},
],
};
@@ -252,7 +251,6 @@ describe('UmbBaseExtensionController', () => {
conditions: [
{
alias: 'Umb.Test.Condition.Invalid',
value: 'Always valid condition',
},
],
};
@@ -330,7 +328,7 @@ describe('UmbBaseExtensionController', () => {
describe('Manifest with one condition that changes over time', () => {
let hostElement: UmbControllerHostElement;
let extensionRegistry: UmbExtensionRegistry<ManifestWithDynamicConditions>;
let manifest: ManifestWithDynamicConditions;
let manifest: ManifestWithDynamicConditions<UmbConditionConfigBase & { value: string }>;
beforeEach(async () => {
hostElement = await fixture(html`<umb-test-controller-host></umb-test-controller-host>`);
@@ -389,7 +387,7 @@ describe('UmbBaseExtensionController', () => {
describe('Manifest with multiple conditions that changes over time', () => {
let hostElement: UmbControllerHostElement;
let extensionRegistry: UmbExtensionRegistry<ManifestWithDynamicConditions>;
let manifest: ManifestWithDynamicConditions;
let manifest: ManifestWithDynamicConditions<UmbConditionConfigBase & { value: string }>;
beforeEach(async () => {
hostElement = await fixture(html`<umb-test-controller-host></umb-test-controller-host>`);

View File

@@ -70,11 +70,11 @@ describe('UmbExtensionElementController', () => {
conditions: [
{
alias: 'Umb.Test.Condition.Delay',
value: '100',
frequency: '100',
},
{
alias: 'Umb.Test.Condition.Delay',
value: '200',
frequency: '200',
},
],
} as any;

View File

@@ -1,4 +1,10 @@
import type { ManifestTypeMap, ManifestBase, SpecificManifestTypeOrManifestBase, ManifestKind } from '../types.js';
import type {
ManifestTypeMap,
ManifestBase,
SpecificManifestTypeOrManifestBase,
ManifestKind,
UmbConditionConfigBase,
} from '../types.js';
import { UmbBasicState } from '@umbraco-cms/backoffice/observable-api';
import { map, Observable, distinctUntilChanged, combineLatest } from '@umbraco-cms/backoffice/external/rxjs';

View File

@@ -56,23 +56,35 @@ export interface ManifestKind<ManifestTypes> {
}
// TODO: Get rid of this type and implements ManifestWithDynamicConditions instead.
export interface ManifestWithConditions<ConditionsType> {
export interface ManifestWithConditions<ConditionType> {
/**
* Set the conditions for when the extension should be loaded
*/
conditions: ConditionsType;
conditions: ConditionType;
}
export interface ManifestWithDynamicConditions extends ManifestBase {
export interface UmbConditionConfigBase {
alias: string;
}
export type ConditionTypeMap<ConditionTypes extends UmbConditionConfigBase> = {
[Condition in ConditionTypes as Condition['alias']]: Condition;
} & {
[key: string]: UmbConditionConfigBase;
};
export type SpecificConditionTypeOrUmbConditionConfigBase<
ConditionTypes extends UmbConditionConfigBase,
T extends keyof ConditionTypeMap<ConditionTypes> | string
> = T extends keyof ConditionTypeMap<ConditionTypes> ? ConditionTypeMap<ConditionTypes>[T] : UmbConditionConfigBase;
export interface ManifestWithDynamicConditions<ConditionTypes extends UmbConditionConfigBase = UmbConditionConfigBase>
extends ManifestBase {
/**
* Set the conditions for when the extension should be loaded
*/
// TODO: Can this be a type union? can we compose types for the ones we know.
conditions?: Array<UmbConditionConfig>;
}
export interface UmbConditionConfig<ValueType = unknown> {
alias: string;
value: ValueType;
conditions?: Array<ConditionTypes>;
}
export interface ManifestWithLoader<LoaderReturnType> extends ManifestBase {

View File

@@ -1,13 +1,17 @@
import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { ManifestCondition, UmbConditionConfig, UmbExtensionCondition } from '@umbraco-cms/backoffice/extension-api';
import {
ManifestCondition,
UmbConditionConfigBase,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
import { UMB_SECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/section';
export class UmbSectionAliasCondition extends UmbBaseController implements UmbExtensionCondition {
config: UmbConditionConfig<string>;
config: SectionAliasConditionConfig;
permitted = false;
#onChange: () => void;
constructor(args: { host: UmbControllerHost; config: UmbConditionConfig<string>; onChange: () => void }) {
constructor(args: { host: UmbControllerHost; config: SectionAliasConditionConfig; onChange: () => void }) {
super(args.host);
this.config = args.config;
this.#onChange = args.onChange;
@@ -17,7 +21,7 @@ export class UmbSectionAliasCondition extends UmbBaseController implements UmbEx
context.alias,
(sectionAlias) => {
// TODO: Would be nice to make the object fully controllable by each condition, but requires some typing system.
this.permitted = sectionAlias === this.config.value;
this.permitted = sectionAlias === this.config.match;
this.#onChange();
}
//,
@@ -50,3 +54,7 @@ export const manifest: ManifestCondition = {
alias: 'Umb.Condition.SectionAlias',
class: UmbSectionAliasCondition,
};
export type SectionAliasConditionConfig = UmbConditionConfigBase & {
match: string;
};

View File

@@ -1,13 +1,17 @@
import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { ManifestCondition, UmbConditionConfig, UmbExtensionCondition } from '@umbraco-cms/backoffice/extension-api';
import {
ManifestCondition,
UmbConditionConfigBase,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
export class UmbSwitchCondition extends UmbBaseController implements UmbExtensionCondition {
#timer?: any;
config: UmbConditionConfig<string>;
config: SwitchConditionConfig;
permitted = false;
#onChange: () => void;
constructor(args: { host: UmbControllerHost; config: UmbConditionConfig<string>; onChange: () => void }) {
constructor(args: { host: UmbControllerHost; config: SwitchConditionConfig; onChange: () => void }) {
super(args.host);
this.config = args.config;
this.#onChange = args.onChange;
@@ -20,7 +24,7 @@ export class UmbSwitchCondition extends UmbBaseController implements UmbExtensio
this.permitted = true;
this.#onChange();
this.startDisapprove();
}, parseInt(this.config.value));
}, parseInt(this.config.frequency));
}
startDisapprove() {
@@ -29,7 +33,7 @@ export class UmbSwitchCondition extends UmbBaseController implements UmbExtensio
this.permitted = false;
this.#onChange();
this.startApprove();
}, parseInt(this.config.value));
}, parseInt(this.config.frequency));
}
destroy() {
@@ -44,3 +48,7 @@ export const manifest: ManifestCondition = {
alias: 'Umb.Condition.Switch',
class: UmbSwitchCondition,
};
export type SwitchConditionConfig = UmbConditionConfigBase & {
frequency: string;
};

View File

@@ -0,0 +1,5 @@
import type { SectionAliasConditionConfig } from './section-alias.condition.js';
import type { SwitchConditionConfig } from './switch.condition.js';
import { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
export type ConditionTypes = SectionAliasConditionConfig | SwitchConditionConfig | UmbConditionConfigBase;

View File

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

View File

@@ -26,7 +26,7 @@ const menuSectionSidebarApp: ManifestTypes = {
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
value: sectionAlias,
match: sectionAlias,
},
],
};

View File

@@ -31,7 +31,7 @@ const menuSectionSidebarApp: ManifestSectionSidebarAppMenuWithEntityActionsKind
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
value: sectionAlias,
match: sectionAlias,
},
],
};

View File

@@ -50,7 +50,7 @@ const menuSectionSidebarApp: ManifestTypes = {
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
value: sectionAlias,
match: sectionAlias,
},
],
};

View File

@@ -43,7 +43,7 @@ const menuSectionSidebarApp: ManifestTypes = {
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
value: sectionAlias,
match: sectionAlias,
},
],
};

View File

@@ -16,7 +16,7 @@ const entityActions: Array<ManifestTypes> = [
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
value: 'Umb.Section.Content',
match: 'Umb.Section.Content',
},
],
},

View File

@@ -27,7 +27,7 @@ const menuSectionSidebarApp: ManifestSectionSidebarAppMenuKind = {
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
value: sectionAlias,
match: sectionAlias,
},
],
};

View File

@@ -24,7 +24,7 @@ const menuSectionSidebarApp: ManifestTypes = {
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
value: sectionAlias,
match: sectionAlias,
},
],
};