@eclipse-docks/extension-settings-tree 0.7.130 → 0.7.132

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,4 +8,4 @@ var i18n_de_default = {
8
8
  //#endregion
9
9
  export { EXT_SETTINGS_TREE_DESC, EXT_SETTINGS_TREE_NAME, i18n_de_default as default };
10
10
 
11
- //# sourceMappingURL=i18n.de-BNVmjm3M.js.map
11
+ //# sourceMappingURL=i18n.de-2oUWFl6d.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.de-BNVmjm3M.js","names":[],"sources":["../src/i18n.de.json"],"sourcesContent":["{\n \"EXT_SETTINGS_TREE_NAME\": \"Einstellungs-Baum-Editor\",\n \"EXT_SETTINGS_TREE_DESC\": \"Baumbasierter Editor für Einstellungen mit direkter Bearbeitung\"\n}\n"],"mappings":""}
1
+ {"version":3,"file":"i18n.de-2oUWFl6d.js","names":[],"sources":["../src/i18n.de.json"],"sourcesContent":["{\n \"EXT_SETTINGS_TREE_NAME\": \"Einstellungs-Baum-Editor\",\n \"EXT_SETTINGS_TREE_DESC\": \"Baumbasierter Editor für Einstellungen mit direkter Bearbeitung\"\n}\n"],"mappings":""}
@@ -8,4 +8,4 @@ var i18n_en_default = {
8
8
  //#endregion
9
9
  export { EXT_SETTINGS_TREE_DESC, EXT_SETTINGS_TREE_NAME, i18n_en_default as default };
10
10
 
11
- //# sourceMappingURL=i18n.en-4qIo7_K0.js.map
11
+ //# sourceMappingURL=i18n.en-SG0YCiww.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.en-4qIo7_K0.js","names":[],"sources":["../src/i18n.en.json"],"sourcesContent":["{\n \"EXT_SETTINGS_TREE_NAME\": \"Settings Tree Editor\",\n \"EXT_SETTINGS_TREE_DESC\": \"Tree-based editor for settings with in-place editing\"\n}\n"],"mappings":""}
1
+ {"version":3,"file":"i18n.en-SG0YCiww.js","names":[],"sources":["../src/i18n.en.json"],"sourcesContent":["{\n \"EXT_SETTINGS_TREE_NAME\": \"Settings Tree Editor\",\n \"EXT_SETTINGS_TREE_DESC\": \"Tree-based editor for settings with in-place editing\"\n}\n"],"mappings":""}
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import { extensionRegistry, i18n } from "@eclipse-docks/core";
2
2
  import pkg from "../package.json";
3
3
  //#region src/index.ts
4
- var t = await i18n(/* @__PURE__ */ Object.assign({
5
- "./i18n.de.json": () => import("./i18n.de-BNVmjm3M.js"),
6
- "./i18n.en.json": () => import("./i18n.en-4qIo7_K0.js")
4
+ var t = await i18n(/* #__PURE__ */ Object.assign({
5
+ "./i18n.de.json": () => import("./i18n.de-2oUWFl6d.js"),
6
+ "./i18n.en.json": () => import("./i18n.en-SG0YCiww.js")
7
7
  }), true);
8
8
  extensionRegistry.registerExtension({
9
9
  id: pkg.name,
10
10
  name: t.EXT_SETTINGS_TREE_NAME,
11
11
  description: t.EXT_SETTINGS_TREE_DESC,
12
- loader: () => import("./settings-tree-extension-BCSbBt-O.js"),
12
+ loader: () => import("./settings-tree-extension-BdMFQxaf.js"),
13
13
  icon: "sitemap"
14
14
  });
15
15
  //#endregion
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_SETTINGS_TREE_NAME,\n description: t.EXT_SETTINGS_TREE_DESC,\n loader: () => import(\"./settings-tree-extension\"),\n icon: \"sitemap\",\n\n\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;CAGP,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_SETTINGS_TREE_NAME,\n description: t.EXT_SETTINGS_TREE_DESC,\n loader: () => import(\"./settings-tree-extension\"),\n icon: \"sitemap\",\n\n\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;AAAA,CAAA,GAAkC,IAAI;AAE3D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;AAGR,CAAC"}
@@ -231,11 +231,13 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
231
231
  }
232
232
  updated(changedProperties) {
233
233
  super.updated?.(changedProperties);
234
- if (changedProperties.has("selectedPath") && this.selectedPath !== this.detailForPath) if (this.selectedPath) this.updateDetailForPath(this.selectedPath);
235
- else {
236
- this.detailForPath = null;
237
- this.detailRows = [];
238
- this.detailTitle = "";
234
+ if (changedProperties.has("selectedPath") && this.selectedPath !== this.detailForPath) {
235
+ if (this.selectedPath) this.updateDetailForPath(this.selectedPath);
236
+ else {
237
+ this.detailForPath = null;
238
+ this.detailRows = [];
239
+ this.detailTitle = "";
240
+ }
239
241
  }
240
242
  }
241
243
  setRowValue(row, value) {
@@ -296,22 +298,26 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
296
298
  const current = row.value;
297
299
  if (enumValues && Array.isArray(enumValues) && enumValues.length > 0) {
298
300
  const options = enumValues.map((v) => String(v));
301
+ const value = current !== void 0 && current !== null ? String(current) : schema?.default !== void 0 ? String(schema.default) : options[0];
299
302
  return html`
300
303
  <wa-select
301
- value=${current !== void 0 && current !== null ? String(current) : schema?.default !== void 0 ? String(schema.default) : options[0]}
304
+ value=${value}
302
305
  @change=${(e) => this.setRowValue(row, e.target.value)}
303
306
  size="s">
304
307
  ${options.map((opt) => html`<wa-option value=${opt}>${opt}</wa-option>`)}
305
308
  </wa-select>
306
309
  `;
307
310
  }
308
- if (type === "boolean") return html`
311
+ if (type === "boolean") {
312
+ const checked = current === true || current === void 0 && schema?.default === true;
313
+ return html`
309
314
  <wa-switch
310
- ?checked=${current === true || current === void 0 && schema?.default === true}
315
+ ?checked=${checked}
311
316
  @change=${(e) => this.setRowValue(row, e.target.checked)}
312
317
  size="s">
313
318
  </wa-switch>
314
319
  `;
320
+ }
315
321
  if (type === "number") {
316
322
  const num = typeof current === "number" ? current : typeof schema?.default === "number" ? schema.default : 0;
317
323
  return html`
@@ -324,13 +330,16 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
324
330
  }
325
331
  const isObjectOrArray = current !== null && typeof current === "object";
326
332
  if (isObjectOrArray && !schema && _DocksSettingsTree.isRecord(current)) return this.renderObjectFields(row.path, current, 0);
327
- if (isObjectOrArray) return html`
333
+ if (isObjectOrArray) {
334
+ const str = JSON.stringify(current, null, 2);
335
+ return html`
328
336
  <wa-textarea
329
- .value=${JSON.stringify(current, null, 2)}
337
+ .value=${str}
330
338
  @blur=${(e) => this.setRowValueFromJson(row, e.target.value)}
331
339
  rows="3">
332
340
  </wa-textarea>
333
341
  `;
342
+ }
334
343
  return this.renderPrimitiveControl(row, current);
335
344
  }
336
345
  renderPrimitiveControl(row, current) {
@@ -375,9 +384,10 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
375
384
  </wa-textarea>
376
385
  `;
377
386
  }
387
+ const entries = Object.entries(obj);
378
388
  return html`
379
389
  <div class="nested-object" >
380
- ${Object.entries(obj).map(([k, v]) => {
390
+ ${entries.map(([k, v]) => {
381
391
  const subPath = `${parentPath}.${k}`;
382
392
  const subRow = {
383
393
  key: k,
@@ -387,6 +397,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
387
397
  value: v,
388
398
  parentPath
389
399
  };
400
+ const isNestedObj = _DocksSettingsTree.isRecord(v);
390
401
  return html`
391
402
  <div class="nested-row">
392
403
  <wa-input
@@ -399,7 +410,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
399
410
  }}>
400
411
  </wa-input>
401
412
  <span class="nested-sep">:</span>
402
- ${_DocksSettingsTree.isRecord(v) ? this.renderObjectFields(subPath, v, depth + 1) : Array.isArray(v) ? html`
413
+ ${isNestedObj ? this.renderObjectFields(subPath, v, depth + 1) : Array.isArray(v) ? html`
403
414
  <wa-textarea
404
415
  .value=${JSON.stringify(v, null, 2)}
405
416
  rows="2"
@@ -789,4 +800,4 @@ var settings_tree_extension_default = (_uiContext) => {
789
800
  //#endregion
790
801
  export { settings_tree_extension_default as default };
791
802
 
792
- //# sourceMappingURL=settings-tree-extension-BCSbBt-O.js.map
803
+ //# sourceMappingURL=settings-tree-extension-BdMFQxaf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-tree-extension-BCSbBt-O.js","names":[],"sources":["../src/settings-tree.ts","../src/settings-tree-extension.ts"],"sourcesContent":["import { customElement, state, property } from \"lit/decorators.js\";\nimport { css, html, TemplateResult } from \"lit\";\nimport { PropertyValues } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { DocksPart, icon } from \"@eclipse-docks/core\";\nimport type { EditorInput } from \"@eclipse-docks/core\";\nimport { appSettings, TOPIC_SETTINGS_CHANGED } from \"@eclipse-docks/core\";\nimport type { SettingsJsonSchema } from \"@eclipse-docks/core\";\nimport { subscribe } from \"@eclipse-docks/core\";\nimport { promptDialog } from \"@eclipse-docks/core\";\nimport type { SettingsCategoryInfo } from \"@eclipse-docks/core\";\n\ninterface CategoryTreeNode {\n path: string;\n label: string;\n children: CategoryTreeNode[];\n expanded: boolean;\n}\n\ninterface SettingRow {\n key: string;\n path: string;\n title: string;\n description: string;\n schema?: SettingsJsonSchema;\n value: unknown;\n parentPath?: string;\n groupLabel?: string;\n}\n\n@customElement('docks-settings-tree')\nexport class DocksSettingsTree extends DocksPart {\n @property({ attribute: false })\n public input?: EditorInput;\n\n @state()\n private settings: Record<string, unknown> = {};\n\n @state()\n private categoryTree: CategoryTreeNode[] = [];\n\n @state()\n private selectedPath: string | null = null;\n\n @state()\n private detailRows: SettingRow[] = [];\n\n @state()\n private detailTitle = '';\n\n @state()\n private searchQuery = '';\n\n private detailForPath: string | null = null;\n\n private treeRef = createRef<HTMLElement>();\n\n protected async doInitUI() {\n await this.loadSettings();\n subscribe(TOPIC_SETTINGS_CHANGED, () => this.loadSettings());\n }\n\n private async loadSettings() {\n if (this.isDirty()) return;\n this.settings = (await appSettings.getAll()) ?? {};\n this.buildCategoryTree();\n if (this.selectedPath) {\n this.updateDetailForPath(this.selectedPath);\n }\n }\n\n private buildCategoryTree(): void {\n const categories = appSettings.getCategories();\n const schemaIds = new Set(categories.map((c: SettingsCategoryInfo) => c.id));\n const nodes: CategoryTreeNode[] = [];\n\n for (const cat of categories) {\n const childSchema = cat.schema?.properties;\n const value = this.settings[cat.id];\n const children = this.buildChildNodes(`${cat.id}`, childSchema, value);\n const label = (cat.schema?.title as string) ?? cat.label;\n if (this.matchesSearch(label, cat.id)) {\n nodes.push({\n path: cat.id,\n label,\n children,\n expanded: true,\n });\n }\n }\n\n for (const key of Object.keys(this.settings)) {\n if (schemaIds.has(key)) continue;\n const value = this.settings[key];\n const children = this.buildChildNodes(key, undefined, value);\n if (this.matchesSearch(key, key)) {\n nodes.push({\n path: key,\n label: key,\n children,\n expanded: true,\n });\n }\n }\n\n this.categoryTree = nodes;\n }\n\n private buildChildNodes(\n parentPath: string,\n schemaProps: Record<string, SettingsJsonSchema> | undefined,\n value: unknown\n ): CategoryTreeNode[] {\n const children: CategoryTreeNode[] = [];\n if (schemaProps) {\n for (const [k, s] of Object.entries(schemaProps)) {\n const path = `${parentPath}.${k}`;\n const label = (s?.title as string) ?? k;\n const subValue = DocksSettingsTree.isRecord(value) ? value[k] : undefined;\n const subChildren = this.buildChildNodes(path, s?.properties, subValue);\n if (this.matchesSearch(label, path)) {\n children.push({ path, label, children: subChildren, expanded: false });\n }\n }\n }\n if (DocksSettingsTree.isRecord(value) && !schemaProps) {\n for (const [k, v] of Object.entries(value)) {\n const path = `${parentPath}.${k}`;\n const subChildren = this.buildChildNodes(path, undefined, v);\n if (this.matchesSearch(k, path)) {\n children.push({ path, label: k, children: subChildren, expanded: false });\n }\n }\n }\n return children;\n }\n\n private matchesSearch(label: string, path: string): boolean {\n if (!this.searchQuery.trim()) return true;\n const q = this.searchQuery.toLowerCase();\n return label.toLowerCase().includes(q) || path.toLowerCase().includes(q);\n }\n\n private static isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n }\n\n private refreshAfterEdit(): void {\n this.markDirty(true);\n if (this.selectedPath) this.updateDetailForPath(this.selectedPath);\n }\n\n private getValueAtPath(path: string): unknown {\n const parts = path.split('.').filter(Boolean);\n if (parts.length === 0) return this.settings;\n let current: unknown = this.settings;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n }\n\n private setAtInMemory(path: string, value: unknown): void {\n const parts = path.split('.').filter(Boolean);\n if (parts.length === 0) return;\n this.settings = this.deepSet(this.settings as Record<string, unknown>, parts, value) as Record<string, unknown>;\n }\n\n private deepSet(obj: Record<string, unknown> | unknown[], pathParts: string[], value: unknown): Record<string, unknown> | unknown[] {\n if (pathParts.length === 1) {\n const key = pathParts[0];\n if (Array.isArray(obj)) {\n const idx = parseInt(key, 10);\n if (isNaN(idx) || idx < 0) return obj;\n const arr = [...obj];\n arr[idx] = value;\n return arr;\n }\n return { ...(obj as Record<string, unknown>), [key]: value };\n }\n const [head, ...rest] = pathParts;\n if (Array.isArray(obj)) {\n const idx = parseInt(head, 10);\n if (isNaN(idx) || idx < 0) return obj;\n const arr = [...obj];\n const current = arr[idx];\n const next = current !== null && typeof current === 'object'\n ? (current as Record<string, unknown> | unknown[])\n : {};\n arr[idx] = this.deepSet(next as Record<string, unknown>, rest, value);\n return arr;\n }\n const o = obj as Record<string, unknown>;\n const current = o[head];\n const next = current !== null && typeof current === 'object'\n ? (current as Record<string, unknown> | unknown[])\n : {};\n return { ...o, [head]: this.deepSet(next as Record<string, unknown>, rest, value) };\n }\n\n private getArrayItemLabel(item: unknown, index: number): string {\n if (DocksSettingsTree.isRecord(item)) {\n if (typeof item.id === 'string') return item.id;\n if (typeof item.name === 'string') return item.name;\n }\n return `Item ${index}`;\n }\n\n private async updateDetailForPath(path: string): Promise<void> {\n const containerSchema = appSettings.getSchemaForSettingKey(path);\n const containerValue = this.getValueAtPath(path);\n const valueObj = DocksSettingsTree.isRecord(containerValue) ? containerValue : null;\n const isArray = Array.isArray(containerValue);\n\n let rows: SettingRow[];\n\n if (isArray) {\n const arr = containerValue as unknown[];\n const flat: SettingRow[] = [];\n arr.forEach((item, index) => {\n const subPath = `${path}.${index}`;\n const groupLabel = this.getArrayItemLabel(item, index);\n if (DocksSettingsTree.isRecord(item)) {\n Object.keys(item).forEach(k => {\n flat.push({\n key: k,\n path: `${subPath}.${k}`,\n title: k,\n description: '',\n schema: undefined,\n value: item[k],\n parentPath: subPath,\n groupLabel,\n });\n });\n } else {\n flat.push({\n key: String(index),\n path: subPath,\n title: groupLabel,\n description: `Array element ${index}.`,\n schema: undefined,\n value: item,\n parentPath: path,\n groupLabel,\n });\n }\n });\n rows = flat;\n } else if (valueObj !== null) {\n const schemaProps = containerSchema?.properties;\n const keys = schemaProps ? Object.keys(schemaProps) : Object.keys(valueObj);\n rows = keys.map(key => {\n const subPath = `${path}.${key}`;\n const propSchema = schemaProps?.[key];\n const value = valueObj[key];\n return {\n key,\n path: subPath,\n title: (propSchema?.title as string) ?? key,\n description: (propSchema?.description as string) ?? '',\n schema: propSchema,\n value,\n parentPath: path,\n };\n });\n } else if (containerValue !== undefined && containerValue !== null && typeof containerValue !== 'object') {\n const segment = path.split('.').pop() ?? path;\n rows = [{\n key: segment,\n path,\n title: segment,\n description: 'Edit value (no schema).',\n schema: undefined,\n value: containerValue,\n }];\n } else {\n rows = [];\n }\n rows.forEach(r => { if (r.title === undefined) r.title = r.key; });\n\n if (this.selectedPath !== path) return;\n\n const category = appSettings.getCategories().find((c: SettingsCategoryInfo) => c.id === path);\n this.detailForPath = path;\n this.detailTitle = (category?.label ?? (containerSchema?.title as string)) ?? path;\n this.detailRows = rows;\n }\n\n private selectPath(path: string) {\n this.selectedPath = path;\n this.updateDetailForPath(path);\n }\n\n protected updated(changedProperties: PropertyValues) {\n super.updated?.(changedProperties);\n if (changedProperties.has('selectedPath') && this.selectedPath !== this.detailForPath) {\n if (this.selectedPath) this.updateDetailForPath(this.selectedPath);\n else {\n this.detailForPath = null;\n this.detailRows = [];\n this.detailTitle = '';\n }\n }\n }\n\n private setRowValue(row: SettingRow, value: unknown): void {\n this.setAtInMemory(row.path, value);\n this.refreshAfterEdit();\n }\n\n private setRowValueFromJson(row: SettingRow, raw: string): void {\n try {\n this.setRowValue(row, JSON.parse(raw));\n } catch {\n this.refreshAfterEdit();\n }\n }\n\n private renameKey(parentPath: string, oldKey: string, newKey: string): void {\n if (newKey.trim() === '' || newKey === oldKey) return;\n const parent = this.getValueAtPath(parentPath);\n if (!DocksSettingsTree.isRecord(parent)) return;\n const value = parent[oldKey];\n const updated = { ...parent };\n delete updated[oldKey];\n updated[newKey.trim()] = value;\n this.setAtInMemory(parentPath, updated);\n this.refreshAfterEdit();\n }\n\n private deleteKey(parentPath: string, key: string): void {\n const parent = this.getValueAtPath(parentPath);\n if (!DocksSettingsTree.isRecord(parent)) return;\n const updated = { ...parent };\n delete updated[key];\n this.setAtInMemory(parentPath, updated);\n this.refreshAfterEdit();\n }\n\n private async addKeyToGroup(groupParentPath: string): Promise<void> {\n const key = await promptDialog('New key name:', '');\n if (!key?.trim()) return;\n this.setAtInMemory(`${groupParentPath}.${key.trim()}`, null);\n this.refreshAfterEdit();\n }\n\n private deleteTopLevelKey(key: string): void {\n if (!(key in this.settings)) return;\n const updated = { ...this.settings };\n delete updated[key];\n this.settings = updated;\n this.markDirty(true);\n if (this.selectedPath === key) {\n this.selectedPath = null;\n this.detailForPath = null;\n this.detailRows = [];\n this.detailTitle = '';\n }\n this.buildCategoryTree();\n if (this.selectedPath) this.updateDetailForPath(this.selectedPath);\n }\n\n private renderDetailControl(row: SettingRow): TemplateResult {\n const schema = row.schema;\n const type = schema?.type;\n const enumValues = schema?.enum;\n const current = row.value;\n\n if (enumValues && Array.isArray(enumValues) && enumValues.length > 0) {\n const options = enumValues.map(v => String(v));\n const value = current !== undefined && current !== null ? String(current) : (schema?.default !== undefined ? String(schema.default) : options[0]);\n return html`\n <wa-select\n value=${value}\n @change=${(e: Event) => this.setRowValue(row, (e.target as HTMLSelectElement).value)}\n size=\"s\">\n ${options.map(opt => html`<wa-option value=${opt}>${opt}</wa-option>`)}\n </wa-select>\n `;\n }\n\n if (type === 'boolean') {\n const checked = current === true || (current === undefined && schema?.default === true);\n return html`\n <wa-switch\n ?checked=${checked}\n @change=${(e: Event) => this.setRowValue(row, (e.target as HTMLInputElement).checked)}\n size=\"s\">\n </wa-switch>\n `;\n }\n\n if (type === 'number') {\n const num = typeof current === 'number' ? current : (typeof schema?.default === 'number' ? schema.default : 0);\n return html`\n <wa-number-input\n .value=${String(num)}\n @change=${(e: Event) => this.setRowValue(row, Number((e.target as HTMLInputElement).value))}\n size=\"s\">\n </wa-number-input>\n `;\n }\n\n const isObjectOrArray = current !== null && typeof current === 'object';\n if (isObjectOrArray && !schema && DocksSettingsTree.isRecord(current)) {\n return this.renderObjectFields(row.path, current, 0);\n }\n if (isObjectOrArray) {\n const str = JSON.stringify(current, null, 2);\n return html`\n <wa-textarea\n .value=${str}\n @blur=${(e: Event) => this.setRowValueFromJson(row, (e.target as HTMLTextAreaElement).value)}\n rows=\"3\">\n </wa-textarea>\n `;\n }\n return this.renderPrimitiveControl(row, current);\n }\n\n private renderPrimitiveControl(row: SettingRow, current: unknown): TemplateResult {\n const str = current !== undefined && current !== null ? String(current) : '';\n if (typeof current === 'boolean') {\n return html`\n <wa-switch\n ?checked=${current}\n @change=${(e: Event) => this.setRowValue(row, (e.target as HTMLInputElement).checked)}\n size=\"s\">\n </wa-switch>\n `;\n }\n if (typeof current === 'number') {\n return html`\n <wa-number-input\n .value=${String(current)}\n @change=${(e: Event) => this.setRowValue(row, Number((e.target as HTMLInputElement).value))}\n size=\"s\">\n </wa-number-input>\n `;\n }\n return html`\n <wa-input\n .value=${str}\n @input=${(e: Event) => this.setRowValue(row, (e.target as HTMLInputElement).value)}\n size=\"s\">\n </wa-input>\n `;\n }\n\n private renderObjectFields(parentPath: string, obj: Record<string, unknown>, depth: number): TemplateResult {\n const maxDepth = 2;\n if (depth >= maxDepth) {\n const str = JSON.stringify(obj, null, 2);\n const row: SettingRow = { key: '', path: parentPath, title: '', description: '', value: obj };\n return html`\n <wa-textarea\n .value=${str}\n @blur=${(e: Event) => this.setRowValueFromJson(row, (e.target as HTMLTextAreaElement).value)}\n rows=\"3\">\n </wa-textarea>\n `;\n }\n const entries = Object.entries(obj);\n return html`\n <div class=\"nested-object\" >\n ${entries.map(([k, v]) => {\n const subPath = `${parentPath}.${k}`;\n const subRow: SettingRow = { key: k, path: subPath, title: k, description: '', value: v, parentPath };\n const isNestedObj = DocksSettingsTree.isRecord(v);\n const isArray = Array.isArray(v);\n return html`\n <div class=\"nested-row\">\n <wa-input\n .value=${k}\n size=\"s\"\n style=\"width: 140px;\"\n @blur=${(e: Event) => {\n const newKey = (e.target as HTMLInputElement).value.trim();\n if (newKey && newKey !== k) this.renameKey(parentPath, k, newKey);\n }}>\n </wa-input>\n <span class=\"nested-sep\">:</span>\n ${isNestedObj\n ? this.renderObjectFields(subPath, v as Record<string, unknown>, depth + 1)\n : isArray\n ? html`\n <wa-textarea\n .value=${JSON.stringify(v, null, 2)}\n rows=\"2\"\n style=\"min-width: 200px;\"\n @blur=${(e: Event) => this.setRowValueFromJson(subRow, (e.target as HTMLTextAreaElement).value)}>\n </wa-textarea>\n `\n : this.renderPrimitiveControl(subRow, v)}\n </div>\n `;\n })}\n </div>\n `;\n }\n\n private renderDetailPanel(): TemplateResult {\n if (!this.selectedPath) {\n return html`\n <div class=\"detail-placeholder\">\n ${icon(\"docks settings\", { label: \"Settings\" })}\n <p>Select a category from the tree</p>\n </div>\n `;\n }\n if (this.detailForPath !== this.selectedPath) {\n return html`\n <div class=\"detail-panel\">\n <div class=\"detail-heading-row\">\n <h2 class=\"detail-heading\">${this.selectedPath}</h2>\n </div>\n <div class=\"detail-placeholder\">\n <p>Loading…</p>\n </div>\n </div>\n `;\n }\n\n const filteredRows = this.detailRows.filter(row => {\n if (!this.searchQuery.trim()) return true;\n const q = this.searchQuery.toLowerCase();\n return row.title.toLowerCase().includes(q) || row.description.toLowerCase().includes(q);\n });\n\n const containerValue = this.selectedPath ? this.getValueAtPath(this.selectedPath) : undefined;\n const isObjectContainer = DocksSettingsTree.isRecord(containerValue);\n const isTopLevel = this.selectedPath !== null && !this.selectedPath.includes('.');\n const canAddToSelection = isObjectContainer || isTopLevel;\n\n return html`\n <div class=\"detail-panel\">\n <div class=\"detail-heading-row\">\n <h2 class=\"detail-heading\">${this.detailTitle}</h2>\n ${canAddToSelection ? html`\n <docks-command size=\"s\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(this.selectedPath!)}>Add</docks-command>\n ` : ''}\n ${isTopLevel ? html`\n <docks-command size=\"s\" icon=\"trash\" title=\"Delete category\" .action=${() => this.deleteTopLevelKey(this.selectedPath!)}></docks-command>\n ` : ''}\n </div>\n <wa-scroller class=\"detail-scroller\" orientation=\"vertical\">\n ${filteredRows.length === 0 ? html`\n <div class=\"detail-empty\">\n ${this.detailRows.length === 0\n ? html`<p>No settings in this category. Add keys in the JSON file or register a JSON Schema for this path.</p>`\n : html`<p>No matching settings for the current search.</p>`}\n </div>\n ` : repeat(\n filteredRows,\n (row) => row.path,\n (row, index) => {\n const prev = index > 0 ? filteredRows[index - 1] : null;\n const showGroup = row.groupLabel && prev?.groupLabel !== row.groupLabel;\n const inGroup = !!row.groupLabel;\n return html`\n ${showGroup ? html`\n <div class=\"detail-group-header\">\n <span>${row.groupLabel}</span>\n <docks-command size=\"s\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(row.parentPath!)}>Add</docks-command>\n </div>\n ` : ''}\n <div class=\"setting-row ${inGroup ? 'setting-row-in-group' : ''}\">\n <div class=\"setting-meta\">\n ${row.parentPath != null ? html`\n <wa-input\n .value=${row.key}\n size=\"s\"\n class=\"editable-key setting-control-key\"\n @blur=${(e: Event) => {\n const newKey = (e.target as HTMLInputElement).value.trim();\n if (newKey && newKey !== row.key) this.renameKey(row.parentPath!, row.key, newKey);\n }}>\n </wa-input>\n ` : html`<span class=\"setting-title\">${row.title}</span>`}\n ${row.description ? html`<p class=\"setting-description\">${row.description}</p>` : ''}\n </div>\n <div class=\"setting-control\">${this.renderDetailControl(row)}</div>\n ${row.parentPath != null ? html`\n <docks-command size=\"s\" icon=\"trash\" title=\"Delete setting\" .action=${() => this.deleteKey(row.parentPath!, row.key)}></docks-command>\n ` : ''}\n </div>\n `;\n }\n )}\n </wa-scroller>\n </div>\n `;\n }\n\n private renderCategoryNode(node: CategoryTreeNode): TemplateResult {\n const hasChildren = node.children.length > 0;\n const isSelected = this.selectedPath === node.path;\n\n return html`\n <wa-tree-item ?expanded=${node.expanded}>\n <div\n class=\"tree-node-content ${isSelected ? 'selected' : ''}\"\n @click=${() => this.selectPath(node.path)}\n role=\"button\"\n tabindex=\"0\"\n @keydown=${(e: KeyboardEvent) => e.key === 'Enter' && this.selectPath(node.path)}>\n <span class=\"tree-node-label\">${node.label}</span>\n </div>\n ${hasChildren ? node.children.map(child => this.renderCategoryNode(child)) : ''}\n </wa-tree-item>\n `;\n }\n\n private setAllExpanded(expanded: boolean) {\n const tree = this.treeRef.value;\n if (tree) {\n tree.querySelectorAll('wa-tree-item').forEach((item: Element) => {\n (item as unknown as { expanded: boolean }).expanded = expanded;\n });\n }\n this.categoryTree = this.categoryTree.map(n => this.setExpanded(n, expanded));\n this.requestUpdate();\n }\n\n private setExpanded(node: CategoryTreeNode, expanded: boolean): CategoryTreeNode {\n return {\n ...node,\n expanded,\n children: node.children.map(c => this.setExpanded(c, expanded)),\n };\n }\n\n private async addKey() {\n const key = await promptDialog('Enter new top-level key name:', '');\n if (!key?.trim()) return;\n this.setAtInMemory(key.trim(), null);\n this.markDirty(true);\n this.buildCategoryTree();\n }\n\n override save() {\n appSettings.setAll(this.settings as Record<string, unknown>).then(() => {\n this.markDirty(false);\n }).catch(err => {\n console.error('Failed to save settings:', err);\n });\n }\n\n protected renderToolbar() {\n return html`\n <wa-input\n placeholder=\"Search settings\"\n .value=${this.searchQuery}\n @input=${(e: Event) => {\n this.searchQuery = (e.target as HTMLInputElement).value;\n this.buildCategoryTree();\n }}\n size=\"s\"\n class=\"toolbar-search\">\n </wa-input>\n <docks-command size=\"s\" icon=\"plus\" title=\"Add Key\" .action=${() => this.addKey()}>Add Key</docks-command>\n <docks-command size=\"s\" icon=\"chevron-down\" title=\"Expand All\" .action=${() => this.setAllExpanded(true)}>Expand All</docks-command>\n <docks-command size=\"s\" icon=\"chevron-right\" title=\"Collapse All\" .action=${() => this.setAllExpanded(false)}>Collapse All</docks-command>\n `;\n }\n\n protected renderContent() {\n return html`\n <div class=\"settings-editor-container\">\n <wa-split-panel position=\"25\" class=\"split-panel-fill\">\n <div slot=\"start\" class=\"left-panel\">\n <wa-scroller class=\"tree-scroller\" orientation=\"vertical\">\n ${this.categoryTree.length === 0 ? html`\n <div class=\"empty-state\">\n ${icon(\"docks settings\", { label: \"Settings\" })}\n <p>No settings.</p>\n </div>\n ` : html`\n <wa-tree ${ref(this.treeRef)}>\n ${this.categoryTree.map(node => this.renderCategoryNode(node))}\n </wa-tree>\n `}\n </wa-scroller>\n </div>\n <div slot=\"end\" class=\"right-panel\">\n ${this.renderDetailPanel()}\n </div>\n </wa-split-panel>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .settings-editor-container {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .left-panel, .right-panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n }\n\n .tree-scroller, .detail-scroller {\n flex: 1;\n min-height: 0;\n }\n\n .tree-node-content {\n cursor: pointer;\n user-select: none;\n }\n\n .tree-node-content.selected {\n font-weight: 600;\n }\n\n .detail-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 32px;\n }\n\n .detail-panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .detail-heading-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n padding: 0 16px;\n }\n\n .detail-heading {\n margin: 0;\n flex: 1;\n }\n\n .detail-scroller {\n padding: 0 16px 16px;\n }\n\n .detail-empty {\n padding: 24px 0;\n }\n\n .detail-group-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 12px;\n margin-bottom: 4px;\n }\n\n .detail-group-header:first-child {\n margin-top: 0;\n }\n\n .nested-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n }\n\n .setting-row {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n align-items: flex-start;\n padding: 12px 0;\n }\n\n .setting-row-in-group {\n padding-left: 20px;\n }\n\n .setting-meta {\n flex: 0 0 auto;\n min-width: 140px;\n }\n\n .setting-title {\n font-weight: 600;\n display: block;\n margin-bottom: 4px;\n }\n\n .setting-control {\n flex: 1;\n min-width: 0;\n display: flex;\n }\n\n .setting-row command {\n flex-shrink: 0;\n }\n\n .setting-control wa-input,\n .setting-control wa-textarea,\n .setting-control wa-number-input,\n .setting-control wa-select {\n flex: 1;\n min-width: 0;\n width: 100%;\n }\n\n .setting-meta .setting-control-key {\n width: 160px;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px;\n text-align: center;\n }\n\n .nested-object {\n margin-left: 8px;\n padding-left: 8px;\n border-left: 2px solid var(--wa-color-neutral-85);\n }\n\n .toolbar-search {\n width: 200px;\n margin-right: 8px;\n }\n\n .split-panel-fill {\n height: 100%;\n }\n `;\n}\n","import { html } from \"lit\";\nimport {\n type EditorInput,\n editorRegistry,\n commandRegistry,\n contributionRegistry,\n SIDEBAR_MAIN_TOOLBAR,\n} from \"@eclipse-docks/core\";\nimport \"./settings-tree\";\n\nexport default (_uiContext: unknown) => {\n editorRegistry.registerEditorInputHandler({\n editorId: \"system.settings-tree\",\n label: \"Settings\",\n ranking: 1000,\n canHandle: (input: EditorInput) => input.key === '.system.settings',\n handle: async (input: EditorInput) => {\n input.component = (id: string) => html`\n <docks-settings-tree id=\"${id}\" .input=${input}></docks-settings-tree>\n `;\n return input;\n },\n });\n\n commandRegistry.registerHandler(\"open_settings\", {\n ranking: 100,\n execute: () => {\n const editorInput = {\n title: \"Settings\",\n data: {},\n key: \".system.settings\",\n icon: \"docks settings\",\n state: {},\n } as EditorInput;\n editorRegistry.loadEditor(editorInput);\n },\n });\n\n contributionRegistry.registerContribution(SIDEBAR_MAIN_TOOLBAR, {\n command: \"open_settings\",\n icon: \"docks settings\",\n label: \"Settings\",\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"settings-tree-extension-BdMFQxaf.js","names":[],"sources":["../src/settings-tree.ts","../src/settings-tree-extension.ts"],"sourcesContent":["import { customElement, state, property } from \"lit/decorators.js\";\nimport { css, html, TemplateResult } from \"lit\";\nimport { PropertyValues } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { DocksPart, icon } from \"@eclipse-docks/core\";\nimport type { EditorInput } from \"@eclipse-docks/core\";\nimport { appSettings, TOPIC_SETTINGS_CHANGED } from \"@eclipse-docks/core\";\nimport type { SettingsJsonSchema } from \"@eclipse-docks/core\";\nimport { subscribe } from \"@eclipse-docks/core\";\nimport { promptDialog } from \"@eclipse-docks/core\";\nimport type { SettingsCategoryInfo } from \"@eclipse-docks/core\";\n\ninterface CategoryTreeNode {\n path: string;\n label: string;\n children: CategoryTreeNode[];\n expanded: boolean;\n}\n\ninterface SettingRow {\n key: string;\n path: string;\n title: string;\n description: string;\n schema?: SettingsJsonSchema;\n value: unknown;\n parentPath?: string;\n groupLabel?: string;\n}\n\n@customElement('docks-settings-tree')\nexport class DocksSettingsTree extends DocksPart {\n @property({ attribute: false })\n public input?: EditorInput;\n\n @state()\n private settings: Record<string, unknown> = {};\n\n @state()\n private categoryTree: CategoryTreeNode[] = [];\n\n @state()\n private selectedPath: string | null = null;\n\n @state()\n private detailRows: SettingRow[] = [];\n\n @state()\n private detailTitle = '';\n\n @state()\n private searchQuery = '';\n\n private detailForPath: string | null = null;\n\n private treeRef = createRef<HTMLElement>();\n\n protected async doInitUI() {\n await this.loadSettings();\n subscribe(TOPIC_SETTINGS_CHANGED, () => this.loadSettings());\n }\n\n private async loadSettings() {\n if (this.isDirty()) return;\n this.settings = (await appSettings.getAll()) ?? {};\n this.buildCategoryTree();\n if (this.selectedPath) {\n this.updateDetailForPath(this.selectedPath);\n }\n }\n\n private buildCategoryTree(): void {\n const categories = appSettings.getCategories();\n const schemaIds = new Set(categories.map((c: SettingsCategoryInfo) => c.id));\n const nodes: CategoryTreeNode[] = [];\n\n for (const cat of categories) {\n const childSchema = cat.schema?.properties;\n const value = this.settings[cat.id];\n const children = this.buildChildNodes(`${cat.id}`, childSchema, value);\n const label = (cat.schema?.title as string) ?? cat.label;\n if (this.matchesSearch(label, cat.id)) {\n nodes.push({\n path: cat.id,\n label,\n children,\n expanded: true,\n });\n }\n }\n\n for (const key of Object.keys(this.settings)) {\n if (schemaIds.has(key)) continue;\n const value = this.settings[key];\n const children = this.buildChildNodes(key, undefined, value);\n if (this.matchesSearch(key, key)) {\n nodes.push({\n path: key,\n label: key,\n children,\n expanded: true,\n });\n }\n }\n\n this.categoryTree = nodes;\n }\n\n private buildChildNodes(\n parentPath: string,\n schemaProps: Record<string, SettingsJsonSchema> | undefined,\n value: unknown\n ): CategoryTreeNode[] {\n const children: CategoryTreeNode[] = [];\n if (schemaProps) {\n for (const [k, s] of Object.entries(schemaProps)) {\n const path = `${parentPath}.${k}`;\n const label = (s?.title as string) ?? k;\n const subValue = DocksSettingsTree.isRecord(value) ? value[k] : undefined;\n const subChildren = this.buildChildNodes(path, s?.properties, subValue);\n if (this.matchesSearch(label, path)) {\n children.push({ path, label, children: subChildren, expanded: false });\n }\n }\n }\n if (DocksSettingsTree.isRecord(value) && !schemaProps) {\n for (const [k, v] of Object.entries(value)) {\n const path = `${parentPath}.${k}`;\n const subChildren = this.buildChildNodes(path, undefined, v);\n if (this.matchesSearch(k, path)) {\n children.push({ path, label: k, children: subChildren, expanded: false });\n }\n }\n }\n return children;\n }\n\n private matchesSearch(label: string, path: string): boolean {\n if (!this.searchQuery.trim()) return true;\n const q = this.searchQuery.toLowerCase();\n return label.toLowerCase().includes(q) || path.toLowerCase().includes(q);\n }\n\n private static isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n }\n\n private refreshAfterEdit(): void {\n this.markDirty(true);\n if (this.selectedPath) this.updateDetailForPath(this.selectedPath);\n }\n\n private getValueAtPath(path: string): unknown {\n const parts = path.split('.').filter(Boolean);\n if (parts.length === 0) return this.settings;\n let current: unknown = this.settings;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n }\n\n private setAtInMemory(path: string, value: unknown): void {\n const parts = path.split('.').filter(Boolean);\n if (parts.length === 0) return;\n this.settings = this.deepSet(this.settings as Record<string, unknown>, parts, value) as Record<string, unknown>;\n }\n\n private deepSet(obj: Record<string, unknown> | unknown[], pathParts: string[], value: unknown): Record<string, unknown> | unknown[] {\n if (pathParts.length === 1) {\n const key = pathParts[0];\n if (Array.isArray(obj)) {\n const idx = parseInt(key, 10);\n if (isNaN(idx) || idx < 0) return obj;\n const arr = [...obj];\n arr[idx] = value;\n return arr;\n }\n return { ...(obj as Record<string, unknown>), [key]: value };\n }\n const [head, ...rest] = pathParts;\n if (Array.isArray(obj)) {\n const idx = parseInt(head, 10);\n if (isNaN(idx) || idx < 0) return obj;\n const arr = [...obj];\n const current = arr[idx];\n const next = current !== null && typeof current === 'object'\n ? (current as Record<string, unknown> | unknown[])\n : {};\n arr[idx] = this.deepSet(next as Record<string, unknown>, rest, value);\n return arr;\n }\n const o = obj as Record<string, unknown>;\n const current = o[head];\n const next = current !== null && typeof current === 'object'\n ? (current as Record<string, unknown> | unknown[])\n : {};\n return { ...o, [head]: this.deepSet(next as Record<string, unknown>, rest, value) };\n }\n\n private getArrayItemLabel(item: unknown, index: number): string {\n if (DocksSettingsTree.isRecord(item)) {\n if (typeof item.id === 'string') return item.id;\n if (typeof item.name === 'string') return item.name;\n }\n return `Item ${index}`;\n }\n\n private async updateDetailForPath(path: string): Promise<void> {\n const containerSchema = appSettings.getSchemaForSettingKey(path);\n const containerValue = this.getValueAtPath(path);\n const valueObj = DocksSettingsTree.isRecord(containerValue) ? containerValue : null;\n const isArray = Array.isArray(containerValue);\n\n let rows: SettingRow[];\n\n if (isArray) {\n const arr = containerValue as unknown[];\n const flat: SettingRow[] = [];\n arr.forEach((item, index) => {\n const subPath = `${path}.${index}`;\n const groupLabel = this.getArrayItemLabel(item, index);\n if (DocksSettingsTree.isRecord(item)) {\n Object.keys(item).forEach(k => {\n flat.push({\n key: k,\n path: `${subPath}.${k}`,\n title: k,\n description: '',\n schema: undefined,\n value: item[k],\n parentPath: subPath,\n groupLabel,\n });\n });\n } else {\n flat.push({\n key: String(index),\n path: subPath,\n title: groupLabel,\n description: `Array element ${index}.`,\n schema: undefined,\n value: item,\n parentPath: path,\n groupLabel,\n });\n }\n });\n rows = flat;\n } else if (valueObj !== null) {\n const schemaProps = containerSchema?.properties;\n const keys = schemaProps ? Object.keys(schemaProps) : Object.keys(valueObj);\n rows = keys.map(key => {\n const subPath = `${path}.${key}`;\n const propSchema = schemaProps?.[key];\n const value = valueObj[key];\n return {\n key,\n path: subPath,\n title: (propSchema?.title as string) ?? key,\n description: (propSchema?.description as string) ?? '',\n schema: propSchema,\n value,\n parentPath: path,\n };\n });\n } else if (containerValue !== undefined && containerValue !== null && typeof containerValue !== 'object') {\n const segment = path.split('.').pop() ?? path;\n rows = [{\n key: segment,\n path,\n title: segment,\n description: 'Edit value (no schema).',\n schema: undefined,\n value: containerValue,\n }];\n } else {\n rows = [];\n }\n rows.forEach(r => { if (r.title === undefined) r.title = r.key; });\n\n if (this.selectedPath !== path) return;\n\n const category = appSettings.getCategories().find((c: SettingsCategoryInfo) => c.id === path);\n this.detailForPath = path;\n this.detailTitle = (category?.label ?? (containerSchema?.title as string)) ?? path;\n this.detailRows = rows;\n }\n\n private selectPath(path: string) {\n this.selectedPath = path;\n this.updateDetailForPath(path);\n }\n\n protected updated(changedProperties: PropertyValues) {\n super.updated?.(changedProperties);\n if (changedProperties.has('selectedPath') && this.selectedPath !== this.detailForPath) {\n if (this.selectedPath) this.updateDetailForPath(this.selectedPath);\n else {\n this.detailForPath = null;\n this.detailRows = [];\n this.detailTitle = '';\n }\n }\n }\n\n private setRowValue(row: SettingRow, value: unknown): void {\n this.setAtInMemory(row.path, value);\n this.refreshAfterEdit();\n }\n\n private setRowValueFromJson(row: SettingRow, raw: string): void {\n try {\n this.setRowValue(row, JSON.parse(raw));\n } catch {\n this.refreshAfterEdit();\n }\n }\n\n private renameKey(parentPath: string, oldKey: string, newKey: string): void {\n if (newKey.trim() === '' || newKey === oldKey) return;\n const parent = this.getValueAtPath(parentPath);\n if (!DocksSettingsTree.isRecord(parent)) return;\n const value = parent[oldKey];\n const updated = { ...parent };\n delete updated[oldKey];\n updated[newKey.trim()] = value;\n this.setAtInMemory(parentPath, updated);\n this.refreshAfterEdit();\n }\n\n private deleteKey(parentPath: string, key: string): void {\n const parent = this.getValueAtPath(parentPath);\n if (!DocksSettingsTree.isRecord(parent)) return;\n const updated = { ...parent };\n delete updated[key];\n this.setAtInMemory(parentPath, updated);\n this.refreshAfterEdit();\n }\n\n private async addKeyToGroup(groupParentPath: string): Promise<void> {\n const key = await promptDialog('New key name:', '');\n if (!key?.trim()) return;\n this.setAtInMemory(`${groupParentPath}.${key.trim()}`, null);\n this.refreshAfterEdit();\n }\n\n private deleteTopLevelKey(key: string): void {\n if (!(key in this.settings)) return;\n const updated = { ...this.settings };\n delete updated[key];\n this.settings = updated;\n this.markDirty(true);\n if (this.selectedPath === key) {\n this.selectedPath = null;\n this.detailForPath = null;\n this.detailRows = [];\n this.detailTitle = '';\n }\n this.buildCategoryTree();\n if (this.selectedPath) this.updateDetailForPath(this.selectedPath);\n }\n\n private renderDetailControl(row: SettingRow): TemplateResult {\n const schema = row.schema;\n const type = schema?.type;\n const enumValues = schema?.enum;\n const current = row.value;\n\n if (enumValues && Array.isArray(enumValues) && enumValues.length > 0) {\n const options = enumValues.map(v => String(v));\n const value = current !== undefined && current !== null ? String(current) : (schema?.default !== undefined ? String(schema.default) : options[0]);\n return html`\n <wa-select\n value=${value}\n @change=${(e: Event) => this.setRowValue(row, (e.target as HTMLSelectElement).value)}\n size=\"s\">\n ${options.map(opt => html`<wa-option value=${opt}>${opt}</wa-option>`)}\n </wa-select>\n `;\n }\n\n if (type === 'boolean') {\n const checked = current === true || (current === undefined && schema?.default === true);\n return html`\n <wa-switch\n ?checked=${checked}\n @change=${(e: Event) => this.setRowValue(row, (e.target as HTMLInputElement).checked)}\n size=\"s\">\n </wa-switch>\n `;\n }\n\n if (type === 'number') {\n const num = typeof current === 'number' ? current : (typeof schema?.default === 'number' ? schema.default : 0);\n return html`\n <wa-number-input\n .value=${String(num)}\n @change=${(e: Event) => this.setRowValue(row, Number((e.target as HTMLInputElement).value))}\n size=\"s\">\n </wa-number-input>\n `;\n }\n\n const isObjectOrArray = current !== null && typeof current === 'object';\n if (isObjectOrArray && !schema && DocksSettingsTree.isRecord(current)) {\n return this.renderObjectFields(row.path, current, 0);\n }\n if (isObjectOrArray) {\n const str = JSON.stringify(current, null, 2);\n return html`\n <wa-textarea\n .value=${str}\n @blur=${(e: Event) => this.setRowValueFromJson(row, (e.target as HTMLTextAreaElement).value)}\n rows=\"3\">\n </wa-textarea>\n `;\n }\n return this.renderPrimitiveControl(row, current);\n }\n\n private renderPrimitiveControl(row: SettingRow, current: unknown): TemplateResult {\n const str = current !== undefined && current !== null ? String(current) : '';\n if (typeof current === 'boolean') {\n return html`\n <wa-switch\n ?checked=${current}\n @change=${(e: Event) => this.setRowValue(row, (e.target as HTMLInputElement).checked)}\n size=\"s\">\n </wa-switch>\n `;\n }\n if (typeof current === 'number') {\n return html`\n <wa-number-input\n .value=${String(current)}\n @change=${(e: Event) => this.setRowValue(row, Number((e.target as HTMLInputElement).value))}\n size=\"s\">\n </wa-number-input>\n `;\n }\n return html`\n <wa-input\n .value=${str}\n @input=${(e: Event) => this.setRowValue(row, (e.target as HTMLInputElement).value)}\n size=\"s\">\n </wa-input>\n `;\n }\n\n private renderObjectFields(parentPath: string, obj: Record<string, unknown>, depth: number): TemplateResult {\n const maxDepth = 2;\n if (depth >= maxDepth) {\n const str = JSON.stringify(obj, null, 2);\n const row: SettingRow = { key: '', path: parentPath, title: '', description: '', value: obj };\n return html`\n <wa-textarea\n .value=${str}\n @blur=${(e: Event) => this.setRowValueFromJson(row, (e.target as HTMLTextAreaElement).value)}\n rows=\"3\">\n </wa-textarea>\n `;\n }\n const entries = Object.entries(obj);\n return html`\n <div class=\"nested-object\" >\n ${entries.map(([k, v]) => {\n const subPath = `${parentPath}.${k}`;\n const subRow: SettingRow = { key: k, path: subPath, title: k, description: '', value: v, parentPath };\n const isNestedObj = DocksSettingsTree.isRecord(v);\n const isArray = Array.isArray(v);\n return html`\n <div class=\"nested-row\">\n <wa-input\n .value=${k}\n size=\"s\"\n style=\"width: 140px;\"\n @blur=${(e: Event) => {\n const newKey = (e.target as HTMLInputElement).value.trim();\n if (newKey && newKey !== k) this.renameKey(parentPath, k, newKey);\n }}>\n </wa-input>\n <span class=\"nested-sep\">:</span>\n ${isNestedObj\n ? this.renderObjectFields(subPath, v as Record<string, unknown>, depth + 1)\n : isArray\n ? html`\n <wa-textarea\n .value=${JSON.stringify(v, null, 2)}\n rows=\"2\"\n style=\"min-width: 200px;\"\n @blur=${(e: Event) => this.setRowValueFromJson(subRow, (e.target as HTMLTextAreaElement).value)}>\n </wa-textarea>\n `\n : this.renderPrimitiveControl(subRow, v)}\n </div>\n `;\n })}\n </div>\n `;\n }\n\n private renderDetailPanel(): TemplateResult {\n if (!this.selectedPath) {\n return html`\n <div class=\"detail-placeholder\">\n ${icon(\"docks settings\", { label: \"Settings\" })}\n <p>Select a category from the tree</p>\n </div>\n `;\n }\n if (this.detailForPath !== this.selectedPath) {\n return html`\n <div class=\"detail-panel\">\n <div class=\"detail-heading-row\">\n <h2 class=\"detail-heading\">${this.selectedPath}</h2>\n </div>\n <div class=\"detail-placeholder\">\n <p>Loading…</p>\n </div>\n </div>\n `;\n }\n\n const filteredRows = this.detailRows.filter(row => {\n if (!this.searchQuery.trim()) return true;\n const q = this.searchQuery.toLowerCase();\n return row.title.toLowerCase().includes(q) || row.description.toLowerCase().includes(q);\n });\n\n const containerValue = this.selectedPath ? this.getValueAtPath(this.selectedPath) : undefined;\n const isObjectContainer = DocksSettingsTree.isRecord(containerValue);\n const isTopLevel = this.selectedPath !== null && !this.selectedPath.includes('.');\n const canAddToSelection = isObjectContainer || isTopLevel;\n\n return html`\n <div class=\"detail-panel\">\n <div class=\"detail-heading-row\">\n <h2 class=\"detail-heading\">${this.detailTitle}</h2>\n ${canAddToSelection ? html`\n <docks-command size=\"s\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(this.selectedPath!)}>Add</docks-command>\n ` : ''}\n ${isTopLevel ? html`\n <docks-command size=\"s\" icon=\"trash\" title=\"Delete category\" .action=${() => this.deleteTopLevelKey(this.selectedPath!)}></docks-command>\n ` : ''}\n </div>\n <wa-scroller class=\"detail-scroller\" orientation=\"vertical\">\n ${filteredRows.length === 0 ? html`\n <div class=\"detail-empty\">\n ${this.detailRows.length === 0\n ? html`<p>No settings in this category. Add keys in the JSON file or register a JSON Schema for this path.</p>`\n : html`<p>No matching settings for the current search.</p>`}\n </div>\n ` : repeat(\n filteredRows,\n (row) => row.path,\n (row, index) => {\n const prev = index > 0 ? filteredRows[index - 1] : null;\n const showGroup = row.groupLabel && prev?.groupLabel !== row.groupLabel;\n const inGroup = !!row.groupLabel;\n return html`\n ${showGroup ? html`\n <div class=\"detail-group-header\">\n <span>${row.groupLabel}</span>\n <docks-command size=\"s\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(row.parentPath!)}>Add</docks-command>\n </div>\n ` : ''}\n <div class=\"setting-row ${inGroup ? 'setting-row-in-group' : ''}\">\n <div class=\"setting-meta\">\n ${row.parentPath != null ? html`\n <wa-input\n .value=${row.key}\n size=\"s\"\n class=\"editable-key setting-control-key\"\n @blur=${(e: Event) => {\n const newKey = (e.target as HTMLInputElement).value.trim();\n if (newKey && newKey !== row.key) this.renameKey(row.parentPath!, row.key, newKey);\n }}>\n </wa-input>\n ` : html`<span class=\"setting-title\">${row.title}</span>`}\n ${row.description ? html`<p class=\"setting-description\">${row.description}</p>` : ''}\n </div>\n <div class=\"setting-control\">${this.renderDetailControl(row)}</div>\n ${row.parentPath != null ? html`\n <docks-command size=\"s\" icon=\"trash\" title=\"Delete setting\" .action=${() => this.deleteKey(row.parentPath!, row.key)}></docks-command>\n ` : ''}\n </div>\n `;\n }\n )}\n </wa-scroller>\n </div>\n `;\n }\n\n private renderCategoryNode(node: CategoryTreeNode): TemplateResult {\n const hasChildren = node.children.length > 0;\n const isSelected = this.selectedPath === node.path;\n\n return html`\n <wa-tree-item ?expanded=${node.expanded}>\n <div\n class=\"tree-node-content ${isSelected ? 'selected' : ''}\"\n @click=${() => this.selectPath(node.path)}\n role=\"button\"\n tabindex=\"0\"\n @keydown=${(e: KeyboardEvent) => e.key === 'Enter' && this.selectPath(node.path)}>\n <span class=\"tree-node-label\">${node.label}</span>\n </div>\n ${hasChildren ? node.children.map(child => this.renderCategoryNode(child)) : ''}\n </wa-tree-item>\n `;\n }\n\n private setAllExpanded(expanded: boolean) {\n const tree = this.treeRef.value;\n if (tree) {\n tree.querySelectorAll('wa-tree-item').forEach((item: Element) => {\n (item as unknown as { expanded: boolean }).expanded = expanded;\n });\n }\n this.categoryTree = this.categoryTree.map(n => this.setExpanded(n, expanded));\n this.requestUpdate();\n }\n\n private setExpanded(node: CategoryTreeNode, expanded: boolean): CategoryTreeNode {\n return {\n ...node,\n expanded,\n children: node.children.map(c => this.setExpanded(c, expanded)),\n };\n }\n\n private async addKey() {\n const key = await promptDialog('Enter new top-level key name:', '');\n if (!key?.trim()) return;\n this.setAtInMemory(key.trim(), null);\n this.markDirty(true);\n this.buildCategoryTree();\n }\n\n override save() {\n appSettings.setAll(this.settings as Record<string, unknown>).then(() => {\n this.markDirty(false);\n }).catch(err => {\n console.error('Failed to save settings:', err);\n });\n }\n\n protected renderToolbar() {\n return html`\n <wa-input\n placeholder=\"Search settings\"\n .value=${this.searchQuery}\n @input=${(e: Event) => {\n this.searchQuery = (e.target as HTMLInputElement).value;\n this.buildCategoryTree();\n }}\n size=\"s\"\n class=\"toolbar-search\">\n </wa-input>\n <docks-command size=\"s\" icon=\"plus\" title=\"Add Key\" .action=${() => this.addKey()}>Add Key</docks-command>\n <docks-command size=\"s\" icon=\"chevron-down\" title=\"Expand All\" .action=${() => this.setAllExpanded(true)}>Expand All</docks-command>\n <docks-command size=\"s\" icon=\"chevron-right\" title=\"Collapse All\" .action=${() => this.setAllExpanded(false)}>Collapse All</docks-command>\n `;\n }\n\n protected renderContent() {\n return html`\n <div class=\"settings-editor-container\">\n <wa-split-panel position=\"25\" class=\"split-panel-fill\">\n <div slot=\"start\" class=\"left-panel\">\n <wa-scroller class=\"tree-scroller\" orientation=\"vertical\">\n ${this.categoryTree.length === 0 ? html`\n <div class=\"empty-state\">\n ${icon(\"docks settings\", { label: \"Settings\" })}\n <p>No settings.</p>\n </div>\n ` : html`\n <wa-tree ${ref(this.treeRef)}>\n ${this.categoryTree.map(node => this.renderCategoryNode(node))}\n </wa-tree>\n `}\n </wa-scroller>\n </div>\n <div slot=\"end\" class=\"right-panel\">\n ${this.renderDetailPanel()}\n </div>\n </wa-split-panel>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .settings-editor-container {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .left-panel, .right-panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n }\n\n .tree-scroller, .detail-scroller {\n flex: 1;\n min-height: 0;\n }\n\n .tree-node-content {\n cursor: pointer;\n user-select: none;\n }\n\n .tree-node-content.selected {\n font-weight: 600;\n }\n\n .detail-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 32px;\n }\n\n .detail-panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .detail-heading-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n padding: 0 16px;\n }\n\n .detail-heading {\n margin: 0;\n flex: 1;\n }\n\n .detail-scroller {\n padding: 0 16px 16px;\n }\n\n .detail-empty {\n padding: 24px 0;\n }\n\n .detail-group-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 12px;\n margin-bottom: 4px;\n }\n\n .detail-group-header:first-child {\n margin-top: 0;\n }\n\n .nested-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n }\n\n .setting-row {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n align-items: flex-start;\n padding: 12px 0;\n }\n\n .setting-row-in-group {\n padding-left: 20px;\n }\n\n .setting-meta {\n flex: 0 0 auto;\n min-width: 140px;\n }\n\n .setting-title {\n font-weight: 600;\n display: block;\n margin-bottom: 4px;\n }\n\n .setting-control {\n flex: 1;\n min-width: 0;\n display: flex;\n }\n\n .setting-row command {\n flex-shrink: 0;\n }\n\n .setting-control wa-input,\n .setting-control wa-textarea,\n .setting-control wa-number-input,\n .setting-control wa-select {\n flex: 1;\n min-width: 0;\n width: 100%;\n }\n\n .setting-meta .setting-control-key {\n width: 160px;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px;\n text-align: center;\n }\n\n .nested-object {\n margin-left: 8px;\n padding-left: 8px;\n border-left: 2px solid var(--wa-color-neutral-85);\n }\n\n .toolbar-search {\n width: 200px;\n margin-right: 8px;\n }\n\n .split-panel-fill {\n height: 100%;\n }\n `;\n}\n","import { html } from \"lit\";\nimport {\n type EditorInput,\n editorRegistry,\n commandRegistry,\n contributionRegistry,\n SIDEBAR_MAIN_TOOLBAR,\n} from \"@eclipse-docks/core\";\nimport \"./settings-tree\";\n\nexport default (_uiContext: unknown) => {\n editorRegistry.registerEditorInputHandler({\n editorId: \"system.settings-tree\",\n label: \"Settings\",\n ranking: 1000,\n canHandle: (input: EditorInput) => input.key === '.system.settings',\n handle: async (input: EditorInput) => {\n input.component = (id: string) => html`\n <docks-settings-tree id=\"${id}\" .input=${input}></docks-settings-tree>\n `;\n return input;\n },\n });\n\n commandRegistry.registerHandler(\"open_settings\", {\n ranking: 100,\n execute: () => {\n const editorInput = {\n title: \"Settings\",\n data: {},\n key: \".system.settings\",\n icon: \"docks settings\",\n state: {},\n } as EditorInput;\n editorRegistry.loadEditor(editorInput);\n },\n });\n\n contributionRegistry.registerContribution(SIDEBAR_MAIN_TOOLBAR, {\n command: \"open_settings\",\n icon: \"docks settings\",\n label: \"Settings\",\n });\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/extension-settings-tree",
3
- "version": "0.7.130",
3
+ "version": "0.7.132",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {