@genexus/genexus-ide-ui 3.2.21 → 3.2.22

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.
Files changed (52) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/gx-ide-plugin-details.cjs.entry.js +31 -13
  3. package/dist/cjs/gx-ide-plugin-details.cjs.entry.js.map +1 -1
  4. package/dist/cjs/gx-ide-plugin-explorer.cjs.entry.js +97 -48
  5. package/dist/cjs/gx-ide-plugin-explorer.cjs.entry.js.map +1 -1
  6. package/dist/cjs/gx-ide-progress-bar.cjs.entry.js +1 -1
  7. package/dist/cjs/gx-ide-progress-bar.cjs.entry.js.map +1 -1
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/collection/components/_helpers/progress-bar/progress-bar.css +10 -0
  10. package/dist/collection/components/plugin-details/gx-ide-assets/plugin-details/langs/plugin-details.lang.en.json +3 -1
  11. package/dist/collection/components/plugin-details/gx-ide-assets/plugin-details/langs/plugin-details.lang.ja.json +3 -1
  12. package/dist/collection/components/plugin-details/gx-ide-assets/plugin-details/langs/plugin-details.lang.zh.json +3 -1
  13. package/dist/collection/components/plugin-details/plugin-details.css +7 -1
  14. package/dist/collection/components/plugin-details/plugin-details.js +75 -16
  15. package/dist/collection/components/plugin-details/plugin-details.js.map +1 -1
  16. package/dist/collection/components/plugin-explorer/plugin-explorer.css +83 -26
  17. package/dist/collection/components/plugin-explorer/plugin-explorer.js +105 -56
  18. package/dist/collection/components/plugin-explorer/plugin-explorer.js.map +1 -1
  19. package/dist/components/gx-ide-plugin-details.js +40 -14
  20. package/dist/components/gx-ide-plugin-details.js.map +1 -1
  21. package/dist/components/gx-ide-plugin-explorer.js +107 -52
  22. package/dist/components/gx-ide-plugin-explorer.js.map +1 -1
  23. package/dist/components/progress-bar.js +1 -1
  24. package/dist/components/progress-bar.js.map +1 -1
  25. package/dist/esm/genexus-ide-ui.js +1 -1
  26. package/dist/esm/gx-ide-plugin-details.entry.js +31 -13
  27. package/dist/esm/gx-ide-plugin-details.entry.js.map +1 -1
  28. package/dist/esm/gx-ide-plugin-explorer.entry.js +97 -48
  29. package/dist/esm/gx-ide-plugin-explorer.entry.js.map +1 -1
  30. package/dist/esm/gx-ide-progress-bar.entry.js +1 -1
  31. package/dist/esm/gx-ide-progress-bar.entry.js.map +1 -1
  32. package/dist/esm/loader.js +1 -1
  33. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  34. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  35. package/dist/genexus-ide-ui/gx-ide-assets/plugin-details/langs/plugin-details.lang.en.json +3 -1
  36. package/dist/genexus-ide-ui/gx-ide-assets/plugin-details/langs/plugin-details.lang.ja.json +3 -1
  37. package/dist/genexus-ide-ui/gx-ide-assets/plugin-details/langs/plugin-details.lang.zh.json +3 -1
  38. package/dist/genexus-ide-ui/{p-b3c5c315.entry.js → p-63e41ecd.entry.js} +2 -2
  39. package/dist/genexus-ide-ui/p-63e41ecd.entry.js.map +1 -0
  40. package/dist/genexus-ide-ui/p-e82d9621.entry.js +317 -0
  41. package/dist/genexus-ide-ui/p-e82d9621.entry.js.map +1 -0
  42. package/dist/genexus-ide-ui/p-ef8663dd.entry.js +284 -0
  43. package/dist/genexus-ide-ui/p-ef8663dd.entry.js.map +1 -0
  44. package/dist/types/components/plugin-details/plugin-details.d.ts +21 -3
  45. package/dist/types/components/plugin-explorer/plugin-explorer.d.ts +31 -4
  46. package/dist/types/components.d.ts +34 -14
  47. package/package.json +1 -1
  48. package/dist/genexus-ide-ui/p-514445ac.entry.js +0 -291
  49. package/dist/genexus-ide-ui/p-514445ac.entry.js.map +0 -1
  50. package/dist/genexus-ide-ui/p-b3c5c315.entry.js.map +0 -1
  51. package/dist/genexus-ide-ui/p-fc0bc991.entry.js +0 -204
  52. package/dist/genexus-ide-ui/p-fc0bc991.entry.js.map +0 -1
@@ -0,0 +1,317 @@
1
+ import { g as i, r as s, h as t, H as e, a } from "./p-9b9ccd0c.js";
2
+
3
+ import { g as n } from "./p-d42e842b.js";
4
+
5
+ import "./p-6534555e.js";
6
+
7
+ import "lit";
8
+
9
+ import "lit/directives/when.js";
10
+
11
+ import "lit/directives/if-defined.js";
12
+
13
+ import { L as r } from "./p-311eedf3.js";
14
+
15
+ const o = 'ch-tab-render.tab{background-color:transparent;border-color:transparent}ch-tab-render.tab::part(tab-list block-start){border-block-end:none}ch-tab-render.tab::part(tab block closable),ch-tab-render.tab::part(tab block not-closable){background-color:transparent}:host{display:grid;block-size:100%;grid-template-areas:"header header" "main aside";grid-template-rows:max-content 1fr;grid-template-columns:1fr 280px;row-gap:var(--spacing-gap-l)}.section{display:contents}.header{display:grid;grid-area:header;grid-template-areas:"plugin-icon plugin-details";grid-template-columns:64px 1fr;column-gap:var(--spacing-gap-xl);padding-block-start:var(--spacing-padding-xxl);padding-block-end:var(--spacing-padding-xl);padding-inline:var(--spacing-padding-xxl)}.plugin__icon{grid-area:plugin-icon;inline-size:100%;block-size:auto;display:block}.plugin__details{grid-area:plugin-details;display:flex;flex-direction:column;gap:var(--spacing-gap-m)}.plugin__publisher{display:flex;align-items:center;gap:var(--spacing-gap-xs)}.plugin__description{line-height:var(--line-height-spacious)}.plugin__actions-container{margin-block-start:var(--spacing-padding-m);align-items:center;min-block-size:calc(var(--control-block-size) + var(--spacing-gap-xs) + 4px)}.action-button{min-inline-size:100px}.action-button.more-versions-available{border-start-end-radius:0 !important;border-end-end-radius:0 !important}.installed-container{display:flex;align-items:center;gap:var(--spacing-gap-m)}.installed-container ch-image{--ch-image-size:20px}.main{grid-area:main}.docsTab{block-size:100%}.aside{grid-area:aside;overflow:auto;border-block-start:1px solid var(--items-container__border-color)}.fields__list{list-style:none;padding:0;margin:0;font-size:var(--font-size-body-s)}.plugin__info-category{display:flex;flex-direction:column;gap:var(--spacing-gap-m)}.plugin__info-category:not(:first-child){padding-block-start:var(--spacing-padding-xl);margin-block-start:var(--spacing-padding-xl);border-block-start:1px solid var(--color-border-surface-on-elevation-1)}.fields__list:not(.fields__list--as-tags){display:flex;flex-direction:column;gap:var(--spacing-gap-m)}.fields__list:not(.fields__list--as-tags) .field__li{display:flex;gap:var(--spacing-gap-xl)}.fields__list--as-tags{display:flex;flex-wrap:wrap;gap:var(--spacing-gap-m)}.fields__list--as-tags .field__li{border:1px solid var(--color-border-surface-on-elevation-1);padding-block:var(--spacing-padding-xxs);padding-inline:var(--spacing-padding-m);border-radius:4px;text-transform:lowercase}.fields__list--as-tags .field__link{color:var(--color-text-neutral-strawberry)}.fields__list--as-tags .field__link:hover{color:var(--color-accent-primary-default)}.fields__list--as-tags .field__link:active{color:var(--color-accent-primary-hover)}.field__name,.field__value{flex:1}.field__link{color:var(--color-accent-primary-default)}.field__link:hover{color:var(--color-accent-primary-hover)}.field__link:active{color:var(--color-accent-primary-pressed)}.docsTab{background-color:transparent !important}.dropdown.button-icon-only::part(expandable-button){padding:calc( (var(--control-block-size) - 2 * var(--control-border-width) - 16px) / 2 ) !important;border-start-start-radius:0 !important;border-end-start-radius:0 !important}.version-buttons-container{display:flex;align-items:stretch;gap:1px}.install-progress{flex:1;min-inline-size:220px}ch-markdown-viewer{block-size:100%;overflow:auto}.text-underline{text-decoration:underline}';
16
+
17
+ var l = undefined && undefined.__classPrivateFieldGet || function(i, s, t, e) {
18
+ if (t === "a" && !e) throw new TypeError("Private accessor was defined without a getter");
19
+ if (typeof s === "function" ? i !== s || !e : !s.has(i)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
+ return t === "m" ? e : t === "a" ? e.call(i) : e ? e.value : s.get(i);
21
+ };
22
+
23
+ var c = undefined && undefined.__classPrivateFieldSet || function(i, s, t, e, a) {
24
+ if (e === "m") throw new TypeError("Private method is not writable");
25
+ if (e === "a" && !a) throw new TypeError("Private accessor was defined without a setter");
26
+ if (typeof s === "function" ? i !== s || !a : !s.has(i)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
27
+ return e === "a" ? a.call(i, t) : a ? a.value = t : s.set(i, t), t;
28
+ };
29
+
30
+ var d, p, h, g, f, u, m, b, v, _, k, w, y, x, M, W, z, T;
31
+
32
+ const j = n({
33
+ category: "system",
34
+ name: "user",
35
+ colorType: "on-surface"
36
+ });
37
+
38
+ const C = n({
39
+ category: "system",
40
+ name: "chevron-down",
41
+ colorType: "on-primary"
42
+ });
43
+
44
+ const E = n({
45
+ category: "system",
46
+ name: "check-circle",
47
+ colorType: "success"
48
+ });
49
+
50
+ // plugin icon if no iconUri was provided
51
+ const L = i(`./gx-ide-assets/plugin-manager/images/plugin-icon.svg`);
52
+
53
+ const $ = [ "resets/box-sizing", "chameleon/scrollbar", "components/button", "components/dropdown", "components/edit", "components/icon", "components/list-box", "components/tab", "utils/form", "utils/layout", "utils/spacing", "utils/typography" ];
54
+
55
+ const P = class {
56
+ constructor(i) {
57
+ s(this, i);
58
+ /**
59
+ * The component hard-coded strings translations.
60
+ */
61
+ // eslint-disable-next-line @stencil-community/own-props-must-be-private
62
+ d.set(this, void 0);
63
+ p.set(this, void 0);
64
+ // A map between docSection "id", and docSection "description".
65
+ // "id" is generated inside this component.
66
+ h.set(this, new Map);
67
+ g.set(this, (() => {
68
+ var i;
69
+ const s = (i = this.data.versions) === null || i === void 0 ? void 0 : i.map((i => ({
70
+ id: String(i.versionId),
71
+ caption: i.version
72
+ })));
73
+ return s;
74
+ }));
75
+ f.set(this, (i => {
76
+ const s = i.detail.id;
77
+ this.installCallback(s != null ? Number(s) : undefined);
78
+ }));
79
+ u.set(this, (() => t("button", {
80
+ class: "button-tertiary",
81
+ onClick: l(this, _, "f")
82
+ }, l(this, d, "f").actions.uninstall)));
83
+ // The latest version is listed first; its ordinal drives install/update from the primary button.
84
+ m.set(this, (() => {
85
+ var i, s;
86
+ return (s = (i = this.data.versions) === null || i === void 0 ? void 0 : i[0]) === null || s === void 0 ? void 0 : s.versionId;
87
+ }));
88
+ b.set(this, (() => {
89
+ this.installCallback(l(this, m, "f").call(this));
90
+ }));
91
+ v.set(this, (i => s => {
92
+ if (this.openLinkCallback) {
93
+ s.preventDefault();
94
+ this.openLinkCallback(i);
95
+ }
96
+ }));
97
+ _.set(this, (() => {
98
+ this.uninstallCallback();
99
+ }));
100
+ k.set(this, (() => {
101
+ this.cancelCallback();
102
+ }));
103
+ w.set(this, (() => {
104
+ const {phase: i, percent: s} = this.installProgress;
105
+ const e = i === "download" ? l(this, d, "f").actions.downloading : l(this, d, "f").actions.installing;
106
+ return t("gx-ide-progress-bar", {
107
+ class: "install-progress plain",
108
+ active: true,
109
+ caption: `${e} ${s}%`,
110
+ progress: s,
111
+ stateType: "in-progress",
112
+ closeType: "button",
113
+ closedCallback: l(this, k, "f")
114
+ });
115
+ }));
116
+ y.set(this, (() => {
117
+ var i;
118
+ // While an install/update is running, replace the buttons with a determinate progress bar.
119
+ if (this.installProgress) {
120
+ return l(this, w, "f").call(this);
121
+ }
122
+ let s;
123
+ let e = "button-primary action-button";
124
+ let a;
125
+ const n = ((i = this.data.versions) === null || i === void 0 ? void 0 : i.length) > 1;
126
+ if (!this.data.installed) {
127
+ s = l(this, d, "f").actions.install;
128
+ a = l(this, b, "f");
129
+ } else if (this.data.updateVersion) {
130
+ s = `${l(this, d, "f").actions.updateTo} ${this.data.updateVersion}`;
131
+ a = () => this.installCallback(l(this, m, "f").call(this));
132
+ } else {
133
+ s = l(this, d, "f").actions.installed;
134
+ }
135
+ if (n) {
136
+ e = `${e} more-versions-available`;
137
+ }
138
+ return [ t("div", {
139
+ class: "version-buttons-container"
140
+ }, t("button", {
141
+ class: e,
142
+ onClick: a
143
+ }, s), n ? t("ch-action-menu-render", {
144
+ class: "dropdown button-primary button-icon-only",
145
+ blockAlign: "outside-end",
146
+ inlineAlign: "inside-start",
147
+ model: l(this, g, "f").call(this),
148
+ onButtonClick: l(this, f, "f")
149
+ }, t("ch-image", {
150
+ src: C,
151
+ class: "icon-m"
152
+ })) : null) ];
153
+ }));
154
+ x.set(this, (i => {
155
+ this.selectedTabId = i.detail.newSelectedId;
156
+ }));
157
+ M.set(this, (() => this.docsTabModel.map((i => {
158
+ if (i.id === this.selectedTabId) {
159
+ const s = l(this, h, "f").get(i.id);
160
+ return t("ch-markdown-viewer", {
161
+ ref: i => c(this, p, i, "f"),
162
+ slot: i.id,
163
+ key: i.id,
164
+ class: "markdown spacing-body scrollable",
165
+ theme: "components/markdown-viewer",
166
+ value: s
167
+ });
168
+ }
169
+ }))));
170
+ W.set(this, (i => i.toLowerCase().replace(/\s+/g, "-")));
171
+ z.set(this, ((i, s, e, a) => t("a", {
172
+ href: i,
173
+ target: "_blank",
174
+ onClick: l(this, v, "f").call(this, i),
175
+ class: e
176
+ }, a && t("ch-image", {
177
+ src: a,
178
+ class: "icon-m"
179
+ }), s)));
180
+ T.set(this, (() => this.data.infoCategories.map((i => t("div", {
181
+ class: "plugin__info-category"
182
+ }, t("h3", {
183
+ class: "subtitle-semi-bold-s"
184
+ }, i.name), t("ul", {
185
+ class: {
186
+ fields__list: true,
187
+ "fields__list--as-tags": i.displayAsTags
188
+ }
189
+ }, i.fields.map((s => {
190
+ // If the field name isn’t specified, only the value is shown — usually a link.
191
+ const e = typeof s.value === "string" ? s.value : l(this, z, "f").call(this, s.value.url, s.value.text, "field__link");
192
+ return t("li", {
193
+ class: "field__li"
194
+ }, s.name && !i.displayAsTags ? // displaysAsTags forces the items to be displayed as tags
195
+ // no span.field__name and span.field__value
196
+ [ t("span", {
197
+ class: "field__name body-semi-bold-s"
198
+ }, s.name), t("span", {
199
+ class: "field__value body-regular-s"
200
+ }, e) ] : e);
201
+ }))))))));
202
+ this.docsTabModel = [];
203
+ this.selectedTabId = undefined;
204
+ this.data = undefined;
205
+ this.installCallback = undefined;
206
+ this.installProgress = undefined;
207
+ this.cancelCallback = undefined;
208
+ this.openLinkCallback = undefined;
209
+ this.uninstallCallback = undefined;
210
+ }
211
+ async componentWillLoad() {
212
+ var i;
213
+ c(this, d, await r.getComponentStrings(this.el), "f");
214
+ if ((i = this.data.docSections) === null || i === void 0 ? void 0 : i.length) {
215
+ this.docsTabModel = this.data.docSections.map(((i, s) => {
216
+ const t = l(this, W, "f").call(this, i.name);
217
+ l(this, h, "f").set(t, i.content);
218
+ if (s === 0) {
219
+ this.selectedTabId = t;
220
+ }
221
+ return {
222
+ id: t,
223
+ name: i.name
224
+ };
225
+ }));
226
+ }
227
+ }
228
+ componentDidLoad() {
229
+ var i;
230
+ // Guard: #chMarkdownViewer is unset when there are no docSections.
231
+ (i = l(this, p, "f")) === null || i === void 0 ? void 0 : i.addEventListener("click", (i => {
232
+ // Listens for clicks on links inside <ch-markdown-viewer>.
233
+ // If a link (<a>) is clicked and openLinkCallback is defined,
234
+ // it prevents the default navigation and delegates the event
235
+ // to this.#openLinkHandler, passing the link's href.
236
+ const s = i.composedPath();
237
+ const t = s.find((i => i instanceof HTMLAnchorElement));
238
+ if (t === null || t === void 0 ? void 0 : t.href) {
239
+ l(this, v, "f").call(this, t.href)(i);
240
+ }
241
+ }));
242
+ }
243
+ render() {
244
+ const i = !this.data.installed || this.data.installed && !!this.data.updateVersion;
245
+ const s = this.data.name.text;
246
+ const a = this.data.name.url;
247
+ const n = s && a;
248
+ const r = s || this.data.name;
249
+ const o = this.data.publisher.text;
250
+ const c = this.data.publisher.url;
251
+ const p = o && c;
252
+ const h = o || this.data.publisher;
253
+ return t(e, {
254
+ class: "widget"
255
+ }, t("ch-theme", {
256
+ model: $
257
+ }), t("section", {
258
+ class: "section"
259
+ }, t("header", {
260
+ class: "header"
261
+ }, t("img", {
262
+ class: "plugin__icon",
263
+ src: this.data.iconUrl || L,
264
+ alt: "plugin extension icon"
265
+ }), t("div", {
266
+ class: "plugin__details"
267
+ }, n ? t("h2", {
268
+ class: "heading-5 has-link"
269
+ }, l(this, z, "f").call(this, a, r, "text-underline")) : t("h2", {
270
+ class: "heading-5"
271
+ }, r), p ? l(this, z, "f").call(this, c, r, "text-underline plugin__publisher caption-semi-bold-l", j) : t("p", {
272
+ class: "plugin__publisher caption-semi-bold-l"
273
+ }, t("ch-image", {
274
+ src: j,
275
+ class: "icon-s"
276
+ }), h), t("p", {
277
+ class: "plugin__description"
278
+ }, this.data.description), t("div", {
279
+ class: "buttons-spacer plugin__actions-container"
280
+ }, i ? l(this, y, "f").call(this) :
281
+ // installed and no updates
282
+ t("p", {
283
+ class: "installed-container subtitle-semi-bold-s"
284
+ }, t("ch-image", {
285
+ src: E,
286
+ class: "icon-s"
287
+ }), l(this, d, "f").actions.installed), this.data.installed && l(this, u, "f").call(this)))), t("div", {
288
+ class: "main"
289
+ }, this.docsTabModel.length > 0 && t("ch-tab-render", {
290
+ class: "tab docsTab scrollable",
291
+ tabListPosition: "block-start",
292
+ overflow: "auto",
293
+ contain: "size",
294
+ model: this.docsTabModel,
295
+ onSelectedItemChange: l(this, x, "f"),
296
+ selectedId: this.selectedTabId
297
+ }, l(this, M, "f").call(this))), t("div", {
298
+ class: "aside spacing-body scrollable"
299
+ }, l(this, T, "f").call(this))));
300
+ }
301
+ static get assetsDirs() {
302
+ return [ "gx-ide-assets/plugin-details" ];
303
+ }
304
+ get el() {
305
+ return a(this);
306
+ }
307
+ };
308
+
309
+ d = new WeakMap, p = new WeakMap, h = new WeakMap, g = new WeakMap, f = new WeakMap,
310
+ u = new WeakMap, m = new WeakMap, b = new WeakMap, v = new WeakMap, _ = new WeakMap,
311
+ k = new WeakMap, w = new WeakMap, y = new WeakMap, x = new WeakMap, M = new WeakMap,
312
+ W = new WeakMap, z = new WeakMap, T = new WeakMap;
313
+
314
+ P.style = o;
315
+
316
+ export { P as gx_ide_plugin_details };
317
+ //# sourceMappingURL=p-e82d9621.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["pluginDetailsCss","USER_ICON","getIconPath","category","name","colorType","CHEVRON_DOWN_ICON","CHECK_CIRCLE_ICON","EXTENSION_ICON_IMG","getAssetPath","CSS_BUNDLES","GxIdePluginDetails","_GxIdePluginDetails_componentLocale","set","this","_GxIdePluginDetails_chMarkdownViewer","_GxIdePluginDetails_docSectionIdDescriptionMap","Map","_GxIdePluginDetails_versionsMenuOptionsModel","versionsToUpdateMenusModel","_a","data","versions","map","version","id","String","versionId","caption","_GxIdePluginDetails_menuVersionSelectedHandler","event","selectedVersionId","detail","installCallback","Number","undefined","_GxIdePluginDetails_renderUninstallButton","h","class","onClick","__classPrivateFieldGet","_GxIdePluginDetails_uninstallClickedHandler","actions","uninstall","_GxIdePluginDetails_latestVersionId","_b","_GxIdePluginDetails_installClickedHandler","call","_GxIdePluginDetails_openLinkHandler","link","openLinkCallback","preventDefault","uninstallCallback","_GxIdePluginDetails_cancelClickedHandler","cancelCallback","_GxIdePluginDetails_renderInstallProgress","phase","percent","installProgress","downloading","installing","active","progress","stateType","closeType","closedCallback","_GxIdePluginDetails_renderActionButtons","actionButtonCaption","actionButtonClasses","actionButtonCallback","moreVersionsToUpdate","length","installed","install","updateVersion","updateTo","blockAlign","inlineAlign","model","onButtonClick","src","_GxIdePluginDetails_tabSelectionChangedHandler","selectedTabId","newSelectedId","_GxIdePluginDetails_renderDocSectionsSlots","docsTabModel","docSectionTab","markdownValue","get","ref","el","__classPrivateFieldSet","slot","key","theme","value","_GxIdePluginDetails_returnFormatedId","rawId","toLowerCase","replace","_GxIdePluginDetails_renderLinkTag","href","label","cssClass","chImageSrc","target","_GxIdePluginDetails_renderAsideContent","infoCategories","infoCategory","fields__list","displayAsTags","fields","field","fieldValue","url","text","componentWillLoad","Locale","getComponentStrings","docSections","docSection","i","formatedId","content","componentDidLoad","addEventListener","path","composedPath","find","HTMLAnchorElement","render","renderActionButtons","titleLinkDataText","titleLinkDataUrl","titleHasLink","titleText","publisherDataText","publisher","publisherDataUrl","publisherHasLink","publisherText","Host","iconUrl","alt","description","tabListPosition","overflow","contain","onSelectedItemChange","selectedId"],"sources":["src/components/plugin-details/plugin-details.scss?tag=gx-ide-plugin-details&encapsulation=shadow","src/components/plugin-details/plugin-details.tsx"],"sourcesContent":["@import \"../../global/temporary-mercury-overrides/_tab.scss\";\n\n:host {\n display: grid;\n block-size: 100%;\n grid-template-areas:\n \"header header\"\n \"main aside\";\n grid-template-rows: max-content 1fr;\n grid-template-columns: 1fr 280px;\n row-gap: var(--spacing-gap-l);\n}\n\n.section {\n display: contents;\n}\n\n// header\n.header {\n display: grid;\n grid-area: header;\n grid-template-areas: \"plugin-icon plugin-details\";\n grid-template-columns: 64px 1fr;\n column-gap: var(--spacing-gap-xl);\n padding-block-start: var(--spacing-padding-xxl);\n padding-block-end: var(--spacing-padding-xl);\n padding-inline: var(--spacing-padding-xxl);\n}\n.plugin__icon {\n grid-area: plugin-icon;\n inline-size: 100%;\n block-size: auto;\n display: block;\n}\n.plugin__details {\n grid-area: plugin-details;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-gap-m);\n}\n.plugin__publisher {\n display: flex;\n align-items: center;\n gap: var(--spacing-gap-xs);\n}\n.plugin__description {\n line-height: var(--line-height-spacious); // WA: Text appears too tight.\n}\n.plugin__actions-container {\n margin-block-start: var(--spacing-padding-m);\n align-items: center;\n // Reserve the taller progress-bar height (control + gap + bar) so swapping\n // the install button for the progress bar doesn't shift the layout.\n min-block-size: calc(var(--control-block-size) + var(--spacing-gap-xs) + 4px);\n}\n.action-button {\n min-inline-size: 100px;\n\n &.more-versions-available {\n border-start-end-radius: 0 !important;\n border-end-end-radius: 0 !important;\n }\n}\n.installed-container {\n display: flex;\n align-items: center;\n gap: var(--spacing-gap-m);\n\n // WA Biggest Mercury icon (icon-s) looks small in this case.\n // Mercury should expose more icon sizes.\n ch-image {\n --ch-image-size: 20px;\n }\n}\n\n// main\n.main {\n grid-area: main;\n}\n.docsTab {\n block-size: 100%;\n}\n\n// aside\n.aside {\n grid-area: aside;\n overflow: auto;\n border-block-start: 1px solid var(--items-container__border-color);\n}\n.fields__list {\n list-style: none;\n padding: 0;\n margin: 0;\n font-size: var(--font-size-body-s);\n}\n.plugin__info-category {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-gap-m);\n\n &:not(:first-child) {\n padding-block-start: var(--spacing-padding-xl);\n margin-block-start: var(--spacing-padding-xl);\n border-block-start: 1px solid var(--color-border-surface-on-elevation-1);\n }\n}\n.fields__list:not(.fields__list--as-tags) {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-gap-m);\n .field__li {\n display: flex;\n gap: var(--spacing-gap-xl);\n }\n}\n.fields__list--as-tags {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-gap-m);\n\n .field__li {\n border: 1px solid var(--color-border-surface-on-elevation-1);\n padding-block: var(--spacing-padding-xxs);\n padding-inline: var(--spacing-padding-m);\n border-radius: 4px;\n\n text-transform: lowercase;\n }\n .field__link {\n color: var(--color-text-neutral-strawberry);\n\n &:hover {\n color: var(--color-accent-primary-default);\n }\n &:active {\n color: var(--color-accent-primary-hover);\n }\n }\n}\n\n.field__name,\n.field__value {\n flex: 1;\n}\n// WA: Link styles should be defined Mercury\n.field__link {\n color: var(--color-accent-primary-default);\n &:hover {\n color: var(--color-accent-primary-hover);\n }\n &:active {\n color: var(--color-accent-primary-pressed);\n }\n}\n// WA: Remove tab elevation background color\n.docsTab {\n background-color: transparent !important;\n}\n\n// WA: Styles for \"button-icon-only\" should be defined on mercury\n.dropdown.button-icon-only::part(expandable-button) {\n padding: calc(\n (var(--control-block-size) - 2 * var(--control-border-width) - 16px) / 2\n ) !important;\n border-start-start-radius: 0 !important;\n border-end-start-radius: 0 !important;\n}\n\n.version-buttons-container {\n display: flex;\n align-items: stretch;\n gap: 1px;\n}\n\n.install-progress {\n flex: 1;\n min-inline-size: 220px;\n}\n\nch-markdown-viewer {\n block-size: 100%;\n overflow: auto;\n}\n\n// WA: Need text with underline. This should be defined on Mercury\n.text-underline {\n text-decoration: underline;\n}\n","import {\n Component,\n Host,\n State,\n Prop,\n Element,\n h,\n getAssetPath,\n JSX\n} from \"@stencil/core\";\n\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { Locale } from \"../../common/locale\";\nimport { ActionMenuModel, TabModel } from \"@genexus/chameleon-controls-library\";\nimport { TabItemModel } from \"@genexus/chameleon-controls-library/dist/types/components/tab/types\";\n\nconst USER_ICON = getIconPath({\n category: \"system\",\n name: \"user\",\n colorType: \"on-surface\"\n});\nconst CHEVRON_DOWN_ICON = getIconPath({\n category: \"system\",\n name: \"chevron-down\",\n colorType: \"on-primary\"\n});\nconst CHECK_CIRCLE_ICON = getIconPath({\n category: \"system\",\n name: \"check-circle\",\n colorType: \"success\"\n});\n\n// plugin icon if no iconUri was provided\nconst EXTENSION_ICON_IMG = getAssetPath(\n `./gx-ide-assets/plugin-manager/images/plugin-icon.svg`\n);\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"chameleon/scrollbar\",\n \"components/button\",\n \"components/dropdown\",\n \"components/edit\",\n \"components/icon\",\n \"components/list-box\",\n \"components/tab\",\n \"utils/form\",\n \"utils/layout\",\n \"utils/spacing\",\n \"utils/typography\"\n];\n\n@Component({\n tag: \"gx-ide-plugin-details\",\n styleUrl: \"plugin-details.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/plugin-details\"]\n})\nexport class GxIdePluginDetails {\n /**\n * The component hard-coded strings translations.\n */\n // eslint-disable-next-line @stencil-community/own-props-must-be-private\n #componentLocale: any;\n\n #chMarkdownViewer: HTMLChMarkdownViewerElement;\n\n // A map between docSection \"id\", and docSection \"description\".\n // \"id\" is generated inside this component.\n #docSectionIdDescriptionMap: Map<string, string> = new Map();\n\n @Element() el: HTMLGxIdePluginDetailsElement;\n\n @State() docsTabModel: TabModel = [];\n @State() selectedTabId: string;\n\n /**\n * Specifies all the information related to a plugin.\n */\n @Prop() readonly data!: PluginDetailsData;\n\n /**\n * Callback that should be invoked when the user performs the install or update action.\n * Receives the ordinal versionId of the selected version (undefined installs the latest).\n */\n @Prop() readonly installCallback!: (versionId?: number) => Promise<void>;\n\n /**\n * When set, the component is installing this plugin and shows a determinate progress bar\n * instead of the action button.\n */\n @Prop() readonly installProgress?: PluginInstallProgress;\n\n /**\n * Callback that should be invoked when the user cancels an in-progress\n * install/update from the progress bar.\n */\n @Prop() readonly cancelCallback!: () => Promise<void>;\n\n /**\n * Callback that should be invoked when the user attempts to open any link displayed in this component.\n */\n @Prop() readonly openLinkCallback!: (url: string) => Promise<void>;\n\n /**\n * Callback that should be invoked when the user performs the uninstall action.\n */\n @Prop() readonly uninstallCallback!: () => Promise<void>;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n\n if (this.data.docSections?.length) {\n this.docsTabModel = this.data.docSections.map((docSection, i) => {\n const formatedId = this.#returnFormatedId(docSection.name);\n\n this.#docSectionIdDescriptionMap.set(formatedId, docSection.content);\n\n if (i === 0) {\n this.selectedTabId = formatedId;\n }\n return {\n id: formatedId,\n name: docSection.name\n } as TabItemModel;\n });\n }\n }\n\n componentDidLoad() {\n // Guard: #chMarkdownViewer is unset when there are no docSections.\n this.#chMarkdownViewer?.addEventListener(\"click\", event => {\n // Listens for clicks on links inside <ch-markdown-viewer>.\n // If a link (<a>) is clicked and openLinkCallback is defined,\n // it prevents the default navigation and delegates the event\n // to this.#openLinkHandler, passing the link's href.\n const path = event.composedPath() as EventTarget[];\n\n const link = path.find(el => el instanceof HTMLAnchorElement) as\n | HTMLAnchorElement\n | undefined;\n\n if (link?.href) {\n this.#openLinkHandler(link.href)(event);\n }\n });\n }\n\n #versionsMenuOptionsModel = (): ActionMenuModel => {\n const versionsToUpdateMenusModel: ActionMenuModel = this.data.versions?.map(\n version => {\n // The menu id carries the ordinal versionId; the caption shows the human-readable version.\n return { id: String(version.versionId), caption: version.version };\n }\n );\n return versionsToUpdateMenusModel;\n };\n\n #menuVersionSelectedHandler = (\n event: CustomEvent<{\n id?: string;\n }>\n ) => {\n const selectedVersionId = event.detail.id;\n this.installCallback(\n selectedVersionId != null ? Number(selectedVersionId) : undefined\n );\n };\n\n #renderUninstallButton = (): JSX.Element => {\n return (\n <button class=\"button-tertiary\" onClick={this.#uninstallClickedHandler}>\n {this.#componentLocale.actions.uninstall}\n </button>\n );\n };\n\n // The latest version is listed first; its ordinal drives install/update from the primary button.\n #latestVersionId = (): number | undefined =>\n this.data.versions?.[0]?.versionId;\n\n #installClickedHandler = () => {\n this.installCallback(this.#latestVersionId());\n };\n\n #openLinkHandler = (link: string) => (event: MouseEvent) => {\n if (this.openLinkCallback) {\n event.preventDefault();\n this.openLinkCallback(link);\n }\n };\n\n #uninstallClickedHandler = () => {\n this.uninstallCallback();\n };\n\n #cancelClickedHandler = () => {\n this.cancelCallback();\n };\n\n #renderInstallProgress = (): JSX.Element => {\n const { phase, percent } = this.installProgress;\n const caption =\n phase === \"download\"\n ? this.#componentLocale.actions.downloading\n : this.#componentLocale.actions.installing;\n\n return (\n <gx-ide-progress-bar\n class=\"install-progress plain\"\n active\n caption={`${caption} ${percent}%`}\n progress={percent}\n stateType=\"in-progress\"\n closeType=\"button\"\n closedCallback={this.#cancelClickedHandler}\n ></gx-ide-progress-bar>\n );\n };\n\n #renderActionButtons = (): JSX.Element => {\n // While an install/update is running, replace the buttons with a determinate progress bar.\n if (this.installProgress) {\n return this.#renderInstallProgress();\n }\n\n let actionButtonCaption;\n let actionButtonClasses = \"button-primary action-button\";\n let actionButtonCallback;\n const moreVersionsToUpdate = this.data.versions?.length > 1;\n\n if (!this.data.installed) {\n actionButtonCaption = this.#componentLocale.actions.install;\n actionButtonCallback = this.#installClickedHandler;\n } else if (this.data.updateVersion) {\n actionButtonCaption = `${this.#componentLocale.actions.updateTo} ${\n this.data.updateVersion\n }`;\n actionButtonCallback = () =>\n this.installCallback(this.#latestVersionId());\n } else {\n actionButtonCaption = this.#componentLocale.actions.installed;\n }\n\n if (moreVersionsToUpdate) {\n actionButtonClasses = `${actionButtonClasses} more-versions-available`;\n }\n\n return [\n <div class=\"version-buttons-container\">\n <button class={actionButtonClasses} onClick={actionButtonCallback}>\n {actionButtonCaption}\n </button>\n {moreVersionsToUpdate ? (\n <ch-action-menu-render\n class=\"dropdown button-primary button-icon-only\"\n blockAlign=\"outside-end\"\n inlineAlign=\"inside-start\"\n model={this.#versionsMenuOptionsModel()}\n onButtonClick={this.#menuVersionSelectedHandler}\n >\n <ch-image src={CHEVRON_DOWN_ICON} class=\"icon-m\"></ch-image>\n </ch-action-menu-render>\n ) : null}\n </div>\n ];\n };\n\n #tabSelectionChangedHandler = (\n event: CustomEvent<{\n lastSelectedIndex: number;\n newSelectedId: string;\n newSelectedIndex: number;\n }>\n ): void => {\n this.selectedTabId = event.detail.newSelectedId;\n };\n\n #renderDocSectionsSlots = (): JSX.Element => {\n return this.docsTabModel.map(docSectionTab => {\n if (docSectionTab.id === this.selectedTabId) {\n const markdownValue = this.#docSectionIdDescriptionMap.get(\n docSectionTab.id\n );\n\n return (\n <ch-markdown-viewer\n ref={(el: HTMLChMarkdownViewerElement) =>\n (this.#chMarkdownViewer = el as HTMLChMarkdownViewerElement)\n }\n slot={docSectionTab.id}\n key={docSectionTab.id}\n class=\"markdown spacing-body scrollable\"\n theme=\"components/markdown-viewer\"\n value={markdownValue}\n ></ch-markdown-viewer>\n );\n }\n });\n };\n\n #returnFormatedId = (rawId: string): string => {\n return rawId.toLowerCase().replace(/\\s+/g, \"-\");\n };\n\n #renderLinkTag = (\n href: string,\n label: string,\n cssClass?: string,\n chImageSrc?: string\n ): HTMLAnchorElement => {\n return (\n <a\n href={href}\n target=\"_blank\"\n onClick={this.#openLinkHandler(href)}\n class={cssClass}\n >\n {chImageSrc && <ch-image src={chImageSrc} class=\"icon-m\"></ch-image>}\n {label}\n </a>\n );\n };\n\n #renderAsideContent = (): JSX.Element => {\n return this.data.infoCategories.map(infoCategory => {\n return (\n <div class=\"plugin__info-category\">\n <h3 class=\"subtitle-semi-bold-s\">{infoCategory.name}</h3>\n <ul\n class={{\n \"fields__list\": true,\n \"fields__list--as-tags\": infoCategory.displayAsTags\n }}\n >\n {infoCategory.fields.map(field => {\n // If the field name isn’t specified, only the value is shown — usually a link.\n const fieldValue: string | HTMLAnchorElement =\n typeof field.value === \"string\"\n ? (field.value as string)\n : this.#renderLinkTag(\n (field.value as LinkData).url,\n (field.value as LinkData).text,\n \"field__link\"\n );\n return (\n <li class=\"field__li\">\n {field.name && !infoCategory.displayAsTags\n ? // displaysAsTags forces the items to be displayed as tags\n // no span.field__name and span.field__value\n [\n <span class=\"field__name body-semi-bold-s\">\n {field.name}\n </span>,\n <span class=\"field__value body-regular-s\">\n {fieldValue}\n </span>\n ]\n : fieldValue}\n </li>\n );\n })}\n </ul>\n </div>\n );\n });\n };\n\n render() {\n const renderActionButtons =\n !this.data.installed ||\n (this.data.installed && !!this.data.updateVersion);\n\n const titleLinkDataText = (this.data.name as LinkData).text;\n const titleLinkDataUrl = (this.data.name as LinkData).url;\n const titleHasLink = titleLinkDataText && titleLinkDataUrl;\n const titleText = titleLinkDataText || this.data.name;\n\n const publisherDataText = (this.data.publisher as LinkData).text;\n const publisherDataUrl = (this.data.publisher as LinkData).url;\n const publisherHasLink = publisherDataText && publisherDataUrl;\n const publisherText = publisherDataText || this.data.publisher;\n\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class=\"section\">\n <header class=\"header\">\n <img\n class=\"plugin__icon\"\n src={this.data.iconUrl || EXTENSION_ICON_IMG}\n alt=\"plugin extension icon\"\n />\n <div class=\"plugin__details\">\n {titleHasLink ? (\n <h2 class=\"heading-5 has-link\">\n {this.#renderLinkTag(\n titleLinkDataUrl,\n titleText as string,\n \"text-underline\"\n )}\n </h2>\n ) : (\n <h2 class=\"heading-5\">{titleText}</h2>\n )}\n {publisherHasLink ? (\n this.#renderLinkTag(\n publisherDataUrl,\n titleText as string,\n \"text-underline plugin__publisher caption-semi-bold-l\",\n USER_ICON\n )\n ) : (\n <p class=\"plugin__publisher caption-semi-bold-l\">\n <ch-image src={USER_ICON} class=\"icon-s\"></ch-image>\n {publisherText}\n </p>\n )}\n\n <p class=\"plugin__description\">{this.data.description}</p>\n <div class=\"buttons-spacer plugin__actions-container\">\n {renderActionButtons ? (\n this.#renderActionButtons()\n ) : (\n // installed and no updates\n <p class=\"installed-container subtitle-semi-bold-s\">\n <ch-image src={CHECK_CIRCLE_ICON} class=\"icon-s\"></ch-image>\n {this.#componentLocale.actions.installed}\n </p>\n )}\n {this.data.installed && this.#renderUninstallButton()}\n </div>\n </div>\n </header>\n <div class=\"main\">\n {this.docsTabModel.length > 0 && (\n <ch-tab-render\n class=\"tab docsTab scrollable\"\n tabListPosition=\"block-start\"\n overflow=\"auto\"\n contain=\"size\"\n model={this.docsTabModel}\n onSelectedItemChange={this.#tabSelectionChangedHandler}\n selectedId={this.selectedTabId}\n >\n {this.#renderDocSectionsSlots()}\n </ch-tab-render>\n )}\n </div>\n <div class=\"aside spacing-body scrollable\">\n {this.#renderAsideContent()}\n </div>\n </section>\n {/* <slot></slot> */}\n </Host>\n );\n }\n}\n\n// plugin-details.types.ts\n\nexport type LinkData = {\n text: string;\n url: string;\n};\n\nexport type PluginFieldData = {\n name?: string;\n value: string | LinkData;\n};\n\nexport type PluginInfoCategoryData = {\n name: string;\n fields: PluginFieldData[];\n displayAsTags: boolean;\n};\n\nexport type DocSectionData = {\n name: string;\n content: string;\n};\n\nexport type PluginVersionOption = {\n version: string;\n versionId: number;\n};\n\nexport type PluginInstallProgress = {\n phase: \"download\" | \"install\";\n percent: number;\n};\n\nexport type PluginDetailsData = {\n id: string;\n name: string | LinkData;\n publisher: string | LinkData;\n installed: boolean;\n updateVersion?: string;\n versions: PluginVersionOption[];\n iconUrl: string;\n description: string;\n docSections: DocSectionData[];\n infoCategories: PluginInfoCategoryData[];\n};\n"],"mappings":"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"}