diff --git a/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/confirm/modal-layout-confirm.element.ts b/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/confirm/modal-layout-confirm.element.ts index b7bb8cd29a..6658fe66eb 100644 --- a/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/confirm/modal-layout-confirm.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/confirm/modal-layout-confirm.element.ts @@ -11,21 +11,21 @@ export interface UmbModalConfirmData { } @customElement('umb-modal-layout-confirm') -export class UmbModelLayoutConfirmElement extends LitElement { +export class UmbModalLayoutConfirmElement extends LitElement { static styles = [UUITextStyles]; @property({ attribute: false }) - modalHandler!: UmbModalHandler; + modalHandler?: UmbModalHandler; @property({ type: Object }) - data!: UmbModalConfirmData; + data?: UmbModalConfirmData; private _handleConfirm() { - this.modalHandler.close({ confirmed: true }); + this.modalHandler?.close({ confirmed: true }); } private _handleCancel() { - this.modalHandler.close({ confirmed: false }); + this.modalHandler?.close({ confirmed: false }); } render() { @@ -48,6 +48,6 @@ export class UmbModelLayoutConfirmElement extends LitElement { declare global { interface HTMLElementTagNameMap { - 'umb-modal-layout-confirm': UmbModelLayoutConfirmElement; + 'umb-modal-layout-confirm': UmbModalLayoutConfirmElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/confirm/modal-layout-confirm.stories.ts b/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/confirm/modal-layout-confirm.stories.ts new file mode 100644 index 0000000000..b77d621c6c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/confirm/modal-layout-confirm.stories.ts @@ -0,0 +1,32 @@ +import { Meta, Story } from '@storybook/web-components'; +import { html } from 'lit'; +import { UmbModalLayoutConfirmElement, UmbModalConfirmData } from './modal-layout-confirm.element'; +import './modal-layout-confirm.element'; + +export default { + title: 'API/Modals/Layouts/Confirm', + component: 'umb-modal-layout-confirm', + id: 'modal-layout-confirm', +} as Meta; + +const positiveData: UmbModalConfirmData = { + headline: 'Publish with descendants', + content: html`Publish This example and all content items underneath and thereby making their content publicly + available.`, + confirmLabel: 'Publish', +}; + +export const Positive: Story = () => html` + +`; + +const dangerData: UmbModalConfirmData = { + color: 'danger', + headline: 'Delete', + content: html`Delete This example and all items underneath.`, + confirmLabel: 'Delete', +}; + +export const Danger: Story = () => html` + +`; diff --git a/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/content-picker/modal-layout-content-picker.element.ts b/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/content-picker/modal-layout-content-picker.element.ts index 0a767b34f1..3f22eb5d8d 100644 --- a/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/content-picker/modal-layout-content-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/services/modal/layouts/content-picker/modal-layout-content-picker.element.ts @@ -8,7 +8,7 @@ export interface UmbModalContentPickerData { } @customElement('umb-modal-layout-content-picker') -export class UmbModalContentPickerElement extends LitElement { +export class UmbModalLayoutContentPickerElement extends LitElement { static styles = [ UUITextStyles, css` @@ -47,6 +47,9 @@ export class UmbModalContentPickerElement extends LitElement { @property({ attribute: false }) modalHandler?: UmbModalHandler; + @property({ type: Object }) + data?: UmbModalContentPickerData; + private _tempContent = [ { id: 1, @@ -119,6 +122,6 @@ export class UmbModalContentPickerElement extends LitElement { declare global { interface HTMLElementTagNameMap { - 'umb-modal-layout-content-picker': UmbModalContentPickerElement; + 'umb-modal-layout-content-picker': UmbModalLayoutContentPickerElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/core/services/modal/modal-handler.ts b/src/Umbraco.Web.UI.Client/src/core/services/modal/modal-handler.ts index 7f5877a41d..d9a65c0b63 100644 --- a/src/Umbraco.Web.UI.Client/src/core/services/modal/modal-handler.ts +++ b/src/Umbraco.Web.UI.Client/src/core/services/modal/modal-handler.ts @@ -14,11 +14,11 @@ export class UmbModalHandler { public type: string; public size: UUIModalSidebarSize; - constructor(elementName: string, options: UmbModalOptions) { + constructor(elementName: string, options?: UmbModalOptions) { this.key = uuidv4(); - this.type = options.type || 'dialog'; - this.size = options.size || 'small'; + this.type = options?.type || 'dialog'; + this.size = options?.size || 'small'; this.element = this._createElement(elementName, options); this._closePromise = new Promise((resolve) => { @@ -26,9 +26,9 @@ export class UmbModalHandler { }); } - private _createElement(elementName: string, options: UmbModalOptions) { - const layoutElement = this._createLayoutElement(elementName, options); - return options.type === 'sidebar' + private _createElement(elementName: string, options?: UmbModalOptions) { + const layoutElement = this._createLayoutElement(elementName, options?.data); + return this.type === 'sidebar' ? this._createSidebarElement(layoutElement) : this._createDialogElement(layoutElement); } @@ -48,9 +48,9 @@ export class UmbModalHandler { return modalDialogElement; } - private _createLayoutElement(elementName: string, options: UmbModalOptions) { + private _createLayoutElement(elementName: string, data: unknown) { const layoutElement: any = document.createElement(elementName); - layoutElement.data = options.data; + layoutElement.data = data; layoutElement.modalHandler = this; return layoutElement; } diff --git a/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.service.ts b/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.service.ts index edc56327fa..d2495263a0 100644 --- a/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.service.ts +++ b/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.service.ts @@ -13,7 +13,7 @@ export type UmbModelType = 'dialog' | 'sidebar'; export interface UmbModalOptions { type?: UmbModelType; size?: UUIModalSidebarSize; - data: UmbModalData; + data?: UmbModalData; } export class UmbModalService { @@ -28,7 +28,7 @@ export class UmbModalService { return this.open('umb-modal-layout-content-picker', { data, type: 'sidebar', size: 'small' }); } - public open(elementName: string, options: UmbModalOptions): UmbModalHandler { + public open(elementName: string, options?: UmbModalOptions): UmbModalHandler { const modalHandler = new UmbModalHandler(elementName, options); modalHandler.element.addEventListener('close-end', () => this._handleCloseEnd(modalHandler)); diff --git a/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.stories.ts b/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.stories.ts index dfaa5eaac0..38ebf60216 100644 --- a/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/core/services/modal/modal.stories.ts @@ -11,7 +11,7 @@ import { html } from 'lit-html'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbContextConsumerMixin } from '../../context'; import { LitElement } from 'lit'; -import { UmbModalHandler, UmbModalService } from './'; +import { UmbModalHandler, UmbModalOptions, UmbModalService } from './'; export default { title: 'API/Modals', @@ -105,7 +105,7 @@ class StoryModalServiceExampleElement extends UmbContextConsumerMixin(LitElement modalType: 'dialog' | 'sidebar' = 'dialog'; @property() - modalOptions = { size: 'small' }; + modalOptions: UmbModalOptions = { type: 'sidebar', size: 'small' }; @state() value = ''; @@ -120,10 +120,10 @@ class StoryModalServiceExampleElement extends UmbContextConsumerMixin(LitElement private _open() { let modalHandler = null; if (this.modalType === 'dialog') { - modalHandler = this._modalService?.openDialog('story-modal-service-dialog-example'); + modalHandler = this._modalService?.open('story-modal-service-dialog-example'); } if (this.modalType === 'sidebar') { - modalHandler = this._modalService?.openSidebar('story-modal-service-sidebar-example', this.modalOptions); + modalHandler = this._modalService?.open('story-modal-service-sidebar-example', this.modalOptions); } modalHandler?.onClose.then((result) => { this.value = result ?? this.value;