diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts index c31a4d98a7..57adf7f0a1 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/states/array-state.ts @@ -35,7 +35,10 @@ export class UmbArrayState extends UmbDeepState { */ sortBy(sortMethod?: (a: T, b: T) => number) { this.#sortMethod = sortMethod; - super.setValue(this.getValue().sort(this.#sortMethod)); + const value = this.getValue(); + if(value) { + super.setValue([...value].sort(this.#sortMethod)); + } return this; } @@ -51,7 +54,7 @@ export class UmbArrayState extends UmbDeepState { */ override setValue(value: T[]) { if (this.#sortMethod) { - super.setValue(value.sort(this.#sortMethod)); + super.setValue([...value].sort(this.#sortMethod)); } else { super.setValue(value); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts index c3d07105cc..bbb50aafbc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/property-editors/block-list-editor/manifests.ts @@ -1,5 +1,5 @@ -import { manifest as blockListSchemaManifest } from './Umbraco.BlockList.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +import { manifest as blockListSchemaManifest } from './Umbraco.BlockList.js'; export const UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS = 'Umbraco.BlockList'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/split-panel/split-panel.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/split-panel/split-panel.element.ts index 3cfd61b9f0..b24ae93638 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/split-panel/split-panel.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/split-panel/split-panel.element.ts @@ -294,7 +294,7 @@ export class UmbSplitPanelElement extends LitElement { #divider-touch-area { position: absolute; top: 0; - left: 0; + left: 5px; height: 100%; width: var(--umb-split-panel-divider-touch-area-width); transform: translateX(-50%); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts index d400a230f9..279c064ffe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts @@ -1,5 +1,3 @@ -import type { UmbUfmRenderElement } from '../../../ufm/components/ufm-render/index.js'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, customElement, @@ -11,6 +9,8 @@ import { when, LitElement, } from '@umbraco-cms/backoffice/external/lit'; +import type { UmbUfmRenderElement } from '../../../ufm/components/ufm-render/index.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; // TODO: move to UI Library - entity actions should NOT be moved to UI Library but stay in an UmbTable element export interface UmbTableItem { @@ -163,17 +163,19 @@ export class UmbTableElement extends LitElement { } override render() { - return html` - 'width: 60px', - )}> - - ${this._renderHeaderCheckboxCell()} ${this.columns.map((column) => this._renderHeaderCell(column))} - - ${repeat(this.items, (item) => item.id, this._renderRow)} - `; + return html` + + 'width: 60px', + )}> + + ${this._renderHeaderCheckboxCell()} ${this.columns.map((column) => this._renderHeaderCell(column))} + + ${repeat(this.items, (item) => item.id, this._renderRow)} + + `; } private _renderHeaderCell(column: UmbTableColumn) { @@ -201,48 +203,54 @@ export class UmbTableElement extends LitElement { private _renderHeaderCheckboxCell() { if (this.config.hideIcon && !this.config.allowSelection) return; - return html` - ${when( - this.config.allowSelection, - () => - html` - `, - )} - `; + return html` + + ${when( + this.config.allowSelection, + () => + html` + `, + )} + + `; } private _renderRow = (item: UmbTableItem) => { - return html` this._selectRow(item.id)} - @deselected=${() => this._deselectRow(item.id)}> - ${this._renderRowCheckboxCell(item)} ${this.columns.map((column) => this._renderRowCell(column, item))} - `; + return html` + this._selectRow(item.id)} + @deselected=${() => this._deselectRow(item.id)}> + ${this._renderRowCheckboxCell(item)} ${this.columns.map((column) => this._renderRowCell(column, item))} + + `; }; private _renderRowCheckboxCell(item: UmbTableItem) { if (this.config.hideIcon && !this.config.allowSelection) return; - return html` - ${when(!this.config.hideIcon, () => html``)} - ${when( - this.config.allowSelection, - () => html` - e.stopPropagation()} - @change=${(event: Event) => this._handleRowCheckboxChange(event, item)} - ?checked="${this._isSelected(item.id)}"> - - `, - )} - `; + return html` + + ${when(!this.config.hideIcon, () => html``)} + ${when( + this.config.allowSelection, + () => html` + e.stopPropagation()} + @change=${(event: Event) => this._handleRowCheckboxChange(event, item)} + ?checked="${this._isSelected(item.id)}"> + + `, + )} + + `; } private _renderRowCell(column: UmbTableColumn, item: UmbTableItem) { @@ -251,7 +259,8 @@ export class UmbTableElement extends LitElement { style="--uui-table-cell-padding: 0 var(--uui-size-5); text-align:${column.align ?? 'left'}; width: ${column.width || 'auto'};"> ${this._renderCellContent(column, item)} - `; + + `; } private _renderCellContent(column: UmbTableColumn, item: UmbTableItem) { @@ -292,6 +301,7 @@ export class UmbTableElement extends LitElement { position: sticky; top: 0; z-index: 1; + background-color: var(--uui-color-surface, #fff); } uui-table-row uui-checkbox { @@ -331,6 +341,7 @@ export class UmbTableElement extends LitElement { justify-content: space-between; width: 100%; } + uui-table-head-cell button > span { flex: 1 0 auto; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts index f5fe1ad165..3fae384c2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/tree-item/document-tree-item.element.ts @@ -1,9 +1,9 @@ -import type { UmbDocumentTreeItemModel, UmbDocumentTreeItemVariantModel } from '../types.js'; import { css, html, nothing, customElement, state, classMap } from '@umbraco-cms/backoffice/external/lit'; import type { UmbAppLanguageContext } from '@umbraco-cms/backoffice/language'; import { UMB_APP_LANGUAGE_CONTEXT } from '@umbraco-cms/backoffice/language'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbTreeItemElementBase } from '@umbraco-cms/backoffice/tree'; +import type { UmbDocumentTreeItemModel, UmbDocumentTreeItemVariantModel } from '../types.js'; @customElement('umb-document-tree-item') export class UmbDocumentTreeItemElement extends UmbTreeItemElementBase { @@ -74,11 +74,7 @@ export class UmbDocumentTreeItemElement extends UmbTreeItemElementBase - ${this.item.isProtected ? this.#renderIsProtectedIcon() : nothing} - + ${this.#renderStateIcon()} ` : nothing} @@ -91,8 +87,24 @@ export class UmbDocumentTreeItemElement extends UmbTreeItemElementBase `; } + #renderStateIcon() { + if (this.item?.isProtected) { + return this.#renderIsProtectedIcon(); + } + + if (this.item?.documentType.collection) { + return this.#renderIsCollectionIcon(); + } + + return nothing; + } + + #renderIsCollectionIcon() { + return html``; + } + #renderIsProtectedIcon() { - return html``; + return html``; } static override styles = [ @@ -106,19 +118,13 @@ export class UmbDocumentTreeItemElement extends UmbTreeItemElementBase ${this.item?.mediaType.icon - ? html` ` + ? html` + + ${this.#renderStateIcon()} + ` : nothing} `; @@ -20,6 +23,18 @@ export class UmbMediaTreeItemElement extends UmbTreeItemElementBase${this._item?.variants[0].name} `; } + #renderStateIcon() { + if (this.item?.mediaType.collection) { + return this.#renderIsCollectionIcon(); + } + + return nothing; + } + + #renderIsCollectionIcon() { + return html``; + } + static override styles = [ UmbTextStyles, css` @@ -36,6 +51,45 @@ export class UmbMediaTreeItemElement extends UmbTreeItemElementBase