From dbf7b761f82a420e1ccde50b121957b75e95b13b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 15 Feb 2024 20:50:38 +0100 Subject: [PATCH 001/170] remove parent from detail model --- src/Umbraco.Web.UI.Client/src/packages/core/data-type/types.ts | 1 - .../src/packages/documents/documents/types.ts | 1 - src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts | 1 - .../src/packages/templating/partial-views/types.ts | 1 - .../src/packages/templating/scripts/types.ts | 1 - .../src/packages/templating/stylesheets/types.ts | 2 -- .../src/packages/templating/templates/types.ts | 1 - 7 files changed, 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/types.ts index 1204540bba..366f7823f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/types.ts @@ -3,7 +3,6 @@ import type { UmbDataTypeEntityType } from './entity.js'; export interface UmbDataTypeDetailModel { entityType: UmbDataTypeEntityType; unique: string; - parentUnique: string | null; name: string; editorAlias: string | undefined; editorUiAlias: string | null; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts index 04fb86e3e8..45ef8b40a9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts @@ -11,7 +11,6 @@ export interface UmbDocumentDetailModel { isTrashed: boolean; template: { unique: string } | null; unique: string; - parentUnique: string | null; urls: Array; values: Array; variants: Array; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts index 92427057b9..c12b8100c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/types.ts @@ -7,7 +7,6 @@ export interface UmbMediaDetailModel { entityType: UmbMediaEntityType; isTrashed: boolean; unique: string; - parentUnique: string | null; urls: Array; values: Array; variants: Array; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/types.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/types.ts index 27d428a73c..4197386878 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/types.ts @@ -3,7 +3,6 @@ import type { UmbPartialViewEntityType } from './entity.js'; export interface UmbPartialViewDetailModel { entityType: UmbPartialViewEntityType; unique: string; - parentUnique: string | null; path: string; name: string; content: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts index 2c904c19b2..6a53b4c328 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/types.ts @@ -3,7 +3,6 @@ import type { UmbScriptEntityType } from './entity.js'; export interface UmbScriptDetailModel { entityType: UmbScriptEntityType; unique: string; - parentUnique: string | null; path: string; name: string; content: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/types.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/types.ts index 7623b49192..aa1a56bf5e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/types.ts @@ -3,7 +3,6 @@ import type { UmbStylesheetEntityType, UmbStylesheetFolderEntityType } from './e export interface UmbStylesheetDetailModel { entityType: UmbStylesheetEntityType; unique: string; - parentUnique: string | null; path: string; name: string; content: string; @@ -12,7 +11,6 @@ export interface UmbStylesheetDetailModel { export interface UmbStylesheetItemModel { entityType: UmbStylesheetEntityType | UmbStylesheetFolderEntityType; unique: string; - parentUnique: string | null; name: string; isFolder: boolean; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/types.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/types.ts index c9be00230b..f92f42da84 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/types.ts @@ -3,7 +3,6 @@ import type { UmbTemplateEntityType } from './entity.js'; export interface UmbTemplateDetailModel { entityType: UmbTemplateEntityType; unique: string; - parentUnique: string | null; name: string; alias: string; content: string | null; From 61a3fc31ffa5599040c6a31921ebd274ddc63e73 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 15 Feb 2024 21:37:21 +0100 Subject: [PATCH 002/170] only pass preset to scaffold, remove parent from read --- .../content-type-structure-manager.class.ts | 2 +- .../src/packages/core/content-type/types.ts | 1 - .../data-type-detail.server.data-source.ts | 10 +++--- .../data-type/tree/data-type-tree.store.ts | 2 +- .../workspace/data-type-workspace.context.ts | 2 +- .../detail/detail-data-source.interface.ts | 6 ++-- .../detail/detail-repository-base.ts | 34 +++++++++---------- .../detail/detail-repository.interface.ts | 9 ++--- .../workspace/dictionary-workspace.context.ts | 2 +- ...document-type-detail.server.data-source.ts | 9 +++-- .../tree/document-type.tree.store.ts | 2 +- .../document-detail.server.data-source.ts | 9 ++--- .../workspace/document-workspace.context.ts | 2 +- .../language-detail.server.data-source.ts | 5 +-- .../language/language-workspace.context.ts | 2 +- .../media-type-detail.server.data-source.ts | 11 +++--- .../media-types/tree/media-type-tree.store.ts | 2 +- .../detail/media-detail.server.data-source.ts | 11 +++--- .../workspace/media-workspace.context.ts | 2 +- .../member-group-workspace.context.ts | 2 +- .../member-type-detail.server.data-source.ts | 7 ++-- .../member-type-workspace.context.ts | 2 +- .../member-detail.server.data-source.ts | 4 +-- .../workspace/member-workspace.context.ts | 2 +- .../partial-view-detail.server.data-source.ts | 9 ++--- .../tree/partial-view-tree.store.ts | 2 +- .../partial-view-workspace.context.ts | 2 +- .../script-detail.server.data-source.ts | 10 +++--- .../scripts/tree/script-tree.store.ts | 2 +- .../workspace/script-workspace.context.ts | 2 +- .../stylesheet-detail.server.data-source.ts | 10 +++--- .../stylesheets/tree/stylesheet-tree.store.ts | 2 +- .../workspace/stylesheet-workspace.context.ts | 2 +- .../template-detail.server.data-source.ts | 7 ++-- .../templates/tree/template-tree.store.ts | 2 +- .../workspace/template-workspace.context.ts | 2 +- .../workspace/user-group-workspace.context.ts | 2 +- .../create/create-user-modal.element.ts | 2 +- 38 files changed, 88 insertions(+), 108 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index 07f332394a..bcbddd188c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -70,7 +70,7 @@ export class UmbContentTypePropertyStructureManager = {}) { const data: UmbDataTypeDetailModel = { entityType: UMB_DATA_TYPE_ENTITY_TYPE, unique: UmbId.new(), - parentUnique, name: '', editorAlias: undefined, editorUiAlias: null, values: [], + ...preset, }; return { data }; @@ -64,7 +65,6 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource { const treeItem: UmbDataTypeTreeItemModel = { unique: item.unique, - parentUnique: item.parentUnique, + parentUnique: null, name: item.name, entityType: item.entityType, isFolder: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts index 3689dc7bb9..f5ca4c79e9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/workspace/data-type-workspace.context.ts @@ -199,7 +199,7 @@ export class UmbDataTypeWorkspaceContext } async create(parentUnique: string | null) { - this.#getDataPromise = this.repository.createScaffold(parentUnique); + this.#getDataPromise = this.repository.createScaffold(); let { data } = await this.#getDataPromise; if (this.modalContext) { data = { ...data, ...this.modalContext.data.preset }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts index 799f508af6..b8ded02d9f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts @@ -6,9 +6,9 @@ export interface UmbDetailDataSourceConstructor { } export interface UmbDetailDataSource { - createScaffold(parentUnique: string | null, preset?: Partial): Promise>; - create(data: DetailType): Promise>; + createScaffold(preset?: Partial): Promise>; + create(model: DetailType, parentUnique: string | null): Promise>; read(unique: string): Promise>; - update(data: DetailType): Promise>; + update(model: DetailType): Promise>; delete(unique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts index 5f396ed615..360446a608 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts @@ -8,9 +8,7 @@ import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbDetailStore } from '@umbraco-cms/backoffice/store'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export abstract class UmbDetailRepositoryBase< - DetailModelType extends { unique: string; entityType: string; parentUnique?: string | null }, - > +export abstract class UmbDetailRepositoryBase extends UmbRepositoryBase implements UmbDetailRepository, UmbApi { @@ -42,13 +40,12 @@ export abstract class UmbDetailRepositoryBase< /** * Creates a scaffold - * @param {(string | null)} parentUnique + * @param {Partial} [preset] * @return {*} * @memberof UmbDetailRepositoryBase */ - async createScaffold(parentUnique: string | null, preset?: Partial) { - if (parentUnique === undefined) throw new Error('Parent unique is missing'); - return this.#detailSource.createScaffold(parentUnique, preset); + async createScaffold(preset?: Partial) { + return this.#detailSource.createScaffold(preset); } /** @@ -72,15 +69,16 @@ export abstract class UmbDetailRepositoryBase< /** * Returns a promise with an observable of the detail for the given unique - * @param {string} unique + * @param {DetailModelType} model + * @param {string | null} [parentUnique=null] * @return {*} * @memberof UmbDetailRepositoryBase */ - async create(data: DetailModelType) { - if (!data) throw new Error('Data is missing'); + async create(model: DetailModelType, parentUnique: string | null = null) { + if (!model) throw new Error('Data is missing'); await this.#init; - const { data: createdData, error } = await this.#detailSource.create(data); + const { data: createdData, error } = await this.#detailSource.create(model, parentUnique); if (createdData) { this.#detailStore?.append(createdData); @@ -95,26 +93,26 @@ export abstract class UmbDetailRepositoryBase< /** * Saves the given data - * @param {DetailModelType} data + * @param {DetailModelType} model * @return {*} * @memberof UmbDetailRepositoryBase */ - async save(data: DetailModelType) { - if (!data) throw new Error('Data is missing'); - if (!data.unique) throw new Error('Unique is missing'); + async save(model: DetailModelType) { + if (!model) throw new Error('Data is missing'); + if (!model.unique) throw new Error('Unique is missing'); await this.#init; - const { data: updatedData, error } = await this.#detailSource.update(data); + const { data: updatedData, error } = await this.#detailSource.update(model); if (updatedData) { - this.#detailStore!.updateItem(data.unique, updatedData); + this.#detailStore!.updateItem(model.unique, updatedData); // TODO: how do we handle generic notifications? Is this the correct place to do it? const notification = { data: { message: `Saved` } }; this.#notificationContext!.peek('positive', notification); } - return { data, error }; + return { data: model, error }; } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts index 7e93071c85..422f130489 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts @@ -2,13 +2,10 @@ import type { DataSourceResponse, UmbDataSourceErrorResponse } from '../data-sou import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export interface UmbDetailRepository { - createScaffold( - parentUnique: string | null, - preset?: Partial, - ): Promise>; + createScaffold(preset?: Partial): Promise>; requestByUnique(unique: string): Promise>; byUnique(unique: string): Promise>; - create(data: DetailModelType): Promise>; - save(data: DetailModelType): Promise>; + create(model: DetailModelType, parentUnique: string | null): Promise>; + save(model: DetailModelType): Promise>; delete(unique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts index cdf25b6a81..502e121b4f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/dictionary-workspace.context.ts @@ -71,7 +71,7 @@ export class UmbDictionaryWorkspaceContext } async create(parentUnique: string | null) { - const { data } = await this.detailRepository.createScaffold(parentUnique); + const { data } = await this.detailRepository.createScaffold(); if (!data) return; this.setIsNew(true); this.#data.setValue(data); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts index 1fbd784718..b706cf2011 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts @@ -35,11 +35,10 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc * @return { CreateDocumentTypeRequestModel } * @memberof UmbDocumentTypeServerDataSource */ - async createScaffold(parentUnique: string | null) { + async createScaffold(preset: Partial = {}) { const data: UmbDocumentTypeDetailModel = { entityType: UMB_DOCUMENT_TYPE_ENTITY_TYPE, unique: UmbId.new(), - parentUnique, name: '', alias: '', description: '', @@ -59,6 +58,7 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc keepAllVersionsNewerThanDays: null, keepLatestVersionPerDayForDays: null, }, + ...preset, }; return { data }; @@ -86,7 +86,6 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc const DocumentType: UmbDocumentTypeDetailModel = { entityType: UMB_DOCUMENT_TYPE_ENTITY_TYPE, unique: data.id, - parentUnique: null, // TODO: map to parent/folder id name: data.name, alias: data.alias, description: data.description || null, @@ -137,13 +136,13 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc * @return {*} * @memberof UmbDocumentTypeServerDataSource */ - async create(model: UmbDocumentTypeDetailModel) { + async create(model: UmbDocumentTypeDetailModel, parentUnique: string | null = null) { if (!model) throw new Error('Media Type is missing'); if (!model.unique) throw new Error('Media Type unique is missing'); // TODO: make data mapper to prevent errors const requestBody: CreateDocumentTypeRequestModel = { - folder: model.parentUnique ? { id: model.parentUnique } : null, + folder: parentUnique ? { id: parentUnique } : null, alias: model.alias, name: model.name, description: model.description, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts index 4e464abdcf..01889f5978 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts @@ -34,7 +34,7 @@ export class UmbDocumentTypeTreeStore extends UmbUniqueTreeStore { #createTreeItemMapper = (item: UmbDocumentTypeDetailModel) => { const treeItem: UmbDocumentTypeTreeItemModel = { unique: item.unique, - parentUnique: item.parentUnique, + parentUnique: null, name: item.name, entityType: item.entityType, isElement: item.isElement, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts index 78014bf306..53298d01fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts @@ -30,15 +30,13 @@ export class UmbDocumentServerDataSource implements UmbDetailDataSource = {}) { + async createScaffold(preset: Partial = {}) { const data: UmbDocumentDetailModel = { entityType: UMB_DOCUMENT_ENTITY_TYPE, unique: UmbId.new(), - parentUnique: parentUnique, urls: [], template: null, documentType: { @@ -83,7 +81,6 @@ export class UmbDocumentServerDataSource implements UmbDetailDataSource { return { alias: value.alias, @@ -126,14 +123,14 @@ export class UmbDocumentServerDataSource implements UmbDetailDataSource} [preset] * @return { CreateLanguageRequestModel } * @memberof UmbLanguageServerDataSource */ - async createScaffold(parentUnique: string | null) { + async createScaffold(preset: Partial = {}) { const data: UmbLanguageDetailModel = { entityType: UMB_LANGUAGE_ENTITY_TYPE, fallbackIsoCode: null, @@ -39,6 +39,7 @@ export class UmbLanguageServerDataSource implements UmbDetailDataSource} [preset] * @return { CreateMediaTypeRequestModel } * @memberof UmbMediaTypeServerDataSource */ - async createScaffold(parentUnique: string | null) { + async createScaffold(preset: Partial = {}) { const data: UmbMediaTypeDetailModel = { entityType: UMB_MEDIA_TYPE_ENTITY_TYPE, unique: UmbId.new(), - parentUnique, name: '', alias: '', description: '', @@ -52,6 +51,7 @@ export class UmbMediaTypeServerDataSource implements UmbDetailDataSource { const treeItem: UmbMediaTypeTreeItemModel = { unique: item.unique, - parentUnique: item.parentUnique, + parentUnique: null, name: item.name, entityType: item.entityType, isFolder: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts index ae8bba794c..39dfdec390 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts @@ -27,15 +27,14 @@ export class UmbMediaServerDataSource implements UmbDetailDataSource} [preset] * @return { UmbMediaDetailModel } * @memberof UmbMediaServerDataSource */ - async createScaffold(parentUnique: string | null) { + async createScaffold(preset: Partial = {}) { const data: UmbMediaDetailModel = { entityType: UMB_MEDIA_ENTITY_TYPE, unique: UmbId.new(), - parentUnique, urls: [], mediaType: { unique: 'mediaTypeId', @@ -51,6 +50,7 @@ export class UmbMediaServerDataSource implements UmbDetailDataSource { return { @@ -101,14 +100,14 @@ export class UmbMediaServerDataSource implements UmbDetailDataSource} [preset] * @return { CreateMemberTypeRequestModel } * @memberof UmbMemberTypeServerDataSource */ - async createScaffold(parentUnique: string | null) { + async createScaffold(preset: Partial = {}) { const data: UmbMemberTypeDetailModel = { entityType: UMB_MEMBER_TYPE_ENTITY_TYPE, unique: UmbId.new(), - parentUnique, name: '', alias: '', description: '', @@ -52,6 +51,7 @@ export class UmbMemberTypeServerDataSource implements UmbDetailDataSource} [preset] * @return { CreateMemberRequestModel } * @memberof UmbMemberServerDataSource */ - async createScaffold(parentUnique: string | null, preset: Partial = {}) { + async createScaffold(preset: Partial = {}) { const data: UmbMemberDetailModel = { entityType: UMB_MEMBER_ENTITY_TYPE, unique: UmbId.new(), diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts index e9c78d4540..bf97555cf5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member-workspace.context.ts @@ -32,7 +32,7 @@ export class UmbMemberWorkspaceContext } async create(parentUnique: string | null, memberTypeUnique: string) { - const { data } = await this.repository.createScaffold(parentUnique, { + const { data } = await this.repository.createScaffold({ memberType: { unique: memberTypeUnique }, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-view-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-view-detail.server.data-source.ts index b2c3ed9012..7514b4c563 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-view-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/partial-view-detail.server.data-source.ts @@ -21,10 +21,9 @@ export class UmbPartialViewDetailServerDataSource implements UmbDetailDataSource this.#host = host; } - async createScaffold(parentUnique: string | null, preset?: Partial) { + async createScaffold(preset: Partial = {}) { const data: UmbPartialViewDetailModel = { entityType: UMB_PARTIAL_VIEW_ENTITY_TYPE, - parentUnique, unique: '', path: '', name: '', @@ -35,12 +34,11 @@ export class UmbPartialViewDetailServerDataSource implements UmbDetailDataSource return { data }; } - async create(model: UmbPartialViewDetailModel) { + async create(model: UmbPartialViewDetailModel, parentUnique: string | null = null) { if (!model) throw new Error('Data is missing'); - if (!model.parentUnique === undefined) throw new Error('Parent Unique is missing'); if (!model.name) throw new Error('Name is missing'); - const parentPath = this.#serverFilePathUniqueSerializer.toServerPath(model.parentUnique); + const parentPath = this.#serverFilePathUniqueSerializer.toServerPath(parentUnique); // TODO: make data mapper to prevent errors const requestBody: CreatePartialViewRequestModel = { @@ -83,7 +81,6 @@ export class UmbPartialViewDetailServerDataSource implements UmbDetailDataSource const partialView: UmbPartialViewDetailModel = { entityType: UMB_PARTIAL_VIEW_ENTITY_TYPE, unique: this.#serverFilePathUniqueSerializer.toUnique(data.path), - parentUnique: data.parent ? this.#serverFilePathUniqueSerializer.toUnique(data.parent.path) : null, path: data.path, name: data.name, content: data.content, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts index 9420d28760..ff66d832e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts @@ -35,7 +35,7 @@ export class UmbPartialViewTreeStore extends UmbUniqueTreeStore { #createTreeItemMapper = (item: UmbPartialViewDetailModel) => { const treeItem: UmbPartialViewTreeItemModel = { unique: item.unique, - parentUnique: item.parentUnique, + parentUnique: null, entityType: UMB_PARTIAL_VIEW_ENTITY_TYPE, name: item.name, hasChildren: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts index 8627b82040..8c2cb2ba08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts @@ -77,7 +77,7 @@ export class UmbPartialViewWorkspaceContext snippetContent = snippet?.content || ''; } - const { data } = await this.repository.createScaffold(parentUnique, { content: snippetContent }); + const { data } = await this.repository.createScaffold({ content: snippetContent }); if (data) { this.setIsNew(true); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/script-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/script-detail.server.data-source.ts index e0db5476c2..5de70c351e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/script-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/script-detail.server.data-source.ts @@ -18,25 +18,24 @@ export class UmbScriptDetailServerDataSource implements UmbDetailDataSource = {}) { const data: UmbScriptDetailModel = { entityType: UMB_SCRIPT_ENTITY_TYPE, - parentUnique, unique: '', path: '', name: '', content: '', + ...preset, }; return { data }; } - async create(model: UmbScriptDetailModel) { + async create(model: UmbScriptDetailModel, parentUnique: string | null = null) { if (!model) throw new Error('Data is missing'); - if (!model.parentUnique === undefined) throw new Error('Parent Unique is missing'); if (!model.name) throw new Error('Name is missing'); - const parentPath = this.#serverFilePathUniqueSerializer.toServerPath(model.parentUnique); + const parentPath = this.#serverFilePathUniqueSerializer.toServerPath(parentUnique); // TODO: make data mapper to prevent errors const requestBody: CreateScriptRequestModel = { @@ -79,7 +78,6 @@ export class UmbScriptDetailServerDataSource implements UmbDetailDataSource { const treeItem: UmbScriptTreeItemModel = { unique: item.unique, - parentUnique: item.parentUnique, + parentUnique: null, entityType: UMB_SCRIPT_ENTITY_TYPE, name: item.name, hasChildren: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts index d60c15ef7a..39200e1f3b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts @@ -64,7 +64,7 @@ export class UmbScriptWorkspaceContext extends UmbEditableWorkspaceContextBase = {}) { const data: UmbStylesheetDetailModel = { entityType: UMB_STYLESHEET_ENTITY_TYPE, - parentUnique, unique: '', path: '', name: '', content: '', + ...preset, }; return { data }; } - async create(model: UmbStylesheetDetailModel) { + async create(model: UmbStylesheetDetailModel, parentUnique: string | null = null) { if (!model) throw new Error('Data is missing'); - if (!model.parentUnique === undefined) throw new Error('Parent Unique is missing'); if (!model.name) throw new Error('Name is missing'); - const parentPath = this.#serverFilePathUniqueSerializer.toServerPath(model.parentUnique); + const parentPath = this.#serverFilePathUniqueSerializer.toServerPath(parentUnique); // TODO: make data mapper to prevent errors const requestBody: CreateStylesheetRequestModel = { @@ -82,7 +81,6 @@ export class UmbStylesheetDetailServerDataSource implements UmbDetailDataSource< const stylesheet: UmbStylesheetDetailModel = { entityType: UMB_STYLESHEET_ENTITY_TYPE, unique: this.#serverFilePathUniqueSerializer.toUnique(data.path), - parentUnique: data.parent ? this.#serverFilePathUniqueSerializer.toUnique(data.parent.path) : null, path: data.path, name: data.name, content: data.content, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts index 4aa99c1acc..eb4991eec4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts @@ -35,7 +35,7 @@ export class UmbStylesheetTreeStore extends UmbUniqueTreeStore { #createTreeItemMapper = (item: UmbStylesheetDetailModel) => { const treeItem: UmbStylesheetTreeItemModel = { unique: item.unique, - parentUnique: item.parentUnique, + parentUnique: null, entityType: UMB_STYLESHEET_ENTITY_TYPE, name: item.name, hasChildren: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index 1f914acec5..cd35f2155e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -72,7 +72,7 @@ export class UmbStylesheetWorkspaceContext } async create(parentUnique: string | null) { - const { data } = await this.repository.createScaffold(parentUnique); + const { data } = await this.repository.createScaffold(); if (data) { this.setIsNew(true); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts index 0c300d6c53..9bf6f211eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts @@ -30,19 +30,19 @@ export class UmbTemplateServerDataSource implements UmbDetailDataSource} [preset] * @return { CreateTemplateRequestModel } * @memberof UmbTemplateServerDataSource */ - async createScaffold(parentUnique: string | null) { + async createScaffold(preset: Partial = {}) { const data: UmbTemplateDetailModel = { entityType: UMB_TEMPLATE_ENTITY_TYPE, unique: UmbId.new(), - parentUnique, name: '', alias: '', content: '', masterTemplate: null, + ...preset, }; return { data }; @@ -67,7 +67,6 @@ export class UmbTemplateServerDataSource implements UmbDetailDataSource { const treeItem: UmbTemplateTreeItemModel = { unique: item.unique, - parentUnique: item.parentUnique, entityType: UMB_TEMPLATE_ENTITY_TYPE, + parentUnique: null, name: item.name, hasChildren: false, isFolder: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts index 1308cb1133..a45aa456f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts @@ -130,7 +130,7 @@ ${currentContent}`; }; async create(parentUnique: string | null) { - const { data } = await this.detailRepository.createScaffold(parentUnique); + const { data } = await this.detailRepository.createScaffold(); if (!data) return; this.setIsNew(true); this.#data.setValue(data); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 7cc7a1e72f..6fe70aea44 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -29,7 +29,7 @@ export class UmbUserGroupWorkspaceContext } async create() { - const { data } = await this.repository.createScaffold(null); + const { data } = await this.repository.createScaffold(); this.setIsNew(true); this.#data.setValue(data); return { data }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts index 1568423786..a3b6e32086 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts @@ -39,7 +39,7 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { const userGroupPicker = form.querySelector('#userGroups') as UmbUserGroupInputElement; const userGroups = userGroupPicker?.selectedIds; - const { data: userScaffold } = await this.#userDetailRepository.createScaffold(null); + const { data: userScaffold } = await this.#userDetailRepository.createScaffold(); if (!userScaffold) return; userScaffold.name = name; From c516b1def72d8c5d1be7835efaec4c482bb79738 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 15 Feb 2024 23:21:55 +0100 Subject: [PATCH 003/170] pass parentUnique to create method instead of create scaffold --- .../content-type-structure-manager.class.ts | 3 ++- .../workspace/data-type-workspace.context.ts | 5 ++++- .../repository/detail/detail-repository-base.ts | 2 +- .../workspace/dictionary-workspace.context.ts | 5 ++++- .../workspace/document-type-workspace.context.ts | 3 +++ .../workspace/document-workspace.context.ts | 5 ++++- .../repository/detail/language-detail.repository.ts | 4 ++++ .../language/language-workspace.context.ts | 2 ++ .../workspace/media-type-workspace.context.ts | 13 ++++++------- .../media/workspace/media-workspace.context.ts | 5 ++++- .../detail/member-group-detail.repository.ts | 4 ++++ .../workspace/member-group-workspace.context.ts | 2 +- .../workspace/member-group-workspace.element.ts | 2 +- .../workspace/member-type-workspace.context.ts | 5 ++++- .../repository/detail/member-detail.repository.ts | 4 ++++ .../member/workspace/member-workspace.context.ts | 2 +- .../member/workspace/member-workspace.element.ts | 2 +- .../workspace/relation-type-workspace.context.ts | 7 +++++-- .../workspace/partial-view-workspace.context.ts | 5 ++++- .../scripts/workspace/script-workspace.context.ts | 5 ++++- .../workspace/stylesheet-workspace.context.ts | 5 ++++- .../workspace/template-workspace.context.ts | 5 ++++- .../detail/user-group-detail.repository.ts | 4 ++++ .../workspace/user-group-workspace.context.ts | 2 +- .../workspace/user-group-workspace.element.ts | 2 +- .../repository/detail/user-detail.repository.ts | 4 ++++ .../user/user/workspace/user-workspace.context.ts | 2 ++ 27 files changed, 83 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index bcbddd188c..0f48ed292c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -22,6 +22,7 @@ export class UmbContentTypePropertyStructureManager; #contentTypeRepository: UmbDetailRepository; + #parentUnique: string | null = null; #ownerContentTypeUnique?: string; #contentTypeObservers = new Array(); @@ -105,7 +106,7 @@ export class UmbContentTypePropertyStructureManager(undefined); readonly data = this.#data.asObservable(); #getDataPromise?: Promise; @@ -199,6 +201,7 @@ export class UmbDataTypeWorkspaceContext } async create(parentUnique: string | null) { + this.#parentUnique = parentUnique; this.#getDataPromise = this.repository.createScaffold(); let { data } = await this.#getDataPromise; if (this.modalContext) { @@ -275,7 +278,7 @@ export class UmbDataTypeWorkspaceContext if (!this.#data.value.unique) return; if (this.getIsNew()) { - await this.repository.create(this.#data.value); + await this.repository.create(this.#data.value, this.#parentUnique); } else { await this.repository.save(this.#data.value); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts index 360446a608..c7669d284b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository-base.ts @@ -74,7 +74,7 @@ export abstract class UmbDetailRepositoryBase(undefined); readonly data = this.#data.asObservable(); @@ -71,6 +73,7 @@ export class UmbDictionaryWorkspaceContext } async create(parentUnique: string | null) { + this.#parentUnique = parentUnique; const { data } = await this.detailRepository.createScaffold(); if (!data) return; this.setIsNew(true); @@ -82,7 +85,7 @@ export class UmbDictionaryWorkspaceContext if (!this.#data.value.unique) return; if (this.getIsNew()) { - const { error } = await this.detailRepository.create(this.#data.value); + const { error } = await this.detailRepository.create(this.#data.value, this.#parentUnique); if (error) { return; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index fcb5cadb98..656d9e2968 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -16,6 +16,8 @@ export class UmbDocumentTypeWorkspaceContext readonly repository = new UmbDocumentTypeDetailRepository(this); // Data/Draft is located in structure manager + #parentUnique: string | null = null; + // General for content types: readonly data; readonly name; @@ -125,6 +127,7 @@ export class UmbDocumentTypeWorkspaceContext } async create(parentUnique: string | null) { + this.#parentUnique = parentUnique; const { data } = await this.structure.createScaffold(parentUnique); if (!data) return undefined; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index ace1ef780f..0ef0945005 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -24,6 +24,8 @@ export class UmbDocumentWorkspaceContext public readonly repository = new UmbDocumentDetailRepository(this); public readonly publishingRepository = new UmbDocumentPublishingRepository(this); + #parentUnique: string | null = null; + /** * The document is the current state/draft version of the document. */ @@ -68,6 +70,7 @@ export class UmbDocumentWorkspaceContext } async create(parentUnique: string | null, documentTypeUnique: string) { + this.#parentUnique = parentUnique; this.#getDataPromise = this.repository.createScaffold({ documentType: { unique: documentTypeUnique, @@ -183,7 +186,7 @@ export class UmbDocumentWorkspaceContext if (this.getIsNew()) { const value = this.#currentData.value; - if ((await this.repository.create(value)).data !== undefined) { + if ((await this.repository.create(value, this.#parentUnique)).data !== undefined) { this.setIsNew(false); } } else { diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts index 5baf9cf724..3860bc28d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts @@ -8,4 +8,8 @@ export class UmbLanguageDetailRepository extends UmbDetailRepositoryBase(undefined); readonly data = this.#data.asObservable(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts index 592d7d5efc..39e0528c23 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts @@ -1,11 +1,8 @@ import { UmbMediaTypeDetailRepository } from '../repository/detail/media-type-detail.repository.js'; import { UMB_MEDIA_TYPE_ENTITY_TYPE } from '../index.js'; import type { UmbMediaTypeDetailModel } from '../types.js'; -import type { - UmbSaveableWorkspaceContextInterface} from '@umbraco-cms/backoffice/workspace'; -import { - UmbEditableWorkspaceContextBase, -} from '@umbraco-cms/backoffice/workspace'; +import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { UmbEditableWorkspaceContextBase } from '@umbraco-cms/backoffice/workspace'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -20,6 +17,8 @@ export class UmbMediaTypeWorkspaceContext public readonly repository: UmbMediaTypeDetailRepository = new UmbMediaTypeDetailRepository(this); // Draft is located in structure manager + #parentUnique: string | null = null; + // General for content types: readonly data; readonly name; @@ -74,8 +73,8 @@ export class UmbMediaTypeWorkspaceContext this.structure.updateOwnerContentType({ [propertyName]: value }); } - async create(parentId: string | null) { - const { data } = await this.structure.createScaffold(parentId); + async create(parentUnique: string | null) { + const { data } = await this.structure.createScaffold(parentUnique); if (!data) return undefined; this.setIsNew(true); 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 0dec029134..4cfc95fec3 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 @@ -15,6 +15,8 @@ export class UmbMediaWorkspaceContext // public readonly repository = new UmbMediaDetailRepository(this); + #parentUnique: string | null = null; + #data = new UmbObjectState(undefined); data = this.#data.asObservable(); // TODO: get correct variant name @@ -57,6 +59,7 @@ export class UmbMediaWorkspaceContext } async create(parentUnique: string | null) { + this.#parentUnique = parentUnique; const { data } = await this.repository.createScaffold(); if (!data) return; this.setIsNew(true); @@ -70,7 +73,7 @@ export class UmbMediaWorkspaceContext if (this.isNew) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - await this.repository.create(this.#data.value); + await this.repository.create(this.#data.value, this.#parentUnique); } else { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.repository.ts index 1d1f7a002f..1e2ec7ec90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.repository.ts @@ -14,4 +14,8 @@ export class UmbMemberGroupDetailRepository extends UmbDetailRepositoryBase { - this.#workspaceContext.create(null); + this.#workspaceContext.create(); new UmbWorkspaceIsNewRedirectController( this, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts index 71c8d1d562..b1e0e18099 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts @@ -14,6 +14,8 @@ export class UmbMemberTypeWorkspaceContext { public readonly detailRepository = new UmbMemberTypeDetailRepository(this); + #parentUnique: string | null = null; + #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); @@ -33,6 +35,7 @@ export class UmbMemberTypeWorkspaceContext } async create(parentUnique: string | null) { + this.#parentUnique = parentUnique; const { data } = await this.detailRepository.createScaffold(); if (data) { @@ -48,7 +51,7 @@ export class UmbMemberTypeWorkspaceContext if (!data) throw new Error('No data to save'); if (this.getIsNew()) { - await this.detailRepository.create(data); + await this.detailRepository.create(data, this.#parentUnique); } else { await this.detailRepository.save(data); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.repository.ts index 1a93377110..87d939a0be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.repository.ts @@ -19,4 +19,8 @@ export class UmbMemberDetailRepository extends UmbDetailRepositoryBase { const memberTypeUnique = info.match.params.memberTypeUnique; - this.#workspaceContext.create(null, memberTypeUnique); + this.#workspaceContext.create(memberTypeUnique); new UmbWorkspaceIsNewRedirectController( this, diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/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 index 01fd6937fb..26f7e67edf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/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 @@ -15,6 +15,8 @@ export class UmbRelationTypeWorkspaceContext // public readonly repository: UmbRelationTypeRepository = new UmbRelationTypeRepository(this); + #parentUnique: string | null = null; + #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); readonly name = this.#data.asObservablePart((data) => data?.name); @@ -33,8 +35,9 @@ export class UmbRelationTypeWorkspaceContext } } - async createScaffold(parentId: string | null) { - const { data } = await this.repository.createScaffold(parentId); + async createScaffold(parentUnique: string | null = null) { + this.#parentUnique = parentUnique; + const { data } = await this.repository.createScaffold(parentUnique); if (!data) return; this.setIsNew(true); this.#data.setValue(data); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts index 8c2cb2ba08..7a508aeb82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts @@ -16,6 +16,8 @@ export class UmbPartialViewWorkspaceContext { public readonly repository = new UmbPartialViewDetailRepository(this); + #parentUnique: string | null = null; + #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); readonly name = this.#data.asObservablePart((data) => data?.name); @@ -70,6 +72,7 @@ export class UmbPartialViewWorkspaceContext } async create(parentUnique: string | null, snippetId?: string) { + this.#parentUnique = parentUnique; let snippetContent = ''; if (snippetId) { @@ -91,7 +94,7 @@ export class UmbPartialViewWorkspaceContext let newData = undefined; if (this.getIsNew()) { - const { data } = await this.repository.create(this.#data.value); + const { data } = await this.repository.create(this.#data.value, this.#parentUnique); newData = data; } else { const { data } = await this.repository.save(this.#data.value); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts index 39200e1f3b..9ff821f7a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/script-workspace.context.ts @@ -10,6 +10,8 @@ import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; export class UmbScriptWorkspaceContext extends UmbEditableWorkspaceContextBase { public readonly repository = new UmbScriptDetailRepository(this); + #parentUnique: string | null = null; + #data = new UmbObjectState(undefined); readonly data = this.#data.asObservable(); readonly name = this.#data.asObservablePart((data) => data?.name); @@ -64,6 +66,7 @@ export class UmbScriptWorkspaceContext extends UmbEditableWorkspaceContextBase(undefined); readonly data = this.#data.asObservable(); readonly name = this.#data.asObservablePart((data) => data?.name); @@ -72,6 +74,7 @@ export class UmbStylesheetWorkspaceContext } async create(parentUnique: string | null) { + this.#parentUnique = parentUnique; const { data } = await this.repository.createScaffold(); if (data) { @@ -86,7 +89,7 @@ export class UmbStylesheetWorkspaceContext let newData = undefined; if (this.getIsNew()) { - const { data } = await this.repository.create(this.#data.value); + const { data } = await this.repository.create(this.#data.value, this.#parentUnique); newData = data; } else { const { data } = await this.repository.save(this.#data.value); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts index a45aa456f3..0017fba7cb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace.context.ts @@ -16,6 +16,8 @@ export class UmbTemplateWorkspaceContext public readonly detailRepository = new UmbTemplateDetailRepository(this); public readonly itemRepository = new UmbTemplateItemRepository(this); + #parentUnique: string | null = null; + #data = new UmbObjectState(undefined); data = this.#data.asObservable(); #masterTemplate = new UmbObjectState(null); @@ -130,6 +132,7 @@ ${currentContent}`; }; async create(parentUnique: string | null) { + this.#parentUnique = parentUnique; const { data } = await this.detailRepository.createScaffold(); if (!data) return; this.setIsNew(true); @@ -146,7 +149,7 @@ ${currentContent}`; let newData = undefined; if (this.getIsNew()) { - const { data } = await this.detailRepository.create(this.#data.value); + const { data } = await this.detailRepository.create(this.#data.value, this.#parentUnique); newData = data; } else { const { data } = await this.detailRepository.save(this.#data.value); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.repository.ts index 7f404eaf42..a64a7806b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.repository.ts @@ -8,4 +8,8 @@ export class UmbUserGroupDetailRepository extends UmbDetailRepositoryBase { - this.#workspaceContext.create(); + this.#workspaceContext.createScaffold(); new UmbWorkspaceIsNewRedirectController( this, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts index 44a307275c..eda35bc716 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.repository.ts @@ -8,4 +8,8 @@ export class UmbUserDetailRepository extends UmbDetailRepositoryBase Date: Mon, 19 Feb 2024 10:03:08 +0100 Subject: [PATCH 004/170] unique can be null --- .../src/packages/core/action/repository-action.ts | 4 ++-- .../core/data-type/entity-actions/copy/copy.action.ts | 9 +++------ .../core/data-type/entity-actions/move/move.action.ts | 9 +++------ .../core/entity-action/common/delete/delete.action.ts | 3 ++- .../core/entity-action/common/rename/rename.action.ts | 3 ++- .../core/entity-action/common/trash/trash.action.ts | 8 ++++---- .../packages/core/entity-action/entity-action.event.ts | 4 ++-- .../src/packages/core/entity-action/entity-action.ts | 10 +++++----- .../delete-folder/delete-folder.action.ts | 3 ++- .../folder-update/folder-update.action.ts | 1 + .../reload-tree-item-children.action.ts | 4 ++-- .../dictionary/entity-action/export/export.action.ts | 1 + .../entity-actions/permissions/permissions.action.ts | 1 + .../public-access/public-access.action.ts | 1 + .../change-password/change-user-password.action.ts | 1 + .../user/entity-actions/disable/disable-user.action.ts | 1 + .../user/entity-actions/enable/enable-user.action.ts | 1 + .../user/entity-actions/unlock/unlock-user.action.ts | 1 + .../resend-invite/resend-invite.action.ts | 1 + 19 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts index 37875ffaef..ebcb378547 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/action/repository-action.ts @@ -1,4 +1,4 @@ -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import { type UmbApi, UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -6,7 +6,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr export class UmbActionBase extends UmbBaseController implements UmbApi { repository?: RepositoryType; - constructor(host: UmbControllerHostElement, repositoryAlias: string) { + constructor(host: UmbControllerHost, repositoryAlias: string) { super(host); new UmbExtensionApiInitializer(this, umbExtensionsRegistry, repositoryAlias, [this._host], (permitted, ctrl) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/copy/copy.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/copy/copy.action.ts index c819029c7b..d21f2d29b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/copy/copy.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/entity-actions/copy/copy.action.ts @@ -1,12 +1,8 @@ import type { UmbCopyDataTypeRepository } from '../../repository/copy/data-type-copy.repository.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import type { - UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; -import { - UMB_MODAL_MANAGER_CONTEXT, - UMB_DATA_TYPE_PICKER_MODAL, -} from '@umbraco-cms/backoffice/modal'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT, UMB_DATA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; // TODO: investigate what we need to make a generic copy action export class UmbCopyDataTypeEntityAction extends UmbEntityActionBase { @@ -21,6 +17,7 @@ export class UmbCopyDataTypeEntityAction extends UmbEntityActionBase { @@ -21,6 +17,7 @@ export class UmbMoveDataTypeEntityAction extends UmbEntityActionBase> { @@ -17,6 +17,7 @@ export class UmbRenameEntityAction extends UmbEntityActionBase { - this.repository?.trash(this.unique); - }); + await modalContext?.onSubmit(); + this.repository?.trash(this.unique); } } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.event.ts index 4eafc96b78..138b4a1381 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.event.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.event.ts @@ -1,7 +1,7 @@ import { UmbControllerEvent } from '@umbraco-cms/backoffice/controller-api'; export interface UmbEntityActionEventArgs { - unique: string; + unique: string | null; entityType: string; } @@ -17,7 +17,7 @@ export class UmbEntityActionEvent extends UmbControllerEvent { return this.#args.entityType; } - getUnique(): string { + getUnique(): string | null { return this.#args.unique; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.ts index 8b2e890e32..e52810f9f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.ts @@ -1,17 +1,17 @@ -import type { UmbAction} from '../action/index.js'; +import type { UmbAction } from '../action/index.js'; import { UmbActionBase } from '../action/index.js'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbEntityAction extends UmbAction { - unique: string; + unique: string | null; } export class UmbEntityActionBase extends UmbActionBase { entityType: string; - unique: string; + unique: string | null; repositoryAlias: string; - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string, entityType: string) { + constructor(host: UmbControllerHost, repositoryAlias: string, unique: string | null, entityType: string) { super(host, repositoryAlias); this.entityType = entityType; this.unique = unique; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.ts index 076f360877..f994e6d3ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.ts @@ -1,7 +1,7 @@ import { UmbEntityActionBase } from '../../../../entity-action/entity-action.js'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { UMB_MODAL_MANAGER_CONTEXT, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; import type { UmbFolderRepository } from '@umbraco-cms/backoffice/tree'; @@ -17,6 +17,7 @@ export class UmbDeleteFolderEntityAction extends } async execute() { + if (!this.unique) throw new Error('Unique is not available'); if (!this.repository || !this.#modalContext) return; const { data: folder } = await this.repository.request(this.unique); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/folder-update/folder-update.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/folder-update/folder-update.action.ts index 18863eb76b..37de0d4f25 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/folder-update/folder-update.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/folder-update/folder-update.action.ts @@ -18,6 +18,7 @@ export class UmbFolderUpdateEntityAction< } async execute() { + if (!this.unique) throw new Error('Unique is not available'); if (!this.repository || !this.#modalContext) return; const modalContext = this.#modalContext.open(UMB_FOLDER_UPDATE_MODAL, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts index 6d9f0e45e1..fb428927a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts @@ -1,13 +1,13 @@ import type { UmbCopyDataTypeRepository } from '../../data-type/repository/copy/data-type-copy.repository.js'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from './reload-tree-item-children-request.event.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_ACTION_EVENT_CONTEXT, type UmbActionEventContext } from '@umbraco-cms/backoffice/action'; export class UmbReloadTreeItemChildrenEntityAction extends UmbEntityActionBase { #actionEventContext?: UmbActionEventContext; - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string, entityType: string) { + constructor(host: UmbControllerHost, repositoryAlias: string, unique: string | null, entityType: string) { super(host, repositoryAlias, unique, entityType); this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/export/export.action.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/export/export.action.ts index c0f21cefb6..cb828244a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/export/export.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/export/export.action.ts @@ -20,6 +20,7 @@ export default class UmbExportDictionaryEntityAction extends UmbEntityActionBase } async execute() { + if (!this.unique) throw new Error('Unique is not available'); if (!this.#modalContext) return; const modalContext = this.#modalContext?.open(UMB_EXPORT_DICTIONARY_MODAL, { data: { unique: this.unique } }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts index 2c08ad502b..bf0d113f1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts @@ -16,6 +16,7 @@ export class UmbDocumentPermissionsEntityAction extends UmbEntityActionBase Date: Mon, 19 Feb 2024 20:45:35 +0100 Subject: [PATCH 005/170] don't handle new items in store connectors --- .../data-type/tree/data-type-tree.store.ts | 27 +++----------- .../packages/core/store/store-connector.ts | 35 ++++++++++--------- .../dictionary/tree/dictionary-tree.store.ts | 27 +++----------- .../tree/document-type.tree.store.ts | 28 +++------------ .../documents/repository/detail/index.ts | 1 + .../documents/tree/document-tree.store.ts | 22 ++++++++++++ .../documents/documents/tree/types.ts | 2 +- .../media-types/tree/media-type-tree.store.ts | 27 +++----------- .../tree/member-type-tree.store.ts | 27 +++----------- .../tree/partial-view-tree.store.ts | 28 +++------------ .../scripts/tree/script-tree.store.ts | 28 +++------------ .../stylesheets/tree/stylesheet-tree.store.ts | 28 +++------------ .../templates/tree/template-tree.store.ts | 28 +++------------ 13 files changed, 87 insertions(+), 221 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.store.ts index 3032bcce4a..cb92fd9823 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/tree/data-type-tree.store.ts @@ -21,30 +21,13 @@ export class UmbDataTypeTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_DATA_TYPE_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_DATA_TYPE_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_DATA_TYPE_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbDataTypeDetailModel) => { - const treeItem: UmbDataTypeTreeItemModel = { - unique: item.unique, - parentUnique: null, - name: item.name, - entityType: item.entityType, - isFolder: false, - hasChildren: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbDataTypeDetailModel) => { return { name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/store/store-connector.ts b/src/Umbraco.Web.UI.Client/src/packages/core/store/store-connector.ts index 905069f754..54fa73cf3f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/store/store-connector.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/store/store-connector.ts @@ -5,27 +5,28 @@ import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +export interface UmbStoreConnectorArgs { + store: UmbStoreBase; + connectToStoreAlias: UmbContextToken | string; + newStoreItemMapper?: (item: ConnectedStoreType) => StoreType; + updateStoreItemMapper?: (item: ConnectedStoreType) => Partial; +} + // WIP: get back to this when we have decided on detail model sizes export class UmbStoreConnector { #store: UmbStore; #connectedStore?: UmbStore; - #onNewStoreItem: (item: ConnectedStoreType) => StoreType; - #onUpdateStoreItem: (item: ConnectedStoreType) => Partial; + #newStoreItemMapper?: (item: ConnectedStoreType) => StoreType; + #updateStoreItemMapper?: (item: ConnectedStoreType) => Partial; - constructor( - host: UmbControllerHost, - store: UmbStoreBase, - connectToStoreAlias: UmbContextToken | string, - onNewStoreItem: (item: ConnectedStoreType) => StoreType, - onUpdateStoreItem: (item: ConnectedStoreType) => Partial, - ) { - this.#store = store; - this.#onNewStoreItem = onNewStoreItem; - this.#onUpdateStoreItem = onUpdateStoreItem; + constructor(host: UmbControllerHost, args: UmbStoreConnectorArgs) { + this.#store = args.store; + this.#newStoreItemMapper = args.newStoreItemMapper; + this.#updateStoreItemMapper = args.updateStoreItemMapper; console.warn('UmbStoreConnector is a work in progress and should not be used yet'); - new UmbContextConsumerController(host, connectToStoreAlias, (instance) => { + new UmbContextConsumerController(host, args.connectToStoreAlias, (instance) => { this.#connectedStore = instance; if (this.#connectedStore) { @@ -47,10 +48,10 @@ export class UmbStoreConnector { const connectedStoreItem = this.#connectedStore!.getItems([unique])[0]; // we check if the current store has the item from the connected store, if it does we update it, if it doesn't we append it - if (storeHasItem) { - this.#store.updateItem(unique, this.#onUpdateStoreItem(connectedStoreItem!)); - } else { - this.#store.append(this.#onNewStoreItem(connectedStoreItem!)); + if (storeHasItem && this.#updateStoreItemMapper) { + this.#store.updateItem(unique, this.#updateStoreItemMapper(connectedStoreItem!)); + } else if (this.#newStoreItemMapper) { + this.#store.append(this.#newStoreItemMapper(connectedStoreItem!)); } }); }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.store.ts index 3e66d83a8a..924780c511 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.store.ts @@ -21,30 +21,13 @@ export class UmbDictionaryTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_DICTIONARY_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_DICTIONARY_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_DICTIONARY_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbDictionaryDetailModel) => { - const treeItem: UmbDictionaryTreeItemModel = { - unique: item.unique, - parentUnique: null, - name: item.name, - entityType: item.entityType, - isFolder: false, - hasChildren: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (model: UmbDictionaryDetailModel) => { return { name: model.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts index 01889f5978..22df26787e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.store.ts @@ -21,31 +21,13 @@ export class UmbDocumentTypeTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_DOCUMENT_TYPE_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbDocumentTypeDetailModel) => { - const treeItem: UmbDocumentTypeTreeItemModel = { - unique: item.unique, - parentUnique: null, - name: item.name, - entityType: item.entityType, - isElement: item.isElement, - isFolder: false, - hasChildren: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbDocumentTypeDetailModel) => { return { name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/index.ts index ddeb20f533..2cfd8af063 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/index.ts @@ -1,2 +1,3 @@ export { UmbDocumentDetailRepository } from './document-detail.repository.js'; export { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_DOCUMENT_DETAIL_STORE_CONTEXT } from './document-detail.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.store.ts index f68d14f062..bd8fbcc3c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.store.ts @@ -1,6 +1,10 @@ +import type { UmbDocumentDetailModel } from '../types.js'; +import { UMB_DOCUMENT_DETAIL_STORE_CONTEXT } from '../repository/detail/index.js'; +import type { UmbDocumentTreeItemModel } from './types.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbUniqueTreeStore } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbStoreConnector } from '@umbraco-cms/backoffice/store'; /** * @export @@ -16,7 +20,25 @@ export class UmbDocumentTreeStore extends UmbUniqueTreeStore { */ constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_TREE_STORE_CONTEXT.toString()); + + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_DOCUMENT_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } + + #updateTreeItemMapper = (item: UmbDocumentDetailModel) => { + return { + variants: item.variants.map((variant) => { + return { + name: variant.name, + culture: variant.culture, + state: variant.state, + }; + }), + }; + }; } export const UMB_DOCUMENT_TREE_STORE_CONTEXT = new UmbContextToken('UmbDocumentTreeStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts index 7a069b19be..d51714211c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/types.ts @@ -22,5 +22,5 @@ export interface UmbDocumentTreeRootModel extends UmbUniqueTreeRootModel { export interface UmbDocumentTreeItemVariantModel { name: string; culture: string | null; - state: DocumentVariantStateModel; // TODO: make our own enum for this. We might have states for "unsaved changes" etc. + state: DocumentVariantStateModel | null; // TODO: make our own enum for this. We might have states for "unsaved changes" etc. } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.store.ts index dbfe485b39..74c164a3ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.store.ts @@ -21,30 +21,13 @@ export class UmbMediaTypeTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_MEDIA_TYPE_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_MEDIA_TYPE_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_MEDIA_TYPE_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbMediaTypeDetailModel) => { - const treeItem: UmbMediaTypeTreeItemModel = { - unique: item.unique, - parentUnique: null, - name: item.name, - entityType: item.entityType, - isFolder: false, - hasChildren: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbMediaTypeDetailModel) => { return { name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.store.ts index 92b437447b..6cdc3fee17 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.store.ts @@ -21,30 +21,13 @@ export class UmbMemberTypeTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_MEMBER_TYPE_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_MEMBER_TYPE_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbMemberTypeDetailModel) => { - const treeItem: UmbMemberTypeTreeItemModel = { - unique: item.unique, - parentUnique: null, - name: item.name, - entityType: item.entityType, - isFolder: false, - hasChildren: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbMemberTypeDetailModel) => { return { name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts index ff66d832e8..bdd01d8dd3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.store.ts @@ -1,4 +1,3 @@ -import { UMB_PARTIAL_VIEW_ENTITY_TYPE } from '../entity.js'; import { UMB_PARTIAL_VIEW_DETAIL_STORE_CONTEXT } from '../repository/partial-view-detail.store.js'; import type { UmbPartialViewDetailModel } from '../types.js'; import type { UmbPartialViewTreeItemModel } from './types.js'; @@ -22,30 +21,13 @@ export class UmbPartialViewTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_PARTIAL_VIEW_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_PARTIAL_VIEW_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_PARTIAL_VIEW_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbPartialViewDetailModel) => { - const treeItem: UmbPartialViewTreeItemModel = { - unique: item.unique, - parentUnique: null, - entityType: UMB_PARTIAL_VIEW_ENTITY_TYPE, - name: item.name, - hasChildren: false, - isFolder: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbPartialViewDetailModel) => { return { name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.store.ts index 519b7c9b8e..e0d9faa03c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.store.ts @@ -1,4 +1,3 @@ -import { UMB_SCRIPT_ENTITY_TYPE } from '../entity.js'; import type { UmbScriptDetailModel } from '../types.js'; import { UMB_SCRIPT_DETAIL_STORE_CONTEXT } from '../repository/index.js'; import type { UmbScriptTreeItemModel } from './types.js'; @@ -22,30 +21,13 @@ export class UmbScriptTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_SCRIPT_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_SCRIPT_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_SCRIPT_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbScriptDetailModel) => { - const treeItem: UmbScriptTreeItemModel = { - unique: item.unique, - parentUnique: null, - entityType: UMB_SCRIPT_ENTITY_TYPE, - name: item.name, - hasChildren: false, - isFolder: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbScriptDetailModel) => { return { name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts index eb4991eec4..3c5b1215a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.store.ts @@ -1,6 +1,5 @@ import type { UmbStylesheetDetailModel } from '../types.js'; import { UMB_STYLESHEET_DETAIL_STORE_CONTEXT } from '../repository/index.js'; -import { UMB_STYLESHEET_ENTITY_TYPE } from '../entity.js'; import type { UmbStylesheetTreeItemModel } from './types.js'; import { UmbUniqueTreeStore } from '@umbraco-cms/backoffice/tree'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -22,30 +21,13 @@ export class UmbStylesheetTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_STYLESHEET_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_STYLESHEET_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_STYLESHEET_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbStylesheetDetailModel) => { - const treeItem: UmbStylesheetTreeItemModel = { - unique: item.unique, - parentUnique: null, - entityType: UMB_STYLESHEET_ENTITY_TYPE, - name: item.name, - hasChildren: false, - isFolder: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbStylesheetDetailModel) => { return { name: item.name, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts index d542d79ed6..b070a03cb0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.store.ts @@ -1,6 +1,5 @@ import { UMB_TEMPLATE_DETAIL_STORE_CONTEXT } from '../repository/detail/template-detail.store.js'; import type { UmbTemplateDetailModel } from '../types.js'; -import { UMB_TEMPLATE_ENTITY_TYPE } from '../entity.js'; import type { UmbTemplateTreeItemModel } from './types.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; @@ -22,30 +21,13 @@ export class UmbTemplateTreeStore extends UmbUniqueTreeStore { constructor(host: UmbControllerHostElement) { super(host, UMB_TEMPLATE_TREE_STORE_CONTEXT.toString()); - new UmbStoreConnector( - host, - this, - UMB_TEMPLATE_DETAIL_STORE_CONTEXT, - (item) => this.#createTreeItemMapper(item), - (item) => this.#updateTreeItemMapper(item), - ); + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_TEMPLATE_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); } - // TODO: revisit this when we have decided on detail model sizes - #createTreeItemMapper = (item: UmbTemplateDetailModel) => { - const treeItem: UmbTemplateTreeItemModel = { - unique: item.unique, - entityType: UMB_TEMPLATE_ENTITY_TYPE, - parentUnique: null, - name: item.name, - hasChildren: false, - isFolder: false, - }; - - return treeItem; - }; - - // TODO: revisit this when we have decided on detail model sizes #updateTreeItemMapper = (item: UmbTemplateDetailModel) => { return { name: item.name, From 1edbf2dcf56e1be73cfe104f884067da773f492c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 19 Feb 2024 21:47:25 +0100 Subject: [PATCH 006/170] remove import --- .../repository/detail/data-type-detail.server.data-source.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.server.data-source.ts index 5c14905053..343901d3a5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/data-type/repository/detail/data-type-detail.server.data-source.ts @@ -6,7 +6,6 @@ import type { CreateDataTypeRequestModel, DataTypeModelBaseModel } from '@umbrac import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { Part } from 'lit-html'; /** * A data source for the Data Type that fetches data from the server From 82826f8ff531f597df88b67ec84f74e7ee8e2b3c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 25 Feb 2024 10:00:15 +0100 Subject: [PATCH 007/170] eslint --- .../core/tree/data-source/tree-server-data-source-base.ts | 2 +- .../packages/core/tree/tree-item-default/tree-item.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-server-data-source-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-server-data-source-base.ts index 22bea85ee8..5ae90f5b49 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-server-data-source-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-server-data-source-base.ts @@ -1,7 +1,7 @@ +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbTreeItemModelBase } from '../types.js'; import type { UmbTreeDataSource } from './tree-data-source.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { TreeItemPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbPagedModel } from '@umbraco-cms/backoffice/repository'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.element.ts index 9ae2c30f17..eebb63ded1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.element.ts @@ -1,6 +1,6 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbTreeItemModelBase } from '../types.js'; import { css, html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; From 335d2bc253029f92372016935382a5c8a978e402 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 25 Feb 2024 10:02:41 +0100 Subject: [PATCH 008/170] simplify name --- .../src/packages/core/tree/index.ts | 2 +- .../tree-item-base/tree-item-base.context.ts | 2 +- .../tree-item-base/tree-item-base.element.ts | 2 +- .../tree-item-base/tree-item-base.stories.ts | 20 ------------------- .../{tree-item-default => tree-item}/index.ts | 0 .../tree-item.context.interface.ts | 0 .../tree-item.element.ts | 6 +++--- .../src/packages/core/tree/tree.element.ts | 6 +++--- 8 files changed, 9 insertions(+), 29 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.stories.ts rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{tree-item-default => tree-item}/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{tree-item-default => tree-item}/tree-item.context.interface.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{tree-item-default => tree-item}/tree-item.element.ts (84%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index 01d898642e..a884629825 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -1,5 +1,5 @@ export * from './components/index.js'; -export * from './tree-item-default/index.js'; +export * from './tree-item/index.js'; export * from './tree-item-base/index.js'; export * from './tree-menu-item-default/index.js'; export * from './tree.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.context.ts index 7d97023e32..c2fdafc667 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.context.ts @@ -1,4 +1,4 @@ -import type { UmbTreeItemContext } from '../tree-item-default/tree-item.context.interface.js'; +import type { UmbTreeItemContext } from '../tree-item/tree-item.context.interface.js'; import type { UmbTreeContextBase } from '../tree.context.js'; import type { UmbTreeItemModelBase } from '../types.js'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../reload-tree-item-children/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.element.ts index 0616bdef99..7420e02c34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.element.ts @@ -1,4 +1,4 @@ -import type { UmbTreeItemContext } from '../tree-item-default/index.js'; +import type { UmbTreeItemContext } from '../tree-item/index.js'; import type { UmbTreeItemModelBase } from '../types.js'; import { UMB_TREE_ITEM_CONTEXT } from './tree-item-base.context.js'; import { html, nothing, customElement, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.stories.ts deleted file mode 100644 index c946750acb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.stories.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/web-components'; -import './tree-item-base.element.js'; -import type { UmbTreeItemBaseElement } from './tree-item-base.element.js'; - -// TODO: provide tree item context to make this element render properly -const meta: Meta = { - title: 'Components/Tree/Tree Item Default', - component: 'umb-tree-item-default', -}; - -export default meta; -type Story = StoryObj; - -export const Overview: Story = { - args: {}, -}; - -export const WithChildren: Story = { - args: {}, -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.context.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.context.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts index eebb63ded1..b6e7456b8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts @@ -4,8 +4,8 @@ import { css, html, nothing, customElement, property } from '@umbraco-cms/backof import type { ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -@customElement('umb-tree-item-default') -export class UmbTreeItemDefaultElement extends UmbLitElement { +@customElement('umb-tree-item') +export class UmbTreeItemElement extends UmbLitElement { @property({ type: Object, attribute: false }) item?: UmbTreeItemModelBase; @@ -31,6 +31,6 @@ export class UmbTreeItemDefaultElement extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-tree-item-default': UmbTreeItemDefaultElement; + 'umb-tree-item': UmbTreeItemElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index d62ad4de7b..86e49c4b29 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -4,7 +4,7 @@ import { html, nothing, customElement, property, state, repeat } from '@umbraco- import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import './tree-item-default/tree-item.element.js'; +import './tree-item/tree-item.element.js'; import './tree-item-base/tree-item-base.element.js'; export type UmbTreeSelectionConfiguration = { @@ -121,7 +121,7 @@ export class UmbTreeElement extends UmbLitElement { #renderTreeRoot() { if (this.hideTreeRoot || this._treeRoot === undefined) return nothing; - return html` `; + return html` `; } #renderRootItems() { @@ -131,7 +131,7 @@ export class UmbTreeElement extends UmbLitElement { this._items, // TODO: use unique here: (item, index) => item.name + '___' + index, - (item) => html``, + (item) => html``, )} `; } From 9232cdc4731880b8e44a6fa1a62354faed957859 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 25 Feb 2024 10:23:44 +0100 Subject: [PATCH 009/170] move repo, data source + store files into a data folder --- .../src/packages/core/tree/data-source/index.ts | 2 -- .../src/packages/core/tree/data/index.ts | 6 ++++++ .../{data-source => data}/tree-data-source.interface.ts | 0 .../core/tree/{ => data}/tree-repository-base.ts | 4 ++-- .../core/tree/{ => data}/tree-repository.interface.ts | 2 +- .../tree-server-data-source-base.ts | 0 .../core/tree/{ => data}/tree-store.interface.ts | 2 +- .../packages/core/tree/{ => data}/unique-tree-store.ts | 2 +- .../src/packages/core/tree/index.ts | 9 ++------- .../src/packages/core/tree/tree.context.ts | 2 +- .../src/packages/data-type/repository/detail/index.ts | 1 + .../src/packages/data-type/repository/index.ts | 6 +++++- .../packages/data-type/tree/data-type-tree.repository.ts | 2 +- .../src/packages/data-type/tree/data-type-tree.store.ts | 6 +++--- 14 files changed, 24 insertions(+), 20 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{data-source => data}/tree-data-source.interface.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => data}/tree-repository-base.ts (98%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => data}/tree-repository.interface.ts (96%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{data-source => data}/tree-server-data-source-base.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => data}/tree-store.interface.ts (94%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => data}/unique-tree-store.ts (96%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/index.ts deleted file mode 100644 index 620557f531..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { UmbTreeDataSource } from './tree-data-source.interface.js'; -export { UmbTreeServerDataSourceBase } from './tree-server-data-source-base.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts new file mode 100644 index 0000000000..5e3dd1722e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts @@ -0,0 +1,6 @@ +export { UmbTreeServerDataSourceBase } from './tree-server-data-source-base.js'; +export { UmbTreeRepositoryBase } from './tree-repository-base.js'; + +export type { UmbTreeDataSource } from './tree-data-source.interface.js'; +export type { UmbTreeRepository } from './tree-repository.interface.js'; +export type { UmbTreeStore } from './tree-store.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-data-source.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts index 47bd0f09b5..cbfe330c55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts @@ -1,7 +1,7 @@ import type { UmbTreeStore } from './tree-store.interface.js'; -import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from './types.js'; +import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '../types.js'; import type { UmbTreeRepository } from './tree-repository.interface.js'; -import type { UmbTreeDataSource, UmbTreeDataSourceConstructor } from './data-source/tree-data-source.interface.js'; +import type { UmbTreeDataSource, UmbTreeDataSourceConstructor } from './tree-data-source.interface.js'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts similarity index 96% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts index 153a65f287..15e4386f5a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts @@ -1,4 +1,4 @@ -import type { UmbTreeItemModelBase } from './types.js'; +import type { UmbTreeItemModelBase } from '../types.js'; import type { UmbPagedModel } from '@umbraco-cms/backoffice/repository'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ProblemDetails } from '@umbraco-cms/backoffice/external/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-server-data-source-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/data-source/tree-server-data-source-base.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-store.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-store.interface.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-store.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-store.interface.ts index dbeefe8ed6..11355a21f4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-store.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-store.interface.ts @@ -1,4 +1,4 @@ -import type { UmbTreeItemModelBase } from './types.js'; +import type { UmbTreeItemModelBase } from '../types.js'; import type { UmbStore } from '@umbraco-cms/backoffice/store'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-store.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/unique-tree-store.ts similarity index 96% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-store.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/data/unique-tree-store.ts index b1e25e9366..9c03a87030 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/unique-tree-store.ts @@ -1,5 +1,5 @@ +import type { UmbUniqueTreeItemModel } from '../types.js'; import type { UmbTreeStore } from './tree-store.interface.js'; -import type { UmbUniqueTreeItemModel } from './types.js'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index a884629825..e1ad7fa1fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -5,15 +5,12 @@ export * from './tree-menu-item-default/index.js'; export * from './tree.context.js'; export * from './tree.element.js'; export * from './types.js'; -export * from './tree-repository.interface.js'; -export * from './tree-store.interface.js'; // Unique -export * from './unique-tree-store.js'; +export * from './data/unique-tree-store.js'; export * from './unique-tree-item/index.js'; -// Data Source -export * from './data-source/index.js'; +export * from './data/index.js'; // Folder export * from './folder/index.js'; @@ -23,5 +20,3 @@ export { UmbReloadTreeItemChildrenEntityAction, UmbReloadTreeItemChildrenRequestEntityActionEvent, } from './reload-tree-item-children/index.js'; - -export { UmbTreeRepositoryBase } from './tree-repository-base.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts index d80ac33eca..19b3ac8450 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts @@ -1,6 +1,6 @@ import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from './reload-tree-item-children/index.js'; import type { UmbTreeItemModelBase } from './types.js'; -import type { UmbTreeRepository } from './tree-repository.interface.js'; +import type { UmbTreeRepository } from './data/tree-repository.interface.js'; import { type UmbActionEventContext, UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { UmbPagedModel } from '@umbraco-cms/backoffice/repository'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/index.ts index a0e4f41ce6..c573c05244 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/index.ts @@ -1,2 +1,3 @@ export { UmbDataTypeDetailRepository } from './data-type-detail.repository.js'; export { UMB_DATA_TYPE_DETAIL_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_DATA_TYPE_DETAIL_STORE_CONTEXT } from './data-type-detail.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts index 5acdb79db9..b397505623 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/index.ts @@ -1,4 +1,8 @@ export { UmbCopyDataTypeRepository, COPY_DATA_TYPE_REPOSITORY_ALIAS } from './copy/index.js'; -export { UmbDataTypeDetailRepository, UMB_DATA_TYPE_DETAIL_REPOSITORY_ALIAS } from './detail/index.js'; +export { + UmbDataTypeDetailRepository, + UMB_DATA_TYPE_DETAIL_REPOSITORY_ALIAS, + UMB_DATA_TYPE_DETAIL_STORE_CONTEXT, +} from './detail/index.js'; export { UmbDataTypeItemRepository, UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS } from './item/index.js'; export { UmbMoveDataTypeRepository, MOVE_DATA_TYPE_REPOSITORY_ALIAS } from './move/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts index b0a3b12a27..8e1702f7ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts @@ -1,8 +1,8 @@ -import { UmbTreeRepositoryBase } from '../../core/tree/tree-repository-base.js'; import { UMB_DATA_TYPE_ROOT_ENTITY_TYPE } from '../entity.js'; import { UmbDataTypeTreeServerDataSource } from './data-type-tree.server.data-source.js'; import { UMB_DATA_TYPE_TREE_STORE_CONTEXT } from './data-type-tree.store.js'; import type { UmbDataTypeTreeItemModel, UmbDataTypeTreeRootModel } from './types.js'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.store.ts index b3647216a1..d6aa2e6d0a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.store.ts @@ -1,8 +1,8 @@ -import { UmbStoreConnector } from '../../core/store/store-connector.js'; -import { UmbUniqueTreeStore } from '../../core/tree/unique-tree-store.js'; -import { UMB_DATA_TYPE_DETAIL_STORE_CONTEXT } from '../repository/detail/data-type-detail.store.js'; +import { UMB_DATA_TYPE_DETAIL_STORE_CONTEXT } from '../repository/index.js'; import type { UmbDataTypeDetailModel } from '../types.js'; import type { UmbDataTypeTreeItemModel } from './types.js'; +import { UmbUniqueTreeStore } from '@umbraco-cms/backoffice/tree'; +import { UmbStoreConnector } from '@umbraco-cms/backoffice/store'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; From 39ca73a3f7c48db3d6c61d9fe8dc771b6430ca97 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 21:56:10 +0100 Subject: [PATCH 010/170] rename tree-item base element and base context --- .../src/packages/core/tree/tree-item-base/index.ts | 4 ++-- ...m-base.context.ts => tree-item-context-base.ts} | 2 +- ...m-base.element.ts => tree-item-element-base.ts} | 14 ++++---------- .../src/packages/core/tree/tree.element.ts | 2 +- .../unique-tree-item/unique-tree-item.context.ts | 2 +- 5 files changed, 9 insertions(+), 15 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/{tree-item-base.context.ts => tree-item-context-base.ts} (98%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/{tree-item-base.element.ts => tree-item-element-base.ts} (92%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/index.ts index 8e2440f40d..c32ffc8077 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/index.ts @@ -1,2 +1,2 @@ -export * from './tree-item-base.context.js'; -export * from './tree-item-base.element.js'; +export * from './tree-item-context-base.js'; +export * from './tree-item-element-base.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts index c2fdafc667..254e22e489 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts @@ -17,7 +17,7 @@ export type UmbTreeItemUniqueFunction x: TreeItemType, ) => string | null | undefined; -export class UmbTreeItemContextBase +export abstract class UmbTreeItemContextBase extends UmbBaseController implements UmbTreeItemContext { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts index 7420e02c34..81f83df840 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-base.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts @@ -1,11 +1,11 @@ import type { UmbTreeItemContext } from '../tree-item/index.js'; import type { UmbTreeItemModelBase } from '../types.js'; -import { UMB_TREE_ITEM_CONTEXT } from './tree-item-base.context.js'; -import { html, nothing, customElement, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UMB_TREE_ITEM_CONTEXT } from './tree-item-context-base.js'; +import { html, nothing, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -@customElement('umb-tree-item-base') -export class UmbTreeItemBaseElement extends UmbLitElement { +// eslint-disable-next-line local-rules/enforce-element-suffix-on-element-class-name +export abstract class UmbTreeItemElementBase extends UmbLitElement { @state() private _item?: UmbTreeItemModelBase; @@ -165,9 +165,3 @@ export class UmbTreeItemBaseElement extends UmbLitElement { `; } } - -declare global { - interface HTMLElementTagNameMap { - 'umb-tree-item-base': UmbTreeItemBaseElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index 86e49c4b29..ef57d11f20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -5,7 +5,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import './tree-item/tree-item.element.js'; -import './tree-item-base/tree-item-base.element.js'; +import './tree-item-base/tree-item-element-base.js'; export type UmbTreeSelectionConfiguration = { multiple?: boolean; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.context.ts index 830384a3b3..6356b564a9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.context.ts @@ -1,4 +1,4 @@ -import { UmbTreeItemContextBase } from '../tree-item-base/tree-item-base.context.js'; +import { UmbTreeItemContextBase } from '../tree-item-base/tree-item-context-base.js'; import type { UmbUniqueTreeItemModel } from '../types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; From d0daaa8ac93ab1e2ad38ed1d8749120f628529e8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 22:24:16 +0100 Subject: [PATCH 011/170] change unique tree item to default tree item --- .../src/packages/core/tree/index.ts | 2 +- .../src/packages/core/tree/manifests.ts | 3 +- .../tree-item-base/tree-item-context-base.ts | 7 ++- .../tree-item-base/tree-item-element-base.ts | 5 +-- .../core/tree/tree-item-default/index.ts | 2 + .../core/tree/tree-item-default/manifests.ts | 15 +++++++ .../tree-item-default.context.ts} | 4 +- .../tree-item-default.element.ts | 11 +++++ .../core/tree/tree-item/tree-item.element.ts | 2 +- .../core/tree/unique-tree-item/index.ts | 2 - .../unique-tree-item.element.ts | 45 ------------------- .../src/packages/data-type/tree/manifests.ts | 2 +- .../src/packages/dictionary/tree/manifests.ts | 2 +- .../document-types/tree/manifests.ts | 2 +- .../documents/recycle-bin/tree/manifests.ts | 2 +- .../tree-item/document-tree-item.context.ts | 4 +- .../media/media-types/tree/manifests.ts | 2 +- .../packages/media/media/tree/manifests.ts | 2 +- .../members/member-type/tree/manifests.ts | 2 +- .../relation-types/tree/manifests.ts | 2 +- .../packages/static-file/tree/manifests.ts | 2 +- .../partial-views/tree/manifests.ts | 2 +- .../templating/scripts/tree/manifests.ts | 2 +- .../templating/stylesheets/tree/manifests.ts | 2 +- .../templating/templates/tree/manifests.ts | 2 +- 25 files changed, 53 insertions(+), 75 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{unique-tree-item/unique-tree-item.context.ts => tree-item-default/tree-item-default.context.ts} (73%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index e1ad7fa1fd..c390bcd763 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -8,7 +8,7 @@ export * from './types.js'; // Unique export * from './data/unique-tree-store.js'; -export * from './unique-tree-item/index.js'; +export * from './tree-item-default/index.js'; export * from './data/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts index 8426073c94..93149670ae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts @@ -1,3 +1,4 @@ import { manifests as folderManifests } from './folder/manifests.js'; +import { manifests as defaultTreeItemManifests } from './tree-item-default/manifests.js'; -export const manifests = [...folderManifests]; +export const manifests = [...folderManifests, ...defaultTreeItemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts index 254e22e489..3eb1afe20f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts @@ -8,7 +8,7 @@ import type { UmbSectionContext, UmbSectionSidebarContext } from '@umbraco-cms/b import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbBooleanState, UmbDeepState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UMB_ACTION_EVENT_CONTEXT, type UmbActionEventContext } from '@umbraco-cms/backoffice/action'; import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action'; @@ -18,7 +18,7 @@ export type UmbTreeItemUniqueFunction ) => string | null | undefined; export abstract class UmbTreeItemContextBase - extends UmbBaseController + extends UmbContextBase> implements UmbTreeItemContext { public unique?: string | null; @@ -59,10 +59,9 @@ export abstract class UmbTreeItemContextBase; constructor(host: UmbControllerHost, getUniqueFunction: UmbTreeItemUniqueFunction) { - super(host); + super(host, UMB_TREE_ITEM_CONTEXT); this.#getUniqueFunction = getUniqueFunction; this.#consumeContexts(); - this.provideContext(UMB_TREE_ITEM_CONTEXT, this); } public setTreeItem(treeItem: TreeItemType | undefined) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts index 81f83df840..f7c5373d34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts @@ -81,14 +81,11 @@ export abstract class UmbTreeItemElementBase extends UmbLitElement { }); } - private _openActions() { - this.#treeItemContext?.toggleContextMenu(); - } - // Note: Currently we want to prevent opening when the item is in a selectable context, but this might change in the future. // If we like to be able to open items in selectable context, then we might want to make it as a menu item action, so you have to click ... and chose an action called 'Edit' render() { return html` + HELLO HELLO = [ + { + type: 'kind', + alias: 'Umb.Kind.DefaultTreeItem', + matchKind: 'default', + matchType: 'treeItem', + manifest: { + type: 'treeItem', + element: () => import('./tree-item-default.element.js'), + api: () => import('./tree-item-default.context.js'), + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts similarity index 73% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts index 6356b564a9..3b9efeeeef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts @@ -1,8 +1,8 @@ -import { UmbTreeItemContextBase } from '../tree-item-base/tree-item-context-base.js'; +import { UmbTreeItemContextBase } from '../tree-item-base/index.js'; import type { UmbUniqueTreeItemModel } from '../types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export class UmbUniqueTreeItemContext< +export class UmbDefaultTreeItemContext< TreeItemModelType extends UmbUniqueTreeItemModel, > extends UmbTreeItemContextBase { constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts new file mode 100644 index 0000000000..ca815de068 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts @@ -0,0 +1,11 @@ +import { UmbTreeItemElementBase } from '../tree-item-base/index.js'; +import { customElement } from '@umbraco-cms/backoffice/external/lit'; + +@customElement('umb-default-tree-item') +export class UmbDefaultTreeItemElement extends UmbTreeItemElementBase {} + +declare global { + interface HTMLElementTagNameMap { + 'umb-default-tree-item': UmbDefaultTreeItemElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts index b6e7456b8a..124f7bce08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts @@ -1,5 +1,5 @@ -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbTreeItemModelBase } from '../types.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import type { ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/index.ts deleted file mode 100644 index 12e991943d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './unique-tree-item.context.js'; -export * from './unique-tree-item.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.element.ts deleted file mode 100644 index eabd7b456c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/unique-tree-item/unique-tree-item.element.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { UmbUniqueTreeItemModel } from '../types.js'; -import { UmbUniqueTreeItemContext } from './unique-tree-item.context.js'; -import { html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbBackofficeManifestKind, UmbTreeItemElement } from '@umbraco-cms/backoffice/extension-registry'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; - -// TODO: Move to separate file: -const manifest: UmbBackofficeManifestKind = { - type: 'kind', - alias: 'Umb.Kind.UniqueTreeItem', - matchKind: 'unique', - matchType: 'treeItem', - manifest: { - type: 'treeItem', - elementName: 'umb-unique-tree-item', - }, -}; -umbExtensionsRegistry.register(manifest); - -@customElement('umb-unique-tree-item') -export class UmbUniqueTreeItemElement extends UmbLitElement implements UmbTreeItemElement { - private _item?: UmbUniqueTreeItemModel; - @property({ type: Object, attribute: false }) - public get item() { - return this._item; - } - public set item(value: UmbUniqueTreeItemModel | undefined) { - this._item = value; - this.#context.setTreeItem(value); - } - - #context = new UmbUniqueTreeItemContext(this); - - render() { - if (!this.item) return nothing; - return html``; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-unique-tree-item': UmbUniqueTreeItemElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts index 6ab730ac33..8cae5e1536 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts @@ -37,7 +37,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.DataType', name: 'Data Type Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts index fb1e411cb0..3d5abb3d34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts @@ -38,7 +38,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.Dictionary', name: 'Dictionary Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts index 9a9bc9e598..bc97861ae4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts @@ -43,7 +43,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.DocumentType', name: 'Document Type Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts index 98b65c8230..3fbcbaee90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts @@ -38,7 +38,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.DocumentRecycleBin', name: 'DocumentRecycleBin Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts index e4d60cda12..e6dada196c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.context.ts @@ -1,8 +1,8 @@ import type { UmbDocumentTreeItemModel } from '../types.js'; -import { UmbUniqueTreeItemContext } from '@umbraco-cms/backoffice/tree'; +import { UmbDefaultTreeItemContext } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -export class UmbDocumentTreeItemContext extends UmbUniqueTreeItemContext { +export class UmbDocumentTreeItemContext extends UmbDefaultTreeItemContext { constructor(host: UmbControllerHost) { super(host); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts index b68b726998..a4fa2b35f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts @@ -41,7 +41,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.MediaType', name: 'Media Type Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts index ec00860ebd..883450b813 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts @@ -36,7 +36,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.Media', name: 'Media Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts index eaea29ea76..001c6a8207 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts @@ -38,7 +38,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.MemberType', name: 'Member Type Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts index 56c3e6eb4f..87d9cbb82a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts @@ -36,7 +36,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.RelationType', name: 'RelationType Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts index fdbb8c36ad..daf8884578 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts @@ -40,7 +40,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: UMB_STATIC_FILE_TREE_ITEM_ALIAS, name: 'Static File Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts index 31f220b973..fc5b9e7121 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts @@ -41,7 +41,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.PartialView', name: 'Partial View Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts index f6f6c03a56..4f5695abc8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts @@ -37,7 +37,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.Script', name: 'Script Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index ff7bb43b12..f7624a2249 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -42,7 +42,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.Stylesheet', name: 'Stylesheet Tree Item', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts index 7f582a0222..06093e4379 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts @@ -36,7 +36,7 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', - kind: 'unique', + kind: 'default', alias: 'Umb.TreeItem.Template', name: 'Template Tree Item', meta: { From 94845e75047f8ce46e3dbc988d572784712997e6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 11:20:24 +0100 Subject: [PATCH 012/170] add extension initializer element base --- .../extension-initializer-element-base.ts | 88 +++++++++++++++++++ .../packages/core/extension-registry/index.ts | 2 + 2 files changed, 90 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/extension-initializer-element-base.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/extension-initializer-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/extension-initializer-element-base.ts new file mode 100644 index 0000000000..76135380e6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/extension-initializer-element-base.ts @@ -0,0 +1,88 @@ +import { umbExtensionsRegistry } from './registry.js'; +import { html, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionElementInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; + +// TODO: Eslint: allow abstract element class to end with "ElementBase" instead of "Element" +// eslint-disable-next-line local-rules/enforce-element-suffix-on-element-class-name +export abstract class UmbExtensionInitializerElementBase< + ManifestType extends ManifestWithDynamicConditions, +> extends UmbLitElement { + _alias?: string; + @property({ type: String, reflect: true }) + get alias() { + return this._alias; + } + set alias(newVal) { + this._alias = newVal; + this.#observeManifest(); + } + + @property({ type: Object, attribute: false }) + get props() { + return this.#props; + } + set props(newVal: Record | undefined) { + // TODO, compare changes since last time. only reset the ones that changed. This might be better done by the controller is self: + this.#props = newVal; + if (this.#extensionElementController) { + this.#extensionElementController.properties = newVal; + } + } + #props?: Record = {}; + + #extensionElementController?: UmbExtensionElementInitializer; + + @state() + _element: HTMLElement | undefined; + + abstract getExtensionType(): string; + abstract getDefaultElementName(): string; + + #observeManifest() { + if (!this._alias) return; + this.observe( + umbExtensionsRegistry.byTypeAndAlias(this.getExtensionType(), this._alias), + async (m) => { + if (!m) return; + const manifest = m as unknown as ManifestType; + this.createApi(manifest); + this.createElement(manifest); + }, + 'umbObserveTreeManifest', + ); + } + + protected async createApi(manifest?: ManifestType) { + if (!manifest) throw new Error('No manifest'); + const api = (await createExtensionApi(manifest, [this])) as unknown as any; + if (!api) throw new Error('No api'); + api.setManifest(manifest); + } + + protected async createElement(manifest?: ManifestType) { + if (!manifest) throw new Error('No manifest'); + + const extController = new UmbExtensionElementInitializer( + this, + umbExtensionsRegistry, + manifest.alias, + this.#extensionChanged, + this.getDefaultElementName(), + ); + + extController.properties = this.#props; + + this.#extensionElementController = extController; + } + + #extensionChanged = (isPermitted: boolean, controller: UmbExtensionElementInitializer) => { + this._element = isPermitted ? controller.component : undefined; + this.requestUpdate('_element'); + }; + + render() { + return html`${this._element}`; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts index 0d8fb0ff4d..964c344673 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts @@ -2,3 +2,5 @@ export * from './conditions/index.js'; export * from './interfaces/index.js'; export * from './models/index.js'; export * from './registry.js'; + +export { UmbExtensionInitializerElementBase } from './extension-initializer-element-base.js'; From 4d01fa5e4f76818ffdf705965d112c2cf0b9570b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 13:47:15 +0100 Subject: [PATCH 013/170] use extension initializer for tree item --- .../tree-item-base/tree-item-context-base.ts | 22 +++++++ .../tree-item-base/tree-item-element-base.ts | 28 +++++---- .../tree-item-default.context.ts | 2 + .../tree-item-default.element.ts | 5 +- .../src/packages/core/tree/tree-item/index.ts | 2 +- ...face.ts => tree-item-context.interface.ts} | 0 .../core/tree/tree-item/tree-item.element.ts | 59 +++++++++++-------- .../src/packages/core/tree/tree.element.ts | 7 ++- 8 files changed, 84 insertions(+), 41 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/{tree-item.context.interface.ts => tree-item-context.interface.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts index 3eb1afe20f..ddc998ffc0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts @@ -5,6 +5,7 @@ import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../reload-tre import { map } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_SECTION_CONTEXT, UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/backoffice/section'; import type { UmbSectionContext, UmbSectionSidebarContext } from '@umbraco-cms/backoffice/section'; +import type { ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbBooleanState, UmbDeepState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -24,6 +25,8 @@ export abstract class UmbTreeItemContextBase(undefined); treeItem = this.#treeItem.asObservable(); @@ -64,6 +67,25 @@ export abstract class UmbTreeItemContextBase extends UmbLitElement { + @property({ type: Object, attribute: false }) + item?: TreeItemModelType; @state() - private _childItems?: UmbTreeItemModelBase[]; + private _item?: TreeItemModelType; + + @state() + private _childItems?: TreeItemModelType[]; @state() private _href?: string; @@ -33,7 +36,7 @@ export abstract class UmbTreeItemElementBase extends UmbLitElement { @state() private _iconSlotHasChildren = false; - #treeItemContext?: UmbTreeItemContext; + #treeItemContext?: UmbTreeItemContext; constructor() { super(); @@ -41,6 +44,9 @@ export abstract class UmbTreeItemElementBase extends UmbLitElement { this.consumeContext(UMB_TREE_ITEM_CONTEXT, (instance) => { this.#treeItemContext = instance; if (!this.#treeItemContext) return; + + this.#treeItemContext.setTreeItem(this.item); + // TODO: investigate if we can make an observe decorator this.observe(this.#treeItemContext.treeItem, (value) => (this._item = value)); this.observe(this.#treeItemContext.hasChildren, (value) => (this._hasChildren = value)); @@ -85,7 +91,6 @@ export abstract class UmbTreeItemElementBase extends UmbLitElement { // If we like to be able to open items in selectable context, then we might want to make it as a menu item action, so you have to click ... and chose an action called 'Edit' render() { return html` - HELLO HELLO - ${this.#renderIconContainer()} ${this.#renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()} + ${this.#renderIconContainer()} ${this.renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()} `; @@ -134,7 +139,7 @@ export abstract class UmbTreeItemElementBase extends UmbLitElement { return html``; } - #renderLabel() { + renderLabel() { return html``; } @@ -154,9 +159,8 @@ export abstract class UmbTreeItemElementBase extends UmbLitElement { ${this._childItems ? repeat( this._childItems, - // TODO: get unique here instead of name. we might be able to get it from the context - (item) => item.name, - (item) => html``, + (item, index) => item.name + '___' + index, + (item) => html``, ) : ''} `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts index 3b9efeeeef..a06a30e266 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts @@ -9,3 +9,5 @@ export class UmbDefaultTreeItemContext< super(host, (x: UmbUniqueTreeItemModel) => x.unique); } } + +export default UmbDefaultTreeItemContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts index ca815de068..2f35cd9feb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts @@ -1,8 +1,11 @@ import { UmbTreeItemElementBase } from '../tree-item-base/index.js'; +import type { UmbUniqueTreeItemModel } from '../types.js'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-default-tree-item') -export class UmbDefaultTreeItemElement extends UmbTreeItemElementBase {} +export class UmbDefaultTreeItemElement extends UmbTreeItemElementBase {} + +export default UmbDefaultTreeItemElement; declare global { interface HTMLElementTagNameMap { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts index 1ee7965541..1fa0f99af3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts @@ -1,2 +1,2 @@ -export * from './tree-item.context.interface.js'; +export * from './tree-item-context.interface.js'; export * from './tree-item.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-context.interface.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.context.interface.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-context.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts index 124f7bce08..e2fa41eb8c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts @@ -1,32 +1,43 @@ -import type { UmbTreeItemModelBase } from '../types.js'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { customElement, property } from '@umbraco-cms/backoffice/external/lit'; import type { ManifestTreeItem } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbExtensionInitializerElementBase, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-tree-item') -export class UmbTreeItemElement extends UmbLitElement { - @property({ type: Object, attribute: false }) - item?: UmbTreeItemModelBase; - - render() { - if (!this.item) return nothing; - return html` manifests.meta.entityTypes.includes(this.item!.entityType)} - .props=${{ - item: this.item, - }}>`; +export class UmbTreeItemElement extends UmbExtensionInitializerElementBase { + _entityType?: string; + @property({ type: String, reflect: true }) + get entityType() { + return this._entityType; + } + set entityType(newVal) { + this._entityType = newVal; + this.#observeManifest(); } - static styles = [ - UmbTextStyles, - css` - :host { - display: block; - } - `, - ]; + #observeManifest() { + if (!this._entityType) return; + this.observe( + umbExtensionsRegistry.byTypeAndFilter(this.getExtensionType(), (manifest: ManifestTreeItem) => + manifest.meta.entityTypes.includes(this._entityType), + ), + async (manifests) => { + if (!manifests) return; + // TODO: what should we do if there are multiple tree items for an entity type? + const manifest = manifests[0]; + this.createApi(manifest); + this.createElement(manifest); + }, + 'umbObserveTreeManifest', + ); + } + + getExtensionType() { + return 'treeItem'; + } + + getDefaultElementName() { + return 'umb-default-tree-item'; + } } declare global { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index ef57d11f20..0b7dd1c38f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -121,7 +121,9 @@ export class UmbTreeElement extends UmbLitElement { #renderTreeRoot() { if (this.hideTreeRoot || this._treeRoot === undefined) return nothing; - return html` `; + return html` + + `; } #renderRootItems() { @@ -129,9 +131,8 @@ export class UmbTreeElement extends UmbLitElement { return html` ${repeat( this._items, - // TODO: use unique here: (item, index) => item.name + '___' + index, - (item) => html``, + (item) => html``, )} `; } From f9ebbe0a2c708c3ab38444c0d4aac54afce1a1fb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 14:05:19 +0100 Subject: [PATCH 014/170] allow both manifest and api for tree item manifests --- .../models/tree-item.model.ts | 6 ++-- .../tree-item-base/tree-item-context-base.ts | 2 +- .../tree-item-base/tree-item-element-base.ts | 1 + .../tree-item/tree-item-context.interface.ts | 3 +- .../documents/documents/tree/manifests.ts | 4 ++- .../tree-item/document-tree-item.element.ts | 31 +++---------------- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts index 0f30b9dec6..f79b2e2ce2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts @@ -1,7 +1,9 @@ +import type { UmbTreeItemContext, UmbTreeItemModelBase } from '../../index.js'; import type { UmbTreeItemElement } from '../interfaces/index.js'; -import type { ManifestElement } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestElementAndApi } from '@umbraco-cms/backoffice/extension-api'; -export interface ManifestTreeItem extends ManifestElement { +export interface ManifestTreeItem + extends ManifestElementAndApi> { type: 'treeItem'; meta: MetaTreeItem; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts index ddc998ffc0..1e6ac60fa8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts @@ -1,4 +1,4 @@ -import type { UmbTreeItemContext } from '../tree-item/tree-item.context.interface.js'; +import type { UmbTreeItemContext } from '../tree-item/tree-item-context.interface.js'; import type { UmbTreeContextBase } from '../tree.context.js'; import type { UmbTreeItemModelBase } from '../types.js'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../reload-tree-item-children/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts index 8c874fbf3b..a06bb56812 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts @@ -45,6 +45,7 @@ export abstract class UmbTreeItemElementBase { +export interface UmbTreeItemContext extends UmbApi { unique?: string | null; entityType?: string; treeItem: Observable; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts index 0253a05463..68c0ea7e89 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../entity.js'; import { manifests as reloadTreeItemChildrenManifests } from './reload-tree-item-children/manifests.js'; +import { UmbDocumentTreeItemContext } from './tree-item/document-tree-item.context.js'; import type { ManifestRepository, ManifestTree, @@ -38,7 +39,8 @@ const treeItem: ManifestTreeItem = { type: 'treeItem', alias: 'Umb.TreeItem.Document', name: 'Document Tree Item', - js: () => import('./tree-item/document-tree-item.element.js'), + element: () => import('./tree-item/document-tree-item.element.js'), + api: UmbDocumentTreeItemContext, meta: { entityTypes: [UMB_DOCUMENT_ROOT_ENTITY_TYPE, UMB_DOCUMENT_ENTITY_TYPE], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts index d733c7fccf..cf53e23aba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts @@ -1,31 +1,10 @@ import type { UmbDocumentTreeItemModel } from '../types.js'; -import { UmbDocumentTreeItemContext } from './document-tree-item.context.js'; -import { css, html, nothing, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, nothing, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbTreeItemElement } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbTreeItemElementBase } from '@umbraco-cms/backoffice/tree'; @customElement('umb-document-tree-item') -export class UmbDocumentTreeItemElement extends UmbLitElement implements UmbTreeItemElement { - private _item?: UmbDocumentTreeItemModel; - @property({ type: Object, attribute: false }) - public get item() { - return this._item; - } - public set item(value: UmbDocumentTreeItemModel | undefined) { - this._item = value; - this.#context.setTreeItem(value); - } - - #context = new UmbDocumentTreeItemContext(this); - - render() { - if (!this.item) return nothing; - return html` - ${this.#renderIconWithStatusSymbol()} ${this.#renderLabel()} - `; - } - +export class UmbDocumentTreeItemElement extends UmbTreeItemElementBase { // TODO: implement correct status symbol #renderIconWithStatusSymbol() { return html` @@ -42,8 +21,8 @@ export class UmbDocumentTreeItemElement extends UmbLitElement implements UmbTree // TODO: lower opacity if item is not published // TODO: get correct variant name - #renderLabel() { - return html` ${this.item?.variants[0].name} `; + renderLabel() { + return html`${this.item?.variants[0].name} `; } static styles = [ From 99fb19eba5f6c669e3c3a05c3e6543e5d4ce6799 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 14:33:49 +0100 Subject: [PATCH 015/170] nest folders --- src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts | 5 +---- .../src/packages/core/tree/manifests.ts | 2 +- .../src/packages/core/tree/tree-item/index.ts | 2 ++ .../core/tree/{ => tree-item}/tree-item-base/index.ts | 0 .../tree-item-base/tree-item-context-base.ts | 8 ++++---- .../tree-item-base/tree-item-element-base.ts | 4 ++-- .../core/tree/{ => tree-item}/tree-item-default/index.ts | 0 .../tree/{ => tree-item}/tree-item-default/manifests.ts | 0 .../tree-item-default/tree-item-default.context.ts | 2 +- .../tree-item-default/tree-item-default.element.ts | 2 +- .../src/packages/core/tree/tree.element.ts | 2 +- 11 files changed, 13 insertions(+), 14 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => tree-item}/tree-item-base/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => tree-item}/tree-item-base/tree-item-context-base.ts (97%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => tree-item}/tree-item-base/tree-item-element-base.ts (97%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => tree-item}/tree-item-default/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => tree-item}/tree-item-default/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => tree-item}/tree-item-default/tree-item-default.context.ts (87%) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{ => tree-item}/tree-item-default/tree-item-default.element.ts (87%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index c390bcd763..0d4be5e886 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -1,16 +1,13 @@ export * from './components/index.js'; export * from './tree-item/index.js'; -export * from './tree-item-base/index.js'; export * from './tree-menu-item-default/index.js'; export * from './tree.context.js'; export * from './tree.element.js'; export * from './types.js'; +export * from './data/index.js'; // Unique export * from './data/unique-tree-store.js'; -export * from './tree-item-default/index.js'; - -export * from './data/index.js'; // Folder export * from './folder/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts index 93149670ae..85537d135d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts @@ -1,4 +1,4 @@ import { manifests as folderManifests } from './folder/manifests.js'; -import { manifests as defaultTreeItemManifests } from './tree-item-default/manifests.js'; +import { manifests as defaultTreeItemManifests } from './tree-item/tree-item-default/manifests.js'; export const manifests = [...folderManifests, ...defaultTreeItemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts index 1fa0f99af3..3a28d10485 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/index.ts @@ -1,2 +1,4 @@ export * from './tree-item-context.interface.js'; export * from './tree-item.element.js'; +export * from './tree-item-default/index.js'; +export * from './tree-item-base/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 1e6ac60fa8..7953d38f1b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -1,7 +1,7 @@ -import type { UmbTreeItemContext } from '../tree-item/tree-item-context.interface.js'; -import type { UmbTreeContextBase } from '../tree.context.js'; -import type { UmbTreeItemModelBase } from '../types.js'; -import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../reload-tree-item-children/index.js'; +import type { UmbTreeItemContext } from '../tree-item-context.interface.js'; +import type { UmbTreeContextBase } from '../../tree.context.js'; +import type { UmbTreeItemModelBase } from '../../types.js'; +import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../../reload-tree-item-children/index.js'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_SECTION_CONTEXT, UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/backoffice/section'; import type { UmbSectionContext, UmbSectionSidebarContext } from '@umbraco-cms/backoffice/section'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts index a06bb56812..8e052a0e20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts @@ -1,5 +1,5 @@ -import type { UmbTreeItemContext } from '../tree-item/index.js'; -import type { UmbTreeItemModelBase } from '../types.js'; +import type { UmbTreeItemContext } from '../index.js'; +import type { UmbTreeItemModelBase } from '../../types.js'; import { UMB_TREE_ITEM_CONTEXT } from './tree-item-context-base.js'; import { html, nothing, state, ifDefined, repeat, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.context.ts similarity index 87% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.context.ts index a06a30e266..04021f3c1a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.context.ts @@ -1,5 +1,5 @@ import { UmbTreeItemContextBase } from '../tree-item-base/index.js'; -import type { UmbUniqueTreeItemModel } from '../types.js'; +import type { UmbUniqueTreeItemModel } from '../../types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbDefaultTreeItemContext< diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.element.ts similarity index 87% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.element.ts index 2f35cd9feb..f512cc5f2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-default/tree-item-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.element.ts @@ -1,5 +1,5 @@ import { UmbTreeItemElementBase } from '../tree-item-base/index.js'; -import type { UmbUniqueTreeItemModel } from '../types.js'; +import type { UmbUniqueTreeItemModel } from '../../types.js'; import { customElement } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-default-tree-item') diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index 0b7dd1c38f..4e3d3073d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -5,7 +5,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import './tree-item/tree-item.element.js'; -import './tree-item-base/tree-item-element-base.js'; +import './tree-item/tree-item-base/tree-item-element-base.js'; export type UmbTreeSelectionConfiguration = { multiple?: boolean; From dd9663c0011012ade2159ba3ac940f049963d76f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 14:49:33 +0100 Subject: [PATCH 016/170] get entityType from item --- .../src/packages/core/tree/tree.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index 4e3d3073d0..585abe5b7a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -132,7 +132,7 @@ export class UmbTreeElement extends UmbLitElement { ${repeat( this._items, (item, index) => item.name + '___' + index, - (item) => html``, + (item) => html``, )} `; } From e5ee2b4de73b20729f97ce46f2c556e1dc808e92 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 14:59:10 +0100 Subject: [PATCH 017/170] move children methods to tree element --- .../core/tree/tree-context.interface.ts | 7 +++ .../tree-item-base/tree-item-context-base.ts | 15 +++++-- .../src/packages/core/tree/tree.context.ts | 45 ++++++------------- 3 files changed, 31 insertions(+), 36 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-context.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-context.interface.ts new file mode 100644 index 0000000000..dfca3c3672 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-context.interface.ts @@ -0,0 +1,7 @@ +import type { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; + +// TODO: update interface +export interface UmbTreeContext extends UmbContextBase { + selection: UmbSelectionManager; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 7953d38f1b..14f640e183 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -112,10 +112,12 @@ export abstract class UmbTreeItemContextBase children.length > 0), + ); // observe if any children will be added runtime to a tree item. Nested items/folders etc. - this.observe(observable.pipe(map((children) => children.length > 0)), (hasChildren) => { + this.observe(hasChildrenObservable, (hasChildren) => { // we need to skip the first value, because it will also return false until a child is in the store // we therefor rely on the value from the tree item itself if (this.#hasChildrenInitValueFlag === true) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts index 19b3ac8450..e8ad267a93 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts @@ -1,9 +1,8 @@ import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from './reload-tree-item-children/index.js'; import type { UmbTreeItemModelBase } from './types.js'; import type { UmbTreeRepository } from './data/tree-repository.interface.js'; +import type { UmbTreeContext } from './tree-context.interface.js'; import { type UmbActionEventContext, UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; -import type { UmbPagedModel } from '@umbraco-cms/backoffice/repository'; import { type ManifestRepository, type ManifestTree, @@ -12,33 +11,22 @@ import { import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; -import type { ProblemDetails } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -// TODO: update interface -export interface UmbTreeContext extends UmbBaseController { - selection: UmbSelectionManager; - requestChildrenOf: (parentUnique: string | null) => Promise<{ - data?: UmbPagedModel; - error?: ProblemDetails; - asObservable?: () => Observable; - }>; -} - export class UmbTreeContextBase extends UmbBaseController - implements UmbTreeContext + implements UmbTreeContext { #treeRoot = new UmbObjectState(undefined); treeRoot = this.#treeRoot.asObservable(); - public repository?: UmbTreeRepository; public selectableFilter?: (item: TreeItemType) => boolean = () => true; public filter?: (item: TreeItemType) => boolean = () => true; public readonly selection = new UmbSelectionManager(this._host); + #repository?: UmbTreeRepository; #treeAlias?: string; #actionEventContext?: UmbActionEventContext; @@ -70,7 +58,7 @@ export class UmbTreeContextBase // TODO: find a generic way to do this #checkIfInitialized() { - if (this.repository) { + if (this.#repository) { this.#initialized = true; this.#initResolver?.(); } @@ -87,36 +75,29 @@ export class UmbTreeContextBase return this.#treeAlias; } + public getRepository() { + return this.#repository; + } + public async requestTreeRoot() { await this.#init; - const { data } = await this.repository!.requestTreeRoot(); + const { data } = await this.#repository!.requestTreeRoot(); if (data) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore + //@ts-ignore this.#treeRoot.setValue(data); } } public async requestRootItems() { await this.#init; - return this.repository!.requestRootTreeItems(); - } - - public async requestChildrenOf(parentUnique: string | null) { - await this.#init; - if (parentUnique === undefined) throw new Error('Parent unique cannot be undefined.'); - return this.repository!.requestTreeItemsOf(parentUnique); + return this.#repository!.requestRootTreeItems(); } public async rootItems() { await this.#init; - return this.repository!.rootTreeItems(); - } - - public async childrenOf(parentUnique: string | null) { - await this.#init; - return this.repository!.treeItemsOf(parentUnique); + return this.#repository!.rootTreeItems(); } #observeTreeManifest() { @@ -142,7 +123,7 @@ export class UmbTreeContextBase repositoryAlias, [this._host], (permitted, ctrl) => { - this.repository = permitted ? ctrl.api : undefined; + this.#repository = permitted ? ctrl.api : undefined; this.#checkIfInitialized(); }, ); From d0b7744ba63c6cad4a7b6c2f932373ad676dadd3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 16:40:59 +0100 Subject: [PATCH 018/170] add pagination to tree item context --- .../core/tree/tree-item/tree-item-context.interface.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-context.interface.ts index 9a762d6c99..8ae64f95df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-context.interface.ts @@ -1,4 +1,5 @@ import type { UmbTreeItemModelBase } from '../types.js'; +import type { UmbPaginationManager } from '../../utils/pagination-manager/pagination.manager.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ProblemDetails } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbPagedModel } from '@umbraco-cms/backoffice/repository'; @@ -16,7 +17,7 @@ export interface UmbTreeItemContext e isActive: Observable; hasActions: Observable; path: Observable; - + pagination: UmbPaginationManager; setTreeItem(treeItem: TreeItemType | undefined): void; requestChildren(): Promise<{ data?: UmbPagedModel | undefined; From cfd21159175061447eaa993d038d66d70b179993 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 16:41:55 +0100 Subject: [PATCH 019/170] wip pagination for tree items --- .../collection-pagination.element.ts | 2 +- .../tree/data/tree-data-source.interface.ts | 9 +++-- .../core/tree/data/tree-repository-base.ts | 14 +++---- .../tree/data/tree-repository.interface.ts | 4 +- .../tree/data/tree-server-data-source-base.ts | 20 ++++++---- .../tree-item-base/tree-item-context-base.ts | 39 ++++++++++++++++++- .../tree-item-base/tree-item-element-base.ts | 15 +++++++ .../pagination-manager/pagination.manager.ts | 2 +- .../document-type.tree.server.data-source.ts | 15 ++++--- 9 files changed, 90 insertions(+), 30 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts index e30a056762..539568fd93 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts @@ -11,7 +11,7 @@ export class UmbCollectionPaginationElement extends UmbLitElement { _totalPages = 0; @state() - _currentPage = 1; + _currentPage = 0; private _collectionContext?: UmbDefaultCollectionContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts index b7faf17f03..88cdf7d224 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts @@ -24,13 +24,16 @@ export interface UmbTreeDataSource { * @return {*} {Promise>>} * @memberof UmbTreeDataSource */ - getRootItems(): Promise>>; + getRootItems(args: { skip: number; take: number }): Promise>>; /** * Gets the children of the given parent item. - * @param {(string | null)} parentUnique * @return {*} {Promise>} * @memberof UmbTreeDataSource */ - getChildrenOf(parentUnique: string | null): Promise>>; + getChildrenOf(args: { + parentUnique: string | null; + skip: number; + take: number; + }): Promise>>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts index cbfe330c55..0ea9f637b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts @@ -1,5 +1,5 @@ -import type { UmbTreeStore } from './tree-store.interface.js'; import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '../types.js'; +import type { UmbTreeStore } from './tree-store.interface.js'; import type { UmbTreeRepository } from './tree-repository.interface.js'; import type { UmbTreeDataSource, UmbTreeDataSourceConstructor } from './tree-data-source.interface.js'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; @@ -61,10 +61,10 @@ export abstract class UmbTreeRepositoryBase< * @return {*} * @memberof UmbTreeRepositoryBase */ - async requestRootTreeItems() { + async requestRootTreeItems(args: any) { await this._init; - const { data, error } = await this.#treeSource.getRootItems(); + const { data, error } = await this.#treeSource.getRootItems(args); if (data) { this._treeStore!.appendItems(data.items); @@ -79,17 +79,17 @@ export abstract class UmbTreeRepositoryBase< * @return {*} * @memberof UmbTreeRepositoryBase */ - async requestTreeItemsOf(parentUnique: string | null) { - if (parentUnique === undefined) throw new Error('Parent unique is missing'); + async requestTreeItemsOf(args: any) { + if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); await this._init; - const { data, error } = await this.#treeSource.getChildrenOf(parentUnique); + const { data, error } = await this.#treeSource.getChildrenOf(args); if (data) { this._treeStore!.appendItems(data.items); } - return { data, error, asObservable: () => this._treeStore!.childrenOf(parentUnique) }; + return { data, error, asObservable: () => this._treeStore!.childrenOf(args.parentUnique) }; } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts index 15e4386f5a..04c7368bcc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts @@ -29,7 +29,7 @@ export interface UmbTreeRepository< * Requests the root items of the tree. * @memberof UmbTreeRepository */ - requestRootTreeItems: () => Promise<{ + requestRootTreeItems: (args: { skip: number; take: number }) => Promise<{ data?: UmbPagedModel; error?: ProblemDetails; asObservable?: () => Observable; @@ -40,7 +40,7 @@ export interface UmbTreeRepository< * @param {(string | null)} parentUnique * @memberof UmbTreeRepository */ - requestTreeItemsOf: (parentUnique: string | null) => Promise<{ + requestTreeItemsOf: (args: { parentUnique: string | null; skip: number; take: number }) => Promise<{ data?: UmbPagedModel; error?: ProblemDetails; asObservable?: () => Observable; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts index 5ae90f5b49..e37aecc20e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts @@ -1,6 +1,6 @@ -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbTreeItemModelBase } from '../types.js'; import type { UmbTreeDataSource } from './tree-data-source.interface.js'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { TreeItemPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbPagedModel } from '@umbraco-cms/backoffice/repository'; @@ -9,8 +9,12 @@ export interface UmbTreeServerDataSourceBaseArgs< ServerTreeItemType extends TreeItemPresentationModel, ClientTreeItemType extends UmbTreeItemModelBase, > { - getRootItems: () => Promise>; - getChildrenOf: (parentUnique: string | null) => Promise>; + getRootItems: (args: { skip: number; take: number }) => Promise>; + getChildrenOf: (args: { + parentUnique: string | null; + skip: number; + take: number; + }) => Promise>; mapper: (item: ServerTreeItemType) => ClientTreeItemType; } @@ -47,8 +51,8 @@ export abstract class UmbTreeServerDataSourceBase< * @return {*} * @memberof UmbTreeServerDataSourceBase */ - async getRootItems() { - const { data, error } = await tryExecuteAndNotify(this.#host, this.#getRootItems()); + async getRootItems(args: { skip: number; take: number }) { + const { data, error } = await tryExecuteAndNotify(this.#host, this.#getRootItems(args)); if (data) { const items = data?.items.map((item) => this.#mapper(item)); @@ -64,10 +68,10 @@ export abstract class UmbTreeServerDataSourceBase< * @return {*} * @memberof UmbTreeServerDataSourceBase */ - async getChildrenOf(parentUnique: string | null) { - if (parentUnique === undefined) throw new Error('Parent unique is missing'); + async getChildrenOf(args: { parentUnique: string | null; skip: number; take: number }) { + if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); - const { data, error } = await tryExecuteAndNotify(this.#host, this.#getChildrenOf(parentUnique)); + const { data, error } = await tryExecuteAndNotify(this.#host, this.#getChildrenOf(args)); if (data) { const items = data?.items.map((item: ServerTreeItemType) => this.#mapper(item)); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 14f640e183..3b725d7796 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -13,6 +13,8 @@ import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UMB_ACTION_EVENT_CONTEXT, type UmbActionEventContext } from '@umbraco-cms/backoffice/action'; import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action'; +import { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; export type UmbTreeItemUniqueFunction = ( x: TreeItemType, @@ -61,10 +63,21 @@ export abstract class UmbTreeItemContextBase; + public readonly pagination = new UmbPaginationManager(); + + #filter = { + skip: 0, + take: 3, + }; + constructor(host: UmbControllerHost, getUniqueFunction: UmbTreeItemUniqueFunction) { super(host, UMB_TREE_ITEM_CONTEXT); + this.pagination.setPageSize(this.#filter.take); this.#getUniqueFunction = getUniqueFunction; this.#consumeContexts(); + + // listen for page changes on the pagination manager + this.pagination.addEventListener(UmbChangeEvent.TYPE, this.#onPageChange); } /** @@ -111,15 +124,30 @@ export abstract class UmbTreeItemContextBase { + const target = event.target as UmbPaginationManager; + this.#filter.skip = target.getSkip(); + debugger; + this.requestChildren(); + }; + // TODO: use router context constructPath(pathname: string, entityType: string, unique: string | null) { return `section/${pathname}/workspace/${entityType}/edit/${unique}`; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts index 8e052a0e20..cb9c0914e4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts @@ -36,6 +36,12 @@ export abstract class UmbTreeItemElementBase; constructor() { @@ -56,6 +62,8 @@ export abstract class UmbTreeItemElementBase (this._isSelectable = value)); this.observe(this.#treeItemContext.isSelected, (value) => (this._isSelected = value)); this.observe(this.#treeItemContext.path, (value) => (this._href = value)); + this.observe(this.#treeItemContext.pagination.currentPage, (value) => (this._currentPage = value)); + this.observe(this.#treeItemContext.pagination.totalPages, (value) => (this._totalPages = value)); }); } @@ -88,6 +96,12 @@ export abstract class UmbTreeItemElementBase { + event.stopPropagation(); + const next = (this._currentPage = this._currentPage + 1); + this.#treeItemContext?.pagination.setCurrentPageNumber(next); + }; + // Note: Currently we want to prevent opening when the item is in a selectable context, but this might change in the future. // If we like to be able to open items in selectable context, then we might want to make it as a menu item action, so you have to click ... and chose an action called 'Edit' render() { @@ -105,6 +119,7 @@ export abstract class UmbTreeItemElementBase ${this.#renderIconContainer()} ${this.renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()} + Load more `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts index 148e6850fa..630d087119 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts @@ -117,7 +117,7 @@ export class UmbPaginationManager extends EventTarget { } #calculateSkip() { - const skip = (this.#currentPage.getValue() - 1) * this.#pageSize.getValue(); + const skip = Math.max(0, (this.#currentPage.getValue() - 1) * this.#pageSize.getValue()); this.#skip.setValue(skip); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts index 4aa07032c0..e7e923bfe8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts @@ -29,16 +29,19 @@ export class UmbDocumentTypeTreeServerDataSource extends UmbTreeServerDataSource } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => DocumentTypeResource.getTreeDocumentTypeRoot({}); +const getRootItems = (args: { skip: number; take: number }) => + // eslint-disable-next-line local-rules/no-direct-api-import + DocumentTypeResource.getTreeDocumentTypeRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: { parentUnique: string | null; skip: number; take: number }) => { + if (args.parentUnique === null) { + return getRootItems({ skip: args.skip, take: args.take }); } else { // eslint-disable-next-line local-rules/no-direct-api-import return DocumentTypeResource.getTreeDocumentTypeChildren({ - parentId: parentUnique, + parentId: args.parentUnique, + skip: args.skip, + take: args.take, }); } }; From 9b592a2191ede59868e575d63e4b9ef08e053c11 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 16:43:32 +0100 Subject: [PATCH 020/170] don't load tree item elements --- .../src/packages/core/tree/tree.element.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index 585abe5b7a..4eb5c41c9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -4,9 +4,6 @@ import { html, nothing, customElement, property, state, repeat } from '@umbraco- import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import './tree-item/tree-item.element.js'; -import './tree-item/tree-item-base/tree-item-element-base.js'; - export type UmbTreeSelectionConfiguration = { multiple?: boolean; selectable?: boolean; From c47c0745006c794c7a4be3283693f9d17534eadc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 18:35:32 +0100 Subject: [PATCH 021/170] set default to 1 --- .../components/pagination/collection-pagination.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts index 539568fd93..7b128ac0db 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/components/pagination/collection-pagination.element.ts @@ -8,10 +8,10 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-collection-pagination') export class UmbCollectionPaginationElement extends UmbLitElement { @state() - _totalPages = 0; + _totalPages = 1; @state() - _currentPage = 0; + _currentPage = 1; private _collectionContext?: UmbDefaultCollectionContext; From 89dd0e31be46683ba1e90108801fb291e7f75f47 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 18:36:08 +0100 Subject: [PATCH 022/170] default to 1 --- .../core/utils/pagination-manager/pagination.manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts index 630d087119..e370f53f02 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts @@ -8,7 +8,7 @@ export class UmbPaginationManager extends EventTarget { #totalItems = new UmbNumberState(0); public readonly totalItems = this.#totalItems.asObservable(); - #totalPages = new UmbNumberState(0); + #totalPages = new UmbNumberState(1); public readonly totalPages = this.#totalPages.asObservable(); #currentPage = new UmbNumberState(1); From 0c52dabadb73303046ab04c0b51fbd0d811edf7f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 18:37:13 +0100 Subject: [PATCH 023/170] default to 1 --- .../tree/tree-item/tree-item-base/tree-item-element-base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts index cb9c0914e4..8e4f2ca5c3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts @@ -40,7 +40,7 @@ export abstract class UmbTreeItemElementBase; From 40a8b4914b4ed3cca1c0545f74ef0ab700a407d9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 18:39:24 +0100 Subject: [PATCH 024/170] remove debuggers --- .../tree/tree-item/tree-item-base/tree-item-context-base.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 3b725d7796..81a7d2b5cb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -124,7 +124,6 @@ export abstract class UmbTreeItemContextBase { const target = event.target as UmbPaginationManager; this.#filter.skip = target.getSkip(); - debugger; this.requestChildren(); }; From 28bc9031ef514acc1dbb74e10951ba7dccce1064 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 19:57:56 +0100 Subject: [PATCH 025/170] handle args object for all trees --- .../src/packages/core/tree/data/index.ts | 2 ++ .../tree/data/tree-data-source.interface.ts | 9 +++------ .../tree/data/tree-repository.interface.ts | 10 ++++++---- .../tree/data/tree-server-data-source-base.ts | 16 +++++++--------- .../src/packages/core/tree/data/types.ts | 10 ++++++++++ .../core/tree/tree-item/tree-item.element.ts | 12 ++++++++---- .../tree/data-type-tree.server.data-source.ts | 14 ++++++++------ .../dictionary-tree.server.data-source.ts | 14 ++++++++------ .../document-type.tree.server.data-source.ts | 5 +++-- ...ent-recycle-bin-tree.server.data-source.ts | 14 ++++++++------ .../tree/document-tree.server.data-source.ts | 14 ++++++++------ .../media-type-tree.server.data-source.ts | 19 ++++++++++++------- .../tree/media-tree.server.data-source.ts | 14 ++++++++------ .../member-type-tree.server.data-source.ts | 12 +++++++----- .../relation-type-tree.server.data-source.ts | 12 +++++++----- .../static-file-tree.server.data-source.ts | 12 +++++++----- .../partial-view-tree.server.data-source.ts | 12 +++++++----- .../tree/script-tree.server.data-source.ts | 12 +++++++----- .../stylesheet-tree.server.data-source.ts | 17 +++++++++++------ .../tree/template-tree.server.data-source.ts | 14 ++++++++------ 20 files changed, 145 insertions(+), 99 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/data/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts index 5e3dd1722e..1f6693a599 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts @@ -4,3 +4,5 @@ export { UmbTreeRepositoryBase } from './tree-repository-base.js'; export type { UmbTreeDataSource } from './tree-data-source.interface.js'; export type { UmbTreeRepository } from './tree-repository.interface.js'; export type { UmbTreeStore } from './tree-store.interface.js'; + +export type { UmbTreeRootItemsRequestArgs, UmbTreeChildrenOfRequestArgs } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts index 88cdf7d224..66257ecd59 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-data-source.interface.ts @@ -1,4 +1,5 @@ import type { UmbTreeItemModelBase } from '../types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from './types.js'; import type { UmbPagedModel, DataSourceResponse } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -24,16 +25,12 @@ export interface UmbTreeDataSource { * @return {*} {Promise>>} * @memberof UmbTreeDataSource */ - getRootItems(args: { skip: number; take: number }): Promise>>; + getRootItems(args: UmbTreeRootItemsRequestArgs): Promise>>; /** * Gets the children of the given parent item. * @return {*} {Promise>} * @memberof UmbTreeDataSource */ - getChildrenOf(args: { - parentUnique: string | null; - skip: number; - take: number; - }): Promise>>; + getChildrenOf(args: UmbTreeChildrenOfRequestArgs): Promise>>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts index 04c7368bcc..e7cbbf4223 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository.interface.ts @@ -1,4 +1,5 @@ import type { UmbTreeItemModelBase } from '../types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from './types.js'; import type { UmbPagedModel } from '@umbraco-cms/backoffice/repository'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import type { ProblemDetails } from '@umbraco-cms/backoffice/external/backend-api'; @@ -27,20 +28,21 @@ export interface UmbTreeRepository< /** * Requests the root items of the tree. + * @param {UmbTreeRootItemsRequestArgs} args * @memberof UmbTreeRepository */ - requestRootTreeItems: (args: { skip: number; take: number }) => Promise<{ + requestRootTreeItems: (args: UmbTreeRootItemsRequestArgs) => Promise<{ data?: UmbPagedModel; error?: ProblemDetails; asObservable?: () => Observable; }>; /** - * Requests the items of a item in the tree. - * @param {(string | null)} parentUnique + * Requests the children of the given parent item. + * @param {UmbTreeChildrenOfRequestArgs} args * @memberof UmbTreeRepository */ - requestTreeItemsOf: (args: { parentUnique: string | null; skip: number; take: number }) => Promise<{ + requestTreeItemsOf: (args: UmbTreeChildrenOfRequestArgs) => Promise<{ data?: UmbPagedModel; error?: ProblemDetails; asObservable?: () => Observable; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts index e37aecc20e..457ad915f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-server-data-source-base.ts @@ -1,5 +1,6 @@ import type { UmbTreeItemModelBase } from '../types.js'; import type { UmbTreeDataSource } from './tree-data-source.interface.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from './types.js'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { TreeItemPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -9,12 +10,8 @@ export interface UmbTreeServerDataSourceBaseArgs< ServerTreeItemType extends TreeItemPresentationModel, ClientTreeItemType extends UmbTreeItemModelBase, > { - getRootItems: (args: { skip: number; take: number }) => Promise>; - getChildrenOf: (args: { - parentUnique: string | null; - skip: number; - take: number; - }) => Promise>; + getRootItems: (args: UmbTreeRootItemsRequestArgs) => Promise>; + getChildrenOf: (args: UmbTreeChildrenOfRequestArgs) => Promise>; mapper: (item: ServerTreeItemType) => ClientTreeItemType; } @@ -48,10 +45,11 @@ export abstract class UmbTreeServerDataSourceBase< /** * Fetches the root items for the tree from the server + * @param {UmbTreeRootItemsRequestArgs} args * @return {*} * @memberof UmbTreeServerDataSourceBase */ - async getRootItems(args: { skip: number; take: number }) { + async getRootItems(args: UmbTreeRootItemsRequestArgs) { const { data, error } = await tryExecuteAndNotify(this.#host, this.#getRootItems(args)); if (data) { @@ -64,11 +62,11 @@ export abstract class UmbTreeServerDataSourceBase< /** * Fetches the children of a given parent unique from the server - * @param {(string)} parentUnique + * @param {UmbTreeChildrenOfRequestArgs} args * @return {*} * @memberof UmbTreeServerDataSourceBase */ - async getChildrenOf(args: { parentUnique: string | null; skip: number; take: number }) { + async getChildrenOf(args: UmbTreeChildrenOfRequestArgs) { if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); const { data, error } = await tryExecuteAndNotify(this.#host, this.#getChildrenOf(args)); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/types.ts new file mode 100644 index 0000000000..3a74d850d7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/types.ts @@ -0,0 +1,10 @@ +export interface UmbTreeRootItemsRequestArgs { + skip: number; + take: number; +} + +export interface UmbTreeChildrenOfRequestArgs { + parentUnique: string | null; + skip: number; + take: number; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts index e2fa41eb8c..dd750b2ac8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item.element.ts @@ -16,11 +16,15 @@ export class UmbTreeItemElement extends UmbExtensionInitializerElementBase { + if (!this._entityType) return false; + return manifest.meta.entityTypes.includes(this._entityType); + }; + this.observe( - umbExtensionsRegistry.byTypeAndFilter(this.getExtensionType(), (manifest: ManifestTreeItem) => - manifest.meta.entityTypes.includes(this._entityType), - ), - async (manifests) => { + umbExtensionsRegistry.byTypeAndFilter(this.getExtensionType(), filterByEntityType), + (manifests) => { if (!manifests) return; // TODO: what should we do if there are multiple tree items for an entity type? const manifest = manifests[0]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts index cd7d0e88bc..d4fda7664a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts @@ -1,4 +1,5 @@ import type { UmbDataTypeTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DataTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -28,16 +29,17 @@ export class UmbDataTypeTreeServerDataSource extends UmbTreeServerDataSourceBase } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => DataTypeResource.getTreeDataTypeRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + DataTypeResource.getTreeDataTypeRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return DataTypeResource.getTreeDataTypeChildren({ - parentId: parentUnique, + parentId: args.parentUnique, }); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts index 1521134377..843cfcd8d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts @@ -1,5 +1,6 @@ import { UMB_DICTIONARY_ENTITY_TYPE } from '../entity.js'; import type { UmbDictionaryTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { NamedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -29,16 +30,17 @@ export class UmbDictionaryTreeServerDataSource extends UmbTreeServerDataSourceBa } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => DictionaryResource.getTreeDictionaryRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + DictionaryResource.getTreeDictionaryRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return DictionaryResource.getTreeDictionaryChildren({ - parentId: parentUnique, + parentId: args.parentUnique, }); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts index e7e923bfe8..d0e170aaed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_TYPE_ENTITY_TYPE, UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentTypeTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DocumentTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -29,11 +30,11 @@ export class UmbDocumentTypeTreeServerDataSource extends UmbTreeServerDataSource } } -const getRootItems = (args: { skip: number; take: number }) => +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import DocumentTypeResource.getTreeDocumentTypeRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (args: { parentUnique: string | null; skip: number; take: number }) => { +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems({ skip: args.skip, take: args.take }); } else { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts index 6bc7b5cf8c..a3466f28b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts @@ -2,6 +2,7 @@ import type { UmbDocumentRecycleBinTreeItemModel } from './types.js'; import type { DocumentRecycleBinItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; /** @@ -28,16 +29,17 @@ export class UmbDocumentRecycleBinTreeServerDataSource extends UmbTreeServerData } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => DocumentResource.getRecycleBinDocumentRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + DocumentResource.getRecycleBinDocumentRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return DocumentResource.getRecycleBinDocumentChildren({ - parentId: parentUnique, + parentId: args.parentUnique, }); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts index e724a5dc64..238a334d1b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -29,16 +30,17 @@ export class UmbDocumentTreeServerDataSource extends UmbTreeServerDataSourceBase } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => DocumentResource.getTreeDocumentRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + DocumentResource.getTreeDocumentRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return DocumentResource.getTreeDocumentChildren({ - parentId: parentUnique, + parentId: args.parentUnique, }); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts index db463397d2..e66ae5c83d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts @@ -3,7 +3,11 @@ import type { UmbMediaTypeTreeItemModel } from './types.js'; import type { MediaTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { MediaTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; +import { + UmbTreeChildrenOfRequestArgs, + UmbTreeRootItemsRequestArgs, + UmbTreeServerDataSourceBase, +} from '@umbraco-cms/backoffice/tree'; /** * A data source for the Media Type tree that fetches data from the server @@ -29,16 +33,17 @@ export class UmbMediaTypeTreeServerDataSource extends UmbTreeServerDataSourceBas } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => MediaTypeResource.getTreeMediaTypeRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + MediaTypeResource.getTreeMediaTypeRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return MediaTypeResource.getTreeMediaTypeChildren({ - parentId: parentUnique, + parentId: args.parentUnique, }); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts index 66bcdce677..dd491954d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts @@ -1,5 +1,6 @@ import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js'; import type { UmbMediaTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import { MediaResource, type MediaTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -28,16 +29,17 @@ export class UmbMediaTreeServerDataSource extends UmbTreeServerDataSourceBase< } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => MediaResource.getTreeMediaRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + MediaResource.getTreeMediaRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return MediaResource.getTreeMediaChildren({ - parentId: parentUnique, + parentId: args.parentUnique, }); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts index 05bdff135d..aa8948ed8c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts @@ -1,5 +1,6 @@ import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../entity.js'; import type { UmbMemberTypeTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { NamedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { MemberTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -29,12 +30,13 @@ export class UmbMemberTypeTreeServerDataSource extends UmbTreeServerDataSourceBa } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => MemberTypeResource.getTreeMemberTypeRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + MemberTypeResource.getTreeMemberTypeRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { throw new Error('Not supported for the member type tree'); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/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 index 9bcf4d684c..d513e4ccb3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/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 @@ -2,6 +2,7 @@ import type { UmbRelationTypeTreeItemModel } from './types.js'; import type { NamedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { RelationTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; /** @@ -28,12 +29,13 @@ export class UmbRelationTypeTreeServerDataSource extends UmbTreeServerDataSource } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => RelationTypeResource.getTreeRelationTypeRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + RelationTypeResource.getTreeRelationTypeRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { throw new Error('Not supported for the relation type tree'); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts index 268ce50525..bb153b6af8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts @@ -1,6 +1,7 @@ import { UMB_STATIC_FILE_ENTITY_TYPE, UMB_STATIC_FILE_FOLDER_ENTITY_TYPE } from '../entity.js'; import type { UmbStaticFileTreeItemModel } from './types.js'; import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/server-file-system'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import { StaticFileResource, @@ -32,14 +33,15 @@ export class UmbStaticFileTreeServerDataSource extends UmbTreeServerDataSourceBa } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => StaticFileResource.getTreeStaticFileRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + StaticFileResource.getTreeStaticFileRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(parentUnique); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); if (parentPath === null) { - return getRootItems(); + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return StaticFileResource.getTreeStaticFileChildren({ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.server.data-source.ts index 78885a7c05..0780960c72 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.server.data-source.ts @@ -1,6 +1,7 @@ import { UMB_PARTIAL_VIEW_ENTITY_TYPE, UMB_PARTIAL_VIEW_FOLDER_ENTITY_TYPE } from '../entity.js'; import type { UmbPartialViewTreeItemModel } from './types.js'; import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/server-file-system'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; import { PartialViewResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -30,14 +31,15 @@ export class UmbPartialViewTreeServerDataSource extends UmbTreeServerDataSourceB } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => PartialViewResource.getTreePartialViewRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + PartialViewResource.getTreePartialViewRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(parentUnique); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); if (parentPath === null) { - return getRootItems(); + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return PartialViewResource.getTreePartialViewChildren({ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.server.data-source.ts index e5786fd862..af3b7c3f5c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.server.data-source.ts @@ -1,6 +1,7 @@ import { UMB_SCRIPT_ENTITY_TYPE, UMB_SCRIPT_FOLDER_ENTITY_TYPE } from '../entity.js'; import type { UmbScriptTreeItemModel } from './types.js'; import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/server-file-system'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; import { ScriptResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -30,14 +31,15 @@ export class UmbScriptTreeServerDataSource extends UmbTreeServerDataSourceBase< } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => ScriptResource.getTreeScriptRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + ScriptResource.getTreeScriptRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(parentUnique); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); if (parentPath === null) { - return getRootItems(); + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return ScriptResource.getTreeScriptChildren({ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts index b755e88fb3..6393a71ead 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/stylesheet-tree.server.data-source.ts @@ -4,7 +4,11 @@ import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/serve import type { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; import { StylesheetResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; +import { + UmbTreeChildrenOfRequestArgs, + UmbTreeRootItemsRequestArgs, + UmbTreeServerDataSourceBase, +} from '@umbraco-cms/backoffice/tree'; /** * A data source for the Stylesheet tree that fetches data from the server @@ -30,14 +34,15 @@ export class UmbStylesheetTreeServerDataSource extends UmbTreeServerDataSourceBa } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => StylesheetResource.getTreeStylesheetRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + StylesheetResource.getTreeStylesheetRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(parentUnique); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); if (parentPath === null) { - return getRootItems(); + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return StylesheetResource.getTreeStylesheetChildren({ diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts index 9b86bb4d07..a8c15cc1b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/template-tree.server.data-source.ts @@ -1,5 +1,6 @@ import { UMB_TEMPLATE_ENTITY_TYPE } from '../entity.js'; import type { UmbTemplateTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { NamedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { TemplateResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -29,16 +30,17 @@ export class UmbTemplateTreeServerDataSource extends UmbTreeServerDataSourceBase } } -// eslint-disable-next-line local-rules/no-direct-api-import -const getRootItems = () => TemplateResource.getTreeTemplateRoot({}); +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + TemplateResource.getTreeTemplateRoot({ skip: args.skip, take: args.take }); -const getChildrenOf = (parentUnique: string | null) => { - if (parentUnique === null) { - return getRootItems(); +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import return TemplateResource.getTreeTemplateChildren({ - parentId: parentUnique, + parentId: args.parentUnique, }); } }; From 786f2b5e233131340f4d5ddd44630ad55634480f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 20:02:08 +0100 Subject: [PATCH 026/170] pass skip/take values --- .../data-type-picker-flow-data-type-picker-modal.element.ts | 2 +- .../data-type-picker-flow-modal.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts index eb853a72f4..74f7d98e5e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.ts @@ -38,7 +38,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas // TODO: This is a hack to get the data types of a property editor ui alias. // TODO: Make sure filtering works data-type that does not have a property editor ui, but should be using the default property editor UI for those. // TODO: make an end-point just retrieving the data types using a given property editor ui alias. - const { data } = await dataTypeTreeRepository.requestRootTreeItems(); + const { data } = await dataTypeTreeRepository.requestRootTreeItems({ skip: 0, take: 100 }); if (!data) return; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts index 55acd43813..2dd55d5a39 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/data-type-picker-flow/data-type-picker-flow-modal.element.ts @@ -98,7 +98,7 @@ export class UmbDataTypePickerFlowModalElement extends UmbModalBaseElement< async #init() { // TODO: Get ALL items, or traverse the structure aka. multiple recursive calls. this.observe( - (await this.#treeRepository.requestRootTreeItems()).asObservable(), + (await this.#treeRepository.requestRootTreeItems({ skip: 0, take: 100 })).asObservable(), (items) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore From e95ebc1213e3b542a15415a929859eba48ce776e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 20:05:49 +0100 Subject: [PATCH 027/170] fix type --- .../tree-item/tree-item-default/manifests.ts | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts index f5d4cee4ca..c12ffa730c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts @@ -1,15 +1,15 @@ -import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; -export const manifests: Array = [ - { - type: 'kind', - alias: 'Umb.Kind.DefaultTreeItem', - matchKind: 'default', - matchType: 'treeItem', - manifest: { - type: 'treeItem', - element: () => import('./tree-item-default.element.js'), - api: () => import('./tree-item-default.context.js'), - }, +const kind: UmbBackofficeManifestKind = { + type: 'kind', + alias: 'Umb.Kind.TreeItem.Default', + matchKind: 'default', + matchType: 'treeItem', + manifest: { + type: 'treeItem', + api: () => import('./tree-item-default.context.js'), + element: () => import('./tree-item-default.element.js'), }, -]; +}; + +export const manifests = [kind]; From 382773b12f8c3c3593e12b43c1ceb57b4fa45fab Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 20:54:33 +0100 Subject: [PATCH 028/170] update document tree item to follow new implementation --- .../extension-registry/interfaces/index.ts | 1 - .../interfaces/tree-item-element.interface.ts | 5 ---- .../models/tree-item.model.ts | 4 +-- .../tree-item-base/tree-item-element-base.ts | 27 +++++++++++++------ .../src/packages/core/tree/tree.context.ts | 2 +- .../src/packages/core/tree/tree.element.ts | 2 +- .../tree-item/document-tree-item.element.ts | 2 +- 7 files changed, 23 insertions(+), 20 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/tree-item-element.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/index.ts index 3e14e3ad9a..1721b7dfec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/index.ts @@ -6,5 +6,4 @@ export * from './property-editor-ui-element.interface.js'; export * from './section-element.interface.js'; export * from './section-sidebar-app-element.interface.js'; export * from './section-view-element.interface.js'; -export * from './tree-item-element.interface.js'; export * from './workspace-view-element.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/tree-item-element.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/tree-item-element.interface.ts deleted file mode 100644 index d109e0bacd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/interfaces/tree-item-element.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { UmbTreeItemModelBase } from '@umbraco-cms/backoffice/tree'; - -export interface UmbTreeItemElement extends HTMLElement { - item?: UmbTreeItemModelBase; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts index f79b2e2ce2..aff81bc5d9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/tree-item.model.ts @@ -1,9 +1,7 @@ import type { UmbTreeItemContext, UmbTreeItemModelBase } from '../../index.js'; -import type { UmbTreeItemElement } from '../interfaces/index.js'; import type { ManifestElementAndApi } from '@umbraco-cms/backoffice/extension-api'; -export interface ManifestTreeItem - extends ManifestElementAndApi> { +export interface ManifestTreeItem extends ManifestElementAndApi> { type: 'treeItem'; meta: MetaTreeItem; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts index 8e4f2ca5c3..084125b9fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts @@ -6,11 +6,16 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; // eslint-disable-next-line local-rules/enforce-element-suffix-on-element-class-name export abstract class UmbTreeItemElementBase extends UmbLitElement { + _item?: TreeItemModelType; @property({ type: Object, attribute: false }) - item?: TreeItemModelType; - - @state() - private _item?: TreeItemModelType; + get item(): TreeItemModelType | undefined { + return this._item; + } + set item(newVal: TreeItemModelType) { + console.log('set item', newVal); + this._item = newVal; + this.#initTreeItem(); + } @state() private _childItems?: TreeItemModelType[]; @@ -51,8 +56,7 @@ export abstract class UmbTreeItemElementBase (this._item = value)); @@ -67,6 +71,13 @@ export abstract class UmbTreeItemElementBase - ${this.#renderIconContainer()} ${this.renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()} + ${this.renderIconContainer()} ${this.renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()} Load more @@ -128,7 +139,7 @@ export abstract class UmbTreeItemElementBase 0; }; - #renderIconContainer() { + renderIconContainer() { return html` public async requestRootItems() { await this.#init; - return this.#repository!.requestRootTreeItems(); + return this.#repository!.requestRootTreeItems({ skip: 0, take: 100 }); } public async rootItems() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index 4eb5c41c9c..912ae72c01 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -129,7 +129,7 @@ export class UmbTreeElement extends UmbLitElement { ${repeat( this._items, (item, index) => item.name + '___' + index, - (item) => html``, + (item) => html``, )} `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts index cf53e23aba..096af384fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts @@ -6,7 +6,7 @@ import { UmbTreeItemElementBase } from '@umbraco-cms/backoffice/tree'; @customElement('umb-document-tree-item') export class UmbDocumentTreeItemElement extends UmbTreeItemElementBase { // TODO: implement correct status symbol - #renderIconWithStatusSymbol() { + renderIconContainer() { return html` ${this.item?.documentType.icon From db4d92e5c4939086cf43555e85ac54110743a54a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 20:56:16 +0100 Subject: [PATCH 029/170] remove console.log --- .../tree/tree-item/tree-item-base/tree-item-element-base.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts index 084125b9fe..a03f03faaf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts @@ -12,7 +12,6 @@ export abstract class UmbTreeItemElementBase Date: Wed, 28 Feb 2024 10:00:22 +0100 Subject: [PATCH 030/170] use kind for tree element --- .../link-picker/link-picker-modal.element.ts | 16 +- .../tree-picker/tree-picker-modal.element.ts | 12 +- .../src/packages/core/tree/data/index.ts | 2 + .../default-tree.context.ts} | 58 ++++---- .../core/tree/default/default-tree.element.ts | 140 ++++++++++++++++++ .../src/packages/core/tree/default/index.ts | 2 + .../packages/core/tree/default/manifests.ts | 15 ++ .../src/packages/core/tree/index.ts | 15 +- .../src/packages/core/tree/manifests.ts | 3 +- .../tree-item-base/tree-item-context-base.ts | 6 +- .../tree-menu-item-default.element.ts | 4 +- .../src/packages/core/tree/tree.element.ts | 138 +---------------- .../src/packages/core/tree/tree.stories.ts | 8 +- 13 files changed, 230 insertions(+), 189 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/tree/{tree.context.ts => default/default-tree.context.ts} (77%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/default/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/default/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/link-picker/link-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/link-picker/link-picker-modal.element.ts index 50ada2ee67..c4acfa1dce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/link-picker/link-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/link-picker/link-picker-modal.element.ts @@ -187,10 +187,12 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement this.#handleSelectionChange(event, 'document')} - .selectionConfiguration=${this._selectionConfiguration}> + .props=${{ + hideTreeRoot: true, + selectionConfiguration: this._selectionConfiguration, + }} + @selection-change=${(event: CustomEvent) => this.#handleSelectionChange(event, 'document')}>
${this.localize.term('defaultdialogs_linkToMedia')}
this.#handleSelectionChange(event, 'media')} - .selectionConfiguration=${this._selectionConfiguration}> + .props=${{ + hideTreeRoot: true, + selectionConfiguration: this._selectionConfiguration, + }} + @selection-change=${(event: CustomEvent) => this.#handleSelectionChange(event, 'media')}>
`; } 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 33cc1bd999..a047d4fe32 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 @@ -41,12 +41,14 @@ export class UmbTreePickerModalElement + .props=${{ + hideTreeRoot: this.data?.hideTreeRoot, + selectionConfiguration: this._selectionConfiguration, + filter: this.data?.filter, + selectableFilter: this.data?.pickableFilter, + }} + @selection-change=${this.#onSelectionChange}>
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts index 1f6693a599..c2ab9f12b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/index.ts @@ -6,3 +6,5 @@ export type { UmbTreeRepository } from './tree-repository.interface.js'; export type { UmbTreeStore } from './tree-store.interface.js'; export type { UmbTreeRootItemsRequestArgs, UmbTreeChildrenOfRequestArgs } from './types.js'; + +export { UmbUniqueTreeStore } from './unique-tree-store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts similarity index 77% rename from src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts index e4e772cb60..542b809ba4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts @@ -1,7 +1,7 @@ -import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from './reload-tree-item-children/index.js'; -import type { UmbTreeItemModelBase } from './types.js'; -import type { UmbTreeRepository } from './data/tree-repository.interface.js'; -import type { UmbTreeContext } from './tree-context.interface.js'; +import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../reload-tree-item-children/index.js'; +import type { UmbTreeItemModelBase } from '../types.js'; +import type { UmbTreeRepository } from '../data/tree-repository.interface.js'; +import type { UmbTreeContext } from '../tree-context.interface.js'; import { type UmbActionEventContext, UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { type ManifestRepository, @@ -15,7 +15,7 @@ import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -export class UmbTreeContextBase +export class UmbDefaultTreeContext extends UmbBaseController implements UmbTreeContext { @@ -26,8 +26,8 @@ export class UmbTreeContextBase public filter?: (item: TreeItemType) => boolean = () => true; public readonly selection = new UmbSelectionManager(this._host); + #manifest?: ManifestTree; #repository?: UmbTreeRepository; - #treeAlias?: string; #actionEventContext?: UmbActionEventContext; #initResolver?: () => void; @@ -64,15 +64,24 @@ export class UmbTreeContextBase } } - public async setTreeAlias(treeAlias?: string) { - if (this.#treeAlias === treeAlias) return; - this.#treeAlias = treeAlias; - - this.#observeTreeManifest(); + /** + * Sets the manifest + * @param {ManifestCollection} manifest + * @memberof UmbCollectionContext + */ + public setManifest(manifest: ManifestTree | undefined) { + if (this.#manifest === manifest) return; + this.#manifest = manifest; + this.#observeRepository(this.#manifest.meta.repositoryAlias;); } - public getTreeAlias() { - return this.#treeAlias; + /** + * Returns the manifest. + * @return {ManifestCollection} + * @memberof UmbCollectionContext + */ + public getManifest() { + return this.#manifest; } public getRepository() { @@ -91,8 +100,11 @@ export class UmbTreeContextBase } public async requestRootItems() { + debugger; await this.#init; - return this.#repository!.requestRootTreeItems({ skip: 0, take: 100 }); + const response = await this.#repository!.requestRootTreeItems({ skip: 0, take: 100 }); + debugger; + return response; } public async rootItems() { @@ -100,21 +112,7 @@ export class UmbTreeContextBase return this.#repository!.rootTreeItems(); } - #observeTreeManifest() { - if (this.#treeAlias) { - this.observe( - umbExtensionsRegistry.byTypeAndAlias('tree', this.#treeAlias), - async (treeManifest) => { - if (!treeManifest) return; - this.#observeRepository(treeManifest); - }, - '_observeTreeManifest', - ); - } - } - - #observeRepository(treeManifest: ManifestTree) { - const repositoryAlias = treeManifest.meta.repositoryAlias; + #observeRepository(repositoryAlias: string) { if (!repositoryAlias) throw new Error('Tree must have a repository alias.'); new UmbExtensionApiInitializer>>( @@ -148,3 +146,5 @@ export class UmbTreeContextBase super.destroy(); } } + +export default UmbDefaultTreeContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts new file mode 100644 index 0000000000..0df1390d95 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts @@ -0,0 +1,140 @@ +import type { UmbTreeItemModelBase } from '../types.js'; +import { UmbDefaultTreeContext } from './default-tree.context.js'; +import { html, nothing, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; + +export type UmbTreeSelectionConfiguration = { + multiple?: boolean; + selectable?: boolean; + selection?: Array; +}; + +@customElement('umb-default-tree') +export class UmbDefaultTreeElement extends UmbLitElement { + private _selectionConfiguration: UmbTreeSelectionConfiguration = { + multiple: false, + selectable: true, + selection: [], + }; + + @property({ type: Object }) + set selectionConfiguration(config: UmbTreeSelectionConfiguration) { + this._selectionConfiguration = config; + this.#treeContext.selection.setMultiple(config.multiple ?? false); + this.#treeContext.selection.setSelectable(config.selectable ?? true); + this.#treeContext.selection.setSelection(config.selection ?? []); + } + get selectionConfiguration(): UmbTreeSelectionConfiguration { + return this._selectionConfiguration; + } + + // TODO: what is the best name for this functionality? + private _hideTreeRoot = false; + @property({ type: Boolean, attribute: 'hide-tree-root' }) + set hideTreeRoot(newVal: boolean) { + const oldVal = this._hideTreeRoot; + this._hideTreeRoot = newVal; + if (newVal === true) { + this.#observeRootItems(); + } + + this.requestUpdate('hideTreeRoot', oldVal); + } + get hideTreeRoot() { + return this._hideTreeRoot; + } + + @property() + set selectableFilter(newVal) { + this.#treeContext.selectableFilter = newVal; + } + get selectableFilter() { + return this.#treeContext.selectableFilter; + } + + @property() + set filter(newVal) { + this.#treeContext.filter = newVal; + } + get filter() { + return this.#treeContext.filter; + } + + @state() + private _items: UmbTreeItemModelBase[] = []; + + @state() + private _treeRoot?: UmbTreeItemModelBase; + + #treeContext = new UmbDefaultTreeContext(this); + + constructor() { + super(); + this.#observeTreeRoot(); + } + + #observeTreeRoot() { + this.observe( + this.#treeContext.treeRoot, + (treeRoot) => { + this._treeRoot = treeRoot; + }, + 'umbTreeRootObserver', + ); + } + + async #observeRootItems() { + if (!this.#treeContext?.requestRootItems) throw new Error('Tree does not support root items'); + console.log('asObservable'); + + const { asObservable } = await this.#treeContext.requestRootItems(); + + if (asObservable) { + this.observe( + asObservable(), + (rootItems) => { + const oldValue = this._items; + console.log('rootItems', rootItems); + this._items = rootItems; + this.requestUpdate('_items', oldValue); + }, + 'umbRootItemsObserver', + ); + } + } + + getSelection() { + return this.#treeContext.selection.getSelection(); + } + + render() { + return html` ${this.#renderTreeRoot()} ${this.#renderRootItems()}`; + } + + #renderTreeRoot() { + if (this.hideTreeRoot || this._treeRoot === undefined) return nothing; + return html` + + `; + } + + #renderRootItems() { + if (this._items?.length === 0) return nothing; + return html` + ${repeat( + this._items, + (item, index) => item.name + '___' + index, + (item) => html``, + )} + `; + } +} + +export default UmbDefaultTreeElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-default-tree': UmbDefaultTreeElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/index.ts new file mode 100644 index 0000000000..b81a955993 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/index.ts @@ -0,0 +1,2 @@ +export { UmbDefaultTreeElement as UmbTreeDefaultElement } from './default-tree.element.js'; +export { UmbDefaultTreeContext as UmbTreeDefaultContext } from './default-tree.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/manifests.ts new file mode 100644 index 0000000000..d184b7952b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/manifests.ts @@ -0,0 +1,15 @@ +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +const defaultTreeKind: UmbBackofficeManifestKind = { + type: 'kind', + alias: 'Umb.Kind.Tree.Default', + matchKind: 'default', + matchType: 'tree', + manifest: { + type: 'tree', + api: () => import('./default-tree.context.js'), + element: () => import('./default-tree.element.js'), + }, +}; + +export const manifests = [defaultTreeKind]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts index 0d4be5e886..48f1346f9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/index.ts @@ -1,19 +1,14 @@ export * from './components/index.js'; export * from './tree-item/index.js'; -export * from './tree-menu-item-default/index.js'; -export * from './tree.context.js'; -export * from './tree.element.js'; -export * from './types.js'; +export * from './default/index.js'; export * from './data/index.js'; - -// Unique -export * from './data/unique-tree-store.js'; - -// Folder +export * from './tree-menu-item-default/index.js'; export * from './folder/index.js'; +export * from './tree.element.js'; -// export { UmbReloadTreeItemChildrenEntityAction, UmbReloadTreeItemChildrenRequestEntityActionEvent, } from './reload-tree-item-children/index.js'; + +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts index 85537d135d..454fb56677 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/manifests.ts @@ -1,4 +1,5 @@ import { manifests as folderManifests } from './folder/manifests.js'; import { manifests as defaultTreeItemManifests } from './tree-item/tree-item-default/manifests.js'; +import { manifests as defaultTreeManifests } from './default/manifests.js'; -export const manifests = [...folderManifests, ...defaultTreeItemManifests]; +export const manifests = [...defaultTreeManifests, ...folderManifests, ...defaultTreeItemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 81a7d2b5cb..bceec0c89c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -1,5 +1,5 @@ import type { UmbTreeItemContext } from '../tree-item-context.interface.js'; -import type { UmbTreeContextBase } from '../../tree.context.js'; +import type { UmbDefaultTreeContext } from '../../default/default-tree.context.js'; import type { UmbTreeItemModelBase } from '../../types.js'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../../reload-tree-item-children/index.js'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; @@ -57,7 +57,7 @@ export abstract class UmbTreeItemContextBase; + treeContext?: UmbDefaultTreeContext; #sectionContext?: UmbSectionContext; #sectionSidebarContext?: UmbSectionSidebarContext; #actionEventContext?: UmbActionEventContext; @@ -177,7 +177,7 @@ export abstract class UmbTreeItemContextBase) => { + this.consumeContext('umbTreeContext', (treeContext: UmbDefaultTreeContext) => { this.treeContext = treeContext; this.#observeIsSelectable(); this.#observeIsSelected(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts index 8478ba005d..be9e43b8c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts @@ -30,7 +30,9 @@ export class UmbMenuItemTreeDefaultElement extends UmbLitElement implements UmbM ? html` + .props=${{ + hideTreeRoot: this.manifest?.meta.hideTreeRoot === true, + }}> ` : nothing; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts index 912ae72c01..d80dc94f83 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.element.ts @@ -1,137 +1,15 @@ -import { UmbTreeContextBase } from './tree.context.js'; -import type { UmbTreeItemModelBase } from './types.js'; -import { html, nothing, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; - -export type UmbTreeSelectionConfiguration = { - multiple?: boolean; - selectable?: boolean; - selection?: Array; -}; +import { customElement } from '@umbraco-cms/backoffice/external/lit'; +import type { ManifestTree } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbExtensionInitializerElementBase } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-tree') -export class UmbTreeElement extends UmbLitElement { - @property({ type: String, reflect: true }) - set alias(newVal) { - this.#treeContext.setTreeAlias(newVal); - } - get alias() { - return this.#treeContext.getTreeAlias(); +export class UmbTreeElement extends UmbExtensionInitializerElementBase { + getExtensionType() { + return 'tree'; } - private _selectionConfiguration: UmbTreeSelectionConfiguration = { - multiple: false, - selectable: true, - selection: [], - }; - - @property({ type: Object }) - set selectionConfiguration(config: UmbTreeSelectionConfiguration) { - this._selectionConfiguration = config; - this.#treeContext.selection.setMultiple(config.multiple ?? false); - this.#treeContext.selection.setSelectable(config.selectable ?? true); - this.#treeContext.selection.setSelection(config.selection ?? []); - } - get selectionConfiguration(): UmbTreeSelectionConfiguration { - return this._selectionConfiguration; - } - - // TODO: what is the best name for this functionality? - private _hideTreeRoot = false; - @property({ type: Boolean, attribute: 'hide-tree-root' }) - set hideTreeRoot(newVal: boolean) { - const oldVal = this._hideTreeRoot; - this._hideTreeRoot = newVal; - if (newVal === true) { - this.#observeRootItems(); - } - - this.requestUpdate('hideTreeRoot', oldVal); - } - get hideTreeRoot() { - return this._hideTreeRoot; - } - - @property() - set selectableFilter(newVal) { - this.#treeContext.selectableFilter = newVal; - } - get selectableFilter() { - return this.#treeContext.selectableFilter; - } - - @property() - set filter(newVal) { - this.#treeContext.filter = newVal; - } - get filter() { - return this.#treeContext.filter; - } - - @state() - private _items: UmbTreeItemModelBase[] = []; - - @state() - private _treeRoot?: UmbTreeItemModelBase; - - #treeContext = new UmbTreeContextBase(this); - #rootItemsObserver?: UmbObserverController>; - - constructor() { - super(); - this.#observeTreeRoot(); - } - - #observeTreeRoot() { - this.observe( - this.#treeContext.treeRoot, - (treeRoot) => { - this._treeRoot = treeRoot; - }, - 'umbTreeRootObserver', - ); - } - - async #observeRootItems() { - if (!this.#treeContext?.requestRootItems) throw new Error('Tree does not support root items'); - this.#rootItemsObserver?.destroy(); - - const { asObservable } = await this.#treeContext.requestRootItems(); - - if (asObservable) { - this.#rootItemsObserver = this.observe(asObservable(), (rootItems) => { - const oldValue = this._items; - this._items = rootItems; - this.requestUpdate('_items', oldValue); - }); - } - } - - getSelection() { - return this.#treeContext.selection.getSelection(); - } - - render() { - return html` ${this.#renderTreeRoot()} ${this.#renderRootItems()}`; - } - - #renderTreeRoot() { - if (this.hideTreeRoot || this._treeRoot === undefined) return nothing; - return html` - - `; - } - - #renderRootItems() { - if (this._items?.length === 0) return nothing; - return html` - ${repeat( - this._items, - (item, index) => item.name + '___' + index, - (item) => html``, - )} - `; + getDefaultElementName() { + return 'umb-default-tree'; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.stories.ts index a09b75ff64..946a928739 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree.stories.ts @@ -1,14 +1,14 @@ import type { Meta, StoryObj } from '@storybook/web-components'; -import './tree.element.js'; -import type { UmbTreeElement } from './tree.element.js'; +import './default/default-tree.element.js'; +import type { UmbDefaultTreeElement } from './default/default-tree.element.js'; -const meta: Meta = { +const meta: Meta = { title: 'Components/Tree/Tree', component: 'umb-tree', }; export default meta; -type Story = StoryObj; +type Story = StoryObj; // TODO: This does not display anything - need help export const Overview: Story = { From 0f85d27620d3d98501a73439d4f564df8c2350d7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 10:00:39 +0100 Subject: [PATCH 031/170] add kind to all tree manifests --- .../src/packages/data-type/tree/manifests.ts | 1 + .../src/packages/dictionary/tree/manifests.ts | 1 + .../src/packages/documents/document-types/tree/manifests.ts | 1 + .../packages/documents/documents/recycle-bin/tree/manifests.ts | 1 + .../src/packages/documents/documents/tree/manifests.ts | 1 + .../src/packages/media/media-types/tree/manifests.ts | 1 + .../src/packages/media/media/tree/manifests.ts | 1 + .../src/packages/members/member-type/tree/manifests.ts | 1 + .../src/packages/relations/relation-types/tree/manifests.ts | 1 + .../src/packages/static-file/tree/manifests.ts | 1 + .../src/packages/templating/partial-views/tree/manifests.ts | 1 + .../src/packages/templating/scripts/tree/manifests.ts | 1 + .../src/packages/templating/stylesheets/tree/manifests.ts | 1 + .../src/packages/templating/templates/tree/manifests.ts | 1 + 14 files changed, 14 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts index 8cae5e1536..3131fa4ca8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/manifests.ts @@ -28,6 +28,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: 'Umb.Tree.DataTypes', name: 'Data Types Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts index 3d5abb3d34..1076ff9165 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/manifests.ts @@ -29,6 +29,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_DICTIONARY_TREE_ALIAS, name: 'Dictionary Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts index bc97861ae4..649ca15c51 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/manifests.ts @@ -34,6 +34,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_DOCUMENT_TYPE_TREE_ALIAS, name: 'Document Type Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts index 3fbcbaee90..6af74406b4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts @@ -29,6 +29,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS, name: 'Document Recycle Bin Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts index 68c0ea7e89..d070bd03ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts @@ -28,6 +28,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_DOCUMENT_TREE_ALIAS, name: 'Document Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts index a4fa2b35f6..a9fd9e8812 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/manifests.ts @@ -32,6 +32,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_MEDIA_TYPE_TREE_ALIAS, name: 'Media Type Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts index 883450b813..ee11e6f7f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/manifests.ts @@ -27,6 +27,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_MEDIA_TREE_ALIAS, name: 'Media Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts index 001c6a8207..afd14e1972 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/manifests.ts @@ -29,6 +29,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_MEMBER_TYPE_TREE_ALIAS, name: 'Member Type Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts index 87d9cbb82a..b837545824 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/tree/manifests.ts @@ -27,6 +27,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_RELATION_TYPE_TREE_ALIAS, name: 'Relation Type Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts index daf8884578..980b7d8fbd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/manifests.ts @@ -31,6 +31,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_STATIC_FILE_TREE_ALIAS, name: 'Static File Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts index fc5b9e7121..28fbf69294 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/manifests.ts @@ -32,6 +32,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_PARTIAL_VIEW_TREE_ALIAS, name: 'Partial View Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts index 4f5695abc8..18d5517377 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/manifests.ts @@ -28,6 +28,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_SCRIPT_TREE_ALIAS, name: 'Script Tree', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts index f7624a2249..30079d4fe8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/tree/manifests.ts @@ -32,6 +32,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_STYLESHEET_TREE_ALIAS, name: 'Stylesheet Tree', weight: 10, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts index 06093e4379..dec71d61e4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/tree/manifests.ts @@ -27,6 +27,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', + kind: 'default', alias: UMB_TEMPLATE_TREE_ALIAS, name: 'Template Tree', meta: { From cdb647b91b14644687ba559af920b92c1c57ea4b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 11:38:50 +0100 Subject: [PATCH 032/170] Update default-tree.context.ts --- .../src/packages/core/tree/default/default-tree.context.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts index 542b809ba4..e82933fbbf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts @@ -72,7 +72,7 @@ export class UmbDefaultTreeContext public setManifest(manifest: ManifestTree | undefined) { if (this.#manifest === manifest) return; this.#manifest = manifest; - this.#observeRepository(this.#manifest.meta.repositoryAlias;); + this.#observeRepository(this.#manifest?.meta.repositoryAlias); } /** @@ -100,7 +100,6 @@ export class UmbDefaultTreeContext } public async requestRootItems() { - debugger; await this.#init; const response = await this.#repository!.requestRootTreeItems({ skip: 0, take: 100 }); debugger; @@ -112,7 +111,7 @@ export class UmbDefaultTreeContext return this.#repository!.rootTreeItems(); } - #observeRepository(repositoryAlias: string) { + #observeRepository(repositoryAlias?: string) { if (!repositoryAlias) throw new Error('Tree must have a repository alias.'); new UmbExtensionApiInitializer>>( From f13055f77520db4aca774991b645574c328839a2 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 28 Feb 2024 12:17:28 +0100 Subject: [PATCH 033/170] Rename scale to descriptor --- .../current-user/current-user-header-app.element.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts index cf5f6b4228..0e01fc1464 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts @@ -13,7 +13,7 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { private _currentUser?: UmbCurrentUserModel; @state() - private _userAvatarUrls: Array<{ url: string; scale: string }> = []; + private _userAvatarUrls: Array<{ url: string; descriptor: string }> = []; #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; #modalManagerContext?: UmbModalManagerContext; @@ -57,15 +57,15 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { this._userAvatarUrls = [ { - scale: '1x', + descriptor: '1x', url: user.avatarUrls?.[0], }, { - scale: '2x', + descriptor: '2x', url: user.avatarUrls?.[1], }, { - scale: '3x', + descriptor: '3x', url: user.avatarUrls?.[2], }, ]; @@ -75,7 +75,7 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { let string = ''; this._userAvatarUrls?.forEach((url) => { - string += `${url.url} ${url.scale},`; + string += `${url.url} ${url.descriptor},`; }); return string; } From cb1ebae5212b704072669d0803b37f5a1a046ed6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 19:18:10 +0100 Subject: [PATCH 034/170] consume tree context --- .../core/tree/default/default-tree.context.ts | 14 +-- .../core/tree/default/default-tree.element.ts | 104 ++++++++++-------- .../tree-item-base/tree-item-context-base.ts | 4 +- 3 files changed, 67 insertions(+), 55 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts index e82933fbbf..4608906723 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts @@ -8,15 +8,16 @@ import { type ManifestTree, umbExtensionsRegistry, } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbDefaultTreeContext - extends UmbBaseController + extends UmbContextBase> implements UmbTreeContext { #treeRoot = new UmbObjectState(undefined); @@ -38,8 +39,7 @@ export class UmbDefaultTreeContext }); constructor(host: UmbControllerHostElement) { - super(host); - this.provideContext('umbTreeContext', this); + super(host, UMB_DEFAULT_TREE_CONTEXT); this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => { this.#actionEventContext = instance; @@ -101,9 +101,7 @@ export class UmbDefaultTreeContext public async requestRootItems() { await this.#init; - const response = await this.#repository!.requestRootTreeItems({ skip: 0, take: 100 }); - debugger; - return response; + return this.#repository!.requestRootTreeItems({ skip: 0, take: 100 }); } public async rootItems() { @@ -147,3 +145,5 @@ export class UmbDefaultTreeContext } export default UmbDefaultTreeContext; + +export const UMB_DEFAULT_TREE_CONTEXT = new UmbContextToken>('UmbTreeContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts index 0df1390d95..de4a553a4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts @@ -1,8 +1,9 @@ import type { UmbTreeItemModelBase } from '../types.js'; -import { UmbDefaultTreeContext } from './default-tree.context.js'; +import type { UmbDefaultTreeContext } from './default-tree.context.js'; +import { UMB_DEFAULT_TREE_CONTEXT } from './default-tree.context.js'; +import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { html, nothing, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; export type UmbTreeSelectionConfiguration = { multiple?: boolean; @@ -18,48 +19,17 @@ export class UmbDefaultTreeElement extends UmbLitElement { selection: [], }; - @property({ type: Object }) - set selectionConfiguration(config: UmbTreeSelectionConfiguration) { - this._selectionConfiguration = config; - this.#treeContext.selection.setMultiple(config.multiple ?? false); - this.#treeContext.selection.setSelectable(config.selectable ?? true); - this.#treeContext.selection.setSelection(config.selection ?? []); - } - get selectionConfiguration(): UmbTreeSelectionConfiguration { - return this._selectionConfiguration; - } + @property({ type: Object, attribute: false }) + selectionConfiguration: UmbTreeSelectionConfiguration = this._selectionConfiguration; - // TODO: what is the best name for this functionality? - private _hideTreeRoot = false; - @property({ type: Boolean, attribute: 'hide-tree-root' }) - set hideTreeRoot(newVal: boolean) { - const oldVal = this._hideTreeRoot; - this._hideTreeRoot = newVal; - if (newVal === true) { - this.#observeRootItems(); - } + @property({ type: Boolean, attribute: false }) + hideTreeRoot: boolean = false; - this.requestUpdate('hideTreeRoot', oldVal); - } - get hideTreeRoot() { - return this._hideTreeRoot; - } + @property({ attribute: false }) + selectableFilter: (item: UmbTreeItemModelBase) => boolean = () => true; - @property() - set selectableFilter(newVal) { - this.#treeContext.selectableFilter = newVal; - } - get selectableFilter() { - return this.#treeContext.selectableFilter; - } - - @property() - set filter(newVal) { - this.#treeContext.filter = newVal; - } - get filter() { - return this.#treeContext.filter; - } + @property({ attribute: false }) + filter: (item: UmbTreeItemModelBase) => boolean = () => true; @state() private _items: UmbTreeItemModelBase[] = []; @@ -67,14 +37,57 @@ export class UmbDefaultTreeElement extends UmbLitElement { @state() private _treeRoot?: UmbTreeItemModelBase; - #treeContext = new UmbDefaultTreeContext(this); + #treeContext?: UmbDefaultTreeContext; + #init: Promise; constructor() { super(); - this.#observeTreeRoot(); + + this.#init = Promise.all([ + this.consumeContext(UMB_DEFAULT_TREE_CONTEXT, (instance) => { + this.#treeContext = instance; + this.#observeTreeRoot(); + debugger; + }).asPromise(), + ]); + } + + connectedCallback(): void { + super.connectedCallback(); + this.#init; + } + + protected async updated(_changedProperties: PropertyValueMap | Map): Promise { + debugger; + super.updated(_changedProperties); + await this.#init; + + if (_changedProperties.has('selectionConfiguration')) { + this._selectionConfiguration = this.selectionConfiguration; + + this.#treeContext!.selection.setMultiple(this._selectionConfiguration.multiple ?? false); + this.#treeContext!.selection.setSelectable(this._selectionConfiguration.selectable ?? true); + this.#treeContext!.selection.setSelection(this._selectionConfiguration.selection ?? []); + } + + if (_changedProperties.has('hideTreeRoot')) { + debugger; + if (this.hideTreeRoot === true) { + this.#observeRootItems(); + } + } + + if (_changedProperties.has('selectableFilter')) { + this.#treeContext!.selectableFilter = this.selectableFilter; + } + + if (_changedProperties.has('filter')) { + this.#treeContext!.filter = this.filter; + } } #observeTreeRoot() { + if (!this.#treeContext) return; this.observe( this.#treeContext.treeRoot, (treeRoot) => { @@ -85,8 +98,8 @@ export class UmbDefaultTreeElement extends UmbLitElement { } async #observeRootItems() { + await this.#init; if (!this.#treeContext?.requestRootItems) throw new Error('Tree does not support root items'); - console.log('asObservable'); const { asObservable } = await this.#treeContext.requestRootItems(); @@ -95,7 +108,6 @@ export class UmbDefaultTreeElement extends UmbLitElement { asObservable(), (rootItems) => { const oldValue = this._items; - console.log('rootItems', rootItems); this._items = rootItems; this.requestUpdate('_items', oldValue); }, @@ -105,7 +117,7 @@ export class UmbDefaultTreeElement extends UmbLitElement { } getSelection() { - return this.#treeContext.selection.getSelection(); + return this.#treeContext?.selection.getSelection(); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index bceec0c89c..2f5a09af21 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -1,5 +1,5 @@ import type { UmbTreeItemContext } from '../tree-item-context.interface.js'; -import type { UmbDefaultTreeContext } from '../../default/default-tree.context.js'; +import { UMB_DEFAULT_TREE_CONTEXT, type UmbDefaultTreeContext } from '../../default/default-tree.context.js'; import type { UmbTreeItemModelBase } from '../../types.js'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '../../reload-tree-item-children/index.js'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; @@ -177,7 +177,7 @@ export abstract class UmbTreeItemContextBase) => { + this.consumeContext(UMB_DEFAULT_TREE_CONTEXT, (treeContext: UmbDefaultTreeContext) => { this.treeContext = treeContext; this.#observeIsSelectable(); this.#observeIsSelected(); From 800d716d4318882a33220d2bffae46962359ea00 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 20:35:10 +0100 Subject: [PATCH 035/170] remove debugger --- .../src/packages/core/tree/default/default-tree.element.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts index de4a553a4e..c40570aac3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts @@ -47,7 +47,6 @@ export class UmbDefaultTreeElement extends UmbLitElement { this.consumeContext(UMB_DEFAULT_TREE_CONTEXT, (instance) => { this.#treeContext = instance; this.#observeTreeRoot(); - debugger; }).asPromise(), ]); } @@ -58,7 +57,6 @@ export class UmbDefaultTreeElement extends UmbLitElement { } protected async updated(_changedProperties: PropertyValueMap | Map): Promise { - debugger; super.updated(_changedProperties); await this.#init; @@ -71,7 +69,6 @@ export class UmbDefaultTreeElement extends UmbLitElement { } if (_changedProperties.has('hideTreeRoot')) { - debugger; if (this.hideTreeRoot === true) { this.#observeRootItems(); } From 5a81c06a7f7c8ab20b7b83ec732c958c0d13c411 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 20:35:31 +0100 Subject: [PATCH 036/170] add render method --- .../tree-item-base/tree-item-element-base.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts index a03f03faaf..e1407dd680 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts @@ -41,7 +41,7 @@ export abstract class UmbTreeItemElementBase ${this.renderIconContainer()} ${this.renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()} - Load more + ${this.#renderPaging()} `; } @@ -190,4 +190,12 @@ export abstract class UmbTreeItemElementBase `; + } } From ae1314d4f6256d64b751995c96e4915b32f7f35c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 20:35:50 +0100 Subject: [PATCH 037/170] ensure total pages doesn't go below 1 --- .../core/utils/pagination-manager/pagination.manager.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts index e370f53f02..369cc39820 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/pagination-manager/pagination.manager.ts @@ -106,7 +106,8 @@ export class UmbPaginationManager extends EventTarget { * @memberof UmbPaginationManager */ #calculateTotalPages() { - const totalPages = Math.ceil(this.#totalItems.getValue() / this.#pageSize.getValue()); + let totalPages = Math.ceil(this.#totalItems.getValue() / this.#pageSize.getValue()); + totalPages = totalPages === 0 ? 1 : totalPages; this.#totalPages.setValue(totalPages); /* If we currently are on a page higher than the total pages. We need to reset the current page to the last page. From 97171ab92834d8ec48698c5f341b729c25190c9a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 20:46:48 +0100 Subject: [PATCH 038/170] request collection --- .../core/collection/default/collection-default.element.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts index d97aa8407a..9b30d3910d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts @@ -1,6 +1,6 @@ import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from './collection-default.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -35,6 +35,11 @@ export class UmbCollectionDefaultElement extends UmbLitElement { }); } + protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { + super.firstUpdated(_changedProperties); + this.#collectionContext?.requestCollection(); + } + #observeCollectionRoutes() { if (!this.#collectionContext) return; From b3f15255febc9e455f16b1cd7f99408ca4813578 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 20:47:09 +0100 Subject: [PATCH 039/170] Update collection-default.element.ts --- .../core/collection/default/collection-default.element.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts index 9b30d3910d..929fb667ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/collection/default/collection-default.element.ts @@ -1,6 +1,7 @@ import { UMB_DEFAULT_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from './collection-default.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, html, customElement, state, PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; +import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; From 765a9514a43218eec694aabf0dded99134c94a9f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 20:53:09 +0100 Subject: [PATCH 040/170] remove console logs --- .../tree/tree-item/tree-item-base/tree-item-context-base.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 2f5a09af21..e639ee94a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -138,11 +138,6 @@ export abstract class UmbTreeItemContextBase Date: Wed, 28 Feb 2024 21:33:09 +0100 Subject: [PATCH 041/170] add support for paging in mocks --- .../data/utils/entity/entity-tree.manager.ts | 17 ++++++++-------- .../file-system/file-system-tree.manager.ts | 20 +++++++++++-------- .../mocks/handlers/data-type/tree.handlers.ts | 8 ++++++-- .../handlers/dictionary/tree.handlers.ts | 8 ++++++-- .../handlers/document-type/tree.handlers.ts | 8 ++++++-- .../mocks/handlers/document/tree.handlers.ts | 8 ++++++-- .../handlers/media-type/tree.handlers.ts | 8 ++++++-- .../src/mocks/handlers/media/tree.handlers.ts | 8 ++++++-- .../handlers/member-type/tree.handlers.ts | 8 ++++++-- .../handlers/partial-view/tree.handlers.ts | 8 ++++++-- .../mocks/handlers/script/tree.handlers.ts | 8 ++++++-- .../handlers/static-file/tree.handlers.ts | 8 ++++++-- .../handlers/stylesheet/tree.handlers.ts | 6 ++++-- .../mocks/handlers/template/tree.handlers.ts | 8 ++++++-- 14 files changed, 91 insertions(+), 40 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts index 3405a88309..1f4a0ed427 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/entity/entity-tree.manager.ts @@ -1,3 +1,4 @@ +import { pagedResult } from '../paged-result.js'; import type { UmbEntityMockDbBase } from './entity-base.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -11,18 +12,18 @@ export class UmbMockEntityTreeManager item.parent === null); - const treeItems = items.map((item) => this.#treeItemMapper(item)); - const total = items.length; - return { items: treeItems, total }; + const paged = pagedResult(items, skip, take); + const treeItems = paged.items.map((item) => this.#treeItemMapper(item)); + return { items: treeItems, total: paged.total }; } - getChildrenOf(parentId: string) { + getChildrenOf({ parentId, skip = 0, take = 100 }: { parentId: string; skip?: number; take?: number }) { const items = this.#db.getAll().filter((item) => item.parent?.id === parentId); - const treeItems = items.map((item) => this.#treeItemMapper(item)); - const total = items.length; - return { items: treeItems, total }; + const paged = pagedResult(items, skip, take); + const treeItems = paged.items.map((item) => this.#treeItemMapper(item)); + return { items: treeItems, total: paged.total }; } move(ids: Array, destinationId: string) { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/file-system/file-system-tree.manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/file-system/file-system-tree.manager.ts index 05c243ce76..f1f2fe291a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/utils/file-system/file-system-tree.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/utils/file-system/file-system-tree.manager.ts @@ -1,5 +1,6 @@ import type { UmbMockDBBase } from '../mock-db-base.js'; import { createFileSystemTreeItem } from '../../utils.js'; +import { pagedResult } from '../paged-result.js'; import type { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; export class UmbMockFileSystemTreeManager> { @@ -9,20 +10,23 @@ export class UmbMockFileSystemTreeManager>; total: number } { + getRoot({ skip = 0, take = 100 }: { skip?: number; take?: number } = {}): { + items: Array>; + total: number; + } { const items = this.#db.getAll().filter((item) => item.parent === null); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; + const paged = pagedResult(items, skip, take); + const treeItems = paged.items.map((item) => createFileSystemTreeItem(item)); + return { items: treeItems, total: paged.total }; } - getChildrenOf(parentPath: string): { + getChildrenOf({ parentPath, skip = 0, take = 100 }: { parentPath: string; skip?: number; take?: number }): { items: Array>; total: number; } { const items = this.#db.getAll().filter((item) => item.parent?.path === parentPath); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; + const paged = pagedResult(items, skip, take); + const treeItems = paged.items.map((item) => createFileSystemTreeItem(item)); + return { items: treeItems, total: paged.total }; } } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts index 6b40a709ad..7c3973e38b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbDataTypeMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDataTypeMockDb.tree.getRoot({ skip, take }); 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 response = umbDataTypeMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDataTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts index 22d46b92fd..6d79c28104 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbDictionaryMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDictionaryMockDb.tree.getRoot({ skip, take }); 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 response = umbDictionaryMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDictionaryMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts index 79b722f63c..9f8a2297ce 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbDocumentTypeMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDocumentTypeMockDb.tree.getRoot({ skip, take }); 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 response = umbDocumentTypeMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDocumentTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts index e2a0aacc7e..e148fc83da 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbDocumentMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDocumentMockDb.tree.getRoot({ skip, take }); 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 response = umbDocumentMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDocumentMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts index 335f3d1728..2d113dee35 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbMediaTypeMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbMediaTypeMockDb.tree.getRoot({ skip, take }); 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 response = umbMediaTypeMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbMediaTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts index b57b17e3a1..308c04be52 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbMediaMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbMediaMockDb.tree.getRoot({ skip, take }); 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 response = umbMediaMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbMediaMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts index 78d543c445..0aef1a0996 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbMemberTypeMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbMemberTypeMockDb.tree.getRoot({ skip, take }); 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 response = umbMemberTypeMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbMemberTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts index 8848ec8be6..6838f10ca6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbPartialViewMockDB.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbPartialViewMockDB.tree.getRoot({ skip, take }); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { const parentPath = req.url.searchParams.get('parentPath'); if (!parentPath) return res(ctx.status(400)); - const response = umbPartialViewMockDB.tree.getChildrenOf(parentPath); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbPartialViewMockDB.tree.getChildrenOf({ parentPath, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts index 89972b3c6e..216321e50f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbScriptMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbScriptMockDb.tree.getRoot({ skip, take }); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { const parentPath = req.url.searchParams.get('parentPath'); if (!parentPath) return res(ctx.status(400)); - const response = umbScriptMockDb.tree.getChildrenOf(parentPath); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbScriptMockDb.tree.getChildrenOf({ parentPath, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts index ca0a038895..0568111018 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbStaticFileMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbStaticFileMockDb.tree.getRoot({ skip, take }); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { const parentPath = req.url.searchParams.get('parentPath'); if (!parentPath) return res(ctx.status(400)); - const response = umbStaticFileMockDb.tree.getChildrenOf(parentPath); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbStaticFileMockDb.tree.getChildrenOf({ parentPath, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts index 7441982c84..b5a492c370 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts @@ -5,14 +5,16 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbStylesheetMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbStylesheetMockDb.tree.getRoot({ skip, take }); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { const parentPath = req.url.searchParams.get('parentPath'); if (!parentPath) return res(ctx.status(400)); - const response = umbStylesheetMockDb.tree.getChildrenOf(parentPath); + const response = umbStylesheetMockDb.tree.getChildrenOf({ parentPath, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts index 813d7432dd..d177d705fd 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts @@ -5,14 +5,18 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const response = umbTemplateMockDb.tree.getRoot(); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbTemplateMockDb.tree.getRoot({ skip, take }); 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 response = umbTemplateMockDb.tree.getChildrenOf(parentId); + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbTemplateMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), ]; From d4b90699a76eaa1605655e6a1de7b3a12c714103 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 22:15:39 +0100 Subject: [PATCH 042/170] add paging to root items --- .../core/tree/default/default-tree.context.ts | 57 ++++++++++++++----- .../core/tree/default/default-tree.element.ts | 25 ++++++++ .../tree-item-base/tree-item-context-base.ts | 14 ++--- 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts index 4608906723..9ccf9d5da0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts @@ -11,10 +11,11 @@ import { import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; +import { UmbPaginationManager, UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import type { UmbEntityActionEvent } from '@umbraco-cms/backoffice/entity-action'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; export class UmbDefaultTreeContext extends UmbContextBase> @@ -26,11 +27,17 @@ export class UmbDefaultTreeContext public selectableFilter?: (item: TreeItemType) => boolean = () => true; public filter?: (item: TreeItemType) => boolean = () => true; public readonly selection = new UmbSelectionManager(this._host); + public readonly pagination = new UmbPaginationManager(); #manifest?: ManifestTree; #repository?: UmbTreeRepository; #actionEventContext?: UmbActionEventContext; + #paging = { + skip: 0, + take: 3, + }; + #initResolver?: () => void; #initialized = false; @@ -40,19 +47,11 @@ export class UmbDefaultTreeContext constructor(host: UmbControllerHostElement) { super(host, UMB_DEFAULT_TREE_CONTEXT); + this.pagination.setPageSize(this.#paging.take); + this.#consumeContexts(); - this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => { - this.#actionEventContext = instance; - this.#actionEventContext.removeEventListener( - UmbReloadTreeItemChildrenRequestEntityActionEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - this.#actionEventContext.addEventListener( - UmbReloadTreeItemChildrenRequestEntityActionEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - }); - + // listen for page changes on the pagination manager + this.pagination.addEventListener(UmbChangeEvent.TYPE, this.#onPageChange); this.requestTreeRoot(); } @@ -101,7 +100,17 @@ export class UmbDefaultTreeContext public async requestRootItems() { await this.#init; - return this.#repository!.requestRootTreeItems({ skip: 0, take: 100 }); + + const { data, error, asObservable } = await this.#repository!.requestRootTreeItems({ + skip: this.#paging.skip, + take: this.#paging.take, + }); + + if (data) { + this.pagination.setTotalItems(data.total); + } + + return { data, error, asObservable }; } public async rootItems() { @@ -109,6 +118,26 @@ export class UmbDefaultTreeContext return this.#repository!.rootTreeItems(); } + #consumeContexts() { + this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => { + this.#actionEventContext = instance; + this.#actionEventContext.removeEventListener( + UmbReloadTreeItemChildrenRequestEntityActionEvent.TYPE, + this.#onReloadRequest as EventListener, + ); + this.#actionEventContext.addEventListener( + UmbReloadTreeItemChildrenRequestEntityActionEvent.TYPE, + this.#onReloadRequest as EventListener, + ); + }); + } + + #onPageChange = (event: UmbChangeEvent) => { + const target = event.target as UmbPaginationManager; + this.#paging.skip = target.getSkip(); + this.requestRootItems(); + }; + #observeRepository(repositoryAlias?: string) { if (!repositoryAlias) throw new Error('Tree must have a repository alias.'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts index c40570aac3..1780ac6ccd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.element.ts @@ -37,6 +37,12 @@ export class UmbDefaultTreeElement extends UmbLitElement { @state() private _treeRoot?: UmbTreeItemModelBase; + @state() + private _currentPage = 1; + + @state() + private _totalPages = 1; + #treeContext?: UmbDefaultTreeContext; #init: Promise; @@ -46,6 +52,10 @@ export class UmbDefaultTreeElement extends UmbLitElement { this.#init = Promise.all([ this.consumeContext(UMB_DEFAULT_TREE_CONTEXT, (instance) => { this.#treeContext = instance; + + this.observe(this.#treeContext.pagination.currentPage, (value) => (this._currentPage = value)); + this.observe(this.#treeContext.pagination.totalPages, (value) => (this._totalPages = value)); + this.#observeTreeRoot(); }).asPromise(), ]); @@ -136,8 +146,23 @@ export class UmbDefaultTreeElement extends UmbLitElement { (item, index) => item.name + '___' + index, (item) => html``, )} + ${this.#renderPaging()} `; } + + #onLoadMoreClick = (event: any) => { + event.stopPropagation(); + const next = (this._currentPage = this._currentPage + 1); + this.#treeContext?.pagination.setCurrentPageNumber(next); + }; + + #renderPaging() { + if (this._totalPages <= 1 || this._currentPage === this._totalPages) { + return nothing; + } + + return html` `; + } } export default UmbDefaultTreeElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index e639ee94a1..3aef8a988e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -26,6 +26,7 @@ export abstract class UmbTreeItemContextBase; - public readonly pagination = new UmbPaginationManager(); - - #filter = { + // TODO: get this from the tree context + #paging = { skip: 0, take: 3, }; constructor(host: UmbControllerHost, getUniqueFunction: UmbTreeItemUniqueFunction) { super(host, UMB_TREE_ITEM_CONTEXT); - this.pagination.setPageSize(this.#filter.take); + this.pagination.setPageSize(this.#paging.take); this.#getUniqueFunction = getUniqueFunction; this.#consumeContexts(); @@ -132,8 +132,8 @@ export abstract class UmbTreeItemContextBase { const target = event.target as UmbPaginationManager; - this.#filter.skip = target.getSkip(); + this.#paging.skip = target.getSkip(); this.requestChildren(); }; From 0491d8bd335e8027feec1bd8153e241781419a15 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 22:27:23 +0100 Subject: [PATCH 043/170] set selection config --- .../tree-menu-item-default/tree-menu-item-default.element.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts index be9e43b8c1..01d57bc565 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-menu-item-default/tree-menu-item-default.element.ts @@ -32,6 +32,10 @@ export class UmbMenuItemTreeDefaultElement extends UmbLitElement implements UmbM alias=${this.manifest?.meta.treeAlias} .props=${{ hideTreeRoot: this.manifest?.meta.hideTreeRoot === true, + selectionConfiguration: { + selectable: false, + multiple: false, + }, }}> ` : nothing; From c4303b854ab66ef8071187cceb6af8f213fc4f8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 29 Feb 2024 10:28:05 +0100 Subject: [PATCH 044/170] remove unused constructor method --- .../src/packages/core/repository/repository-base.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts index 51b25e8978..44f677894e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-base.ts @@ -1,9 +1,4 @@ -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; // TODO: Revisit if constructor method should be omitted -export abstract class UmbRepositoryBase extends UmbBaseController { - constructor(host: UmbControllerHost) { - super(host); - } -} +export abstract class UmbRepositoryBase extends UmbBaseController {} From 9e2ea523adc6ce7600c9f467e0694f65ef5f4d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 29 Feb 2024 10:37:17 +0100 Subject: [PATCH 045/170] type for repository responses --- .../repository/copy/copy-repository.interface.ts | 4 ++-- .../repository/data-source-response.interface.ts | 2 +- .../detail/detail-data-source.interface.ts | 12 ++++++------ .../repository/detail/detail-repository.interface.ts | 10 +++++----- .../src/packages/core/repository/index.ts | 5 ++++- .../src/packages/core/repository/types.ts | 9 +++++++++ 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts index 7dd2abe75b..63bc476e8c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts @@ -1,5 +1,5 @@ -import type { DataSourceResponse } from '../data-source-response.interface.js'; +import type { UmbDataSourceResponse } from '../data-source-response.interface.js'; export interface UmbCopyRepository { - copy(unique: string, targetUnique: string): Promise>; + copy(unique: string, targetUnique: string): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source-response.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source-response.interface.ts index ac0d1d2879..2c8aabb23b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source-response.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/data-source-response.interface.ts @@ -1,6 +1,6 @@ import type { ApiError, CancelError } from '@umbraco-cms/backoffice/external/backend-api'; -export interface DataSourceResponse extends UmbDataSourceErrorResponse { +export interface UmbDataSourceResponse extends UmbDataSourceErrorResponse { data?: T; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts index dd0f37a173..2ba292648e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-data-source.interface.ts @@ -1,4 +1,4 @@ -import type { DataSourceResponse } from '../data-source-response.interface.js'; +import type { UmbDataSourceResponse } from '../data-source-response.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export interface UmbDetailDataSourceConstructor { @@ -6,9 +6,9 @@ export interface UmbDetailDataSourceConstructor { } export interface UmbDetailDataSource { - createScaffold(parentUnique: string | null, preset?: Partial): Promise>; - create(data: DetailType): Promise>; - read(unique: string): Promise>; - update(data: DetailType): Promise>; - delete(unique: string): Promise; + createScaffold(parentUnique: string | null, preset?: Partial): Promise>; + create(data: DetailType): Promise>; + read(unique: string): Promise>; + update(data: DetailType): Promise>; + delete(unique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts index 1bf5213cdf..94846826b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts @@ -1,14 +1,14 @@ -import type { DataSourceResponse, UmbDataSourceErrorResponse } from '../data-source-response.interface.js'; +import type { UmbDataSourceResponse, UmbDataSourceErrorResponse } from '../data-source-response.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export interface UmbDetailRepository { createScaffold( parentUnique: string | null, preset?: Partial, - ): Promise>; - requestByUnique(unique: string): Promise>; + ): Promise>; + requestByUnique(unique: string): Promise>; byUnique(unique: string): Promise>; - create(data: DetailModelType): Promise>; - save(data: DetailModelType): Promise>; + create(data: DetailModelType): Promise>; + save(data: DetailModelType): Promise>; delete(unique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts index 584a609b30..e92a4a42c8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts @@ -4,7 +4,10 @@ export * from './repository-base.js'; export * from './item/index.js'; export * from './detail/index.js'; -export type { DataSourceResponse, UmbDataSourceErrorResponse } from './data-source-response.interface.js'; +export type { + UmbDataSourceResponse as DataSourceResponse, + UmbDataSourceErrorResponse, +} from './data-source-response.interface.js'; export type { UmbMoveDataSource, UmbMoveRepository } from './move/index.js'; export type { UmbCopyDataSource, UmbCopyRepository } from './copy/index.js'; export type { UmbPagedModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts index 9825f3c650..4cb51179b9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts @@ -1,4 +1,13 @@ +import type { UmbDataSourceResponse } from './data-source-response.interface.js'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; + export interface UmbPagedModel { total: number; items: Array; } + +export interface UmbRepositoryResponse extends UmbDataSourceResponse {} + +export interface UmbRepositoryResponseWithAsObservable extends UmbRepositoryResponse { + asObservable?: () => Observable; +} From 4a6bfd28167d3819f2a995c2826f14823b678f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 29 Feb 2024 10:44:55 +0100 Subject: [PATCH 046/170] correction of types for repositories --- .../repository/copy/copy-repository.interface.ts | 4 ++-- .../detail/detail-repository.interface.ts | 16 ++++++++++------ .../repository/move/move-repository.interface.ts | 4 ++-- .../src/packages/core/repository/types.ts | 5 +++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts index 63bc476e8c..201e416e5e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/copy/copy-repository.interface.ts @@ -1,5 +1,5 @@ -import type { UmbDataSourceResponse } from '../data-source-response.interface.js'; +import type { UmbRepositoryResponse } from '../types.js'; export interface UmbCopyRepository { - copy(unique: string, targetUnique: string): Promise>; + copy(unique: string, targetUnique: string): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts index 94846826b8..7a68c83757 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/detail/detail-repository.interface.ts @@ -1,14 +1,18 @@ -import type { UmbDataSourceResponse, UmbDataSourceErrorResponse } from '../data-source-response.interface.js'; +import type { + UmbRepositoryErrorResponse, + UmbRepositoryResponse, + UmbRepositoryResponseWithAsObservable, +} from '../types.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export interface UmbDetailRepository { createScaffold( parentUnique: string | null, preset?: Partial, - ): Promise>; - requestByUnique(unique: string): Promise>; + ): Promise>; + requestByUnique(unique: string): Promise>; byUnique(unique: string): Promise>; - create(data: DetailModelType): Promise>; - save(data: DetailModelType): Promise>; - delete(unique: string): Promise; + create(data: DetailModelType): Promise>; + save(data: DetailModelType): Promise>; + delete(unique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts index df80f262a8..9502e8d409 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/move/move-repository.interface.ts @@ -1,5 +1,5 @@ -import type { UmbDataSourceErrorResponse } from '../data-source-response.interface.js'; +import type { UmbRepositoryErrorResponse } from '../types.js'; export interface UmbMoveRepository { - move(unique: string, targetUnique: string): Promise; + move(unique: string, targetUnique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts index 4cb51179b9..2c53c1f122 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/types.ts @@ -1,4 +1,4 @@ -import type { UmbDataSourceResponse } from './data-source-response.interface.js'; +import type { UmbDataSourceErrorResponse, UmbDataSourceResponse } from './data-source-response.interface.js'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; export interface UmbPagedModel { @@ -6,7 +6,8 @@ export interface UmbPagedModel { items: Array; } -export interface UmbRepositoryResponse extends UmbDataSourceResponse {} +export interface UmbRepositoryResponse extends UmbDataSourceResponse {} +export interface UmbRepositoryErrorResponse extends UmbDataSourceErrorResponse {} export interface UmbRepositoryResponseWithAsObservable extends UmbRepositoryResponse { asObservable?: () => Observable; From 409591e91af53eadbf7927f41a64c45d0fed82d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 29 Feb 2024 10:55:49 +0100 Subject: [PATCH 047/170] use prop observable --- .../collection/document-workspace-view-collection.element.ts | 2 +- .../views/collection/media-workspace-view-collection.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/collection/document-workspace-view-collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/collection/document-workspace-view-collection.element.ts index 6d0baa9459..758a11482d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/collection/document-workspace-view-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/collection/document-workspace-view-collection.element.ts @@ -31,7 +31,7 @@ export class UmbDocumentWorkspaceViewCollectionElement extends UmbLitElement imp this._documentUnique = unique; }); this.observe( - workspaceContext.structure.ownerContentType(), + workspaceContext.structure.ownerContentType, async (documentType) => { if (!documentType || !documentType.collection) return; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/collection/media-workspace-view-collection.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/collection/media-workspace-view-collection.element.ts index 4a1d3f753d..70a18ba74e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/collection/media-workspace-view-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/collection/media-workspace-view-collection.element.ts @@ -31,7 +31,7 @@ export class UmbMediaWorkspaceViewCollectionElement extends UmbLitElement implem this._mediaUnique = unique; }); this.observe( - workspaceContext.structure.ownerContentType(), + workspaceContext.structure.ownerContentType, async (mediaType) => { if (!mediaType || !mediaType.collection) return; From ec37e11572329b9139ac3b32df3a4956233144da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Thu, 29 Feb 2024 10:55:50 +0100 Subject: [PATCH 048/170] variesByCulture --- .../content-type-structure-manager.class.ts | 14 +++++++++++--- .../workspace/document-workspace.context.ts | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts index 07ba0a22f7..16f5c44799 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/content-type-structure-manager.class.ts @@ -14,6 +14,7 @@ import { partialUpdateFrozenArray, appendToFrozenArray, filterFrozenArray, + createObservablePart, } from '@umbraco-cms/backoffice/observable-api'; import { incrementString } from '@umbraco-cms/backoffice/utils'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; @@ -27,6 +28,9 @@ export class UmbContentTypePropertyStructureManager(); #contentTypes = new UmbArrayState([], (x) => x.unique); readonly contentTypes = this.#contentTypes.asObservable(); + readonly ownerContentType = this.#contentTypes.asObservablePart((x) => + x.find((y) => y.unique === this.#ownerContentTypeUnique), + ); private readonly _contentTypeContainers = this.#contentTypes.asObservablePart((x) => x.flatMap((x) => x.containers ?? []), ); @@ -126,6 +130,7 @@ export class UmbContentTypePropertyStructureManager { if (docType) { @@ -164,8 +172,8 @@ export class UmbContentTypePropertyStructureManager x.find((y) => y.unique === this.#ownerContentTypeUnique)); + ownerContentTypePart(mappingFunction: MappingFunction) { + return createObservablePart(this.ownerContentType, mappingFunction); } getOwnerContentType() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 9202d634ba..d3db07adbb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -70,6 +70,8 @@ export class UmbDocumentWorkspaceContext readonly templateId = this.#currentData.asObservablePart((data) => data?.template?.unique || null); readonly structure = new UmbContentTypePropertyStructureManager(this, new UmbDocumentTypeDetailRepository(this)); + readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture); + readonly splitView = new UmbWorkspaceSplitViewManager(); constructor(host: UmbControllerHost) { From 2734b9a966c403cb342c1a6b36fe0326800d2c2b Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Thu, 29 Feb 2024 11:53:16 +0100 Subject: [PATCH 049/170] Bugfix: Health Check Dashboard --- .../health-check/dashboard-health-check.element.ts | 3 ++- .../health-check/health-check-dashboard.context.ts | 7 ++++--- .../packages/health-check/health-check.context.ts | 7 ++++++- .../views/health-check-overview.element.ts | 12 +++++++++--- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts index 5f536cd031..d042b0a625 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts @@ -1,3 +1,4 @@ +import { UmbHealthCheckContext } from './health-check.context.js'; import type { UmbDashboardHealthCheckGroupElement } from './views/health-check-group.element.js'; import { UmbHealthCheckDashboardContext, UMB_HEALTHCHECK_DASHBOARD_CONTEXT } from './health-check-dashboard.context.js'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; @@ -58,7 +59,7 @@ export class UmbDashboardHealthCheckElement extends UmbLitElement { weight: 500, meta: { label: group.name || '', - api: () => import('./health-check.context.js'), + api: UmbHealthCheckContext, }, }; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check-dashboard.context.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check-dashboard.context.ts index 75c362096c..2a3ebf0db0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check-dashboard.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check-dashboard.context.ts @@ -1,6 +1,7 @@ import type { UmbHealthCheckContext } from './health-check.context.js'; import type { ManifestHealthCheck } from '@umbraco-cms/backoffice/extension-registry'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { loadManifestApi } from '@umbraco-cms/backoffice/extension-api'; export class UmbHealthCheckDashboardContext { #manifests: ManifestHealthCheck[] = []; @@ -27,9 +28,9 @@ export class UmbHealthCheckDashboardContext { #registerApis() { this.apis.clear(); - this.#manifests.forEach((manifest) => { - // the group name (label) is the unique key for a health check group - this.apis.set(manifest.meta.label, new manifest.meta.api(this.host)); + this.#manifests.forEach(async (manifest) => { + const api = await loadManifestApi(manifest.meta.api); + if (api) this.apis.set(manifest.meta.label, new api(this.host)); }); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts index ed0672d484..79252bee48 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts @@ -7,8 +7,9 @@ import { HealthCheckResource } from '@umbraco-cms/backoffice/external/backend-ap import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -export class UmbHealthCheckContext { +export class UmbHealthCheckContext implements UmbApi { private _checks = new BehaviorSubject(undefined); public readonly checks = this._checks.asObservable(); @@ -43,6 +44,10 @@ export class UmbHealthCheckContext { this._results.next(undefined); } } + + public destroy(): void { + this.destroy(); + } } export default UmbHealthCheckContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-overview.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-overview.element.ts index d05a3f7022..730f35f8d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-overview.element.ts @@ -29,8 +29,8 @@ export class UmbDashboardHealthCheckOverviewElement extends UmbLitElement { render() { return html` -
- Health Check +