@eclipse-docks/extension-settings-tree 0.7.127 → 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.
- package/dist/{i18n.de-BNVmjm3M.js → i18n.de-2oUWFl6d.js} +1 -1
- package/dist/{i18n.de-BNVmjm3M.js.map → i18n.de-2oUWFl6d.js.map} +1 -1
- package/dist/{i18n.en-4qIo7_K0.js → i18n.en-SG0YCiww.js} +1 -1
- package/dist/{i18n.en-4qIo7_K0.js.map → i18n.en-SG0YCiww.js.map} +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/{settings-tree-extension-BCSbBt-O.js → settings-tree-extension-BdMFQxaf.js} +24 -13
- package/dist/{settings-tree-extension-BCSbBt-O.js.map → settings-tree-extension-BdMFQxaf.js.map} +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.de-
|
|
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":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.en-
|
|
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(/*
|
|
5
|
-
"./i18n.de.json": () => import("./i18n.de-
|
|
6
|
-
"./i18n.en.json": () => import("./i18n.en-
|
|
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-
|
|
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,
|
|
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)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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=${
|
|
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")
|
|
311
|
+
if (type === "boolean") {
|
|
312
|
+
const checked = current === true || current === void 0 && schema?.default === true;
|
|
313
|
+
return html`
|
|
309
314
|
<wa-switch
|
|
310
|
-
?checked=${
|
|
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)
|
|
333
|
+
if (isObjectOrArray) {
|
|
334
|
+
const str = JSON.stringify(current, null, 2);
|
|
335
|
+
return html`
|
|
328
336
|
<wa-textarea
|
|
329
|
-
.value=${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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-
|
|
803
|
+
//# sourceMappingURL=settings-tree-extension-BdMFQxaf.js.map
|
package/dist/{settings-tree-extension-BCSbBt-O.js.map → settings-tree-extension-BdMFQxaf.js.map}
RENAMED
|
@@ -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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"}
|