diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/alias-input/alias-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/alias-input/alias-input.element.ts new file mode 100644 index 0000000000..b8b4a1b564 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/alias-input/alias-input.element.ts @@ -0,0 +1,112 @@ +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +import { FormControlMixin, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +@customElement('umb-alias-input') +export class UmbAliasInput2Element extends FormControlMixin(UmbLitElement) { + protected getFormElement() { + return undefined; + } + + @property() + public set value(val: string | null) { + if (val === null) return; + this.locked = true; + super.value = val; + this.pristine = false; + } + public get value(): string { + return super.value as string; + } + + private _listenToElement: HTMLElement | null = null; + + public set listenToElement(el: HTMLElement | null) { + if (this._listenToElement) { + this._listenToElement.removeEventListener('input', this.#parentChange); + } + this._listenToElement = el; + this._listenToElement?.addEventListener('input', this.#parentChange); + } + public get listenToElement(): HTMLElement | null { + return this._listenToElement; + } + + @state() + locked = true; + + #parentIsInput: boolean; + + constructor() { + super(); + this.listenToElement = (this.getHostElement() as Element).parentElement; + this.#parentIsInput = this.listenToElement?.nodeName === 'UUI-INPUT'; + } + + disconnectedCallback(): void { + if (this.parentElement) { + this.parentElement.removeEventListener('input', this.#parentChange); + } + } + + #onToggleAliasLock() { + this.locked = !this.locked; + } + + #onChange(e: UUIInputEvent) { + super.value = e.target.value as string; + this.dispatchEvent(new UmbChangeEvent()); + } + + #parentChange = (e: Event) => { + if (!this.pristine) return; + super.value = (e as UUIInputEvent).target.value as string; + this.dispatchEvent(new UmbChangeEvent()); + }; + + render() { + return html` +
''} slot="prepend"> + +
+
`; + } + + static styles = [ + css` + :host { + display: contents; + } + uui-input { + --uui-input-border-width: 0; + height: 100%; + } + uui-input.outside:disabled { + background-color: transparent; + } + + #alias-lock { + display: flex; + height: 100%; + align-items: center; + justify-content: center; + cursor: pointer; + } + `, + ]; +} + +export default UmbAliasInput2Element; + +declare global { + interface HTMLElementTagNameMap { + 'umb-alias-input': UmbAliasInput2Element; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/alias-input/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/alias-input/index.ts new file mode 100644 index 0000000000..806596fd89 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/alias-input/index.ts @@ -0,0 +1 @@ +export * from './alias-input.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts index 52106961c8..619e5a59fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/index.ts @@ -33,3 +33,4 @@ export * from './table/index.js'; export * from './tooltip-menu/index.js'; export * from './variant-selector/index.js'; export * from './popover-layout/index.js'; +export * from './alias-input/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/alias-input/alias-input.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/alias-input/alias-input.ts index 10a09a53ca..a77afac19a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/alias-input/alias-input.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/components/alias-input/alias-input.ts @@ -6,15 +6,11 @@ import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-template-alias-input') export class UmbTemplateAliasInputElement extends UmbLitElement { render() { - return html` - - - - - - `; + return html`! + + + + `; } @property({ type: String, attribute: 'value' }) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts index 08b219c5a1..6ca3258e99 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/template-workspace-editor.element.ts @@ -6,7 +6,7 @@ import { UMB_TEMPLATE_WORKSPACE_CONTEXT } from './template-workspace.context.js' import type { UmbCodeEditorElement } from '@umbraco-cms/backoffice/code-editor'; import { camelCase } from '@umbraco-cms/backoffice/external/lodash'; import { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; -import { css, html, customElement, query, state, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, query, state, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UMB_MODAL_MANAGER_CONTEXT_TOKEN, UMB_TEMPLATE_PICKER_MODAL, @@ -179,12 +179,10 @@ export class UmbTemplateWorkspaceEditorElement extends UmbLitElement { slot="header" .value=${this._name} @input=${this.#onNameInput} - label="template name" - > + label="template name"> + + +
${this.#renderMasterTemplatePicker()}