diff --git a/examples/sorter-with-nested-containers/sorter-dashboard.ts b/examples/sorter-with-nested-containers/sorter-dashboard.ts index daefba21f6..d9d0016eb7 100644 --- a/examples/sorter-with-nested-containers/sorter-dashboard.ts +++ b/examples/sorter-with-nested-containers/sorter-dashboard.ts @@ -1,7 +1,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, LitElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import type { ModelEntryType } from './sorter-group.js'; +import type { ExampleSorterGroup, ModelEntryType } from './sorter-group.js'; import './sorter-group.js'; @customElement('example-sorter-dashboard') @@ -57,9 +57,16 @@ export class ExampleSorterDashboard extends UmbElementMixin(LitElement) { return html`
-
Notice this example still only support single group of Sorter.
- - + { + this.groupOneItems = (e.target as ExampleSorterGroup).value; + }}> + { + this.groupTwoItems = (e.target as ExampleSorterGroup).value; + }}>
`; diff --git a/examples/sorter-with-nested-containers/sorter-group.ts b/examples/sorter-with-nested-containers/sorter-group.ts index d1a0c7e35e..2111f6b8db 100644 --- a/examples/sorter-with-nested-containers/sorter-group.ts +++ b/examples/sorter-with-nested-containers/sorter-group.ts @@ -13,28 +13,8 @@ export type ModelEntryType = { @customElement('example-sorter-group') export class ExampleSorterGroup extends UmbElementMixin(LitElement) { - @property({ type: Array, attribute: false }) - public get initialItems(): ModelEntryType[] { - return this.items; - } - public set initialItems(value: ModelEntryType[]) { - // Only want to set the model initially, cause any re-render should not set this again. - if (this._items !== undefined) return; - this.items = value; - } - - @property({ type: Array, attribute: false }) - public get items(): ModelEntryType[] { - return this._items ?? []; - } - public set items(value: ModelEntryType[]) { - const oldValue = this._items; - this._items = value; - this.#sorter.setModel(this._items); - this.requestUpdate('items', oldValue); - } - private _items?: ModelEntryType[]; - + // + // Sorter setup: #sorter = new UmbSorterController(this, { getUniqueOfElement: (element) => { return element.name; @@ -46,26 +26,45 @@ export class ExampleSorterGroup extends UmbElementMixin(LitElement) { itemSelector: 'example-sorter-item', containerSelector: '.sorter-container', onChange: ({ model }) => { - const oldValue = this._items; - this._items = model; - this.requestUpdate('items', oldValue); + const oldValue = this._value; + this._value = model; + this.requestUpdate('value', oldValue); + // Fire an event for the parent to know that the model has changed. + this.dispatchEvent(new CustomEvent('change')); }, }); + @property({ type: Array, attribute: false }) + public get value(): ModelEntryType[] { + return this._value ?? []; + } + public set value(value: ModelEntryType[]) { + const oldValue = this._value; + this._value = value; + this.#sorter.setModel(this._value); + this.requestUpdate('value', oldValue); + } + private _value?: ModelEntryType[]; + removeItem = (item: ModelEntryType) => { - this.items = this.items.filter((r) => r.name !== item.name); + this.value = this.value.filter((r) => r.name !== item.name); }; render() { return html`
${repeat( - this.items, + this.value, + // Note: ideally you have an unique identifier for each item, but for this example we use the `name` as identifier. (item) => item.name, (item) => html` - ${item.children ? html`` : ''} + { + item.children = (e.target as ExampleSorterGroup).value; + }}> `, )}
diff --git a/package-lock.json b/package-lock.json index ff03748b08..ad46e3c129 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5161,9 +5161,9 @@ } }, "node_modules/@storybook/cli/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "dev": true, "dependencies": { "async-limiter": "~1.0.0" @@ -7576,9 +7576,9 @@ } }, "node_modules/@web/dev-server-core/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" diff --git a/src/assets/lang/en-us.ts b/src/assets/lang/en-us.ts index cf78a5ae8d..7b85147492 100644 --- a/src/assets/lang/en-us.ts +++ b/src/assets/lang/en-us.ts @@ -1300,7 +1300,7 @@ export default { packages: 'Packages', marketplace: 'Marketplace', settings: 'Settings', - translation: 'Translation', + translation: 'Dictionary', users: 'Users', }, help: { diff --git a/src/assets/lang/en.ts b/src/assets/lang/en.ts index 55db3876f1..235976583f 100644 --- a/src/assets/lang/en.ts +++ b/src/assets/lang/en.ts @@ -1319,7 +1319,7 @@ export default { packages: 'Packages', marketplace: 'Marketplace', settings: 'Settings', - translation: 'Translation', + translation: 'Dictionary', users: 'Users', }, help: { diff --git a/src/packages/core/sorter/sorter.controller.ts b/src/packages/core/sorter/sorter.controller.ts index 37f501f27d..bc2aa0db12 100644 --- a/src/packages/core/sorter/sorter.controller.ts +++ b/src/packages/core/sorter/sorter.controller.ts @@ -387,6 +387,15 @@ export class UmbSorterController= elRect.top && this.#dragY <= elRect.bottom) { - const dragElement = this.#config.draggableSelector ? el.querySelector(this.#config.draggableSelector) : el; + const dragElement = this.#getDraggableElement(el as unknown as HTMLElement); if (dragElement) { const dragElementRect = dragElement.getBoundingClientRect(); if (el !== UmbSorterController.activeElement) { diff --git a/src/packages/templating/templates/modals/query-builder/query-builder-filter.element.ts b/src/packages/templating/templates/modals/query-builder/query-builder-filter.element.ts index 95a1a90cba..0160151eab 100644 --- a/src/packages/templating/templates/modals/query-builder/query-builder-filter.element.ts +++ b/src/packages/templating/templates/modals/query-builder/query-builder-filter.element.ts @@ -46,7 +46,7 @@ export class UmbTemplateQueryBuilderFilterElement extends UmbLitElement { #resetOperator() { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - this.filter = { ...this.filter, operator: undefined }; + this.filter = { ...this.filter, operator: undefined, constraintValue: undefined }; } #resetFilter() {