Skip to content

Commit 1a80b4d

Browse files
V15: Main entity name field lacks placeholder and auto-focus (#18041)
* fix: adds placeholder text to the main entity name field * fix: use forward ref to execute the `.focus()` method on the uui input when it gets rendered * Fixed up `type` imports Removed erogenous closing `</div>` + prettify formatting. --------- Co-authored-by: leekelleher <[email protected]>
1 parent 081858f commit 1a80b4d

File tree

1 file changed

+67
-75
lines changed

1 file changed

+67
-75
lines changed

src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts

Lines changed: 67 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,18 @@
11
import type { ActiveVariant } from '../../controllers/index.js';
22
import { UMB_WORKSPACE_SPLIT_VIEW_CONTEXT } from './workspace-split-view.context.js';
3-
import {
4-
type UUIInputElement,
5-
UUIInputEvent,
6-
type UUIPopoverContainerElement,
7-
} from '@umbraco-cms/backoffice/external/uui';
8-
import {
9-
css,
10-
html,
11-
nothing,
12-
customElement,
13-
state,
14-
query,
15-
ifDefined,
16-
type TemplateResult,
17-
} from '@umbraco-cms/backoffice/external/lit';
18-
import {
19-
UmbVariantId,
20-
type UmbEntityVariantModel,
21-
type UmbEntityVariantOptionModel,
22-
} from '@umbraco-cms/backoffice/variant';
23-
import { UMB_PROPERTY_DATASET_CONTEXT, isNameablePropertyDatasetContext } from '@umbraco-cms/backoffice/property';
24-
import { UmbLitElement, umbFocus } from '@umbraco-cms/backoffice/lit-element';
3+
import { css, customElement, html, ifDefined, nothing, query, ref, state } from '@umbraco-cms/backoffice/external/lit';
4+
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
255
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
26-
import type { UmbVariantState } from '@umbraco-cms/backoffice/utils';
6+
import { UmbVariantId } from '@umbraco-cms/backoffice/variant';
277
import { UmbDataPathVariantQuery, umbBindToValidation } from '@umbraco-cms/backoffice/validation';
8+
import { UMB_PROPERTY_DATASET_CONTEXT, isNameablePropertyDatasetContext } from '@umbraco-cms/backoffice/property';
9+
import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
2810
import type { UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content';
11+
import type { UmbEntityVariantModel, UmbEntityVariantOptionModel } from '@umbraco-cms/backoffice/variant';
12+
import type { UmbVariantState } from '@umbraco-cms/backoffice/utils';
13+
import type { UUIInputElement, UUIPopoverContainerElement } from '@umbraco-cms/backoffice/external/uui';
2914

30-
const elementName = 'umb-workspace-split-view-variant-selector';
31-
@customElement(elementName)
15+
@customElement('umb-workspace-split-view-variant-selector')
3216
export class UmbWorkspaceSplitViewVariantSelectorElement<
3317
VariantOptionModelType extends
3418
UmbEntityVariantOptionModel<UmbEntityVariantModel> = UmbEntityVariantOptionModel<UmbEntityVariantModel>,
@@ -220,66 +204,74 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
220204
this._popoverElement.style.width = `${host.width}px`;
221205
}
222206

207+
/**
208+
* Focuses the input element after a short delay to ensure it is rendered.
209+
* This works better than the {umbFocus()} directive, which does not work in this context.
210+
*/
211+
#focusInput(element?: Element) {
212+
if (!element) return;
213+
214+
setTimeout(async () => {
215+
await this.updateComplete;
216+
(element as UUIInputElement)?.focus();
217+
}, 200);
218+
}
219+
223220
override render() {
224-
return this._variantId
225-
? html`
221+
if (!this._variantId) return nothing;
222+
223+
return html`
226224
<uui-input
227225
id="name-input"
228226
data-mark="input:entity-name"
227+
placeholder=${this.localize.term('placeholders_entername')}
229228
label=${this.localize.term('placeholders_entername')}
230229
.value=${this._name ?? ''}
231230
@input=${this.#handleInput}
232231
required
233232
?readonly=${this.#isReadOnly(this._activeVariant?.culture ?? null)}
234233
${umbBindToValidation(this, `$.variants[${UmbDataPathVariantQuery(this._variantId)}].name`, this._name ?? '')}
235-
${umbFocus()}
236-
>
237-
${
238-
this.#hasVariants()
239-
? html`
240-
<uui-button
241-
id="variant-selector-toggle"
242-
compact
243-
slot="append"
244-
popovertarget="variant-selector-popover"
245-
title=${ifDefined(this._activeVariant?.language.name)}
246-
label="Select a variant">
247-
${this._activeVariant?.language.name} ${this.#renderReadOnlyTag(this._activeVariant?.culture)}
248-
<uui-symbol-expand .open=${this._variantSelectorOpen}></uui-symbol-expand>
249-
</uui-button>
250-
${this._activeVariants.length > 1
251-
? html`
252-
<uui-button slot="append" compact id="variant-close" @click=${this.#closeSplitView}>
253-
<uui-icon name="remove"></uui-icon>
254-
</uui-button>
255-
`
256-
: ''}
257-
`
258-
: nothing
259-
}
260-
</uui-input>
261-
262-
${
263-
this.#hasVariants()
234+
${ref(this.#focusInput)}>
235+
${this.#hasVariants()
264236
? html`
265-
<uui-popover-container
266-
id="variant-selector-popover"
267-
@beforetoggle=${this.#onPopoverToggle}
268-
placement="bottom-end">
269-
<div id="variant-selector-dropdown">
270-
<uui-scroll-container>
271-
<ul>
272-
${this._variantOptions.map((variant) => this.#renderListItem(variant))}
273-
</ul>
274-
</uui-scroll-container>
275-
</div>
276-
</uui-popover-container>
237+
<uui-button
238+
id="variant-selector-toggle"
239+
compact
240+
slot="append"
241+
popovertarget="variant-selector-popover"
242+
title=${ifDefined(this._activeVariant?.language.name)}
243+
label="Select a variant">
244+
${this._activeVariant?.language.name} ${this.#renderReadOnlyTag(this._activeVariant?.culture)}
245+
<uui-symbol-expand .open=${this._variantSelectorOpen}></uui-symbol-expand>
246+
</uui-button>
247+
${this._activeVariants.length > 1
248+
? html`
249+
<uui-button slot="append" compact id="variant-close" @click=${this.#closeSplitView}>
250+
<uui-icon name="remove"></uui-icon>
251+
</uui-button>
252+
`
253+
: ''}
277254
`
278-
: nothing
279-
}
280-
</div>
281-
`
282-
: nothing;
255+
: nothing}
256+
</uui-input>
257+
258+
${this.#hasVariants()
259+
? html`
260+
<uui-popover-container
261+
id="variant-selector-popover"
262+
@beforetoggle=${this.#onPopoverToggle}
263+
placement="bottom-end">
264+
<div id="variant-selector-dropdown">
265+
<uui-scroll-container>
266+
<ul>
267+
${this._variantOptions.map((variant) => this.#renderListItem(variant))}
268+
</ul>
269+
</uui-scroll-container>
270+
</div>
271+
</uui-popover-container>
272+
`
273+
: nothing}
274+
`;
283275
}
284276

285277
#renderListItem(variantOption: VariantOptionModelType) {
@@ -313,7 +305,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
313305
}
314306

315307
// eslint-disable-next-line @typescript-eslint/no-unused-vars
316-
protected _renderVariantDetails(variantOption: VariantOptionModelType): TemplateResult {
308+
protected _renderVariantDetails(variantOption: VariantOptionModelType) {
317309
return html``;
318310
}
319311

@@ -502,6 +494,6 @@ export class UmbWorkspaceSplitViewVariantSelectorElement<
502494

503495
declare global {
504496
interface HTMLElementTagNameMap {
505-
[elementName]: UmbWorkspaceSplitViewVariantSelectorElement;
497+
'umb-workspace-split-view-variant-selector': UmbWorkspaceSplitViewVariantSelectorElement;
506498
}
507499
}

0 commit comments

Comments
 (0)