From 108a6207bdcc0a8dda439c83149997019c4d729a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 5 Jun 2024 14:29:30 +0200 Subject: [PATCH 01/16] call correct data source method --- .../public-access/repository/public-access.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.repository.ts index 3087e5cef9..5135fd43e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.repository.ts @@ -25,7 +25,7 @@ export class UmbDocumentPublicAccessRepository extends UmbControllerBase impleme if (!unique) throw new Error('unique is missing'); if (!data) throw new Error('Data is missing'); - const { error } = await this.#dataSource.update(unique, data); + const { error } = await this.#dataSource.create(unique, data); if (!error) { const notification = { data: { message: `Public acccess setting created` } }; this.#notificationContext?.peek('positive', notification); From 2156f26e23fcb4fdf51bf3eb09e001bb19b2f504 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 5 Jun 2024 14:29:52 +0200 Subject: [PATCH 02/16] await the repo call before submitting the modal --- .../public-access/modal/public-access-modal.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index c20e44ccca..b36f316ddd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -104,9 +104,9 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< }; if (this.#isNew) { - this.#publicAccessRepository.create(this.#unique, requestBody); + await this.#publicAccessRepository.create(this.#unique, requestBody); } else { - this.#publicAccessRepository.update(this.#unique, requestBody); + await this.#publicAccessRepository.update(this.#unique, requestBody); } this.modalContext?.submit(); From 40f5a50ab5a41f75910b0b8ee1587672f33b4bc8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 5 Jun 2024 14:34:47 +0200 Subject: [PATCH 03/16] Request the document item model instead of detail model --- .../public-access/modal/public-access-modal.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index b36f316ddd..dbdebe5103 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -1,5 +1,5 @@ import { UmbDocumentPublicAccessRepository } from '../repository/public-access.repository.js'; -import { UmbDocumentDetailRepository } from '../../../repository/index.js'; +import { UmbDocumentItemRepository } from '../../../repository/index.js'; import type { UmbInputDocumentElement } from '../../../components/index.js'; import type { UmbPublicAccessModalData, UmbPublicAccessModalValue } from './public-access-modal.token.js'; import { css, customElement, html, nothing, state } from '@umbraco-cms/backoffice/external/lit'; @@ -48,10 +48,10 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< async #getDocumentName() { if (!this.#unique) return; // Should this be done here or in the action file? - const { data } = await new UmbDocumentDetailRepository(this).requestByUnique(this.#unique); + const { data } = await new UmbDocumentItemRepository(this).requestItems([this.#unique]); if (!data) return; //TODO How do we ensure we get the correct variant? - this._documentName = data.variants[0]?.name; + this._documentName = data[0].variants[0]?.name; } async #getPublicAccessModel() { From 197b65851b7b91831aa41e4a40d89bb3fe605131 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 5 Jun 2024 14:45:51 +0200 Subject: [PATCH 04/16] await delete before submitting the modal --- .../public-access/modal/public-access-modal.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index dbdebe5103..983ff2c975 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -112,9 +112,9 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< this.modalContext?.submit(); } - #handleDelete() { + async #handleDelete() { if (!this.#unique) return; - this.#publicAccessRepository.delete(this.#unique); + await this.#publicAccessRepository.delete(this.#unique); this.modalContext?.submit(); } From 71efd61837a9653dceaac3547b7d257e8a8b3785 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 11:50:59 +0200 Subject: [PATCH 05/16] pass member group names to endpoint --- .../modal/public-access-modal.element.ts | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index 983ff2c975..cf80c10ed0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -5,8 +5,8 @@ import type { UmbPublicAccessModalData, UmbPublicAccessModalValue } from './publ import { css, customElement, html, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import type { UmbInputMemberElement } from '@umbraco-cms/backoffice/member'; -import type { UmbInputMemberGroupElement } from '@umbraco-cms/backoffice/member-group'; +import { UmbMemberItemRepository, type UmbInputMemberElement } from '@umbraco-cms/backoffice/member'; +import { UmbMemberGroupItemRepository, type UmbInputMemberGroupElement } from '@umbraco-cms/backoffice/member-group'; import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UUIRadioEvent } from '@umbraco-cms/backoffice/external/uui'; @@ -32,10 +32,10 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< private _selection: Array = []; @state() - private _loginPageId?: string; + private _loginDocumentId?: string; @state() - private _errorPageId?: string; + private _errorDocumentId?: string; // Init @@ -56,15 +56,8 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< async #getPublicAccessModel() { if (!this.#unique) return; - //const { data } = (await this.#publicAccessRepository.read(this.#unique)); - // TODO Currently returning "void". Remove mock data when API is ready. Will it be Response or Request model? - const data: any = undefined; - /*const data: PublicAccessResponseModel = { - members: [{ name: 'Agent', id: '007' }], - groups: [], - loginPageId: '123', - errorPageId: '456', - };*/ + const { data } = await this.#publicAccessRepository.read(this.#unique); + debugger; if (!data) return; this.#isNew = false; @@ -80,8 +73,8 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< this._selection = data.groups.map((g: any) => g.id); } - this._loginPageId = data.loginPageId; - this._errorPageId = data.errorPageId; + this._loginDocumentId = data.loginDocument.id; + this._errorDocumentId = data.errorDocument.id; } // Modal events @@ -91,18 +84,34 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< } async #handleSave() { - if (!this._loginPageId || !this._errorPageId || !this.#unique) return; - - const groups = this._specific ? [] : this._selection; - const members = this._specific ? this._selection : []; + if (!this._loginDocumentId || !this._errorDocumentId || !this.#unique) return; + // TODO: [v15] Currently the Management API doesn't support passing the member/group ids, only the userNames/names. + // This is a temporary solution where we have to look them up until the API is updated to support this. const requestBody: PublicAccessRequestModel = { - memberGroupNames: groups, - memberUserNames: members, - loginDocument: { id: this._loginPageId }, - errorDocument: { id: this._errorPageId }, + memberGroupNames: [], + memberUserNames: [], + loginDocument: { id: this._loginDocumentId }, + errorDocument: { id: this._errorDocumentId }, }; + if (this._specific) { + // Members + + console.log('Specific members'); + } else { + // Groups + const repo = new UmbMemberGroupItemRepository(this); + const { data } = await repo.requestItems(this._selection); + if (!data) throw new Error('No Member groups returned'); + + const groupNames = data + .filter((groupItem) => this._selection.includes(groupItem.unique)) + .map((groupItem) => groupItem.name); + + requestBody.memberGroupNames = groupNames; + } + if (this.#isNew) { await this.#publicAccessRepository.create(this.#unique, requestBody); } else { @@ -125,11 +134,11 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< // Change Events #onChangeLoginPage(e: CustomEvent) { - this._loginPageId = (e.target as UmbInputDocumentElement).selection[0]; + this._loginDocumentId = (e.target as UmbInputDocumentElement).selection[0]; } #onChangeErrorPage(e: CustomEvent) { - this._errorPageId = (e.target as UmbInputDocumentElement).selection[0]; + this._errorDocumentId = (e.target as UmbInputDocumentElement).selection[0]; } #onChangeGroup(e: CustomEvent) { @@ -220,7 +229,7 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< look="primary" color="positive" label=${this.localize.term('buttons_save')} - ?disabled=${!this._loginPageId || !this._errorPageId || this._selection.length === 0} + ?disabled=${!this._loginDocumentId || !this._errorDocumentId || this._selection.length === 0} @click="${this.#handleSave}">` : html` Date: Thu, 6 Jun 2024 11:52:15 +0200 Subject: [PATCH 06/16] remove any --- .../public-access/modal/public-access-modal.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index cf80c10ed0..e32f71151f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -68,9 +68,9 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< //selection if (data.members.length > 0) { - this._selection = data.members.map((m: any) => m.id); + this._selection = data.members.map((m) => m.id); } else if (data.groups.length > 0) { - this._selection = data.groups.map((g: any) => g.id); + this._selection = data.groups.map((g) => g.id); } this._loginDocumentId = data.loginDocument.id; From 63a46027eed996460f7c5d88beb842cd7ebe476a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 11:52:51 +0200 Subject: [PATCH 07/16] remove redundant true / false --- .../public-access/modal/public-access-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index e32f71151f..1fe0498c92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -64,7 +64,7 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< this._startPage = false; // Specific or Groups - this._specific = data.members.length > 0 ? true : false; + this._specific = data.members.length > 0; //selection if (data.members.length > 0) { From d71a5baca573f286d02bfa6a9a02adc3203c3de8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 12:43:42 +0200 Subject: [PATCH 08/16] set value --- .../modal/public-access-modal.element.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index 1fe0498c92..715c12d8f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -5,7 +5,7 @@ import type { UmbPublicAccessModalData, UmbPublicAccessModalValue } from './publ import { css, customElement, html, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UmbMemberItemRepository, type UmbInputMemberElement } from '@umbraco-cms/backoffice/member'; +import { UmbMemberDetailRepository, type UmbInputMemberElement } from '@umbraco-cms/backoffice/member'; import { UmbMemberGroupItemRepository, type UmbInputMemberGroupElement } from '@umbraco-cms/backoffice/member-group'; import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UUIRadioEvent } from '@umbraco-cms/backoffice/external/uui'; @@ -191,7 +191,10 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< Choose the page that contains the login form - +
@@ -201,7 +204,10 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< Used when people are logged on, but do not have access - +
`; } From 6147e4e4e320fbf14f17401262414d8f44a86885 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 12:43:57 +0200 Subject: [PATCH 09/16] look up member details to get the username --- .../public-access/modal/public-access-modal.element.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index 715c12d8f2..327cee5abf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -97,8 +97,16 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< if (this._specific) { // Members + // user name is not part of the item model, so we need to look it up from the member detail repository + // be aware that the detail repository requires access to the member section. + const repo = new UmbMemberDetailRepository(this); + const promises = this._selection.map((memberId) => repo.requestByUnique(memberId)); + const responses = await Promise.all(promises); + const memberUserNames = responses + .filter((response) => response.data) + .map((response) => response.data?.username) as string[]; - console.log('Specific members'); + requestBody.memberUserNames = memberUserNames; } else { // Groups const repo = new UmbMemberGroupItemRepository(this); From 97755e6f94fb56abadfa0ac1e13e7299aa5a67a3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 12:44:04 +0200 Subject: [PATCH 10/16] remove debugger --- .../public-access/modal/public-access-modal.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index 327cee5abf..7b5aa2ec78 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -57,7 +57,6 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< async #getPublicAccessModel() { if (!this.#unique) return; const { data } = await this.#publicAccessRepository.read(this.#unique); - debugger; if (!data) return; this.#isNew = false; From eaf82cb122b9848a78462bc972e6e0094592dc26 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 14:16:07 +0200 Subject: [PATCH 11/16] only render the public access feature if the user has access to the member section --- .../documents/entity-actions/public-access/manifests.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts index 4a6a83eedf..d6b5d74508 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts @@ -25,6 +25,10 @@ const entityActions: Array = [ { alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, + { + alias: 'Umb.Condition.SectionUserPermission', + match: 'Umb.Section.Members', + }, ], }, ]; From b869340f0e83aad8790af50fa7d7df8268b4351f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 14:24:00 +0200 Subject: [PATCH 12/16] only look up restricted access details if the entity is protected --- .../public-access/modal/public-access-modal.element.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index 7b5aa2ec78..a3028968ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -42,7 +42,6 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< firstUpdated() { this.#unique = this.data?.unique; this.#getDocumentName(); - this.#getPublicAccessModel(); } async #getDocumentName() { @@ -50,8 +49,13 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< // Should this be done here or in the action file? const { data } = await new UmbDocumentItemRepository(this).requestItems([this.#unique]); if (!data) return; + const item = data[0]; //TODO How do we ensure we get the correct variant? - this._documentName = data[0].variants[0]?.name; + this._documentName = item.variants[0]?.name; + + if (item.isProtected) { + this.#getPublicAccessModel(); + } } async #getPublicAccessModel() { From 304630c08271baa811982b1f54e22c7149c06591 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 6 Jun 2024 15:01:12 +0200 Subject: [PATCH 13/16] render is protected icon for document tree item --- .../tree-item/document-tree-item.element.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) 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 10fd4e4427..69dc65f4b5 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 @@ -74,6 +74,7 @@ export class UmbDocumentTreeItemElement extends UmbTreeItemElementBase + ${this.item.isProtected ? this.#renderIsProtectedIcon() : nothing}