@eclipse-docks/extension-settings-tree 0.7.122 → 0.7.125

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.
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ 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-DMI1UwEH.js"),
12
+ loader: () => import("./settings-tree-extension-BCSbBt-O.js"),
13
13
  icon: "sitemap"
14
14
  });
15
15
  //#endregion
@@ -300,7 +300,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
300
300
  <wa-select
301
301
  value=${current !== void 0 && current !== null ? String(current) : schema?.default !== void 0 ? String(schema.default) : options[0]}
302
302
  @change=${(e) => this.setRowValue(row, e.target.value)}
303
- size="small">
303
+ size="s">
304
304
  ${options.map((opt) => html`<wa-option value=${opt}>${opt}</wa-option>`)}
305
305
  </wa-select>
306
306
  `;
@@ -309,7 +309,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
309
309
  <wa-switch
310
310
  ?checked=${current === true || current === void 0 && schema?.default === true}
311
311
  @change=${(e) => this.setRowValue(row, e.target.checked)}
312
- size="small">
312
+ size="s">
313
313
  </wa-switch>
314
314
  `;
315
315
  if (type === "number") {
@@ -318,7 +318,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
318
318
  <wa-number-input
319
319
  .value=${String(num)}
320
320
  @change=${(e) => this.setRowValue(row, Number(e.target.value))}
321
- size="small">
321
+ size="s">
322
322
  </wa-number-input>
323
323
  `;
324
324
  }
@@ -339,21 +339,21 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
339
339
  <wa-switch
340
340
  ?checked=${current}
341
341
  @change=${(e) => this.setRowValue(row, e.target.checked)}
342
- size="small">
342
+ size="s">
343
343
  </wa-switch>
344
344
  `;
345
345
  if (typeof current === "number") return html`
346
346
  <wa-number-input
347
347
  .value=${String(current)}
348
348
  @change=${(e) => this.setRowValue(row, Number(e.target.value))}
349
- size="small">
349
+ size="s">
350
350
  </wa-number-input>
351
351
  `;
352
352
  return html`
353
353
  <wa-input
354
354
  .value=${str}
355
355
  @input=${(e) => this.setRowValue(row, e.target.value)}
356
- size="small">
356
+ size="s">
357
357
  </wa-input>
358
358
  `;
359
359
  }
@@ -391,7 +391,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
391
391
  <div class="nested-row">
392
392
  <wa-input
393
393
  .value=${k}
394
- size="small"
394
+ size="s"
395
395
  style="width: 140px;"
396
396
  @blur=${(e) => {
397
397
  const newKey = e.target.value.trim();
@@ -444,10 +444,10 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
444
444
  <div class="detail-heading-row">
445
445
  <h2 class="detail-heading">${this.detailTitle}</h2>
446
446
  ${canAddToSelection ? html`
447
- <docks-command size="small" icon="plus" title="Add setting" .action=${() => this.addKeyToGroup(this.selectedPath)}>Add</docks-command>
447
+ <docks-command size="s" icon="plus" title="Add setting" .action=${() => this.addKeyToGroup(this.selectedPath)}>Add</docks-command>
448
448
  ` : ""}
449
449
  ${isTopLevel ? html`
450
- <docks-command size="small" icon="trash" title="Delete category" .action=${() => this.deleteTopLevelKey(this.selectedPath)}></docks-command>
450
+ <docks-command size="s" icon="trash" title="Delete category" .action=${() => this.deleteTopLevelKey(this.selectedPath)}></docks-command>
451
451
  ` : ""}
452
452
  </div>
453
453
  <wa-scroller class="detail-scroller" orientation="vertical">
@@ -463,7 +463,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
463
463
  ${showGroup ? html`
464
464
  <div class="detail-group-header">
465
465
  <span>${row.groupLabel}</span>
466
- <docks-command size="small" icon="plus" title="Add setting" .action=${() => this.addKeyToGroup(row.parentPath)}>Add</docks-command>
466
+ <docks-command size="s" icon="plus" title="Add setting" .action=${() => this.addKeyToGroup(row.parentPath)}>Add</docks-command>
467
467
  </div>
468
468
  ` : ""}
469
469
  <div class="setting-row ${inGroup ? "setting-row-in-group" : ""}">
@@ -471,7 +471,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
471
471
  ${row.parentPath != null ? html`
472
472
  <wa-input
473
473
  .value=${row.key}
474
- size="small"
474
+ size="s"
475
475
  class="editable-key setting-control-key"
476
476
  @blur=${(e) => {
477
477
  const newKey = e.target.value.trim();
@@ -483,7 +483,7 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
483
483
  </div>
484
484
  <div class="setting-control">${this.renderDetailControl(row)}</div>
485
485
  ${row.parentPath != null ? html`
486
- <docks-command size="small" icon="trash" title="Delete setting" .action=${() => this.deleteKey(row.parentPath, row.key)}></docks-command>
486
+ <docks-command size="s" icon="trash" title="Delete setting" .action=${() => this.deleteKey(row.parentPath, row.key)}></docks-command>
487
487
  ` : ""}
488
488
  </div>
489
489
  `;
@@ -547,12 +547,12 @@ var DocksSettingsTree = class DocksSettingsTree extends DocksPart {
547
547
  this.searchQuery = e.target.value;
548
548
  this.buildCategoryTree();
549
549
  }}
550
- size="small"
550
+ size="s"
551
551
  class="toolbar-search">
552
552
  </wa-input>
553
- <docks-command size="small" icon="plus" title="Add Key" .action=${() => this.addKey()}>Add Key</docks-command>
554
- <docks-command size="small" icon="chevron-down" title="Expand All" .action=${() => this.setAllExpanded(true)}>Expand All</docks-command>
555
- <docks-command size="small" icon="chevron-right" title="Collapse All" .action=${() => this.setAllExpanded(false)}>Collapse All</docks-command>
553
+ <docks-command size="s" icon="plus" title="Add Key" .action=${() => this.addKey()}>Add Key</docks-command>
554
+ <docks-command size="s" icon="chevron-down" title="Expand All" .action=${() => this.setAllExpanded(true)}>Expand All</docks-command>
555
+ <docks-command size="s" icon="chevron-right" title="Collapse All" .action=${() => this.setAllExpanded(false)}>Collapse All</docks-command>
556
556
  `;
557
557
  }
558
558
  renderContent() {
@@ -789,4 +789,4 @@ var settings_tree_extension_default = (_uiContext) => {
789
789
  //#endregion
790
790
  export { settings_tree_extension_default as default };
791
791
 
792
- //# sourceMappingURL=settings-tree-extension-DMI1UwEH.js.map
792
+ //# sourceMappingURL=settings-tree-extension-BCSbBt-O.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-tree-extension-DMI1UwEH.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=\"small\">\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=\"small\">\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=\"small\">\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=\"small\">\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=\"small\">\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=\"small\">\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=\"small\"\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=\"small\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(this.selectedPath!)}>Add</docks-command>\n ` : ''}\n ${isTopLevel ? html`\n <docks-command size=\"small\" 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=\"small\" 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=\"small\"\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=\"small\" 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=\"small\"\n class=\"toolbar-search\">\n </wa-input>\n <docks-command size=\"small\" icon=\"plus\" title=\"Add Key\" .action=${() => this.addKey()}>Add Key</docks-command>\n <docks-command size=\"small\" icon=\"chevron-down\" title=\"Expand All\" .action=${() => this.setAllExpanded(true)}>Expand All</docks-command>\n <docks-command size=\"small\" 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-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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/extension-settings-tree",
3
- "version": "0.7.122",
3
+ "version": "0.7.125",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {