From b9a85421f56fcb37b400f5c195e5b21f0a3c3a8a Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:42:19 +0100 Subject: [PATCH 1/8] Feature: Document Action Publicc Access --- .../documents/entity-actions/index.ts | 1 + .../documents/entity-actions/manifests.ts | 2 +- .../entity-actions/public-access.action.ts | 14 ---- .../entity-actions/public-access/index.ts | 1 + .../entity-actions/public-access/manifests.ts | 0 .../public-access/modal/index.ts | 2 + .../modal/public-access-modal.element.ts | 80 +++++++++++++++++++ .../modal/public-access-modal.token.ts | 20 +++++ .../public-access/public-access.action.ts | 28 +++++++ .../public-access/repository/index.ts | 0 .../public-access/repository/manifests.ts | 0 .../repository/public-access.repository.ts | 0 .../repository/public-access.server.data.ts | 0 .../src/packages/documents/documents/index.ts | 1 + 14 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/index.ts new file mode 100644 index 0000000000..7f3a411395 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/index.ts @@ -0,0 +1 @@ +export * from './public-access/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 2e1c8be850..f6f4c05756 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -3,7 +3,7 @@ import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../enti import { UmbPublishDocumentEntityAction } from './publish.action.js'; import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action.js'; import { UmbCreateDocumentBlueprintEntityAction } from './create-blueprint.action.js'; -import { UmbDocumentPublicAccessEntityAction } from './public-access.action.js'; +import { UmbDocumentPublicAccessEntityAction } from './public-accesss/public-access.action.js'; import { UmbUnpublishDocumentEntityAction } from './unpublish.action.js'; import { UmbRollbackDocumentEntityAction } from './rollback.action.js'; import { manifests as createManifests } from './create/manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access.action.ts deleted file mode 100644 index ca4a02d65e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access.action.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { UmbDocumentRepository } from '../repository/document.repository.js'; -import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; - -export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { - super(host, repositoryAlias, unique); - } - - async execute() { - console.log(`execute for: ${this.unique}`); - await this.repository?.setPublicAccess(); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/index.ts new file mode 100644 index 0000000000..28d9f38fba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/index.ts @@ -0,0 +1 @@ +export * from './modal/index.js'; 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 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/index.ts new file mode 100644 index 0000000000..a7ac646fe2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/index.ts @@ -0,0 +1,2 @@ +export * from './public-access-modal.token.js'; +export * from './public-access-modal.element.js'; 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 new file mode 100644 index 0000000000..e60a69e835 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -0,0 +1,80 @@ +import { html, customElement, state, css, repeat, query } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { UmbLanguageRepository } from '@umbraco-cms/backoffice/language'; +import type { DomainPresentationModel, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; +/*import { + UmbDocumentPublicAccessRepository, + type UmbPublicAccessModalData, + type UmbPublicAccessModalValue, +} from '@umbraco-cms/backoffice/document';*/ +import type { UUIInputEvent, UUIPopoverContainerElement, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; + +@customElement('umb-public-access-modal') +export class UmbPublicAccessModalElement extends UmbModalBaseElement { + #publicAccessRepository?: any; //new UmbDocumentPublicAccessRepository(this); + #unique?: string; + #model?: any; + + // Init + + firstUpdated() { + this.#unique = this.data?.unique; + this.#requestPublicAccessModel(); + } + + async #requestPublicAccessModel() { + if (!this.#unique) return; + const { data } = await this.#publicAccessRepository.requestPublicAccessModel(this.#unique); + + if (!data) return; + this.#model = data; + } + + // Modal + + async #handleSave() { + //this.value = { defaultIsoCode: this._defaultIsoCode, domains: this._domains }; + //const { error } = await this.#documentRepository.updateCultureAndHostnames(this.#unique!, this.value); + //if (error) return; + this.modalContext?.submit(); + } + + #handleCancel() { + this.modalContext?.reject(); + } + + render() { + return html`Public Access`; + } + + static styles = [ + UmbTextStyles, + css` + uui-button-group { + width: 100%; + } + uui-box:first-child { + margin-bottom: var(--uui-size-layout-1); + } + #dropdown { + flex-grow: 0; + } + #domains { + margin-top: var(--uui-size-layout-1); + margin-bottom: var(--uui-size-2); + display: grid; + grid-template-columns: 1fr 1fr auto; + grid-gap: var(--uui-size-1); + } + `, + ]; +} + +export default UmbPublicAccessModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-public-access-modal': UmbPublicAccessModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts new file mode 100644 index 0000000000..91ec722b92 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts @@ -0,0 +1,20 @@ +import type { PublicAccessResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbPublicAccessModalData { + unique: string | null; +} + +export interface UmbPublicAccessModalValue { + data: PublicAccessResponseModel; +} + +export const UMB_PUBLIC_ACCESS_MODAL = new UmbModalToken( + 'Umb.Modal.PublicAccess', + { + modal: { + type: 'sidebar', + size: 'medium', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts new file mode 100644 index 0000000000..31bcdb6f52 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts @@ -0,0 +1,28 @@ +import type { UmbDocumentRepository } from '../../repository/document.repository.js'; +import { UMB_PUBLIC_ACCESS_MODAL } from './modal/public-access-modal.token.js'; +import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; + +export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase { + #modalContext?: UmbModalManagerContext; + + constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { + super(host, repositoryAlias, unique); + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { + this.#modalContext = instance as UmbModalManagerContext; + }); + } + + async execute() { + console.log(`execute for: ${this.unique}`); + await this.repository?.setPublicAccess(); + this._openModal(this.unique); + } + + private async _openModal(unique: string) { + this.#modalContext?.open(UMB_PUBLIC_ACCESS_MODAL, { + data: { unique }, + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/manifests.ts new file mode 100644 index 0000000000..e69de29bb2 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 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts index 6791477575..50f3d55158 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts @@ -7,6 +7,7 @@ export * from './recycle-bin/index.js'; export * from './user-permissions/index.js'; export * from './components/index.js'; export * from './entity.js'; +export * from './entity-actions/index.js'; export { UMB_DOCUMENT_TREE_ALIAS } from './tree/index.js'; export { UMB_CONTENT_MENU_ALIAS } from './menu.manifests.js'; From 874501f2940148e0916c2becf5439847ef7d324c Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:49:45 +0100 Subject: [PATCH 2/8] repo --- .../repository/public-access.repository.ts | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) 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 e69de29bb2..baae4f8911 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 @@ -0,0 +1,51 @@ +import { UmbDocumentPublicAccessServerDataSource } from './public-access.server.data.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; +import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbDocumentPublicAccessRepository extends UmbBaseController implements UmbApi { + #init!: Promise; + + #dataSource: UmbDocumentPublicAccessServerDataSource; + + #notificationContext?: UmbNotificationContext; + + constructor(host: UmbControllerHost) { + super(host); + + this.#dataSource = new UmbDocumentPublicAccessServerDataSource(this); + + this.#init = Promise.all([ + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { + this.#notificationContext = instance as UmbNotificationContext; + }).asPromise(), + ]); + } + + async readPublicAccess(id: string) { + if (!id) throw new Error('Id is missing'); + await this.#init; + + const { data, error } = await this.#dataSource.read(id); + if (!error) { + return { data }; + } + return { error }; + } + + async updatePublicAccess(id: string, data: PublicAccessRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!data) throw new Error('Data is missing'); + await this.#init; + + const { error } = await this.#dataSource.update(id, data); + if (!error) { + const notification = { data: { message: `Public acccess saved` } }; + this.#notificationContext?.peek('positive', notification); + } + return { error }; + } +} From 145db86d25362db4e26a2d7170927989d91aedd3 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:58:15 +0100 Subject: [PATCH 3/8] public access repos --- .../repository/public-access.repository.ts | 27 +++++++- .../repository/public-access.server.data.ts | 65 +++++++++++++++++++ 2 files changed, 91 insertions(+), 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 baae4f8911..cc3b9761a6 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,6 +25,19 @@ export class UmbDocumentPublicAccessRepository extends UmbBaseController impleme ]); } + async create(id: string, data: PublicAccessRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!data) throw new Error('Data is missing'); + await this.#init; + + const { error } = await this.#dataSource.update(id, data); + if (!error) { + const notification = { data: { message: `Public acccess setting created` } }; + this.#notificationContext?.peek('positive', notification); + } + return { error }; + } + async readPublicAccess(id: string) { if (!id) throw new Error('Id is missing'); await this.#init; @@ -43,7 +56,19 @@ export class UmbDocumentPublicAccessRepository extends UmbBaseController impleme const { error } = await this.#dataSource.update(id, data); if (!error) { - const notification = { data: { message: `Public acccess saved` } }; + const notification = { data: { message: `Public acccess setting updated` } }; + this.#notificationContext?.peek('positive', notification); + } + return { error }; + } + + async deletePublicAccess(id: string) { + if (!id) throw new Error('Id is missing'); + await this.#init; + + const { error } = await this.#dataSource.delete(id); + if (!error) { + const notification = { data: { message: `Public acccess setting deleted` } }; this.#notificationContext?.peek('positive', notification); } return { error }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts index e69de29bb2..dce9a4815c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts @@ -0,0 +1,65 @@ +import { DocumentResource } from '@umbraco-cms/backoffice/backend-api'; +import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the Document Public Access that fetches data from the server + * @export + * @class UmbDocumentPublicAccessServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentPublicAccessServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbDocumentPublicAccessServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentPublicAccessServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Creates the Public Access for the given Document id + * @param {string} id + * @param {PublicAccessRequestModel} data + * @memberof UmbDocumentPublicAccessServerDataSource + */ + async create(id: string, data: PublicAccessRequestModel) { + if (!id) throw new Error('Id is missing'); + return tryExecuteAndNotify(this.#host, DocumentResource.postDocumentByIdPublicAccess({ id, requestBody: data })); + } + + /** + * Fetches the Public Access for the given Document id + * @param {string} id + * @memberof UmbDocumentPublicAccessServerDataSource + */ + async read(id: string) { + if (!id) throw new Error('Id is missing'); + return tryExecuteAndNotify(this.#host, DocumentResource.getDocumentByIdPublicAccess({ id })); + } + + /** + * Updates Public Access for the given Document id + * @param {string} id + * @param {PublicAccessRequestModel} data + * @memberof UmbDocumentPublicAccessServerDataSource + */ + async update(id: string, requestBody: PublicAccessRequestModel) { + if (!id) throw new Error('Id is missing'); + return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdPublicAccess({ id, requestBody })); + } + + /** + * Deletes Public Access for the given Document id + * @param {string} id + * @memberof UmbDocumentPublicAccessServerDataSource + */ + async delete(id: string) { + if (!id) throw new Error('Id is missing'); + return tryExecuteAndNotify(this.#host, DocumentResource.deleteDocumentByIdPublicAccess({ id })); + } +} From f6e561e7088d5e3308ddd9f2e005cb8e39b35cba Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:55:36 +0100 Subject: [PATCH 4/8] modal --- .../documents/entity-actions/manifests.ts | 15 +---- .../entity-actions/public-access/manifests.ts | 31 ++++++++++ .../modal/public-access-modal.element.ts | 61 +++++++++++++------ .../modal/public-access-modal.token.ts | 5 +- .../public-access/public-access.action.ts | 26 +++++--- .../public-access/repository/index.ts | 2 + .../public-access/repository/manifests.ts | 13 ++++ .../repository/document.repository.ts | 14 +---- 8 files changed, 115 insertions(+), 52 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index f6f4c05756..e6046687b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -3,11 +3,11 @@ import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../enti import { UmbPublishDocumentEntityAction } from './publish.action.js'; import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action.js'; import { UmbCreateDocumentBlueprintEntityAction } from './create-blueprint.action.js'; -import { UmbDocumentPublicAccessEntityAction } from './public-accesss/public-access.action.js'; import { UmbUnpublishDocumentEntityAction } from './unpublish.action.js'; import { UmbRollbackDocumentEntityAction } from './rollback.action.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as permissionManifests } from './permissions/manifests.js'; +import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { UmbCopyEntityAction, UmbMoveEntityAction, @@ -18,6 +18,7 @@ import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ ...createManifests, ...permissionManifests, + ...publicAccessManifests, { type: 'entityAction', alias: 'Umb.EntityAction.Document.CreateBlueprint', @@ -83,18 +84,6 @@ const entityActions: Array = [ entityTypes: [UMB_DOCUMENT_ENTITY_TYPE], }, }, - { - type: 'entityAction', - alias: 'Umb.EntityAction.Document.PublicAccess', - name: 'Document Permissions Entity Action', - api: UmbDocumentPublicAccessEntityAction, - meta: { - icon: 'icon-lock', - label: 'Public Access (TBD)', - repositoryAlias: UMB_DOCUMENT_REPOSITORY_ALIAS, - entityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - }, - }, { type: 'entityAction', alias: 'Umb.EntityAction.Document.Publish', 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 e69de29bb2..bb94e23f2d 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 @@ -0,0 +1,31 @@ +//import { UMB_DOCUMENT_REPOSITORY_ALIAS } from '../../repository/manifests.js'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS } from './repository/manifests.js'; +import { UmbDocumentPublicAccessEntityAction } from './public-access.action.js'; +import type { ManifestEntityAction, ManifestModal } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + alias: 'Umb.EntityAction.Document.PublicAccess', + name: 'Document Permissions Entity Action', + api: UmbDocumentPublicAccessEntityAction, + meta: { + icon: 'icon-lock', + label: 'Restrict Public Access', + repositoryAlias: UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS, + entityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + }, + }, +]; + +const manifestModals: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.PublicAccess', + name: 'Public Access Modal', + js: () => import('./modal/public-access-modal.element.js'), + }, +]; + +export const manifests = [...entityActions, ...manifestModals]; 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 e60a69e835..4c3d296f85 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,34 +1,38 @@ +import { UmbDocumentPublicAccessRepository } from '../repository/public-access.repository.js'; import { html, customElement, state, css, repeat, query } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbLanguageRepository } from '@umbraco-cms/backoffice/language'; -import type { DomainPresentationModel, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { + DomainPresentationModel, + LanguageResponseModel, + PublicAccessResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; /*import { UmbDocumentPublicAccessRepository, type UmbPublicAccessModalData, type UmbPublicAccessModalValue, } from '@umbraco-cms/backoffice/document';*/ -import type { UUIInputEvent, UUIPopoverContainerElement, UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { UmbPublicAccessModalData, UmbPublicAccessModalValue } from '@umbraco-cms/backoffice/document'; @customElement('umb-public-access-modal') -export class UmbPublicAccessModalElement extends UmbModalBaseElement { - #publicAccessRepository?: any; //new UmbDocumentPublicAccessRepository(this); - #unique?: string; - #model?: any; +export class UmbPublicAccessModalElement extends UmbModalBaseElement< + UmbPublicAccessModalData, + UmbPublicAccessModalValue +> { + @state() + private _userMember?: any; + + @state() + private _page?: string; + + @state() + private _responseModel?: PublicAccessResponseModel; // Init firstUpdated() { - this.#unique = this.data?.unique; - this.#requestPublicAccessModel(); - } - - async #requestPublicAccessModel() { - if (!this.#unique) return; - const { data } = await this.#publicAccessRepository.requestPublicAccessModel(this.#unique); - - if (!data) return; - this.#model = data; + this._responseModel = this.data?.data; } // Modal @@ -44,8 +48,31 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement { this.modalContext?.reject(); } + // Renders + render() { - return html`Public Access`; + return html` + + Public Access + + + + `; + } + + // First page when no Public Access Restricting is set. + renderSelectGroup() { + return html``; } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts index 91ec722b92..7014d37282 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts @@ -2,11 +2,12 @@ import type { PublicAccessResponseModel } from '@umbraco-cms/backoffice/backend- import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbPublicAccessModalData { - unique: string | null; + requestBody: PublicAccessResponseModel; } export interface UmbPublicAccessModalValue { - data: PublicAccessResponseModel; + action: 'create' | 'update' | 'delete'; + requestBody: PublicAccessResponseModel; } export const UMB_PUBLIC_ACCESS_MODAL = new UmbModalToken( diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts index 31bcdb6f52..f2105936ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts @@ -1,28 +1,36 @@ -import type { UmbDocumentRepository } from '../../repository/document.repository.js'; +import { UmbDocumentPublicAccessRepository } from './repository/public-access.repository.js'; import { UMB_PUBLIC_ACCESS_MODAL } from './modal/public-access-modal.token.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import type { PublicAccessResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase { +export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase { #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); + + this.repository = new UmbDocumentPublicAccessRepository(this); + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalContext = instance as UmbModalManagerContext; }); } async execute() { - console.log(`execute for: ${this.unique}`); - await this.repository?.setPublicAccess(); - this._openModal(this.unique); + // TODO: API ERROR - SET IT UP WITH REPOSITORY + // await this.repository?.readPublicAccess(this.unique); + const mock: PublicAccessResponseModel = { + loginPageId: '1234567890', + errorPageId: '0987654321', + members: [], + groups: [], + }; + this._openModal(mock); } - private async _openModal(unique: string) { - this.#modalContext?.open(UMB_PUBLIC_ACCESS_MODAL, { - data: { unique }, - }); + private async _openModal(data: PublicAccessResponseModel) { + this.#modalContext?.open(UMB_PUBLIC_ACCESS_MODAL, { data: { data } }); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/index.ts index e69de29bb2..fbf2223dfe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbDocumentPublicAccessRepository } from './public-access.repository.js'; +export { UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/manifests.ts index e69de29bb2..7f4bdcf839 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/manifests.ts @@ -0,0 +1,13 @@ +import { UmbDocumentPublicAccessRepository } from '../repository/index.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS = 'Umb.Repository.Document.PublicAccess'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS, + name: 'Document Public Access Repository', + api: UmbDocumentPublicAccessRepository, +}; + +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts index a2f643c6a1..3446f90fc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/document.repository.ts @@ -1,14 +1,14 @@ -import type { UmbDocumentTreeStore} from '../tree/document-tree.store.js'; +import type { UmbDocumentTreeStore } from '../tree/document-tree.store.js'; import { UMB_DOCUMENT_TREE_STORE_CONTEXT } from '../tree/document-tree.store.js'; import { UmbDocumentServerDataSource } from './sources/document.server.data.js'; -import type { UmbDocumentStore} from './document.store.js'; +import type { UmbDocumentStore } from './document.store.js'; import { UMB_DOCUMENT_STORE_CONTEXT } from './document.store.js'; import { UMB_DOCUMENT_ITEM_STORE_CONTEXT, type UmbDocumentItemStore } from './document-item.store.js'; import { UmbDocumentItemServerDataSource } from './sources/document-item.server.data.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import type { CreateDocumentRequestModel, UpdateDocumentRequestModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbNotificationContext} from '@umbraco-cms/backoffice/notification'; +import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -270,18 +270,10 @@ export class UmbDocumentRepository extends UmbBaseController implements UmbApi { alert('sort'); } - async setCultureAndHostnames() { - alert('set culture and hostnames'); - } - async setPermissions() { alert('set permissions'); } - async setPublicAccess() { - alert('set public access'); - } - async rollback() { alert('rollback'); } From 4d237fe9231c17d802b42c5797632109e9876553 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:40:56 +0100 Subject: [PATCH 5/8] setting up ui --- .../modal/public-access-modal.element.ts | 176 +++++++++++++----- .../modal/public-access-modal.token.ts | 4 +- .../public-access/public-access.action.ts | 7 +- 3 files changed, 133 insertions(+), 54 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 4c3d296f85..53ce37b7a9 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,19 +1,8 @@ -import { UmbDocumentPublicAccessRepository } from '../repository/public-access.repository.js'; -import { html, customElement, state, css, repeat, query } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, css, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import { UmbLanguageRepository } from '@umbraco-cms/backoffice/language'; -import type { - DomainPresentationModel, - LanguageResponseModel, - PublicAccessResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; -/*import { - UmbDocumentPublicAccessRepository, - type UmbPublicAccessModalData, - type UmbPublicAccessModalValue, -} from '@umbraco-cms/backoffice/document';*/ import type { UmbPublicAccessModalData, UmbPublicAccessModalValue } from '@umbraco-cms/backoffice/document'; +import type { UUIRadioEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-public-access-modal') export class UmbPublicAccessModalElement extends UmbModalBaseElement< @@ -21,27 +10,48 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< UmbPublicAccessModalValue > { @state() - private _userMember?: any; + private _specific?: boolean; @state() - private _page?: string; + private _startPage = true; @state() - private _responseModel?: PublicAccessResponseModel; + private _selectedIds: Array = []; // Init firstUpdated() { - this._responseModel = this.data?.data; + const data = this.data?.publicAccessModel; + if (!data) return; + this._startPage = false; + + // Specific or Group + this._specific = data.members.length > 0 ? true : false; + + //SelectedIds members + if (data.members.length > 0) { + this._selectedIds = data.members.map((m) => m.id); + } else if (data.groups.length > 0) { + this._selectedIds = data.groups.map((g) => g.id); + } } // Modal + #handleNext() { + this._startPage = false; + } + async #handleSave() { - //this.value = { defaultIsoCode: this._defaultIsoCode, domains: this._domains }; - //const { error } = await this.#documentRepository.updateCultureAndHostnames(this.#unique!, this.value); - //if (error) return; - this.modalContext?.submit(); + if (this.data?.publicAccessModel) { + this.modalContext?.submit({ action: 'update', publicAccessModel: this.value }); + } else { + this.modalContext?.submit({ action: 'save', publicAccessModel: this.value }); + } + } + + #handleDelete() { + this.modalContext?.submit({ action: 'delete', publicAccessModel: this.value }); } #handleCancel() { @@ -53,46 +63,114 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< render() { return html` - Public Access - - ${this._startPage ? this.renderSelectGroup() : this.renderEditPage()} ${this.renderActions()} + + `; + } + + // First page when no Restricting Public Access is set. + renderSelectGroup() { + return html` + Choose how you want to restrict public access to the page 'NameOfDocument'. + + + e.target.value === 'members' ? (this._specific = true) : (this._specific = false)}> + Test + + `; + } + + // Second page when editing Restricting Public Access + renderEditPage() { + return html`${this.renderMemberType()} +

+ + Select the pages that contain login form and error messages + +

+
+ Login Page + + Choose the page that contains the login form + + +
+
+
+ Error Page + + + Used when people are logged on, but do not have access + + + +
`; + } + + renderMemberType() { + return this._specific + ? html` + Select the members who have access to the page %0% + + ` + : html` + Select the groups who have access to the page %0% + + `; + } + + // Action buttons + renderActions() { + // Check for Save or Next button + const confirm = this.data?.publicAccessModel + ? html` - - `; - } - - // First page when no Public Access Restricting is set. - renderSelectGroup() { - return html``; + @click="${this.#handleSave}">` + : html``; + // Check for Remove button + const remove = this.data?.publicAccessModel + ? html`` + : nothing; + //Render buttons + return html` ${remove}${confirm}`; } static styles = [ UmbTextStyles, css` - uui-button-group { - width: 100%; + uui-radio-group { + display: block; } - uui-box:first-child { - margin-bottom: var(--uui-size-layout-1); + + .select-item { + display: flex; + flex-direction: column; } - #dropdown { - flex-grow: 0; - } - #domains { - margin-top: var(--uui-size-layout-1); - margin-bottom: var(--uui-size-2); - display: grid; - grid-template-columns: 1fr 1fr auto; - grid-gap: var(--uui-size-1); + + p { + margin: var(--uui-size-6) 0 var(--uui-size-2); } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts index 7014d37282..3b72528361 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.token.ts @@ -2,12 +2,12 @@ import type { PublicAccessResponseModel } from '@umbraco-cms/backoffice/backend- import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbPublicAccessModalData { - requestBody: PublicAccessResponseModel; + publicAccessModel: PublicAccessResponseModel; } export interface UmbPublicAccessModalValue { action: 'create' | 'update' | 'delete'; - requestBody: PublicAccessResponseModel; + publicAccessModel: PublicAccessResponseModel; } export const UMB_PUBLIC_ACCESS_MODAL = new UmbModalToken( diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts index f2105936ee..eb1afee083 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts @@ -24,13 +24,14 @@ export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase Date: Mon, 29 Jan 2024 15:38:27 +0100 Subject: [PATCH 6/8] events --- .../modal/public-access-modal.element.ts | 38 +++++++++++++++---- .../public-access/public-access.action.ts | 20 +++++++++- 2 files changed, 50 insertions(+), 8 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 53ce37b7a9..114059b878 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 @@ -58,6 +58,28 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< this.modalContext?.reject(); } + // Events + + #onChangeLoginPage(e: CustomEvent) { + console.log('e', e); + this.value = { ...this.value, loginPageId: e.detail.value[0] }; + } + + #onChangeErrorPage(e: CustomEvent) { + console.log('e', e); + this.value = { ...this.value, errorPageId: e.detail.value[0] }; + } + + #onChangeGroup() { + // TODO: Finish when umb-input-member-type is done + console.log('onChangeGroup'); + } + + #onChangeMember() { + // TODO: Finish when umb-input-member is done + console.log('onChangeMember'); + } + // Renders render() { @@ -94,7 +116,7 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< Choose the page that contains the login form - +
@@ -104,26 +126,28 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< Used when people are logged on, but do not have access - +
`; } renderMemberType() { return this._specific ? html` - Select the members who have access to the page %0% + Select the members who have access to the page NameOfDocument - ` + ` : html` - Select the groups who have access to the page %0% + Select the groups who have access to the page NameOfDocument - `; + `; } // Action buttons renderActions() { // Check for Save or Next button - const confirm = this.data?.publicAccessModel + const confirm = !this._startPage ? html` Date: Tue, 30 Jan 2024 11:15:08 +0100 Subject: [PATCH 7/8] setup --- .../modal/public-access-modal.element.ts | 164 +++++++++++++----- .../modal/public-access-modal.token.ts | 8 +- .../public-access/public-access.action.ts | 43 +---- .../repository/public-access.repository.ts | 11 +- 4 files changed, 129 insertions(+), 97 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 114059b878..3386afdfb7 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,14 +1,30 @@ -import { html, customElement, state, css, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { UmbDocumentPublicAccessRepository } from '../repository/public-access.repository.js'; +import { html, customElement, state, css, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import type { UmbPublicAccessModalData, UmbPublicAccessModalValue } from '@umbraco-cms/backoffice/document'; +import { + UmbDocumentRepository, + type UmbInputDocumentElement, + type UmbPublicAccessModalData, + type UmbPublicAccessModalValue, +} from '@umbraco-cms/backoffice/document'; import type { UUIRadioEvent } from '@umbraco-cms/backoffice/external/uui'; +import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbInputMemberTypeElement } from '@umbraco-cms/backoffice/member-type'; +import type { UmbInputMemberElement } from '@umbraco-cms/backoffice/member'; @customElement('umb-public-access-modal') export class UmbPublicAccessModalElement extends UmbModalBaseElement< UmbPublicAccessModalData, UmbPublicAccessModalValue > { + #publicAccessRepository = new UmbDocumentPublicAccessRepository(this); + #unique?: string; + #isNew: boolean = true; + + @state() + private _documentName = ''; + @state() private _specific?: boolean; @@ -18,66 +34,113 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< @state() private _selectedIds: Array = []; + @state() + private _loginPageId?: string; + + @state() + private _errorPageId?: string; + // Init firstUpdated() { - const data = this.data?.publicAccessModel; - if (!data) return; - this._startPage = false; - - // Specific or Group - this._specific = data.members.length > 0 ? true : false; - - //SelectedIds members - if (data.members.length > 0) { - this._selectedIds = data.members.map((m) => m.id); - } else if (data.groups.length > 0) { - this._selectedIds = data.groups.map((g) => g.id); - } + this.#unique = this.data?.unique; + this.#getDocumentName(); + this.#getPublicAccessModel(); } - // Modal + async #getDocumentName() { + if (!this.#unique) return; + // Should this be done here or in the action file? + const { data } = await new UmbDocumentRepository(this).requestById(this.#unique); + if (!data) return; + //TODO How do we ensure we get the correct variant? + this._documentName = data.variants[0]?.name; + } + + 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', + };*/ + + if (!data) return; + this.#isNew = false; + this._startPage = false; + + // Specific or Groups + this._specific = data.members.length > 0 ? true : false; + + //SelectedIds + if (data.members.length > 0) { + this._selectedIds = data.members.map((m: any) => m.id); + } else if (data.groups.length > 0) { + this._selectedIds = data.groups.map((g: any) => g.id); + } + + this._loginPageId = data.loginPageId; + this._errorPageId = data.errorPageId; + } + + // Modal events #handleNext() { this._startPage = false; } async #handleSave() { - if (this.data?.publicAccessModel) { - this.modalContext?.submit({ action: 'update', publicAccessModel: this.value }); + if (!this._loginPageId || !this._errorPageId || !this.#unique) return; + + const groups = this._specific ? [] : this._selectedIds; + const members = this._specific ? this._selectedIds : []; + + const requestBody: PublicAccessRequestModel = { + memberGroupNames: groups, + memberUserNames: members, + loginPageId: this._loginPageId, + errorPageId: this._errorPageId, + }; + + if (this.#isNew) { + this.#publicAccessRepository.create(this.#unique, requestBody); } else { - this.modalContext?.submit({ action: 'save', publicAccessModel: this.value }); + this.#publicAccessRepository.update(this.#unique, requestBody); } + + this.modalContext?.submit(); } #handleDelete() { - this.modalContext?.submit({ action: 'delete', publicAccessModel: this.value }); + if (!this.#unique) return; + this.#publicAccessRepository.delete(this.#unique); + this.modalContext?.submit(); } #handleCancel() { this.modalContext?.reject(); } - // Events + // Change Events #onChangeLoginPage(e: CustomEvent) { - console.log('e', e); - this.value = { ...this.value, loginPageId: e.detail.value[0] }; + this._loginPageId = (e.target as UmbInputDocumentElement).selectedIds[0]; } #onChangeErrorPage(e: CustomEvent) { - console.log('e', e); - this.value = { ...this.value, errorPageId: e.detail.value[0] }; + this._errorPageId = (e.target as UmbInputDocumentElement).selectedIds[0]; } - #onChangeGroup() { - // TODO: Finish when umb-input-member-type is done - console.log('onChangeGroup'); + #onChangeGroup(e: CustomEvent) { + this._selectedIds = (e.target as UmbInputMemberTypeElement).selectedIds; } - #onChangeMember() { - // TODO: Finish when umb-input-member is done - console.log('onChangeMember'); + #onChangeMember(e: CustomEvent) { + this._selectedIds = (e.target as UmbInputMemberElement).selectedIds; } // Renders @@ -92,14 +155,20 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< // First page when no Restricting Public Access is set. renderSelectGroup() { - return html` - Choose how you want to restrict public access to the page 'NameOfDocument'. + return html` + Choose how you want to restrict public access to the page '${this._documentName}'. e.target.value === 'members' ? (this._specific = true) : (this._specific = false)}> - Test - + + ${this.localize.term('publicAccess_paMembers')}
+ ${this.localize.term('publicAccess_paMembersHelp')} +
+ + ${this.localize.term('publicAccess_paGroups')}
+ ${this.localize.term('publicAccess_paGroupsHelp')} +
`; } @@ -132,12 +201,12 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< renderMemberType() { return this._specific - ? html` - Select the members who have access to the page NameOfDocument + ? html` + Select the members who have access to the page ${this._documentName} ` - : html` - Select the groups who have access to the page NameOfDocument + : html` + Select the groups who have access to the page ${this._documentName}
` : html``; // Check for Remove button - const remove = this.data?.publicAccessModel + const remove = !this.#isNew ? html`` : nothing; - //Render buttons + //Render the buttons return html` ( 'Umb.Modal.PublicAccess', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts index 3431fa15d6..1cec276453 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/public-access.action.ts @@ -1,55 +1,20 @@ -import { UmbDocumentPublicAccessRepository } from './repository/public-access.repository.js'; import { UMB_PUBLIC_ACCESS_MODAL } from './modal/public-access-modal.token.js'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import type { PublicAccessResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbDocumentRepository } from '@umbraco-cms/backoffice/document'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase { +export class UmbDocumentPublicAccessEntityAction extends UmbEntityActionBase { #modalContext?: UmbModalManagerContext; constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string) { super(host, repositoryAlias, unique); - - this.repository = new UmbDocumentPublicAccessRepository(this); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { this.#modalContext = instance as UmbModalManagerContext; }); } async execute() { - // TODO: API ERROR - SET IT UP WITH REPOSITORY - // await this.repository?.readPublicAccess(this.unique); - const mock: PublicAccessResponseModel = { - loginPageId: '1234567890', - errorPageId: '0987654321', - members: [{ id: '123', name: 'test' }], - groups: [], - }; - this._openModal(mock); - } - - private async _openModal(publicAccessModel: PublicAccessResponseModel) { - //this.#modalContext?.open(UMB_PUBLIC_ACCESS_MODAL, { data: { publicAccessModel } }); - const modalContext = this.#modalContext?.open(UMB_PUBLIC_ACCESS_MODAL); - - const result = await modalContext.onSubmit(); - console.log('result', result); - - switch (result.action) { - case 'save': - console.log('save', result.publicAccessModel); - break; - case 'update': - console.log('update', result.publicAccessModel); - break; - case 'delete': - console.log('delete', result.publicAccessModel); - break; - default: - console.log('cancel'); - break; - } + this.#modalContext?.open(UMB_PUBLIC_ACCESS_MODAL, { data: { unique: this.unique } }); } } 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 cc3b9761a6..cbd4355e99 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 @@ -38,18 +38,15 @@ export class UmbDocumentPublicAccessRepository extends UmbBaseController impleme return { error }; } - async readPublicAccess(id: string) { + async read(id: string) { if (!id) throw new Error('Id is missing'); await this.#init; const { data, error } = await this.#dataSource.read(id); - if (!error) { - return { data }; - } - return { error }; + return { data, error }; } - async updatePublicAccess(id: string, data: PublicAccessRequestModel) { + async update(id: string, data: PublicAccessRequestModel) { if (!id) throw new Error('Id is missing'); if (!data) throw new Error('Data is missing'); await this.#init; @@ -62,7 +59,7 @@ export class UmbDocumentPublicAccessRepository extends UmbBaseController impleme return { error }; } - async deletePublicAccess(id: string) { + async delete(id: string) { if (!id) throw new Error('Id is missing'); await this.#init; From 3277b24b0da7946bb41389c88ec224b050896d1e Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:11:56 +0100 Subject: [PATCH 8/8] rename uniques --- .../repository/public-access.repository.ts | 38 +++++++--------- .../repository/public-access.server.data.ts | 43 ++++++++++--------- 2 files changed, 38 insertions(+), 43 deletions(-) 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 cbd4355e99..7f19626210 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 @@ -7,8 +7,6 @@ import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbDocumentPublicAccessRepository extends UmbBaseController implements UmbApi { - #init!: Promise; - #dataSource: UmbDocumentPublicAccessServerDataSource; #notificationContext?: UmbNotificationContext; @@ -18,19 +16,16 @@ export class UmbDocumentPublicAccessRepository extends UmbBaseController impleme this.#dataSource = new UmbDocumentPublicAccessServerDataSource(this); - this.#init = Promise.all([ - this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { - this.#notificationContext = instance as UmbNotificationContext; - }).asPromise(), - ]); + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { + this.#notificationContext = instance as UmbNotificationContext; + }); } - async create(id: string, data: PublicAccessRequestModel) { - if (!id) throw new Error('Id is missing'); + async create(unique: string, data: PublicAccessRequestModel) { + if (!unique) throw new Error('unique is missing'); if (!data) throw new Error('Data is missing'); - await this.#init; - const { error } = await this.#dataSource.update(id, data); + const { error } = await this.#dataSource.update(unique, data); if (!error) { const notification = { data: { message: `Public acccess setting created` } }; this.#notificationContext?.peek('positive', notification); @@ -38,20 +33,18 @@ export class UmbDocumentPublicAccessRepository extends UmbBaseController impleme return { error }; } - async read(id: string) { - if (!id) throw new Error('Id is missing'); - await this.#init; + async read(unique: string) { + if (!unique) throw new Error('unique is missing'); - const { data, error } = await this.#dataSource.read(id); + const { data, error } = await this.#dataSource.read(unique); return { data, error }; } - async update(id: string, data: PublicAccessRequestModel) { - if (!id) throw new Error('Id is missing'); + async update(unique: string, data: PublicAccessRequestModel) { + if (!unique) throw new Error('unique is missing'); if (!data) throw new Error('Data is missing'); - await this.#init; - const { error } = await this.#dataSource.update(id, data); + const { error } = await this.#dataSource.update(unique, data); if (!error) { const notification = { data: { message: `Public acccess setting updated` } }; this.#notificationContext?.peek('positive', notification); @@ -59,11 +52,10 @@ export class UmbDocumentPublicAccessRepository extends UmbBaseController impleme return { error }; } - async delete(id: string) { - if (!id) throw new Error('Id is missing'); - await this.#init; + async delete(unique: string) { + if (!unique) throw new Error('unique is missing'); - const { error } = await this.#dataSource.delete(id); + const { error } = await this.#dataSource.delete(unique); if (!error) { const notification = { data: { message: `Public acccess setting deleted` } }; this.#notificationContext?.peek('positive', notification); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts index dce9a4815c..c139e7cbd8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts @@ -22,44 +22,47 @@ export class UmbDocumentPublicAccessServerDataSource { } /** - * Creates the Public Access for the given Document id - * @param {string} id + * Creates the Public Access for the given Document unique + * @param {string} unique * @param {PublicAccessRequestModel} data * @memberof UmbDocumentPublicAccessServerDataSource */ - async create(id: string, data: PublicAccessRequestModel) { - if (!id) throw new Error('Id is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.postDocumentByIdPublicAccess({ id, requestBody: data })); + async create(unique: string, data: PublicAccessRequestModel) { + if (!unique) throw new Error('unique is missing'); + return tryExecuteAndNotify( + this.#host, + DocumentResource.postDocumentByIdPublicAccess({ id: unique, requestBody: data }), + ); } /** - * Fetches the Public Access for the given Document id - * @param {string} id + * Fetches the Public Access for the given Document unique + * @param {string} unique * @memberof UmbDocumentPublicAccessServerDataSource */ - async read(id: string) { - if (!id) throw new Error('Id is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.getDocumentByIdPublicAccess({ id })); + async read(unique: string) { + if (!unique) throw new Error('unique is missing'); + return tryExecuteAndNotify(this.#host, DocumentResource.getDocumentByIdPublicAccess({ id: unique })); } /** - * Updates Public Access for the given Document id - * @param {string} id + * Updates Public Access for the given Document unique + * @param {string} unique * @param {PublicAccessRequestModel} data * @memberof UmbDocumentPublicAccessServerDataSource */ - async update(id: string, requestBody: PublicAccessRequestModel) { - if (!id) throw new Error('Id is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdPublicAccess({ id, requestBody })); + async update(unique: string, requestBody: PublicAccessRequestModel) { + if (!unique) throw new Error('unique is missing'); + return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdPublicAccess({ id: unique, requestBody })); } /** - * Deletes Public Access for the given Document id - * @param {string} id + * Deletes Public Access for the given Document unique + * @param {string} unique * @memberof UmbDocumentPublicAccessServerDataSource */ - async delete(id: string) { - if (!id) throw new Error('Id is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.deleteDocumentByIdPublicAccess({ id })); + async delete(unique: string) { + if (!unique) throw new Error('unique is missing'); + return tryExecuteAndNotify(this.#host, DocumentResource.deleteDocumentByIdPublicAccess({ id: unique })); } }