@eclipse-lyra/extension-settings-tree 0.0.0 → 0.7.6
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
|
@@ -14,7 +14,7 @@ extensionRegistry.registerExtension({
|
|
|
14
14
|
id: pkg.name,
|
|
15
15
|
name: t("EXT_SETTINGS_TREE_NAME"),
|
|
16
16
|
description: t("EXT_SETTINGS_TREE_DESC"),
|
|
17
|
-
loader: () => import("./settings-tree-extension-
|
|
17
|
+
loader: () => import("./settings-tree-extension-DCp2IoUR.js"),
|
|
18
18
|
icon: "sitemap"
|
|
19
19
|
});
|
|
20
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -798,7 +798,7 @@ const settingsTreeExtension = (_uiContext) => {
|
|
|
798
798
|
ranking: 1e3,
|
|
799
799
|
canHandle: (input) => input.key === ".system.settings",
|
|
800
800
|
handle: async (input) => {
|
|
801
|
-
input.
|
|
801
|
+
input.component = () => html`
|
|
802
802
|
<lyra-settings-tree .input=${input}></lyra-settings-tree>
|
|
803
803
|
`;
|
|
804
804
|
return input;
|
|
@@ -826,4 +826,4 @@ const settingsTreeExtension = (_uiContext) => {
|
|
|
826
826
|
export {
|
|
827
827
|
settingsTreeExtension as default
|
|
828
828
|
};
|
|
829
|
-
//# sourceMappingURL=settings-tree-extension-
|
|
829
|
+
//# sourceMappingURL=settings-tree-extension-DCp2IoUR.js.map
|
package/dist/{settings-tree-extension-DtA6nTuF.js.map → settings-tree-extension-DCp2IoUR.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-tree-extension-DtA6nTuF.js","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 { LyraPart } from \"@eclipse-lyra/core\";\nimport type { EditorInput } from \"@eclipse-lyra/core\";\nimport { appSettings, TOPIC_SETTINGS_CHANGED } from \"@eclipse-lyra/core\";\nimport type { SettingsJsonSchema } from \"@eclipse-lyra/core\";\nimport { subscribe } from \"@eclipse-lyra/core\";\nimport { promptDialog } from \"@eclipse-lyra/core\";\nimport type { SettingsCategoryInfo } from \"@eclipse-lyra/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('lyra-settings-tree')\nexport class LyraSettingsTree extends LyraPart {\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 = LyraSettingsTree.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 (LyraSettingsTree.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 (LyraSettingsTree.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 = LyraSettingsTree.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 (LyraSettingsTree.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 (!LyraSettingsTree.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 (!LyraSettingsTree.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 && LyraSettingsTree.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 = LyraSettingsTree.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 <wa-icon name=\"gear\"></wa-icon>\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 = LyraSettingsTree.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 <lyra-command size=\"small\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(this.selectedPath!)}>Add</lyra-command>\n ` : ''}\n ${isTopLevel ? html`\n <lyra-command size=\"small\" icon=\"trash\" title=\"Delete category\" .action=${() => this.deleteTopLevelKey(this.selectedPath!)}></lyra-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 <lyra-command size=\"small\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(row.parentPath!)}>Add</lyra-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 <lyra-command size=\"small\" icon=\"trash\" title=\"Delete setting\" .action=${() => this.deleteKey(row.parentPath!, row.key)}></lyra-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 <lyra-command size=\"small\" icon=\"plus\" title=\"Add Key\" .action=${() => this.addKey()}>Add Key</lyra-command>\n <lyra-command size=\"small\" icon=\"chevron-down\" title=\"Expand All\" .action=${() => this.setAllExpanded(true)}>Expand All</lyra-command>\n <lyra-command size=\"small\" icon=\"chevron-right\" title=\"Collapse All\" .action=${() => this.setAllExpanded(false)}>Collapse All</lyra-command>\n `;\n }\n\n render() {\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 <wa-icon name=\"gear\"></wa-icon>\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 TOOLBAR_MAIN_RIGHT,\n} from \"@eclipse-lyra/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.widgetFactory = () => html`\n <lyra-settings-tree .input=${input}></lyra-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: \"gear\",\n state: {},\n } as EditorInput;\n editorRegistry.loadEditor(editorInput);\n },\n });\n\n contributionRegistry.registerContribution(TOOLBAR_MAIN_RIGHT, {\n command: \"open_settings\",\n icon: \"gear\",\n label: \"Settings\",\n });\n};\n"],"names":["current","next"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settings-tree-extension-DCp2IoUR.js","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 { LyraPart } from \"@eclipse-lyra/core\";\nimport type { EditorInput } from \"@eclipse-lyra/core\";\nimport { appSettings, TOPIC_SETTINGS_CHANGED } from \"@eclipse-lyra/core\";\nimport type { SettingsJsonSchema } from \"@eclipse-lyra/core\";\nimport { subscribe } from \"@eclipse-lyra/core\";\nimport { promptDialog } from \"@eclipse-lyra/core\";\nimport type { SettingsCategoryInfo } from \"@eclipse-lyra/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('lyra-settings-tree')\nexport class LyraSettingsTree extends LyraPart {\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 = LyraSettingsTree.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 (LyraSettingsTree.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 (LyraSettingsTree.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 = LyraSettingsTree.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 (LyraSettingsTree.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 (!LyraSettingsTree.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 (!LyraSettingsTree.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 && LyraSettingsTree.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 = LyraSettingsTree.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 <wa-icon name=\"gear\"></wa-icon>\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 = LyraSettingsTree.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 <lyra-command size=\"small\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(this.selectedPath!)}>Add</lyra-command>\n ` : ''}\n ${isTopLevel ? html`\n <lyra-command size=\"small\" icon=\"trash\" title=\"Delete category\" .action=${() => this.deleteTopLevelKey(this.selectedPath!)}></lyra-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 <lyra-command size=\"small\" icon=\"plus\" title=\"Add setting\" .action=${() => this.addKeyToGroup(row.parentPath!)}>Add</lyra-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 <lyra-command size=\"small\" icon=\"trash\" title=\"Delete setting\" .action=${() => this.deleteKey(row.parentPath!, row.key)}></lyra-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 <lyra-command size=\"small\" icon=\"plus\" title=\"Add Key\" .action=${() => this.addKey()}>Add Key</lyra-command>\n <lyra-command size=\"small\" icon=\"chevron-down\" title=\"Expand All\" .action=${() => this.setAllExpanded(true)}>Expand All</lyra-command>\n <lyra-command size=\"small\" icon=\"chevron-right\" title=\"Collapse All\" .action=${() => this.setAllExpanded(false)}>Collapse All</lyra-command>\n `;\n }\n\n render() {\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 <wa-icon name=\"gear\"></wa-icon>\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 TOOLBAR_MAIN_RIGHT,\n} from \"@eclipse-lyra/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 = () => html`\n <lyra-settings-tree .input=${input}></lyra-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: \"gear\",\n state: {},\n } as EditorInput;\n editorRegistry.loadEditor(editorInput);\n },\n });\n\n contributionRegistry.registerContribution(TOOLBAR_MAIN_RIGHT, {\n command: \"open_settings\",\n icon: \"gear\",\n label: \"Settings\",\n });\n};\n"],"names":["current","next"],"mappings":";;;;;;;;;;;;;;;AAgCO,IAAM,mBAAN,cAA+B,SAAS;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA;AAKH,SAAQ,WAAoC,CAAA;AAG5C,SAAQ,eAAmC,CAAA;AAG3C,SAAQ,eAA8B;AAGtC,SAAQ,aAA2B,CAAA;AAGnC,SAAQ,cAAc;AAGtB,SAAQ,cAAc;AAEtB,SAAQ,gBAA+B;AAEvC,SAAQ,UAAU,UAAA;AAAA,EAAuB;AAAA,EAEzC,MAAgB,WAAW;AACvB,UAAM,KAAK,aAAA;AACX,cAAU,wBAAwB,MAAM,KAAK,aAAA,CAAc;AAAA,EAC/D;AAAA,EAEA,MAAc,eAAe;AACzB,QAAI,KAAK,UAAW;AACpB,SAAK,WAAY,MAAM,YAAY,OAAA,KAAa,CAAA;AAChD,SAAK,kBAAA;AACL,QAAI,KAAK,cAAc;AACnB,WAAK,oBAAoB,KAAK,YAAY;AAAA,IAC9C;AAAA,EACJ;AAAA,EAEQ,oBAA0B;AAC9B,UAAM,aAAa,YAAY,cAAA;AAC/B,UAAM,YAAY,IAAI,IAAI,WAAW,IAAI,CAAC,MAA4B,EAAE,EAAE,CAAC;AAC3E,UAAM,QAA4B,CAAA;AAElC,eAAW,OAAO,YAAY;AAC1B,YAAM,cAAc,IAAI,QAAQ;AAChC,YAAM,QAAQ,KAAK,SAAS,IAAI,EAAE;AAClC,YAAM,WAAW,KAAK,gBAAgB,GAAG,IAAI,EAAE,IAAI,aAAa,KAAK;AACrE,YAAM,QAAS,IAAI,QAAQ,SAAoB,IAAI;AACnD,UAAI,KAAK,cAAc,OAAO,IAAI,EAAE,GAAG;AACnC,cAAM,KAAK;AAAA,UACP,MAAM,IAAI;AAAA,UACV;AAAA,UACA;AAAA,UACA,UAAU;AAAA,QAAA,CACb;AAAA,MACL;AAAA,IACJ;AAEA,eAAW,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG;AAC1C,UAAI,UAAU,IAAI,GAAG,EAAG;AACxB,YAAM,QAAQ,KAAK,SAAS,GAAG;AAC/B,YAAM,WAAW,KAAK,gBAAgB,KAAK,QAAW,KAAK;AAC3D,UAAI,KAAK,cAAc,KAAK,GAAG,GAAG;AAC9B,cAAM,KAAK;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,QAAA,CACb;AAAA,MACL;AAAA,IACJ;AAEA,SAAK,eAAe;AAAA,EACxB;AAAA,EAEQ,gBACJ,YACA,aACA,OACkB;AAClB,UAAM,WAA+B,CAAA;AACrC,QAAI,aAAa;AACb,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC9C,cAAM,OAAO,GAAG,UAAU,IAAI,CAAC;AAC/B,cAAM,QAAS,GAAG,SAAoB;AACtC,cAAM,WAAW,iBAAiB,SAAS,KAAK,IAAI,MAAM,CAAC,IAAI;AAC/D,cAAM,cAAc,KAAK,gBAAgB,MAAM,GAAG,YAAY,QAAQ;AACtE,YAAI,KAAK,cAAc,OAAO,IAAI,GAAG;AACjC,mBAAS,KAAK,EAAE,MAAM,OAAO,UAAU,aAAa,UAAU,OAAO;AAAA,QACzE;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,iBAAiB,SAAS,KAAK,KAAK,CAAC,aAAa;AAClD,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxC,cAAM,OAAO,GAAG,UAAU,IAAI,CAAC;AAC/B,cAAM,cAAc,KAAK,gBAAgB,MAAM,QAAW,CAAC;AAC3D,YAAI,KAAK,cAAc,GAAG,IAAI,GAAG;AAC7B,mBAAS,KAAK,EAAE,MAAM,OAAO,GAAG,UAAU,aAAa,UAAU,OAAO;AAAA,QAC5E;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,cAAc,OAAe,MAAuB;AACxD,QAAI,CAAC,KAAK,YAAY,KAAA,EAAQ,QAAO;AACrC,UAAM,IAAI,KAAK,YAAY,YAAA;AAC3B,WAAO,MAAM,YAAA,EAAc,SAAS,CAAC,KAAK,KAAK,YAAA,EAAc,SAAS,CAAC;AAAA,EAC3E;AAAA,EAEA,OAAe,SAAS,GAA0C;AAC9D,WAAO,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAAA,EAClE;AAAA,EAEQ,mBAAyB;AAC7B,SAAK,UAAU,IAAI;AACnB,QAAI,KAAK,aAAc,MAAK,oBAAoB,KAAK,YAAY;AAAA,EACrE;AAAA,EAEQ,eAAe,MAAuB;AAC1C,UAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC5C,QAAI,MAAM,WAAW,EAAG,QAAO,KAAK;AACpC,QAAI,UAAmB,KAAK;AAC5B,eAAW,QAAQ,OAAO;AACtB,UAAI,YAAY,QAAQ,YAAY,UAAa,OAAO,YAAY,SAAU,QAAO;AACrF,gBAAW,QAAoC,IAAI;AAAA,IACvD;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,cAAc,MAAc,OAAsB;AACtD,UAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC5C,QAAI,MAAM,WAAW,EAAG;AACxB,SAAK,WAAW,KAAK,QAAQ,KAAK,UAAqC,OAAO,KAAK;AAAA,EACvF;AAAA,EAEQ,QAAQ,KAA0C,WAAqB,OAAqD;AAChI,QAAI,UAAU,WAAW,GAAG;AACxB,YAAM,MAAM,UAAU,CAAC;AACvB,UAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,cAAM,MAAM,SAAS,KAAK,EAAE;AAC5B,YAAI,MAAM,GAAG,KAAK,MAAM,EAAG,QAAO;AAClC,cAAM,MAAM,CAAC,GAAG,GAAG;AACnB,YAAI,GAAG,IAAI;AACX,eAAO;AAAA,MACX;AACA,aAAO,EAAE,GAAI,KAAiC,CAAC,GAAG,GAAG,MAAA;AAAA,IACzD;AACA,UAAM,CAAC,MAAM,GAAG,IAAI,IAAI;AACxB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,YAAM,MAAM,SAAS,MAAM,EAAE;AAC7B,UAAI,MAAM,GAAG,KAAK,MAAM,EAAG,QAAO;AAClC,YAAM,MAAM,CAAC,GAAG,GAAG;AACnB,YAAMA,WAAU,IAAI,GAAG;AACvB,YAAMC,QAAOD,aAAY,QAAQ,OAAOA,aAAY,WAC7CA,WACD,CAAA;AACN,UAAI,GAAG,IAAI,KAAK,QAAQC,OAAiC,MAAM,KAAK;AACpE,aAAO;AAAA,IACX;AACA,UAAM,IAAI;AACV,UAAM,UAAU,EAAE,IAAI;AACtB,UAAM,OAAO,YAAY,QAAQ,OAAO,YAAY,WAC7C,UACD,CAAA;AACN,WAAO,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,QAAQ,MAAiC,MAAM,KAAK,EAAA;AAAA,EACpF;AAAA,EAEQ,kBAAkB,MAAe,OAAuB;AAC5D,QAAI,iBAAiB,SAAS,IAAI,GAAG;AACjC,UAAI,OAAO,KAAK,OAAO,iBAAiB,KAAK;AAC7C,UAAI,OAAO,KAAK,SAAS,iBAAiB,KAAK;AAAA,IACnD;AACA,WAAO,QAAQ,KAAK;AAAA,EACxB;AAAA,EAEA,MAAc,oBAAoB,MAA6B;AAC3D,UAAM,kBAAkB,YAAY,uBAAuB,IAAI;AAC/D,UAAM,iBAAiB,KAAK,eAAe,IAAI;AAC/C,UAAM,WAAW,iBAAiB,SAAS,cAAc,IAAI,iBAAiB;AAC9E,UAAM,UAAU,MAAM,QAAQ,cAAc;AAE5C,QAAI;AAEJ,QAAI,SAAS;AACT,YAAM,MAAM;AACZ,YAAM,OAAqB,CAAA;AAC3B,UAAI,QAAQ,CAAC,MAAM,UAAU;AACzB,cAAM,UAAU,GAAG,IAAI,IAAI,KAAK;AAChC,cAAM,aAAa,KAAK,kBAAkB,MAAM,KAAK;AACrD,YAAI,iBAAiB,SAAS,IAAI,GAAG;AACjC,iBAAO,KAAK,IAAI,EAAE,QAAQ,CAAA,MAAK;AAC3B,iBAAK,KAAK;AAAA,cACN,KAAK;AAAA,cACL,MAAM,GAAG,OAAO,IAAI,CAAC;AAAA,cACrB,OAAO;AAAA,cACP,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,OAAO,KAAK,CAAC;AAAA,cACb,YAAY;AAAA,cACZ;AAAA,YAAA,CACH;AAAA,UACL,CAAC;AAAA,QACL,OAAO;AACH,eAAK,KAAK;AAAA,YACN,KAAK,OAAO,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa,iBAAiB,KAAK;AAAA,YACnC,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,YAAY;AAAA,YACZ;AAAA,UAAA,CACH;AAAA,QACL;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX,WAAW,aAAa,MAAM;AAC1B,YAAM,cAAc,iBAAiB;AACrC,YAAM,OAAO,cAAc,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,QAAQ;AAC1E,aAAO,KAAK,IAAI,CAAA,QAAO;AACnB,cAAM,UAAU,GAAG,IAAI,IAAI,GAAG;AAC9B,cAAM,aAAa,cAAc,GAAG;AACpC,cAAM,QAAQ,SAAS,GAAG;AAC1B,eAAO;AAAA,UACH;AAAA,UACA,MAAM;AAAA,UACN,OAAQ,YAAY,SAAoB;AAAA,UACxC,aAAc,YAAY,eAA0B;AAAA,UACpD,QAAQ;AAAA,UACR;AAAA,UACA,YAAY;AAAA,QAAA;AAAA,MAEpB,CAAC;AAAA,IACL,WAAW,mBAAmB,UAAa,mBAAmB,QAAQ,OAAO,mBAAmB,UAAU;AACtG,YAAM,UAAU,KAAK,MAAM,GAAG,EAAE,SAAS;AACzC,aAAO,CAAC;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,OAAO;AAAA,MAAA,CACV;AAAA,IACL,OAAO;AACH,aAAO,CAAA;AAAA,IACX;AACA,SAAK,QAAQ,CAAA,MAAK;AAAE,UAAI,EAAE,UAAU,OAAW,GAAE,QAAQ,EAAE;AAAA,IAAK,CAAC;AAEjE,QAAI,KAAK,iBAAiB,KAAM;AAEhC,UAAM,WAAW,YAAY,gBAAgB,KAAK,CAAC,MAA4B,EAAE,OAAO,IAAI;AAC5F,SAAK,gBAAgB;AACrB,SAAK,cAAe,UAAU,SAAU,iBAAiB,SAAqB;AAC9E,SAAK,aAAa;AAAA,EACtB;AAAA,EAEQ,WAAW,MAAc;AAC7B,SAAK,eAAe;AACpB,SAAK,oBAAoB,IAAI;AAAA,EACjC;AAAA,EAEU,QAAQ,mBAAmC;AACjD,UAAM,UAAU,iBAAiB;AACjC,QAAI,kBAAkB,IAAI,cAAc,KAAK,KAAK,iBAAiB,KAAK,eAAe;AACnF,UAAI,KAAK,aAAc,MAAK,oBAAoB,KAAK,YAAY;AAAA,WAC5D;AACD,aAAK,gBAAgB;AACrB,aAAK,aAAa,CAAA;AAClB,aAAK,cAAc;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,YAAY,KAAiB,OAAsB;AACvD,SAAK,cAAc,IAAI,MAAM,KAAK;AAClC,SAAK,iBAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,KAAiB,KAAmB;AAC5D,QAAI;AACA,WAAK,YAAY,KAAK,KAAK,MAAM,GAAG,CAAC;AAAA,IACzC,QAAQ;AACJ,WAAK,iBAAA;AAAA,IACT;AAAA,EACJ;AAAA,EAEQ,UAAU,YAAoB,QAAgB,QAAsB;AACxE,QAAI,OAAO,KAAA,MAAW,MAAM,WAAW,OAAQ;AAC/C,UAAM,SAAS,KAAK,eAAe,UAAU;AAC7C,QAAI,CAAC,iBAAiB,SAAS,MAAM,EAAG;AACxC,UAAM,QAAQ,OAAO,MAAM;AAC3B,UAAM,UAAU,EAAE,GAAG,OAAA;AACrB,WAAO,QAAQ,MAAM;AACrB,YAAQ,OAAO,KAAA,CAAM,IAAI;AACzB,SAAK,cAAc,YAAY,OAAO;AACtC,SAAK,iBAAA;AAAA,EACT;AAAA,EAEQ,UAAU,YAAoB,KAAmB;AACrD,UAAM,SAAS,KAAK,eAAe,UAAU;AAC7C,QAAI,CAAC,iBAAiB,SAAS,MAAM,EAAG;AACxC,UAAM,UAAU,EAAE,GAAG,OAAA;AACrB,WAAO,QAAQ,GAAG;AAClB,SAAK,cAAc,YAAY,OAAO;AACtC,SAAK,iBAAA;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,iBAAwC;AAChE,UAAM,MAAM,MAAM,aAAa,iBAAiB,EAAE;AAClD,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,cAAc,GAAG,eAAe,IAAI,IAAI,KAAA,CAAM,IAAI,IAAI;AAC3D,SAAK,iBAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,KAAmB;AACzC,QAAI,EAAE,OAAO,KAAK,UAAW;AAC7B,UAAM,UAAU,EAAE,GAAG,KAAK,SAAA;AAC1B,WAAO,QAAQ,GAAG;AAClB,SAAK,WAAW;AAChB,SAAK,UAAU,IAAI;AACnB,QAAI,KAAK,iBAAiB,KAAK;AAC3B,WAAK,eAAe;AACpB,WAAK,gBAAgB;AACrB,WAAK,aAAa,CAAA;AAClB,WAAK,cAAc;AAAA,IACvB;AACA,SAAK,kBAAA;AACL,QAAI,KAAK,aAAc,MAAK,oBAAoB,KAAK,YAAY;AAAA,EACrE;AAAA,EAEQ,oBAAoB,KAAiC;AACzD,UAAM,SAAS,IAAI;AACnB,UAAM,OAAO,QAAQ;AACrB,UAAM,aAAa,QAAQ;AAC3B,UAAM,UAAU,IAAI;AAEpB,QAAI,cAAc,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,GAAG;AAClE,YAAM,UAAU,WAAW,IAAI,CAAA,MAAK,OAAO,CAAC,CAAC;AAC7C,YAAM,QAAQ,YAAY,UAAa,YAAY,OAAO,OAAO,OAAO,IAAK,QAAQ,YAAY,SAAY,OAAO,OAAO,OAAO,IAAI,QAAQ,CAAC;AAC/I,aAAO;AAAA;AAAA,4BAES,KAAK;AAAA,8BACH,CAAC,MAAa,KAAK,YAAY,KAAM,EAAE,OAA6B,KAAK,CAAC;AAAA;AAAA,sBAElF,QAAQ,IAAI,CAAA,QAAO,wBAAwB,GAAG,IAAI,GAAG,cAAc,CAAC;AAAA;AAAA;AAAA,IAGlF;AAEA,QAAI,SAAS,WAAW;AACpB,YAAM,UAAU,YAAY,QAAS,YAAY,UAAa,QAAQ,YAAY;AAClF,aAAO;AAAA;AAAA,+BAEY,OAAO;AAAA,8BACR,CAAC,MAAa,KAAK,YAAY,KAAM,EAAE,OAA4B,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,IAIjG;AAEA,QAAI,SAAS,UAAU;AACnB,YAAM,MAAM,OAAO,YAAY,WAAW,UAAW,OAAO,QAAQ,YAAY,WAAW,OAAO,UAAU;AAC5G,aAAO;AAAA;AAAA,6BAEU,OAAO,GAAG,CAAC;AAAA,8BACV,CAAC,MAAa,KAAK,YAAY,KAAK,OAAQ,EAAE,OAA4B,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,IAIvG;AAEA,UAAM,kBAAkB,YAAY,QAAQ,OAAO,YAAY;AAC/D,QAAI,mBAAmB,CAAC,UAAU,iBAAiB,SAAS,OAAO,GAAG;AAClE,aAAO,KAAK,mBAAmB,IAAI,MAAM,SAAS,CAAC;AAAA,IACvD;AACA,QAAI,iBAAiB;AACjB,YAAM,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAC3C,aAAO;AAAA;AAAA,6BAEU,GAAG;AAAA,4BACJ,CAAC,MAAa,KAAK,oBAAoB,KAAM,EAAE,OAA+B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,IAIxG;AACA,WAAO,KAAK,uBAAuB,KAAK,OAAO;AAAA,EACnD;AAAA,EAEQ,uBAAuB,KAAiB,SAAkC;AAC9E,UAAM,MAAM,YAAY,UAAa,YAAY,OAAO,OAAO,OAAO,IAAI;AAC1E,QAAI,OAAO,YAAY,WAAW;AAC9B,aAAO;AAAA;AAAA,+BAEY,OAAO;AAAA,8BACR,CAAC,MAAa,KAAK,YAAY,KAAM,EAAE,OAA4B,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,IAIjG;AACA,QAAI,OAAO,YAAY,UAAU;AAC7B,aAAO;AAAA;AAAA,6BAEU,OAAO,OAAO,CAAC;AAAA,8BACd,CAAC,MAAa,KAAK,YAAY,KAAK,OAAQ,EAAE,OAA4B,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,IAIvG;AACA,WAAO;AAAA;AAAA,yBAEU,GAAG;AAAA,yBACH,CAAC,MAAa,KAAK,YAAY,KAAM,EAAE,OAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,EAI9F;AAAA,EAEQ,mBAAmB,YAAoB,KAA8B,OAA+B;AACxG,UAAM,WAAW;AACjB,QAAI,SAAS,UAAU;AACnB,YAAM,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC;AACvC,YAAM,MAAkB,EAAE,KAAK,IAAI,MAAM,YAAY,OAAO,IAAI,aAAa,IAAI,OAAO,IAAA;AACxF,aAAO;AAAA;AAAA,6BAEU,GAAG;AAAA,4BACJ,CAAC,MAAa,KAAK,oBAAoB,KAAM,EAAE,OAA+B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,IAIxG;AACA,UAAM,UAAU,OAAO,QAAQ,GAAG;AAClC,WAAO;AAAA;AAAA,kBAEG,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AACtB,YAAM,UAAU,GAAG,UAAU,IAAI,CAAC;AAClC,YAAM,SAAqB,EAAE,KAAK,GAAG,MAAM,SAAS,OAAO,GAAG,aAAa,IAAI,OAAO,GAAG,WAAA;AACzF,YAAM,cAAc,iBAAiB,SAAS,CAAC;AAC/C,YAAM,UAAU,MAAM,QAAQ,CAAC;AAC/B,aAAO;AAAA;AAAA;AAAA,yCAGc,CAAC;AAAA;AAAA;AAAA,wCAGF,CAAC,MAAa;AAClB,cAAM,SAAU,EAAE,OAA4B,MAAM,KAAA;AACpD,YAAI,UAAU,WAAW,QAAQ,UAAU,YAAY,GAAG,MAAM;AAAA,MACpE,CAAC;AAAA;AAAA;AAAA,8BAGH,cACI,KAAK,mBAAmB,SAAS,GAA8B,QAAQ,CAAC,IACxE,UACI;AAAA;AAAA,qDAEe,KAAK,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,oDAG3B,CAAC,MAAa,KAAK,oBAAoB,QAAS,EAAE,OAA+B,KAAK,CAAC;AAAA;AAAA,wCAGrG,KAAK,uBAAuB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,IAG5D,CAAC,CAAC;AAAA;AAAA;AAAA,EAGd;AAAA,EAEQ,oBAAoC;AACxC,QAAI,CAAC,KAAK,cAAc;AACpB,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMX;AACA,QAAI,KAAK,kBAAkB,KAAK,cAAc;AAC1C,aAAO;AAAA;AAAA;AAAA,qDAGkC,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO9D;AAEA,UAAM,eAAe,KAAK,WAAW,OAAO,CAAA,QAAO;AAC/C,UAAI,CAAC,KAAK,YAAY,KAAA,EAAQ,QAAO;AACrC,YAAM,IAAI,KAAK,YAAY,YAAA;AAC3B,aAAO,IAAI,MAAM,YAAA,EAAc,SAAS,CAAC,KAAK,IAAI,YAAY,cAAc,SAAS,CAAC;AAAA,IAC1F,CAAC;AAED,UAAM,iBAAiB,KAAK,eAAe,KAAK,eAAe,KAAK,YAAY,IAAI;AACpF,UAAM,oBAAoB,iBAAiB,SAAS,cAAc;AAClE,UAAM,aAAa,KAAK,iBAAiB,QAAQ,CAAC,KAAK,aAAa,SAAS,GAAG;AAChF,UAAM,oBAAoB,qBAAqB;AAE/C,WAAO;AAAA;AAAA;AAAA,iDAGkC,KAAK,WAAW;AAAA,sBAC3C,oBAAoB;AAAA,6FACmD,MAAM,KAAK,cAAc,KAAK,YAAa,CAAC;AAAA,wBACjH,EAAE;AAAA,sBACJ,aAAa;AAAA,kGAC+D,MAAM,KAAK,kBAAkB,KAAK,YAAa,CAAC;AAAA,wBAC1H,EAAE;AAAA;AAAA;AAAA,sBAGJ,aAAa,WAAW,IAAI;AAAA;AAAA,8BAEpB,KAAK,WAAW,WAAW,IACvB,gHACA,yDAAyD;AAAA;AAAA,wBAEnE;AAAA,MACI;AAAA,MACA,CAAC,QAAQ,IAAI;AAAA,MACb,CAAC,KAAK,UAAU;AACZ,cAAM,OAAO,QAAQ,IAAI,aAAa,QAAQ,CAAC,IAAI;AACnD,cAAM,YAAY,IAAI,cAAc,MAAM,eAAe,IAAI;AAC7D,cAAM,UAAU,CAAC,CAAC,IAAI;AACtB,eAAO;AAAA,sCACD,YAAY;AAAA;AAAA,oDAEE,IAAI,UAAU;AAAA,iHAC+C,MAAM,KAAK,cAAc,IAAI,UAAW,CAAC;AAAA;AAAA,wCAElH,EAAE;AAAA,8DACoB,UAAU,yBAAyB,EAAE;AAAA;AAAA,8CAErD,IAAI,cAAc,OAAO;AAAA;AAAA,6DAEV,IAAI,GAAG;AAAA;AAAA;AAAA,4DAGR,CAAC,MAAa;AAClB,gBAAM,SAAU,EAAE,OAA4B,MAAM,KAAA;AACpD,cAAI,UAAU,WAAW,IAAI,IAAK,MAAK,UAAU,IAAI,YAAa,IAAI,KAAK,MAAM;AAAA,QACrF,CAAC;AAAA;AAAA,gDAEL,mCAAmC,IAAI,KAAK,SAAS;AAAA,8CACvD,IAAI,cAAc,sCAAsC,IAAI,WAAW,SAAS,EAAE;AAAA;AAAA,uEAEzD,KAAK,oBAAoB,GAAG,CAAC;AAAA,0CAC1D,IAAI,cAAc,OAAO;AAAA,qHACkD,MAAM,KAAK,UAAU,IAAI,YAAa,IAAI,GAAG,CAAC;AAAA,4CACvH,EAAE;AAAA;AAAA;AAAA,MAGlB;AAAA,IAAA,CACH;AAAA;AAAA;AAAA;AAAA,EAIrB;AAAA,EAEQ,mBAAmB,MAAwC;AAC/D,UAAM,cAAc,KAAK,SAAS,SAAS;AAC3C,UAAM,aAAa,KAAK,iBAAiB,KAAK;AAE9C,WAAO;AAAA,sCACuB,KAAK,QAAQ;AAAA;AAAA,+CAEJ,aAAa,aAAa,EAAE;AAAA,6BAC9C,MAAM,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,+BAG9B,CAAC,MAAqB,EAAE,QAAQ,WAAW,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,oDAChD,KAAK,KAAK;AAAA;AAAA,kBAE5C,cAAc,KAAK,SAAS,IAAI,CAAA,UAAS,KAAK,mBAAmB,KAAK,CAAC,IAAI,EAAE;AAAA;AAAA;AAAA,EAG3F;AAAA,EAEQ,eAAe,UAAmB;AACtC,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,MAAM;AACN,WAAK,iBAAiB,cAAc,EAAE,QAAQ,CAAC,SAAkB;AAC5D,aAA0C,WAAW;AAAA,MAC1D,CAAC;AAAA,IACL;AACA,SAAK,eAAe,KAAK,aAAa,IAAI,OAAK,KAAK,YAAY,GAAG,QAAQ,CAAC;AAC5E,SAAK,cAAA;AAAA,EACT;AAAA,EAEQ,YAAY,MAAwB,UAAqC;AAC7E,WAAO;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,UAAU,KAAK,SAAS,IAAI,OAAK,KAAK,YAAY,GAAG,QAAQ,CAAC;AAAA,IAAA;AAAA,EAEtE;AAAA,EAEA,MAAc,SAAS;AACnB,UAAM,MAAM,MAAM,aAAa,iCAAiC,EAAE;AAClE,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,cAAc,IAAI,KAAA,GAAQ,IAAI;AACnC,SAAK,UAAU,IAAI;AACnB,SAAK,kBAAA;AAAA,EACT;AAAA,EAES,OAAO;AACZ,gBAAY,OAAO,KAAK,QAAmC,EAAE,KAAK,MAAM;AACpE,WAAK,UAAU,KAAK;AAAA,IACxB,CAAC,EAAE,MAAM,CAAA,QAAO;AACZ,cAAQ,MAAM,4BAA4B,GAAG;AAAA,IACjD,CAAC;AAAA,EACL;AAAA,EAEU,gBAAgB;AACtB,WAAO;AAAA;AAAA;AAAA,yBAGU,KAAK,WAAW;AAAA,yBAChB,CAAC,MAAa;AACnB,WAAK,cAAe,EAAE,OAA4B;AAClD,WAAK,kBAAA;AAAA,IACT,CAAC;AAAA;AAAA;AAAA;AAAA,6EAI4D,MAAM,KAAK,QAAQ;AAAA,wFACR,MAAM,KAAK,eAAe,IAAI,CAAC;AAAA,2FAC5B,MAAM,KAAK,eAAe,KAAK,CAAC;AAAA;AAAA,EAEvH;AAAA,EAEA,SAAS;AACL,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKe,KAAK,aAAa,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,gCAK/B;AAAA,2CACW,IAAI,KAAK,OAAO,CAAC;AAAA,sCACtB,KAAK,aAAa,IAAI,CAAA,SAAQ,KAAK,mBAAmB,IAAI,CAAC,CAAC;AAAA;AAAA,6BAErE;AAAA;AAAA;AAAA;AAAA,0BAIH,KAAK,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9C;AAoKJ;AAzzBa,iBAupBF,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AArpBT,gBAAA;AAAA,EADN,SAAS,EAAE,WAAW,MAAA,CAAO;AAAA,GADrB,iBAEF,WAAA,SAAA,CAAA;AAGC,gBAAA;AAAA,EADP,MAAA;AAAM,GAJE,iBAKD,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAPE,iBAQD,WAAA,gBAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAVE,iBAWD,WAAA,gBAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAbE,iBAcD,WAAA,cAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAhBE,iBAiBD,WAAA,eAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAnBE,iBAoBD,WAAA,eAAA,CAAA;AApBC,mBAAN,gBAAA;AAAA,EADN,cAAc,oBAAoB;AAAA,GACtB,gBAAA;ACtBb,MAAA,wBAAe,CAAC,eAAwB;AACpC,iBAAe,2BAA2B;AAAA,IACtC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW,CAAC,UAAuB,MAAM,QAAQ;AAAA,IACjD,QAAQ,OAAO,UAAuB;AAClC,YAAM,YAAY,MAAM;AAAA,6CACS,KAAK;AAAA;AAEtC,aAAO;AAAA,IACX;AAAA,EAAA,CACH;AAED,kBAAgB,gBAAgB,iBAAiB;AAAA,IAC7C,SAAS;AAAA,IACT,SAAS,MAAM;AACX,YAAM,cAAc;AAAA,QAChB,OAAO;AAAA,QACP,MAAM,CAAA;AAAA,QACN,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO,CAAA;AAAA,MAAC;AAEZ,qBAAe,WAAW,WAAW;AAAA,IACzC;AAAA,EAAA,CACH;AAED,uBAAqB,qBAAqB,oBAAoB;AAAA,IAC1D,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,CACV;AACL;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eclipse-lyra/extension-settings-tree",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -24,5 +24,9 @@
|
|
|
24
24
|
],
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "vite build"
|
|
27
|
+
},
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/eclipse-lyra/core"
|
|
27
31
|
}
|
|
28
32
|
}
|