@genexus/genexus-ide-ui 1.1.18 → 1.1.19

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.
@@ -1,136 +1,160 @@
1
- import { r as t, g as i, h as e, H as s, a } from "./p-25a9f1d7.js";
1
+ import { r as t, g as i, h as e, H as s, a as n } from "./p-25a9f1d7.js";
2
2
 
3
- import { g as n } from "./p-2987a259.js";
3
+ import { g as o } from "./p-2987a259.js";
4
4
 
5
- import { c as o } from "./p-13738332.js";
5
+ import { c as a } from "./p-13738332.js";
6
6
 
7
7
  import { L as l } from "./p-311eedf3.js";
8
8
 
9
- const r = ':host{display:grid;grid-template-rows:max-content 1fr max-content;block-size:100%;overflow:auto}.section{display:contents}.main{display:grid;grid-template-rows:1fr max-content;overflow:auto}.field-group-name-description-module{grid-template-areas:"name-label name-input" "description-label description-input" "module-label module-entity-selector";grid-template-columns:max-content 1fr}.name-label{grid-area:name-label}.name-input{grid-area:name-input}.description-label{grid-area:description-label}.description-input{grid-area:description-input}.module-label{grid-area:module-label}.module-entity-selector{grid-area:module-entity-selector}.radio-file-input-wrapper{grid-template-columns:max-content 1fr}div.field-file-input{grid-template-columns:1fr max-content}.json-area{display:grid;grid-template-rows:1fr max-content;overflow:auto}.slotted-container{overflow:auto;block-size:100%}.input-file{display:grid;grid-template-columns:1fr max-content}.radio-group{gap:30px !important}.tooltip{height:0px}';
9
+ import { v as r } from "./p-289c3290.js";
10
10
 
11
- var d = undefined && undefined.__classPrivateFieldGet || function(t, i, e, s) {
11
+ const d = ':host{display:grid;grid-template-rows:max-content 1fr max-content;block-size:100%;overflow:auto}.section{display:contents}.main{display:grid;grid-template-rows:1fr max-content;overflow:auto}.field-group-name-description-module{grid-template-areas:"name-label name-input" "description-label description-input" "module-label module-entity-selector";grid-template-columns:max-content 1fr}.name-label{grid-area:name-label}.name-input{grid-area:name-input}.description-label{grid-area:description-label}.description-input{grid-area:description-input}.module-label{grid-area:module-label}.module-entity-selector{grid-area:module-entity-selector}.radio-file-input-wrapper{grid-template-columns:max-content 1fr}div.field-file-input{grid-template-columns:1fr max-content}.json-area{display:grid;grid-template-rows:1fr max-content;overflow:auto}.slotted-container{overflow:auto;block-size:100%}.input-file{display:grid;grid-template-columns:1fr max-content}.radio-group{gap:30px !important}.tooltip{height:0px}';
12
+
13
+ var h = undefined && undefined.__classPrivateFieldGet || function(t, i, e, s) {
12
14
  if (e === "a" && !s) throw new TypeError("Private accessor was defined without a getter");
13
15
  if (typeof i === "function" ? t !== i || !s : !i.has(t)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
16
  return e === "m" ? s : e === "a" ? s.call(t) : s ? s.value : i.get(t);
15
17
  };
16
18
 
17
- var h = undefined && undefined.__classPrivateFieldSet || function(t, i, e, s, a) {
19
+ var c = undefined && undefined.__classPrivateFieldSet || function(t, i, e, s, n) {
18
20
  if (s === "m") throw new TypeError("Private method is not writable");
19
- if (s === "a" && !a) throw new TypeError("Private accessor was defined without a setter");
20
- if (typeof i === "function" ? t !== i || !a : !i.has(t)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
21
- return s === "a" ? a.call(t, e) : a ? a.value = e : i.set(t, e), e;
21
+ if (s === "a" && !n) throw new TypeError("Private accessor was defined without a setter");
22
+ if (typeof i === "function" ? t !== i || !n : !i.has(t)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
23
+ return s === "a" ? n.call(t, e) : n ? n.value = e : i.set(t, e), e;
22
24
  };
23
25
 
24
- var c, f, p, u, m, b, g, v, w, y, k, x, W, M, j, C, E, T, F, P;
26
+ var f, p, u, m, b, v, g, w, y, k, M, W, x, j, C, E, T, F, P, z, I, L;
25
27
 
26
- const z = [ "resets/box-sizing", "components/tab", "components/tooltip", "utils/form--full", "utils/layout", "utils/typography", "utils/spacing", "chameleon/scrollbar" ];
28
+ const S = [ "resets/box-sizing", "components/tab", "components/tooltip", "utils/form--full", "utils/layout", "utils/typography", "utils/spacing", "chameleon/scrollbar" ];
27
29
 
28
- const I = n({
30
+ const V = o({
29
31
  category: "gemini-tools",
30
32
  name: "file",
31
33
  colorType: "primary"
32
34
  });
33
35
 
34
- const S = n({
36
+ const _ = o({
35
37
  category: "menus",
36
38
  name: "delete",
37
39
  colorType: "primary"
38
40
  });
39
41
 
40
- const V = class {
41
- constructor(e) {
42
- t(this, e);
43
- c.set(this, void 0);
44
- f.set(this, {
42
+ const A = class {
43
+ constructor(s) {
44
+ t(this, s);
45
+ f.set(this, void 0);
46
+ p.set(this, {
45
47
  name: "",
46
48
  description: "",
47
49
  assumeVarcharForNull: false,
48
50
  parentId: "",
49
51
  json: ""
50
52
  });
51
- p.set(this, []);
52
- u.set(this, i(`./gx-ide-assets/json-import/shortcuts.json`));
53
- m.set(this, void 0);
53
+ u.set(this, []);
54
+ m.set(this, i(`./gx-ide-assets/json-import/shortcuts.json`));
54
55
  b.set(this, void 0);
55
- g.set(this, void 0);
56
56
  v.set(this, void 0);
57
+ g.set(this, void 0);
57
58
  w.set(this, void 0);
58
59
  y.set(this, void 0);
59
60
  k.set(this, void 0);
60
- x.set(this, (() => {
61
+ M.set(this, void 0);
62
+ W.set(this, (() => {
63
+ const t = [ h(this, k, "f"), h(this, y, "f") ];
64
+ t.forEach((t => {
65
+ if (t.id) {
66
+ this.validatableControls.set(t.id, {
67
+ reference: t,
68
+ hasError: false,
69
+ message: undefined
70
+ });
71
+ }
72
+ }));
73
+ }));
74
+ x.set(this, (t => {
75
+ var i, s, n;
76
+ return ((s = (i = this.validatableControls) === null || i === void 0 ? void 0 : i.get(t === null || t === void 0 ? void 0 : t.id)) === null || s === void 0 ? void 0 : s.hasError) && ((n = this.validatableControls.get(t.id)) === null || n === void 0 ? void 0 : n.message) && e("ch-tooltip", {
77
+ class: "tooltip",
78
+ actionElement: t,
79
+ blockAlign: a.tooltipSettings.blockAlign,
80
+ inlineAlign: a.tooltipSettings.inlineAlign,
81
+ delay: a.tooltipSettings.delay
82
+ }, this.validatableControls.get(t.id).message);
83
+ }));
84
+ j.set(this, (() => {
61
85
  var t, i;
62
- const e = ((i = (t = d(this, y, "f")) === null || t === void 0 ? void 0 : t.value) === null || i === void 0 ? void 0 : i.trim()) || "";
86
+ const e = ((i = (t = h(this, k, "f")) === null || t === void 0 ? void 0 : t.value) === null || i === void 0 ? void 0 : i.trim()) || "";
63
87
  const s = this.radioGroupValue === "file" ? this.fileName : this.jsonContent;
64
- const a = this.validateNameCallback ? this.validateNameCallback(e) : Boolean(e);
65
- const n = this.radioGroupValue === "file" ? Boolean(this.fileName) : this.validateJSONCallback ? this.validateJSONCallback(s) : false;
66
- this.isFormValid = a && n;
88
+ const n = this.validateNameCallback ? this.validateNameCallback(e) : Boolean(e);
89
+ const o = this.radioGroupValue === "file" ? Boolean(this.fileName) : this.validateJSONCallback ? this.validateJSONCallback(s) : false;
90
+ this.isFormValid = n && o;
67
91
  }));
68
- W.set(this, (() => {
69
- d(this, x, "f").call(this);
92
+ C.set(this, (() => {
93
+ h(this, j, "f").call(this);
70
94
  }));
71
- M.set(this, (() => {
95
+ E.set(this, (() => {
72
96
  var t;
73
- this.radioGroupValue = d(this, k, "f").value;
97
+ this.radioGroupValue = h(this, M, "f").value;
74
98
  if (this.radioGroupValue === "file") {
75
- d(this, m, "f").value = "false";
99
+ h(this, b, "f").value = "false";
76
100
  } else {
77
- d(this, f, "f").json = null;
78
- d(this, C, "f").call(this);
79
- d(this, x, "f").call(this);
101
+ h(this, p, "f").json = null;
102
+ h(this, F, "f").call(this);
103
+ h(this, j, "f").call(this);
80
104
  }
81
105
  (t = this.modeChangeCallback) === null || t === void 0 ? void 0 : t.call(this, this.radioGroupValue);
82
106
  }));
83
- j.set(this, (() => {
107
+ T.set(this, (() => {
84
108
  var t;
85
- d(this, f, "f").name = d(this, y, "f").value;
86
- d(this, f, "f").description = d(this, g, "f").value;
87
- d(this, f, "f").parentId = (t = d(this, w, "f").value) === null || t === void 0 ? void 0 : t.id;
88
- d(this, f, "f").assumeVarcharForNull = d(this, m, "f").value === "true";
89
- this.confirmCallback(d(this, f, "f")).then((t => {
90
- this.showTooltipError = !t.success;
109
+ h(this, p, "f").name = h(this, k, "f").value;
110
+ h(this, p, "f").description = h(this, g, "f").value;
111
+ h(this, p, "f").parentId = (t = h(this, y, "f").value) === null || t === void 0 ? void 0 : t.id;
112
+ h(this, p, "f").assumeVarcharForNull = h(this, b, "f").value === "true";
113
+ this.confirmCallback(h(this, p, "f")).then((t => {
114
+ this.validatableControls = r(t, this.validatableControls);
91
115
  }));
92
116
  }));
93
- C.set(this, (() => {
117
+ F.set(this, (() => {
94
118
  var t;
95
- d(this, f, "f").json = null;
96
- d(this, v, "f").value = null;
119
+ h(this, p, "f").json = null;
120
+ h(this, w, "f").value = null;
97
121
  this.fileName = null;
98
122
  (t = this.fileChangeCallback) === null || t === void 0 ? void 0 : t.call(this, null);
99
- d(this, x, "f").call(this);
123
+ h(this, j, "f").call(this);
100
124
  }));
101
- E.set(this, (t => {
125
+ P.set(this, (t => {
102
126
  var i, e;
103
127
  const s = t.target;
104
128
  if (((i = s.files) === null || i === void 0 ? void 0 : i.length) > 0 && this.radioGroupValue === "file") {
105
- d(this, f, "f").json = s.files[0];
129
+ h(this, p, "f").json = s.files[0];
106
130
  this.fileName = s.files[0].name;
107
131
  (e = this.fileChangeCallback) === null || e === void 0 ? void 0 : e.call(this, s.files[0]);
108
- d(this, x, "f").call(this);
132
+ h(this, j, "f").call(this);
109
133
  }
110
134
  }));
111
- T.set(this, (() => {
112
- d(this, v, "f").click();
135
+ z.set(this, (() => {
136
+ h(this, w, "f").click();
113
137
  }));
114
- F.set(this, (() => {
115
- d(this, x, "f").call(this);
138
+ I.set(this, (() => {
139
+ h(this, j, "f").call(this);
116
140
  }));
117
- P.set(this, (t => {
141
+ L.set(this, (t => {
118
142
  const i = t.target.assignedElements();
119
143
  if (i.length > 0) {
120
144
  const t = i[0];
121
145
  t.addEventListener("json-content-change", (t => {
122
146
  if (this.radioGroupValue === "text") {
123
147
  this.jsonContent = t.detail.content;
124
- d(this, F, "f").call(this);
148
+ h(this, I, "f").call(this);
125
149
  }
126
150
  }));
127
151
  }
128
152
  }));
129
153
  this.fileName = undefined;
130
154
  this.radioGroupValue = "file";
131
- this.showTooltipError = false;
132
155
  this.isFormValid = false;
133
156
  this.jsonContent = "";
157
+ this.validatableControls = new Map;
134
158
  this.cancelCallback = undefined;
135
159
  this.confirmCallback = undefined;
136
160
  this.defaultParent = undefined;
@@ -144,28 +168,31 @@ const V = class {
144
168
  this.onJsonContentChange = undefined;
145
169
  }
146
170
  async componentWillLoad() {
147
- h(this, c, await l.getComponentStrings(this.el), "f");
148
- h(this, p, [ {
171
+ c(this, f, await l.getComponentStrings(this.el), "f");
172
+ c(this, u, [ {
149
173
  value: "file",
150
- caption: d(this, c, "f").header.filePathLabel
174
+ caption: h(this, f, "f").header.filePathLabel
151
175
  }, {
152
176
  value: "text",
153
- caption: d(this, c, "f").main.jsonAreaLabel
177
+ caption: h(this, f, "f").main.jsonAreaLabel
154
178
  } ], "f");
155
179
  }
180
+ componentDidLoad() {
181
+ h(this, W, "f").call(this);
182
+ }
156
183
  /**
157
184
  * Suspends or reactivates the shortcuts
158
185
  */ async suspendShortcuts(t) {
159
- d(this, b, "f").suspend = t;
186
+ h(this, v, "f").suspend = t;
160
187
  }
161
188
  render() {
162
189
  return e(s, {
163
190
  class: "widget"
164
191
  }, e("ch-theme", {
165
- model: z
192
+ model: S
166
193
  }), e("ch-shortcuts", {
167
- src: d(this, u, "f"),
168
- ref: t => h(this, b, t, "f")
194
+ src: h(this, m, "f"),
195
+ ref: t => c(this, v, t, "f")
169
196
  }), e("section", {
170
197
  class: "section"
171
198
  }, e("header", {
@@ -176,40 +203,40 @@ const V = class {
176
203
  // name
177
204
  class: "label name-label",
178
205
  htmlFor: "input-name"
179
- }, d(this, c, "f").header.nameFieldLabel), e("ch-edit", {
206
+ }, h(this, f, "f").header.nameFieldLabel), e("ch-edit", {
180
207
  class: "input name-input",
181
208
  id: "input-name",
182
- ref: t => h(this, y, t, "f"),
183
- onInput: d(this, W, "f")
184
- }), e("label", {
209
+ ref: t => c(this, k, t, "f"),
210
+ onInput: h(this, C, "f")
211
+ }), h(this, x, "f").call(this, h(this, k, "f")), e("label", {
185
212
  // description
186
213
  class: "label description-label",
187
214
  htmlFor: "input-description"
188
- }, d(this, c, "f").header.descriptionFieldLabel), e("ch-edit", {
215
+ }, h(this, f, "f").header.descriptionFieldLabel), e("ch-edit", {
189
216
  class: "input description-input",
190
217
  id: "input-description",
191
- ref: t => h(this, g, t, "f")
218
+ ref: t => c(this, g, t, "f")
192
219
  }), e("label", {
193
220
  // module/folder
194
221
  class: "label module-label",
195
222
  htmlFor: "input-module"
196
- }, d(this, c, "f").header.moduleFolderLabel), e("gx-ide-entity-selector", {
223
+ }, h(this, f, "f").header.moduleFolderLabel), e("gx-ide-entity-selector", {
197
224
  class: "module module-entity-selector",
198
225
  id: "module",
199
226
  value: this.defaultParent,
200
- ref: t => h(this, w, t, "f"),
227
+ ref: t => c(this, y, t, "f"),
201
228
  labelPosition: "none",
202
229
  defaultValue: this.defaultParent,
203
230
  selectEntityCallback: this.selectModuleCallback
204
- })), e("div", {
231
+ }), h(this, x, "f").call(this, h(this, y, "f"))), e("div", {
205
232
  class: "radio-file-input-wrapper field-group"
206
233
  }, e("ch-radio-group-render", {
207
234
  // file url/text
208
235
  class: "radio-group",
209
- model: d(this, p, "f"),
210
- onChange: d(this, M, "f"),
236
+ model: h(this, u, "f"),
237
+ onChange: h(this, E, "f"),
211
238
  value: this.defaultRadioValue,
212
- ref: t => h(this, k, t, "f")
239
+ ref: t => c(this, M, t, "f")
213
240
  }), e("div", {
214
241
  class: "field field-inline field-file-input"
215
242
  }, e("ch-edit", {
@@ -220,35 +247,35 @@ const V = class {
220
247
  type: "text",
221
248
  value: this.fileName,
222
249
  readonly: true,
223
- placeholder: d(this, c, "f").header.fileNamePlaceholder,
224
- startImgSrc: I,
250
+ placeholder: h(this, f, "f").header.fileNamePlaceholder,
251
+ startImgSrc: V,
225
252
  disabled: this.radioGroupValue !== "file"
226
253
  }), e("input", {
227
254
  hidden: true,
228
255
  type: "file",
229
256
  accept: ".json",
230
- onChange: d(this, E, "f"),
231
- ref: t => h(this, v, t, "f")
257
+ onChange: h(this, P, "f"),
258
+ ref: t => c(this, w, t, "f")
232
259
  }), e("div", {
233
260
  class: "buttons-spacer"
234
261
  }, e("button", {
235
- "aria-label": d(this, c, "f").header.removeFileSelection,
236
- title: d(this, c, "f").header.removeFileSelection,
262
+ "aria-label": h(this, f, "f").header.removeFileSelection,
263
+ title: h(this, f, "f").header.removeFileSelection,
237
264
  id: "reset-all-button",
238
265
  class: "button-tertiary button-icon-only",
239
266
  part: "reset-all-button",
240
- onClick: d(this, C, "f"),
267
+ onClick: h(this, F, "f"),
241
268
  disabled: this.radioGroupValue !== "file"
242
269
  }, e("ch-image", {
243
270
  class: "icon-md",
244
- src: S
271
+ src: _
245
272
  })), e("button", {
246
273
  id: "select-file-load-button",
247
274
  class: "button-primary",
248
275
  part: "select-file-load-button",
249
- onClick: d(this, T, "f"),
276
+ onClick: h(this, z, "f"),
250
277
  disabled: this.radioGroupValue !== "file"
251
- }, d(this, c, "f").header.selectfileButton))))), e("div", {
278
+ }, h(this, f, "f").header.selectfileButton))))), e("div", {
252
279
  class: "main field-group"
253
280
  }, e("div", {
254
281
  class: "json-area"
@@ -256,17 +283,12 @@ const V = class {
256
283
  class: "slotted-container scrollable"
257
284
  }, e("slot", {
258
285
  name: "JsonTextEditor",
259
- onSlotchange: d(this, P, "f")
260
- })), this.showTooltipError && e("ch-tooltip", {
261
- class: "tooltip",
262
- blockAlign: o.tooltipSettings.blockAlign,
263
- inlineAlign: o.tooltipSettings.inlineAlign,
264
- delay: o.tooltipSettings.delay
265
- }, "Error message")), e("ch-checkbox", {
286
+ onSlotchange: h(this, L, "f")
287
+ }))), e("ch-checkbox", {
266
288
  class: "checkbox spacing-body-block-end spacing-body-inline-start",
267
- caption: d(this, c, "f").main.checkBoxLabel,
289
+ caption: h(this, f, "f").main.checkBoxLabel,
268
290
  checkedValue: "true",
269
- ref: t => h(this, m, t, "f")
291
+ ref: t => c(this, b, t, "f")
270
292
  })), e("footer", {
271
293
  class: "control-footer control-footer-with-border spacing-body-block-end spacing-body-inline"
272
294
  }, e("div", {
@@ -276,28 +298,29 @@ const V = class {
276
298
  id: "button-cancel",
277
299
  onClick: this.cancelCallback,
278
300
  part: "button-cancel"
279
- }, d(this, c, "f").footer.btnCancel), e("button", {
301
+ }, h(this, f, "f").footer.btnCancel), e("button", {
280
302
  class: "button-primary",
281
303
  id: "button-ok",
282
- onClick: d(this, j, "f"),
304
+ onClick: h(this, T, "f"),
283
305
  part: "button-ok",
284
306
  disabled: !this.isFormValid
285
- }, d(this, c, "f").footer.btnOk)))));
307
+ }, h(this, f, "f").footer.btnOk)))));
286
308
  }
287
309
  static get assetsDirs() {
288
310
  return [ "gx-ide-assets/json-import" ];
289
311
  }
290
312
  get el() {
291
- return a(this);
313
+ return n(this);
292
314
  }
293
315
  };
294
316
 
295
- c = new WeakMap, f = new WeakMap, p = new WeakMap, u = new WeakMap, m = new WeakMap,
296
- b = new WeakMap, g = new WeakMap, v = new WeakMap, w = new WeakMap, y = new WeakMap,
297
- k = new WeakMap, x = new WeakMap, W = new WeakMap, M = new WeakMap, j = new WeakMap,
298
- C = new WeakMap, E = new WeakMap, T = new WeakMap, F = new WeakMap, P = new WeakMap;
317
+ f = new WeakMap, p = new WeakMap, u = new WeakMap, m = new WeakMap, b = new WeakMap,
318
+ v = new WeakMap, g = new WeakMap, w = new WeakMap, y = new WeakMap, k = new WeakMap,
319
+ M = new WeakMap, W = new WeakMap, x = new WeakMap, j = new WeakMap, C = new WeakMap,
320
+ E = new WeakMap, T = new WeakMap, F = new WeakMap, P = new WeakMap, z = new WeakMap,
321
+ I = new WeakMap, L = new WeakMap;
299
322
 
300
- V.style = r;
323
+ A.style = d;
301
324
 
302
- export { V as gx_ide_json_import };
303
- //# sourceMappingURL=p-2bfae98b.entry.js.map
325
+ export { A as gx_ide_json_import };
326
+ //# sourceMappingURL=p-8bb9242a.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["jsonImportCss","CSS_BUNDLES","FILE_ICON","getIconPath","category","name","colorType","MENU_DELETE","GxIdeJsonImport","_GxIdeJsonImport_componentLocale","set","this","_GxIdeJsonImport_data","description","assumeVarcharForNull","parentId","json","_GxIdeJsonImport_radioOptionsModel","_GxIdeJsonImport_shortcutsSrc","getAssetPath","_GxIdeJsonImport_checkBoxEl","_GxIdeJsonImport_chShortcutsEl","_GxIdeJsonImport_descriptionEl","_GxIdeJsonImport_fileInputHiddenEl","_GxIdeJsonImport_moduleEntitySelector","_GxIdeJsonImport_nameEl","_GxIdeJsonImport_radioGroup","_GxIdeJsonImport_initializeValidatableControls","validatableControls","__classPrivateFieldGet","forEach","validatableControl","id","reference","hasError","message","undefined","_GxIdeJsonImport_evaluateTooltipRender","controlReference","_b","_a","get","_c","h","class","actionElement","blockAlign","config","tooltipSettings","inlineAlign","delay","_GxIdeJsonImport_validateForm","value","trim","radioGroupValue","fileName","jsonContent","isNameValid","validateNameCallback","Boolean","isJsonValid","validateJSONCallback","isFormValid","_GxIdeJsonImport_nameChangedHandler","call","_GxIdeJsonImport_changeRadioHandler","_GxIdeJsonImport_removeFileSelection","modeChangeCallback","_GxIdeJsonImport_createHandler","confirmCallback","then","formSubmitResult","validateControls","fileChangeCallback","_GxIdeJsonImport_selectFileInputChangedHandler","event","target","files","length","_GxIdeJsonImport_selectFileInputHandler","click","_GxIdeJsonImport_handleEditorChange","_GxIdeJsonImport_handleSlotChange","e","elements","assignedElements","element","addEventListener","detail","content","Map","componentWillLoad","__classPrivateFieldSet","Locale","getComponentStrings","el","caption","header","filePathLabel","main","jsonAreaLabel","componentDidLoad","suspendShortcuts","suspend","render","Host","model","src","ref","htmlFor","nameFieldLabel","onInput","descriptionFieldLabel","moduleFolderLabel","defaultParent","labelPosition","defaultValue","selectEntityCallback","selectModuleCallback","onChange","defaultRadioValue","autoFocus","part","type","readonly","placeholder","fileNamePlaceholder","startImgSrc","disabled","hidden","accept","removeFileSelection","title","onClick","selectfileButton","onSlotchange","checkBoxLabel","checkedValue","cancelCallback","footer","btnCancel","btnOk"],"sources":["src/components/json-import/json-import.scss?tag=gx-ide-json-import&encapsulation=shadow","src/components/json-import/json-import.tsx"],"sourcesContent":[":host {\n display: grid;\n grid-template-rows: max-content 1fr max-content;\n block-size: 100%;\n overflow: auto;\n}\n\n.section {\n // just for semantics (allows header and footer element)\n display: contents;\n}\n\n.header {\n}\n\n.main {\n display: grid;\n grid-template-rows: 1fr max-content;\n overflow: auto;\n}\n.field-group-name-description-module {\n grid-template-areas:\n \"name-label name-input\"\n \"description-label description-input\"\n \"module-label module-entity-selector\";\n grid-template-columns: max-content 1fr;\n}\n\n.name-label {\n grid-area: name-label;\n}\n.name-input {\n grid-area: name-input;\n}\n.description-label {\n grid-area: description-label;\n}\n.description-input {\n grid-area: description-input;\n}\n.module-label {\n grid-area: module-label;\n}\n.module-entity-selector {\n grid-area: module-entity-selector;\n}\n.radio-file-input-wrapper {\n grid-template-columns: max-content 1fr;\n}\ndiv.field-file-input {\n grid-template-columns: 1fr max-content;\n}\n\n.json-area {\n display: grid;\n grid-template-rows: 1fr max-content;\n overflow: auto;\n}\n.slotted-container {\n overflow: auto;\n block-size: 100%;\n}\n\n.input-file {\n display: grid;\n grid-template-columns: 1fr max-content;\n}\n\n.radio-group {\n gap: 30px !important;\n}\n.tooltip {\n height: 0px;\n}\n","import {\n Component,\n Host,\n Prop,\n Element,\n State,\n getAssetPath,\n Method,\n h\n} from \"@stencil/core\";\n\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\n\nimport { Locale } from \"../../common/locale\";\nimport { FormSubmitResult } from \"../../common/types\";\nimport { RadioGroupItemModel } from \"@genexus/chameleon-controls-library/dist/types/components/radio-group/types\";\nimport {\n ControlValidation,\n validateControls\n} from \"../../common/form-validation\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/tab\",\n \"components/tooltip\",\n \"utils/form--full\",\n \"utils/layout\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\n\nconst FILE_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"file\",\n colorType: \"primary\"\n});\n\nconst MENU_DELETE = getIconPath({\n category: \"menus\",\n name: \"delete\",\n colorType: \"primary\"\n});\n\n@Component({\n tag: \"gx-ide-json-import\",\n styleUrl: \"json-import.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/json-import\"]\n})\nexport class GxIdeJsonImport {\n #componentLocale: any;\n #data: JsonImportData = {\n name: \"\",\n description: \"\",\n assumeVarcharForNull: false,\n parentId: \"\",\n json: \"\"\n };\n #radioOptionsModel: RadioGroupItemModel[] = [];\n #shortcutsSrc = getAssetPath(`./gx-ide-assets/json-import/shortcuts.json`);\n\n @Element() el: HTMLGxIdeJsonImportElement;\n #checkBoxEl!: HTMLChCheckboxElement;\n #chShortcutsEl: HTMLChShortcutsElement;\n #descriptionEl!: HTMLChEditElement;\n #fileInputHiddenEl!: HTMLInputElement;\n #moduleEntitySelector!: HTMLGxIdeEntitySelectorElement;\n #nameEl!: HTMLChEditElement;\n #radioGroup!: HTMLChRadioGroupRenderElement;\n\n @State() fileName: string;\n @State() radioGroupValue: string = \"file\";\n @State() isFormValid: boolean = false;\n @State() jsonContent: string = \"\";\n @State() validatableControls = new Map<string, ControlValidation>();\n\n /**\n * Callback that must be invoked when the user want to cancel the operation\n */\n @Prop() readonly cancelCallback: () => Promise<void>;\n\n /**\n * Callback that must be invoked when the user confirms the creation of the SDT. It receives as parameters the data necessary to create the SDT.\n */\n @Prop() readonly confirmCallback!: (\n data: JsonImportData\n ) => Promise<FormSubmitResult>;\n\n /**\n * Default value for Module/Folder field\n */\n @Prop() readonly defaultParent: EntityData;\n\n /**\n * Default value for Module/Folder field\n */\n @Prop() readonly defaultRadioValue: string;\n\n /**\n * Actual value for Module/Folder field\n */\n @Prop() readonly parent: EntityData;\n\n /**\n * Callback invoked when the action is executed in the Module/Folder filter. It returns the information of the selected object (id and name) or 'undefined' if it was canceled.\n */\n @Prop() readonly selectModuleCallback: SelectModuleCallback;\n\n /**\n * Callback invoked when the input mode changes between file and text.\n */\n @Prop() readonly modeChangeCallback?: (\n mode: \"file\" | \"text\"\n ) => Promise<void>;\n\n /**\n * Callback invoked when a file is selected or removed.\n */\n @Prop() readonly fileChangeCallback?: (file: File | null) => Promise<void>;\n\n /**\n * Callback para validar el nombre del objeto. Debe retornar true si el nombre es válido, false en caso contrario.\n */\n @Prop() readonly validateNameCallback?: (name: string) => boolean;\n\n /**\n * Callback para validar el JSON. Debe retornar true si el JSON es válido, false en caso contrario.\n */\n @Prop() readonly validateJSONCallback?: (json: string) => boolean;\n\n /**\n * Callback invocado cuando el contenido del JSON cambia\n */\n @Prop() readonly onJsonContentChange?: (content: string) => void;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.#radioOptionsModel = [\n {\n value: \"file\",\n caption: this.#componentLocale.header.filePathLabel\n },\n { value: \"text\", caption: this.#componentLocale.main.jsonAreaLabel }\n ];\n }\n\n componentDidLoad() {\n this.#initializeValidatableControls();\n }\n\n /**\n * Suspends or reactivates the shortcuts\n */\n @Method()\n async suspendShortcuts(suspendShortcuts: boolean) {\n this.#chShortcutsEl.suspend = suspendShortcuts;\n }\n\n #initializeValidatableControls = () => {\n const validatableControls: HTMLElement[] = [\n this.#nameEl,\n this.#moduleEntitySelector\n ];\n validatableControls.forEach(validatableControl => {\n if (validatableControl.id) {\n this.validatableControls.set(validatableControl.id, {\n reference: validatableControl,\n hasError: false,\n message: undefined\n });\n }\n });\n };\n\n #evaluateTooltipRender = (\n controlReference: HTMLElement\n ): HTMLChTooltipElement =>\n this.validatableControls?.get(controlReference?.id)?.hasError &&\n this.validatableControls.get(controlReference.id)?.message && (\n <ch-tooltip\n class=\"tooltip\"\n actionElement={controlReference as unknown as HTMLButtonElement}\n blockAlign={config.tooltipSettings.blockAlign}\n inlineAlign={config.tooltipSettings.inlineAlign}\n delay={config.tooltipSettings.delay}\n >\n {this.validatableControls.get(controlReference.id).message}\n </ch-tooltip>\n );\n\n #validateForm = () => {\n const name = this.#nameEl?.value?.trim() || \"\";\n const json =\n this.radioGroupValue === \"file\" ? this.fileName : this.jsonContent;\n\n const isNameValid = this.validateNameCallback\n ? this.validateNameCallback(name)\n : Boolean(name);\n\n const isJsonValid =\n this.radioGroupValue === \"file\"\n ? Boolean(this.fileName)\n : this.validateJSONCallback\n ? this.validateJSONCallback(json)\n : false;\n\n this.isFormValid = isNameValid && isJsonValid;\n };\n\n #nameChangedHandler = () => {\n this.#validateForm();\n };\n\n #changeRadioHandler = () => {\n this.radioGroupValue = this.#radioGroup.value;\n if (this.radioGroupValue === \"file\") {\n this.#checkBoxEl.value = \"false\";\n } else {\n this.#data.json = null;\n this.#removeFileSelection();\n this.#validateForm();\n }\n this.modeChangeCallback?.(this.radioGroupValue as \"file\" | \"text\");\n };\n\n #createHandler = () => {\n this.#data.name = this.#nameEl.value;\n this.#data.description = this.#descriptionEl.value;\n this.#data.parentId = this.#moduleEntitySelector.value?.id;\n this.#data.assumeVarcharForNull = this.#checkBoxEl.value === \"true\";\n this.confirmCallback(this.#data).then(\n (formSubmitResult: FormSubmitResult) => {\n this.validatableControls = validateControls(\n formSubmitResult,\n this.validatableControls\n );\n }\n );\n };\n\n #removeFileSelection = () => {\n this.#data.json = null;\n this.#fileInputHiddenEl.value = null;\n this.fileName = null;\n this.fileChangeCallback?.(null);\n this.#validateForm();\n };\n\n #selectFileInputChangedHandler = (event: InputEvent) => {\n const target = event.target as HTMLInputElement;\n if (target.files?.length > 0 && this.radioGroupValue === \"file\") {\n this.#data.json = target.files[0];\n this.fileName = target.files[0].name;\n this.fileChangeCallback?.(target.files[0]);\n this.#validateForm();\n }\n };\n\n #selectFileInputHandler = () => {\n this.#fileInputHiddenEl.click();\n };\n\n #handleEditorChange = () => {\n this.#validateForm();\n };\n\n #handleSlotChange = (e: Event) => {\n const elements = (e.target as HTMLSlotElement).assignedElements();\n if (elements.length > 0) {\n const element = elements[0];\n element.addEventListener(\"json-content-change\", ((event: CustomEvent) => {\n if (this.radioGroupValue === \"text\") {\n this.jsonContent = event.detail.content;\n this.#handleEditorChange();\n }\n }) as EventListener);\n }\n };\n\n render(): void {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <ch-shortcuts\n src={this.#shortcutsSrc}\n ref={(el: HTMLChShortcutsElement) =>\n (this.#chShortcutsEl = el as HTMLChShortcutsElement)\n }\n ></ch-shortcuts>\n <section class=\"section\">\n <header class=\"header field-group spacing-body control-header-with-border\">\n <div class=\"field-group field-group-name-description-module\">\n <label\n // name\n class=\"label name-label\"\n htmlFor=\"input-name\"\n >\n {this.#componentLocale.header.nameFieldLabel}\n </label>\n <ch-edit\n class=\"input name-input\"\n id=\"input-name\"\n ref={(el: HTMLChEditElement) =>\n (this.#nameEl = el as HTMLChEditElement)\n }\n onInput={this.#nameChangedHandler}\n ></ch-edit>\n {this.#evaluateTooltipRender(this.#nameEl)}\n\n <label\n // description\n class=\"label description-label\"\n htmlFor=\"input-description\"\n >\n {this.#componentLocale.header.descriptionFieldLabel}\n </label>\n <ch-edit\n class=\"input description-input\"\n id=\"input-description\"\n ref={(el: HTMLChEditElement) =>\n (this.#descriptionEl = el as HTMLChEditElement)\n }\n ></ch-edit>\n\n <label\n // module/folder\n class=\"label module-label\"\n htmlFor=\"input-module\"\n >\n {this.#componentLocale.header.moduleFolderLabel}\n </label>\n <gx-ide-entity-selector\n class=\"module module-entity-selector\"\n id=\"module\"\n value={this.defaultParent}\n ref={(el: HTMLGxIdeEntitySelectorElement) =>\n (this.#moduleEntitySelector =\n el as HTMLGxIdeEntitySelectorElement)\n }\n labelPosition=\"none\"\n defaultValue={this.defaultParent}\n selectEntityCallback={this.selectModuleCallback}\n ></gx-ide-entity-selector>\n {this.#evaluateTooltipRender(this.#moduleEntitySelector)}\n </div>\n\n <div class=\"radio-file-input-wrapper field-group\">\n <ch-radio-group-render\n // file url/text\n class=\"radio-group\"\n model={this.#radioOptionsModel}\n onChange={this.#changeRadioHandler}\n value={this.defaultRadioValue}\n ref={(el: HTMLChRadioGroupRenderElement) =>\n (this.#radioGroup = el as HTMLChRadioGroupRenderElement)\n }\n ></ch-radio-group-render>\n <div class=\"field field-inline field-file-input\">\n <ch-edit\n autoFocus\n id=\"file-name\"\n class=\"input\"\n part=\"file-name\"\n type=\"text\"\n value={this.fileName}\n readonly\n placeholder={this.#componentLocale.header.fileNamePlaceholder}\n startImgSrc={FILE_ICON}\n disabled={this.radioGroupValue !== \"file\"}\n ></ch-edit>\n <input\n hidden\n type=\"file\"\n accept=\".json\"\n onChange={this.#selectFileInputChangedHandler}\n ref={(el: HTMLInputElement) =>\n (this.#fileInputHiddenEl = el as HTMLInputElement)\n }\n />\n <div class=\"buttons-spacer\">\n <button\n aria-label={\n this.#componentLocale.header.removeFileSelection\n }\n title={this.#componentLocale.header.removeFileSelection}\n id=\"reset-all-button\"\n class=\"button-tertiary button-icon-only\"\n part=\"reset-all-button\"\n onClick={this.#removeFileSelection}\n disabled={this.radioGroupValue !== \"file\"}\n >\n <ch-image class=\"icon-md\" src={MENU_DELETE}></ch-image>\n </button>\n\n <button\n id=\"select-file-load-button\"\n class=\"button-primary\"\n part=\"select-file-load-button\"\n onClick={this.#selectFileInputHandler}\n disabled={this.radioGroupValue !== \"file\"}\n >\n {this.#componentLocale.header.selectfileButton}\n </button>\n </div>\n </div>\n </div>\n </header>\n <div class=\"main field-group\">\n <div class=\"json-area\">\n <div class=\"slotted-container scrollable\">\n <slot\n name=\"JsonTextEditor\"\n onSlotchange={this.#handleSlotChange}\n ></slot>\n </div>\n </div>\n <ch-checkbox\n class=\"checkbox spacing-body-block-end spacing-body-inline-start\"\n caption={this.#componentLocale.main.checkBoxLabel}\n checkedValue=\"true\"\n ref={(el: HTMLChCheckboxElement) =>\n (this.#checkBoxEl = el as HTMLChCheckboxElement)\n }\n ></ch-checkbox>\n </div>\n\n <footer class=\"control-footer control-footer-with-border spacing-body-block-end spacing-body-inline\">\n <div class=\"buttons-spacer\">\n <button\n class=\"button-secondary\"\n id=\"button-cancel\"\n onClick={this.cancelCallback}\n part=\"button-cancel\"\n >\n {this.#componentLocale.footer.btnCancel}\n </button>\n <button\n class=\"button-primary\"\n id=\"button-ok\"\n onClick={this.#createHandler}\n part=\"button-ok\"\n disabled={!this.isFormValid}\n >\n {this.#componentLocale.footer.btnOk}\n </button>\n </div>\n </footer>\n </section>\n </Host>\n );\n }\n}\n\nexport type JsonImportData = {\n name: string;\n description: string;\n parentId: string;\n json: File | string;\n assumeVarcharForNull: boolean;\n};\n\nexport type EntityData = {\n id: string;\n name: string;\n iconSrc?: string;\n};\n\nexport type SelectModuleCallback = () => Promise<EntityData | undefined>;\n"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { FormSubmitResult } from "../../common/types";
2
+ import { ControlValidation } from "../../common/form-validation";
2
3
  export declare class GxIdeJsonImport {
3
4
  #private;
4
5
  el: HTMLGxIdeJsonImportElement;
5
6
  fileName: string;
6
7
  radioGroupValue: string;
7
- showTooltipError: boolean;
8
8
  isFormValid: boolean;
9
9
  jsonContent: string;
10
+ validatableControls: Map<string, ControlValidation>;
10
11
  /**
11
12
  * Callback that must be invoked when the user want to cancel the operation
12
13
  */
@@ -52,6 +53,7 @@ export declare class GxIdeJsonImport {
52
53
  */
53
54
  readonly onJsonContentChange?: (content: string) => void;
54
55
  componentWillLoad(): Promise<void>;
56
+ componentDidLoad(): void;
55
57
  /**
56
58
  * Suspends or reactivates the shortcuts
57
59
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genexus/genexus-ide-ui",
3
3
  "license": "Apache-2.0",
4
- "version": "1.1.18",
4
+ "version": "1.1.19",
5
5
  "description": "GeneXus IDE UI components",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"names":["jsonImportCss","CSS_BUNDLES","FILE_ICON","getIconPath","category","name","colorType","MENU_DELETE","GxIdeJsonImport","_GxIdeJsonImport_componentLocale","set","this","_GxIdeJsonImport_data","description","assumeVarcharForNull","parentId","json","_GxIdeJsonImport_radioOptionsModel","_GxIdeJsonImport_shortcutsSrc","getAssetPath","_GxIdeJsonImport_checkBoxEl","_GxIdeJsonImport_chShortcutsEl","_GxIdeJsonImport_descriptionEl","_GxIdeJsonImport_fileInputHiddenEl","_GxIdeJsonImport_moduleEntitySelector","_GxIdeJsonImport_nameEl","_GxIdeJsonImport_radioGroup","_GxIdeJsonImport_validateForm","_b","_a","__classPrivateFieldGet","value","trim","radioGroupValue","fileName","jsonContent","isNameValid","validateNameCallback","Boolean","isJsonValid","validateJSONCallback","isFormValid","_GxIdeJsonImport_nameChangedHandler","call","_GxIdeJsonImport_changeRadioHandler","_GxIdeJsonImport_removeFileSelection","modeChangeCallback","_GxIdeJsonImport_createHandler","id","confirmCallback","then","formSubmitResult","showTooltipError","success","fileChangeCallback","_GxIdeJsonImport_selectFileInputChangedHandler","event","target","files","length","_GxIdeJsonImport_selectFileInputHandler","click","_GxIdeJsonImport_handleEditorChange","_GxIdeJsonImport_handleSlotChange","e","elements","assignedElements","element","addEventListener","detail","content","componentWillLoad","__classPrivateFieldSet","Locale","getComponentStrings","el","caption","header","filePathLabel","main","jsonAreaLabel","suspendShortcuts","suspend","render","h","Host","class","model","src","ref","htmlFor","nameFieldLabel","onInput","descriptionFieldLabel","moduleFolderLabel","defaultParent","labelPosition","defaultValue","selectEntityCallback","selectModuleCallback","onChange","defaultRadioValue","autoFocus","part","type","readonly","placeholder","fileNamePlaceholder","startImgSrc","disabled","hidden","accept","removeFileSelection","title","onClick","selectfileButton","onSlotchange","blockAlign","config","tooltipSettings","inlineAlign","delay","checkBoxLabel","checkedValue","cancelCallback","footer","btnCancel","btnOk"],"sources":["src/components/json-import/json-import.scss?tag=gx-ide-json-import&encapsulation=shadow","src/components/json-import/json-import.tsx"],"sourcesContent":[":host {\n display: grid;\n grid-template-rows: max-content 1fr max-content;\n block-size: 100%;\n overflow: auto;\n}\n\n.section {\n // just for semantics (allows header and footer element)\n display: contents;\n}\n\n.header {\n}\n\n.main {\n display: grid;\n grid-template-rows: 1fr max-content;\n overflow: auto;\n}\n.field-group-name-description-module {\n grid-template-areas:\n \"name-label name-input\"\n \"description-label description-input\"\n \"module-label module-entity-selector\";\n grid-template-columns: max-content 1fr;\n}\n\n.name-label {\n grid-area: name-label;\n}\n.name-input {\n grid-area: name-input;\n}\n.description-label {\n grid-area: description-label;\n}\n.description-input {\n grid-area: description-input;\n}\n.module-label {\n grid-area: module-label;\n}\n.module-entity-selector {\n grid-area: module-entity-selector;\n}\n.radio-file-input-wrapper {\n grid-template-columns: max-content 1fr;\n}\ndiv.field-file-input {\n grid-template-columns: 1fr max-content;\n}\n\n.json-area {\n display: grid;\n grid-template-rows: 1fr max-content;\n overflow: auto;\n}\n.slotted-container {\n overflow: auto;\n block-size: 100%;\n}\n\n.input-file {\n display: grid;\n grid-template-columns: 1fr max-content;\n}\n\n.radio-group {\n gap: 30px !important;\n}\n.tooltip {\n height: 0px;\n}\n","import {\n Component,\n Host,\n Prop,\n Element,\n State,\n getAssetPath,\n Method,\n h\n} from \"@stencil/core\";\n\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\n\nimport { Locale } from \"../../common/locale\";\nimport { FormSubmitResult } from \"../../common/types\";\nimport { RadioGroupItemModel } from \"@genexus/chameleon-controls-library/dist/types/components/radio-group/types\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/tab\",\n \"components/tooltip\",\n \"utils/form--full\",\n \"utils/layout\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\n\nconst FILE_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"file\",\n colorType: \"primary\"\n});\n\nconst MENU_DELETE = getIconPath({\n category: \"menus\",\n name: \"delete\",\n colorType: \"primary\"\n});\n\n@Component({\n tag: \"gx-ide-json-import\",\n styleUrl: \"json-import.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/json-import\"]\n})\nexport class GxIdeJsonImport {\n #componentLocale: any;\n #data: JsonImportData = {\n name: \"\",\n description: \"\",\n assumeVarcharForNull: false,\n parentId: \"\",\n json: \"\"\n };\n #radioOptionsModel: RadioGroupItemModel[] = [];\n #shortcutsSrc = getAssetPath(`./gx-ide-assets/json-import/shortcuts.json`);\n\n @Element() el: HTMLGxIdeJsonImportElement;\n #checkBoxEl!: HTMLChCheckboxElement;\n #chShortcutsEl: HTMLChShortcutsElement;\n #descriptionEl!: HTMLChEditElement;\n #fileInputHiddenEl!: HTMLInputElement;\n #moduleEntitySelector!: HTMLGxIdeEntitySelectorElement;\n #nameEl!: HTMLChEditElement;\n #radioGroup!: HTMLChRadioGroupRenderElement;\n\n @State() fileName: string;\n @State() radioGroupValue: string = \"file\";\n @State() showTooltipError: boolean = false;\n @State() isFormValid: boolean = false;\n @State() jsonContent: string = \"\";\n\n /**\n * Callback that must be invoked when the user want to cancel the operation\n */\n @Prop() readonly cancelCallback: () => Promise<void>;\n\n /**\n * Callback that must be invoked when the user confirms the creation of the SDT. It receives as parameters the data necessary to create the SDT.\n */\n @Prop() readonly confirmCallback!: (\n data: JsonImportData\n ) => Promise<FormSubmitResult>;\n\n /**\n * Default value for Module/Folder field\n */\n @Prop() readonly defaultParent: EntityData;\n\n /**\n * Default value for Module/Folder field\n */\n @Prop() readonly defaultRadioValue: string;\n\n /**\n * Actual value for Module/Folder field\n */\n @Prop() readonly parent: EntityData;\n\n /**\n * Callback invoked when the action is executed in the Module/Folder filter. It returns the information of the selected object (id and name) or 'undefined' if it was canceled.\n */\n @Prop() readonly selectModuleCallback: SelectModuleCallback;\n\n /**\n * Callback invoked when the input mode changes between file and text.\n */\n @Prop() readonly modeChangeCallback?: (\n mode: \"file\" | \"text\"\n ) => Promise<void>;\n\n /**\n * Callback invoked when a file is selected or removed.\n */\n @Prop() readonly fileChangeCallback?: (file: File | null) => Promise<void>;\n\n /**\n * Callback para validar el nombre del objeto. Debe retornar true si el nombre es válido, false en caso contrario.\n */\n @Prop() readonly validateNameCallback?: (name: string) => boolean;\n\n /**\n * Callback para validar el JSON. Debe retornar true si el JSON es válido, false en caso contrario.\n */\n @Prop() readonly validateJSONCallback?: (json: string) => boolean;\n\n /**\n * Callback invocado cuando el contenido del JSON cambia\n */\n @Prop() readonly onJsonContentChange?: (content: string) => void;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.#radioOptionsModel = [\n {\n value: \"file\",\n caption: this.#componentLocale.header.filePathLabel\n },\n { value: \"text\", caption: this.#componentLocale.main.jsonAreaLabel }\n ];\n }\n\n /**\n * Suspends or reactivates the shortcuts\n */\n @Method()\n async suspendShortcuts(suspendShortcuts: boolean) {\n this.#chShortcutsEl.suspend = suspendShortcuts;\n }\n\n #validateForm = () => {\n const name = this.#nameEl?.value?.trim() || \"\";\n const json =\n this.radioGroupValue === \"file\" ? this.fileName : this.jsonContent;\n\n const isNameValid = this.validateNameCallback\n ? this.validateNameCallback(name)\n : Boolean(name);\n\n const isJsonValid =\n this.radioGroupValue === \"file\"\n ? Boolean(this.fileName)\n : this.validateJSONCallback\n ? this.validateJSONCallback(json)\n : false;\n\n this.isFormValid = isNameValid && isJsonValid;\n };\n\n #nameChangedHandler = () => {\n this.#validateForm();\n };\n\n #changeRadioHandler = () => {\n this.radioGroupValue = this.#radioGroup.value;\n if (this.radioGroupValue === \"file\") {\n this.#checkBoxEl.value = \"false\";\n } else {\n this.#data.json = null;\n this.#removeFileSelection();\n this.#validateForm();\n }\n this.modeChangeCallback?.(this.radioGroupValue as \"file\" | \"text\");\n };\n\n #createHandler = () => {\n this.#data.name = this.#nameEl.value;\n this.#data.description = this.#descriptionEl.value;\n this.#data.parentId = this.#moduleEntitySelector.value?.id;\n this.#data.assumeVarcharForNull = this.#checkBoxEl.value === \"true\";\n this.confirmCallback(this.#data).then(\n (formSubmitResult: FormSubmitResult) => {\n this.showTooltipError = !formSubmitResult.success;\n }\n );\n };\n\n #removeFileSelection = () => {\n this.#data.json = null;\n this.#fileInputHiddenEl.value = null;\n this.fileName = null;\n this.fileChangeCallback?.(null);\n this.#validateForm();\n };\n\n #selectFileInputChangedHandler = (event: InputEvent) => {\n const target = event.target as HTMLInputElement;\n if (target.files?.length > 0 && this.radioGroupValue === \"file\") {\n this.#data.json = target.files[0];\n this.fileName = target.files[0].name;\n this.fileChangeCallback?.(target.files[0]);\n this.#validateForm();\n }\n };\n\n #selectFileInputHandler = () => {\n this.#fileInputHiddenEl.click();\n };\n\n #handleEditorChange = () => {\n this.#validateForm();\n };\n\n #handleSlotChange = (e: Event) => {\n const elements = (e.target as HTMLSlotElement).assignedElements();\n if (elements.length > 0) {\n const element = elements[0];\n element.addEventListener(\"json-content-change\", ((event: CustomEvent) => {\n if (this.radioGroupValue === \"text\") {\n this.jsonContent = event.detail.content;\n this.#handleEditorChange();\n }\n }) as EventListener);\n }\n };\n\n render(): void {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <ch-shortcuts\n src={this.#shortcutsSrc}\n ref={(el: HTMLChShortcutsElement) =>\n (this.#chShortcutsEl = el as HTMLChShortcutsElement)\n }\n ></ch-shortcuts>\n <section class=\"section\">\n <header class=\"header field-group spacing-body control-header-with-border\">\n <div class=\"field-group field-group-name-description-module\">\n <label\n // name\n class=\"label name-label\"\n htmlFor=\"input-name\"\n >\n {this.#componentLocale.header.nameFieldLabel}\n </label>\n <ch-edit\n class=\"input name-input\"\n id=\"input-name\"\n ref={(el: HTMLChEditElement) =>\n (this.#nameEl = el as HTMLChEditElement)\n }\n onInput={this.#nameChangedHandler}\n ></ch-edit>\n\n <label\n // description\n class=\"label description-label\"\n htmlFor=\"input-description\"\n >\n {this.#componentLocale.header.descriptionFieldLabel}\n </label>\n <ch-edit\n class=\"input description-input\"\n id=\"input-description\"\n ref={(el: HTMLChEditElement) =>\n (this.#descriptionEl = el as HTMLChEditElement)\n }\n ></ch-edit>\n\n <label\n // module/folder\n class=\"label module-label\"\n htmlFor=\"input-module\"\n >\n {this.#componentLocale.header.moduleFolderLabel}\n </label>\n <gx-ide-entity-selector\n class=\"module module-entity-selector\"\n id=\"module\"\n value={this.defaultParent}\n ref={(el: HTMLGxIdeEntitySelectorElement) =>\n (this.#moduleEntitySelector =\n el as HTMLGxIdeEntitySelectorElement)\n }\n labelPosition=\"none\"\n defaultValue={this.defaultParent}\n selectEntityCallback={this.selectModuleCallback}\n ></gx-ide-entity-selector>\n </div>\n\n <div class=\"radio-file-input-wrapper field-group\">\n <ch-radio-group-render\n // file url/text\n class=\"radio-group\"\n model={this.#radioOptionsModel}\n onChange={this.#changeRadioHandler}\n value={this.defaultRadioValue}\n ref={(el: HTMLChRadioGroupRenderElement) =>\n (this.#radioGroup = el as HTMLChRadioGroupRenderElement)\n }\n ></ch-radio-group-render>\n <div class=\"field field-inline field-file-input\">\n <ch-edit\n autoFocus\n id=\"file-name\"\n class=\"input\"\n part=\"file-name\"\n type=\"text\"\n value={this.fileName}\n readonly\n placeholder={this.#componentLocale.header.fileNamePlaceholder}\n startImgSrc={FILE_ICON}\n disabled={this.radioGroupValue !== \"file\"}\n ></ch-edit>\n <input\n hidden\n type=\"file\"\n accept=\".json\"\n onChange={this.#selectFileInputChangedHandler}\n ref={(el: HTMLInputElement) =>\n (this.#fileInputHiddenEl = el as HTMLInputElement)\n }\n />\n <div class=\"buttons-spacer\">\n <button\n aria-label={\n this.#componentLocale.header.removeFileSelection\n }\n title={this.#componentLocale.header.removeFileSelection}\n id=\"reset-all-button\"\n class=\"button-tertiary button-icon-only\"\n part=\"reset-all-button\"\n onClick={this.#removeFileSelection}\n disabled={this.radioGroupValue !== \"file\"}\n >\n <ch-image class=\"icon-md\" src={MENU_DELETE}></ch-image>\n </button>\n\n <button\n id=\"select-file-load-button\"\n class=\"button-primary\"\n part=\"select-file-load-button\"\n onClick={this.#selectFileInputHandler}\n disabled={this.radioGroupValue !== \"file\"}\n >\n {this.#componentLocale.header.selectfileButton}\n </button>\n </div>\n </div>\n </div>\n </header>\n <div class=\"main field-group\">\n <div class=\"json-area\">\n <div class=\"slotted-container scrollable\">\n <slot\n name=\"JsonTextEditor\"\n onSlotchange={this.#handleSlotChange}\n ></slot>\n </div>\n {this.showTooltipError && (\n <ch-tooltip\n class=\"tooltip\"\n blockAlign={config.tooltipSettings.blockAlign}\n inlineAlign={config.tooltipSettings.inlineAlign}\n delay={config.tooltipSettings.delay}\n >\n Error message\n </ch-tooltip>\n )}\n </div>\n <ch-checkbox\n class=\"checkbox spacing-body-block-end spacing-body-inline-start\"\n caption={this.#componentLocale.main.checkBoxLabel}\n checkedValue=\"true\"\n ref={(el: HTMLChCheckboxElement) =>\n (this.#checkBoxEl = el as HTMLChCheckboxElement)\n }\n ></ch-checkbox>\n </div>\n\n <footer class=\"control-footer control-footer-with-border spacing-body-block-end spacing-body-inline\">\n <div class=\"buttons-spacer\">\n <button\n class=\"button-secondary\"\n id=\"button-cancel\"\n onClick={this.cancelCallback}\n part=\"button-cancel\"\n >\n {this.#componentLocale.footer.btnCancel}\n </button>\n <button\n class=\"button-primary\"\n id=\"button-ok\"\n onClick={this.#createHandler}\n part=\"button-ok\"\n disabled={!this.isFormValid}\n >\n {this.#componentLocale.footer.btnOk}\n </button>\n </div>\n </footer>\n </section>\n </Host>\n );\n }\n}\n\nexport type JsonImportData = {\n name: string;\n description: string;\n parentId: string;\n json: File | string;\n assumeVarcharForNull: boolean;\n};\n\nexport type EntityData = {\n id: string;\n name: string;\n iconSrc?: string;\n};\n\nexport type SelectModuleCallback = () => Promise<EntityData | undefined>;\n"],"mappings":";;;;;;;;AAAA,MAAMA,IAAgB;;;;;;;;;;;;;;;;;ACkBtB,MAAMC,IAA8B,EAClC,qBACA,kBACA,sBACA,oBACA,gBACA,oBACA,iBACA;;AAGF,MAAMC,IAAYC,EAAY;EAC5BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;AAGb,MAAMC,IAAcJ,EAAY;EAC9BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;MASAE,IAAe;;;IAC1BC,EAAAC,IAAAC,WAAA;IACAC,EAAAF,IAAAC,MAAwB;MACtBN,MAAM;MACNQ,aAAa;MACbC,sBAAsB;MACtBC,UAAU;MACVC,MAAM;;IAERC,EAAAP,IAAAC,MAA4C;IAC5CO,EAAAR,IAAAC,MAAgBQ,EAAa;IAG7BC,EAAAV,IAAAC,WAAA;IACAU,EAAAX,IAAAC,WAAA;IACAW,EAAAZ,IAAAC,WAAA;IACAY,EAAAb,IAAAC,WAAA;IACAa,EAAAd,IAAAC,WAAA;IACAc,EAAAf,IAAAC,WAAA;IACAe,EAAAhB,IAAAC,WAAA;IAsFAgB,EAAAjB,IAAAC,OAAgB;;MACd,MAAMN,MAAOuB,KAAAC,IAAAC,EAAAnB,MAAIc,GAAA,UAAQ,QAAAI,WAAA,aAAAA,EAAEE,WAAK,QAAAH,WAAA,aAAAA,EAAEI,WAAU;MAC5C,MAAMhB,IACJL,KAAKsB,oBAAoB,SAAStB,KAAKuB,WAAWvB,KAAKwB;MAEzD,MAAMC,IAAczB,KAAK0B,uBACrB1B,KAAK0B,qBAAqBhC,KAC1BiC,QAAQjC;MAEZ,MAAMkC,IACJ5B,KAAKsB,oBAAoB,SACrBK,QAAQ3B,KAAKuB,YACbvB,KAAK6B,uBACL7B,KAAK6B,qBAAqBxB,KAC1B;MAENL,KAAK8B,cAAcL,KAAeG;AAAW;IAG/CG,EAAAhC,IAAAC,OAAsB;MACpBmB,EAAAnB,MAAIgB,GAAA,KAAcgB,KAAlBhC;AAAoB;IAGtBiC,EAAAlC,IAAAC,OAAsB;;MACpBA,KAAKsB,kBAAkBH,EAAAnB,MAAIe,GAAA,KAAaK;MACxC,IAAIpB,KAAKsB,oBAAoB,QAAQ;QACnCH,EAAAnB,MAAIS,GAAA,KAAaW,QAAQ;aACpB;QACLD,EAAAnB,MAAIC,GAAA,KAAOI,OAAO;QAClBc,EAAAnB,MAAIkC,GAAA,KAAqBF,KAAzBhC;QACAmB,EAAAnB,MAAIgB,GAAA,KAAcgB,KAAlBhC;;OAEFkB,IAAAlB,KAAKmC,wBAAkB,QAAAjB,WAAA,aAAAA,EAAAc,KAAAhC,MAAGA,KAAKsB;AAAmC;IAGpEc,EAAArC,IAAAC,OAAiB;;MACfmB,EAAAnB,MAAIC,GAAA,KAAOP,OAAOyB,EAAAnB,MAAIc,GAAA,KAASM;MAC/BD,EAAAnB,MAAIC,GAAA,KAAOC,cAAciB,EAAAnB,MAAIW,GAAA,KAAgBS;MAC7CD,EAAAnB,MAAIC,GAAA,KAAOG,YAAWc,IAAAC,EAAAnB,MAAIa,GAAA,KAAuBO,WAAK,QAAAF,WAAA,aAAAA,EAAEmB;MACxDlB,EAAAnB,MAAIC,GAAA,KAAOE,uBAAuBgB,EAAAnB,MAAIS,GAAA,KAAaW,UAAU;MAC7DpB,KAAKsC,gBAAgBnB,EAAAnB,MAAIC,GAAA,MAAQsC,MAC9BC;QACCxC,KAAKyC,oBAAoBD,EAAiBE;AAAO;AAEpD;IAGHR,EAAAnC,IAAAC,OAAuB;;MACrBmB,EAAAnB,MAAIC,GAAA,KAAOI,OAAO;MAClBc,EAAAnB,MAAIY,GAAA,KAAoBQ,QAAQ;MAChCpB,KAAKuB,WAAW;OAChBL,IAAAlB,KAAK2C,wBAAkB,QAAAzB,WAAA,aAAAA,EAAAc,KAAAhC,MAAG;MAC1BmB,EAAAnB,MAAIgB,GAAA,KAAcgB,KAAlBhC;AAAoB;IAGtB4C,EAAA7C,IAAAC,OAAkC6C;;MAChC,MAAMC,IAASD,EAAMC;MACrB,MAAI5B,IAAA4B,EAAOC,WAAK,QAAA7B,WAAA,aAAAA,EAAE8B,UAAS,KAAKhD,KAAKsB,oBAAoB,QAAQ;QAC/DH,EAAAnB,MAAIC,GAAA,KAAOI,OAAOyC,EAAOC,MAAM;QAC/B/C,KAAKuB,WAAWuB,EAAOC,MAAM,GAAGrD;SAChCuB,IAAAjB,KAAK2C,wBAAkB,QAAA1B,WAAA,aAAAA,EAAAe,KAAAhC,MAAG8C,EAAOC,MAAM;QACvC5B,EAAAnB,MAAIgB,GAAA,KAAcgB,KAAlBhC;;;IAIJiD,EAAAlD,IAAAC,OAA0B;MACxBmB,EAAAnB,MAAIY,GAAA,KAAoBsC;AAAO;IAGjCC,EAAApD,IAAAC,OAAsB;MACpBmB,EAAAnB,MAAIgB,GAAA,KAAcgB,KAAlBhC;AAAoB;IAGtBoD,EAAArD,IAAAC,OAAqBqD;MACnB,MAAMC,IAAYD,EAAEP,OAA2BS;MAC/C,IAAID,EAASN,SAAS,GAAG;QACvB,MAAMQ,IAAUF,EAAS;QACzBE,EAAQC,iBAAiB,wBAAyBZ;UAChD,IAAI7C,KAAKsB,oBAAoB,QAAQ;YACnCtB,KAAKwB,cAAcqB,EAAMa,OAAOC;YAChCxC,EAAAnB,MAAImD,GAAA,KAAoBnB,KAAxBhC;;AAEH;;;;2BArK8B;4BACE;uBACL;uBACD;;;;;;;;;;;;;EA6D/B,uBAAM4D;IACJC,EAAA7D,MAAIF,SAA0BgE,EAAOC,oBAAoB/D,KAAKgE,KAAG;IACjEH,EAAA7D,MAAIM,GAAsB,EACxB;MACEc,OAAO;MACP6C,SAAS9C,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAOC;OAExC;MAAE/C,OAAO;MAAQ6C,SAAS9C,EAAAnB,MAAIF,GAAA,KAAkBsE,KAAKC;SACtD;;;;SAOH,sBAAMC,CAAiBA;IACrBnD,EAAAnB,MAAIU,GAAA,KAAgB6D,UAAUD;;EAyFhC,MAAAE;IACE,OACEC,EAACC,GAAI;MAACC,OAAM;OACVF,EAAA;MAAUG,OAAOtF;QACjBmF,EAAA;MACEI,KAAK1D,EAAAnB,MAAIO,GAAA;MACTuE,KAAMd,KACHH,EAAA7D,MAAIU,GAAkBsD,GAA4B;QAGvDS,EAAA;MAASE,OAAM;OACbF,EAAA;MAAQE,OAAM;OACZF,EAAA;MAAKE,OAAM;OACTF,EAAA;;MAEEE,OAAM;MACNI,SAAQ;OAEP5D,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAOc,iBAEhCP,EAAA;MACEE,OAAM;MACNtC,IAAG;MACHyC,KAAMd,KACHH,EAAA7D,MAAIc,GAAWkD,GAAuB;MAEzCiB,SAAS9D,EAAAnB,MAAI+B,GAAA;QAGf0C,EAAA;;MAEEE,OAAM;MACNI,SAAQ;OAEP5D,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAOgB,wBAEhCT,EAAA;MACEE,OAAM;MACNtC,IAAG;MACHyC,KAAMd,KACHH,EAAA7D,MAAIW,GAAkBqD,GAAuB;QAIlDS,EAAA;;MAEEE,OAAM;MACNI,SAAQ;OAEP5D,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAOiB,oBAEhCV,EAAA;MACEE,OAAM;MACNtC,IAAG;MACHjB,OAAOpB,KAAKoF;MACZN,KAAMd,KACHH,EAAA7D,MAAIa,GACHmD,GAAoC;MAExCqB,eAAc;MACdC,cAActF,KAAKoF;MACnBG,sBAAsBvF,KAAKwF;SAI/Bf,EAAA;MAAKE,OAAM;OACTF,EAAA;;MAEEE,OAAM;MACNC,OAAOzD,EAAAnB,MAAIM,GAAA;MACXmF,UAAUtE,EAAAnB,MAAIiC,GAAA;MACdb,OAAOpB,KAAK0F;MACZZ,KAAMd,KACHH,EAAA7D,MAAIe,GAAeiD,GAAmC;QAG3DS,EAAA;MAAKE,OAAM;OACTF,EAAA;MACEkB,WAAS;MACTtD,IAAG;MACHsC,OAAM;MACNiB,MAAK;MACLC,MAAK;MACLzE,OAAOpB,KAAKuB;MACZuE,UAAQ;MACRC,aAAa5E,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAO8B;MAC1CC,aAAa1G;MACb2G,UAAUlG,KAAKsB,oBAAoB;QAErCmD,EAAA;MACE0B,QAAM;MACNN,MAAK;MACLO,QAAO;MACPX,UAAUtE,EAAAnB,MAAI4C,GAAA;MACdkC,KAAMd,KACHH,EAAA7D,MAAIY,GAAsBoD,GAAsB;QAGrDS,EAAA;MAAKE,OAAM;OACTF,EAAA;MAAA,cAEItD,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAOmC;MAE/BC,OAAOnF,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAOmC;MACpChE,IAAG;MACHsC,OAAM;MACNiB,MAAK;MACLW,SAASpF,EAAAnB,MAAIkC,GAAA;MACbgE,UAAUlG,KAAKsB,oBAAoB;OAEnCmD,EAAA;MAAUE,OAAM;MAAUE,KAAKjF;SAGjC6E,EAAA;MACEpC,IAAG;MACHsC,OAAM;MACNiB,MAAK;MACLW,SAASpF,EAAAnB,MAAIiD,GAAA;MACbiD,UAAUlG,KAAKsB,oBAAoB;OAElCH,EAAAnB,MAAIF,GAAA,KAAkBoE,OAAOsC,uBAMxC/B,EAAA;MAAKE,OAAM;OACTF,EAAA;MAAKE,OAAM;OACTF,EAAA;MAAKE,OAAM;OACTF,EAAA;MACE/E,MAAK;MACL+G,cAActF,EAAAnB,MAAIoD,GAAA;SAGrBpD,KAAKyC,oBACJgC,EAAA;MACEE,OAAM;MACN+B,YAAYC,EAAOC,gBAAgBF;MACnCG,aAAaF,EAAOC,gBAAgBC;MACpCC,OAAOH,EAAOC,gBAAgBE;OAAK,mBAMzCrC,EAAA;MACEE,OAAM;MACNV,SAAS9C,EAAAnB,MAAIF,GAAA,KAAkBsE,KAAK2C;MACpCC,cAAa;MACblC,KAAMd,KACHH,EAAA7D,MAAIS,GAAeuD,GAA2B;SAKrDS,EAAA;MAAQE,OAAM;OACZF,EAAA;MAAKE,OAAM;OACTF,EAAA;MACEE,OAAM;MACNtC,IAAG;MACHkE,SAASvG,KAAKiH;MACdrB,MAAK;OAEJzE,EAAAnB,MAAIF,GAAA,KAAkBoH,OAAOC,YAEhC1C,EAAA;MACEE,OAAM;MACNtC,IAAG;MACHkE,SAASpF,EAAAnB,MAAIoC,GAAA;MACbwD,MAAK;MACLM,WAAWlG,KAAK8B;OAEfX,EAAAnB,MAAIF,GAAA,KAAkBoH,OAAOE"}