From c99b4a96c49190df990982820373cb7ccdb5d329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 12:33:31 +1300 Subject: [PATCH 01/50] Fix saving issue caused by using isNew instead of getIsNew --- .../packages/media/media/workspace/media-workspace.context.ts | 2 +- .../member-types/workspace/member-type-workspace.context.ts | 2 +- .../relation-types/workspace/relation-type-workspace.context.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index 1b0575f358..5e16bf4685 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -69,7 +69,7 @@ export class UmbMediaWorkspaceContext async save() { if (!this.#data.value) return; - if (this.isNew) { + if (this.getIsNew()) { await this.repository.create(this.#data.value); } else { await this.repository.save(this.#data.value.id, this.#data.value); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts index ee32cbdaf9..e40e02d3a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/workspace/member-type-workspace.context.ts @@ -60,7 +60,7 @@ export class UmbMemberTypeWorkspaceContext if (!this.#data.value) return; if (!this.#data.value.id) return; - if (this.isNew) { + if (this.getIsNew()) { await this.repository.create(this.#data.value); } else { await this.repository.save(this.#data.value.id, this.#data.value); diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts index b28d8568d8..f11f17debf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -57,7 +57,7 @@ export class UmbRelationTypeWorkspaceContext if (!this.#data.value) return; if (!this.#data.value.id) return; - if (this.isNew) { + if (this.getIsNew()) { await this.repository.create(this.#data.value); } else { await this.repository.save(this.#data.value.id, this.#data.value); From e93ea1fb44f739acc6dd91f870a9e48222db381f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 12:46:24 +1300 Subject: [PATCH 02/50] add create action --- .../entity-actions/create.action.ts | 15 ++++++++ .../entity-actions/manifests.ts | 35 +++++++++++++++++++ .../packages/settings/relation-types/index.ts | 1 + .../settings/relation-types/manifests.ts | 9 ++++- 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts new file mode 100644 index 0000000000..64bbdf7a1f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts @@ -0,0 +1,15 @@ +import { UmbRelationTypeRepository } from '../repository/relation-type.repository.js'; +import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbCreateRelationTypeEntityAction extends UmbEntityActionBase { + // TODO: Could EntityActions take the manifest instead, for more flexibility? + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { + super(host, repositoryAlias, unique); + } + + async execute() { + // TODO: Generate the href or retrieve it from something? + history.pushState(null, '', `section/settings/workspace/relation-type/create`); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts new file mode 100644 index 0000000000..4dd71b899c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts @@ -0,0 +1,35 @@ +import { UMB_RELATION_TYPE_REPOSITORY_ALIAS } from '../repository/manifests.js'; +import { UMB_RELATION_TYPE_ENTITY_TYPE, UMB_RELATION_TYPE_ROOT_ENTITY_TYPE } from '../index.js'; +import { UmbCreateRelationTypeEntityAction } from './create.action.js'; +import { UmbDeleteEntityAction } from '@umbraco-cms/backoffice/entity-action'; +import { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + alias: 'Umb.EntityAction.RelationType.Delete', + name: 'Delete RelationType Entity Action', + api: UmbDeleteEntityAction, + meta: { + repositoryAlias: UMB_RELATION_TYPE_REPOSITORY_ALIAS, + icon: 'icon-trash', + label: 'Delete', + entityTypes: [UMB_RELATION_TYPE_ENTITY_TYPE], + }, + }, + { + type: 'entityAction', + alias: 'Umb.EntityAction.RelationType.Create', + name: 'Create RelationType Entity Action', + weight: 900, + api: UmbCreateRelationTypeEntityAction, + meta: { + icon: 'icon-add', + label: 'Create', + repositoryAlias: UMB_RELATION_TYPE_REPOSITORY_ALIAS, + entityTypes: [UMB_RELATION_TYPE_ROOT_ENTITY_TYPE], + }, + }, +]; + +export const manifests = [...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/index.ts index 3d76f338dd..7bbcc83722 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/index.ts @@ -1 +1,2 @@ export * from './repository/index.js'; +export * from './entities.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/manifests.ts index ebc952eb39..12f1863639 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/manifests.ts @@ -2,5 +2,12 @@ import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as menuItemManifests } from './menu-item/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; +import { manifests as entityActionManifests } from './entity-actions/manifests.js'; -export const manifests = [...repositoryManifests, ...menuItemManifests, ...treeManifests, ...workspaceManifests]; +export const manifests = [ + ...repositoryManifests, + ...menuItemManifests, + ...treeManifests, + ...workspaceManifests, + ...entityActionManifests, +]; From 543c37c48aae90618783e95f153d6d27a96f1059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:02:07 +1300 Subject: [PATCH 03/50] fix create action --- .../settings/relation-types/entity-actions/create.action.ts | 2 +- .../settings/relation-types/entity-actions/manifests.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts index 64bbdf7a1f..8a03974269 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts @@ -10,6 +10,6 @@ export class UmbCreateRelationTypeEntityAction extends UmbEntityActionBase = [ icon: 'icon-add', label: 'Create', repositoryAlias: UMB_RELATION_TYPE_REPOSITORY_ALIAS, - entityTypes: [UMB_RELATION_TYPE_ROOT_ENTITY_TYPE], + entityTypes: [UMB_RELATION_TYPE_ROOT_ENTITY_TYPE, UMB_RELATION_TYPE_ENTITY_TYPE], }, }, ]; From 2419a8c96cbd297ea8d17d81ecaa18904f3c9f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:02:20 +1300 Subject: [PATCH 04/50] add id to scaffold --- .../repository/sources/relation-type.server.data.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts index d9af0eff76..97d652fe33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts @@ -7,6 +7,7 @@ import { } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { UmbId } from '@umbraco-cms/backoffice/id'; /** * A data source for the Relation Type that fetches data from the server @@ -55,7 +56,9 @@ export class UmbRelationTypeServerDataSource * @memberof UmbRelationTypeServerDataSource */ async createScaffold(parentId: string | null) { - const data: RelationTypeResponseModel = {}; + const data: RelationTypeResponseModel = { + id: UmbId.new(), + }; return { data }; } From 1d66d06199af8374c1661fa686a7c21ec193d5fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:02:44 +1300 Subject: [PATCH 05/50] use isNew in workspace view --- .../relation-type-workspace-view-relation-type.element.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts index 323756f826..2dc63e727a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts @@ -75,13 +75,15 @@ export class UmbRelationTypeWorkspaceViewRelationTypeElement extends UmbLitEleme } #renderParentProperty() { - if (this._relationType?.id) return html`
${this._relationType.parentObjectTypeName}
`; + if (!this.#workspaceContext?.getIsNew() && this._relationType) + return html`
${this._relationType.parentObjectTypeName}
`; return html``; } #renderChildProperty() { - if (this._relationType?.id) return html`
${this._relationType.parentObjectTypeName}
`; + if (!this.#workspaceContext?.getIsNew() && this._relationType) + return html`
${this._relationType.parentObjectTypeName}
`; return html``; } From 7778669f08585f58e343b65596123ad689475532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:55:08 +1300 Subject: [PATCH 06/50] more scaffolding --- .../repository/sources/relation-type.server.data.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts index 97d652fe33..ced4b404f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts @@ -58,6 +58,10 @@ export class UmbRelationTypeServerDataSource async createScaffold(parentId: string | null) { const data: RelationTypeResponseModel = { id: UmbId.new(), + name: '', + alias: '', + isBidirectional: false, + isDependency: false, }; return { data }; From 0ea6d2a49688bec5c2ea13c41b34e6f79ba92748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:29:40 +1300 Subject: [PATCH 07/50] don't refresh page with new id unless the save worked --- .../workspace/relation-type-workspace.context.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts index f11f17debf..05f75db876 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -57,12 +57,16 @@ export class UmbRelationTypeWorkspaceContext if (!this.#data.value) return; if (!this.#data.value.id) return; + let response = undefined; + if (this.getIsNew()) { - await this.repository.create(this.#data.value); + response = await this.repository.create(this.#data.value); } else { - await this.repository.save(this.#data.value.id, this.#data.value); + response = await this.repository.save(this.#data.value.id, this.#data.value); } + if (response.error) return; + // If it went well, then its not new anymore?. this.setIsNew(false); } From 587410d06ae60b9286e301f90d7e14a33447cb8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:30:02 +1300 Subject: [PATCH 08/50] add selects to set the object types --- ...pe-workspace-view-relation-type.element.ts | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts index 2dc63e727a..624f522a20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts @@ -3,6 +3,7 @@ import { UUIBooleanInputEvent, UUIRadioGroupElement, UUIRadioGroupEvent, + UUISelectEvent, UUIToggleElement, } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; @@ -74,18 +75,56 @@ export class UmbRelationTypeWorkspaceViewRelationTypeElement extends UmbLitEleme `; } + #onParentObjectTypeChange(event: UUISelectEvent) { + const value = event.target.value as string; + this.#workspaceContext?.update('parentObjectType', value); + } + #onChildObjectTypeChange(event: UUISelectEvent) { + const value = event.target.value as string; + this.#workspaceContext?.update('childObjectType', value); + } + #renderParentProperty() { if (!this.#workspaceContext?.getIsNew() && this._relationType) return html`
${this._relationType.parentObjectTypeName}
`; - return html``; + //TODO Get the actual list of object types + return html` + >`; } #renderChildProperty() { if (!this.#workspaceContext?.getIsNew() && this._relationType) return html`
${this._relationType.parentObjectTypeName}
`; - return html``; + //TODO Get the actual list of object types + return html` + `; } static styles = [ From 790be6e68b279b660c70ccc456f51d3bb62f59d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:30:37 +1300 Subject: [PATCH 09/50] only show create at the root --- .../settings/relation-types/entity-actions/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts index b21d989f7c..4dd71b899c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts @@ -27,7 +27,7 @@ const entityActions: Array = [ icon: 'icon-add', label: 'Create', repositoryAlias: UMB_RELATION_TYPE_REPOSITORY_ALIAS, - entityTypes: [UMB_RELATION_TYPE_ROOT_ENTITY_TYPE, UMB_RELATION_TYPE_ENTITY_TYPE], + entityTypes: [UMB_RELATION_TYPE_ROOT_ENTITY_TYPE], }, }, ]; From 2b759e904b2c8fcbbb12a462613dc224ca7a7cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 18 Dec 2023 19:34:37 +1300 Subject: [PATCH 10/50] add object type input and repo --- .../src/packages/core/index.ts | 1 + .../src/packages/core/object-type/index.ts | 2 + .../object-type/input-object-type.element.ts | 57 +++++++++++++++++++ .../object-type/object-type.repository.ts | 25 ++++++++ 4 files changed, 85 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/object-type/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/object-type/object-type.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 21661c1e53..e0e9907a0f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -42,6 +42,7 @@ export * from './variant/index.js'; export * from './workspace/index.js'; export * from './culture/index.js'; export * from './temporary-file/index.js'; +export * from './object-type/index.js'; const manifests: Array = [ ...conditionManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/object-type/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/index.ts new file mode 100644 index 0000000000..8e0d365e79 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/index.ts @@ -0,0 +1,2 @@ +export * from './object-type.repository.js'; +export * from './input-object-type.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts new file mode 100644 index 0000000000..cdb0995911 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts @@ -0,0 +1,57 @@ +import { html, customElement, property, query, state, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin, UUISelectElement, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbObjectTypeRepository } from './object-type.repository'; + +@customElement('umb-input-object-type') +export class UmbInputObjectTypeElement extends FormControlMixin(UmbLitElement) { + @query('uui-select') + private select!: UUISelectElement; + + @property() + public set value(value: UUISelectElement['value']) { + this.select.value = value; + } + public get value(): UUISelectElement['value'] { + return this.select.value; + } + + @state() + private _options: UUISelectElement['options'] = []; + + #repository: UmbObjectTypeRepository; + + constructor() { + super(); + + this.#repository = new UmbObjectTypeRepository(this); + + this.#repository.read().then(({ data, error }) => { + if (!data) return; + + this._options = data.items.map((item) => ({ value: item.id, name: item.name ?? '' })); + }); + } + + protected getFormElement() { + return undefined; + } + + #onChange() { + this.dispatchEvent(new CustomEvent('change')); + } + + render() { + return html` `; + } + + static styles = []; +} + +export default UmbInputObjectTypeElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-object-type': UmbInputObjectTypeElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/object-type/object-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/object-type.repository.ts new file mode 100644 index 0000000000..35a175779e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/object-type.repository.ts @@ -0,0 +1,25 @@ +import { ObjectTypesResource } from '@umbraco-cms/backoffice/backend-api'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +export class UmbObjectTypeRepository extends UmbBaseController implements UmbApi { + #host: UmbControllerHost; + + constructor(host: UmbControllerHost) { + super(host); + + this.#host = host; + } + + async #read() { + return tryExecuteAndNotify(this.#host, ObjectTypesResource.getObjectTypes({})); + } + + async read() { + const { data, error } = await this.#read(); + + return { data, error }; + } +} From 09d18bcc8214090eff703618cd47e9222e977bb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 18 Dec 2023 19:34:47 +1300 Subject: [PATCH 11/50] use object type input --- ...pe-workspace-view-relation-type.element.ts | 39 ++++--------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts index 046ed210d1..070f8a4157 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts @@ -88,43 +88,18 @@ export class UmbRelationTypeWorkspaceViewRelationTypeElement extends UmbLitEleme if (!this.#workspaceContext?.getIsNew() && this._relationType) return html`
${this._relationType.parentObjectTypeName}
`; - //TODO Get the actual list of object types - return html` - >`; + return html` + + `; } #renderChildProperty() { if (!this.#workspaceContext?.getIsNew() && this._relationType) - return html`
${this._relationType.parentObjectTypeName}
`; + return html`
${this._relationType.childObjectTypeName}
`; - //TODO Get the actual list of object types - return html` - `; + return html` + + `; } static styles = [ From dc77ca2f50f226eabd9f39389c3103ac3ddfc196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Tue, 19 Dec 2023 19:43:10 +1300 Subject: [PATCH 12/50] fix lint --- .../packages/core/object-type/input-object-type.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts index cdb0995911..3d24c0a152 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/object-type/input-object-type.element.ts @@ -1,7 +1,7 @@ -import { html, customElement, property, query, state, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin, UUISelectElement, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbObjectTypeRepository } from './object-type.repository.js'; +import { html, customElement, property, query, state } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin, UUISelectElement } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbObjectTypeRepository } from './object-type.repository'; @customElement('umb-input-object-type') export class UmbInputObjectTypeElement extends FormControlMixin(UmbLitElement) { From 298c62eb7b4203fded31ad5c9e3c45950f2ebd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:04:25 +1300 Subject: [PATCH 13/50] wip --- .../repository/relation-type.repository.ts | 15 +++++++ .../repository/relation.repository.ts | 39 ++++++++++++++++++ .../sources/relation-type.server.data.ts | 20 +++++++++ .../sources/relation.server.data.ts | 41 +++++++++++++++++++ .../relation-type-workspace.context.ts | 4 ++ 5 files changed, 119 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts index fae1dc1e66..3ebe61d241 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts @@ -59,6 +59,21 @@ export class UmbRelationTypeRepository return this.#detailDataSource.createScaffold(parentId); } + async requestRelationsById(id: string) { + await this.#init; + + // TODO: should we show a notification if the id is missing? + // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? + if (!id) { + throw new Error('Id is missing'); + } + + const { data, error } = await this.#detailDataSource.readRelations(id); + debugger; + + return { data, error }; + } + async requestById(id: string) { await this.#init; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation.repository.ts new file mode 100644 index 0000000000..6ad4eadf1d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation.repository.ts @@ -0,0 +1,39 @@ +import { UmbRelationServerDataSource } from './sources/relation.server.data.js'; +import { type UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; +import { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbRelationRepository extends UmbBaseController implements UmbApi { + #init!: Promise; + + #detailDataSource: UmbRelationServerDataSource; + #notificationContext?: UmbNotificationContext; + + constructor(host: UmbControllerHost) { + super(host); + + // TODO: figure out how spin up get the correct data source + this.#detailDataSource = new UmbRelationServerDataSource(this._host); + + this.#init = Promise.all([ + this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.#notificationContext = instance; + }).asPromise(), + ]); + } + + async requestById(id: string) { + await this.#init; + + // TODO: should we show a notification if the id is missing? + // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? + if (!id) { + throw new Error('Id is missing'); + } + + const { data, error } = await this.#detailDataSource.read(id); + + return { data, error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts index ced4b404f6..f12cddfb2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts @@ -4,6 +4,7 @@ import { RelationTypeResponseModel, CreateRelationTypeRequestModel, UpdateRelationTypeRequestModel, + RelationResource, } from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -49,6 +50,25 @@ export class UmbRelationTypeServerDataSource ); } + /** + * Fetches a Relation Type with the given id from the server + * @param {string} id + * @return {*} + * @memberof UmbRelationTypeServerDataSource + */ + async readRelations(id: string) { + if (!id) { + throw new Error('Id is missing'); + } + + return tryExecuteAndNotify( + this.#host, + RelationResource.getRelationTypeById({ + id, + }), + ); + } + /** * Creates a new Relation Type scaffold * @param {(string | null)} parentId diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation.server.data.ts new file mode 100644 index 0000000000..c9490ee2ca --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation.server.data.ts @@ -0,0 +1,41 @@ +import { RelationResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the Relation that fetches data from the server + * @export + * @class UmbRelationServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbRelationServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbRelationServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbRelationServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches relations by the given id from the server + * @param {string} id + * @return {*} + * @memberof UmbRelationServerDataSource + */ + async read(id: string) { + if (!id) { + throw new Error('Id is missing'); + } + + return tryExecuteAndNotify( + this.#host, + RelationResource.getRelationTypeById({ + id, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts index 07c6993695..299c36a583 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -24,6 +24,10 @@ export class UmbRelationTypeWorkspaceContext async load(id: string) { const { data } = await this.repository.requestById(id); + const { data: relations } = await this.repository.requestRelationsById(id); + + debugger; + if (data) { this.setIsNew(false); this.#data.update(data); From cda8ede2c6ea70cf2550870457c03a6533f8348d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 3 Jan 2024 19:10:06 +1300 Subject: [PATCH 14/50] cleanup --- .../repository/relation-type.repository.ts | 1 - .../workspace/relation-type-workspace.context.ts | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts index 3ebe61d241..2b9af764ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts @@ -69,7 +69,6 @@ export class UmbRelationTypeRepository } const { data, error } = await this.#detailDataSource.readRelations(id); - debugger; return { data, error }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts index 299c36a583..82ef1403d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -24,10 +24,6 @@ export class UmbRelationTypeWorkspaceContext async load(id: string) { const { data } = await this.repository.requestById(id); - const { data: relations } = await this.repository.requestRelationsById(id); - - debugger; - if (data) { this.setIsNew(false); this.#data.update(data); @@ -41,6 +37,11 @@ export class UmbRelationTypeWorkspaceContext this.#data.next(data); } + async getRelations() { + //TODO: How do we test this? + return await this.repository.requestRelationsById(this.getEntityId()); + } + getData() { return this.#data.getValue(); } From 72706c62ae3f646a2bfa2396f3d4705ee8bad6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 3 Jan 2024 19:13:50 +1300 Subject: [PATCH 15/50] fix build --- .../repository/sources/relation-type.server.data.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts index f12cddfb2f..2e91fb1006 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts @@ -82,6 +82,8 @@ export class UmbRelationTypeServerDataSource alias: '', isBidirectional: false, isDependency: false, + path: '', + isSystemRelationType: false, }; return { data }; From bc09e08e5cb5787ce3ee0bd249576ce5383cbcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:49:57 +1300 Subject: [PATCH 16/50] update import map --- src/Umbraco.Web.UI.Client/package.json | 3 ++- src/Umbraco.Web.UI.Client/tsconfig.json | 3 ++- src/Umbraco.Web.UI.Client/web-test-runner.config.mjs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index f3df7fa2e0..ad577347e0 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -62,7 +62,8 @@ "./data-type": "./dist-cms/packages/core/data-type/index.js", "./language": "./dist-cms/packages/settings/languages/index.js", "./logviewer": "./dist-cms/packages/settings/logviewer/index.js", - "./relation-type": "./dist-cms/packages/settings/relation-types/index.js", + "./relation-type": "./dist-cms/packages/relations/relation-types/index.js", + "./relation": "./dist-cms/packages/relations/relations/index.js", "./tags": "./dist-cms/packages/tags/index.js", "./static-file": "./dist-cms/packages/static-file/index.js", "./partial-view": "./dist-cms/packages/templating/partial-views/index.js", diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 3747bafb49..723fc5b01c 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -87,7 +87,8 @@ "@umbraco-cms/backoffice/data-type": ["./src/packages/core/data-type/index.ts"], "@umbraco-cms/backoffice/language": ["./src/packages/settings/languages/index.ts"], "@umbraco-cms/backoffice/logviewer": ["src/packages/log-viewer/index.ts"], - "@umbraco-cms/backoffice/relation-type": ["./src/packages/settings/relation-types/index.ts"], + "@umbraco-cms/backoffice/relation-types": ["src/packages/relations/relation-types/index.ts"], + "@umbraco-cms/backoffice/relations": ["src/packages/relations/relations/index.ts"], "@umbraco-cms/backoffice/tags": ["./src/packages/tags/index.ts"], "@umbraco-cms/backoffice/static-file": ["./src/packages/static-file/index.ts"], diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 91b9dc9e89..17cb0ff4e1 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -106,7 +106,8 @@ export default { '@umbraco-cms/backoffice/data-type': './src/packages/core/data-type/index.ts', '@umbraco-cms/backoffice/language': './src/packages/settings/languages/index.ts', '@umbraco-cms/backoffice/logviewer': './src/packages/settings/logviewer/index.ts', - '@umbraco-cms/backoffice/relation-type': './src/packages/settings/relation-types/index.ts', + '@umbraco-cms/backoffice/relation-type': './src/packages/relations/relation-types/index.ts', + '@umbraco-cms/backoffice/relation': './src/packages/relations/relations/index.ts', '@umbraco-cms/backoffice/tags': './src/packages/tags/index.ts', '@umbraco-cms/backoffice/static-file': './src/packages/static-file/index.ts', '@umbraco-cms/backoffice/partial-view': './src/packages/templating/partial-views/index.ts', From 1047a67e2631f9c8ef6167ff73ee39fc393ce256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Jan 2024 17:23:56 +1300 Subject: [PATCH 17/50] add core package --- .../src/apps/backoffice/backoffice.element.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts index 5044f6ccbd..17d532a707 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts @@ -15,6 +15,7 @@ const CORE_PACKAGES = [ import('../../packages/core/umbraco-package.js'), import('../../packages/settings/umbraco-package.js'), import('../../packages/documents/umbraco-package.js'), + import('../../packages/relations/umbraco-package.js'), import('../../packages/media/umbraco-package.js'), import('../../packages/members/umbraco-package.js'), import('../../packages/dictionary/umbraco-package.js'), From 0760e6d743faf9435a5cb5b668f0ba65bca4941e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Jan 2024 17:24:19 +1300 Subject: [PATCH 18/50] remove relations from settings manifest --- src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts index 3e1e34d012..0d518e2776 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/manifests.ts @@ -1,7 +1,6 @@ import { manifests as dashboardManifests } from './dashboards/manifests.js'; import { manifests as extensionManifests } from './extensions/manifests.js'; import { manifests as languageManifests } from './languages/manifests.js'; -import { manifests as relationTypeManifests } from './relation-types/manifests.js'; import { manifests as settingsMenuManifests } from './menu.manifests.js'; import { manifests as settingsSectionManifests } from './section.manifests.js'; @@ -9,7 +8,6 @@ export const manifests = [ ...dashboardManifests, ...extensionManifests, ...languageManifests, - ...relationTypeManifests, ...settingsMenuManifests, ...settingsSectionManifests, ]; From 0598272b12deed8d8d9e09e0ff6dc53dc418a27b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Jan 2024 17:24:41 +1300 Subject: [PATCH 19/50] make relations package --- .../src/packages/relations/index.ts | 4 ++++ .../src/packages/relations/manifests.ts | 4 ++++ .../relation-types/entities.ts | 0 .../relation-types/entity-actions/create.action.ts | 0 .../relation-types/entity-actions/manifests.ts | 0 .../{settings => relations}/relation-types/index.ts | 0 .../relation-types/manifests.ts | 0 .../relation-types/menu-item/manifests.ts | 0 .../relation-types/repository/index.ts | 0 .../relation-types/repository/manifests.ts | 2 +- .../repository/relation-type.repository.ts | 0 .../repository/relation-type.store.ts | 0 .../repository/sources/relation-type.server.data.ts | 0 .../relation-types/tree/index.ts | 0 .../relation-types/tree/manifests.ts | 0 .../tree/relation-type-tree.repository.ts | 0 .../tree/relation-type-tree.server.data-source.ts | 0 .../relation-types/tree/relation-type-tree.store.ts | 0 .../relation-types/tree/types.ts | 0 .../relation-types/workspace/manifests.ts | 0 .../relation-type-workspace-editor.element.ts | 0 .../workspace/relation-type-workspace.context.ts | 0 .../workspace/relation-type-workspace.element.ts | 0 .../workspace/relation-type-workspace.stories.ts | 0 ...ion-type-workspace-view-relation-type.element.ts | 0 ...ion-type-workspace-view-relation-type.stories.ts | 0 ...workspace-view-relation-type-relation.element.ts | 0 ...workspace-view-relation-type-relation.stories.ts | 0 .../src/packages/relations/relations/entities.ts | 1 + .../src/packages/relations/relations/index.ts | 2 ++ .../src/packages/relations/relations/manifests.ts | 3 +++ .../relations/relations/repository/index.ts | 1 + .../relations/relations/repository/manifests.ts | 13 +++++++++++++ .../relations}/repository/relation.repository.ts | 0 .../repository/sources/relation.server.data.ts | 0 .../src/packages/relations/umbraco-package.ts | 9 +++++++++ 36 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/entities.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/entity-actions/create.action.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/entity-actions/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/menu-item/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/repository/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/repository/manifests.ts (88%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/repository/relation-type.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/repository/relation-type.store.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/repository/sources/relation-type.server.data.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/tree/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/tree/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/tree/relation-type-tree.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/tree/relation-type-tree.server.data-source.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/tree/relation-type-tree.store.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/tree/types.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/relation-type-workspace-editor.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/relation-type-workspace.context.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/relation-type-workspace.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/relation-type-workspace.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings => relations}/relation-types/workspace/views/relation/workspace-view-relation-type-relation.stories.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/relations/entities.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/relations/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/relations/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/{settings/relation-types => relations/relations}/repository/relation.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/{settings/relation-types => relations/relations}/repository/sources/relation.server.data.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/relations/umbraco-package.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/index.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/index.ts new file mode 100644 index 0000000000..2a421f612c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/index.ts @@ -0,0 +1,4 @@ +import './relation-types/index.js'; +import './relations/index.js'; + +export * from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/manifests.ts new file mode 100644 index 0000000000..0df7e9bea0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as relationManifests } from './relations/manifests.js'; +import { manifests as relationTypeManifests } from './relation-types/manifests.js'; + +export const manifests = [...relationTypeManifests, ...relationManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entities.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/entities.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entities.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/entities.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/entity-actions/create.action.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/create.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/entity-actions/create.action.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/entity-actions/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/entity-actions/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/entity-actions/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/menu-item/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/menu-item/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/manifests.ts similarity index 88% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/manifests.ts index aea2595058..0af82d025b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/manifests.ts @@ -1,4 +1,4 @@ -import { UmbRelationTypeRepository } from '../repository/relation-type.repository.js'; +import { UmbRelationTypeRepository } from './relation-type.repository.js'; import { UmbRelationTypeStore } from './relation-type.store.js'; import { ManifestStore, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/relation-type.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/relation-type.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.store.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/relation-type.store.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation-type.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/relation-type.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/sources/relation-type.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation-type.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/sources/relation-type.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/relation-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/relation-type-tree.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/relation-type-tree.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/relation-type-tree.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/relation-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/relation-type-tree.server.data-source.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/relation-type-tree.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/relation-type-tree.server.data-source.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/relation-type-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/relation-type-tree.store.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/relation-type-tree.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/relation-type-tree.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/types.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/tree/types.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace-editor.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace-editor.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace-editor.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.context.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/relation-type-workspace.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/entities.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/entities.ts new file mode 100644 index 0000000000..197d94a6e7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/entities.ts @@ -0,0 +1 @@ +export const UMB_RELATION_ENTITY_TYPE = 'relation'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/index.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/index.ts new file mode 100644 index 0000000000..7bbcc83722 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/index.ts @@ -0,0 +1,2 @@ +export * from './repository/index.js'; +export * from './entities.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/manifests.ts new file mode 100644 index 0000000000..4e1826b900 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as repositoryManifests } from './repository/manifests.js'; + +export const manifests = [...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/index.ts new file mode 100644 index 0000000000..5a2d860e87 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/index.ts @@ -0,0 +1 @@ +export * from './relation.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/manifests.ts new file mode 100644 index 0000000000..0a8b0eacbb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/manifests.ts @@ -0,0 +1,13 @@ +import { UmbRelationRepository } from './relation.repository.js'; +import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_RELATION_REPOSITORY_ALIAS = 'Umb.Repository.Relation'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_RELATION_REPOSITORY_ALIAS, + name: 'Relation Repository', + api: UmbRelationRepository, +}; + +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/relation.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/relation.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/relation.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/sources/relation.server.data.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/settings/relation-types/repository/sources/relation.server.data.ts rename to src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/sources/relation.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/umbraco-package.ts new file mode 100644 index 0000000000..fb27644d7b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/umbraco-package.ts @@ -0,0 +1,9 @@ +export const name = 'Umbraco.Core.Relations'; +export const extensions = [ + { + name: 'Relations Bundle', + alias: 'Umb.Bundle.Relations', + type: 'bundle', + js: () => import('./manifests.js'), + }, +]; From 24d5de0afa56cf671bd295f6284622d6ad424c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Fri, 5 Jan 2024 10:52:53 +1300 Subject: [PATCH 20/50] move handlers to new relations folder --- .../src/mocks/browser-handlers.ts | 4 +- .../mocks/handlers/relation-type.handlers.ts | 76 ------------------- .../src/mocks/handlers/relations/index.ts | 1 + .../relation-types/detail.handlers.ts | 47 ++++++++++++ .../relations/relation-types/index.ts | 4 + .../handlers/relations/relation-types/slug.ts | 1 + .../relations/relation-types/tree.handlers.ts | 36 +++++++++ 7 files changed, 91 insertions(+), 78 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type.handlers.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/detail.handlers.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/slug.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/tree.handlers.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts index cac7ae809b..cc6544084a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -1,5 +1,4 @@ import { handlers as dataTypeHandlers } from './handlers/data-type/index.js'; -import { handlers as relationTypeHandlers } from './handlers/relation-type.handlers.js'; import { handlers as documentTypeHandlers } from './handlers/document-type/index.js'; import { handlers as installHandlers } from './handlers/install.handlers.js'; import * as manifestsHandlers from './handlers/manifests.handlers.js'; @@ -11,6 +10,7 @@ import { handlers as telemetryHandlers } from './handlers/telemetry.handlers.js' import { handlers as userGroupsHandlers } from './handlers/user-group/index.js'; import { handlers as examineManagementHandlers } from './handlers/examine-management.handlers.js'; import { handlers as modelsBuilderHandlers } from './handlers/modelsbuilder.handlers.js'; +import { handlers as relationHandlers } from './handlers/relations/index.js'; import { handlers as healthCheckHandlers } from './handlers/health-check.handlers.js'; import { handlers as profilingHandlers } from './handlers/performance-profiling.handlers.js'; import { handlers as documentHandlers } from './handlers/document/index.js'; @@ -58,7 +58,7 @@ const handlers = [ ...profilingHandlers, ...publishedStatusHandlers, ...redirectManagementHandlers, - ...relationTypeHandlers, + ...relationHandlers, ...rteEmbedHandlers, ...scriptHandlers, ...staticFileHandlers, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type.handlers.ts deleted file mode 100644 index ad208e5d65..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type.handlers.ts +++ /dev/null @@ -1,76 +0,0 @@ -const { rest } = window.MockServiceWorker; -import { umbRelationTypeData } from '../data/relation-type.data.js'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; - -// TODO: add schema -export const handlers = [ - rest.delete('/umbraco/backoffice/relation-type/:id', async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - - umbRelationTypeData.delete([id]); - - return res(ctx.status(200)); - }), - - rest.get('/umbraco/management/api/v1/tree/relation-type/root', (req, res, ctx) => { - const rootItems = umbRelationTypeData.getTreeRoot(); - const response = { - total: rootItems.length, - items: rootItems, - }; - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/relation-type/children', (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); - if (!parentId) return; - - const children = umbRelationTypeData.getTreeItemChildren(parentId); - - const response = { - total: children.length, - items: children, - }; - - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get('/umbraco/management/api/v1/tree/relation-type/item', (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return; - const items = umbRelationTypeData.getTreeItem(ids); - return res(ctx.status(200), ctx.json(items)); - }), - - rest.get(umbracoPath('/relation-type/:id'), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - - const RelationType = umbRelationTypeData.getById(id); - - return res(ctx.status(200), ctx.json(RelationType)); - }), - - rest.post(umbracoPath('/relation-type/:id'), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - - umbRelationTypeData.insert(data); - - return res(ctx.status(200)); - }), - - rest.put(umbracoPath('/relation-type/:id'), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - - umbRelationTypeData.save(id, data); - - return res(ctx.status(200)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts new file mode 100644 index 0000000000..4903a21656 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts @@ -0,0 +1 @@ +export * from './relation-types/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/detail.handlers.ts new file mode 100644 index 0000000000..4f7cf607ba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/detail.handlers.ts @@ -0,0 +1,47 @@ +const { rest } = window.MockServiceWorker; +import { umbRelationTypeData } from '../../../data/relation-type.data.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +// TODO: add schema +export const handlers = [ + rest.delete(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + umbRelationTypeData.delete([id]); + + return res(ctx.status(200)); + }), + + rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + const RelationType = umbRelationTypeData.getById(id); + + return res(ctx.status(200), ctx.json(RelationType)); + }), + + rest.post(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + const data = await req.json(); + if (!data) return; + + umbRelationTypeData.insert(data); + + return res(ctx.status(200)); + }), + + rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + const data = await req.json(); + if (!data) return; + + umbRelationTypeData.save(id, data); + + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/index.ts new file mode 100644 index 0000000000..865bbcb066 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/index.ts @@ -0,0 +1,4 @@ +import { handlers as detailHandlers } from './detail.handlers.js'; +import { handlers as treeHandlers } from './tree.handlers.js'; + +export const handlers = [...detailHandlers, ...treeHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/slug.ts new file mode 100644 index 0000000000..16aae5847e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/relation-type'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/tree.handlers.ts new file mode 100644 index 0000000000..c33fae2727 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/tree.handlers.ts @@ -0,0 +1,36 @@ +const { rest } = window.MockServiceWorker; +import { umbRelationTypeData } from '../../../data/relation-type.data.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const handlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const rootItems = umbRelationTypeData.getTreeRoot(); + const response = { + total: rootItems.length, + items: rootItems, + }; + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + + const children = umbRelationTypeData.getTreeItemChildren(parentId); + + const response = { + total: children.length, + items: children, + }; + + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/item`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbRelationTypeData.getTreeItem(ids); + return res(ctx.status(200), ctx.json(items)); + }), +]; From 4b8cd3a2d5914e49b25c5d3fad49f1b0eed5aa65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:17:50 +1300 Subject: [PATCH 21/50] add missing function to repo --- .../repository/relation.repository.ts | 14 +++++++++++++ .../sources/relation.server.data.ts | 20 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/relation.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/relation.repository.ts index 6ad4eadf1d..f3ec9bc63c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/relation.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/relation.repository.ts @@ -36,4 +36,18 @@ export class UmbRelationRepository extends UmbBaseController implements UmbApi { return { data, error }; } + + async requestChildRelationById(childId: string, relationTypeAlias?: string) { + await this.#init; + + // TODO: should we show a notification if the id is missing? + // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? + if (!childId) { + throw new Error('Id is missing'); + } + + const { data, error } = await this.#detailDataSource.readChildRelations(childId, relationTypeAlias); + + return { data, error }; + } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/sources/relation.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/sources/relation.server.data.ts index c9490ee2ca..9e8845bcb9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/sources/relation.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/repository/sources/relation.server.data.ts @@ -38,4 +38,24 @@ export class UmbRelationServerDataSource { }), ); } + + /** + * Fetches relations by the given id from the server + * @param {string} childId + * @return {*} + * @memberof UmbRelationServerDataSource + */ + async readChildRelations(childId: string, relationTypeAlias?: string) { + if (!childId) { + throw new Error('Id is missing'); + } + + return tryExecuteAndNotify( + this.#host, + RelationResource.getRelationChildRelationByChildId({ + childId, + relationTypeAlias, + }), + ); + } } From b4f5e165338590c90440ad98d16e1e9a8934df57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:11:18 +1300 Subject: [PATCH 22/50] add object type handler and data --- .../data/object-type/object-type.data.ts | 32 +++++++++++++++++++ .../src/mocks/handlers/object-type/index.ts | 3 ++ .../handlers/object-type/item.handlers.ts | 11 +++++++ .../src/mocks/handlers/object-type/slug.ts | 1 + 4 files changed, 47 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/object-type/object-type.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/slug.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/object-type/object-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/object-type/object-type.data.ts new file mode 100644 index 0000000000..ced9f0b6c9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/object-type/object-type.data.ts @@ -0,0 +1,32 @@ +import { UmbEntityData } from '../entity.data.js'; +import type { ObjectTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export const data: Array = [ + { + id: '1', + name: 'Media', + }, + { + id: '2', + name: 'Content', + }, + { + id: '3', + name: 'User', + }, + { + id: '4', + name: 'Document', + }, +]; + +// Temp mocked database +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +class UmbObjectTypeData extends UmbEntityData { + constructor() { + super(data); + } +} + +export const umbObjectTypeData = new UmbObjectTypeData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/index.ts new file mode 100644 index 0000000000..f1df43458a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/index.ts @@ -0,0 +1,3 @@ +import { handlers as itemHandlers } from './item.handlers.js'; + +export const handlers = [...itemHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts new file mode 100644 index 0000000000..0d4426e00d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts @@ -0,0 +1,11 @@ +const { rest } = window.MockServiceWorker; +import { umbObjectTypeData } from '../../data/object-type/object-type.data.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const handlers = [ + rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { + const response = umbObjectTypeData.getAll(); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/slug.ts new file mode 100644 index 0000000000..9809e3f7b7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/object-types'; From b88bd79eca626a73a83fb9cdddca77fe9dba509a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:11:30 +1300 Subject: [PATCH 23/50] relation mocks --- .../src/mocks/browser-handlers.ts | 5 +- .../{ => relations}/relation-type.data.ts | 4 +- .../src/mocks/data/relations/relation.data.ts | 79 +++++++++++++++++++ .../src/mocks/handlers/relations/index.ts | 3 +- .../detail.handlers.ts | 2 +- .../index.ts | 2 +- .../{relation-types => relation-type}/slug.ts | 0 .../tree.handlers.ts | 2 +- .../handlers/relations/relation/index.ts | 3 + .../relations/relation/item.handlers.ts | 36 +++++++++ 10 files changed, 129 insertions(+), 7 deletions(-) rename src/Umbraco.Web.UI.Client/src/mocks/data/{ => relations}/relation-type.data.ts (97%) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts rename src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/{relation-types => relation-type}/detail.handlers.ts (93%) rename src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/{relation-types => relation-type}/index.ts (63%) rename src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/{relation-types => relation-type}/slug.ts (100%) rename src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/{relation-types => relation-type}/tree.handlers.ts (92%) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts index cc6544084a..e1fe61b753 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -10,7 +10,8 @@ import { handlers as telemetryHandlers } from './handlers/telemetry.handlers.js' import { handlers as userGroupsHandlers } from './handlers/user-group/index.js'; import { handlers as examineManagementHandlers } from './handlers/examine-management.handlers.js'; import { handlers as modelsBuilderHandlers } from './handlers/modelsbuilder.handlers.js'; -import { handlers as relationHandlers } from './handlers/relations/index.js'; +import { relationHandlers, relationTypeHandlers } from './handlers/relations/index.js'; +import { handlers as objectTypeHandlers } from './handlers/object-type/index.js'; import { handlers as healthCheckHandlers } from './handlers/health-check.handlers.js'; import { handlers as profilingHandlers } from './handlers/performance-profiling.handlers.js'; import { handlers as documentHandlers } from './handlers/document/index.js'; @@ -59,6 +60,8 @@ const handlers = [ ...publishedStatusHandlers, ...redirectManagementHandlers, ...relationHandlers, + ...objectTypeHandlers, + ...relationTypeHandlers, ...rteEmbedHandlers, ...scriptHandlers, ...staticFileHandlers, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/relation-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation-type.data.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/mocks/data/relation-type.data.ts rename to src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation-type.data.ts index 7de5f02825..ffe6093a17 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/relation-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation-type.data.ts @@ -1,5 +1,5 @@ -import { UmbEntityData } from './entity.data.js'; -import { createEntityTreeItem } from './utils.js'; +import { UmbEntityData } from '../entity.data.js'; +import { createEntityTreeItem } from '../utils.js'; import type { EntityTreeItemResponseModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; // TODO: investigate why we don't get an entity type as part of the RelationTypeResponseModel diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts new file mode 100644 index 0000000000..4576ad3078 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts @@ -0,0 +1,79 @@ +import type { RelationResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export const data: Array = [ + { + parentId: '1', + parentName: 'TEST Parent 1', + childId: '2', + childName: 'Child 1', + createDate: '2021-01-01', + comment: 'Comment 1', + }, + { + parentId: '1', + parentName: 'Parent 1', + childId: '3', + childName: 'Child 2', + createDate: '2021-01-01', + comment: 'Comment 2', + }, + { + parentId: '1', + parentName: 'Parent 1', + childId: '4', + childName: 'Child 3', + createDate: '2021-01-01', + comment: 'Comment 3', + }, + { + parentId: '1', + parentName: 'Parent 1', + childId: '5', + childName: 'Child 4', + createDate: '2021-01-01', + comment: 'Comment 4', + }, + { + parentId: '1', + parentName: 'Parent 1', + childId: '6', + childName: 'Child 5', + createDate: '2021-01-01', + comment: 'Comment 5', + }, + { + parentId: '1', + parentName: 'Parent 1', + childId: '7', + childName: 'Child 6', + createDate: '2021-01-01', + comment: 'Comment 6', + }, + { + parentId: '1', + parentName: 'Parent 1', + childId: '8', + childName: 'Child 7', + createDate: '2021-01-01', + comment: 'Comment 7', + }, + { + parentId: '1', + parentName: 'Parent 1', + childId: '9', + childName: 'Child 8', + createDate: '2021-01-01', + comment: 'Comment 8', + }, +]; + +// Temp mocked database +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +class UmbRelationData extends UmbEntityData { + constructor() { + super(data); + } +} + +export const umbRelationData = new UmbRelationData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts index 4903a21656..c920b2fd73 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/index.ts @@ -1 +1,2 @@ -export * from './relation-types/index.js'; +export * from './relation/index.js'; +export * from './relation-type/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/detail.handlers.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/detail.handlers.ts rename to src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/detail.handlers.ts index 4f7cf607ba..4d2b87e074 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/detail.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbRelationTypeData } from '../../../data/relation-type.data.js'; +import { umbRelationTypeData } from '../../../data/relations/relation-type.data.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/index.ts similarity index 63% rename from src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/index.ts rename to src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/index.ts index 865bbcb066..8b9e50e347 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/index.ts @@ -1,4 +1,4 @@ import { handlers as detailHandlers } from './detail.handlers.js'; import { handlers as treeHandlers } from './tree.handlers.js'; -export const handlers = [...detailHandlers, ...treeHandlers]; +export const relationTypeHandlers = [...detailHandlers, ...treeHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/slug.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/slug.ts rename to src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/slug.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/tree.handlers.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/tree.handlers.ts rename to src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/tree.handlers.ts index c33fae2727..985c09b929 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-types/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation-type/tree.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbRelationTypeData } from '../../../data/relation-type.data.js'; +import { umbRelationTypeData } from '../../../data/relations/relation-type.data.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/index.ts new file mode 100644 index 0000000000..46b27bbdb7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/index.ts @@ -0,0 +1,3 @@ +import { handlers as itemHandlers } from './item.handlers.js'; + +export const relationHandlers = [...itemHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts new file mode 100644 index 0000000000..985c09b929 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts @@ -0,0 +1,36 @@ +const { rest } = window.MockServiceWorker; +import { umbRelationTypeData } from '../../../data/relations/relation-type.data.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const handlers = [ + rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { + const rootItems = umbRelationTypeData.getTreeRoot(); + const response = { + total: rootItems.length, + items: rootItems, + }; + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + + const children = umbRelationTypeData.getTreeItemChildren(parentId); + + const response = { + total: children.length, + items: children, + }; + + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/item`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbRelationTypeData.getTreeItem(ids); + return res(ctx.status(200), ctx.json(items)); + }), +]; From 1244509822e3aca91ed46ef066d10b6b782cd847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:11:50 +1300 Subject: [PATCH 24/50] relation mocks --- .../src/mocks/handlers/relations/relation/slug.ts | 1 + .../relation-types/workspace/relation-type-workspace.stories.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/slug.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/slug.ts new file mode 100644 index 0000000000..ba6bc7ffc4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/relation'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.stories.ts index 72fe092d1c..401fd251ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type-workspace.stories.ts @@ -1,7 +1,7 @@ import './relation-type-workspace.element.js'; import { Meta, Story } from '@storybook/web-components'; -import { data } from '../../../../mocks/data/relation-type.data.js'; +import { data } from '../../../../mocks/data/relations/relation-type.data.js'; import type { UmbRelationTypeWorkspaceElement } from './relation-type-workspace.element.js'; import { html, ifDefined } from '@umbraco-cms/backoffice/external/lit'; From 3959890d6ca0b27a6a97f36b4f1d0c08a4a9c2de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:35:04 +1300 Subject: [PATCH 25/50] relation mocks --- .../src/mocks/data/relations/relation.data.ts | 38 +++++++++++-------- .../relations/relation/item.handlers.ts | 31 +++------------ 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts index 4576ad3078..ca46d6ca9e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts @@ -1,65 +1,66 @@ +import { UmbEntityData } from '../entity.data.js'; import type { RelationResponseModel } from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ { - parentId: '1', - parentName: 'TEST Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '2', childName: 'Child 1', createDate: '2021-01-01', comment: 'Comment 1', }, { - parentId: '1', - parentName: 'Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '3', childName: 'Child 2', createDate: '2021-01-01', comment: 'Comment 2', }, { - parentId: '1', - parentName: 'Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '4', childName: 'Child 3', createDate: '2021-01-01', comment: 'Comment 3', }, { - parentId: '1', - parentName: 'Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '5', childName: 'Child 4', createDate: '2021-01-01', comment: 'Comment 4', }, { - parentId: '1', - parentName: 'Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '6', childName: 'Child 5', createDate: '2021-01-01', comment: 'Comment 5', }, { - parentId: '1', - parentName: 'Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '7', childName: 'Child 6', createDate: '2021-01-01', comment: 'Comment 6', }, { - parentId: '1', - parentName: 'Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '8', childName: 'Child 7', createDate: '2021-01-01', comment: 'Comment 7', }, { - parentId: '1', - parentName: 'Parent 1', + parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentName: 'Relate Document On Copy', childId: '9', childName: 'Child 8', createDate: '2021-01-01', @@ -74,6 +75,11 @@ class UmbRelationData extends UmbEntityData { constructor() { super(data); } + + getRelationsByParentId(id: string) { + const test = this.data.filter((relation) => relation.parentId === id); + return { items: test, total: test.length }; + } } export const umbRelationData = new UmbRelationData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts index 985c09b929..80bae2824b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relations/relation/item.handlers.ts @@ -1,36 +1,15 @@ const { rest } = window.MockServiceWorker; -import { umbRelationTypeData } from '../../../data/relations/relation-type.data.js'; +import { umbRelationData } from '../../../data/relations/relation.data.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const rootItems = umbRelationTypeData.getTreeRoot(); - const response = { - total: rootItems.length, - items: rootItems, - }; - return res(ctx.status(200), ctx.json(response)); - }), + rest.get(umbracoPath(`${UMB_SLUG}/type/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); - if (!parentId) return; - - const children = umbRelationTypeData.getTreeItemChildren(parentId); - - const response = { - total: children.length, - items: children, - }; + const response = umbRelationData.getRelationsByParentId(id); return res(ctx.status(200), ctx.json(response)); }), - - rest.get(umbracoPath(`/tree${UMB_SLUG}/item`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return; - const items = umbRelationTypeData.getTreeItem(ids); - return res(ctx.status(200), ctx.json(items)); - }), ]; From e64b2242a73a5b9c89fcb3006be006e785a43836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:35:15 +1300 Subject: [PATCH 26/50] use api in relation view --- ...ace-view-relation-type-relation.element.ts | 96 +++++-------------- 1 file changed, 25 insertions(+), 71 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts index 58ecf96072..5c57f3cf40 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts @@ -1,6 +1,7 @@ +import { UMB_RELATION_TYPE_WORKSPACE_CONTEXT } from '../../relation-type-workspace.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTableColumn, UmbTableConfig } from '@umbraco-cms/backoffice/components'; +import { UmbTableColumn, UmbTableConfig, UmbTableItem } from '@umbraco-cms/backoffice/components'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { RelationResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @@ -9,7 +10,27 @@ import { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-regis export class UmbWorkspaceViewRelationTypeRelationElement extends UmbLitElement implements UmbWorkspaceViewElement { //TODO Use real data @state() - _relations: Array = MockData; + _relations: Array = []; + + #workspaceContext?: typeof UMB_RELATION_TYPE_WORKSPACE_CONTEXT.TYPE; + + constructor() { + super(); + + this.consumeContext(UMB_RELATION_TYPE_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; + this.#getRelations(); + }); + } + + async #getRelations() { + if (!this.#workspaceContext) { + return; + } + + const response = await this.#workspaceContext.getRelations(); + this._relations = response.data?.items ?? []; + } private _tableConfig: UmbTableConfig = { allowSelection: false, @@ -35,10 +56,10 @@ export class UmbWorkspaceViewRelationTypeRelationElement extends UmbLitElement i }, ]; - private get _tableItems() { + private get _tableItems(): UmbTableItem[] { return this._relations.map((relation) => { return { - key: relation.parentId + '-' + relation.childId, + id: relation.parentId + '-' + relation.childId, // Add the missing id property data: [ { columnAlias: 'parent', @@ -78,73 +99,6 @@ export class UmbWorkspaceViewRelationTypeRelationElement extends UmbLitElement i ]; } -const MockData: Array = [ - { - parentId: '1', - parentName: 'Parent 1', - childId: '2', - childName: 'Child 1', - createDate: '2021-01-01', - comment: 'Comment 1', - }, - { - parentId: '1', - parentName: 'Parent 1', - childId: '3', - childName: 'Child 2', - createDate: '2021-01-01', - comment: 'Comment 2', - }, - { - parentId: '1', - parentName: 'Parent 1', - childId: '4', - childName: 'Child 3', - createDate: '2021-01-01', - comment: 'Comment 3', - }, - { - parentId: '1', - parentName: 'Parent 1', - childId: '5', - childName: 'Child 4', - createDate: '2021-01-01', - comment: 'Comment 4', - }, - { - parentId: '1', - parentName: 'Parent 1', - childId: '6', - childName: 'Child 5', - createDate: '2021-01-01', - comment: 'Comment 5', - }, - { - parentId: '1', - parentName: 'Parent 1', - childId: '7', - childName: 'Child 6', - createDate: '2021-01-01', - comment: 'Comment 6', - }, - { - parentId: '1', - parentName: 'Parent 1', - childId: '8', - childName: 'Child 7', - createDate: '2021-01-01', - comment: 'Comment 7', - }, - { - parentId: '1', - parentName: 'Parent 1', - childId: '9', - childName: 'Child 8', - createDate: '2021-01-01', - comment: 'Comment 8', - }, -]; - export default UmbWorkspaceViewRelationTypeRelationElement; declare global { From 5738a04f21a056d8b25c1a259063ea21673c4988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:38:00 +1300 Subject: [PATCH 27/50] more mock data --- .../src/mocks/data/relations/relation.data.ts | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts index ca46d6ca9e..eb2697f274 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/relations/relation.data.ts @@ -5,7 +5,7 @@ export const data: Array = [ { parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', parentName: 'Relate Document On Copy', - childId: '2', + childId: '1', childName: 'Child 1', createDate: '2021-01-01', comment: 'Comment 1', @@ -13,7 +13,7 @@ export const data: Array = [ { parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', parentName: 'Relate Document On Copy', - childId: '3', + childId: '2', childName: 'Child 2', createDate: '2021-01-01', comment: 'Comment 2', @@ -21,7 +21,7 @@ export const data: Array = [ { parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', parentName: 'Relate Document On Copy', - childId: '4', + childId: '3', childName: 'Child 3', createDate: '2021-01-01', comment: 'Comment 3', @@ -29,43 +29,67 @@ export const data: Array = [ { parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', parentName: 'Relate Document On Copy', - childId: '5', + childId: '4', childName: 'Child 4', createDate: '2021-01-01', comment: 'Comment 4', }, { - parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentId: 'ac68cde6-763f-4231-a751-1101b57defd2', parentName: 'Relate Document On Copy', - childId: '6', + childId: '5', childName: 'Child 5', createDate: '2021-01-01', comment: 'Comment 5', }, { - parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentId: 'ac68cde6-763f-4231-a751-1101b57defd2', parentName: 'Relate Document On Copy', - childId: '7', + childId: '6', childName: 'Child 6', createDate: '2021-01-01', comment: 'Comment 6', }, { - parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentId: '6f9b800c-762c-42d4-85d9-bf40a77d689e', parentName: 'Relate Document On Copy', - childId: '8', + childId: '7', childName: 'Child 7', createDate: '2021-01-01', comment: 'Comment 7', }, { - parentId: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + parentId: 'd421727d-43de-4205-b4c6-037404f309ad', parentName: 'Relate Document On Copy', - childId: '9', + childId: '8', childName: 'Child 8', createDate: '2021-01-01', comment: 'Comment 8', }, + { + parentId: 'd421727d-43de-4205-b4c6-037404f309ad', + parentName: 'Relate Document On Copy', + childId: '9', + childName: 'Child 9', + createDate: '2021-01-01', + comment: 'Comment 9', + }, + { + parentId: 'e9a0a28e-2d5b-4229-ac00-66f2df230513', + parentName: 'Relate Document On Copy', + childId: '10', + childName: 'Child 10', + createDate: '2021-01-01', + comment: 'Comment 10', + }, + { + parentId: 'e9a0a28e-2d5b-4229-ac00-66f2df230513', + parentName: 'Relate Document On Copy', + childId: '11', + childName: 'Child 11', + createDate: '2021-01-01', + comment: 'Comment 11', + }, ]; // Temp mocked database From 401e734f52c06ee74518aece110388652e7eade1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 13:13:46 +1300 Subject: [PATCH 28/50] add story --- .../packages/core/components/table/table.stories.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.stories.ts index bbd06ebb6c..212b566856 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.stories.ts @@ -101,3 +101,14 @@ export const WithHiddenIcons: Story = { }, }, }; + +export const WithHiddenIconsAndDisallowedSelections: Story = { + args: { + items: items, + columns: columns, + config: { + allowSelection: false, + hideIcon: true, + }, + }, +}; From 2ab22e1790bbf61f6a4d204c9ad5fa27de3e324f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Jan 2024 13:13:49 +1300 Subject: [PATCH 29/50] fix --- .../src/packages/core/components/table/table.element.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts index 70a3f182c4..1242c59aa8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts @@ -155,7 +155,11 @@ export class UmbTableElement extends LitElement { render() { return html` - + 'width: 60px', + )}> ${this._renderHeaderCheckboxCell()} ${this.columns.map((column) => this._renderHeaderCell(column))} From fb93d66ad6dc0c9a81353c2af3e15269907be42f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 18:39:35 +0000 Subject: [PATCH 30/50] Bump typescript from 5.3.2 to 5.3.3 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.3.2 to 5.3.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.3.2...v5.3.3) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 8 ++++---- src/Umbraco.Web.UI.Client/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 44f780f893..a41d24b123 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -76,7 +76,7 @@ "storybook": "7.6.5", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.8", - "typescript": "^5.3.2", + "typescript": "^5.3.3", "typescript-json-schema": "^0.62.0", "vite": "^4.4.12", "vite-plugin-static-copy": "^0.17.0", @@ -21611,9 +21611,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index f3df7fa2e0..2930fa80bd 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -202,7 +202,7 @@ "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.8", "typescript-json-schema": "^0.62.0", - "typescript": "^5.3.2", + "typescript": "^5.3.3", "vite-plugin-static-copy": "^0.17.0", "vite-tsconfig-paths": "^4.2.0", "vite": "^4.4.12", From aa1c4455d63acba560c545a078c7565954fad8cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 18:39:13 +0000 Subject: [PATCH 31/50] Bump marked from 11.1.0 to 11.1.1 Bumps [marked](https://github.com/markedjs/marked) from 11.1.0 to 11.1.1. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json) - [Commits](https://github.com/markedjs/marked/compare/v11.1.0...v11.1.1) --- updated-dependencies: - dependency-name: marked dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 8 ++++---- src/Umbraco.Web.UI.Client/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index a41d24b123..e058c10403 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -18,7 +18,7 @@ "element-internals-polyfill": "^1.3.9", "lit": "^2.8.0", "lodash-es": "4.17.21", - "marked": "^11.1.0", + "marked": "^11.1.1", "monaco-editor": "^0.45.0", "rxjs": "^7.8.1", "tinymce": "^6.8.2", @@ -16463,9 +16463,9 @@ } }, "node_modules/marked": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.0.tgz", - "integrity": "sha512-fvKJWAPEafVj1dwGwcPI5mBB/0pvViL6NlCbNDG1HOIRwwAU/jeMoFxfbRLuirO1wRH7m4yPvBqD/O1wyWvayw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.1.tgz", + "integrity": "sha512-EgxRjgK9axsQuUa/oKMx5DEY8oXpKJfk61rT5iY3aRlgU6QJtUcxU5OAymdhCvWvhYcd9FKmO5eQoX8m9VGJXg==", "bin": { "marked": "bin/marked.js" }, diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 2930fa80bd..64502a378c 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -143,7 +143,7 @@ "element-internals-polyfill": "^1.3.9", "lit": "^2.8.0", "lodash-es": "4.17.21", - "marked": "^11.1.0", + "marked": "^11.1.1", "monaco-editor": "^0.45.0", "rxjs": "^7.8.1", "tinymce-i18n": "^23.12.4", From 5295c6fc6d89897a8e7bb968cd710732eb47f6d1 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Thu, 4 Jan 2024 16:00:26 +0000 Subject: [PATCH 32/50] Property Editor: Number - set numeric value This was setting the value as a `string`, which would cause issues when used in certain scenarios, e.g. MNTP min/max configuration, the value would assumed to be numeric, but it'd be a string, so conditions like `max === 1` would be false, as it'd be `"1"` instead. Ensuring the value is a `number` before the "property-value-change" event is sent appears to resolve this issue. --- .../uis/number/property-editor-ui-number.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/number/property-editor-ui-number.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/number/property-editor-ui-number.element.ts index b7c369276c..548c303821 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/number/property-editor-ui-number.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/number/property-editor-ui-number.element.ts @@ -6,8 +6,8 @@ import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/ @customElement('umb-property-editor-ui-number') export class UmbPropertyEditorUINumberElement extends UmbLitElement implements UmbPropertyEditorUiElement { - @property() - value = ''; + @property({ type: Number }) + value: undefined | number = undefined; @state() private _max?: number; @@ -26,7 +26,7 @@ export class UmbPropertyEditorUINumberElement extends UmbLitElement implements U } private onInput(e: InputEvent) { - this.value = (e.target as HTMLInputElement).value; + this.value = Number((e.target as HTMLInputElement).value); this.dispatchEvent(new CustomEvent('property-value-change')); } From dbbb5067cf0bd73275b3ff46f805a09b49866751 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Thu, 4 Jan 2024 15:51:35 +0000 Subject: [PATCH 33/50] Integer schema name correction --- .../packages/core/property-editor/schemas/Umbraco.Integer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.Integer.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.Integer.ts index 726fd458d4..e4a699a8b9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.Integer.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/schemas/Umbraco.Integer.ts @@ -2,7 +2,7 @@ import type { ManifestPropertyEditorSchema } from '@umbraco-cms/backoffice/exten export const manifest: ManifestPropertyEditorSchema = { type: 'propertyEditorSchema', - name: 'Decimal', + name: 'Integer', alias: 'Umbraco.Integer', meta: { defaultPropertyEditorUiAlias: 'Umb.PropertyEditorUi.Integer', From 103c5fc9d7a5835315d4a597ad7df1f27a6f584c Mon Sep 17 00:00:00 2001 From: Markus Johansson Date: Thu, 28 Dec 2023 11:25:48 +0100 Subject: [PATCH 34/50] #1012 label changes for pickers --- .../modal/common/tree-picker/tree-picker-modal.element.ts | 4 ++-- .../components/input-document/input-document.element.ts | 4 ++-- .../media/media/components/input-media/input-media.element.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts index 9cd0f507f9..69868cf5dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts @@ -51,8 +51,8 @@ export class UmbTreePickerModalElement
- - + +
`; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts index 174b3ef549..504d487406 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts @@ -115,7 +115,7 @@ export class UmbInputDocumentElement extends FormControlMixin(UmbLitElement) { id="add-button" look="placeholder" @click=${() => this.#pickerContext.openPicker()} - label=${this.localize.term('general_add')}>`; + label=${this.localize.term('general_choose')}>`; } private _renderItem(item: DocumentItemResponseModel) { @@ -127,7 +127,7 @@ export class UmbInputDocumentElement extends FormControlMixin(UmbLitElement) { this.#pickerContext.requestRemoveItem(item.id!)} label="Remove document ${item.name}" - >Remove${this.localize.term('general_remove')} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts index d350b8ac7f..9b802c6757 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts @@ -101,9 +101,9 @@ export class UmbInputMediaElement extends FormControlMixin(UmbLitElement) { #renderButton() { if (this._items && this.max && this._items.length >= this.max) return; return html` - this.#pickerContext.openPicker()} label="open"> + this.#pickerContext.openPicker()} label=${this.localize.term('general_choose')}> - Add + ${this.localize.term('general_choose')} `; } From c6c45cf6cc1b6772189de5aac14d6d38df59a849 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 20 Dec 2023 17:39:18 +0000 Subject: [PATCH 35/50] [WIP] Adds Member Type picker A placeholder component for ``, for use with the Multinode Treepicker property-editor. Code files were largely duplicated from `umb-document-type-input`. The modal context code hasn't been copied over as it requires substantial work with developing the Member Type repository. --- .../token/member-type-picker-modal.token.ts | 18 ++ .../members/member-types/components/index.ts | 1 + .../input-member-type.context.ts | 13 ++ .../input-member-type.element.ts | 179 ++++++++++++++++++ .../packages/members/member-types/index.ts | 5 + .../members/member-types/manifests.ts | 10 +- .../members/member-types/repository/index.ts | 3 +- 7 files changed, 224 insertions(+), 5 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/modal/token/member-type-picker-modal.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member-types/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/member-type-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/member-type-picker-modal.token.ts new file mode 100644 index 0000000000..cbb0d5f635 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/member-type-picker-modal.token.ts @@ -0,0 +1,18 @@ +import { UmbModalToken, UmbPickerModalValue, UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import { UmbEntityTreeItemModel } from '@umbraco-cms/backoffice/tree'; + +export type UmbMemberTypePickerModalData = UmbTreePickerModalData; +export type UmbMemberTypePickerModalValue = UmbPickerModalValue; + +export const UMB_MEMBER_TYPE_PICKER_MODAL = new UmbModalToken( + 'Umb.Modal.TreePicker', + { + modal: { + type: 'sidebar', + size: 'small', + }, + data: { + treeAlias: 'Umb.Tree.MemberType', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/index.ts new file mode 100644 index 0000000000..eacc86c77b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/index.ts @@ -0,0 +1 @@ +import './input-member-type/input-member-type.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.context.ts new file mode 100644 index 0000000000..e2dbb59411 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.context.ts @@ -0,0 +1,13 @@ +import { UMB_MEMBER_TYPE_PICKER_MODAL } from '../../../../core/modal/token/member-type-picker-modal.token.js'; +import { UMB_MEMBER_TYPE_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { MemberTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMemberTypePickerContext extends UmbPickerInputContext { + constructor(host: UmbControllerHostElement) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + super(host, UMB_MEMBER_TYPE_REPOSITORY_ALIAS, UMB_MEMBER_TYPE_PICKER_MODAL); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.element.ts new file mode 100644 index 0000000000..12e3e64ffe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/components/input-member-type/input-member-type.element.ts @@ -0,0 +1,179 @@ +import { UmbMemberTypePickerContext } from './input-member-type.context.js'; +import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { MemberTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; + +@customElement('umb-input-member-type') +export class UmbMemberTypeInputElement extends FormControlMixin(UmbLitElement) { + /** + * This is a minimum amount of selected items in this input. + * @type {number} + * @attr + * @default 0 + */ + @property({ type: Number }) + public get min(): number { + return this.#pickerContext.min; + } + public set min(value: number) { + this.#pickerContext.min = value; + } + + /** + * Min validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + minMessage = 'This field need more items'; + + /** + * This is a maximum amount of selected items in this input. + * @type {number} + * @attr + * @default Infinity + */ + @property({ type: Number }) + public get max(): number { + return this.#pickerContext.max; + } + public set max(value: number) { + this.#pickerContext.max = value; + } + + /** + * Max validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + maxMessage = 'This field exceeds the allowed amount of items'; + + public get selectedIds(): Array { + return this.#pickerContext.getSelection(); + } + public set selectedIds(ids: Array) { + this.#pickerContext.setSelection(ids); + } + + @property() + public set value(idsString: string) { + // Its with full purpose we don't call super.value, as thats being handled by the observation of the context selection. + this.selectedIds = splitStringToArray(idsString); + } + + @property() + get pickableFilter() { + return this.#pickerContext.pickableFilter; + } + set pickableFilter(newVal) { + this.#pickerContext.pickableFilter = newVal; + } + + @state() + private _items?: Array; + + #pickerContext = new UmbMemberTypePickerContext(this); + + constructor() { + super(); + } + + connectedCallback() { + super.connectedCallback(); + + this.addValidator( + 'rangeUnderflow', + () => this.minMessage, + () => !!this.min && this.#pickerContext.getSelection().length < this.min, + ); + + this.addValidator( + 'rangeOverflow', + () => this.maxMessage, + () => !!this.max && this.#pickerContext.getSelection().length > this.max, + ); + + this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(','))); + this.observe(this.#pickerContext.selectedItems, (selectedItems) => (this._items = selectedItems)); + } + + protected _openPicker() { + this.#pickerContext.openPicker({ + hideTreeRoot: true, + }); + } + + protected getFormElement() { + return undefined; + } + + render() { + return html` + ${this.#renderItems()} + ${this.#renderAddButton()} + `; + } + + #renderItems() { + if (!this._items) return; + // TODO: Add sorting. [LK] + return html` + ${repeat( + this._items, + (item) => item.id, + (item) => this._renderItem(item), + )} + `; + } + + #renderAddButton() { + if (this.max > 0 && this.selectedIds.length >= this.max) return; + return html` + ${this.localize.term('general_choose')} + `; + } + + private _renderItem(item: MemberTypeItemResponseModel) { + if (!item.id) return; + return html` + + + this.#pickerContext.requestRemoveItem(item.id!)} + label="Remove Member Type ${item.name}" + >${this.localize.term('general_remove')} + + + `; + } + + static styles = [ + css` + #add-button { + width: 100%; + } + `, + ]; +} + +export default UmbMemberTypeInputElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-member-type': UmbMemberTypeInputElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/index.ts new file mode 100644 index 0000000000..48ebd24242 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/index.ts @@ -0,0 +1,5 @@ +import './components/index.js'; + +export * from './components/index.js'; +export * from './repository/index.js'; +export * from './entity.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/manifests.ts index c2dbcfe939..47e4ffa227 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/manifests.ts @@ -1,13 +1,15 @@ +import { manifests as entityActionsManifests } from './entity-actions/manifests.js'; import { manifests as menuItemManifests } from './menu-item/manifests.js'; -import { manifests as treeManifests } from './tree/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as treeManifests } from './tree/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; -import { manifests as entityActionManifests } from './entity-actions/manifests.js'; + +import './components/index.js'; export const manifests = [ + ...entityActionsManifests, ...menuItemManifests, - ...treeManifests, ...repositoryManifests, + ...treeManifests, ...workspaceManifests, - ...entityActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/index.ts index 8cddbed0b2..8be388a62c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-types/repository/index.ts @@ -1 +1,2 @@ -export { UmbMemberTypeRepository } from './member-type.repository.js'; +export * from './member-type.repository.js'; +export * from './manifests.js'; From 550c7710cc3fa271bfe87ce82e9fabfc2a6bf1ee Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 3 Jan 2024 15:29:15 +0000 Subject: [PATCH 36/50] [WIP] Input Member picker A placeholder component for ``, for use with the Multinode Treepicker property-editor. Code files were largely duplicated from `input-document`. The modal context code hasn't been copied over as it requires substantial work with developing the Member repository. --- .../src/packages/members/manifests.ts | 2 + .../members/members/components/index.ts | 3 + .../input-member/input-member.element.ts | 171 ++++++++++++++++++ .../input-member/input-member.stories.ts | 14 ++ .../input-member/input-member.test.ts | 20 ++ .../src/packages/members/members/index.ts | 3 + 6 files changed, 213 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/members/components/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.stories.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/manifests.ts index f928869b69..a643b8be78 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/manifests.ts @@ -4,6 +4,8 @@ import { manifests as memberGroupManifests } from './member-groups/manifests.js' import { manifests as memberTypeManifests } from './member-types/manifests.js'; import { manifests as memberManifests } from './members/manifests.js'; +import './members/components/index.js'; + export const manifests = [ ...memberSectionManifests, ...menuSectionManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/index.ts new file mode 100644 index 0000000000..90f47707f8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/index.ts @@ -0,0 +1,3 @@ +import './input-member/input-member.element.js'; + +export * from './input-member/input-member.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.element.ts new file mode 100644 index 0000000000..d1106e1f2e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.element.ts @@ -0,0 +1,171 @@ +import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { MemberItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; + +@customElement('umb-input-member') +export class UmbInputMemberElement extends FormControlMixin(UmbLitElement) { + /** + * This is a minimum amount of selected items in this input. + * @type {number} + * @attr + * @default 0 + */ + @property({ type: Number }) + public get min(): number { + //return this.#pickerContext.min; + return 0; + } + public set min(value: number) { + //this.#pickerContext.min = value; + } + + /** + * Min validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + minMessage = 'This field need more items'; + + /** + * This is a maximum amount of selected items in this input. + * @type {number} + * @attr + * @default Infinity + */ + @property({ type: Number }) + public get max(): number { + //return this.#pickerContext.max; + return Infinity; + } + public set max(value: number) { + //this.#pickerContext.max = value; + } + + /** + * Max validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + maxMessage = 'This field exceeds the allowed amount of items'; + + public get selectedIds(): Array { + //return this.#pickerContext.getSelection(); + return []; + } + public set selectedIds(ids: Array) { + //this.#pickerContext.setSelection(ids); + } + + @property() + public set value(idsString: string) { + // Its with full purpose we don't call super.value, as thats being handled by the observation of the context selection. + this.selectedIds = splitStringToArray(idsString); + } + + @state() + private _items?: Array; + + // TODO: Create the `UmbMemberPickerContext` [LK] + //#pickerContext = new UmbMemberPickerContext(this); + + constructor() { + super(); + + // this.addValidator( + // 'rangeUnderflow', + // () => this.minMessage, + // () => !!this.min && this.#pickerContext.getSelection().length < this.min, + // ); + + // this.addValidator( + // 'rangeOverflow', + // () => this.maxMessage, + // () => !!this.max && this.#pickerContext.getSelection().length > this.max, + // ); + + // this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(','))); + // this.observe(this.#pickerContext.selectedItems, (selectedItems) => (this._items = selectedItems)); + } + + protected _openPicker() { + console.log("member.openPicker"); + // this.#pickerContext.openPicker({ + // hideTreeRoot: true, + // }); + } + + protected _requestRemoveItem(item: MemberItemResponseModel){ + console.log("member.requestRemoveItem", item); + //this.#pickerContext.requestRemoveItem(item.id!); + } + + protected getFormElement() { + return undefined; + } + + render() { + return html` + ${this.#renderItems()} + ${this.#renderAddButton()} + `; + } + + #renderItems() { + if (!this._items) return; + // TODO: Add sorting. [LK] + return html`${repeat( + this._items, + (item) => item.id, + (item) => this._renderItem(item), + )} + `; + } + + #renderAddButton() { + if (this.max > 0 && this.selectedIds.length >= this.max) return; + return html``; + } + + private _renderItem(item: MemberItemResponseModel) { + if (!item.id) return; + return html` + + + + this._requestRemoveItem(item)} + label="Remove member ${item.name}" + >Remove + + + `; + } + + static styles = [ + css` + #add-button { + width: 100%; + } + `, + ]; +} + +export default UmbInputMemberElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-member': UmbInputMemberElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.stories.ts new file mode 100644 index 0000000000..7bca7fc5db --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.stories.ts @@ -0,0 +1,14 @@ +import { Meta, StoryObj } from '@storybook/web-components'; +import './input-member.element.js'; +import type { UmbInputMemberElement } from './input-member.element.js'; + +const meta: Meta = { + title: 'Components/Inputs/Member', + component: 'umb-input-member', +}; + +export default meta; +type Story = StoryObj; +export const Overview: Story = { + args: {}, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.test.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.test.ts new file mode 100644 index 0000000000..7bef94720e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/components/input-member/input-member.test.ts @@ -0,0 +1,20 @@ +import { expect, fixture, html } from '@open-wc/testing'; +import { UmbInputMemberElement } from './input-member.element.js'; +import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; +describe('UmbInputMemberElement', () => { + let element: UmbInputMemberElement; + + beforeEach(async () => { + element = await fixture(html` `); + }); + + it('is defined with its own instance', () => { + expect(element).to.be.instanceOf(UmbInputMemberElement); + }); + + if ((window as any).__UMBRACO_TEST_RUN_A11Y_TEST) { + it('passes the a11y audit', async () => { + await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); + }); + } +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/members/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/members/index.ts index 3d76f338dd..f23e6176e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/members/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/members/index.ts @@ -1 +1,4 @@ +import './components/index.js'; + +export * from './components/index.js'; export * from './repository/index.js'; From d67f4f26effdcad74b20e5b7be85470459893cc2 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 3 Jan 2024 12:04:35 +0000 Subject: [PATCH 37/50] Selection manager: fixes initial value When the modal initially opens, the `#multiple` is `false`, (regardless of how it is configured), so the initial value is set to `[undefined]`. Then when the `#multiple` is observed as `true` (there must be an underlying bug with the modal context code here), then the `#selection` array already has an initial value of `[undefined]` so will append newly selected values to that array. I discovered this issue due to a bug with the Tree Picker editor. --- .../src/shared/utils/selection-manager/selection.manager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts index b71f1a66d6..ff63bfd93d 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts @@ -57,7 +57,7 @@ export class UmbSelectionManager extends UmbBaseController { public setSelection(value: Array) { if (this.getSelectable() === false) return; if (value === undefined) throw new Error('Value cannot be undefined'); - const newSelection = this.getMultiple() ? value : [value[0]]; + const newSelection = this.getMultiple() ? value : value.length > 0 ? [value[0]] : value; this.#selection.next(newSelection); } @@ -78,7 +78,7 @@ export class UmbSelectionManager extends UmbBaseController { public setMultiple(value: boolean) { this.#multiple.next(value); - /* If multiple is set to false, and the current selection is more than one, + /* If multiple is set to false, and the current selection is more than one, then we need to set the selection to the first item. */ if (value === false && this.getSelection().length > 1) { this.setSelection([this.getSelection()[0]]); From 877274cac47d30114c1b75d418817ee4159bcc56 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Thu, 4 Jan 2024 15:36:19 +0000 Subject: [PATCH 38/50] Refactored the initial selection value --- .../src/shared/utils/selection-manager/selection.manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts index ff63bfd93d..477a6d3daa 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts @@ -57,7 +57,7 @@ export class UmbSelectionManager extends UmbBaseController { public setSelection(value: Array) { if (this.getSelectable() === false) return; if (value === undefined) throw new Error('Value cannot be undefined'); - const newSelection = this.getMultiple() ? value : value.length > 0 ? [value[0]] : value; + const newSelection = this.getMultiple() ? value : value.slice(0, 1); this.#selection.next(newSelection); } From 0e7fca53634e780222288be4f069fda77cac360e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 13 Dec 2023 11:53:56 +1300 Subject: [PATCH 39/50] Dont do full page reload when creating language from the entity action button --- .../entity-actions/language-create-entity-action.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/entity-actions/language-create-entity-action.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/entity-actions/language-create-entity-action.ts index 908018aa52..aae26d3732 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/languages/entity-actions/language-create-entity-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/languages/entity-actions/language-create-entity-action.ts @@ -8,8 +8,8 @@ export class UmbLanguageCreateEntityAction extends UmbEntityActionBase Date: Tue, 19 Dec 2023 16:11:36 +0000 Subject: [PATCH 40/50] Added `input-document-source` element This is different to `input-document` as it will also contain the DynamicRoot functionality. --- .../documents/documents/components/index.ts | 1 + .../input-document-source.element.ts | 108 ++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-source/input-document-source.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts index a644a4c547..ce63360331 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts @@ -1,2 +1,3 @@ export * from './input-document/input-document.element.js'; export * from './input-document-granular-permission/input-document-granular-permission.element.js'; +export * from './input-document-source/input-document-source.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-source/input-document-source.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-source/input-document-source.element.ts new file mode 100644 index 0000000000..188d196417 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-source/input-document-source.element.ts @@ -0,0 +1,108 @@ +import { UmbDocumentPickerContext } from '../input-document/input-document.context.js'; +import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin, UUIButtonElement } from '@umbraco-cms/backoffice/external/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { DocumentItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +@customElement('umb-input-document-source') +export class UmbInputDocumentSourceElement extends FormControlMixin(UmbLitElement) { + public get nodeId(): string | null | undefined { + return this.#pickerContext.getSelection()[0]; + } + public set nodeId(id: string | null | undefined) { + const selection = id ? [id] : []; + this.#pickerContext.setSelection(selection); + } + + @property() + public set value(id: string) { + this.nodeId = id; + } + + @state() + private _items?: Array; + + #pickerContext = new UmbDocumentPickerContext(this); + + constructor() { + super(); + + this.#pickerContext.max = 1; + + this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(','))); + this.observe(this.#pickerContext.selectedItems, (selectedItems) => (this._items = selectedItems)); + } + + protected getFormElement() { + return undefined; + } + + // TODO: Wire up the DynamicRoot picker feature. [LK] + private _openDynamicRootPicker(e: Event) { + console.log('openDynamicRootPicker', e); + const btn = e.target as UUIButtonElement; + btn.color = 'warning'; + btn.label = 'TODO!'; + btn.look = 'primary'; + } + + render() { + return html` + ${this._items + ? html` ${repeat( + this._items, + (item) => item.id, + (item) => this._renderItem(item), + )} + ` + : ''} + ${this.#renderButtons()} + `; + } + + #renderButtons() { + if (this.nodeId) return; + + //TODO: Dynamic paths + return html` + this.#pickerContext.openPicker()} + label=${this.localize.term('contentPicker_defineRootNode')}> + + `; + } + + private _renderItem(item: DocumentItemResponseModel) { + if (!item.id) return; + return html` + + + + this.#pickerContext.openPicker()} label="Edit document ${item.name}" + >Edit + this.#pickerContext.requestRemoveItem(item.id!)} + label="Remove document ${item.name}" + >Remove + + + `; + } + + static styles = [css``]; +} + +export default UmbInputDocumentSourceElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-document-source': UmbInputDocumentSourceElement; + } +} From 78715d0bfc1d41923a080f13707be35c97ee522e Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 19 Dec 2023 16:12:24 +0000 Subject: [PATCH 41/50] Added localized keys/terms for the button labels --- src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts | 2 ++ src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts index df0a6a2e45..d3b00b4443 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts @@ -1151,6 +1151,8 @@ export default { }, contentPicker: { allowedItemTypes: 'Du kan kun vælge følgende type(r) dokumenter: %0%', + defineDynamicRoot: 'Definer Dynamisk Udgangspunkt', + defineRootNode: 'Vælg udgangspunkt', pickedTrashedItem: 'Du har valgt et dokument som er slettet eller lagt i papirkurven', pickedTrashedItems: 'Du har valgt dokumenter som er slettede eller lagt i papirkurven', }, diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index 19de39092d..cfbeba5478 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -1148,6 +1148,8 @@ export default { }, contentPicker: { allowedItemTypes: 'You can only select items of type(s): %0%', + defineDynamicRoot: 'Specify a Dynamic Root', + defineRootNode: 'Pick root node', pickedTrashedItem: 'You have picked a content item currently deleted or in the recycle bin', pickedTrashedItems: 'You have picked content items currently deleted or in the recycle bin', }, From 6a9574b18a4bd1fb8c1f4290b1ca48b231a207a9 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 19 Dec 2023 16:18:15 +0000 Subject: [PATCH 42/50] Updates to `start-node` elements to use the new `input-document-source` element. Extended the `StartNode` type to include the DynamicRoot schema. --- .../input-start-node.element.ts | 64 ++++++++++++++----- ...ditor-ui-tree-picker-start-node.element.ts | 8 ++- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-start-node/input-start-node.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-start-node/input-start-node.element.ts index d6db6cc9c5..d5392ca592 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-start-node/input-start-node.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-start-node/input-start-node.element.ts @@ -1,16 +1,26 @@ -import { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; +import { UmbInputDocumentSourceElement } from '@umbraco-cms/backoffice/document'; import { html, customElement, property, css, state } from '@umbraco-cms/backoffice/external/lit'; import { FormControlMixin, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; -import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +//import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; export type ContentType = 'content' | 'member' | 'media'; +export type DynamicRootQueryStepType = { + alias: string; + anyOfDocTypeKeys: Array; +}; + +export type DynamicRootType = { + originAlias: string; + querySteps?: Array | null; +}; + export type StartNode = { type?: ContentType; id?: string | null; - query?: string | null; + dynamicRoot?: DynamicRootType | null; }; @customElement('umb-input-start-node') @@ -20,14 +30,21 @@ export class UmbInputStartNodeElement extends FormControlMixin(UmbLitElement) { } private _type: StartNode['type'] = 'content'; + @property() public set type(value: StartNode['type']) { + if (value === undefined) { + value = this._type; + } + const oldValue = this._type; this._options = this._options.map((option) => option.value === value ? { ...option, selected: true } : { ...option, selected: false }, ); + this._type = value; + this.requestUpdate('type', oldValue); } public get type(): StartNode['type'] { @@ -35,30 +52,43 @@ export class UmbInputStartNodeElement extends FormControlMixin(UmbLitElement) { } @property({ attribute: 'node-id' }) - nodeId = ''; + nodeId?: string | null; - @property({ attribute: 'dynamic-path' }) - dynamicPath = ''; + @property({ attribute: false }) + dynamicRoot?: DynamicRootType | null; @state() _options: Array