From 17f6838cdb1ca3f5b223e1e37555c672f080befd Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 28 Aug 2023 15:35:11 +0200 Subject: [PATCH] implement sorting --- .../workspace/stylesheet-workspace.context.ts | 25 +++++++++---- ...workspace-view-rich-text-editor.element.ts | 36 ++++++++++++++++--- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts index 391bfe0daa..4556460fee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -6,9 +6,11 @@ import { UmbArrayState, UmbBooleanState, UmbObjectState, createObservablePart } import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { RichTextRuleModel, UpdateStylesheetRequestModel } from '@umbraco-cms/backoffice/backend-api'; +export type RichTextRuleModelSortable = RichTextRuleModel & { sortOrder?: number }; + export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext { #data = new UmbObjectState(undefined); - #rules = new UmbArrayState([]); + #rules = new UmbArrayState([]); data = this.#data.asObservable(); rules = this.#rules.asObservable(); name = createObservablePart(this.#data, (data) => data?.name); @@ -20,6 +22,7 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext (a.sortOrder ?? 0) - (b.sortOrder ?? 0)); this.#loadCodeEditor(); } @@ -49,7 +52,7 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext ({ ...r, sortOrder: i }))); this.sendRulesGetContent(); } @@ -73,7 +76,7 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext ({ ...r, sortOrder: i })) ?? []); } } @@ -88,9 +91,8 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext (a.sortOrder ?? 0) - (b.sortOrder ?? 0)); + const oldIndex = rules.findIndex((r) => r.name === rule.name); + + if (oldIndex === -1) return false; + rules.splice(oldIndex, 1); + rules.splice(newIndex, 0, rule); + this.setRules(rules.map((r, i) => ({ ...r, sortOrder: i }))); + return true; + } + public async save() { const stylesheet = this.getData(); @@ -130,8 +143,8 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext = { + compareElementToModel: (element: HTMLElement, model: RichTextRuleModel) => { + return element.getAttribute('data-umb-rule-name') === model.name; + }, + querySelectModelToElement: (container: HTMLElement, modelEntry: RichTextRuleModel) => { + return container.querySelector('data-umb-rule-name[' + modelEntry.name + ']'); + }, + identifier: 'stylesheet-rules-sorter', + itemSelector: '[data-umb-rule-name]', + disabledItemSelector: '[inherited]', + containerSelector: '#rules-container', +}; + @customElement('umb-stylesheet-workspace-view-rich-text-editor') export class UmbStylesheetWorkspaceViewRichTextEditorElement extends UmbLitElement { @state() @@ -46,6 +62,19 @@ export class UmbStylesheetWorkspaceViewRichTextEditorElement extends UmbLitEleme #currentlyEditing: RichTextRuleModel | null = null; + #sorter = new UmbSorterController(this, { + ...SORTER_CONFIG, + performItemInsert: ({ item, newIndex }) => { + //return true; + + return this.#context?.findNewSortOrder(item, newIndex) ?? false; + }, + performItemRemove: (args) => { + console.log(args, 'remove'); + return true; + }, + }); + constructor() { super(); @@ -71,6 +100,7 @@ export class UmbStylesheetWorkspaceViewRichTextEditorElement extends UmbLitEleme this.observe(this.#context.rules, (rules) => { this._rules = rules; + this.#sorter.setModel(this._rules); }); }); @@ -79,8 +109,6 @@ export class UmbStylesheetWorkspaceViewRichTextEditorElement extends UmbLitEleme }); } - - #openModal = (rule: RichTextRuleModel | null = null) => { if (!this._modalContext) throw new Error('Modal context not found'); this.#currentlyEditing = rule; @@ -109,7 +137,7 @@ export class UmbStylesheetWorkspaceViewRichTextEditorElement extends UmbLitEleme } renderRule(rule: RichTextRuleModel) { - return html`
+ return html`
${rule.name}
this.#openModal(rule)}>Edit

Define the styles that should be available in the rich text editor for this stylesheet.

- ${this._rules?.map((rule) => this.renderRule(rule))} +
${repeat(this._rules, (rule) => rule.name, this.renderRule)}
this.#openModal(null)}>Add