@genexus/genexus-ide-ui 3.0.1 → 3.1.0

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 (100) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/gx-ide-file-item.cjs.entry.js +21 -2
  3. package/dist/cjs/gx-ide-file-item.cjs.entry.js.map +1 -1
  4. package/dist/cjs/gx-ide-file-uploader.cjs.entry.js +11 -8
  5. package/dist/cjs/gx-ide-file-uploader.cjs.entry.js.map +1 -1
  6. package/dist/cjs/gx-ide-launchpad.cjs.entry.js +4 -16
  7. package/dist/cjs/gx-ide-launchpad.cjs.entry.js.map +1 -1
  8. package/dist/cjs/gx-ide-multi-select.cjs.entry.js +113 -0
  9. package/dist/cjs/gx-ide-multi-select.cjs.entry.js.map +1 -0
  10. package/dist/cjs/gx-ide-search.cjs.entry.js +171 -0
  11. package/dist/cjs/gx-ide-search.cjs.entry.js.map +1 -0
  12. package/dist/cjs/gx-ide-ww-files.cjs.entry.js +4 -9
  13. package/dist/cjs/gx-ide-ww-files.cjs.entry.js.map +1 -1
  14. package/dist/cjs/loader.cjs.js +1 -1
  15. package/dist/collection/collection-manifest.json +2 -0
  16. package/dist/collection/components/_helpers/multi-select/gx-ide-multi-select.css +193 -0
  17. package/dist/collection/components/_helpers/multi-select/gx-ide-multi-select.js +209 -0
  18. package/dist/collection/components/_helpers/multi-select/gx-ide-multi-select.js.map +1 -0
  19. package/dist/collection/components/file-uploader/file-item/file-item.css +23 -28
  20. package/dist/collection/components/file-uploader/file-item/file-item.js +37 -1
  21. package/dist/collection/components/file-uploader/file-item/file-item.js.map +1 -1
  22. package/dist/collection/components/file-uploader/file-uploader.css +11 -22
  23. package/dist/collection/components/file-uploader/file-uploader.js +10 -7
  24. package/dist/collection/components/file-uploader/file-uploader.js.map +1 -1
  25. package/dist/collection/components/file-uploader/gx-ide-assets/file-uploader/langs/file-uploader.lang.en.json +7 -3
  26. package/dist/collection/components/file-uploader/gx-ide-assets/file-uploader/langs/file-uploader.lang.ja.json +7 -3
  27. package/dist/collection/components/file-uploader/gx-ide-assets/file-uploader/langs/file-uploader.lang.zh.json +8 -3
  28. package/dist/collection/components/launchpad/root/gx-ide-assets/launchpad/shortcuts.json +1 -26
  29. package/dist/collection/components/launchpad/root/launchpad.js +5 -42
  30. package/dist/collection/components/launchpad/root/launchpad.js.map +1 -1
  31. package/dist/collection/components/search/gx-ide-assets/search/langs/search.lang.en.json +37 -0
  32. package/dist/collection/components/search/gx-ide-assets/search/langs/search.lang.ja.json +37 -0
  33. package/dist/collection/components/search/gx-ide-assets/search/langs/search.lang.zh.json +37 -0
  34. package/dist/collection/components/search/search.css +44 -0
  35. package/dist/collection/components/search/search.js +275 -0
  36. package/dist/collection/components/search/search.js.map +1 -0
  37. package/dist/collection/components/ww-files/ww-files.js +4 -9
  38. package/dist/collection/components/ww-files/ww-files.js.map +1 -1
  39. package/dist/collection/testing/locale.e2e.js +4 -1
  40. package/dist/collection/testing/locale.e2e.js.map +1 -1
  41. package/dist/components/file-item.js +22 -2
  42. package/dist/components/file-item.js.map +1 -1
  43. package/dist/components/gx-ide-file-uploader.js +11 -8
  44. package/dist/components/gx-ide-file-uploader.js.map +1 -1
  45. package/dist/components/gx-ide-launchpad.js +6 -19
  46. package/dist/components/gx-ide-launchpad.js.map +1 -1
  47. package/dist/components/gx-ide-multi-select.d.ts +11 -0
  48. package/dist/components/gx-ide-multi-select.js +132 -0
  49. package/dist/components/gx-ide-multi-select.js.map +1 -0
  50. package/dist/components/gx-ide-search.d.ts +11 -0
  51. package/dist/components/gx-ide-search.js +206 -0
  52. package/dist/components/gx-ide-search.js.map +1 -0
  53. package/dist/components/gx-ide-ww-files.js +4 -9
  54. package/dist/components/gx-ide-ww-files.js.map +1 -1
  55. package/dist/esm/genexus-ide-ui.js +1 -1
  56. package/dist/esm/gx-ide-file-item.entry.js +21 -2
  57. package/dist/esm/gx-ide-file-item.entry.js.map +1 -1
  58. package/dist/esm/gx-ide-file-uploader.entry.js +11 -8
  59. package/dist/esm/gx-ide-file-uploader.entry.js.map +1 -1
  60. package/dist/esm/gx-ide-launchpad.entry.js +5 -17
  61. package/dist/esm/gx-ide-launchpad.entry.js.map +1 -1
  62. package/dist/esm/gx-ide-multi-select.entry.js +109 -0
  63. package/dist/esm/gx-ide-multi-select.entry.js.map +1 -0
  64. package/dist/esm/gx-ide-search.entry.js +167 -0
  65. package/dist/esm/gx-ide-search.entry.js.map +1 -0
  66. package/dist/esm/gx-ide-ww-files.entry.js +4 -9
  67. package/dist/esm/gx-ide-ww-files.entry.js.map +1 -1
  68. package/dist/esm/loader.js +1 -1
  69. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  70. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  71. package/dist/genexus-ide-ui/gx-ide-assets/file-uploader/langs/file-uploader.lang.en.json +7 -3
  72. package/dist/genexus-ide-ui/gx-ide-assets/file-uploader/langs/file-uploader.lang.ja.json +7 -3
  73. package/dist/genexus-ide-ui/gx-ide-assets/file-uploader/langs/file-uploader.lang.zh.json +8 -3
  74. package/dist/genexus-ide-ui/gx-ide-assets/launchpad/shortcuts.json +1 -26
  75. package/dist/genexus-ide-ui/gx-ide-assets/search/langs/search.lang.en.json +37 -0
  76. package/dist/genexus-ide-ui/gx-ide-assets/search/langs/search.lang.ja.json +37 -0
  77. package/dist/genexus-ide-ui/gx-ide-assets/search/langs/search.lang.zh.json +37 -0
  78. package/dist/genexus-ide-ui/p-0745a565.entry.js +152 -0
  79. package/dist/genexus-ide-ui/p-0745a565.entry.js.map +1 -0
  80. package/dist/genexus-ide-ui/{p-6246204f.entry.js → p-25e749c7.entry.js} +44 -57
  81. package/dist/genexus-ide-ui/p-25e749c7.entry.js.map +1 -0
  82. package/dist/genexus-ide-ui/{p-60db2f02.entry.js → p-7bdeae77.entry.js} +106 -108
  83. package/dist/genexus-ide-ui/p-7bdeae77.entry.js.map +1 -0
  84. package/dist/genexus-ide-ui/p-8b5c826b.entry.js +212 -0
  85. package/dist/genexus-ide-ui/p-8b5c826b.entry.js.map +1 -0
  86. package/dist/genexus-ide-ui/p-c460c9e7.entry.js +187 -0
  87. package/dist/genexus-ide-ui/p-c460c9e7.entry.js.map +1 -0
  88. package/dist/genexus-ide-ui/{p-aad714a5.entry.js → p-e2b88bea.entry.js} +70 -67
  89. package/dist/genexus-ide-ui/p-e2b88bea.entry.js.map +1 -0
  90. package/dist/types/components/_helpers/multi-select/gx-ide-multi-select.d.ts +29 -0
  91. package/dist/types/components/file-uploader/file-item/file-item.d.ts +2 -0
  92. package/dist/types/components/launchpad/root/launchpad.d.ts +0 -4
  93. package/dist/types/components/search/search.d.ts +59 -0
  94. package/dist/types/components.d.ts +121 -4
  95. package/package.json +1 -1
  96. package/dist/genexus-ide-ui/p-60db2f02.entry.js.map +0 -1
  97. package/dist/genexus-ide-ui/p-6246204f.entry.js.map +0 -1
  98. package/dist/genexus-ide-ui/p-aad714a5.entry.js.map +0 -1
  99. package/dist/genexus-ide-ui/p-f3c3e830.entry.js +0 -163
  100. package/dist/genexus-ide-ui/p-f3c3e830.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"file":"gx-ide-launchpad.js","mappings":"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","names":["GxIdeLaunchpad"],"sources":["src/components/launchpad/root/launchpad.scss?tag=gx-ide-launchpad&encapsulation=shadow","src/components/launchpad/root/launchpad.tsx"],"sourcesContent":["@use \"../../../global/temporary-mercury-overrides/tab.scss\" as *;\n\n:host {\n display: grid;\n block-size: 100%;\n overflow: auto;\n grid-template-rows: 1fr;\n}\n\n.web-apps,\n.native-apps,\n.apis {\n padding-block-start: 16px;\n overflow: auto;\n block-size: 100%;\n}\n\n// WA: Add scrollbar styling for ch-tab-render until Mercury provides proper support\n.tab::part(page) {\n scrollbar-width: thin;\n}\n\n// WA: Apply spacing body to tab slots, instad of the whole component.\n// TODO: Resolve this on Mercury, with some addition class maybe.\n.spacing-body,\n:host(.spacing-body) {\n > ch-tab-render > .tab-slot-spacing-body {\n padding-block: var(--spacing-body-block-start) var(--spacing-body-block-end);\n padding-inline: var(--spacing-body-inline-start)\n var(--spacing-body-inline-end);\n }\n}\n","import {\n Component,\n Host,\n Prop,\n Element,\n State,\n getAssetPath,\n Method,\n h,\n Watch,\n Event,\n EventEmitter\n} from \"@stencil/core\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\nimport { TabModel } from \"@genexus/chameleon-controls-library\";\nimport { Locale } from \"../../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/tab\",\n \"utils/form--full\",\n \"utils/layout\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\n\nconst MAIN_SECTION_CLASSES: string = \"main\";\nconst WEB_APPS_TAB_SELECTOR: string = \"web-apps\";\nconst NATIVE_APPS_TAB_SELECTOR: string = \"native-apps\";\nconst APIS_TAB_SELECTOR: string = \"apis\";\n\n// Temporary WA (Read WA in launchpad.scss)\nconst TAB_SLOT_SPACING_BODY_SELECTOR: string = \"tab-slot-spacing-body\";\n\n@Component({\n tag: \"gx-ide-launchpad\",\n styleUrl: \"launchpad.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/launchpad\"]\n})\nexport class GxIdeLaunchpad {\n #chShortcutsEl: HTMLChShortcutsElement;\n #shortcutsSrc = getAssetPath(`./gx-ide-assets/launchpad/shortcuts.json`);\n #componentLocale: any;\n\n @Element() el: HTMLGxIdeLaunchpadElement;\n\n /**\n * JSON data containing section structure\n */\n @Prop() data: string | undefined = undefined;\n\n /**\n * Determines if the component runs in standalone mode\n */\n @Prop() isStandalone: boolean = true;\n\n /**\n * Array of sections for tabs\n */\n @State() sections: Array<any> = [];\n\n /**\n * Tab model for ch-tab-render\n */\n @State() tabModel: TabModel = [];\n\n /**\n * Event emitted when an object is selected for execution\n */\n @Event() objectSelected: EventEmitter<{\n key: { type: string; id: string } | string;\n }>;\n\n /**\n * Event emitted when copying to clipboard\n */\n @Event() copyToClipboard: EventEmitter<{ url: string }>;\n\n /**\n * Event emitted when opening app store\n */\n @Event() openOnTheAppStore: EventEmitter<{ url: string }>;\n\n @Watch(\"data\")\n watchDataHandler(newValue: string | undefined) {\n if (newValue !== undefined) {\n this.organizeData();\n }\n }\n\n async componentWillLoad() {\n try {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n } catch (error) {\n console.error(\"Error loading locale:\", error);\n this.#componentLocale = {\n tabs: {\n webApps: \"WEB APPS\",\n nativeApps: \"NATIVE APPS\",\n apis: \"APIS\"\n }\n };\n }\n\n if (this.data) {\n this.organizeData();\n }\n }\n\n componentDidLoad() {}\n\n /**\n * Suspends or reactivates the shortcuts\n */\n @Method()\n async suspendShortcuts(suspendShortcuts: boolean) {\n if (suspendShortcuts) {\n this.#chShortcutsEl.suspend = true;\n } else {\n this.#chShortcutsEl.suspend = false;\n }\n }\n\n /**\n * Organizes received data and builds tab model\n */\n private organizeData(): void {\n if (this.data) {\n try {\n const parsedData =\n typeof this.data === \"string\" ? JSON.parse(this.data) : this.data;\n this.sections = parsedData.sections || [];\n this.buildTabModel();\n } catch (error) {\n console.error(\"Error parsing launchpad data:\", error);\n this.sections = [];\n this.tabModel = [];\n }\n }\n }\n\n /**\n * Builds tab model based on sections\n */\n private buildTabModel(): void {\n if (this.sections && this.sections.length > 0) {\n this.tabModel = this.sections.map(section => ({\n id: section.id,\n name: this.getLocalizedTabName(section.id)\n }));\n }\n }\n\n /**\n * Gets localized tab name based on section ID\n */\n private getLocalizedTabName(sectionId: string): string {\n const tabNames = this.#componentLocale?.tabs || {};\n\n switch (sectionId) {\n case \"web-apps\":\n return tabNames.webApps || \"WEB APPS\";\n case \"native-apps\":\n return tabNames.nativeApps || \"NATIVE APPS\";\n case \"apis\":\n return tabNames.apis || \"APIS\";\n default:\n return sectionId.toUpperCase().replace(/-/g, \" \");\n }\n }\n\n /**\n * Handles object selection from subcomponents\n */\n private handleObjectSelection(event: any) {\n let key = event.detail.key;\n\n // Convert string format \"type|id\" to object format\n if (typeof key === \"string\" && key.includes(\"|\")) {\n const parts = key.split(\"|\");\n if (parts.length === 2) {\n key = {\n type: parts[0],\n id: parts[1]\n };\n }\n }\n\n this.objectSelected.emit({ key });\n }\n\n /**\n * Handles copy to clipboard from subcomponents\n */\n private handleCopyToClipboard(event: any) {\n this.copyToClipboard.emit({ url: event.detail.url });\n }\n\n /**\n * Handles open app store from subcomponents\n */\n private handleOpenAppStore(event: any) {\n this.openOnTheAppStore.emit({ url: event.detail.url });\n }\n\n render() {\n if (!this.data || !this.sections || this.sections.length === 0) {\n return null;\n }\n\n return (\n <Host>\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\n <ch-tab-render\n class={{\n scrollable: true,\n tab: true,\n [MAIN_SECTION_CLASSES]: true\n }}\n tabListPosition=\"block-start\"\n model={this.tabModel}\n selectedId={WEB_APPS_TAB_SELECTOR}\n overflow=\"auto\"\n contain=\"size\"\n >\n <div\n slot={WEB_APPS_TAB_SELECTOR}\n class={{ \"web-apps\": true, [TAB_SLOT_SPACING_BODY_SELECTOR]: true }}\n part=\"tab-button-web-apps\"\n >\n <gx-ide-launchpad-web-apps\n objects={\n this.sections.find(s => s.id === \"web-apps\")?.objects || []\n }\n {...({\n onObjectSelected: (event: any) =>\n this.handleObjectSelection(event)\n } as any)}\n {...({\n onCopyToClipboard: (event: any) =>\n this.handleCopyToClipboard(event)\n } as any)}\n />\n </div>\n\n <div\n slot={NATIVE_APPS_TAB_SELECTOR}\n class={{\n \"native-apps\": true,\n [TAB_SLOT_SPACING_BODY_SELECTOR]: true\n }}\n part=\"tab-button-native-apps\"\n >\n <gx-ide-launchpad-native-apps\n objects={\n this.sections.find(s => s.id === \"native-apps\")?.objects || []\n }\n {...({\n onObjectSelected: (event: any) =>\n this.handleObjectSelection(event)\n } as any)}\n {...({\n onCopyToClipboard: (event: any) =>\n this.handleCopyToClipboard(event)\n } as any)}\n {...({\n onOpenOnTheAppStore: (event: any) =>\n this.handleOpenAppStore(event)\n } as any)}\n />\n </div>\n\n <div\n slot={APIS_TAB_SELECTOR}\n class={{ apis: true, [TAB_SLOT_SPACING_BODY_SELECTOR]: true }}\n part=\"tab-button-apis\"\n >\n <gx-ide-launchpad-apis\n apis={this.sections.find(s => s.id === \"apis\")?.apis || []}\n {...({\n onObjectSelected: (event: any) =>\n this.handleObjectSelection(event)\n } as any)}\n {...({\n onCopyToClipboard: (event: any) =>\n this.handleCopyToClipboard(event)\n } as any)}\n />\n </div>\n </ch-tab-render>\n </Host>\n );\n }\n}\n"],"version":3}
1
+ {"file":"gx-ide-launchpad.js","mappings":"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","names":["GxIdeLaunchpad"],"sources":["src/components/launchpad/root/launchpad.scss?tag=gx-ide-launchpad&encapsulation=shadow","src/components/launchpad/root/launchpad.tsx"],"sourcesContent":["@use \"../../../global/temporary-mercury-overrides/tab.scss\" as *;\n\n:host {\n display: grid;\n block-size: 100%;\n overflow: auto;\n grid-template-rows: 1fr;\n}\n\n.web-apps,\n.native-apps,\n.apis {\n padding-block-start: 16px;\n overflow: auto;\n block-size: 100%;\n}\n\n// WA: Add scrollbar styling for ch-tab-render until Mercury provides proper support\n.tab::part(page) {\n scrollbar-width: thin;\n}\n\n// WA: Apply spacing body to tab slots, instad of the whole component.\n// TODO: Resolve this on Mercury, with some addition class maybe.\n.spacing-body,\n:host(.spacing-body) {\n > ch-tab-render > .tab-slot-spacing-body {\n padding-block: var(--spacing-body-block-start) var(--spacing-body-block-end);\n padding-inline: var(--spacing-body-inline-start)\n var(--spacing-body-inline-end);\n }\n}\n","import {\n Component,\n Host,\n Prop,\n Element,\n State,\n h,\n Watch,\n Event,\n EventEmitter\n} from \"@stencil/core\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\nimport { TabModel } from \"@genexus/chameleon-controls-library\";\nimport { Locale } from \"../../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/tab\",\n \"utils/form--full\",\n \"utils/layout\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\n\nconst MAIN_SECTION_CLASSES: string = \"main\";\nconst WEB_APPS_TAB_SELECTOR: string = \"web-apps\";\nconst NATIVE_APPS_TAB_SELECTOR: string = \"native-apps\";\nconst APIS_TAB_SELECTOR: string = \"apis\";\n\n// Temporary WA (Read WA in launchpad.scss)\nconst TAB_SLOT_SPACING_BODY_SELECTOR: string = \"tab-slot-spacing-body\";\n\n@Component({\n tag: \"gx-ide-launchpad\",\n styleUrl: \"launchpad.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/launchpad\"]\n})\nexport class GxIdeLaunchpad {\n #componentLocale: any;\n\n @Element() el: HTMLGxIdeLaunchpadElement;\n\n /**\n * JSON data containing section structure\n */\n @Prop() data: string | undefined = undefined;\n\n /**\n * Determines if the component runs in standalone mode\n */\n @Prop() isStandalone: boolean = true;\n\n /**\n * Array of sections for tabs\n */\n @State() sections: Array<any> = [];\n\n /**\n * Tab model for ch-tab-render\n */\n @State() tabModel: TabModel = [];\n\n /**\n * Event emitted when an object is selected for execution\n */\n @Event() objectSelected: EventEmitter<{\n key: { type: string; id: string } | string;\n }>;\n\n /**\n * Event emitted when copying to clipboard\n */\n @Event() copyToClipboard: EventEmitter<{ url: string }>;\n\n /**\n * Event emitted when opening app store\n */\n @Event() openOnTheAppStore: EventEmitter<{ url: string }>;\n\n @Watch(\"data\")\n watchDataHandler(newValue: string | undefined) {\n if (newValue !== undefined) {\n this.organizeData();\n }\n }\n\n async componentWillLoad() {\n try {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n } catch (error) {\n console.error(\"Error loading locale:\", error);\n this.#componentLocale = {\n tabs: {\n webApps: \"WEB APPS\",\n nativeApps: \"NATIVE APPS\",\n apis: \"APIS\"\n }\n };\n }\n\n if (this.data) {\n this.organizeData();\n }\n }\n\n componentDidLoad() {}\n\n /**\n * Organizes received data and builds tab model\n */\n private organizeData(): void {\n if (this.data) {\n try {\n const parsedData =\n typeof this.data === \"string\" ? JSON.parse(this.data) : this.data;\n this.sections = parsedData.sections || [];\n this.buildTabModel();\n } catch (error) {\n console.error(\"Error parsing launchpad data:\", error);\n this.sections = [];\n this.tabModel = [];\n }\n }\n }\n\n /**\n * Builds tab model based on sections\n */\n private buildTabModel(): void {\n if (this.sections && this.sections.length > 0) {\n this.tabModel = this.sections.map(section => ({\n id: section.id,\n name: this.getLocalizedTabName(section.id)\n }));\n }\n }\n\n /**\n * Gets localized tab name based on section ID\n */\n private getLocalizedTabName(sectionId: string): string {\n const tabNames = this.#componentLocale?.tabs || {};\n\n switch (sectionId) {\n case \"web-apps\":\n return tabNames.webApps || \"WEB APPS\";\n case \"native-apps\":\n return tabNames.nativeApps || \"NATIVE APPS\";\n case \"apis\":\n return tabNames.apis || \"APIS\";\n default:\n return sectionId.toUpperCase().replace(/-/g, \" \");\n }\n }\n\n /**\n * Handles object selection from subcomponents\n */\n private handleObjectSelection(event: any) {\n let key = event.detail.key;\n\n // Convert string format \"type|id\" to object format\n if (typeof key === \"string\" && key.includes(\"|\")) {\n const parts = key.split(\"|\");\n if (parts.length === 2) {\n key = {\n type: parts[0],\n id: parts[1]\n };\n }\n }\n\n this.objectSelected.emit({ key });\n }\n\n /**\n * Handles copy to clipboard from subcomponents\n */\n private handleCopyToClipboard(event: any) {\n this.copyToClipboard.emit({ url: event.detail.url });\n }\n\n /**\n * Handles open app store from subcomponents\n */\n private handleOpenAppStore(event: any) {\n this.openOnTheAppStore.emit({ url: event.detail.url });\n }\n\n render() {\n if (!this.data || !this.sections || this.sections.length === 0) {\n return null;\n }\n\n // TODO: Revisit re-enabling keyboard shortcuts 1, 2, 3 for switching launchpad tabs (Web Apps, Native Apps, APIs)\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n\n <ch-tab-render\n class={{\n scrollable: true,\n tab: true,\n [MAIN_SECTION_CLASSES]: true\n }}\n tabListPosition=\"block-start\"\n model={this.tabModel}\n selectedId={WEB_APPS_TAB_SELECTOR}\n overflow=\"auto\"\n contain=\"size\"\n >\n <div\n slot={WEB_APPS_TAB_SELECTOR}\n class={{ \"web-apps\": true, [TAB_SLOT_SPACING_BODY_SELECTOR]: true }}\n part=\"tab-button-web-apps\"\n >\n <gx-ide-launchpad-web-apps\n objects={\n this.sections.find(s => s.id === \"web-apps\")?.objects || []\n }\n {...({\n onObjectSelected: (event: any) =>\n this.handleObjectSelection(event)\n } as any)}\n {...({\n onCopyToClipboard: (event: any) =>\n this.handleCopyToClipboard(event)\n } as any)}\n />\n </div>\n\n <div\n slot={NATIVE_APPS_TAB_SELECTOR}\n class={{\n \"native-apps\": true,\n [TAB_SLOT_SPACING_BODY_SELECTOR]: true\n }}\n part=\"tab-button-native-apps\"\n >\n <gx-ide-launchpad-native-apps\n objects={\n this.sections.find(s => s.id === \"native-apps\")?.objects || []\n }\n {...({\n onObjectSelected: (event: any) =>\n this.handleObjectSelection(event)\n } as any)}\n {...({\n onCopyToClipboard: (event: any) =>\n this.handleCopyToClipboard(event)\n } as any)}\n {...({\n onOpenOnTheAppStore: (event: any) =>\n this.handleOpenAppStore(event)\n } as any)}\n />\n </div>\n\n <div\n slot={APIS_TAB_SELECTOR}\n class={{ apis: true, [TAB_SLOT_SPACING_BODY_SELECTOR]: true }}\n part=\"tab-button-apis\"\n >\n <gx-ide-launchpad-apis\n apis={this.sections.find(s => s.id === \"apis\")?.apis || []}\n {...({\n onObjectSelected: (event: any) =>\n this.handleObjectSelection(event)\n } as any)}\n {...({\n onCopyToClipboard: (event: any) =>\n this.handleCopyToClipboard(event)\n } as any)}\n />\n </div>\n </ch-tab-render>\n </Host>\n );\n }\n}\n"],"version":3}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface GxIdeMultiSelect extends Components.GxIdeMultiSelect, HTMLElement {}
4
+ export const GxIdeMultiSelect: {
5
+ prototype: GxIdeMultiSelect;
6
+ new (): GxIdeMultiSelect;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1,132 @@
1
+ import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
2
+ import { g as getIconPath } from './mer-animated-dots.js';
3
+ import 'lit';
4
+ import 'lit/directives/when.js';
5
+ import 'lit/directives/if-defined.js';
6
+
7
+ const gxIdeMultiSelectCss = ":host{display:grid;block-size:100%}.opacity-0{opacity:0}.gxi-hidden{display:none !important}.align-center{display:flex;align-items:center}.align-end{display:flex;align-items:end}.overflow-auto{overflow:auto}:host(.gx-ide-component){height:100% !important;display:flex !important;flex-direction:column !important}.gx-ide-main-wrapper{color:var(--gx-ide-component-text-color);font-weight:var(--font-style-regular);font-size:var(--font-size-body-m);font-family:var(--font-family-body);height:100%;display:flex;flex-direction:column;flex-grow:1;box-sizing:border-box}.buttons-container{display:flex;gap:var(--spacing-gap-m)}.giu-static-pill-icon-and-text,.giu-static-pill{background-color:var(--elevation-background-color, var(--color-accent-surface-elevation-1));padding-inline:var(--spacing-padding-m);color:var(--color-text-neutral-default);font-size:var(--font-size-body-s);line-height:var(--line-height-relaxed);font-weight:var(--font-style-regular);border-radius:4px;min-block-size:25px;display:inline-grid;align-items:center;pointer-events:none;inline-size:max-content}.giu-static-pill-icon-and-text{display:inline-grid;grid-auto-flow:column;grid-auto-columns:max-content;gap:var(--spacing-gap-m)}.tab-full-width-buttons::part(tab-list block-start),.tab-full-width-buttons::part(tab-list block-end){grid-auto-columns:1fr}.tab-full-width-buttons::part(tab block-start){justify-content:center}.tree-view::part(item__header){--icon__system_warning_warning--disabled:var(\n --icon__system_warning_warning--enabled\n )}.tabular-grid{--focus-outline-width:1px}ch-popover{background-color:var(--color-accent-surface-elevation-1);border:1px solid var(--color-border-surface-on-surface);border-radius:var(--border-radius-s);box-shadow:var(--shadow-elevation-2)}ch-popover>div{display:flex;flex-direction:column;gap:0;padding:var(--spacing-padding-m);max-block-size:300px;overflow-y:auto}.checkbox-item{display:flex;inline-size:100%;padding-block:var(--spacing-padding-xs);padding-inline:var(--spacing-padding-m);cursor:pointer;border-radius:var(--border-radius-s)}.checkbox-item:hover{background-color:var(--color-accent-item-selected)}.checkbox-item::part(checkbox){inline-size:100%}.checkbox-item::part(label){inline-size:100%;cursor:pointer;flex:1}.multi-select__button{display:flex;align-items:center;gap:var(--spacing-gap-s);overflow:hidden}.multi-select__chevron{flex-shrink:0;margin-inline-start:auto}.multi-select__placeholder{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multi-select__items{display:flex;flex-wrap:wrap;gap:var(--spacing-gap-xs);flex:1;align-items:center}.multi-select__item{display:inline-flex;align-items:center;gap:var(--spacing-gap-xs);padding:2px var(--spacing-padding-xs);background-color:var(--color-accent-item-pressed);border-radius:var(--border-radius-s)}.multi-select__item button{padding:0}.multi-select__caption{color:var(--color-text-neutral-on-disabled)}.multi-select__close{padding:0;margin:0}ch-checkbox.checkbox::part(label){font-weight:var(--font-style-regular);color:var(--color-text-neutral-default)}";
8
+
9
+ var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) {
10
+ if (kind === "a" && !f)
11
+ throw new TypeError("Private accessor was defined without a getter");
12
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
13
+ throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
17
+ if (kind === "m")
18
+ throw new TypeError("Private method is not writable");
19
+ if (kind === "a" && !f)
20
+ throw new TypeError("Private accessor was defined without a setter");
21
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
22
+ throw new TypeError("Cannot write private member to an object whose class did not declare it");
23
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
24
+ };
25
+ var _GxIdeMultiSelect_multiButtonEl, _GxIdeMultiSelect_popoverEl, _GxIdeMultiSelect_togglePopover, _GxIdeMultiSelect_checkboxChangeHandler, _GxIdeMultiSelect_removeSelectedItemHandler, _GxIdeMultiSelect_isItemSelected, _GxIdeMultiSelect_renderSelectedItems;
26
+ const CSS_BUNDLES = [
27
+ "resets/box-sizing",
28
+ "components/button",
29
+ "components/icon",
30
+ "components/checkbox",
31
+ "utils/typography",
32
+ "utils/spacing",
33
+ "chameleon/scrollbar",
34
+ "components/combo-box"
35
+ ];
36
+ const CHEVRON_DOWN_ICON = getIconPath({
37
+ category: "navigation",
38
+ name: "chevron-down",
39
+ colorType: "on-interactive"
40
+ });
41
+ const CLOSE_ICON = getIconPath({
42
+ category: "system",
43
+ name: "close",
44
+ colorType: "on-interactive"
45
+ });
46
+ const GxIdeMultiSelect$1 = /*@__PURE__*/ proxyCustomElement(class GxIdeMultiSelect extends HTMLElement {
47
+ constructor() {
48
+ super();
49
+ this.__registerHost();
50
+ this.__attachShadow();
51
+ this.gxSelectionChange = createEvent(this, "gxSelectionChange", 7);
52
+ _GxIdeMultiSelect_multiButtonEl.set(this, void 0);
53
+ _GxIdeMultiSelect_popoverEl.set(this, void 0);
54
+ _GxIdeMultiSelect_togglePopover.set(this, () => {
55
+ if (!this.disabled) {
56
+ this.showPopover = !this.showPopover;
57
+ }
58
+ });
59
+ _GxIdeMultiSelect_checkboxChangeHandler.set(this, (optionValue, event) => {
60
+ const target = event.target;
61
+ const isChecked = target.value === target.checkedValue;
62
+ let newValue;
63
+ if (isChecked) {
64
+ newValue = [...this.value, optionValue];
65
+ }
66
+ else {
67
+ newValue = this.value.filter(val => val !== optionValue);
68
+ }
69
+ this.gxSelectionChange.emit(newValue);
70
+ });
71
+ _GxIdeMultiSelect_removeSelectedItemHandler.set(this, (itemValue) => {
72
+ const newValue = this.value.filter(val => val !== itemValue);
73
+ this.gxSelectionChange.emit(newValue);
74
+ });
75
+ _GxIdeMultiSelect_isItemSelected.set(this, (itemValue) => {
76
+ return this.value.includes(itemValue);
77
+ });
78
+ _GxIdeMultiSelect_renderSelectedItems.set(this, () => {
79
+ if (this.value.length === 0) {
80
+ return (h("span", { class: "multi-select__placeholder body-italic-m" }, this.placeholder));
81
+ }
82
+ const selectedOptions = this.model.filter(opt => this.value.includes(opt.value));
83
+ return (h("div", { class: "multi-select__items" }, selectedOptions.map(item => (h("div", { class: "multi-select__item", key: item.value }, h("span", { class: "multi-select__caption body-regular-s" }, item.caption), h("button", { type: "button", class: "button-tertiary button-icon-only multi-select__close", onClick: e => {
84
+ e.stopPropagation();
85
+ e.preventDefault();
86
+ __classPrivateFieldGet(this, _GxIdeMultiSelect_removeSelectedItemHandler, "f").call(this, item.value);
87
+ }, "aria-label": `Remove ${item.caption}` }, h("ch-image", { class: "icon-xs", src: CLOSE_ICON, type: "mask" })))))));
88
+ });
89
+ this.showPopover = false;
90
+ this.model = [];
91
+ this.value = [];
92
+ this.placeholder = "Select options";
93
+ this.disabled = false;
94
+ }
95
+ componentDidLoad() {
96
+ if (__classPrivateFieldGet(this, _GxIdeMultiSelect_popoverEl, "f") && __classPrivateFieldGet(this, _GxIdeMultiSelect_multiButtonEl, "f")) {
97
+ __classPrivateFieldGet(this, _GxIdeMultiSelect_popoverEl, "f").actionElement = __classPrivateFieldGet(this, _GxIdeMultiSelect_multiButtonEl, "f");
98
+ }
99
+ }
100
+ render() {
101
+ return (h(Host, null, h("ch-theme", { model: CSS_BUNDLES }), h("button", { class: "combo-box multi-select__button", type: "button", ref: (el) => (__classPrivateFieldSet(this, _GxIdeMultiSelect_multiButtonEl, el, "f")), onClick: __classPrivateFieldGet(this, _GxIdeMultiSelect_togglePopover, "f"), disabled: this.disabled }, __classPrivateFieldGet(this, _GxIdeMultiSelect_renderSelectedItems, "f").call(this), h("ch-image", { class: "icon-m multi-select__chevron", src: CHEVRON_DOWN_ICON, type: "mask" })), h("ch-popover", { ref: (el) => (__classPrivateFieldSet(this, _GxIdeMultiSelect_popoverEl, el, "f")), closeOnClickOutside: true, show: this.showPopover, blockAlign: "outside-end", inlineAlign: "inside-end", inlineSizeMatch: "action-element", class: "scrollable" }, h("div", null, this.model.map(option => (h("ch-checkbox", { class: "checkbox checkbox-item", caption: option.caption, checkedValue: "true", value: __classPrivateFieldGet(this, _GxIdeMultiSelect_isItemSelected, "f").call(this, option.value) ? "true" : "false", startImgSrc: option.startImgSrc, onInput: e => __classPrivateFieldGet(this, _GxIdeMultiSelect_checkboxChangeHandler, "f").call(this, option.value, e) })))))));
102
+ }
103
+ get el() { return this; }
104
+ static get style() { return gxIdeMultiSelectCss; }
105
+ }, [1, "gx-ide-multi-select", {
106
+ "model": [16],
107
+ "value": [16],
108
+ "placeholder": [1],
109
+ "disabled": [4],
110
+ "showPopover": [32]
111
+ }]);
112
+ _GxIdeMultiSelect_multiButtonEl = new WeakMap(), _GxIdeMultiSelect_popoverEl = new WeakMap(), _GxIdeMultiSelect_togglePopover = new WeakMap(), _GxIdeMultiSelect_checkboxChangeHandler = new WeakMap(), _GxIdeMultiSelect_removeSelectedItemHandler = new WeakMap(), _GxIdeMultiSelect_isItemSelected = new WeakMap(), _GxIdeMultiSelect_renderSelectedItems = new WeakMap();
113
+ function defineCustomElement$1() {
114
+ if (typeof customElements === "undefined") {
115
+ return;
116
+ }
117
+ const components = ["gx-ide-multi-select"];
118
+ components.forEach(tagName => { switch (tagName) {
119
+ case "gx-ide-multi-select":
120
+ if (!customElements.get(tagName)) {
121
+ customElements.define(tagName, GxIdeMultiSelect$1);
122
+ }
123
+ break;
124
+ } });
125
+ }
126
+
127
+ const GxIdeMultiSelect = GxIdeMultiSelect$1;
128
+ const defineCustomElement = defineCustomElement$1;
129
+
130
+ export { GxIdeMultiSelect, defineCustomElement };
131
+
132
+ //# sourceMappingURL=gx-ide-multi-select.js.map
@@ -0,0 +1 @@
1
+ {"file":"gx-ide-multi-select.js","mappings":"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","names":["GxIdeMultiSelect"],"sources":["src/components/_helpers/multi-select/gx-ide-multi-select.scss?tag=gx-ide-multi-select&encapsulation=shadow","src/components/_helpers/multi-select/gx-ide-multi-select.tsx"],"sourcesContent":["@import \"../../../global/gx-ide-common\";\n\nch-popover {\n background-color: var(--color-accent-surface-elevation-1);\n border: 1px solid var(--color-border-surface-on-surface);\n border-radius: var(--border-radius-s);\n box-shadow: var(--shadow-elevation-2);\n\n > div {\n display: flex;\n flex-direction: column;\n gap: 0;\n padding: var(--spacing-padding-m);\n max-block-size: 300px;\n overflow-y: auto;\n }\n}\n\n.checkbox-item {\n display: flex;\n inline-size: 100%;\n padding-block: var(--spacing-padding-xs);\n padding-inline: var(--spacing-padding-m);\n cursor: pointer;\n border-radius: var(--border-radius-s);\n\n &:hover {\n background-color: var(--color-accent-item-selected);\n }\n\n &::part(checkbox) {\n inline-size: 100%;\n }\n\n &::part(label) {\n inline-size: 100%;\n cursor: pointer;\n flex: 1;\n }\n}\n\n.multi-select {\n &__button {\n display: flex;\n align-items: center;\n gap: var(--spacing-gap-s);\n overflow: hidden;\n }\n\n &__chevron {\n flex-shrink: 0;\n margin-inline-start: auto;\n }\n\n &__placeholder {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__items {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-gap-xs);\n flex: 1;\n align-items: center;\n }\n\n &__item {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-gap-xs);\n padding: 2px var(--spacing-padding-xs);\n background-color: var(--color-accent-item-pressed);\n border-radius: var(--border-radius-s);\n\n & button {\n padding: 0;\n }\n }\n\n &__caption {\n color: var(--color-text-neutral-on-disabled);\n }\n\n &__close {\n padding: 0;\n margin: 0;\n }\n}\n\nch-checkbox.checkbox::part(label) {\n font-weight: var(--font-style-regular);\n color: var(--color-text-neutral-default);\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Element,\n Event,\n EventEmitter\n} from \"@stencil/core\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { ComboBoxModel } from \"@genexus/chameleon-controls-library\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"components/icon\",\n \"components/checkbox\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\",\n \"components/combo-box\"\n];\n\nconst CHEVRON_DOWN_ICON = getIconPath({\n category: \"navigation\",\n name: \"chevron-down\",\n colorType: \"on-interactive\"\n});\n\nconst CLOSE_ICON = getIconPath({\n category: \"system\",\n name: \"close\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-multi-select\",\n styleUrl: \"gx-ide-multi-select.scss\",\n shadow: true\n})\nexport class GxIdeMultiSelect {\n #multiButtonEl: HTMLButtonElement;\n #popoverEl: HTMLChPopoverElement;\n\n @Element() el: HTMLGxIdeMultiSelectElement;\n\n @State() showPopover = false;\n\n /**\n * Model with available options to select from\n */\n @Prop() readonly model: ComboBoxModel = [];\n\n /**\n * Currently selected item values\n */\n @Prop() readonly value: string[] = [];\n\n /**\n * Placeholder text when no items are selected\n */\n @Prop() readonly placeholder: string = \"Select options\";\n\n /**\n * Disabled state\n */\n @Prop() readonly disabled: boolean = false;\n\n /**\n * Emitted when the selection changes\n */\n @Event() gxSelectionChange: EventEmitter<string[]>;\n\n componentDidLoad() {\n if (this.#popoverEl && this.#multiButtonEl) {\n this.#popoverEl.actionElement = this.#multiButtonEl;\n }\n }\n\n #togglePopover = () => {\n if (!this.disabled) {\n this.showPopover = !this.showPopover;\n }\n };\n\n #checkboxChangeHandler = (\n optionValue: string,\n event: CustomEvent | InputEvent\n ) => {\n const target = event.target as HTMLChCheckboxElement;\n const isChecked = target.value === target.checkedValue;\n\n let newValue: string[];\n if (isChecked) {\n newValue = [...this.value, optionValue];\n } else {\n newValue = this.value.filter(val => val !== optionValue);\n }\n\n this.gxSelectionChange.emit(newValue);\n };\n\n #removeSelectedItemHandler = (itemValue: string) => {\n const newValue = this.value.filter(val => val !== itemValue);\n this.gxSelectionChange.emit(newValue);\n };\n\n #isItemSelected = (itemValue: string): boolean => {\n return this.value.includes(itemValue);\n };\n\n #renderSelectedItems = () => {\n if (this.value.length === 0) {\n return (\n <span class=\"multi-select__placeholder body-italic-m\">\n {this.placeholder}\n </span>\n );\n }\n\n const selectedOptions = this.model.filter(opt =>\n this.value.includes(opt.value)\n );\n\n return (\n <div class=\"multi-select__items\">\n {selectedOptions.map(item => (\n <div class=\"multi-select__item\" key={item.value}>\n <span class=\"multi-select__caption body-regular-s\">\n {item.caption}\n </span>\n <button\n type=\"button\"\n class=\"button-tertiary button-icon-only multi-select__close\"\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n this.#removeSelectedItemHandler(item.value);\n }}\n aria-label={`Remove ${item.caption}`}\n >\n <ch-image class=\"icon-xs\" src={CLOSE_ICON} type=\"mask\"></ch-image>\n </button>\n </div>\n ))}\n </div>\n );\n };\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n\n <button\n class=\"combo-box multi-select__button\"\n type=\"button\"\n ref={(el: HTMLButtonElement) => (this.#multiButtonEl = el)}\n onClick={this.#togglePopover}\n disabled={this.disabled}\n >\n {this.#renderSelectedItems()}\n <ch-image\n class=\"icon-m multi-select__chevron\"\n src={CHEVRON_DOWN_ICON}\n type=\"mask\"\n />\n </button>\n\n <ch-popover\n ref={(el: HTMLChPopoverElement) => (this.#popoverEl = el)}\n closeOnClickOutside\n show={this.showPopover}\n blockAlign=\"outside-end\"\n inlineAlign=\"inside-end\"\n inlineSizeMatch=\"action-element\"\n class={\"scrollable\"}\n >\n <div>\n {this.model.map(option => (\n <ch-checkbox\n class=\"checkbox checkbox-item\"\n caption={option.caption}\n checkedValue=\"true\"\n value={this.#isItemSelected(option.value) ? \"true\" : \"false\"}\n startImgSrc={option.startImgSrc}\n onInput={e => this.#checkboxChangeHandler(option.value, e)}\n />\n ))}\n </div>\n </ch-popover>\n </Host>\n );\n }\n}\n"],"version":3}
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface GxIdeSearch extends Components.GxIdeSearch, HTMLElement {}
4
+ export const GxIdeSearch: {
5
+ prototype: GxIdeSearch;
6
+ new (): GxIdeSearch;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1,206 @@
1
+ import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client';
2
+ import { g as getIconPath } from './mer-animated-dots.js';
3
+ import 'lit';
4
+ import 'lit/directives/when.js';
5
+ import 'lit/directives/if-defined.js';
6
+ import { c as config } from './config.js';
7
+ import { L as Locale } from './locale.js';
8
+ import { d as defineCustomElement$3 } from './gx-ide-empty-state2.js';
9
+ import { d as defineCustomElement$2 } from './ide-loader.js';
10
+
11
+ const searchCss = ":host{display:grid;block-size:100%}.search{display:grid;grid-template-rows:max-content 1fr;gap:var(--spacing-gap-xl)}.search__header{display:grid;grid-template-columns:1fr}.search__results{position:relative}ch-tree-view-render::part(root-item item__header){padding-inline-start:0;font-weight:var(--font-style-semi-bold);font-size:var(--font-size-body-s);line-height:var(--line-height-relaxed);font-family:var(--font-family-body)}ch-tree-view-render::part(search-item item__header){padding-inline-start:0;font-weight:var(--font-style-regular);font-size:var(--font-size-body-s);line-height:var(--line-height-relaxed);font-family:var(--font-family-body);color:var(--color-text-neutral-neutral) !important}.input--loading::part(start-img){animation:spin 1s linear infinite}@keyframes spin{100%{transform:rotate(360deg)}}";
12
+
13
+ var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
14
+ if (kind === "m")
15
+ throw new TypeError("Private method is not writable");
16
+ if (kind === "a" && !f)
17
+ throw new TypeError("Private accessor was defined without a setter");
18
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
19
+ throw new TypeError("Cannot write private member to an object whose class did not declare it");
20
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
21
+ };
22
+ var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) {
23
+ if (kind === "a" && !f)
24
+ throw new TypeError("Private accessor was defined without a getter");
25
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
26
+ throw new TypeError("Cannot read private member from an object whose class did not declare it");
27
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
28
+ };
29
+ var _GxIdeSearch_componentLocale, _GxIdeSearch_searchInputValue, _GxIdeSearch_searchInputHandler, _GxIdeSearch_searchInputKeyDownHandler, _GxIdeSearch_mapSearchResultToTreeViewModel, _GxIdeSearch_treeItemDoubleClickHandler, _GxIdeSearch_renderSearchResults;
30
+ const CSS_BUNDLES = [
31
+ "resets/box-sizing",
32
+ "components/edit",
33
+ "components/tree-view",
34
+ "utils/typography",
35
+ "utils/spacing",
36
+ "chameleon/scrollbar"
37
+ ];
38
+ const SEARCH_ICON = getIconPath({
39
+ category: "system",
40
+ name: "search",
41
+ colorType: "on-surface"
42
+ });
43
+ const INFORMATION_ICON = getIconPath({
44
+ category: "system",
45
+ name: "information",
46
+ colorType: "on-interactive"
47
+ });
48
+ const GxIdeSearch$1 = /*@__PURE__*/ proxyCustomElement(class GxIdeSearch extends HTMLElement {
49
+ constructor() {
50
+ super();
51
+ this.__registerHost();
52
+ this.__attachShadow();
53
+ _GxIdeSearch_componentLocale.set(this, void 0);
54
+ _GxIdeSearch_searchInputValue.set(this, "");
55
+ _GxIdeSearch_searchInputHandler.set(this, async (event) => {
56
+ var _a;
57
+ if (!this.isKbOpen) {
58
+ return;
59
+ }
60
+ const inputElement = event.target;
61
+ const searchText = (_a = inputElement === null || inputElement === void 0 ? void 0 : inputElement.value) === null || _a === void 0 ? void 0 : _a.trim();
62
+ __classPrivateFieldSet(this, _GxIdeSearch_searchInputValue, searchText, "f");
63
+ if (!searchText) {
64
+ this.searchResultModel = [];
65
+ this.hasSearched = false;
66
+ this.isSearching = false;
67
+ return;
68
+ }
69
+ this.hasSearched = true;
70
+ this.isSearching = true;
71
+ this.searchResultModel = [];
72
+ try {
73
+ const searchResultData = await this.searchCallback({
74
+ text: searchText,
75
+ onlyTitles: false,
76
+ includeSubModules: true,
77
+ allBranches: false,
78
+ forLLM: false
79
+ });
80
+ this.searchResultModel =
81
+ __classPrivateFieldGet(this, _GxIdeSearch_mapSearchResultToTreeViewModel, "f").call(this, searchResultData);
82
+ }
83
+ finally {
84
+ this.isSearching = false;
85
+ }
86
+ });
87
+ _GxIdeSearch_searchInputKeyDownHandler.set(this, (event) => {
88
+ if (event.key === "Enter") {
89
+ __classPrivateFieldGet(this, _GxIdeSearch_searchInputHandler, "f").call(this, event);
90
+ }
91
+ });
92
+ _GxIdeSearch_mapSearchResultToTreeViewModel.set(this, (searchResultData) => {
93
+ if (!searchResultData || searchResultData.length === 0) {
94
+ return [];
95
+ }
96
+ return [
97
+ {
98
+ id: "root",
99
+ caption: `${__classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").labels.results} (${searchResultData.length})`,
100
+ expanded: true,
101
+ parts: "root-item",
102
+ items: searchResultData.map((item) => ({
103
+ id: item.objectId,
104
+ startImgSrc: item.objectIcon,
105
+ caption: item.objectName,
106
+ leaf: true,
107
+ parts: "search-item"
108
+ }))
109
+ }
110
+ ];
111
+ });
112
+ _GxIdeSearch_treeItemDoubleClickHandler.set(this, async (event) => {
113
+ var _a;
114
+ const itemId = event.detail.id;
115
+ await ((_a = this.itemDoubleClickCallback) === null || _a === void 0 ? void 0 : _a.call(this, itemId));
116
+ });
117
+ _GxIdeSearch_renderSearchResults.set(this, () => {
118
+ if (!this.isKbOpen) {
119
+ return (h("gx-ide-empty-state", { stateTitle: __classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").noKbOpenState.title, stateDescription: __classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").noKbOpenState.description, stateIconSrc: INFORMATION_ICON, isAnimated: true }));
120
+ }
121
+ if (this.isSearching) {
122
+ return (h("gx-ide-loader", { loaderTitle: __classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").loader.title, show: true }));
123
+ }
124
+ if (this.searchResultModel.length > 0) {
125
+ return (h("ch-tree-view-render", { class: "tree-view", model: this.searchResultModel, expandableButton: "no", expandOnClick: false, onItemOpenReference: __classPrivateFieldGet(this, _GxIdeSearch_treeItemDoubleClickHandler, "f") }));
126
+ }
127
+ if (this.hasSearched) {
128
+ return (h("gx-ide-empty-state", { stateTitle: __classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").emptyState.title, stateDescription: __classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").emptyState.description, stateIconSrc: INFORMATION_ICON, isAnimated: true }));
129
+ }
130
+ return null;
131
+ });
132
+ this.searchResultModel = [];
133
+ this.hasSearched = false;
134
+ this.isSearching = false;
135
+ this.isKbOpen = false;
136
+ this.searchCallback = undefined;
137
+ this.itemDoubleClickCallback = undefined;
138
+ }
139
+ valueChangeHandler(newValue) {
140
+ if (!newValue) {
141
+ __classPrivateFieldSet(this, _GxIdeSearch_searchInputValue, "", "f");
142
+ this.searchResultModel = [];
143
+ this.hasSearched = false;
144
+ this.isSearching = false;
145
+ }
146
+ }
147
+ /**
148
+ * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings
149
+ */
150
+ async showSettings(_show) {
151
+ return Promise.resolve();
152
+ }
153
+ async componentWillLoad() {
154
+ __classPrivateFieldSet(this, _GxIdeSearch_componentLocale, await Locale.getComponentStrings(this.el), "f");
155
+ }
156
+ render() {
157
+ return (h(Host, { class: "widget" }, h("ch-theme", { model: CSS_BUNDLES }), h("section", { class: "spacing-body search" }, h("header", { class: "search__header" }, h("ch-edit", { id: "search-input", class: "input", accessibleName: __classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").accessibleName, placeholder: __classPrivateFieldGet(this, _GxIdeSearch_componentLocale, "f").placeholders.search, debounce: config.inputDebounce, onInput: __classPrivateFieldGet(this, _GxIdeSearch_searchInputHandler, "f"), onKeyDown: __classPrivateFieldGet(this, _GxIdeSearch_searchInputKeyDownHandler, "f"), type: "search", startImgSrc: SEARCH_ICON, disabled: !this.isKbOpen, value: __classPrivateFieldGet(this, _GxIdeSearch_searchInputValue, "f") })), h("main", { class: "search__results" }, __classPrivateFieldGet(this, _GxIdeSearch_renderSearchResults, "f").call(this)))));
158
+ }
159
+ static get assetsDirs() { return ["gx-ide-assets/search"]; }
160
+ get el() { return this; }
161
+ static get watchers() { return {
162
+ "isKbOpen": ["valueChangeHandler"]
163
+ }; }
164
+ static get style() { return searchCss; }
165
+ }, [1, "gx-ide-search", {
166
+ "isKbOpen": [4, "is-kb-open"],
167
+ "searchCallback": [16],
168
+ "itemDoubleClickCallback": [16],
169
+ "searchResultModel": [32],
170
+ "hasSearched": [32],
171
+ "isSearching": [32],
172
+ "showSettings": [64]
173
+ }, undefined, {
174
+ "isKbOpen": ["valueChangeHandler"]
175
+ }]);
176
+ _GxIdeSearch_componentLocale = new WeakMap(), _GxIdeSearch_searchInputValue = new WeakMap(), _GxIdeSearch_searchInputHandler = new WeakMap(), _GxIdeSearch_searchInputKeyDownHandler = new WeakMap(), _GxIdeSearch_mapSearchResultToTreeViewModel = new WeakMap(), _GxIdeSearch_treeItemDoubleClickHandler = new WeakMap(), _GxIdeSearch_renderSearchResults = new WeakMap();
177
+ function defineCustomElement$1() {
178
+ if (typeof customElements === "undefined") {
179
+ return;
180
+ }
181
+ const components = ["gx-ide-search", "gx-ide-empty-state", "gx-ide-loader"];
182
+ components.forEach(tagName => { switch (tagName) {
183
+ case "gx-ide-search":
184
+ if (!customElements.get(tagName)) {
185
+ customElements.define(tagName, GxIdeSearch$1);
186
+ }
187
+ break;
188
+ case "gx-ide-empty-state":
189
+ if (!customElements.get(tagName)) {
190
+ defineCustomElement$3();
191
+ }
192
+ break;
193
+ case "gx-ide-loader":
194
+ if (!customElements.get(tagName)) {
195
+ defineCustomElement$2();
196
+ }
197
+ break;
198
+ } });
199
+ }
200
+
201
+ const GxIdeSearch = GxIdeSearch$1;
202
+ const defineCustomElement = defineCustomElement$1;
203
+
204
+ export { GxIdeSearch, defineCustomElement };
205
+
206
+ //# sourceMappingURL=gx-ide-search.js.map
@@ -0,0 +1 @@
1
+ {"file":"gx-ide-search.js","mappings":"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","names":["GxIdeSearch"],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"version":3}
@@ -29,7 +29,7 @@ var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) ||
29
29
  throw new TypeError("Cannot read private member from an object whose class did not declare it");
30
30
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
31
31
  };
32
- var _GxIdeWWFiles_componentLocale, _GxIdeWWFiles_ACCORDION_MODEL, _GxIdeWWFiles_nameValue, _GxIdeWWFiles_moduleValue, _GxIdeWWFiles_searchContentsValue, _GxIdeWWFiles_categoryValue, _GxIdeWWFiles_allDescendants, _GxIdeWWFiles_userValue, _GxIdeWWFiles_selectedObjectsIds, _GxIdeWWFiles_chGridEl, _GxIdeWWFiles_filterModuleEl, _GxIdeWWFiles_setFilterDefaultValues, _GxIdeWWFiles_allDescendantsCheckboxHandler, _GxIdeWWFiles_handleSelectionChanged, _GxIdeWWFiles_handleRowDoubleClicked, _GxIdeWWFiles_handleRowContextMenu, _GxIdeWWFiles_attachGridListeners, _GxIdeWWFiles_categoryInputHandler, _GxIdeWWFiles_clearDateTimeValue, _GxIdeWWFiles_dateTimeInputHandler, _GxIdeWWFiles_deleteSelectionCallbackHandler, _GxIdeWWFiles_deselectAll, _GxIdeWWFiles_evaluateModifiedDates, _GxIdeWWFiles_filterAfterTypeCallbackHandler, _GxIdeWWFiles_formatDate, _GxIdeWWFiles_getObjects, _GxIdeWWFiles_renderHeader, _GxIdeWWFiles_renderObjects, _GxIdeWWFiles_moduleValueChangedHandler, _GxIdeWWFiles_nameInputHandler, _GxIdeWWFiles_newFileCallbackHandler, _GxIdeWWFiles_openSelectionCallbackHandler, _GxIdeWWFiles_searchContentsInputHandler, _GxIdeWWFiles_setLoadingState, _GxIdeWWFiles_userInputHandler, _GxIdeWWFiles_showModifiedCheckboxHandler, _GxIdeWWFiles_selectAll;
32
+ var _GxIdeWWFiles_componentLocale, _GxIdeWWFiles_ACCORDION_MODEL, _GxIdeWWFiles_nameValue, _GxIdeWWFiles_moduleValue, _GxIdeWWFiles_searchContentsValue, _GxIdeWWFiles_categoryValue, _GxIdeWWFiles_allDescendants, _GxIdeWWFiles_userValue, _GxIdeWWFiles_selectedObjectsIds, _GxIdeWWFiles_chGridEl, _GxIdeWWFiles_setFilterDefaultValues, _GxIdeWWFiles_allDescendantsCheckboxHandler, _GxIdeWWFiles_handleSelectionChanged, _GxIdeWWFiles_handleRowDoubleClicked, _GxIdeWWFiles_handleRowContextMenu, _GxIdeWWFiles_attachGridListeners, _GxIdeWWFiles_categoryInputHandler, _GxIdeWWFiles_clearDateTimeValue, _GxIdeWWFiles_dateTimeInputHandler, _GxIdeWWFiles_deleteSelectionCallbackHandler, _GxIdeWWFiles_deselectAll, _GxIdeWWFiles_evaluateModifiedDates, _GxIdeWWFiles_filterAfterTypeCallbackHandler, _GxIdeWWFiles_formatDate, _GxIdeWWFiles_getObjects, _GxIdeWWFiles_renderHeader, _GxIdeWWFiles_renderObjects, _GxIdeWWFiles_moduleValueChangedHandler, _GxIdeWWFiles_nameInputHandler, _GxIdeWWFiles_newFileCallbackHandler, _GxIdeWWFiles_openSelectionCallbackHandler, _GxIdeWWFiles_searchContentsInputHandler, _GxIdeWWFiles_setLoadingState, _GxIdeWWFiles_userInputHandler, _GxIdeWWFiles_showModifiedCheckboxHandler, _GxIdeWWFiles_selectAll;
33
33
  const CSS_BUNDLES = [
34
34
  "resets/box-sizing",
35
35
  "components/button",
@@ -84,7 +84,6 @@ const GxIdeWWFiles = /*@__PURE__*/ proxyCustomElement(class GxIdeWWFiles extends
84
84
  // Other
85
85
  _GxIdeWWFiles_selectedObjectsIds.set(this, []);
86
86
  _GxIdeWWFiles_chGridEl.set(this, void 0);
87
- _GxIdeWWFiles_filterModuleEl.set(this, void 0);
88
87
  _GxIdeWWFiles_setFilterDefaultValues.set(this, () => {
89
88
  __classPrivateFieldSet(this, _GxIdeWWFiles_nameValue, "", "f");
90
89
  __classPrivateFieldSet(this, _GxIdeWWFiles_moduleValue, Object.assign({}, this.defaultModule), "f");
@@ -169,11 +168,7 @@ const GxIdeWWFiles = /*@__PURE__*/ proxyCustomElement(class GxIdeWWFiles extends
169
168
  });
170
169
  _GxIdeWWFiles_getObjects.set(this, () => {
171
170
  __classPrivateFieldGet(this, _GxIdeWWFiles_setLoadingState, "f").call(this);
172
- const parentId = __classPrivateFieldGet(this, _GxIdeWWFiles_filterModuleEl, "f") && __classPrivateFieldGet(this, _GxIdeWWFiles_filterModuleEl, "f").value
173
- ? __classPrivateFieldGet(this, _GxIdeWWFiles_filterModuleEl, "f").value.id
174
- : this.defaultModule
175
- ? this.defaultModule.id
176
- : "";
171
+ const parentId = __classPrivateFieldGet(this, _GxIdeWWFiles_moduleValue, "f") ? __classPrivateFieldGet(this, _GxIdeWWFiles_moduleValue, "f").id : "";
177
172
  const filtersValues = {
178
173
  name: __classPrivateFieldGet(this, _GxIdeWWFiles_nameValue, "f"),
179
174
  searchContents: __classPrivateFieldGet(this, _GxIdeWWFiles_searchContentsValue, "f"),
@@ -202,7 +197,7 @@ const GxIdeWWFiles = /*@__PURE__*/ proxyCustomElement(class GxIdeWWFiles extends
202
197
  h("div", {
203
198
  // Module
204
199
  class: "field field-block field-module-folder"
205
- }, h("label", { class: "label", htmlFor: "module-folder" }, __classPrivateFieldGet(this, _GxIdeWWFiles_componentLocale, "f").filter.moduleFolder), h("gx-ide-entity-selector", { part: "filter-module-folder", id: "module/folder", labelPosition: "none", value: __classPrivateFieldGet(this, _GxIdeWWFiles_moduleValue, "f"), defaultValue: this.defaultModule, selectEntityCallback: this.selectModuleCallback, ref: (el) => (__classPrivateFieldSet(this, _GxIdeWWFiles_filterModuleEl, el, "f")), onValueChanged: __classPrivateFieldGet(this, _GxIdeWWFiles_moduleValueChangedHandler, "f"), disabled: this.isLoading })),
200
+ }, h("label", { class: "label", htmlFor: "module-folder" }, __classPrivateFieldGet(this, _GxIdeWWFiles_componentLocale, "f").filter.moduleFolder), h("gx-ide-entity-selector", { part: "filter-module-folder", id: "module/folder", labelPosition: "none", value: __classPrivateFieldGet(this, _GxIdeWWFiles_moduleValue, "f"), defaultValue: this.defaultModule, selectEntityCallback: this.selectModuleCallback, onValueChanged: __classPrivateFieldGet(this, _GxIdeWWFiles_moduleValueChangedHandler, "f"), disabled: this.isLoading })),
206
201
  h("ch-accordion-render", { class: "accordion-outlined advanced-filter", model: __classPrivateFieldGet(this, _GxIdeWWFiles_ACCORDION_MODEL, "f") }, h("div", { slot: ACCORDION_FILTER_ID, class: "spacing-body field-group advanced-filter__container" }, this.showSearchContents && (h("div", {
207
202
  // Search contents
208
203
  class: "field field-block field-search-contents"
@@ -437,7 +432,7 @@ const GxIdeWWFiles = /*@__PURE__*/ proxyCustomElement(class GxIdeWWFiles extends
437
432
  "dateTimeValue": ["dateTimeValueChanged"],
438
433
  "categories": ["categoriesChanged"]
439
434
  }]);
440
- _GxIdeWWFiles_componentLocale = new WeakMap(), _GxIdeWWFiles_ACCORDION_MODEL = new WeakMap(), _GxIdeWWFiles_nameValue = new WeakMap(), _GxIdeWWFiles_moduleValue = new WeakMap(), _GxIdeWWFiles_searchContentsValue = new WeakMap(), _GxIdeWWFiles_categoryValue = new WeakMap(), _GxIdeWWFiles_allDescendants = new WeakMap(), _GxIdeWWFiles_userValue = new WeakMap(), _GxIdeWWFiles_selectedObjectsIds = new WeakMap(), _GxIdeWWFiles_chGridEl = new WeakMap(), _GxIdeWWFiles_filterModuleEl = new WeakMap(), _GxIdeWWFiles_setFilterDefaultValues = new WeakMap(), _GxIdeWWFiles_allDescendantsCheckboxHandler = new WeakMap(), _GxIdeWWFiles_handleSelectionChanged = new WeakMap(), _GxIdeWWFiles_handleRowDoubleClicked = new WeakMap(), _GxIdeWWFiles_handleRowContextMenu = new WeakMap(), _GxIdeWWFiles_attachGridListeners = new WeakMap(), _GxIdeWWFiles_categoryInputHandler = new WeakMap(), _GxIdeWWFiles_clearDateTimeValue = new WeakMap(), _GxIdeWWFiles_dateTimeInputHandler = new WeakMap(), _GxIdeWWFiles_deleteSelectionCallbackHandler = new WeakMap(), _GxIdeWWFiles_deselectAll = new WeakMap(), _GxIdeWWFiles_evaluateModifiedDates = new WeakMap(), _GxIdeWWFiles_filterAfterTypeCallbackHandler = new WeakMap(), _GxIdeWWFiles_formatDate = new WeakMap(), _GxIdeWWFiles_getObjects = new WeakMap(), _GxIdeWWFiles_renderHeader = new WeakMap(), _GxIdeWWFiles_renderObjects = new WeakMap(), _GxIdeWWFiles_moduleValueChangedHandler = new WeakMap(), _GxIdeWWFiles_nameInputHandler = new WeakMap(), _GxIdeWWFiles_newFileCallbackHandler = new WeakMap(), _GxIdeWWFiles_openSelectionCallbackHandler = new WeakMap(), _GxIdeWWFiles_searchContentsInputHandler = new WeakMap(), _GxIdeWWFiles_setLoadingState = new WeakMap(), _GxIdeWWFiles_userInputHandler = new WeakMap(), _GxIdeWWFiles_showModifiedCheckboxHandler = new WeakMap(), _GxIdeWWFiles_selectAll = new WeakMap();
435
+ _GxIdeWWFiles_componentLocale = new WeakMap(), _GxIdeWWFiles_ACCORDION_MODEL = new WeakMap(), _GxIdeWWFiles_nameValue = new WeakMap(), _GxIdeWWFiles_moduleValue = new WeakMap(), _GxIdeWWFiles_searchContentsValue = new WeakMap(), _GxIdeWWFiles_categoryValue = new WeakMap(), _GxIdeWWFiles_allDescendants = new WeakMap(), _GxIdeWWFiles_userValue = new WeakMap(), _GxIdeWWFiles_selectedObjectsIds = new WeakMap(), _GxIdeWWFiles_chGridEl = new WeakMap(), _GxIdeWWFiles_setFilterDefaultValues = new WeakMap(), _GxIdeWWFiles_allDescendantsCheckboxHandler = new WeakMap(), _GxIdeWWFiles_handleSelectionChanged = new WeakMap(), _GxIdeWWFiles_handleRowDoubleClicked = new WeakMap(), _GxIdeWWFiles_handleRowContextMenu = new WeakMap(), _GxIdeWWFiles_attachGridListeners = new WeakMap(), _GxIdeWWFiles_categoryInputHandler = new WeakMap(), _GxIdeWWFiles_clearDateTimeValue = new WeakMap(), _GxIdeWWFiles_dateTimeInputHandler = new WeakMap(), _GxIdeWWFiles_deleteSelectionCallbackHandler = new WeakMap(), _GxIdeWWFiles_deselectAll = new WeakMap(), _GxIdeWWFiles_evaluateModifiedDates = new WeakMap(), _GxIdeWWFiles_filterAfterTypeCallbackHandler = new WeakMap(), _GxIdeWWFiles_formatDate = new WeakMap(), _GxIdeWWFiles_getObjects = new WeakMap(), _GxIdeWWFiles_renderHeader = new WeakMap(), _GxIdeWWFiles_renderObjects = new WeakMap(), _GxIdeWWFiles_moduleValueChangedHandler = new WeakMap(), _GxIdeWWFiles_nameInputHandler = new WeakMap(), _GxIdeWWFiles_newFileCallbackHandler = new WeakMap(), _GxIdeWWFiles_openSelectionCallbackHandler = new WeakMap(), _GxIdeWWFiles_searchContentsInputHandler = new WeakMap(), _GxIdeWWFiles_setLoadingState = new WeakMap(), _GxIdeWWFiles_userInputHandler = new WeakMap(), _GxIdeWWFiles_showModifiedCheckboxHandler = new WeakMap(), _GxIdeWWFiles_selectAll = new WeakMap();
441
436
  function defineCustomElement$1() {
442
437
  if (typeof customElements === "undefined") {
443
438
  return;