condition types
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>`);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
@@ -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';
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ const menuSectionSidebarApp: ManifestTypes = {
|
||||
conditions: [
|
||||
{
|
||||
alias: 'Umb.Condition.SectionAlias',
|
||||
value: sectionAlias,
|
||||
match: sectionAlias,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -31,7 +31,7 @@ const menuSectionSidebarApp: ManifestSectionSidebarAppMenuWithEntityActionsKind
|
||||
conditions: [
|
||||
{
|
||||
alias: 'Umb.Condition.SectionAlias',
|
||||
value: sectionAlias,
|
||||
match: sectionAlias,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -50,7 +50,7 @@ const menuSectionSidebarApp: ManifestTypes = {
|
||||
conditions: [
|
||||
{
|
||||
alias: 'Umb.Condition.SectionAlias',
|
||||
value: sectionAlias,
|
||||
match: sectionAlias,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -43,7 +43,7 @@ const menuSectionSidebarApp: ManifestTypes = {
|
||||
conditions: [
|
||||
{
|
||||
alias: 'Umb.Condition.SectionAlias',
|
||||
value: sectionAlias,
|
||||
match: sectionAlias,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -16,7 +16,7 @@ const entityActions: Array<ManifestTypes> = [
|
||||
conditions: [
|
||||
{
|
||||
alias: 'Umb.Condition.SectionAlias',
|
||||
value: 'Umb.Section.Content',
|
||||
match: 'Umb.Section.Content',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -27,7 +27,7 @@ const menuSectionSidebarApp: ManifestSectionSidebarAppMenuKind = {
|
||||
conditions: [
|
||||
{
|
||||
alias: 'Umb.Condition.SectionAlias',
|
||||
value: sectionAlias,
|
||||
match: sectionAlias,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -24,7 +24,7 @@ const menuSectionSidebarApp: ManifestTypes = {
|
||||
conditions: [
|
||||
{
|
||||
alias: 'Umb.Condition.SectionAlias',
|
||||
value: sectionAlias,
|
||||
match: sectionAlias,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user