diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts index 77c784844f..3369fe9172 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts @@ -27,7 +27,9 @@ import '../entity-actions/entity-action-list.element'; import './input-media-picker/input-media-picker.element'; import './input-document-picker/input-document-picker.element'; +import './input-color-picker/input-color-picker.element'; +import './input-eye-dropper/input-eye-dropper.element'; +import './input-checkbox-list/input-checkbox-list.element'; +import './input-multi-url-picker/input-multi-url-picker.element'; import './empty-state/empty-state.element'; - -import './color-picker/color-picker.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/color-picker/color-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.element.ts similarity index 81% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/color-picker/color-picker.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.element.ts index 7532076503..49c62beae4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/color-picker/color-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.element.ts @@ -1,12 +1,12 @@ -import { css, html } from 'lit'; +import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import { UUIColorSwatchesEvent } from '@umbraco-ui/uui'; import { UmbLitElement } from '@umbraco-cms/element'; -@customElement('umb-color-picker') -export class UmbColorPickerElement extends FormControlMixin(UmbLitElement) { +@customElement('umb-input-color-picker') +export class UmbInputColorPickerElement extends FormControlMixin(UmbLitElement) { static styles = [UUITextStyles]; @property({ type: Boolean }) @@ -45,10 +45,10 @@ export class UmbColorPickerElement extends FormControlMixin(UmbLitElement) { } } -export default UmbColorPickerElement; +export default UmbInputColorPickerElement; declare global { interface HTMLElementTagNameMap { - 'umb-color-picker': UmbColorPickerElement; + 'umb-input-color-picker': UmbInputColorPickerElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/eye-dropper/eye-dropper.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.test.ts similarity index 51% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/eye-dropper/eye-dropper.test.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.test.ts index c147262812..1cc62c08c9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/eye-dropper/eye-dropper.test.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.test.ts @@ -1,15 +1,15 @@ import { expect, fixture, html } from '@open-wc/testing'; -import { UmbEyeDropperElement } from './eye-dropper.element'; +import { UmbInputColorPickerElement } from './input-color-picker.element'; import { defaultA11yConfig } from '@umbraco-cms/test-utils'; -describe('UmbEyeDropperElement', () => { - let element: UmbEyeDropperElement; +describe('UmbInputColorPickerElement', () => { + let element: UmbInputColorPickerElement; beforeEach(async () => { - element = await fixture(html` `); + element = await fixture(html` `); }); it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbEyeDropperElement); + expect(element).to.be.instanceOf(UmbInputColorPickerElement); }); it('passes the a11y audit', async () => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/eye-dropper/eye-dropper.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-eye-dropper/input-eye-dropper.element.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/eye-dropper/eye-dropper.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-eye-dropper/input-eye-dropper.element.ts index 3eb73e9edf..75b173a544 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/eye-dropper/eye-dropper.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-eye-dropper/input-eye-dropper.element.ts @@ -5,8 +5,8 @@ import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import { UUIColorPickerChangeEvent } from '@umbraco-ui/uui'; import { UmbLitElement } from '@umbraco-cms/element'; -@customElement('umb-eye-dropper') -export class UmbEyeDropperElement extends FormControlMixin(UmbLitElement) { +@customElement('umb-input-eye-dropper') +export class UmbInputEyeDropperElement extends FormControlMixin(UmbLitElement) { static styles = [UUITextStyles, css``]; protected getFormElement() { @@ -36,10 +36,10 @@ export class UmbEyeDropperElement extends FormControlMixin(UmbLitElement) { } } -export default UmbEyeDropperElement; +export default UmbInputEyeDropperElement; declare global { interface HTMLElementTagNameMap { - 'umb-eye-dropper': UmbEyeDropperElement; + 'umb-input-eye-dropper': UmbInputEyeDropperElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/color-picker/color-picker.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-eye-dropper/input-eye-dropper.test.ts similarity index 51% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/color-picker/color-picker.test.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-eye-dropper/input-eye-dropper.test.ts index 977ceb6a8a..5f471eea16 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/color-picker/color-picker.test.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-eye-dropper/input-eye-dropper.test.ts @@ -1,15 +1,15 @@ import { expect, fixture, html } from '@open-wc/testing'; -import { UmbColorPickerElement } from './color-picker.element'; +import { UmbInputEyeDropperElement } from './input-eye-dropper.element'; import { defaultA11yConfig } from '@umbraco-cms/test-utils'; -describe('UmbColorPickerElement', () => { - let element: UmbColorPickerElement; +describe('UmbInputEyeDropperElement', () => { + let element: UmbInputEyeDropperElement; beforeEach(async () => { - element = await fixture(html` `); + element = await fixture(html` `); }); it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbColorPickerElement); + expect(element).to.be.instanceOf(UmbInputEyeDropperElement); }); it('passes the a11y audit', async () => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts new file mode 100644 index 0000000000..9235d780b3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts @@ -0,0 +1,149 @@ +import { css, html, nothing } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, property, state } from 'lit/decorators.js'; +import { ifDefined } from 'lit-html/directives/if-defined.js'; +import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; +import { UmbLitElement } from '@umbraco-cms/element'; +import { DocumentTreeItemModel, FolderTreeItemModel } from '@umbraco-cms/backend-api'; +import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal'; + +export type OverlaySize = 'small' | 'medium' | 'large'; + +@customElement('umb-input-multi-url-picker') +export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElement) { + static styles = [ + UUITextStyles, + css` + uui-button { + width: 100%; + } + `, + ]; + + protected getFormElement() { + return undefined; + } + /** + * This is a minimum amount of selected items in this input. + * @type {number} + * @attr + * @default undefined + */ + @property({ type: Number }) + min?: number; + + /** + * Min validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + minMessage = 'This field need more items'; + + /** + * This is a maximum amount of selected items in this input. + * @type {number} + * @attr + * @default undefined + */ + @property({ type: Number }) + max?: number; + + /** + * Max validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + maxMessage = 'This field exceeds the allowed amount of items'; + + /** + @attr 'hide-anchor' + */ + @property({ type: Boolean, attribute: 'hide-anchor' }) + hideAnchor?: boolean; + + /** + * @type {"small" | "medium" | "large"} + * @attr + * @default "small" + */ + @property() + overlaySize: OverlaySize = 'small'; + + // TODO: do we need both selectedKeys and value? If we just use value we follow the same pattern as native form controls. + private _selectedKeys: Array = []; + public get selectedKeys(): Array { + return this._selectedKeys; + } + public set selectedKeys(keys: Array) { + this._selectedKeys = keys; + super.value = keys.join(','); + } + + @property() + public set value(keysString: string) { + if (keysString !== this._value) { + this.selectedKeys = keysString.split(/[ ,]+/); + } + } + + @state() + private _items?: Array; + + private _modalService?: UmbModalService; + + constructor() { + super(); + + this.addValidator( + 'rangeUnderflow', + () => this.minMessage, + () => !!this.min && this._selectedKeys.length < this.min + ); + this.addValidator( + 'rangeOverflow', + () => this.maxMessage, + () => !!this.max && this._selectedKeys.length > this.max + ); + + this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => { + this._modalService = instance; + }); + } + + private _openPicker() { + const modalHandler = this._modalService?.multiUrlPicker(); + modalHandler?.onClose().then(({ selection }: any) => { + //this._setSelection(selection); + console.log(selection); + }); + } + + render() { + return html`${this._items?.map((item) => this._renderItem(item))} + Add`; + } + + private _renderItem(item: FolderTreeItemModel) { + // TODO: remove when we have a way to handle trashed items + const tempItem = item as FolderTreeItemModel & { isTrashed: boolean }; + + return html` + + ${tempItem.isTrashed ? html` Trashed ` : nothing} + + + `; + } +} + +export default UmbInputMultiUrlPickerElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-multi-url-picker': UmbInputMultiUrlPickerElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts index c990aeb92b..b2b7b1cfcb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts @@ -1,7 +1,6 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import '../../../components/input-checkbox-list/input-checkbox-list.element'; import { UmbInputCheckboxListElement } from '../../../components/input-checkbox-list/input-checkbox-list.element'; import { UmbLitElement } from '@umbraco-cms/element'; import type { DataTypePropertyData } from '@umbraco-cms/models'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts index f73d8a6016..108b867422 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts @@ -1,11 +1,9 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { ifDefined } from 'lit/directives/if-defined'; import { UUIColorSwatchesEvent } from '@umbraco-ui/uui'; import { UmbLitElement } from '@umbraco-cms/element'; import type { DataTypePropertyData } from '@umbraco-cms/models'; -import type { UmbColorPickerElement } from 'src/backoffice/shared/components/color-picker/color-picker.element'; /** * @element umb-property-editor-ui-color-picker @@ -38,10 +36,10 @@ export class UmbPropertyEditorUIColorPickerElement extends UmbLitElement { } render() { - return html``; + .showLabels="${this._includeLabels}">`; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts index 8ad1e00d87..7fa436884a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts @@ -3,7 +3,6 @@ import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { UUIColorPickerChangeEvent } from '@umbraco-ui/uui'; import { UmbLitElement } from '@umbraco-cms/element'; -import '../../../components/eye-dropper/eye-dropper.element'; import type { DataTypePropertyData } from '@umbraco-cms/models'; /** @@ -37,10 +36,10 @@ export class UmbPropertyEditorUIEyeDropperElement extends UmbLitElement { } render() { - return html``; + .opacity="${this._opacity}">`; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts index dd21df3e24..a6d394ba46 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts @@ -1,7 +1,11 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement, property } from 'lit/decorators.js'; +import { customElement, property, state } from 'lit/decorators.js'; +import { ifDefined } from 'lit-html/directives/if-defined.js'; +import { UmbInputMultiUrlPickerElement } from '../../../components/input-multi-url-picker/input-multi-url-picker.element'; +import type { OverlaySize } from '../../../components/input-multi-url-picker/input-multi-url-picker.element'; import { UmbLitElement } from '@umbraco-cms/element'; +import type { DataTypePropertyData } from '@umbraco-cms/models'; /** * @element umb-property-editor-ui-multi-url-picker @@ -10,14 +14,40 @@ import { UmbLitElement } from '@umbraco-cms/element'; export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement { static styles = [UUITextStyles]; - @property() - value = ''; + private _value: string[] = []; + @property({ type: Array }) + public get value(): string[] { + return this._value; + } + public set value(value: string[]) { + this._value = value || []; + } @property({ type: Array, attribute: false }) - public config = []; + public set config(config: DataTypePropertyData[]) { + const overlaySize = config.find((x) => x.alias === 'overlaySize'); + if (overlaySize) this._overlaySize = overlaySize.value as OverlaySize; + + const hideAnchor = config.find((x) => x.alias === 'hideAnchor'); + if (hideAnchor) this._hideAnchor = hideAnchor.value; + } + + @state() + private _overlaySize?: OverlaySize; + @state() + private _hideAnchor?: boolean; + + private _onChange(event: CustomEvent) { + this._value = (event.target as UmbInputMultiUrlPickerElement).selectedKeys; + this.dispatchEvent(new CustomEvent('property-value-change')); + } render() { - return html`
umb-property-editor-ui-multi-url-picker
`; + return html``; } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts index 18620770db..45783537fd 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts @@ -324,7 +324,12 @@ export const data: Array = [ isFolder: false, propertyEditorModelAlias: 'Umbraco.MediaPicker3', propertyEditorUIAlias: 'Umb.PropertyEditorUI.MediaPicker', - data: [], + data: [ + { + alias: 'validationLimit', + value: { max: 1 }, + }, + ], }, { name: 'Image Cropper', diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/layouts/multi-url-picker/modal-layout-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/core/modal/layouts/multi-url-picker/modal-layout-multi-url-picker.element.ts new file mode 100644 index 0000000000..aafb22eb9e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/modal/layouts/multi-url-picker/modal-layout-multi-url-picker.element.ts @@ -0,0 +1,149 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, state } from 'lit/decorators.js'; +import { UmbModalLayoutElement } from '../modal-layout.element'; + +export interface UmbModalMultiUrlPickerData { + title?: string; + hideAnchor?: boolean; + selection?: string; +} + +import { UmbTreeElement } from '../../../../backoffice/shared/components/tree/tree.element'; + +@customElement('umb-modal-layout-multi-url-picker') +export class UmbModalLayoutMultiUrlPickerElement extends UmbModalLayoutElement { + static styles = [ + UUITextStyles, + css` + hr { + border: none; + border-bottom: 1px solid var(--uui-color-divider); + margin-bottom: var(--uui-size-space-3); + } + + uui-input, + uui-toggle, + uui-label { + width: 100%; + } + + uui-input, + uui-label { + margin-bottom: var(--uui-size-space-6); + } + + .link-settings { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--uui-size-space-6); + } + + #select-media { + display: block; + } + `, + ]; + + @state() + _selection = ''; + + @state() + _hideAnchor = false; + + @state() + _title = ''; + + connectedCallback() { + super.connectedCallback(); + + this._title = this.data?.title ?? ''; + this._hideAnchor = this.data?.hideAnchor ?? false; + this._selection = this.data?.selection ?? ''; + } + + private _handleSelectionChange(e: CustomEvent) { + e.stopPropagation(); + const element = e.target as UmbTreeElement; + //TODO: Should multiple property be implemented here or be passed down into umb-tree? + this._selection = element.selection[element.selection.length - 1]; + console.log(this._selection); + } + + private _submit() { + this.modalHandler?.close({ selection: this._selection }); + } + + private _close() { + this.modalHandler?.close(); + } + + render() { + return html` + + + + + Link Title + + + Target + Open the link in a new tab + +
+ + ${this._renderTrees()} +
+
+ + +
+
+ `; + } + + private _renderLinkUrlInput() { + if (this._selection) { + return html` + + `; + } else { + return html``; + } + } + + private _renderTrees() { + return html`Link to page + + + +
+ + Link to media + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-modal-layout-multi-url-picker': UmbModalLayoutMultiUrlPickerElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/layouts/multi-url-picker/modal-layout-multi-url-picker.stories.ts b/src/Umbraco.Web.UI.Client/src/core/modal/layouts/multi-url-picker/modal-layout-multi-url-picker.stories.ts new file mode 100644 index 0000000000..4bb37b0aaf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/modal/layouts/multi-url-picker/modal-layout-multi-url-picker.stories.ts @@ -0,0 +1,29 @@ +import '../../../../backoffice/shared/components/body-layout/body-layout.element'; +import './modal-layout-multi-url-picker.element'; + +import { Meta, Story } from '@storybook/web-components'; +import { html } from 'lit'; + +import type { + UmbModalLayoutMultiUrlPickerElement, + UmbModalMultiUrlPickerData, +} from './modal-layout-multi-url-picker.element'; + +export default { + title: 'API/Modals/Layouts/Multi Url Picker', + component: 'umb-modal-layout-multi-url-picker', + id: 'modal-layout-multi-url-picker', +} as Meta; + +const data: UmbModalMultiUrlPickerData = { + title: '', + hideAnchor: false, + selection: '', +}; + +export const Overview: Story = () => html` + + +`; diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/modal.service.ts b/src/Umbraco.Web.UI.Client/src/core/modal/modal.service.ts index 0ed747171e..9d3debf9ef 100644 --- a/src/Umbraco.Web.UI.Client/src/core/modal/modal.service.ts +++ b/src/Umbraco.Web.UI.Client/src/core/modal/modal.service.ts @@ -5,6 +5,7 @@ import './layouts/media-picker/modal-layout-media-picker.element'; import './layouts/property-editor-ui-picker/modal-layout-property-editor-ui-picker.element'; import './layouts/modal-layout-current-user.element'; import './layouts/icon-picker/modal-layout-icon-picker.element'; +import './layouts/multi-url-picker/modal-layout-multi-url-picker.element'; import { UUIModalSidebarSize } from '@umbraco-ui/uui-modal-sidebar'; import { BehaviorSubject } from 'rxjs'; @@ -14,6 +15,7 @@ import type { UmbModalConfirmData } from './layouts/confirm/modal-layout-confirm import type { UmbModalContentPickerData } from './layouts/content-picker/modal-layout-content-picker.element'; import type { UmbModalPropertyEditorUIPickerData } from './layouts/property-editor-ui-picker/modal-layout-property-editor-ui-picker.element'; import type { UmbModalMediaPickerData } from './layouts/media-picker/modal-layout-media-picker.element'; +import type { UmbModalMultiUrlPickerData } from './layouts/multi-url-picker/modal-layout-multi-url-picker.element'; import { UmbModalHandler } from './modal-handler'; import { UmbContextToken } from '@umbraco-cms/context-api'; @@ -86,6 +88,17 @@ export class UmbModalService { return this.open('umb-modal-layout-icon-picker', { data, type: 'sidebar', size: 'small' }); } + /** + * Opens an Multi URL Picker sidebar modal + * @public + * @param {UmbModalMultiUrlPickerData} [data] + * @return {*} {UmbModalHandler} + * @memberof UmbModalService + */ + public multiUrlPicker(data?: UmbModalMultiUrlPickerData): UmbModalHandler { + return this.open('umb-modal-layout-multi-url-picker', { data, type: 'sidebar', size: 'small' }); + } + /** * Opens the user settings sidebar modal * @public