@eclipse-docks/extension-catalog 0.7.135 → 0.7.137
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/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":[],"sources":["../src/register-catalog.ts"],"sourcesContent":["import {\n contributionRegistry,\n type TreeContribution,\n} from \"@eclipse-docks/core\";\n\n/** Leaf item state: optional filename when URL is not path-shaped (e.g. data: in production bundles). */\nexport type CatalogResourceState = {\n url: string;\n filename?: string;\n};\n\nexport interface CatalogContribution extends TreeContribution {\n items?: CatalogContribution[];\n}\n\nexport function getCatalogBaseUrl(): string {\n if (typeof globalThis === 'undefined') return '';\n const loc = (globalThis as unknown as { location?: { origin: string } }).location;\n const base = (import.meta as unknown as { env?: { BASE_URL?: string } }).env?.BASE_URL ?? '';\n if (!loc?.origin) return '';\n return (loc.origin + base).replace(/\\/?$/, '/');\n}\n\nexport function registerCatalog(catalog: CatalogContribution, baseUrl?: string): void {\n const base = baseUrl ?? getCatalogBaseUrl();\n contributionRegistry.registerContribution(\"catalog.root\", {\n label: catalog.label,\n icon: catalog.icon,\n contributionId: catalog.contributionId,\n } as TreeContribution);\n\n const contributionId = catalog.contributionId ?? catalog.label;\n catalog.items?.forEach((item: CatalogContribution) => {\n contributionRegistry.registerContribution(contributionId, {\n label: item.label,\n icon: item.icon,\n contributionId: item.contributionId,\n } as TreeContribution);\n\n item.items?.forEach((child: any) => {\n const contribution = {\n label: child.label,\n icon: child.icon,\n state: { ...child.state },\n } as TreeContribution;\n const url = contribution.state?.url as string | undefined;\n if (url && typeof url === \"string\" && url.includes(\"${baseURL}/\")) {\n contribution.state = { ...contribution.state, url: url.replace(\"${baseURL}/\", base) };\n }\n contributionRegistry.registerContribution(\n item.contributionId!,\n contribution\n );\n });\n });\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"api.js","names":[],"sources":["../src/register-catalog.ts"],"sourcesContent":["import {\n contributionRegistry,\n type TreeContribution,\n} from \"@eclipse-docks/core\";\n\n/** Leaf item state: optional filename when URL is not path-shaped (e.g. data: in production bundles). */\nexport type CatalogResourceState = {\n url: string;\n filename?: string;\n /** Open URL in a new browser tab instead of wget into the workspace. */\n openInNewTab?: boolean;\n};\n\nexport interface CatalogContribution extends TreeContribution {\n items?: CatalogContribution[];\n}\n\nexport function getCatalogBaseUrl(): string {\n if (typeof globalThis === 'undefined') return '';\n const loc = (globalThis as unknown as { location?: { origin: string } }).location;\n const base = (import.meta as unknown as { env?: { BASE_URL?: string } }).env?.BASE_URL ?? '';\n if (!loc?.origin) return '';\n return (loc.origin + base).replace(/\\/?$/, '/');\n}\n\nexport function registerCatalog(catalog: CatalogContribution, baseUrl?: string): void {\n const base = baseUrl ?? getCatalogBaseUrl();\n contributionRegistry.registerContribution(\"catalog.root\", {\n label: catalog.label,\n icon: catalog.icon,\n contributionId: catalog.contributionId,\n } as TreeContribution);\n\n const contributionId = catalog.contributionId ?? catalog.label;\n catalog.items?.forEach((item: CatalogContribution) => {\n contributionRegistry.registerContribution(contributionId, {\n label: item.label,\n icon: item.icon,\n contributionId: item.contributionId,\n } as TreeContribution);\n\n item.items?.forEach((child: any) => {\n const contribution = {\n label: child.label,\n icon: child.icon,\n state: { ...child.state },\n } as TreeContribution;\n const url = contribution.state?.url as string | undefined;\n if (url && typeof url === \"string\" && url.includes(\"${baseURL}/\")) {\n contribution.state = { ...contribution.state, url: url.replace(\"${baseURL}/\", base) };\n }\n contributionRegistry.registerContribution(\n item.contributionId!,\n contribution\n );\n });\n });\n}\n"],"mappings":";;AAiBA,SAAgB,oBAA4B;CACxC,IAAI,OAAO,eAAe,aAAa,OAAO;CAC9C,MAAM,MAAO,WAA4D;CACzE,MAAM,OAAA;CACN,IAAI,CAAC,KAAK,QAAQ,OAAO;CACzB,QAAQ,IAAI,SAAS,KAAA,CAAM,QAAQ,QAAQ,GAAG;AAClD;AAEA,SAAgB,gBAAgB,SAA8B,SAAwB;CAClF,MAAM,OAAO,WAAW,kBAAkB;CAC1C,qBAAqB,qBAAqB,gBAAgB;EACtD,OAAO,QAAQ;EACf,MAAM,QAAQ;EACd,gBAAgB,QAAQ;CAC5B,CAAqB;CAErB,MAAM,iBAAiB,QAAQ,kBAAkB,QAAQ;CACzD,QAAQ,OAAO,SAAS,SAA8B;EAClD,qBAAqB,qBAAqB,gBAAgB;GACtD,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,gBAAgB,KAAK;EACzB,CAAqB;EAErB,KAAK,OAAO,SAAS,UAAe;GAChC,MAAM,eAAe;IACjB,OAAO,MAAM;IACb,MAAM,MAAM;IACZ,OAAO,EAAE,GAAG,MAAM,MAAM;GAC5B;GACA,MAAM,MAAM,aAAa,OAAO;GAChC,IAAI,OAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,aAAa,GAC5D,aAAa,QAAQ;IAAE,GAAG,aAAa;IAAO,KAAK,IAAI,QAAQ,eAAe,IAAI;GAAE;GAExF,qBAAqB,qBACjB,KAAK,gBACL,YACJ;EACJ,CAAC;CACL,CAAC;AACL"}
|
package/dist/docks-catalog.d.ts
CHANGED
|
@@ -11,8 +11,10 @@ export declare class DocksCatalog extends DocksPart {
|
|
|
11
11
|
protected renderToolbar(): TemplateResult<1>;
|
|
12
12
|
private toTreeNodes;
|
|
13
13
|
private wgetParamsFromCatalogData;
|
|
14
|
+
private openInNewTabFromCatalogData;
|
|
15
|
+
private openCatalogUrl;
|
|
14
16
|
onItemDblClicked(event: Event): void;
|
|
15
|
-
private
|
|
17
|
+
private runActionForSelection;
|
|
16
18
|
onSelectionChanged(event: Event): void;
|
|
17
19
|
protected renderContextMenu(): TemplateResult<1>;
|
|
18
20
|
setAllExpanded(expanded: boolean): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docks-catalog.d.ts","sourceRoot":"","sources":["../src/docks-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,cAAc,EAKjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACH,SAAS,EAET,QAAQ,EAUX,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAK/C,qBACa,YAAa,SAAQ,SAAS;IAEvC,OAAO,CAAC,SAAS,CAAC,CAAa;IAE/B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,SAAS,CAAC,UAAU;IASpB,SAAS,CAAC,OAAO;IAQjB,OAAO,CAAC,WAAW;IAQnB,SAAS,CAAC,aAAa;IAkBvB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,yBAAyB;IASjC,gBAAgB,CAAC,KAAK,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"docks-catalog.d.ts","sourceRoot":"","sources":["../src/docks-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,cAAc,EAKjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACH,SAAS,EAET,QAAQ,EAUX,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAK/C,qBACa,YAAa,SAAQ,SAAS;IAEvC,OAAO,CAAC,SAAS,CAAC,CAAa;IAE/B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,SAAS,CAAC,UAAU;IASpB,SAAS,CAAC,OAAO;IAQjB,OAAO,CAAC,WAAW;IAQnB,SAAS,CAAC,aAAa;IAkBvB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,2BAA2B;IAKnC,OAAO,CAAC,cAAc;IAItB,gBAAgB,CAAC,KAAK,EAAE,KAAK;IAmB7B,OAAO,CAAC,qBAAqB;IAa7B,kBAAkB,CAAC,KAAK,EAAE,KAAK;IAM/B,SAAS,CAAC,iBAAiB;IAepB,cAAc,CAAC,QAAQ,EAAE,OAAO;IAShC,OAAO;IAId,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,UAAQ,GAAG,cAAc;IAwBjE,SAAS,CAAC,aAAa;IA0BvB,MAAM,CAAC,MAAM,0BA4BX;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,eAAe,EAAE,YAAY,CAAC;KACjC;CACJ"}
|
package/dist/loader.js
CHANGED
|
@@ -38,7 +38,7 @@ var DocksCatalog = class DocksCatalog extends DocksPart {
|
|
|
38
38
|
icon="file-arrow-down"
|
|
39
39
|
title="Checkout"
|
|
40
40
|
?disabled=${!isActiveAndHasSelection}
|
|
41
|
-
.action=${() => this.
|
|
41
|
+
.action=${() => this.runActionForSelection()}
|
|
42
42
|
></docks-command>
|
|
43
43
|
<docks-command icon="arrows-rotate" title="Refresh Catalog" .action=${() => this.refresh()}></docks-command>
|
|
44
44
|
<docks-command icon="angles-down" slot="end" title="Expand All" .action=${() => this.setAllExpanded(true)}></docks-command>
|
|
@@ -62,15 +62,27 @@ var DocksCatalog = class DocksCatalog extends DocksPart {
|
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
wgetParamsFromCatalogData(data) {
|
|
65
|
-
if (!data?.url) return null;
|
|
65
|
+
if (!data?.url || data.openInNewTab) return null;
|
|
66
66
|
const params = { url: data.url };
|
|
67
67
|
if (typeof data.filename === "string" && data.filename.trim()) params.filename = data.filename.trim();
|
|
68
68
|
return params;
|
|
69
69
|
}
|
|
70
|
+
openInNewTabFromCatalogData(data) {
|
|
71
|
+
if (!data?.url || !data.openInNewTab) return null;
|
|
72
|
+
return data.url;
|
|
73
|
+
}
|
|
74
|
+
openCatalogUrl(url) {
|
|
75
|
+
window.open(url, "_blank", "noopener,noreferrer");
|
|
76
|
+
}
|
|
70
77
|
onItemDblClicked(event) {
|
|
71
78
|
const item = event.currentTarget;
|
|
72
79
|
const node = item?.model;
|
|
73
80
|
if (!node) return;
|
|
81
|
+
const externalUrl = this.openInNewTabFromCatalogData(node.data);
|
|
82
|
+
if (externalUrl) {
|
|
83
|
+
this.openCatalogUrl(externalUrl);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
74
86
|
const wgetParams = this.wgetParamsFromCatalogData(node.data);
|
|
75
87
|
if (wgetParams) {
|
|
76
88
|
this.executeCommand("wget", wgetParams);
|
|
@@ -78,8 +90,13 @@ var DocksCatalog = class DocksCatalog extends DocksPart {
|
|
|
78
90
|
}
|
|
79
91
|
if (!node.leaf && "expanded" in item) item.expanded = !item.expanded;
|
|
80
92
|
}
|
|
81
|
-
|
|
93
|
+
runActionForSelection() {
|
|
82
94
|
const item = activeSelectionSignal.get();
|
|
95
|
+
const externalUrl = item && this.openInNewTabFromCatalogData(item);
|
|
96
|
+
if (externalUrl) {
|
|
97
|
+
this.openCatalogUrl(externalUrl);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
83
100
|
const wgetParams = item && this.wgetParamsFromCatalogData(item);
|
|
84
101
|
if (wgetParams) this.executeCommand("wget", wgetParams);
|
|
85
102
|
}
|
|
@@ -90,13 +107,14 @@ var DocksCatalog = class DocksCatalog extends DocksPart {
|
|
|
90
107
|
renderContextMenu() {
|
|
91
108
|
const item = activePartSignal.get() instanceof _DocksCatalog ? activeSelectionSignal.get() : void 0;
|
|
92
109
|
const hasUrl = item && "url" in item && item.url;
|
|
110
|
+
const openExternal = item && "openInNewTab" in item && item.openInNewTab;
|
|
93
111
|
return html`
|
|
94
112
|
${renderDropdownItem({
|
|
95
113
|
icon: "file-arrow-down",
|
|
96
|
-
label: "Checkout",
|
|
97
|
-
title: "Checkout",
|
|
114
|
+
label: openExternal ? "Open download" : "Checkout",
|
|
115
|
+
title: openExternal ? "Open download in browser" : "Checkout",
|
|
98
116
|
disabled: !hasUrl,
|
|
99
|
-
action: () => this.
|
|
117
|
+
action: () => this.runActionForSelection()
|
|
100
118
|
})}
|
|
101
119
|
`;
|
|
102
120
|
}
|
|
@@ -111,13 +129,17 @@ var DocksCatalog = class DocksCatalog extends DocksPart {
|
|
|
111
129
|
}
|
|
112
130
|
createTreeItems(node, expanded = false) {
|
|
113
131
|
if (!node) return html``;
|
|
132
|
+
const openExternal = Boolean(node.data && "openInNewTab" in node.data && node.data.openInNewTab);
|
|
114
133
|
return html`
|
|
115
134
|
<wa-tree-item
|
|
116
135
|
@dblclick=${this.nobubble(this.onItemDblClicked)}
|
|
117
136
|
.model=${node}
|
|
118
137
|
?expanded=${expanded}
|
|
119
138
|
>
|
|
120
|
-
<span
|
|
139
|
+
<span class="catalog-tree-label">
|
|
140
|
+
${icon(node.icon)} ${node.label}
|
|
141
|
+
${openExternal ? html`<span class="catalog-external-suffix" title="Opens in browser">${icon("arrow-up-right-from-square")}</span>` : ""}
|
|
142
|
+
</span>
|
|
121
143
|
${node.children?.map((child) => this.createTreeItems(child))}
|
|
122
144
|
</wa-tree-item>
|
|
123
145
|
`;
|
|
@@ -161,6 +183,17 @@ var DocksCatalog = class DocksCatalog extends DocksPart {
|
|
|
161
183
|
flex: 1;
|
|
162
184
|
min-height: 0;
|
|
163
185
|
}
|
|
186
|
+
|
|
187
|
+
.catalog-tree-label {
|
|
188
|
+
display: inline-flex;
|
|
189
|
+
align-items: center;
|
|
190
|
+
gap: 0.35rem;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.catalog-external-suffix {
|
|
194
|
+
opacity: 0.65;
|
|
195
|
+
font-size: 0.85em;
|
|
196
|
+
}
|
|
164
197
|
`;
|
|
165
198
|
}
|
|
166
199
|
};
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","names":[],"sources":["../src/docks-catalog.ts","../src/loader.ts"],"sourcesContent":["import {\n css,\n html,\n TemplateResult,\n customElement,\n state,\n createRef,\n ref,\n} from \"@eclipse-docks/core/externals/lit\";\nimport {\n DocksPart,\n TreeContribution,\n TreeNode,\n contributionRegistry,\n activePartSignal,\n activeSelectionSignal,\n subscribe,\n unsubscribe,\n TOPIC_CONTRIBUTEIONS_CHANGED,\n type ContributionChangeEvent,\n icon,\n renderDropdownItem,\n} from \"@eclipse-docks/core\";\n\nexport const CID_CATALOG_ROOT = \"catalog.root\";\n\nconst CATALOG_EMPTY_MESSAGE =\n \"No catalog entries yet. Install or enable extensions that contribute catalog items.\";\n\n@customElement(\"docks-catalog\")\nexport class DocksCatalog extends DocksPart {\n @state()\n private rootNodes?: TreeNode[];\n\n private treeRef = createRef<HTMLElement>();\n private contributionsSubscriptionToken?: string;\n\n protected doBeforeUI() {\n this.rebuildTree();\n this.contributionsSubscriptionToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (event.target === CID_CATALOG_ROOT || event.target?.startsWith(\"catalog.\")) {\n this.rebuildTree();\n }\n });\n }\n\n protected doClose() {\n if (this.contributionsSubscriptionToken) {\n unsubscribe(this.contributionsSubscriptionToken);\n this.contributionsSubscriptionToken = undefined;\n }\n super.doClose();\n }\n\n private rebuildTree() {\n const contributions = contributionRegistry.getContributions(\n CID_CATALOG_ROOT\n ) as TreeContribution[];\n this.rootNodes = this.toTreeNodes(contributions);\n this.requestUpdate();\n }\n\n protected renderToolbar() {\n const isActiveAndHasSelection =\n activePartSignal.get() instanceof DocksCatalog &&\n activeSelectionSignal.get() !== undefined;\n\n return html`\n <docks-command\n icon=\"file-arrow-down\"\n title=\"Checkout\"\n ?disabled=${!isActiveAndHasSelection}\n .action=${() => this.runWgetForSelection()}\n ></docks-command>\n <docks-command icon=\"arrows-rotate\" title=\"Refresh Catalog\" .action=${() => this.refresh()}></docks-command>\n <docks-command icon=\"angles-down\" slot=\"end\" title=\"Expand All\" .action=${() => this.setAllExpanded(true)}></docks-command>\n <docks-command icon=\"angles-up\" slot=\"end\" title=\"Collapse All\" .action=${() => this.setAllExpanded(false)}></docks-command>\n `;\n }\n\n private toTreeNodes(contributions: TreeContribution[]) {\n return contributions.map((c) => {\n const node = {\n data: c.state,\n icon: c.icon,\n label: c.label,\n leaf: false,\n } as TreeNode;\n if (c.contributionId) {\n const children = contributionRegistry.getContributions(\n c.contributionId\n ) as TreeContribution[];\n node.leaf = children.length === 0;\n node.children = this.toTreeNodes(children);\n }\n return node;\n });\n }\n\n private wgetParamsFromCatalogData(data: { url?: string; filename?: string }) {\n if (!data?.url) return null;\n const params: { url: string; filename?: string } = { url: data.url };\n if (typeof data.filename === \"string\" && data.filename.trim()) {\n params.filename = data.filename.trim();\n }\n return params;\n }\n\n onItemDblClicked(event: Event) {\n const item = event.currentTarget as HTMLElement & { model?: TreeNode; expanded?: boolean };\n const node = item?.model;\n if (!node) return;\n const wgetParams = this.wgetParamsFromCatalogData(node.data);\n if (wgetParams) {\n void this.executeCommand(\"wget\", wgetParams);\n return;\n }\n if (!node.leaf && \"expanded\" in item) {\n item.expanded = !item.expanded;\n }\n }\n\n private runWgetForSelection() {\n const item = activeSelectionSignal.get();\n const wgetParams = item && this.wgetParamsFromCatalogData(item as { url?: string; filename?: string });\n if (wgetParams) {\n void this.executeCommand(\"wget\", wgetParams);\n }\n }\n\n onSelectionChanged(event: Event) {\n const node: TreeNode = (event as CustomEvent).detail.selection[0]\n .model;\n activeSelectionSignal.set(node.data);\n }\n\n protected renderContextMenu() {\n const item = activePartSignal.get() instanceof DocksCatalog ? activeSelectionSignal.get() : undefined;\n const hasUrl = item && \"url\" in item && item.url;\n return html`\n ${renderDropdownItem({\n icon: 'file-arrow-down',\n label: 'Checkout',\n title: 'Checkout',\n disabled: !hasUrl,\n action: () => this.runWgetForSelection(),\n })}\n `;\n }\n\n public setAllExpanded(expanded: boolean) {\n const tree = this.treeRef.value;\n if (tree) {\n tree.querySelectorAll(\"wa-tree-item\").forEach((item: any) => {\n item.expanded = expanded;\n });\n }\n }\n\n public refresh() {\n this.rebuildTree();\n }\n\n createTreeItems(node: TreeNode, expanded = false): TemplateResult {\n if (!node) {\n return html``;\n }\n return html`\n <wa-tree-item\n @dblclick=${this.nobubble(this.onItemDblClicked)}\n .model=${node}\n ?expanded=${expanded}\n >\n <span>${icon(node.icon)} ${node.label}</span>\n ${node.children?.map((child) => this.createTreeItems(child))}\n </wa-tree-item>\n `;\n }\n\n protected renderContent() {\n const hasItems = (this.rootNodes?.length ?? 0) > 0;\n return html`\n <div class=\"catalog-root\">\n ${hasItems\n ? html`\n <wa-tree\n ${ref(this.treeRef)}\n @wa-selection-change=${this.nobubble(this.onSelectionChanged)}\n style=\"--indent-guide-width: 1px;\"\n >\n ${this.rootNodes!.map((node) =>\n this.createTreeItems(node, true)\n )}\n </wa-tree>\n `\n : html`\n <docks-no-content\n message=${CATALOG_EMPTY_MESSAGE}\n icon=\"book\"\n ></docks-no-content>\n `}\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n }\n\n .catalog-root {\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .catalog-root wa-tree {\n flex: 1;\n min-height: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-catalog\": DocksCatalog;\n }\n}\n","import { html } from \"@eclipse-docks/core/externals/lit\";\nimport { contributionRegistry, SIDEBAR_MAIN } from \"@eclipse-docks/core\";\nimport \"./docks-catalog\";\n\ncontributionRegistry.registerContribution(SIDEBAR_MAIN, {\n name: \"catalog\",\n label: \"Catalog\",\n icon: \"book\",\n component: (id: string) => html`<docks-catalog id=\"${id}\"></docks-catalog>`,\n} as any);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loader.js","names":[],"sources":["../src/docks-catalog.ts","../src/loader.ts"],"sourcesContent":["import {\n css,\n html,\n TemplateResult,\n customElement,\n state,\n createRef,\n ref,\n} from \"@eclipse-docks/core/externals/lit\";\nimport {\n DocksPart,\n TreeContribution,\n TreeNode,\n contributionRegistry,\n activePartSignal,\n activeSelectionSignal,\n subscribe,\n unsubscribe,\n TOPIC_CONTRIBUTEIONS_CHANGED,\n type ContributionChangeEvent,\n icon,\n renderDropdownItem,\n} from \"@eclipse-docks/core\";\n\nexport const CID_CATALOG_ROOT = \"catalog.root\";\n\nconst CATALOG_EMPTY_MESSAGE =\n \"No catalog entries yet. Install or enable extensions that contribute catalog items.\";\n\n@customElement(\"docks-catalog\")\nexport class DocksCatalog extends DocksPart {\n @state()\n private rootNodes?: TreeNode[];\n\n private treeRef = createRef<HTMLElement>();\n private contributionsSubscriptionToken?: string;\n\n protected doBeforeUI() {\n this.rebuildTree();\n this.contributionsSubscriptionToken = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (event.target === CID_CATALOG_ROOT || event.target?.startsWith(\"catalog.\")) {\n this.rebuildTree();\n }\n });\n }\n\n protected doClose() {\n if (this.contributionsSubscriptionToken) {\n unsubscribe(this.contributionsSubscriptionToken);\n this.contributionsSubscriptionToken = undefined;\n }\n super.doClose();\n }\n\n private rebuildTree() {\n const contributions = contributionRegistry.getContributions(\n CID_CATALOG_ROOT\n ) as TreeContribution[];\n this.rootNodes = this.toTreeNodes(contributions);\n this.requestUpdate();\n }\n\n protected renderToolbar() {\n const isActiveAndHasSelection =\n activePartSignal.get() instanceof DocksCatalog &&\n activeSelectionSignal.get() !== undefined;\n\n return html`\n <docks-command\n icon=\"file-arrow-down\"\n title=\"Checkout\"\n ?disabled=${!isActiveAndHasSelection}\n .action=${() => this.runActionForSelection()}\n ></docks-command>\n <docks-command icon=\"arrows-rotate\" title=\"Refresh Catalog\" .action=${() => this.refresh()}></docks-command>\n <docks-command icon=\"angles-down\" slot=\"end\" title=\"Expand All\" .action=${() => this.setAllExpanded(true)}></docks-command>\n <docks-command icon=\"angles-up\" slot=\"end\" title=\"Collapse All\" .action=${() => this.setAllExpanded(false)}></docks-command>\n `;\n }\n\n private toTreeNodes(contributions: TreeContribution[]) {\n return contributions.map((c) => {\n const node = {\n data: c.state,\n icon: c.icon,\n label: c.label,\n leaf: false,\n } as TreeNode;\n if (c.contributionId) {\n const children = contributionRegistry.getContributions(\n c.contributionId\n ) as TreeContribution[];\n node.leaf = children.length === 0;\n node.children = this.toTreeNodes(children);\n }\n return node;\n });\n }\n\n private wgetParamsFromCatalogData(data: { url?: string; filename?: string; openInNewTab?: boolean }) {\n if (!data?.url || data.openInNewTab) return null;\n const params: { url: string; filename?: string } = { url: data.url };\n if (typeof data.filename === \"string\" && data.filename.trim()) {\n params.filename = data.filename.trim();\n }\n return params;\n }\n\n private openInNewTabFromCatalogData(data: { url?: string; openInNewTab?: boolean }) {\n if (!data?.url || !data.openInNewTab) return null;\n return data.url;\n }\n\n private openCatalogUrl(url: string) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\n\n onItemDblClicked(event: Event) {\n const item = event.currentTarget as HTMLElement & { model?: TreeNode; expanded?: boolean };\n const node = item?.model;\n if (!node) return;\n const externalUrl = this.openInNewTabFromCatalogData(node.data);\n if (externalUrl) {\n this.openCatalogUrl(externalUrl);\n return;\n }\n const wgetParams = this.wgetParamsFromCatalogData(node.data);\n if (wgetParams) {\n void this.executeCommand(\"wget\", wgetParams);\n return;\n }\n if (!node.leaf && \"expanded\" in item) {\n item.expanded = !item.expanded;\n }\n }\n\n private runActionForSelection() {\n const item = activeSelectionSignal.get();\n const externalUrl = item && this.openInNewTabFromCatalogData(item as { url?: string; openInNewTab?: boolean });\n if (externalUrl) {\n this.openCatalogUrl(externalUrl);\n return;\n }\n const wgetParams = item && this.wgetParamsFromCatalogData(item as { url?: string; filename?: string; openInNewTab?: boolean });\n if (wgetParams) {\n void this.executeCommand(\"wget\", wgetParams);\n }\n }\n\n onSelectionChanged(event: Event) {\n const node: TreeNode = (event as CustomEvent).detail.selection[0]\n .model;\n activeSelectionSignal.set(node.data);\n }\n\n protected renderContextMenu() {\n const item = activePartSignal.get() instanceof DocksCatalog ? activeSelectionSignal.get() : undefined;\n const hasUrl = item && \"url\" in item && item.url;\n const openExternal = item && \"openInNewTab\" in item && item.openInNewTab;\n return html`\n ${renderDropdownItem({\n icon: 'file-arrow-down',\n label: openExternal ? 'Open download' : 'Checkout',\n title: openExternal ? 'Open download in browser' : 'Checkout',\n disabled: !hasUrl,\n action: () => this.runActionForSelection(),\n })}\n `;\n }\n\n public setAllExpanded(expanded: boolean) {\n const tree = this.treeRef.value;\n if (tree) {\n tree.querySelectorAll(\"wa-tree-item\").forEach((item: any) => {\n item.expanded = expanded;\n });\n }\n }\n\n public refresh() {\n this.rebuildTree();\n }\n\n createTreeItems(node: TreeNode, expanded = false): TemplateResult {\n if (!node) {\n return html``;\n }\n const openExternal = Boolean(\n node.data && \"openInNewTab\" in node.data && node.data.openInNewTab\n );\n return html`\n <wa-tree-item\n @dblclick=${this.nobubble(this.onItemDblClicked)}\n .model=${node}\n ?expanded=${expanded}\n >\n <span class=\"catalog-tree-label\">\n ${icon(node.icon)} ${node.label}\n ${openExternal\n ? html`<span class=\"catalog-external-suffix\" title=\"Opens in browser\">${icon(\"arrow-up-right-from-square\")}</span>`\n : \"\"}\n </span>\n ${node.children?.map((child) => this.createTreeItems(child))}\n </wa-tree-item>\n `;\n }\n\n protected renderContent() {\n const hasItems = (this.rootNodes?.length ?? 0) > 0;\n return html`\n <div class=\"catalog-root\">\n ${hasItems\n ? html`\n <wa-tree\n ${ref(this.treeRef)}\n @wa-selection-change=${this.nobubble(this.onSelectionChanged)}\n style=\"--indent-guide-width: 1px;\"\n >\n ${this.rootNodes!.map((node) =>\n this.createTreeItems(node, true)\n )}\n </wa-tree>\n `\n : html`\n <docks-no-content\n message=${CATALOG_EMPTY_MESSAGE}\n icon=\"book\"\n ></docks-no-content>\n `}\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n }\n\n .catalog-root {\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .catalog-root wa-tree {\n flex: 1;\n min-height: 0;\n }\n\n .catalog-tree-label {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n }\n\n .catalog-external-suffix {\n opacity: 0.65;\n font-size: 0.85em;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-catalog\": DocksCatalog;\n }\n}\n","import { html } from \"@eclipse-docks/core/externals/lit\";\nimport { contributionRegistry, SIDEBAR_MAIN } from \"@eclipse-docks/core\";\nimport \"./docks-catalog\";\n\ncontributionRegistry.registerContribution(SIDEBAR_MAIN, {\n name: \"catalog\",\n label: \"Catalog\",\n icon: \"book\",\n component: (id: string) => html`<docks-catalog id=\"${id}\"></docks-catalog>`,\n} as any);\n"],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ import { TreeContribution } from '@eclipse-docks/core';
|
|
|
3
3
|
export type CatalogResourceState = {
|
|
4
4
|
url: string;
|
|
5
5
|
filename?: string;
|
|
6
|
+
/** Open URL in a new browser tab instead of wget into the workspace. */
|
|
7
|
+
openInNewTab?: boolean;
|
|
6
8
|
};
|
|
7
9
|
export interface CatalogContribution extends TreeContribution {
|
|
8
10
|
items?: CatalogContribution[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-catalog.d.ts","sourceRoot":"","sources":["../src/register-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,gBAAgB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,yGAAyG;AACzG,MAAM,MAAM,oBAAoB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"register-catalog.d.ts","sourceRoot":"","sources":["../src/register-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,gBAAgB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,yGAAyG;AACzG,MAAM,MAAM,oBAAoB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IACzD,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAgCpF"}
|