@genexus/genexus-ide-ui 0.0.101 → 0.0.103

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 (87) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/{gx-ide-container_3.cjs.entry.js → gx-ide-container_2.cjs.entry.js} +3 -42
  3. package/dist/cjs/gx-ide-container_2.cjs.entry.js.map +1 -0
  4. package/dist/cjs/gx-ide-dashboard-home.cjs.entry.js +53 -8
  5. package/dist/cjs/gx-ide-dashboard-home.cjs.entry.js.map +1 -1
  6. package/dist/cjs/gx-ide-empty-state_2.cjs.entry.js +107 -97
  7. package/dist/cjs/gx-ide-empty-state_2.cjs.entry.js.map +1 -1
  8. package/dist/cjs/gx-ide-new-object.cjs.entry.js +57 -7
  9. package/dist/cjs/gx-ide-new-object.cjs.entry.js.map +1 -1
  10. package/dist/cjs/gx-ide-recent-news.cjs.entry.js +113 -0
  11. package/dist/cjs/gx-ide-recent-news.cjs.entry.js.map +1 -0
  12. package/dist/cjs/gxg-list-box_2.cjs.entry.js +9 -0
  13. package/dist/cjs/gxg-list-box_2.cjs.entry.js.map +1 -1
  14. package/dist/cjs/gxg-title-editable.cjs.entry.js +128 -0
  15. package/dist/cjs/gxg-title-editable.cjs.entry.js.map +1 -0
  16. package/dist/cjs/gxg-title.cjs.entry.js +47 -0
  17. package/dist/cjs/gxg-title.cjs.entry.js.map +1 -0
  18. package/dist/cjs/loader.cjs.js +1 -1
  19. package/dist/collection/components/_helpers/empty-state/gx-ide-empty-state.js +4 -4
  20. package/dist/collection/components/_helpers/empty-state/gx-ide-empty-state.js.map +1 -1
  21. package/dist/collection/components/dashboard-home/dashboard-home.css +23 -11
  22. package/dist/collection/components/dashboard-home/dashboard-home.js +75 -9
  23. package/dist/collection/components/dashboard-home/dashboard-home.js.map +1 -1
  24. package/dist/collection/components/dashboard-home/gx-ide-assets/dashboard-home/langs/dashboard-home.lang.en.json +16 -1
  25. package/dist/collection/components/new-object/new-object.js +74 -7
  26. package/dist/collection/components/new-object/new-object.js.map +1 -1
  27. package/dist/components/gx-ide-dashboard-home.js +104 -20
  28. package/dist/components/gx-ide-dashboard-home.js.map +1 -1
  29. package/dist/components/gx-ide-empty-state2.js +4 -4
  30. package/dist/components/gx-ide-empty-state2.js.map +1 -1
  31. package/dist/components/gx-ide-new-object.js +58 -7
  32. package/dist/components/gx-ide-new-object.js.map +1 -1
  33. package/dist/components/list-box.js +12 -1
  34. package/dist/components/list-box.js.map +1 -1
  35. package/dist/esm/genexus-ide-ui.js +1 -1
  36. package/dist/esm/{gx-ide-container_3.entry.js → gx-ide-container_2.entry.js} +4 -42
  37. package/dist/esm/gx-ide-container_2.entry.js.map +1 -0
  38. package/dist/esm/gx-ide-dashboard-home.entry.js +53 -8
  39. package/dist/esm/gx-ide-dashboard-home.entry.js.map +1 -1
  40. package/dist/esm/gx-ide-empty-state_2.entry.js +107 -97
  41. package/dist/esm/gx-ide-empty-state_2.entry.js.map +1 -1
  42. package/dist/esm/gx-ide-new-object.entry.js +57 -7
  43. package/dist/esm/gx-ide-new-object.entry.js.map +1 -1
  44. package/dist/esm/gx-ide-recent-news.entry.js +109 -0
  45. package/dist/esm/gx-ide-recent-news.entry.js.map +1 -0
  46. package/dist/esm/gxg-list-box_2.entry.js +9 -0
  47. package/dist/esm/gxg-list-box_2.entry.js.map +1 -1
  48. package/dist/esm/gxg-title-editable.entry.js +124 -0
  49. package/dist/esm/gxg-title-editable.entry.js.map +1 -0
  50. package/dist/esm/gxg-title.entry.js +43 -0
  51. package/dist/esm/gxg-title.entry.js.map +1 -0
  52. package/dist/esm/loader.js +1 -1
  53. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  54. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  55. package/dist/genexus-ide-ui/gx-ide-assets/dashboard-home/langs/dashboard-home.lang.en.json +16 -1
  56. package/dist/genexus-ide-ui/{p-1346991a.entry.js → p-01f66e53.entry.js} +93 -39
  57. package/dist/genexus-ide-ui/p-01f66e53.entry.js.map +1 -0
  58. package/dist/genexus-ide-ui/p-3457226c.entry.js +146 -0
  59. package/dist/genexus-ide-ui/p-3457226c.entry.js.map +1 -0
  60. package/dist/genexus-ide-ui/{p-bff2603a.entry.js → p-5270ef52.entry.js} +120 -172
  61. package/dist/genexus-ide-ui/p-5270ef52.entry.js.map +1 -0
  62. package/dist/genexus-ide-ui/{p-40f21d2d.entry.js → p-95cd2572.entry.js} +9 -76
  63. package/dist/genexus-ide-ui/p-95cd2572.entry.js.map +1 -0
  64. package/dist/genexus-ide-ui/{p-4a5ad686.entry.js → p-ac1a72d9.entry.js} +62 -11
  65. package/dist/genexus-ide-ui/p-ac1a72d9.entry.js.map +1 -0
  66. package/dist/genexus-ide-ui/{p-4e155cd5.entry.js → p-bf7c17a8.entry.js} +10 -1
  67. package/dist/genexus-ide-ui/p-bf7c17a8.entry.js.map +1 -0
  68. package/dist/genexus-ide-ui/p-ce89cbcb.entry.js +71 -0
  69. package/dist/genexus-ide-ui/p-ce89cbcb.entry.js.map +1 -0
  70. package/dist/genexus-ide-ui/{p-2e6da0ef.entry.js → p-e9456041.entry.js} +6 -96
  71. package/dist/genexus-ide-ui/p-e9456041.entry.js.map +1 -0
  72. package/dist/types/components/dashboard-home/dashboard-home.d.ts +12 -2
  73. package/dist/types/components/new-object/new-object.d.ts +15 -1
  74. package/dist/types/components.d.ts +18 -2
  75. package/package.json +3 -3
  76. package/dist/cjs/gx-ide-container_3.cjs.entry.js.map +0 -1
  77. package/dist/cjs/gxg-card_2.cjs.entry.js +0 -243
  78. package/dist/cjs/gxg-card_2.cjs.entry.js.map +0 -1
  79. package/dist/esm/gx-ide-container_3.entry.js.map +0 -1
  80. package/dist/esm/gxg-card_2.entry.js +0 -238
  81. package/dist/esm/gxg-card_2.entry.js.map +0 -1
  82. package/dist/genexus-ide-ui/p-1346991a.entry.js.map +0 -1
  83. package/dist/genexus-ide-ui/p-2e6da0ef.entry.js.map +0 -1
  84. package/dist/genexus-ide-ui/p-40f21d2d.entry.js.map +0 -1
  85. package/dist/genexus-ide-ui/p-4a5ad686.entry.js.map +0 -1
  86. package/dist/genexus-ide-ui/p-4e155cd5.entry.js.map +0 -1
  87. package/dist/genexus-ide-ui/p-bff2603a.entry.js.map +0 -1
@@ -15,7 +15,17 @@ const GxIdeNewObject = class {
15
15
  this.renderedFirstTime = false;
16
16
  this.shortcutsSrc = getAssetPath(`./gx-ide-assets/new-object/shortcuts.json`);
17
17
  this.descriptionModifiedByUser = false;
18
+ this.nameModifiedByUser = false;
18
19
  // 9.LOCAL METHODS //
20
+ /**
21
+ * Scroll into view on both list-boxes. Only makes sense if defaultTypeId is not undefined, since otherwise in both list-boxes the initial selected item should be the first one, in which case is not needed to do scrollIntoView. Only call this method after the first render on new-object.
22
+ */
23
+ this.scrollIntoViewListBoxes = () => {
24
+ if (this.defaultTypeId) {
25
+ this.categoryListBox.scrollToSelected();
26
+ this.typeListBox.scrollToSelected();
27
+ }
28
+ };
19
29
  this.setFirstFocusableElement = () => {
20
30
  this.el.addEventListener("focus", () => {
21
31
  this.nameEl.focus();
@@ -42,19 +52,56 @@ const GxIdeNewObject = class {
42
52
  return null;
43
53
  };
44
54
  /**
45
- * This method initializes tha name value. It depends on 'this.selectedType'
55
+ * This method defines the initial selected category and type, and it thens initializes tha name value.
46
56
  */
47
57
  this.init = () => {
48
- this.selectedCategory = this.typeCategories[0];
49
- this.selectedType = this.typeCategories[0].types[0];
58
+ const defaultTypeFound = this.setDefaultType(this.defaultTypeId);
59
+ if (!defaultTypeFound) {
60
+ this.selectedCategory = this.typeCategories[0];
61
+ this.selectedType = this.selectedCategory.types[0];
62
+ }
50
63
  if (this.selectedType && this.selectedType.name.length > 0) {
51
64
  this.name = this.getNameSuggestion(this.selectedType);
52
65
  this.description = this.selectedType.name;
53
66
  }
54
67
  };
68
+ this.setDefaultType = (typeId) => {
69
+ if (!typeId) {
70
+ return false;
71
+ }
72
+ let found = false;
73
+ outerLoop: for (let i = 0; i < this.typeCategories.length; i++) {
74
+ for (let j = 0; j < this.typeCategories[i].types.length; j++) {
75
+ const loopTypeId = this.typeCategories[i].types[j].id;
76
+ if (loopTypeId === typeId) {
77
+ this.selectedCategory = this.typeCategories[i];
78
+ this.selectedType = this.typeCategories[i].types[j];
79
+ found = true;
80
+ break outerLoop;
81
+ }
82
+ }
83
+ }
84
+ return found;
85
+ };
55
86
  this.getNameSuggestion = (selectedType) => {
56
- //Type name can include whitespaces, we need to replace all whitespaces to avoid invalid suggestions:
57
- return selectedType.name.replace(/\s/g, '');
87
+ // Type name can include whitespaces, we need to replace all whitespaces to avoid invalid suggestions:
88
+ return selectedType.name.replace(/\s/g, "");
89
+ };
90
+ this.nameValueHandler = () => {
91
+ if (this.nameModifiedByUser) {
92
+ return this.nameEl.value;
93
+ }
94
+ else {
95
+ return this.getNameSuggestion(this.selectedType);
96
+ }
97
+ };
98
+ this.descriptionValueHandler = () => {
99
+ if (this.nameModifiedByUser) {
100
+ return this.descriptionEl.value;
101
+ }
102
+ else {
103
+ return this.selectedType.name;
104
+ }
58
105
  };
59
106
  this.onInputNameHandler = (e) => {
60
107
  const name = e.detail;
@@ -62,6 +109,7 @@ const GxIdeNewObject = class {
62
109
  // description should be equal to name, unless the description was already modified by the user.
63
110
  this.descriptionEl.value = name;
64
111
  }
112
+ this.nameModifiedByUser = true;
65
113
  };
66
114
  this.onBlurNameHandler = async () => {
67
115
  const result = await this.validateNameCallback(this.nameEl.value);
@@ -138,6 +186,7 @@ const GxIdeNewObject = class {
138
186
  this.typeCategories = undefined;
139
187
  this.parent = undefined;
140
188
  this.defaultParent = undefined;
189
+ this.defaultTypeId = undefined;
141
190
  this.selectModuleCallback = undefined;
142
191
  this.validateNameCallback = undefined;
143
192
  this.createCallback = undefined;
@@ -161,6 +210,7 @@ const GxIdeNewObject = class {
161
210
  if (!this.renderedFirstTime) {
162
211
  this.componentDidRenderFirstTime.emit(this._componentLocale.componentName);
163
212
  this.renderedFirstTime = true;
213
+ this.scrollIntoViewListBoxes();
164
214
  }
165
215
  }
166
216
  // 7.LISTENERS //
@@ -180,9 +230,9 @@ const GxIdeNewObject = class {
180
230
  // 11.RENDER() FUNCTION //
181
231
  render() {
182
232
  var _a;
183
- return (h(Host, { class: "gx-ide-component" }, h("div", { class: "gx-ide-main-wrapper" }, h("gx-ide-container", { noContentPadding: true, noContentGap: true, slimmerFooter: config.gxIdeContainer.slimmerFooter, containerTitle: this.displayTitle ? this._componentLocale.componentName : null, noHeadingBorder: true }, h("main", { class: "main" }, h("div", { class: "categories-types-container" }, h("div", { class: "categories" }, this.typeCategories.length > 0 ? (h("gxg-list-box", { class: "category", "single-selection": true, noBorder: true, borderEnd: true, "the-title": this._componentLocale.categorySelectionTitle, onSelectionChanged: this.categoryOnSelectionChangedHandler }, this.typeCategories.map(category => (h("gxg-list-box-item", { key: category.id, value: category.id, icon: category.icon, part: `category-${category.id}` }, category.name))))) : null), h("div", { class: "types" }, this.selectedCategory.types.length > 0 ? (h("gxg-list-box", { class: "types", "single-selection": true, noBorder: true, theTitle: this.selectedCategory.name
233
+ return (h(Host, { class: "gx-ide-component" }, h("div", { class: "gx-ide-main-wrapper" }, h("gx-ide-container", { noContentPadding: true, noContentGap: true, slimmerFooter: config.gxIdeContainer.slimmerFooter, containerTitle: this.displayTitle ? this._componentLocale.componentName : null, noHeadingBorder: true }, h("main", { class: "main" }, h("div", { class: "categories-types-container" }, h("div", { class: "categories" }, this.typeCategories.length > 0 ? (h("gxg-list-box", { class: "category", "single-selection": true, noBorder: true, borderEnd: true, "the-title": this._componentLocale.categorySelectionTitle, onSelectionChanged: this.categoryOnSelectionChangedHandler, ref: el => (this.categoryListBox = el) }, this.typeCategories.map(category => (h("gxg-list-box-item", { key: category.id, value: category.id, icon: category.icon, part: `category-${category.id}`, selected: this.selectedCategory.id === category.id }, category.name))))) : null), h("div", { class: "types" }, this.selectedCategory.types.length > 0 ? (h("gxg-list-box", { class: "types", "single-selection": true, noBorder: true, theTitle: this.selectedCategory.name
184
234
  ? `${this.selectedCategory.name} ${this._componentLocale.typeSelectionTitleSuffix}`
185
- : this._componentLocale.typeSelectionTitle, key: this.selectedCategory.id, onSelectionChanged: this.typeOnSelectionChangedHandler }, this.selectedCategory.types.map(type => (h("gxg-list-box-item", { key: `${this.selectedCategory.id}-${type.id}`, icon: type.icon, part: `type-${this.selectedCategory.id}-${type.id}` }, type.name))))) : (h("p", null, "No Categories to display")))), h("div", { class: "api-description" }, h("gxg-title", { type: "title-05" }, (_a = this.selectedType) === null || _a === void 0 ? void 0 : _a.description), h("div", { class: "form" }, h("gxg-label", { labelPosition: "start" }, this._componentLocale.objectName), h("gxg-form-text", { "label-position": "start", placeholder: "Name", "max-width": "100%", value: this.getNameSuggestion(this.selectedType), toolTip: config.tooltip, ref: (el) => (this.nameEl = el), onInput: this.onInputNameHandler, onBlur: this.onBlurNameHandler, onValueChanged: this.onNameValueChangedHandler, debounce: true, part: "name", "display-validation-styles": true, "display-validation-message": true }), h("gxg-label", { labelPosition: "start" }, this._componentLocale.objectDescription), h("gxg-form-text", { "label-position": "start", placeholder: "Description", "max-width": "100%", value: this.selectedType.name, ref: (el) => (this.descriptionEl = el), onInput: this.onInputDescriptionHandler, part: "description", "display-validation-styles": true, "display-validation-message": true }), this.renderModuleFolder()))), h("gxg-button", { id: "button-cancel", slot: "footer-end", type: "outlined", onClick: this.cancelCallbackHandler, part: "gxg-button gxg-button--cancel" }, this._componentLocale.footer.btnCancel), h("gxg-button", { id: "button-create", slot: "footer-end", type: "primary-text-only", onClick: this.createCallbackHandler, disabled: !this.nameIsValid, part: "gxg-button gxg-button--create" }, this._componentLocale.footer.btnCreate))), h("gxg-shortcuts", { src: this.shortcutsSrc, ref: (el) => (this.gxgShortcutsEl = el) })));
235
+ : this._componentLocale.typeSelectionTitle, key: this.selectedCategory.id, onSelectionChanged: this.typeOnSelectionChangedHandler, ref: el => (this.typeListBox = el) }, this.selectedCategory.types.map(type => (h("gxg-list-box-item", { key: `${this.selectedCategory.id}-${type.id}`, icon: type.icon, part: `type-${this.selectedCategory.id}-${type.id}`, selected: this.selectedType.id === type.id }, type.name))))) : (h("p", null, "No Categories to display")))), h("div", { class: "api-description" }, h("gxg-title", { type: "title-05" }, (_a = this.selectedType) === null || _a === void 0 ? void 0 : _a.description), h("div", { class: "form" }, h("gxg-label", { labelPosition: "start" }, this._componentLocale.objectName), h("gxg-form-text", { "label-position": "start", placeholder: "Name", "max-width": "100%", value: this.nameValueHandler(), toolTip: config.tooltip, ref: (el) => (this.nameEl = el), onInput: this.onInputNameHandler, onBlur: this.onBlurNameHandler, onValueChanged: this.onNameValueChangedHandler, debounce: true, part: "name", "display-validation-styles": true, "display-validation-message": true }), h("gxg-label", { labelPosition: "start" }, this._componentLocale.objectDescription), h("gxg-form-text", { "label-position": "start", placeholder: "Description", "max-width": "100%", value: this.descriptionValueHandler(), ref: (el) => (this.descriptionEl = el), onInput: this.onInputDescriptionHandler, part: "description", "display-validation-styles": true, "display-validation-message": true }), this.renderModuleFolder()))), h("gxg-button", { id: "button-cancel", slot: "footer-end", type: "outlined", onClick: this.cancelCallbackHandler, part: "gxg-button gxg-button--cancel" }, this._componentLocale.footer.btnCancel), h("gxg-button", { id: "button-create", slot: "footer-end", type: "primary-text-only", onClick: this.createCallbackHandler, disabled: !this.nameIsValid, part: "gxg-button gxg-button--create" }, this._componentLocale.footer.btnCreate))), h("gxg-shortcuts", { src: this.shortcutsSrc, ref: (el) => (this.gxgShortcutsEl = el) })));
186
236
  }
187
237
  static get delegatesFocus() { return true; }
188
238
  static get assetsDirs() { return ["gx-ide-assets/new-object"]; }
@@ -1 +1 @@
1
- {"file":"gx-ide-new-object.entry.js","mappings":"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","names":[],"sources":["src/components/new-object/new-object.scss?tag=gx-ide-new-object&encapsulation=shadow","src/components/new-object/new-object.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n\n:host {\n display: block;\n border: 1px solid var(--gxg-border-color--regular);\n background-color: var(--mer-color__surface);\n}\n/*main*/\n.main {\n display: grid;\n grid-template-rows: 1fr auto;\n overflow: auto;\n height: 100%;\n}\n.categories-types-container {\n display: flex;\n flex-direction: row;\n flex-shrink: 1;\n overflow: hidden;\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n .categories {\n flex: 1;\n }\n .types {\n flex: 2;\n }\n}\n.api-description {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n gap: var(--gx-ide-grid-row-gap);\n padding: var(--gx-ide-grid-row-gap);\n}\n.form {\n display: grid;\n grid-template-columns: minmax(95px, auto) 1fr;\n grid-template-areas:\n \"name-label name-input\"\n \"description-label description-input\"\n \"module-label module-input\";\n gap: var(--gx-ide-grid-row-gap);\n column-gap: 0;\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-input {\n grid-area: \"module-input\";\n }\n}\n","/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Element,\n State,\n Watch,\n getAssetPath,\n Method\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { SelectionChangedEvent } from \"@genexus/gemini/dist/types/components/list-box/list-box\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { EntityData } from \"../../common/types\";\n\n@Component({\n tag: \"gx-ide-new-object\",\n styleUrl: \"new-object.scss\",\n shadow: { delegatesFocus: true },\n assetsDirs: [\"gx-ide-assets/new-object\"]\n})\nexport class GxIdeNewObject {\n /*\nINDEX:\n1.OWN PROPERTIES\n2.REFERENCE TO ELEMENTS\n3.STATE() VARIABLES\n4.PUBLIC PROPERTY API | WATCH'S\n5.EVENTS (EMIT)\n6.COMPONENT LIFECYCLE EVENTS\n7.LISTENERS\n8.PUBLIC METHODS API\n9.LOCAL METHODS\n10.RENDER() FUNCTION\n*/\n\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private renderedFirstTime = false;\n private shortcutsSrc = getAssetPath(\n `./gx-ide-assets/new-object/shortcuts.json`\n );\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeNewObjectElement;\n\n /* References needed to collect data con \"Create\" button submit*/\n private nameEl!: HTMLGxgFormTextElement;\n private descriptionEl!: HTMLGxgFormTextElement;\n private moduleFolderEl!: HTMLGxIdeEntitySelectorElement;\n private descriptionModifiedByUser = false;\n private gxgShortcutsEl: HTMLGxgShortcutsElement;\n\n // 3.STATE() VARIABLES //\n\n @State() selectedCategory: TypeCategoryData | null;\n @State() selectedType: TypeData | null;\n @Watch(\"selectedType\")\n watchSelectedTypeHandler() {\n this.descriptionModifiedByUser = false;\n }\n @State() nameIsValid = false;\n // Name of the new object\n @State() name: string = undefined;\n // Description of the new object\n @State() description: string = undefined;\n\n // 4.PUBLIC PROPERTY API //\n\n /**\n * If true it displays the component title on the header\n */\n @Prop() readonly displayTitle = false;\n\n /**\n * Applies a shadow all around\n */\n @Prop() readonly shadow = false;\n\n /**\n * Array containing category list and its corresponding types\n */\n @Prop() readonly typeCategories!: TypeCategoryData[];\n\n /**\n * Current value for Module/Folder\n */\n @Prop() readonly parent: EntityData;\n\n /**\n * Default value for the Module/Folder field.\n */\n @Prop() readonly defaultParent: EntityData;\n\n /**\n * Callback invoked when the action is executed on the Module/Folder filter (button '...'). 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 you must validate a name. Returns error message or 'undefined' if name is not valid.\n */\n @Prop() readonly validateNameCallback: ValidateNameCallback;\n\n /**\n * Callback invoked when user wants to cancel object creation\n */\n @Prop() readonly createCallback: CreateCallback;\n\n /**\n * Callback invoked when user wants to confirm object creation\n */\n @Prop() readonly cancelCallback: CancelCallback;\n\n // 5.EVENTS (EMIT) //\n\n /**\n * This event emm=its the data needed to create a new object\n */\n @Event() create: EventEmitter<NewObjectData>;\n\n /**\n * This event is trigger after a validation of the object name is made. Returns undefined if its valid, otherwise an error message\n */\n @Event() validateName: EventEmitter<string | undefined>;\n\n /**\n * This event emits the 'cancel' event\n */\n @Event() cancel: EventEmitter<boolean>;\n\n /**\n * This event is emitted once just after the component is fully loaded and the first render() occurs.\n */\n @Event() componentDidLoadEvent: EventEmitter<boolean>;\n\n /**\n * This event is emitted once just after the component is fully loaded and the first render() occurs\n */\n @Event() componentDidRenderFirstTime: EventEmitter<boolean>;\n\n // 6.COMPONENT LIFECYCLE EVENTS //\n\n async componentWillLoad() {\n this.init();\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidLoad() {\n this.nameEl.focus();\n this.setFirstFocusableElement();\n this.validateInitialName();\n this.componentDidLoadEvent.emit(true);\n }\n\n componentDidRender() {\n if (!this.renderedFirstTime) {\n this.componentDidRenderFirstTime.emit(\n this._componentLocale.componentName\n );\n this.renderedFirstTime = true;\n }\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n /**\n * Suspends or reactivates the shortcuts\n */\n @Method()\n async suspendShortcuts(suspendShortcuts: boolean) {\n if (suspendShortcuts) {\n this.gxgShortcutsEl.suspend = true;\n } else {\n this.gxgShortcutsEl.suspend = false;\n }\n }\n\n // 9.LOCAL METHODS //\n\n private setFirstFocusableElement = () => {\n this.el.addEventListener(\"focus\", () => {\n this.nameEl.focus();\n });\n };\n\n private validateInitialName = async () => {\n const result: string | undefined = await this.validateNameCallback(\n this.name\n );\n this.validateNameHandler(result);\n };\n\n private renderModuleFolder = () => {\n if (this.selectedType.hasModule || this.selectedType.hasFolder) {\n let labelDescription = this._componentLocale.moduleFolder;\n if (!this.selectedType.hasFolder) {\n labelDescription = this._componentLocale.moduleOnly;\n } else if (!this.selectedType.hasModule) {\n labelDescription = this._componentLocale.folderOnly;\n }\n return [\n <gxg-label labelPosition=\"start\">{labelDescription}</gxg-label>,\n <gx-ide-entity-selector\n value={this.parent}\n defaultValue={this.defaultParent}\n selectEntityCallback={this.selectModuleCallback}\n ref={(el: HTMLGxIdeEntitySelectorElement) =>\n (this.moduleFolderEl = el as HTMLGxIdeEntitySelectorElement)\n }\n id=\"module\"\n part=\"module\"\n ></gx-ide-entity-selector>\n ];\n }\n return null;\n };\n\n /**\n * This method initializes tha name value. It depends on 'this.selectedType'\n */\n private init = () => {\n this.selectedCategory = this.typeCategories[0];\n this.selectedType = this.typeCategories[0].types[0];\n\n if (this.selectedType && this.selectedType.name.length > 0) {\n this.name = this.getNameSuggestion(this.selectedType);\n this.description = this.selectedType.name;\n }\n };\n\n private getNameSuggestion = (selectedType:TypeData) => {\n //Type name can include whitespaces, we need to replace all whitespaces to avoid invalid suggestions:\n return selectedType.name.replace(/\\s/g, '');\n }\n\n private onInputNameHandler = (e: CustomEvent<string>) => {\n const name = e.detail;\n if (!this.descriptionModifiedByUser) {\n // description should be equal to name, unless the description was already modified by the user.\n this.descriptionEl.value = name;\n }\n };\n\n private onBlurNameHandler = async () => {\n const result: string | undefined = await this.validateNameCallback(\n this.nameEl.value\n );\n this.validateNameHandler(result);\n };\n\n private onNameValueChangedHandler = async (e: CustomEvent<string>) => {\n const name = e.detail;\n const result: string | undefined = await this.validateNameCallback(name);\n this.validateNameHandler(result);\n };\n\n private onInputDescriptionHandler = (e: CustomEvent<string>) => {\n this.description = e.detail;\n this.descriptionModifiedByUser = true;\n };\n\n /**\n * If the parameter is undefined, is because the name is valid. Otherwise, if it receives a string, is because the name is not valid. The string is the error message to display.\n */\n private validateNameHandler = (result: string | undefined): void => {\n if (result !== undefined) {\n // the name is not valid. display message\n this.nameEl.validationMessage = result;\n this.nameEl.validationStatus = \"error\";\n this.nameIsValid = false;\n } else {\n // valid name\n this.nameEl.validationMessage = null;\n this.nameEl.validationStatus = \"indeterminate\";\n this.nameIsValid = true;\n }\n };\n\n private createCallbackHandler = async (): Promise<void> => {\n const data: NewObjectData = {\n typeId: this.selectedType?.id,\n name: this.nameEl.value,\n description: !this.descriptionModifiedByUser\n ? undefined\n : this.descriptionEl.value,\n moduleId: this.moduleFolderEl?.value?.id\n };\n const result = await this.createCallback(data);\n this.validateNameHandler(result);\n };\n\n private cancelCallbackHandler = async (): Promise<void> => {\n await this.cancelCallback();\n };\n\n private categoryOnSelectionChangedHandler = (\n selectionEvent: CustomEvent<SelectionChangedEvent>\n ): void => {\n const selection = selectionEvent.detail.items;\n if (selection.length > 0) {\n const selectedCategory = this.typeCategories[selection[0].index];\n if (selectedCategory) {\n this.selectedCategory = selectedCategory;\n if (selectedCategory.types.length > 0) {\n this.selectedType = selectedCategory.types[0];\n }\n }\n }\n };\n\n private typeOnSelectionChangedHandler = (\n selectionEvent: CustomEvent<SelectionChangedEvent>\n ) => {\n const selection = selectionEvent.detail.items;\n if (selection.length > 0) {\n const selected = selection[0];\n this.selectedType = this.selectedCategory.types[selected.index];\n }\n };\n\n // 10.LOCAL METHODS (RENDER) //\n\n // 11.RENDER() FUNCTION //\n\n render() {\n return (\n <Host class=\"gx-ide-component\">\n <div class=\"gx-ide-main-wrapper\">\n <gx-ide-container\n noContentPadding\n noContentGap\n slimmerFooter={config.gxIdeContainer.slimmerFooter}\n containerTitle={\n this.displayTitle ? this._componentLocale.componentName : null\n }\n noHeadingBorder\n >\n <main class=\"main\">\n <div class=\"categories-types-container\">\n <div class=\"categories\">\n {/* select a category listbox*/}\n {this.typeCategories.length > 0 ? (\n <gxg-list-box\n class=\"category\"\n single-selection\n noBorder\n borderEnd\n the-title={this._componentLocale.categorySelectionTitle}\n onSelectionChanged={\n this.categoryOnSelectionChangedHandler\n }\n >\n {this.typeCategories.map(category => (\n <gxg-list-box-item\n key={category.id}\n value={category.id}\n icon={category.icon}\n part={`category-${category.id}`}\n >\n {category.name}\n </gxg-list-box-item>\n ))}\n </gxg-list-box>\n ) : null}\n </div>\n <div class=\"types\">\n {/* types listbox*/}\n {this.selectedCategory.types.length > 0 ? (\n <gxg-list-box\n class=\"types\"\n single-selection\n noBorder\n theTitle={\n this.selectedCategory.name\n ? `${this.selectedCategory.name} ${this._componentLocale.typeSelectionTitleSuffix}`\n : this._componentLocale.typeSelectionTitle\n }\n key={this.selectedCategory.id}\n onSelectionChanged={this.typeOnSelectionChangedHandler}\n >\n {this.selectedCategory.types.map(type => (\n <gxg-list-box-item\n key={`${this.selectedCategory.id}-${type.id}`}\n icon={type.icon}\n part={`type-${this.selectedCategory.id}-${type.id}`}\n >\n {type.name}\n </gxg-list-box-item>\n ))}\n </gxg-list-box>\n ) : (\n <p>No Categories to display</p>\n )}\n </div>\n </div>\n <div class=\"api-description\">\n {/* api description title*/}\n <gxg-title type=\"title-05\">\n {this.selectedType?.description}\n </gxg-title>\n <div class=\"form\">\n {/* selected type name */}\n <gxg-label labelPosition=\"start\">\n {this._componentLocale.objectName}\n </gxg-label>\n <gxg-form-text\n label-position=\"start\"\n placeholder=\"Name\"\n max-width=\"100%\"\n value={this.getNameSuggestion(this.selectedType)}\n toolTip={config.tooltip}\n ref={(el: HTMLGxgFormTextElement) =>\n (this.nameEl = el as HTMLGxgFormTextElement)\n }\n onInput={this.onInputNameHandler as any}\n onBlur={this.onBlurNameHandler}\n onValueChanged={this.onNameValueChangedHandler}\n debounce\n part=\"name\"\n display-validation-styles\n display-validation-message\n ></gxg-form-text>\n\n {/* description */}\n <gxg-label labelPosition=\"start\">\n {this._componentLocale.objectDescription}\n </gxg-label>\n <gxg-form-text\n label-position=\"start\"\n placeholder=\"Description\"\n max-width=\"100%\"\n value={this.selectedType.name}\n ref={(el: HTMLGxgFormTextElement) =>\n (this.descriptionEl = el as HTMLGxgFormTextElement)\n }\n onInput={this.onInputDescriptionHandler as any}\n part=\"description\"\n display-validation-styles\n display-validation-message\n ></gxg-form-text>\n\n {this.renderModuleFolder()}\n </div>\n </div>\n </main>\n\n {/* Footer*/}\n {/* cancel button*/}\n <gxg-button\n id=\"button-cancel\"\n slot=\"footer-end\"\n type=\"outlined\"\n onClick={this.cancelCallbackHandler}\n part=\"gxg-button gxg-button--cancel\"\n >\n {this._componentLocale.footer.btnCancel}\n </gxg-button>\n {/* create button*/}\n <gxg-button\n id=\"button-create\"\n slot=\"footer-end\"\n type=\"primary-text-only\"\n onClick={this.createCallbackHandler}\n disabled={!this.nameIsValid}\n part=\"gxg-button gxg-button--create\"\n >\n {this._componentLocale.footer.btnCreate}\n </gxg-button>\n </gx-ide-container>\n </div>\n <gxg-shortcuts\n src={this.shortcutsSrc}\n ref={(el: HTMLGxgShortcutsElement) =>\n (this.gxgShortcutsEl = el as HTMLGxgShortcutsElement)\n }\n ></gxg-shortcuts>\n </Host>\n );\n }\n}\n\nexport interface NewObjectData {\n typeId: string;\n name: string;\n description: string | undefined;\n moduleId: string;\n}\n\nexport type ValidateNameCallback = (\n name: string\n) => Promise<string | undefined>;\n\nexport type SelectModuleCallback = () => Promise<EntityData | undefined>;\n\nexport type CreateCallback = (\n data: NewObjectData\n) => Promise<string | undefined>;\n\nexport type CancelCallback = () => Promise<void>;\n\nexport type TypeCategoryData = {\n id: string;\n name: string;\n icon: string;\n types: TypeData[];\n};\n\nexport type TypeData = {\n id: string;\n name: string;\n icon: string;\n hasModule: boolean;\n hasFolder: boolean;\n description: string;\n};\n"],"version":3}
1
+ {"file":"gx-ide-new-object.entry.js","mappings":"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","names":[],"sources":["src/components/new-object/new-object.scss?tag=gx-ide-new-object&encapsulation=shadow","src/components/new-object/new-object.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n\n:host {\n display: block;\n border: 1px solid var(--gxg-border-color--regular);\n background-color: var(--mer-color__surface);\n}\n/*main*/\n.main {\n display: grid;\n grid-template-rows: 1fr auto;\n overflow: auto;\n height: 100%;\n}\n.categories-types-container {\n display: flex;\n flex-direction: row;\n flex-shrink: 1;\n overflow: hidden;\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n .categories {\n flex: 1;\n }\n .types {\n flex: 2;\n }\n}\n.api-description {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n gap: var(--gx-ide-grid-row-gap);\n padding: var(--gx-ide-grid-row-gap);\n}\n.form {\n display: grid;\n grid-template-columns: minmax(95px, auto) 1fr;\n grid-template-areas:\n \"name-label name-input\"\n \"description-label description-input\"\n \"module-label module-input\";\n gap: var(--gx-ide-grid-row-gap);\n column-gap: 0;\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-input {\n grid-area: \"module-input\";\n }\n}\n","/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Element,\n State,\n Watch,\n getAssetPath,\n Method\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { SelectionChangedEvent } from \"@genexus/gemini/dist/types/components/list-box/list-box\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { EntityData } from \"../../common/types\";\n\n@Component({\n tag: \"gx-ide-new-object\",\n styleUrl: \"new-object.scss\",\n shadow: { delegatesFocus: true },\n assetsDirs: [\"gx-ide-assets/new-object\"]\n})\nexport class GxIdeNewObject {\n /*\nINDEX:\n1.OWN PROPERTIES\n2.REFERENCE TO ELEMENTS\n3.STATE() VARIABLES\n4.PUBLIC PROPERTY API | WATCH'S\n5.EVENTS (EMIT)\n6.COMPONENT LIFECYCLE EVENTS\n7.LISTENERS\n8.PUBLIC METHODS API\n9.LOCAL METHODS\n10.RENDER() FUNCTION\n*/\n\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private renderedFirstTime = false;\n private shortcutsSrc = getAssetPath(\n `./gx-ide-assets/new-object/shortcuts.json`\n );\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeNewObjectElement;\n\n /* References needed to collect data con \"Create\" button submit*/\n private nameEl!: HTMLGxgFormTextElement;\n private descriptionEl!: HTMLGxgFormTextElement;\n private moduleFolderEl!: HTMLGxIdeEntitySelectorElement;\n private descriptionModifiedByUser = false;\n private nameModifiedByUser = false;\n private gxgShortcutsEl: HTMLGxgShortcutsElement;\n private categoryListBox!: HTMLGxgListBoxElement;\n private typeListBox!: HTMLGxgListBoxElement;\n\n // 3.STATE() VARIABLES //\n\n @State() selectedCategory: TypeCategoryData | null;\n @State() selectedType: TypeData | null;\n @Watch(\"selectedType\")\n watchSelectedTypeHandler() {\n this.descriptionModifiedByUser = false;\n }\n @State() nameIsValid = false;\n // Name of the new object\n @State() name: string = undefined;\n // Description of the new object\n @State() description: string = undefined;\n\n // 4.PUBLIC PROPERTY API //\n\n /**\n * If true it displays the component title on the header\n */\n @Prop() readonly displayTitle = false;\n\n /**\n * Applies a shadow all around\n */\n @Prop() readonly shadow = false;\n\n /**\n * Array containing category list and its corresponding types\n */\n @Prop() readonly typeCategories!: TypeCategoryData[];\n\n /**\n * Current value for Module/Folder\n */\n @Prop() readonly parent: EntityData;\n\n /**\n * Default value for the Module/Folder field.\n */\n @Prop() readonly defaultParent: EntityData;\n\n /**\n * Allows you to define the type selected by default when instantiating the dialog. Represented by the type identifier\n */\n @Prop() readonly defaultTypeId: string;\n\n /**\n * Callback invoked when the action is executed on the Module/Folder filter (button '...'). 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 you must validate a name. Returns error message or 'undefined' if name is not valid.\n */\n @Prop() readonly validateNameCallback: ValidateNameCallback;\n\n /**\n * Callback invoked when user wants to cancel object creation\n */\n @Prop() readonly createCallback: CreateCallback;\n\n /**\n * Callback invoked when user wants to confirm object creation\n */\n @Prop() readonly cancelCallback: CancelCallback;\n\n // 5.EVENTS (EMIT) //\n\n /**\n * This event emm=its the data needed to create a new object\n */\n @Event() create: EventEmitter<NewObjectData>;\n\n /**\n * This event is trigger after a validation of the object name is made. Returns undefined if its valid, otherwise an error message\n */\n @Event() validateName: EventEmitter<string | undefined>;\n\n /**\n * This event emits the 'cancel' event\n */\n @Event() cancel: EventEmitter<boolean>;\n\n /**\n * This event is emitted once just after the component is fully loaded and the first render() occurs.\n */\n @Event() componentDidLoadEvent: EventEmitter<boolean>;\n\n /**\n * This event is emitted once just after the component is fully loaded and the first render() occurs\n */\n @Event() componentDidRenderFirstTime: EventEmitter<boolean>;\n\n // 6.COMPONENT LIFECYCLE EVENTS //\n\n async componentWillLoad() {\n this.init();\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidLoad() {\n this.nameEl.focus();\n this.setFirstFocusableElement();\n this.validateInitialName();\n this.componentDidLoadEvent.emit(true);\n }\n\n componentDidRender() {\n if (!this.renderedFirstTime) {\n this.componentDidRenderFirstTime.emit(\n this._componentLocale.componentName\n );\n this.renderedFirstTime = true;\n this.scrollIntoViewListBoxes();\n }\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n /**\n * Suspends or reactivates the shortcuts\n */\n @Method()\n async suspendShortcuts(suspendShortcuts: boolean) {\n if (suspendShortcuts) {\n this.gxgShortcutsEl.suspend = true;\n } else {\n this.gxgShortcutsEl.suspend = false;\n }\n }\n\n // 9.LOCAL METHODS //\n\n /**\n * Scroll into view on both list-boxes. Only makes sense if defaultTypeId is not undefined, since otherwise in both list-boxes the initial selected item should be the first one, in which case is not needed to do scrollIntoView. Only call this method after the first render on new-object.\n */\n private scrollIntoViewListBoxes = () => {\n if (this.defaultTypeId) {\n this.categoryListBox.scrollToSelected();\n this.typeListBox.scrollToSelected();\n }\n };\n\n private setFirstFocusableElement = () => {\n this.el.addEventListener(\"focus\", () => {\n this.nameEl.focus();\n });\n };\n\n private validateInitialName = async () => {\n const result: string | undefined = await this.validateNameCallback(\n this.name\n );\n this.validateNameHandler(result);\n };\n\n private renderModuleFolder = () => {\n if (this.selectedType.hasModule || this.selectedType.hasFolder) {\n let labelDescription = this._componentLocale.moduleFolder;\n if (!this.selectedType.hasFolder) {\n labelDescription = this._componentLocale.moduleOnly;\n } else if (!this.selectedType.hasModule) {\n labelDescription = this._componentLocale.folderOnly;\n }\n return [\n <gxg-label labelPosition=\"start\">{labelDescription}</gxg-label>,\n <gx-ide-entity-selector\n value={this.parent}\n defaultValue={this.defaultParent}\n selectEntityCallback={this.selectModuleCallback}\n ref={(el: HTMLGxIdeEntitySelectorElement) =>\n (this.moduleFolderEl = el as HTMLGxIdeEntitySelectorElement)\n }\n id=\"module\"\n part=\"module\"\n ></gx-ide-entity-selector>\n ];\n }\n return null;\n };\n\n /**\n * This method defines the initial selected category and type, and it thens initializes tha name value.\n */\n private init = () => {\n const defaultTypeFound = this.setDefaultType(this.defaultTypeId);\n if (!defaultTypeFound) {\n this.selectedCategory = this.typeCategories[0];\n this.selectedType = this.selectedCategory.types[0];\n }\n if (this.selectedType && this.selectedType.name.length > 0) {\n this.name = this.getNameSuggestion(this.selectedType);\n this.description = this.selectedType.name;\n }\n };\n\n private setDefaultType = (typeId: string | undefined): boolean => {\n if (!typeId) {\n return false;\n }\n let found = false;\n outerLoop: for (let i = 0; i < this.typeCategories.length; i++) {\n for (let j = 0; j < this.typeCategories[i].types.length; j++) {\n const loopTypeId = this.typeCategories[i].types[j].id;\n if (loopTypeId === typeId) {\n this.selectedCategory = this.typeCategories[i];\n this.selectedType = this.typeCategories[i].types[j];\n found = true;\n break outerLoop;\n }\n }\n }\n return found;\n };\n\n private getNameSuggestion = (selectedType: TypeData) => {\n // Type name can include whitespaces, we need to replace all whitespaces to avoid invalid suggestions:\n return selectedType.name.replace(/\\s/g, \"\");\n };\n\n private nameValueHandler = (): string => {\n if (this.nameModifiedByUser) {\n return this.nameEl.value;\n } else {\n return this.getNameSuggestion(this.selectedType);\n }\n };\n\n private descriptionValueHandler = () => {\n if (this.nameModifiedByUser) {\n return this.descriptionEl.value;\n } else {\n return this.selectedType.name;\n }\n };\n\n private onInputNameHandler = (e: CustomEvent<string>) => {\n const name = e.detail;\n if (!this.descriptionModifiedByUser) {\n // description should be equal to name, unless the description was already modified by the user.\n this.descriptionEl.value = name;\n }\n this.nameModifiedByUser = true;\n };\n\n private onBlurNameHandler = async () => {\n const result: string | undefined = await this.validateNameCallback(\n this.nameEl.value\n );\n this.validateNameHandler(result);\n };\n\n private onNameValueChangedHandler = async (e: CustomEvent<string>) => {\n const name = e.detail;\n const result: string | undefined = await this.validateNameCallback(name);\n this.validateNameHandler(result);\n };\n\n private onInputDescriptionHandler = (e: CustomEvent<string>) => {\n this.description = e.detail;\n this.descriptionModifiedByUser = true;\n };\n\n /**\n * If the parameter is undefined, is because the name is valid. Otherwise, if it receives a string, is because the name is not valid. The string is the error message to display.\n */\n private validateNameHandler = (result: string | undefined): void => {\n if (result !== undefined) {\n // the name is not valid. display message\n this.nameEl.validationMessage = result;\n this.nameEl.validationStatus = \"error\";\n this.nameIsValid = false;\n } else {\n // valid name\n this.nameEl.validationMessage = null;\n this.nameEl.validationStatus = \"indeterminate\";\n this.nameIsValid = true;\n }\n };\n\n private createCallbackHandler = async (): Promise<void> => {\n const data: NewObjectData = {\n typeId: this.selectedType?.id,\n name: this.nameEl.value,\n description: !this.descriptionModifiedByUser\n ? undefined\n : this.descriptionEl.value,\n moduleId: this.moduleFolderEl?.value?.id\n };\n const result = await this.createCallback(data);\n this.validateNameHandler(result);\n };\n\n private cancelCallbackHandler = async (): Promise<void> => {\n await this.cancelCallback();\n };\n\n private categoryOnSelectionChangedHandler = (\n selectionEvent: CustomEvent<SelectionChangedEvent>\n ): void => {\n const selection = selectionEvent.detail.items;\n if (selection.length > 0) {\n const selectedCategory = this.typeCategories[selection[0].index];\n if (selectedCategory) {\n this.selectedCategory = selectedCategory;\n if (selectedCategory.types.length > 0) {\n this.selectedType = selectedCategory.types[0];\n }\n }\n }\n };\n\n private typeOnSelectionChangedHandler = (\n selectionEvent: CustomEvent<SelectionChangedEvent>\n ) => {\n const selection = selectionEvent.detail.items;\n if (selection.length > 0) {\n const selected = selection[0];\n this.selectedType = this.selectedCategory.types[selected.index];\n }\n };\n\n // 10.LOCAL METHODS (RENDER) //\n\n // 11.RENDER() FUNCTION //\n\n render() {\n return (\n <Host class=\"gx-ide-component\">\n <div class=\"gx-ide-main-wrapper\">\n <gx-ide-container\n noContentPadding\n noContentGap\n slimmerFooter={config.gxIdeContainer.slimmerFooter}\n containerTitle={\n this.displayTitle ? this._componentLocale.componentName : null\n }\n noHeadingBorder\n >\n <main class=\"main\">\n <div class=\"categories-types-container\">\n <div class=\"categories\">\n {/* select a category listbox*/}\n {this.typeCategories.length > 0 ? (\n <gxg-list-box\n class=\"category\"\n single-selection\n noBorder\n borderEnd\n the-title={this._componentLocale.categorySelectionTitle}\n onSelectionChanged={\n this.categoryOnSelectionChangedHandler\n }\n ref={el =>\n (this.categoryListBox = el as HTMLGxgListBoxElement)\n }\n >\n {this.typeCategories.map(category => (\n <gxg-list-box-item\n key={category.id}\n value={category.id}\n icon={category.icon}\n part={`category-${category.id}`}\n selected={this.selectedCategory.id === category.id}\n >\n {category.name}\n </gxg-list-box-item>\n ))}\n </gxg-list-box>\n ) : null}\n </div>\n <div class=\"types\">\n {/* types listbox*/}\n {this.selectedCategory.types.length > 0 ? (\n <gxg-list-box\n class=\"types\"\n single-selection\n noBorder\n theTitle={\n this.selectedCategory.name\n ? `${this.selectedCategory.name} ${this._componentLocale.typeSelectionTitleSuffix}`\n : this._componentLocale.typeSelectionTitle\n }\n key={this.selectedCategory.id}\n onSelectionChanged={this.typeOnSelectionChangedHandler}\n ref={el =>\n (this.typeListBox = el as HTMLGxgListBoxElement)\n }\n >\n {this.selectedCategory.types.map(type => (\n <gxg-list-box-item\n key={`${this.selectedCategory.id}-${type.id}`}\n icon={type.icon}\n part={`type-${this.selectedCategory.id}-${type.id}`}\n selected={this.selectedType.id === type.id}\n >\n {type.name}\n </gxg-list-box-item>\n ))}\n </gxg-list-box>\n ) : (\n <p>No Categories to display</p>\n )}\n </div>\n </div>\n <div class=\"api-description\">\n {/* api description title*/}\n <gxg-title type=\"title-05\">\n {this.selectedType?.description}\n </gxg-title>\n <div class=\"form\">\n {/* selected type name */}\n <gxg-label labelPosition=\"start\">\n {this._componentLocale.objectName}\n </gxg-label>\n <gxg-form-text\n label-position=\"start\"\n placeholder=\"Name\"\n max-width=\"100%\"\n value={this.nameValueHandler()}\n toolTip={config.tooltip}\n ref={(el: HTMLGxgFormTextElement) =>\n (this.nameEl = el as HTMLGxgFormTextElement)\n }\n onInput={this.onInputNameHandler as any}\n onBlur={this.onBlurNameHandler}\n onValueChanged={this.onNameValueChangedHandler}\n debounce\n part=\"name\"\n display-validation-styles\n display-validation-message\n ></gxg-form-text>\n\n {/* description */}\n <gxg-label labelPosition=\"start\">\n {this._componentLocale.objectDescription}\n </gxg-label>\n <gxg-form-text\n label-position=\"start\"\n placeholder=\"Description\"\n max-width=\"100%\"\n value={this.descriptionValueHandler()}\n ref={(el: HTMLGxgFormTextElement) =>\n (this.descriptionEl = el as HTMLGxgFormTextElement)\n }\n onInput={this.onInputDescriptionHandler as any}\n part=\"description\"\n display-validation-styles\n display-validation-message\n ></gxg-form-text>\n\n {this.renderModuleFolder()}\n </div>\n </div>\n </main>\n\n {/* Footer*/}\n {/* cancel button*/}\n <gxg-button\n id=\"button-cancel\"\n slot=\"footer-end\"\n type=\"outlined\"\n onClick={this.cancelCallbackHandler}\n part=\"gxg-button gxg-button--cancel\"\n >\n {this._componentLocale.footer.btnCancel}\n </gxg-button>\n {/* create button*/}\n <gxg-button\n id=\"button-create\"\n slot=\"footer-end\"\n type=\"primary-text-only\"\n onClick={this.createCallbackHandler}\n disabled={!this.nameIsValid}\n part=\"gxg-button gxg-button--create\"\n >\n {this._componentLocale.footer.btnCreate}\n </gxg-button>\n </gx-ide-container>\n </div>\n <gxg-shortcuts\n src={this.shortcutsSrc}\n ref={(el: HTMLGxgShortcutsElement) =>\n (this.gxgShortcutsEl = el as HTMLGxgShortcutsElement)\n }\n ></gxg-shortcuts>\n </Host>\n );\n }\n}\n\nexport interface NewObjectData {\n typeId: string;\n name: string;\n description: string | undefined;\n moduleId: string;\n}\n\nexport type ValidateNameCallback = (\n name: string\n) => Promise<string | undefined>;\n\nexport type SelectModuleCallback = () => Promise<EntityData | undefined>;\n\nexport type CreateCallback = (\n data: NewObjectData\n) => Promise<string | undefined>;\n\nexport type CancelCallback = () => Promise<void>;\n\nexport type TypeCategoryData = {\n id: string;\n name: string;\n icon: string;\n types: TypeData[];\n};\n\nexport type TypeData = {\n id: string;\n name: string;\n icon: string;\n hasModule: boolean;\n hasFolder: boolean;\n description: string;\n};\n"],"version":3}
@@ -0,0 +1,109 @@
1
+ import { r as registerInstance, h, H as Host, g as getElement } from './index-f010c1e9.js';
2
+ import { L as Locale } from './locale-3c32f251.js';
3
+
4
+ const recentNewsCss = ":root{--ui-animaton-speed:0.2s}.gxg-title-01{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-01-font-weight);font-size:var(--ds-title-01-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-01--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-01-font-weight);font-size:var(--ds-title-01-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-02{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-02-font-weight);font-size:var(--ds-title-02-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-02--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-02-font-weight);font-size:var(--ds-title-02-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable);color:var(--color-on-primary)}.gxg-title-03{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-03-font-weight);font-size:var(--ds-title-03-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-03--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-03-font-weight);font-size:var(--ds-title-03-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-04{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-04-font-weight);font-size:var(--ds-title-04-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-04--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-04-font-weight);font-size:var(--ds-title-04-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-05{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-05-font-weight);font-size:var(--ds-title-05-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-05--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-05-font-weight);font-size:var(--ds-title-05-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-text{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable)}.gxg-text--negative{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-text--gray{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--dimmed)}.gxg-quote{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);font-style:italic}.gxg-quote--negative{color:var(--ds-base-font-color--negative)}.gxg-link{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block}.gxg-link:hover{color:var(--ds-base-font-color--link-hover)}.gxg-link:active{color:var(--ds-base-font-color--link-active)}.gxg-link-gray{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block;color:var(--ds-base-font-color--dimmed)}.gxg-link-gray:hover{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block;color:var(--ds-base-font-color--dimmed);filter:brightness(1.4)}.gxg-alert-error{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--error);display:inline-block}.gxg-alert-warning{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--warning);display:inline-block}.gxg-alert-success{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--success);display:inline-block}.gxg-tab--disabled{color:var(--color-primary-disabled);pointer-events:none}.gxg-tab--disabled[disabled]{color:var(--color-primary-disabled);pointer-events:none}.gxg-label{font-family:var(--ds-base-font-family-primary);font-weight:var(--gxg-label-font-weight);font-size:var(--gxg-label-font-size);color:var(--gxg-label-color);text-align:center;line-height:1.455em;display:flex;align-items:center}.gxg-label:hover{color:var(--color-primary-hover)}.gxg-label:focus{color:var(--color-primary-active)}.gxg-label:active{color:var(--color-primary-active)}.gxg-label[disabled]{color:var(--color-primary-disabled)}.gxg-label--negative{color:var(--color-on-primary)}.gxg-label--negative[disabled]{color:var(--color-on-disabled)}.gxg-scrollbar{}.gxg-scrollbar::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.gxg-scrollbar::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.gxg-scrollbar::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.gxg-scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.gxg-scrollbar::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}.gxi-hidden{display:none !important}.gxi-full-height{height:100%}.gxi-overflow-auto{overflow:auto}.gxi-display-flex{display:flex}.align-start{display:flex;align-items:start}.align-center{display:flex;align-items:center}.align-end{display:flex;align-items:end}.overflow-auto{overflow:auto}.justify-start{display:flex;justify-content:start}.justify-center{display:flex;justify-content:center}.justify-end{display:flex;justify-content:end}.grid{display:grid;grid-row-gap:var(--gx-ide-grid-row-gap);grid-column-gap:var(--gx-ide-grid-column-gap);grid-template-rows:auto}ch-grid-cell{display:flex}ch-grid{overflow:auto;height:100%}ch-grid-column{z-index:99;border-bottom:1px solid var(--mer-color__neutral-gray--800)}ch-grid-column:first-child{padding-inline-start:var(--gx-ide-container__padding) !important}ch-grid-column:last-child{padding-inline-end:var(--gx-ide-container__padding) !important}ch-grid-cell{--mer-spacing--xs:var(--gx-ide-container__padding)}.layout{display:grid;gap:var(--mer-spacing--lg);box-sizing:border-box}.layout--two-cols{grid-template-columns:1fr 1fr}.layout--space-above{padding-block-start:var(--mer-spacing--lg)}gxg-tabs{box-shadow:none}:host(.gx-ide-component){height:100% !important;display:flex !important;flex-direction:column !important}:host(:focus-within) gx-ide-top-bar::part(wrapper){background-color:var(--color-secondary-enabled)}.gx-ide-main-wrapper{color:var(--gx-ide-component-text-color);font-weight:var(--mer-font__weight--regular);font-size:var(--mer-font__size--xs);font-family:var(--mer-font-family--primary);height:100%;background-color:var(--gx-ide-component-background-color);display:flex;flex-direction:column;flex-grow:1;box-sizing:border-box}.gx-ide-main{flex-grow:1;overflow-y:auto;}.gx-ide-main::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.gx-ide-main::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.gx-ide-main::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.gx-ide-main::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.gx-ide-main::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}.gx-ide-overflow{overflow-y:auto;}.gx-ide-overflow::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.gx-ide-overflow::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.gx-ide-overflow::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.gx-ide-overflow::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.gx-ide-overflow::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}.tree-container{display:flex;height:100%;width:100%;box-sizing:border-box}:host{display:block;box-shadow:none;height:100%;overflow:hidden;padding-bottom:2px;box-sizing:border-box}.news-container{display:flex;flex-direction:column;gap:var(--gx-ide-articles-gap)}.news-container p:first-child{margin-top:0}.news-container p:last-child{margin-bottom:0}gxg-card.section{height:100% !important;overflow:auto;border-bottom:2px solid var(--gray-00)}gxg-ide-loader::part(loader-wrapper){border-radius:var(--gxg-card-section_border-radius);overflow:hidden}.gxg-card-container{height:100%;overflow:auto}.gx-ide-message{height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:var(--mer-spacing--sm)}.gx-ide-message--hidden{display:none}gx-ide-title{max-width:250px}.news-article{transition:200ms opacity;opacity:0}.news-article.visible{opacity:1}";
5
+
6
+ const GxIdeRecentNews = class {
7
+ constructor(hostRef) {
8
+ registerInstance(this, hostRef);
9
+ this.newsRendered = false;
10
+ this.setTimeOutNewsDelay = 75;
11
+ // 7.LISTENERS //
12
+ // 8.PUBLIC METHODS API //
13
+ // 9.LOCAL METHODS //
14
+ this.evaluateNewsDisplay = () => {
15
+ if (!this.newsRendered &&
16
+ this.news.length > 0 &&
17
+ this.newsContainerEl !== undefined) {
18
+ this.displayNews();
19
+ this.newsRendered = true;
20
+ }
21
+ };
22
+ this.displayNews = () => {
23
+ if (this.newsContainerEl !== undefined) {
24
+ const news = Array.from(this.newsContainerEl.querySelectorAll("gxg-card"));
25
+ news.forEach(news => {
26
+ setTimeout(() => {
27
+ news.classList.add("visible");
28
+ }, this.setTimeOutNewsDelay);
29
+ this.setTimeOutNewsDelay += 75;
30
+ });
31
+ }
32
+ };
33
+ this.attachLoaderEvents = () => {
34
+ this.loaderEl.addEventListener("loaderFinished", () => {
35
+ if (this.news.length === 0) {
36
+ this.newsLoadFailed = true;
37
+ }
38
+ else {
39
+ this.newsLoadFailed = false;
40
+ }
41
+ });
42
+ };
43
+ this.getNews = async () => {
44
+ this.loaderEl.show = true;
45
+ if (this.getNewsCallback) {
46
+ const newsResult = await this.getNewsCallback();
47
+ this.loaderEl.show = false;
48
+ if (newsResult && newsResult.length > 0) {
49
+ this.news = newsResult;
50
+ this.newsLoadFailed = false;
51
+ }
52
+ else {
53
+ this.newsLoadFailed = true;
54
+ }
55
+ }
56
+ };
57
+ this.openNewsHandler = (newsId) => async () => {
58
+ if (this.openNewsCallback) {
59
+ await this.openNewsCallback(newsId);
60
+ }
61
+ };
62
+ // 9.LOCAL METHODS -> RENDERS //
63
+ this.renderNews = (news) => {
64
+ if (news.id && news.title) {
65
+ return (h("gxg-card", { id: news.id, key: news.id, cardType: "article", cardTitle: news.title, icon: "gx-test/test-results", iconColor: "auto", actionable: true, onClick: this.openNewsHandler(news.id), titleSemibold: true, noHeaderBorder: true, class: "news-article" }, news.body ? h("p", null, news.body) : null));
66
+ }
67
+ return null;
68
+ };
69
+ this.news = [];
70
+ this.newsLoadFailed = false;
71
+ this.getNewsCallback = undefined;
72
+ this.openNewsCallback = undefined;
73
+ }
74
+ watchNewsHandler() {
75
+ this.displayNews();
76
+ }
77
+ // 5.EVENTS (EMIT) //
78
+ // 6.COMPONENT LIFECYCLE METHODS //
79
+ async componentWillLoad() {
80
+ this._componentLocale = await Locale.getComponentStrings(this.el);
81
+ }
82
+ componentDidLoad() {
83
+ this.getNews();
84
+ this.attachLoaderEvents();
85
+ }
86
+ componentDidRender() {
87
+ this.evaluateNewsDisplay();
88
+ }
89
+ // 10.RENDER() FUNCTION //
90
+ render() {
91
+ var _a;
92
+ return (h(Host, null, h("gxg-card", { class: "section", cardType: "section", cardTitle: this._componentLocale.recentNews.title }, this.news.length > 0 ? (h("div", { class: "news-container", ref: el => (this.newsContainerEl = el) }, (_a = this.news) === null || _a === void 0 ? void 0 : _a.map(singleNews => {
93
+ return this.renderNews(singleNews);
94
+ }))) : (h("div", { class: {
95
+ "gx-ide-message": true,
96
+ "gx-ide-message--hidden": !this.newsLoadFailed
97
+ } }, h("gx-ide-title", { alignment: "center" }, this._componentLocale.recentNews.newsNotFetched), h("gxg-button", { onClick: this.getNews }, this._componentLocale.recentNews.tryAgainButtonLabel), h("gxg-text", { type: "text-link", href: "https://www.genexus.com/en/news", target: "_blank" }, this._componentLocale.recentNews.readThemOnline)))), h("gxg-ide-loader", { abortTime: 8000, container: this.el, loaderTitle: this._componentLocale.loader.title, description: "Hang on please", ref: el => (this.loaderEl = el) })));
98
+ }
99
+ static get assetsDirs() { return ["gx-ide-assets/recent-news"]; }
100
+ get el() { return getElement(this); }
101
+ static get watchers() { return {
102
+ "news": ["watchNewsHandler"]
103
+ }; }
104
+ };
105
+ GxIdeRecentNews.style = recentNewsCss;
106
+
107
+ export { GxIdeRecentNews as gx_ide_recent_news };
108
+
109
+ //# sourceMappingURL=gx-ide-recent-news.entry.js.map
@@ -0,0 +1 @@
1
+ {"file":"gx-ide-recent-news.entry.js","mappings":"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","names":[],"sources":["src/components/start-page/recent-news.scss?tag=gx-ide-recent-news&encapsulation=shadow","src/components/start-page/recent-news.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n\n:host {\n display: block;\n box-shadow: none;\n height: 100%;\n overflow: hidden;\n padding-bottom: 2px;\n box-sizing: border-box;\n}\n.news-container {\n display: flex;\n flex-direction: column;\n gap: var(--gx-ide-articles-gap);\n p:first-child {\n margin-top: 0;\n }\n p:last-child {\n margin-bottom: 0;\n }\n}\ngxg-card.section {\n height: 100% !important;\n overflow: auto;\n border-bottom: 2px solid var(--gray-00);\n}\ngxg-ide-loader::part(loader-wrapper) {\n border-radius: var(--gxg-card-section_border-radius);\n overflow: hidden;\n}\n.gxg-card-container {\n height: 100%;\n overflow: auto;\n}\n.gx-ide-message {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n gap: var(--mer-spacing--sm);\n\n &--hidden {\n display: none;\n }\n}\ngx-ide-title {\n max-width: 250px;\n}\n.news-article {\n transition: 200ms opacity;\n opacity: 0;\n\n &.visible {\n opacity: 1;\n }\n}\n","/* STENCIL IMPORTS */\nimport { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { NewsData, GetNewsCallback, OpenNewsCallback } from \"./start-page\";\n\n@Component({\n tag: \"gx-ide-recent-news\",\n styleUrl: \"recent-news.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/recent-news\"]\n})\nexport class GxIdeRecentNews {\n /*\nINDEX:\n1.OWN PROPERTIES \n2.REFERENCE TO ELEMENTS\n3.STATE() VARIABLES\n4.PUBLIC PROPERTY API | WATCH'S\n5.EVENTS (EMIT)\n6.COMPONENT LIFECYCLE METHODS\n7.LISTENERS\n8.PUBLIC METHODS API\n9.LOCAL METHODS\n10.RENDER() FUNCTION\n*/\n\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeRecentNewsElement;\n private loaderEl!: HTMLGxgIdeLoaderElement;\n private newsContainerEl: HTMLDivElement;\n private newsRendered = false;\n private setTimeOutNewsDelay = 75;\n\n // 3.STATE() VARIABLES //\n\n /**\n * The list of news\n */\n @State() news: NewsData[] = [];\n @Watch(\"news\")\n watchNewsHandler() {\n this.displayNews();\n }\n\n /**\n * True if news couldn't be loaded\n */\n @State() newsLoadFailed = false;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * Callback invoked to load the news feed (right panel \"Recent News\").\n */\n @Prop() readonly getNewsCallback: GetNewsCallback;\n\n /**\n * Callback invoked to open a news article.\n */\n @Prop() readonly openNewsCallback: OpenNewsCallback;\n\n // 5.EVENTS (EMIT) //\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidLoad() {\n this.getNews();\n this.attachLoaderEvents();\n }\n\n componentDidRender() {\n this.evaluateNewsDisplay();\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n // 9.LOCAL METHODS //\n\n private evaluateNewsDisplay = () => {\n if (\n !this.newsRendered &&\n this.news.length > 0 &&\n this.newsContainerEl !== undefined\n ) {\n this.displayNews();\n this.newsRendered = true;\n }\n };\n\n private displayNews = () => {\n if (this.newsContainerEl !== undefined) {\n const news = Array.from(\n this.newsContainerEl.querySelectorAll(\"gxg-card\")\n );\n news.forEach(news => {\n setTimeout(() => {\n news.classList.add(\"visible\");\n }, this.setTimeOutNewsDelay);\n this.setTimeOutNewsDelay += 75;\n });\n }\n };\n\n private attachLoaderEvents = () => {\n this.loaderEl.addEventListener(\"loaderFinished\", () => {\n if (this.news.length === 0) {\n this.newsLoadFailed = true;\n } else {\n this.newsLoadFailed = false;\n }\n });\n };\n\n private getNews = async () => {\n this.loaderEl.show = true;\n if (this.getNewsCallback) {\n const newsResult = await this.getNewsCallback();\n this.loaderEl.show = false;\n if (newsResult && newsResult.length > 0) {\n this.news = newsResult;\n this.newsLoadFailed = false;\n } else {\n this.newsLoadFailed = true;\n }\n }\n };\n\n private openNewsHandler = (newsId: string) => async () => {\n if (this.openNewsCallback) {\n await this.openNewsCallback(newsId);\n }\n };\n\n // 9.LOCAL METHODS -> RENDERS //\n\n private renderNews = (news: NewsData): HTMLGxgCardElement | null => {\n if (news.id && news.title) {\n return (\n <gxg-card\n id={news.id}\n key={news.id}\n cardType=\"article\"\n cardTitle={news.title}\n icon=\"gx-test/test-results\"\n iconColor=\"auto\"\n actionable\n onClick={this.openNewsHandler(news.id)}\n titleSemibold\n noHeaderBorder\n class=\"news-article\"\n >\n {news.body ? <p>{news.body}</p> : null}\n </gxg-card>\n );\n }\n return null;\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <Host>\n <gxg-card\n class=\"section\"\n cardType=\"section\"\n cardTitle={this._componentLocale.recentNews.title}\n >\n {this.news.length > 0 ? (\n <div\n class=\"news-container\"\n ref={el => (this.newsContainerEl = el as HTMLDivElement)}\n >\n {this.news?.map(singleNews => {\n return this.renderNews(singleNews);\n })}\n </div>\n ) : (\n <div\n class={{\n \"gx-ide-message\": true,\n \"gx-ide-message--hidden\": !this.newsLoadFailed\n }}\n >\n <gx-ide-title alignment=\"center\">\n {this._componentLocale.recentNews.newsNotFetched}\n </gx-ide-title>\n <gxg-button onClick={this.getNews}>\n {this._componentLocale.recentNews.tryAgainButtonLabel}\n </gxg-button>\n <gxg-text\n type=\"text-link\"\n href=\"https://www.genexus.com/en/news\"\n target=\"_blank\"\n >\n {this._componentLocale.recentNews.readThemOnline}\n </gxg-text>\n </div>\n )}\n </gxg-card>\n <gxg-ide-loader\n abortTime={8000}\n container={this.el}\n loaderTitle={this._componentLocale.loader.title}\n description=\"Hang on please\"\n ref={el => (this.loaderEl = el as HTMLGxgIdeLoaderElement)}\n ></gxg-ide-loader>\n </Host>\n );\n }\n}\n"],"version":3}
@@ -283,6 +283,7 @@ const GxgListBox = class {
283
283
  this.borderEnd = false;
284
284
  this.borderBottom = false;
285
285
  this.borderStart = false;
286
+ this.initialScrollToSelected = false;
286
287
  this.selectedItems = [];
287
288
  this.checkedItems = [];
288
289
  this.hideKeyboardSuggestions = true;
@@ -311,6 +312,13 @@ const GxgListBox = class {
311
312
  });
312
313
  return selectedItemsInformation;
313
314
  }
315
+ async scrollToSelected() {
316
+ const selectedItems = this.getSelectedItemsFunc();
317
+ if (selectedItems.length) {
318
+ const firstSelectedItem = selectedItems[0];
319
+ firstSelectedItem.scrollIntoView();
320
+ }
321
+ }
314
322
  componentDidRender() {
315
323
  if (this.theTitle) {
316
324
  this.headerHeight = this.header.clientHeight;
@@ -318,6 +326,7 @@ const GxgListBox = class {
318
326
  }
319
327
  componentDidLoad() {
320
328
  //this.setInitialActive();
329
+ this.initialScrollToSelected && this.scrollToSelected();
321
330
  }
322
331
  checkboxClickedHandler() {
323
332
  this.containerEl.focus();