@genexus/genexus-ide-ui 1.0.4 → 1.0.5

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 (78) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/gx-ide-empty-state.cjs.entry.js +3 -2
  3. package/dist/cjs/gx-ide-empty-state.cjs.entry.js.map +1 -1
  4. package/dist/cjs/gx-ide-kb-manager-export.cjs.entry.js +272 -293
  5. package/dist/cjs/gx-ide-kb-manager-export.cjs.entry.js.map +1 -1
  6. package/dist/cjs/gx-ide-loader.cjs.entry.js +1 -1
  7. package/dist/cjs/gx-ide-loader.cjs.entry.js.map +1 -1
  8. package/dist/cjs/gx-ide-recent-news.cjs.entry.js +1 -1
  9. package/dist/cjs/gx-ide-recent-news.cjs.entry.js.map +1 -1
  10. package/dist/cjs/gx-ide-start-page.cjs.entry.js +4 -3
  11. package/dist/cjs/gx-ide-start-page.cjs.entry.js.map +1 -1
  12. package/dist/cjs/loader.cjs.js +1 -1
  13. package/dist/collection/collection-manifest.json +1 -1
  14. package/dist/collection/components/_helpers/empty-state/gx-ide-empty-state.css +5 -1
  15. package/dist/collection/components/_helpers/empty-state/gx-ide-empty-state.js +20 -1
  16. package/dist/collection/components/_helpers/empty-state/gx-ide-empty-state.js.map +1 -1
  17. package/dist/collection/components/_helpers/ide-loader/ide-loader.css +2 -2
  18. package/dist/collection/components/kb-manager-export/gx-ide-assets/kb-manager-export/langs/kb-manager-export.lang.en.json +3 -3
  19. package/dist/collection/components/kb-manager-export/gx-ide-assets/kb-manager-export/langs/kb-manager-export.lang.ja.json +4 -4
  20. package/dist/collection/components/kb-manager-export/helpers.js +64 -105
  21. package/dist/collection/components/kb-manager-export/helpers.js.map +1 -1
  22. package/dist/collection/components/kb-manager-export/kb-manager-export.css +19 -618
  23. package/dist/collection/components/kb-manager-export/kb-manager-export.js +345 -377
  24. package/dist/collection/components/kb-manager-export/kb-manager-export.js.map +1 -1
  25. package/dist/collection/components/kb-manager-export/types.js +2 -0
  26. package/dist/collection/components/kb-manager-export/types.js.map +1 -0
  27. package/dist/collection/components/start-page/recent-news.js +1 -1
  28. package/dist/collection/components/start-page/recent-news.js.map +1 -1
  29. package/dist/collection/components/start-page/start-page.js +4 -3
  30. package/dist/collection/components/start-page/start-page.js.map +1 -1
  31. package/dist/components/gx-ide-empty-state2.js +4 -2
  32. package/dist/components/gx-ide-empty-state2.js.map +1 -1
  33. package/dist/components/gx-ide-kb-manager-export.js +294 -314
  34. package/dist/components/gx-ide-kb-manager-export.js.map +1 -1
  35. package/dist/components/gx-ide-start-page.js +4 -3
  36. package/dist/components/gx-ide-start-page.js.map +1 -1
  37. package/dist/components/ide-loader.js +1 -1
  38. package/dist/components/ide-loader.js.map +1 -1
  39. package/dist/components/recent-news.js +1 -1
  40. package/dist/components/recent-news.js.map +1 -1
  41. package/dist/esm/genexus-ide-ui.js +1 -1
  42. package/dist/esm/gx-ide-empty-state.entry.js +3 -2
  43. package/dist/esm/gx-ide-empty-state.entry.js.map +1 -1
  44. package/dist/esm/gx-ide-kb-manager-export.entry.js +273 -294
  45. package/dist/esm/gx-ide-kb-manager-export.entry.js.map +1 -1
  46. package/dist/esm/gx-ide-loader.entry.js +1 -1
  47. package/dist/esm/gx-ide-loader.entry.js.map +1 -1
  48. package/dist/esm/gx-ide-recent-news.entry.js +1 -1
  49. package/dist/esm/gx-ide-recent-news.entry.js.map +1 -1
  50. package/dist/esm/gx-ide-start-page.entry.js +4 -3
  51. package/dist/esm/gx-ide-start-page.entry.js.map +1 -1
  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/kb-manager-export/langs/kb-manager-export.lang.en.json +3 -3
  56. package/dist/genexus-ide-ui/gx-ide-assets/kb-manager-export/langs/kb-manager-export.lang.ja.json +4 -4
  57. package/dist/genexus-ide-ui/p-2cb766ce.entry.js +493 -0
  58. package/dist/genexus-ide-ui/p-2cb766ce.entry.js.map +1 -0
  59. package/dist/genexus-ide-ui/{p-f924f02a.entry.js → p-64101478.entry.js} +2 -2
  60. package/dist/genexus-ide-ui/p-64101478.entry.js.map +1 -0
  61. package/dist/genexus-ide-ui/{p-f220c75a.entry.js → p-885302c2.entry.js} +11 -6
  62. package/dist/genexus-ide-ui/p-885302c2.entry.js.map +1 -0
  63. package/dist/genexus-ide-ui/{p-eb49e4f1.entry.js → p-8ff5da93.entry.js} +36 -31
  64. package/dist/genexus-ide-ui/p-8ff5da93.entry.js.map +1 -0
  65. package/dist/genexus-ide-ui/{p-dd07e68a.entry.js → p-a6b76120.entry.js} +2 -2
  66. package/dist/genexus-ide-ui/p-a6b76120.entry.js.map +1 -0
  67. package/dist/types/components/_helpers/empty-state/gx-ide-empty-state.d.ts +4 -0
  68. package/dist/types/components/kb-manager-export/helpers.d.ts +33 -5
  69. package/dist/types/components/kb-manager-export/kb-manager-export.d.ts +36 -98
  70. package/dist/types/components/kb-manager-export/types.d.ts +21 -0
  71. package/dist/types/components.d.ts +16 -40
  72. package/package.json +4 -4
  73. package/dist/genexus-ide-ui/p-b3baa3d2.entry.js +0 -491
  74. package/dist/genexus-ide-ui/p-b3baa3d2.entry.js.map +0 -1
  75. package/dist/genexus-ide-ui/p-dd07e68a.entry.js.map +0 -1
  76. package/dist/genexus-ide-ui/p-eb49e4f1.entry.js.map +0 -1
  77. package/dist/genexus-ide-ui/p-f220c75a.entry.js.map +0 -1
  78. package/dist/genexus-ide-ui/p-f924f02a.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"file":"gx-ide-kb-manager-export.entry.js","mappings":"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","names":[],"sources":["src/components/kb-manager-export/helpers.ts","src/components/kb-manager-export/kb-manager-export.scss?tag=gx-ide-kb-manager-export&encapsulation=shadow","src/components/kb-manager-export/kb-manager-export.tsx"],"sourcesContent":["// /* Tree View */\nimport { TreeViewItemModel } from \"@genexus/chameleon-controls-library\";\nimport {\n ObjectData,\n KBPropertyData,\n KBPropertyType\n} from \"./kb-manager-export\";\nimport { ObjectType } from \"../../common/types\";\nexport const KB_PROPERTY = \"property\";\nexport const KB_OBJECT = \"object\";\n\n/*\nINDEX:\n1. getObjectIcon\n2. convertObjectTypeToTreeItem\n3. convertObjectToTreeItem\n4. getObjectType\n5. findObjectInTree\n6. findPropertyInTree\n7. convertPropertyToTreeItem\n8. updateTreeModelWithObjects\n9. convertKbPropertiesDataToTreeItemData\n10. clearKbPropertiesFromTree\n*/\n\n/* 1.2 getIcon (for properties)*/\nconst getPropertyIcon = (\n typeId: string,\n kbPropertiesTypes: KBPropertyType[]\n): string => {\n // The object icon has to be retrieved from the ObjetTypes array, by matching the ObjectData typeId with the ObjectType id.\n const propertyType = kbPropertiesTypes.find(\n propertyType => propertyType.id === typeId\n );\n if (propertyType) {\n return propertyType.icon;\n } else {\n return undefined;\n }\n};\n\n/* 2. convertObjectTypeToTreeItem*/\nconst convertObjectTypeToTreeItem = (\n objectType: ObjectType\n): TreeViewItemModel => ({\n caption: objectType.name,\n id: objectType.id,\n startImgSrc: objectType.icon,\n leaf: false,\n parts: \"object-type tree-view-item\",\n expanded: true,\n items: []\n});\n\n/* 3. convertObjectToTreeItem*/\nconst convertObjectToTreeItem = (\n object: ObjectData,\n objectTypes: Map<string, ObjectType>\n): TreeViewItemModel => ({\n caption: object.name,\n id: object.id,\n startImgSrc: objectTypes.get(object.typeId).icon,\n parts: \"object tree-view-item\",\n metadata: KB_OBJECT,\n leaf: true\n});\n\n/* 5. findObjectInTree*/\nconst findObjectInTree = (\n object: ObjectData,\n actualTreeState: TreeViewItemModel[]\n): ObjectTreeInfo => {\n const objectTreeItemInfo = {\n objectExists: false,\n objectTypeIndex: -1\n };\n if (actualTreeState) {\n const objectTypeTreeItemIndex = actualTreeState.findIndex(\n objectTypeTreeItem => {\n return objectTypeTreeItem.id === object.typeId;\n }\n );\n if (objectTypeTreeItemIndex !== -1) {\n objectTreeItemInfo.objectTypeIndex = objectTypeTreeItemIndex;\n // objectType exists as a node in the actual tree.\n // Now try to find the object\n const objectFound = actualTreeState[objectTypeTreeItemIndex].items?.find(\n objectTreeItem => {\n return objectTreeItem.id === object.id;\n }\n );\n if (objectFound) {\n objectTreeItemInfo.objectExists = true;\n }\n }\n }\n return objectTreeItemInfo;\n};\n\n/* 6. findPropertyInTree */\nconst findPropertyInTree = (\n property: KBPropertyData,\n updatedTreeData: TreeViewItemModel[]\n): boolean => {\n const found = updatedTreeData.find(node => {\n return node.id === property.id;\n });\n if (found) {\n return true;\n }\n return false;\n};\n\n/* 7. convertPropertyToTreeItem */\nconst convertPropertyToTreeItem = (\n property: KBPropertyData,\n kbPropertiesTypes: KBPropertyType[]\n): TreeViewItemModel => ({\n caption: property.name,\n id: property.id,\n startImgSrc: getPropertyIcon(property.typeId, kbPropertiesTypes),\n parts: \"property tree-view-item\",\n metadata: KB_PROPERTY,\n leaf: true\n});\n\n/* 8. updateTreeModelWithObjects*/\nexport const updateTreeModelWithObjects = (\n objects: ObjectData[] | undefined,\n objectTypes: Map<string, ObjectType>,\n actualTreeState: TreeViewItemModel[]\n): TreeViewItemModel[] => {\n const updatedTreeData: TreeViewItemModel[] = [...actualTreeState];\n if (!objects) {\n // nothing to do\n return updatedTreeData;\n }\n objects.forEach(object => {\n // objects that already exists in the actual actualTreeState should not be added.\n // We can find the object in the actual actualTreeState.\n const objectTreeItemInfo: ObjectTreeInfo = findObjectInTree(\n object,\n updatedTreeData\n );\n if (!objectTreeItemInfo.objectExists) {\n // object does not exists in actualTreeState\n // if the objectType tree node exists, insert inside.\n // if the objectType tree node does not exists, create object type node first.\n if (objectTreeItemInfo.objectTypeIndex === -1) {\n const objectType: ObjectType = objectTypes.get(object.typeId);\n if (objectType !== undefined) {\n const objectTypeTreeItem = convertObjectTypeToTreeItem(objectType);\n objectTreeItemInfo.objectTypeIndex =\n updatedTreeData.push(objectTypeTreeItem) - 1;\n }\n }\n const objectAsTreeItem: TreeViewItemModel = convertObjectToTreeItem(\n object,\n objectTypes\n );\n // insert object in tree (under the object type tree node)\n updatedTreeData[objectTreeItemInfo.objectTypeIndex].items.push(\n objectAsTreeItem\n );\n }\n });\n return updatedTreeData;\n};\n\n/* 9. convertKbPropertiesDataToTreeItemData*/\nexport const convertKbPropertiesDataToTreeItemData = (\n properties: KBPropertyData[],\n kbPropertiesTypes: KBPropertyType[],\n actualTreeState: TreeViewItemModel[]\n): TreeViewItemModel[] => {\n const updatedTreeData: TreeViewItemModel[] = [...actualTreeState];\n if (!properties) {\n // nothing to do\n return updatedTreeData;\n }\n properties.forEach(property => {\n // properties have no parent node, and they should be added at the beginning of the tree\n const propertyAlreadyExists = findPropertyInTree(property, updatedTreeData);\n if (!propertyAlreadyExists) {\n const propertyTreeItem = convertPropertyToTreeItem(\n property,\n kbPropertiesTypes\n );\n updatedTreeData.unshift(propertyTreeItem);\n }\n });\n return updatedTreeData;\n};\n\ntype ObjectTreeInfo = {\n objectExists: boolean;\n objectTypeIndex: number;\n};\n\n/* 10. clearKbPropertiesFromTree*/\nexport const clearKbPropertiesFromTree = (\n kBPropertiesData: KBPropertyData[],\n actualTreeState: TreeViewItemModel[]\n): TreeViewItemModel[] => {\n if (!(actualTreeState.length > 0)) {\n // nothing to do.\n return [];\n }\n const kBPropertiesDataIds: string[] = kBPropertiesData.map(property => {\n return property.id;\n });\n\n const treeModelWithoutKbProperties: TreeViewItemModel[] =\n actualTreeState.filter(item => {\n return !kBPropertiesDataIds.includes(item.id);\n });\n\n return treeModelWithoutKbProperties;\n};\n","@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n\n/*general*/\n.tree-view-container {\n display: flex;\n}\n\n/*Header*/\n.header {\n &__top {\n border-top: 1px solid var(--gx-ide-container-border-color);\n //border-bottom: 1px solid var(--gx-ide-container-border-color);\n display: grid;\n padding: var(--gx-ide-container__padding) var(--gx-ide-container__padding) 0\n var(--gx-ide-container__padding);\n gap: var(--gx-ide-grid-column-gap);\n grid-template-columns: 1fr auto;\n grid-template-areas: \"select-directory export-cancel-buttons-group options-btn\";\n\n .select-directory {\n grid-area: select-directory;\n }\n .export-cancel-buttons-group {\n grid-area: export-cancel-buttons-group;\n }\n .options-btn {\n grid-area: options-btn;\n }\n }\n &__bottom {\n .checkboxes-wrapper {\n padding: var(--gx-ide-grid-column-gap);\n display: flex;\n flex-wrap: wrap;\n gap: var(--gx-ide-grid-column-gap);\n\n .add-checkbox {\n display: flex;\n }\n }\n }\n}\n\n/*Main*/\n.tree-container {\n block-size: 100%;\n padding: var(--tree-container-padding);\n &--empty {\n align-items: center;\n justify-content: center;\n }\n @include gx-ide-message(\"tall\");\n}\n\ngxg-text {\n block-size: 100%;\n}\n\n// @keyframes toggleTreeObjectsVisibility {\n// 0% {\n// opacity: 1;\n// }\n// 100% {\n// opacity: 0;\n// }\n// }\n","/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Event,\n Element,\n State,\n EventEmitter,\n Watch\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\n/* Tree View */\nimport { TreeViewItemModel } from \"@genexus/chameleon-controls-library\";\nimport { TreeViewItemModelExtended } from \"@genexus/chameleon-controls-library\";\nimport { MercuryBundles } from \"@genexus/mercury\";\nimport {\n TextAlign,\n TextPadding,\n TextType\n} from \"@genexus/gemini/dist/types/components/text/text\";\nimport { CheckboxInfo } from \"@genexus/gemini/dist/types/components/form-checkbox/form-checkbox\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport {\n updateTreeModelWithObjects,\n convertKbPropertiesDataToTreeItemData,\n clearKbPropertiesFromTree\n} from \"./helpers\";\nimport { ObjectType } from \"../../common/types\";\n\nimport { KB_PROPERTY, KB_OBJECT } from \"./helpers\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/form\",\n \"utils/layout\",\n \"utils/typography\",\n \"components/button\",\n \"components/checkbox\",\n \"components/edit\",\n \"components/tree-view\"\n];\n@Component({\n tag: \"gx-ide-kb-manager-export\",\n styleUrl: \"kb-manager-export.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/kb-manager-export\"]\n})\nexport class GxIdeKbManagerExport {\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private checkedPropertiesIds: string[] = [];\n private renderedFirstTime = false;\n private flattenedObjectTypes: Map<string, ObjectType> = new Map();\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeKbManagerExportElement;\n\n private fileNameEl!: HTMLGxgFormTextElement;\n private exportAllCheckboxEl!: HTMLGxgFormCheckboxElement;\n private objectsTreeEl!: HTMLChTreeViewRenderElement;\n private loaderEl!: HTMLGxgIdeLoaderElement;\n private kBPropertiesData!: KBPropertyData[];\n\n // 3.STATE() VARIABLES //\n\n @State() exportAllIsChecked = false;\n @State() addKbPropertiesIsChecked = false;\n @State() checkedObjectsIds: string[] = [];\n @State() noObjects: boolean;\n\n @State() treeModel: TreeViewItemModel[] = [];\n @Watch(\"treeModel\")\n watchTreeModelHandler(newState: TreeViewItemModel[]) {\n this.noObjects = !!(newState.length === 0 || !newState);\n }\n\n @State() exportingIsInProcess = false;\n @Watch(\"exportingIsInProcess\")\n watchExportingIsInProcessHandler(isExporting: boolean) {\n if (isExporting && this.loader) {\n this.loaderEl.show = true;\n } else if (!isExporting && this.loader) {\n this.loaderEl.show = false;\n }\n }\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 * It allows defining the default Export File Name\n */\n @Prop() readonly fileName: string;\n\n /**\n * If true, it will display a loader when needed.\n */\n @Prop() readonly loader = false;\n\n /**\n * Array with the possible types of KB properties\n */\n @Prop() readonly kbPropertiesTypes: KBPropertyType[];\n\n /**\n * Array of possible object types\n */\n @Prop() readonly objectTypes: ObjectType[];\n @Watch(\"objectTypes\")\n watchObjectTypesHandler(newState: ObjectType[]) {\n this.flattenObjectTypes(newState);\n }\n\n /**\n * Callback invoked when the user wants to access the export options.\n */\n @Prop() readonly exportFileDirectoryCallback: ExportFileDirectoryCallback;\n\n /**\n * Callback invoked when the user wants to access the export options.\n */\n @Prop() readonly optionsCallback: OptionsCallback;\n\n /**\n * Callback invoked when the user wants to include KB properties.\n */\n @Prop() readonly addKBPropertiesCallback: KBPropertiesCallback;\n\n /**\n *Callback invoked when the user wants to add all the references for the selected objects.\n *@param itemIds:string[] The selected item ids\n *@returns : Returns an object with the items and its references\n */\n @Prop() readonly addReferencesCallback: AddReferencesCallback;\n\n /**\n * Callback invoked when the user wants to add objects.\n */\n @Prop() readonly addObjectsCallback: AddObjectsCallback;\n\n /**\n *Callback invoked when the user wants to initiate the export process.\n *@param fileName:string\n *@param itemIds:string[] The selected item ids\n *@returns : It returns a boolean indicating whether the process was successful\n */\n @Prop() readonly exportCallback: ExportCallback;\n\n /**\n * Callback invoked when the user wants to cancel the export process.\n * @returns It returns a boolean indicating whether the process could be canceled or not.\n */\n @Prop() readonly cancelCallback: CancelCallback;\n\n // 5.EVENTS (EMIT) //\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._componentLocale = await Locale.getComponentStrings(this.el);\n this.componentDidLoadEvent.emit(true);\n this.evaluateObjects();\n this.flattenObjectTypes(this.objectTypes);\n }\n\n componentDidLoad() {\n this.fileNameEl.focus();\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 // 9.LOCAL METHODS //\n\n private evaluateObjects = () => {\n this.noObjects = !!(this.treeModel?.length === 0 || !this.treeModel);\n };\n\n private optionsCallbackHandler = () => {\n if (this.optionsCallback) {\n this.optionsCallback();\n // returns Promise<void>\n }\n };\n\n private addKBPropertiesCallbackHandler = async (e: CustomEvent) => {\n const checked = e.detail.value;\n this.addKbPropertiesIsChecked = checked;\n if (checked && this.addKBPropertiesCallback) {\n this.kBPropertiesData = await this.addKBPropertiesCallback();\n if (this.kBPropertiesData.length === 0) {\n // nothing to do\n } else {\n // 'convertObjectDataToTreeItemData' can be used for converting KBPropertiesData as well, because the two types share the same properties\n const newTreeModel = convertKbPropertiesDataToTreeItemData(\n this.kBPropertiesData,\n this.kbPropertiesTypes,\n this.treeModel\n );\n this.treeModel = newTreeModel;\n }\n } else if (!checked) {\n // previous properties (if any) should be removed\n const objectsWithoutProperties = clearKbPropertiesFromTree(\n this.kBPropertiesData,\n this.treeModel\n );\n this.treeModel = objectsWithoutProperties;\n }\n };\n\n private addObjectsCallbackHandler = async () => {\n if (this.addObjectsCallback) {\n const objects: ObjectData[] = await this.addObjectsCallback();\n this.updateObjects(objects);\n }\n };\n\n private addReferencesCallbackHandler = async () => {\n if (this.addReferencesCallback) {\n const objects: ObjectData[] = await this.addReferencesCallback(\n this.checkedObjectsIds\n );\n this.updateObjects(objects);\n }\n };\n\n /*\n * Used to update objects. Objects are updated when calling the 'addObjectsCallback' or 'addReferencesCallback'\n */\n private updateObjects = (objects: ObjectData[]) => {\n if (objects.length) {\n const newTreeModel = updateTreeModelWithObjects(\n objects,\n this.flattenedObjectTypes,\n this.treeModel\n );\n this.treeModel = newTreeModel;\n }\n };\n\n /*\n * Update checked objects 'checkedObjectsArray' array. Used for the 'addReferencesCallback'\n */\n private objectsTreeCheckedItemsChangedHandler = (\n event: CustomEvent<Map<string, TreeViewItemModelExtended>>\n ) => {\n // filter 'checked objects' and 'checked properties' ids\n const checkedObjectsIds: string[] = [];\n const checkedPropertiesIds: string[] = [];\n const allItemsWithCheckbox = [...event.detail.values()];\n allItemsWithCheckbox.forEach(node => {\n if (node.item.checked && node.item.metadata === KB_OBJECT) {\n checkedObjectsIds.push(node.item.id);\n } else if (node.item.checked && node.item.metadata === KB_PROPERTY) {\n checkedPropertiesIds.push(node.item.id);\n }\n });\n this.checkedObjectsIds = checkedObjectsIds;\n this.checkedPropertiesIds = checkedPropertiesIds;\n };\n\n private exportCallbackHandler = async () => {\n if (this.exportCallback) {\n this.exportingIsInProcess = true;\n const exportAllChecked = this.exportAllCheckboxEl.checked;\n const fileName: string = this.fileNameEl.value;\n const checkedKbPropertiesIds = this.addKbPropertiesIsChecked\n ? this.checkedPropertiesIds\n : [];\n const checkedObjectIds = exportAllChecked\n ? undefined\n : this.checkedObjectsIds;\n this.exportCallback(\n fileName,\n checkedKbPropertiesIds,\n checkedObjectIds\n ).then(() => {\n this.exportingIsInProcess = false;\n });\n // returns Promise<boolean> but no procedure was detailed on the spec.\n }\n };\n\n private cancelCallbackHandler = async () => {\n if (this.cancelCallback) {\n const cancelled = await this.cancelCallback();\n if (cancelled) {\n this.exportingIsInProcess = false;\n }\n }\n };\n\n private clearButtonHandler = () => {\n /* revisar*/\n this.objectsTreeEl.updateAllItemsProperties({ checked: false });\n };\n\n private exportAllChangedHandler = (event: CustomEvent<CheckboxInfo>) => {\n this.exportAllIsChecked = event.detail.value;\n };\n\n private flattenObjectTypes(newState: ObjectType[]) {\n newState.forEach(objectType => {\n this.flattenedObjectTypes.set(objectType.id, objectType);\n });\n }\n\n private evaluateTreeViewFilters = (): string => {\n if (this.addKbPropertiesIsChecked && this.exportAllIsChecked) {\n // only show properties\n return KB_PROPERTY;\n } else if (!this.addKbPropertiesIsChecked && !this.exportAllIsChecked) {\n // only show objects\n return KB_OBJECT;\n }\n return \"none\"; // Applies if !this.addKbPropertiesIsChecked && this.exportAllIsChecked\n };\n\n private evaluateContentToDisplay = () => {\n // Nothing to display on the tree-view\n if (this.noObjects) {\n return this.renderMessage(true);\n }\n\n // The tree should be empty, because all filters are being applied.\n // Display a message to prevent a white screen.\n if (!this.addKbPropertiesIsChecked && this.exportAllIsChecked) {\n return this.renderMessage(false);\n }\n\n return (\n <ch-tree-view-render\n model={this.treeModel}\n dragDisabled={true}\n dropDisabled={true}\n toggleCheckboxes={true}\n checked={true}\n checkbox={true}\n filter={this.evaluateTreeViewFilters()}\n filterType={\n this.addKbPropertiesIsChecked && !this.exportAllIsChecked\n ? \"none\"\n : \"metadata\"\n }\n onCheckedItemsChange={this.objectsTreeCheckedItemsChangedHandler}\n ref={el => (this.objectsTreeEl = el as HTMLChTreeViewRenderElement)}\n show-lines=\"last\"\n class=\"tree-view\"\n ></ch-tree-view-render>\n );\n };\n\n private renderMessage = (nothingToDisplay: boolean) => {\n return (\n <gxg-text\n textAlign={config.gxgMessage.common.textAlign as TextAlign}\n padding={config.gxgMessage.common.textAlign as TextPadding}\n type={config.gxgMessage.common.type as TextType}\n maxWidth={config.gxgMessage.common.maxWidth}\n class=\"gx-ide-message gx-ide-message--short\"\n part=\"referenced-by-empty-status-message\"\n >\n {nothingToDisplay ? (\n [\n <span>{this._componentLocale.main.noObjectsToDisplay}</span>,\n <gxg-text\n type=\"text-link-no-line\"\n textAlign=\"center\"\n onClick={this.addObjectsCallbackHandler}\n >\n {this._componentLocale.main.beginByADdingSomeObjects}\n </gxg-text>\n ]\n ) : (\n <span>{this._componentLocale.main.exportAllMessage}</span>\n )}\n </gxg-text>\n );\n };\n\n private clearButtonDisabledConditions = (): boolean => {\n const checkedItems = this.treeModel.filter(item => {\n return item.checked;\n });\n return checkedItems.length === 0;\n };\n\n private loaderCancelCallbackHandler = async () => {\n this.cancelCallbackHandler();\n };\n\n private onClickCancelCallbackHandler = async () => {\n this.cancelCallbackHandler();\n };\n\n // 10.RENDER() FUNCTION //\n\n render(): void {\n return (\n <Host class=\"gx-ide-component\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"gx-ide-main-wrapper\">\n <gx-ide-container\n noContentPadding\n noHeadingPadding\n headingPaddingTop\n containerTitle={\n this.displayTitle ? this._componentLocale.componentName : null\n }\n slimmerFooter={config.gxIdeContainer.slimmerFooter}\n >\n <header slot=\"header\" class=\"header\">\n {/* header top */}\n <div class=\"header__top\">\n {/* export file name*/}\n <gxg-form-text\n class={{ \"select-file-input\": true }}\n value={this.fileName}\n part=\"xpz-file\"\n label={this._componentLocale.header.exportFileName}\n ref={el => (this.fileNameEl = el as HTMLGxgFormTextElement)}\n icon=\"gemini-tools/file\"\n iconPosition=\"start\"\n ></gxg-form-text>\n {/* export button / cancel button*/}\n <gxg-buttons-container\n reduced\n class=\"export-cancel-buttons-group\"\n >\n <gxg-button\n id=\"export-kb-btn\"\n part=\"export-btn\"\n onClick={this.exportCallbackHandler}\n disabled={this.noObjects}\n >\n {this._componentLocale.header.exportButton}\n </gxg-button>\n <gxg-button\n id=\"cancel-kb-export-btn\"\n part=\"cancel-button\"\n onClick={this.onClickCancelCallbackHandler}\n disabled={!this.exportingIsInProcess || this.noObjects}\n >\n {this._componentLocale.header.cancelButton}\n </gxg-button>\n </gxg-buttons-container>\n {/* settings/options button*/}\n <gxg-button\n type=\"secondary-icon-only\"\n icon=\"gemini-tools/settings\"\n part=\"select-kb-btn\"\n class={{ \"options-btn\": true }}\n onClick={this.optionsCallbackHandler}\n >\n {this._componentLocale.header.optionsButton}\n </gxg-button>\n </div>\n {/* header bottom */}\n <div class=\"header__bottom\">\n <div class={{ \"checkboxes-wrapper\": true }}>\n {/* checkboxes */}\n <gxg-form-checkbox\n label={\n this._componentLocale.main.addKnowledgeBaseDescription\n }\n onChange={this.addKBPropertiesCallbackHandler}\n part=\"add-kb-checkbox\"\n ></gxg-form-checkbox>\n <gxg-form-checkbox\n label={this._componentLocale.main.exportAll}\n part=\"export-all-checkbox\"\n ref={el =>\n (this.exportAllCheckboxEl =\n el as HTMLGxgFormCheckboxElement)\n }\n onChange={this.exportAllChangedHandler}\n ></gxg-form-checkbox>\n </div>\n </div>\n </header>\n\n {/* main */}\n\n <div\n class={{\n \"tree-container\": true,\n \"tree-container--empty\":\n this.noObjects ||\n (!this.noObjects &&\n this.exportAllIsChecked &&\n !this.addKbPropertiesIsChecked)\n // \"tree-container--export-all\": this.exportAllIsChecked\n }}\n >\n {this.evaluateContentToDisplay()}\n </div>\n\n {/* footer */}\n {/* clear 'button' */}\n <gxg-text\n type=\"button-like\"\n part=\"export-button\"\n slot=\"footer-start\"\n onClick={this.clearButtonHandler}\n disabled={this.clearButtonDisabledConditions()}\n >\n {this._componentLocale.footer.clearButton}\n </gxg-text>\n {/* references button */}\n <gxg-button\n onClick={this.addReferencesCallbackHandler}\n type=\"outlined-text-icon\"\n icon=\"general/references\"\n part=\"export-button\"\n class={{ \"cancel-btn\": true }}\n disabled={this.exportAllIsChecked}\n slot=\"footer-end\"\n >\n {this._componentLocale.footer.referencesButton}\n </gxg-button>\n {/* add button */}\n <gxg-button\n type=\"primary-text-icon\"\n icon=\"menus/new-object\"\n part=\"export-button\"\n class={{ \"cancel-btn\": true }}\n onClick={this.addObjectsCallbackHandler}\n disabled={this.exportAllIsChecked}\n slot=\"footer-end\"\n >\n {this._componentLocale.footer.addButton}\n </gxg-button>\n </gx-ide-container>\n </div>\n {this.loader && false ? (\n <gxg-ide-loader\n cancelLabel={this._componentLocale.loader.cancelLabel}\n container={this.el}\n loaderTitle={this._componentLocale.loader.title}\n ref={el => (this.loaderEl = el as HTMLGxgIdeLoaderElement)}\n cancelCallback={this.loaderCancelCallbackHandler}\n ></gxg-ide-loader>\n ) : null}\n </Host>\n );\n }\n}\n\n/* Kb Property*/\nexport type KBPropertiesCallback = () => Promise<KBPropertyData[]>;\nexport type KBPropertyData = {\n typeId: string;\n id: string;\n name: string;\n};\nexport type KBPropertyType = {\n id: string;\n icon: string;\n};\n\n/* Objects */\nexport type ObjectData = {\n typeId: string;\n id: string;\n name: string;\n};\n\n/* Callbacks*/\nexport type ExportFileDirectoryCallback = () => Promise<string>;\n\nexport type OptionsCallback = () => Promise<void>;\n\nexport type AddObjectsCallback = () => Promise<ObjectData[]>;\n\nexport type ExportCallback = (\n fileName: string,\n checkedKbPropertiesIds: string[],\n checkedObjectIds: string[]\n) => Promise<boolean>;\n\nexport type AddReferencesCallback = (\n objectIds: string[]\n) => Promise<ObjectData[]>;\n\nexport type CancelCallback = () => Promise<boolean>;\n"],"version":3}
1
+ {"file":"gx-ide-kb-manager-export.entry.js","mappings":"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","names":[],"sources":["src/components/kb-manager-export/helpers.ts","src/components/kb-manager-export/kb-manager-export.scss?tag=gx-ide-kb-manager-export&encapsulation=shadow","src/components/kb-manager-export/kb-manager-export.tsx"],"sourcesContent":["// /* Tree View */\nimport {\n TreeViewItemModel,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { ObjectData, KBPropertyData, KBPropertyType } from \"./types\";\nimport { ObjectType } from \"../../common/types\";\nexport const KB_PROPERTY = \"property\";\nexport const KB_OBJECT = \"object\";\n\nconst getPropertyIcon = (\n typeId: string,\n kbPropertiesTypes: KBPropertyType[]\n): string =>\n // The object icon has to be retrieved from the ObjectTypes array, by\n // matching the ObjectData typeId with the ObjectType id\n kbPropertiesTypes.find(propertyType => propertyType.id === typeId).icon;\n\nconst convertObjectTypeToTreeItem = (\n objectType: ObjectType\n): TreeViewItemModel => ({\n caption: objectType.name,\n id: objectType.id,\n startImgSrc: objectType.icon,\n leaf: false,\n parts: \"object-type tree-view-item\",\n expanded: true,\n items: []\n});\n\nconst convertObjectToTreeItem = (\n object: ObjectData,\n objectTypes: Map<string, ObjectType>\n): TreeViewItemModel => ({\n caption: object.name,\n id: object.id,\n startImgSrc: objectTypes.get(object.typeId).icon,\n parts: \"object tree-view-item\",\n metadata: KB_OBJECT,\n leaf: true\n});\n\nconst convertPropertyToTreeItem = (\n property: KBPropertyData,\n kbPropertiesTypes: KBPropertyType[]\n): TreeViewItemModel => ({\n caption: property.name,\n id: property.id,\n startImgSrc: getPropertyIcon(property.typeId, kbPropertiesTypes),\n parts: \"property tree-view-item\",\n metadata: KB_PROPERTY,\n leaf: true\n});\n\n/**\n * Updates the tree model with the provided objects.\n * Objects may already exist and are placed under their parent node.\n * If the parent node doesn't exist (identified by typeId on ObjectTypes),\n * it is created and added at the bottom.\n *\n * @param {ObjectData[] | undefined} objects - The array of objects to update.\n * @param {Map<string, ObjectType>} objectTypesMap - A map of object types by ID.\n * @param {Set<string>} objectsSet - A set of existing object IDs.\n * @param {TreeViewModel} actualTreeState - The current tree state to be updated.\n * @returns {TreeViewModel} - The updated tree view model.\n */\nexport const updateObjectsTreeModel = (\n objects: ObjectData[] | undefined,\n objectTypesMap: Map<string, ObjectType>,\n objectsSet: Set<string>,\n actualTreeState: TreeViewModel\n): TreeViewModel => {\n if (!objects) {\n return [...actualTreeState];\n }\n\n const updatedTreeData: TreeViewModel = [...actualTreeState];\n objects.forEach(object => {\n // objects that already exists in the actual actualTreeState should not be added.\n\n if (objectsSet.has(object.id)) {\n // object already exists\n return;\n }\n\n const objectTreeItem = convertObjectToTreeItem(object, objectTypesMap);\n\n // TODO: Improve the algorithm efficiency. This check visits potentially all nodes\n // from the TreeViewModel on each iteration. Using a Map to pre-store the TreeView\n // nodes would improve efficiency.\n const objectTypeTreeItemIndex = updatedTreeData.findIndex(\n treeItem => treeItem.id === object.typeId\n );\n\n if (objectTypeTreeItemIndex === -1) {\n // Create and add new object type tree item\n const objectType = objectTypesMap.get(object.typeId);\n if (objectType) {\n const objectTypeTreeItem = convertObjectTypeToTreeItem(objectType);\n objectTypeTreeItem.items.push(objectTreeItem);\n updatedTreeData.push(objectTypeTreeItem);\n }\n } else {\n // objectType exists already. insert object as children of the object type tree item.\n updatedTreeData[objectTypeTreeItemIndex].items.push(objectTreeItem);\n }\n\n objectsSet.add(object.id);\n });\n\n return updatedTreeData;\n};\n\n/**\n * Converts an array of KB properties data into tree item data for a tree view.\n *\n * @param {KBPropertyData[]} properties - The array of KB property data.\n * @param {KBPropertyType[]} kbPropertiesTypes - The array of KB property types.\n * @param {TreeViewModel} actualTreeState - The current state of the tree.\n * @returns {TreeViewModel} - The updated tree view item models.\n */\nexport const convertKbPropertiesDataToTreeItemData = (\n properties: KBPropertyData[],\n kbPropertiesTypes: KBPropertyType[],\n actualTreeState: TreeViewModel\n): TreeViewModel => {\n if (!properties) {\n return [...actualTreeState];\n }\n\n const updatedTreeData: TreeViewModel = [...actualTreeState];\n properties.forEach(property => {\n // properties have no parent node, and they should be added at the beginning of the tree\n const propertyAlreadyExists =\n updatedTreeData.find(node => node.id === property.id) !== undefined;\n if (propertyAlreadyExists) {\n return;\n }\n const propertyTreeItem = convertPropertyToTreeItem(\n property,\n kbPropertiesTypes\n );\n updatedTreeData.unshift(propertyTreeItem);\n });\n return updatedTreeData;\n};\n\n/**\n * Removes properties from the tree model.\n *\n * @param {TreeViewModel} actualTreeState - The current state of the tree,\n * containing various tree view items.\n * @returns {TreeViewModel} - A new array of tree view items that excludes\n * any items with metadata of type `KB_PROPERTY`.\n */\nexport const clearKbPropertiesFromTree = (\n actualTreeState: TreeViewModel\n): TreeViewModel =>\n actualTreeState.filter(item => item.metadata !== KB_PROPERTY);\n",".section {\n display: grid;\n block-size: 100%;\n grid-template:\n \"export-file-name buttons-container buttons-container buttons-container\" max-content\n \"checkboxes checkboxes checkboxes checkboxes\" max-content\n \"main main main main\" 1fr\n \"footer footer footer footer\" max-content\n / 1fr max-content max-content max-content;\n}\n\n.header {\n display: contents;\n\n .export-file-name {\n grid-area: export-file-name;\n }\n\n &__buttons-container {\n grid-area: buttons-container;\n display: flex;\n gap: var(\n --mer-spacing--sm\n ); //TODO : Should be using a semantic token like \"--buttons-container-gap\"\n }\n\n &__checkboxes {\n grid-area: checkboxes;\n grid-template-columns: max-content 1fr;\n }\n}\n\n.main {\n grid-area: main;\n position: relative;\n}\n\n.footer {\n grid-area: footer;\n justify-content: space-between;\n\n .clear-btn {\n margin-inline-end: auto;\n }\n}\n","import { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n\nimport { ChCheckboxCustomEvent } from \"@genexus/chameleon-controls-library\";\nimport {\n TreeViewItemModelExtended,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { MercuryBundles } from \"@genexus/mercury\";\n\nimport { Locale } from \"../../common/locale\";\nimport {\n updateObjectsTreeModel,\n convertKbPropertiesDataToTreeItemData,\n clearKbPropertiesFromTree\n} from \"./helpers\";\nimport { ObjectType } from \"../../common/types\";\n\nimport { KB_PROPERTY, KB_OBJECT } from \"./helpers\";\nimport {\n KBPropertiesCallback,\n KBPropertyData,\n KBPropertyType,\n ObjectData,\n ExportFileDirectoryCallback,\n OptionsCallback,\n AddObjectsCallback,\n ExportCallback,\n AddReferencesCallback,\n CancelCallback\n} from \"./types\";\n\nimport { getIconPath } from \"@genexus/mercury\";\n\nconst FILE_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"file\",\n colorType: \"on-elevation\"\n});\nconst SETTINGS_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"settings\",\n colorType: \"primary\"\n});\nconst GENERAL_REFERENCES_ICON = getIconPath({\n category: \"window-tools\",\n name: \"references\",\n colorType: \"neutral\"\n});\nconst MENUS_NEW_OBJECT_ICON = getIconPath({\n category: \"menus\",\n name: \"new-object\",\n colorType: \"on-primary\"\n});\nconst TREE_VIEW_ICON = getIconPath({\n category: \"controls\",\n name: \"treeview\"\n});\nconst CHECKBOX_CHECKED_VALUE = \"true\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"components/checkbox\",\n \"components/edit\",\n \"components/icon\",\n \"components/tree-view\",\n \"utils/form\",\n \"utils/layout\",\n \"utils/typography\"\n];\n@Component({\n tag: \"gx-ide-kb-manager-export\",\n styleUrl: \"kb-manager-export.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/kb-manager-export\"]\n})\nexport class GxIdeKbManagerExport {\n #addKbDescriptionEl!: HTMLChCheckboxElement;\n #componentLocale: any;\n #animateEmptyState: boolean = false;\n #exportAllEl!: HTMLChCheckboxElement;\n #fileNameEl!: HTMLChEditElement;\n #kBPropertiesData!: KBPropertyData[];\n /**\n * Stores the object types information (name, and icon)\n */\n // eslint-disable-next-line @stencil-community/own-props-must-be-private\n #objectTypesMap: Map<string, ObjectType> = new Map();\n /**\n * Stores the object's id that have been added.\n */\n // eslint-disable-next-line @stencil-community/own-props-must-be-private\n #objectsSet: Set<string> = new Set();\n\n @Element() el: HTMLGxIdeKbManagerExportElement;\n\n @State() addKbPropertiesIsChecked = false;\n @State() atLeastOnePropertyItemIsChecked = false;\n @State() atLeastOneObjectItemIsChecked = false;\n @State() checkedObjectsIds: string[] = [];\n @State() checkedPropertiesIds: string[] = [];\n @State() exportAllIsChecked = false;\n @State() exportingIsInProcess = false;\n @State() hasObjects: boolean;\n @State() objectsTreeViewModel: TreeViewModel = [];\n @Watch(\"objectsTreeViewModel\")\n objectsTreeViewModelChanged(newObjectsTreeViewModel: TreeViewModel) {\n this.hasObjects =\n newObjectsTreeViewModel && newObjectsTreeViewModel.length > 0;\n if (!this.hasObjects) {\n this.atLeastOnePropertyItemIsChecked = false;\n this.atLeastOneObjectItemIsChecked = false;\n }\n }\n\n /**\n * Callback invoked when the user wants to include KB properties.\n */\n @Prop() readonly addKBPropertiesCallback!: KBPropertiesCallback;\n\n /**\n * Callback invoked when the user wants to add objects.\n */\n @Prop() readonly addObjectsCallback!: AddObjectsCallback;\n\n /**\n *Callback invoked when the user wants to add all the references for the selected objects.\n *@param itemIds:string[] The selected item ids\n *@returns : Returns an object with the items and its references\n */\n @Prop() readonly addReferencesCallback!: AddReferencesCallback;\n\n /**\n * Callback invoked when the user wants to cancel the export process.\n * @returns It returns a boolean indicating whether the process could be canceled or not.\n */\n @Prop() readonly cancelCallback!: CancelCallback;\n\n /**\n *Callback invoked when the user wants to initiate the export process.\n *@param fileName:string\n *@param itemIds:string[] The selected item ids\n *@returns : It returns a boolean indicating whether the process was successful\n */\n @Prop() readonly exportCallback!: ExportCallback;\n\n /**\n * Callback invoked when the user wants to access the export options.\n */\n @Prop() readonly exportFileDirectoryCallback!: ExportFileDirectoryCallback;\n\n /**\n * It allows defining the default Export File Name\n */\n @Prop() readonly fileName: string;\n\n /**\n * Array with the possible types of KB properties\n */\n @Prop() readonly kbPropertiesTypes: KBPropertyType[];\n\n /**\n * If true, it will display a loader when needed.\n */\n @Prop() readonly loader = false;\n\n /**\n * Array of possible object types\n */\n @Prop() readonly objectTypes: ObjectType[];\n @Watch(\"objectTypes\")\n objectTypesChanged(newObjectTypesArray: ObjectType[]) {\n this.#objectsTypesArrayToMap(newObjectTypesArray);\n }\n\n /**\n * Callback invoked when the user wants to access the export options.\n */\n @Prop() readonly optionsCallback: OptionsCallback;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.#evaluateObjects();\n this.#objectsTypesArrayToMap(this.objectTypes);\n }\n\n #addKBPropertiesCallbackHandler = async (\n e: ChCheckboxCustomEvent<any> | InputEvent\n ) => {\n this.addKbPropertiesIsChecked =\n e.detail.target.value === CHECKBOX_CHECKED_VALUE;\n if (this.addKbPropertiesIsChecked) {\n this.#kBPropertiesData = await this.addKBPropertiesCallback();\n if (this.#kBPropertiesData.length) {\n this.objectsTreeViewModel = convertKbPropertiesDataToTreeItemData(\n this.#kBPropertiesData,\n this.kbPropertiesTypes,\n this.objectsTreeViewModel\n );\n }\n } else {\n // previous properties (if any) should be removed\n this.objectsTreeViewModel = clearKbPropertiesFromTree(\n this.objectsTreeViewModel\n );\n }\n };\n\n #addObjectsCallbackHandler = async () => {\n this.#exportAllEl.value = undefined;\n this.exportAllIsChecked = false;\n const addedObjects = await this.addObjectsCallback();\n this.#updateObjects(addedObjects);\n };\n\n #addReferencesCallbackHandler = async () => {\n const objects: ObjectData[] = await this.addReferencesCallback(\n this.checkedObjectsIds\n );\n this.#updateObjects(objects);\n };\n\n #cancelCallbackHandler = async () => {\n const cancelled = await this.cancelCallback();\n if (cancelled) {\n this.exportingIsInProcess = false;\n }\n };\n\n #clearButtonHandler = () => {\n this.objectsTreeViewModel = [];\n this.#objectsSet.clear();\n this.#addKbDescriptionEl.value = undefined;\n this.#exportAllEl.value = undefined;\n };\n\n #evaluateContentToDisplay = () => {\n // Nothing to display on the tree-view\n if (!this.hasObjects && !this.exportAllIsChecked) {\n return (\n <gx-ide-empty-state\n isAnimated={this.#animateEmptyState}\n stateTitle={this.#componentLocale.main.noObjectsToDisplay}\n key=\"no-objects-empty-state\"\n >\n <button\n class=\"button-primary\"\n onClick={this.#addObjectsCallbackHandler}\n >\n {this.#componentLocale.main.beginByADdingSomeObjects}\n </button>\n </gx-ide-empty-state>\n );\n } else {\n this.#animateEmptyState = true; // improve performance if is first render\n }\n\n if (this.exportAllIsChecked) {\n return (\n <gx-ide-empty-state\n isAnimated={this.#animateEmptyState}\n stateIconSrc={TREE_VIEW_ICON}\n stateTitle={this.#componentLocale.main.exportAllMessage}\n key=\"exporting-all-empty-state\"\n ></gx-ide-empty-state>\n );\n } else {\n this.#animateEmptyState = true; // improve performance if is first render\n }\n\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n checkbox\n checked\n dragDisabled\n dropDisabled\n filter={this.#evaluateTreeViewFilters()}\n filterType={\n this.addKbPropertiesIsChecked && !this.exportAllIsChecked\n ? \"none\"\n : \"metadata\"\n }\n model={this.objectsTreeViewModel}\n showLines=\"last\"\n toggleCheckboxes\n sortItemsCallback={this.#sortTreeItems}\n onCheckedItemsChange={this.#objectsTreeCheckedItemsChangedHandler}\n ></ch-tree-view-render>\n );\n };\n\n #evaluateObjects = () => {\n this.hasObjects =\n this.objectsTreeViewModel && this.objectsTreeViewModel.length > 0;\n };\n\n #evaluateTreeViewFilters = (): string => {\n if (this.addKbPropertiesIsChecked && this.exportAllIsChecked) {\n return KB_PROPERTY; // only show properties\n }\n if (!this.addKbPropertiesIsChecked && !this.exportAllIsChecked) {\n return KB_OBJECT; // only show objects\n }\n return \"none\";\n };\n\n #exportAllChangedHandler = (\n event: ChCheckboxCustomEvent<any> | InputEvent\n ) => {\n this.exportAllIsChecked = event.detail.target.value !== \"undefined\";\n };\n\n #exportCallbackHandler = async () => {\n this.exportingIsInProcess = true;\n const fileName: string = this.#fileNameEl.value;\n const checkedKbPropertiesIds = this.addKbPropertiesIsChecked\n ? this.checkedPropertiesIds\n : [];\n const checkedObjectIds = this.exportAllIsChecked\n ? undefined\n : this.checkedObjectsIds;\n this.exportCallback(\n fileName,\n checkedKbPropertiesIds,\n checkedObjectIds\n ).then(() => {\n this.exportingIsInProcess = false;\n });\n // returns Promise<boolean> but no procedure was detailed on the spec.\n };\n\n #objectsTypesArrayToMap(objectTypesArray: ObjectType[]) {\n objectTypesArray.forEach(objectType => {\n this.#objectTypesMap.set(objectType.id, objectType);\n });\n }\n\n #objectsTreeCheckedItemsChangedHandler = (\n event: CustomEvent<Map<string, TreeViewItemModelExtended>>\n ) => {\n // filter 'checked objects' and 'checked properties' ids\n const checkedObjectsIds: string[] = [];\n const checkedPropertiesIds: string[] = [];\n const allItemsWithCheckbox = [...event.detail.values()];\n allItemsWithCheckbox.forEach(node => {\n if (node.item.checked && node.item.metadata === KB_OBJECT) {\n checkedObjectsIds.push(node.item.id);\n } else if (node.item.checked && node.item.metadata === KB_PROPERTY) {\n checkedPropertiesIds.push(node.item.id);\n }\n });\n this.checkedObjectsIds = checkedObjectsIds;\n this.checkedPropertiesIds = checkedPropertiesIds;\n\n this.atLeastOnePropertyItemIsChecked = this.checkedPropertiesIds.length > 0;\n this.atLeastOneObjectItemIsChecked = this.checkedObjectsIds.length > 0;\n };\n\n #sortTreeItems = (subModel: TreeViewModel) => {\n // \"property\" items should be added on top.\n // else sort alphabetically by \"caption\" value.\n return subModel.sort((a, b) => {\n if (a.metadata === \"property\" && b.metadata !== \"property\") {\n return -1;\n }\n if (b.metadata === \"property\" && a.metadata !== \"property\") {\n return 1;\n }\n\n return a.caption.localeCompare(b.caption);\n });\n };\n\n #renderFooter = (): HTMLElement => {\n const referencesButtonEnabled = this.atLeastOneObjectItemIsChecked;\n const clearButtonEnabled = this.objectsTreeViewModel.length > 0;\n return (\n <footer class=\"footer control-footer-with-border\">\n <button\n class=\"button-tertiary clear-btn\"\n disabled={!clearButtonEnabled}\n part=\"clear-button\"\n onClick={clearButtonEnabled && this.#clearButtonHandler}\n >\n {this.#componentLocale.footer.clearButton}\n </button>\n\n <button\n class=\"button-secondary button-icon-and-text\"\n part=\"references-button\"\n disabled={!referencesButtonEnabled}\n onClick={\n referencesButtonEnabled && this.#addReferencesCallbackHandler\n }\n >\n <ch-image\n class=\"icon-sm\"\n disabled={!referencesButtonEnabled}\n src={GENERAL_REFERENCES_ICON}\n ></ch-image>\n {this.#componentLocale.footer.addReferencesButton}\n </button>\n\n <button\n // Add button\n class=\"button-primary button-icon-and-text\"\n disabled={this.exportAllIsChecked}\n part=\"add-button\"\n onClick={!this.exportAllIsChecked && this.#addObjectsCallbackHandler}\n >\n <ch-image\n class=\"icon-sm\"\n disabled={this.exportAllIsChecked}\n src={MENUS_NEW_OBJECT_ICON}\n ></ch-image>\n {this.#componentLocale.footer.addButton}\n </button>\n </footer>\n );\n };\n\n #updateObjects = (objectsDataArray: ObjectData[]) => {\n if (objectsDataArray.length) {\n const newObjectsTreeModel = updateObjectsTreeModel(\n objectsDataArray,\n this.#objectTypesMap,\n this.#objectsSet,\n this.objectsTreeViewModel\n );\n this.objectsTreeViewModel = newObjectsTreeModel;\n }\n };\n\n render(): void {\n const exportButtonEnabled =\n this.atLeastOnePropertyItemIsChecked ||\n this.atLeastOneObjectItemIsChecked ||\n this.exportAllIsChecked;\n\n const cancelButtonEnabled = this.exportingIsInProcess;\n\n return (\n <Host class=\"spacing-body-block-start spacing-body-inline\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n\n <section class=\"section field-group\">\n <header class=\"header\">\n <div class=\"field field-inline export-file-name\">\n <label class=\"label\" htmlFor=\"xpz-file\">\n {this.#componentLocale.header.exportFileName}\n </label>\n <ch-edit\n autoFocus\n id=\"xpz-file\"\n class=\"form-input\"\n part=\"xpz-file\"\n value={this.fileName}\n startImgSrc={FILE_ICON}\n ref={(el: HTMLChEditElement) =>\n (this.#fileNameEl = el as HTMLChEditElement)\n }\n ></ch-edit>\n </div>\n\n <div class=\"header__buttons-container\">\n <button\n id=\"export-kb-btn\"\n class=\"button-primary export-btn\"\n part=\"export-btn\"\n disabled={!exportButtonEnabled}\n onClick={exportButtonEnabled && this.#exportCallbackHandler}\n >\n {this.#componentLocale.header.exportButton}\n </button>\n <button\n id=\"cancel-kb-export-btn\"\n class=\"button-secondary cancel-btn\"\n part=\"cancel-button\"\n disabled={!cancelButtonEnabled}\n onClick={cancelButtonEnabled && this.#cancelCallbackHandler}\n >\n {this.#componentLocale.header.cancelButton}\n </button>\n\n <button\n aria-label={this.#componentLocale.header.optionsButton}\n title={this.#componentLocale.header.optionsButton}\n class=\"button-tertiary button-icon-only options-btn\"\n part=\"select-kb-btn\"\n onClick={this.optionsCallback}\n >\n <ch-image class=\"icon-md\" src={SETTINGS_ICON}></ch-image>\n </button>\n </div>\n\n <div class=\"header__checkboxes field-group\">\n <ch-checkbox\n class=\"checkbox add-kb-description\"\n part=\"add-kb-description\"\n caption={this.#componentLocale.main.addKnowledgeBaseDescription}\n checkedValue={CHECKBOX_CHECKED_VALUE}\n onInput={this.#addKBPropertiesCallbackHandler}\n ref={(el: HTMLChCheckboxElement) =>\n (this.#addKbDescriptionEl = el as HTMLChCheckboxElement)\n }\n ></ch-checkbox>\n\n <ch-checkbox\n class=\"checkbox export-all\"\n part=\"export-all-checkbox\"\n checkedValue={CHECKBOX_CHECKED_VALUE}\n caption={this.#componentLocale.main.exportAll}\n onInput={this.#exportAllChangedHandler}\n ref={(el: HTMLChCheckboxElement) =>\n (this.#exportAllEl = el as HTMLChCheckboxElement)\n }\n ></ch-checkbox>\n </div>\n </header>\n\n <div class=\"main\">\n {this.#evaluateContentToDisplay()}\n {this.loader && this.exportingIsInProcess && (\n <gx-ide-loader\n cancelLabel={this.#componentLocale.loader.cancelLabel}\n loaderTitle={this.#componentLocale.loader.title}\n cancelCallback={this.#cancelCallbackHandler}\n show\n class=\"loader\"\n ></gx-ide-loader>\n )}\n </div>\n\n {this.#renderFooter()}\n </section>\n </Host>\n );\n }\n}\n"],"version":3}
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, c as createEvent, h, H as Host } from './index-27c691bc.js';
2
2
 
3
- const ideLoaderCss = ".loader__wrapper{position:absolute;border:none;opacity:0;transition:var(--show-transition) opacity;inline-size:100%;block-size:100%;display:flex;background-color:var(--gxg-ide-loader-wrapper__background-color--from);backdrop-filter:var(--gxg-ide-loader-wrapper__backdrop-filter);padding:var(--gxg-ide-loader-wrapper__padding);flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;color:var(--gxg-ide-loader-wrapper__color);z-index:99}.loader__wrapper--visible{opacity:1}.loader__spinner{border:var(--gxg-ide-loader-spinner__border);border-block-start:var(--gxg-ide-loader-spinner__border-top);border-radius:50%;animation:spinner 0.6s infinite linear;inline-size:var(--gxg-ide-loader-spinner__width);block-size:var(--gxg-ide-loader-spinner__width);flex-shrink:0;opacity:1}.loader__content-wrapper{display:flex;text-align:center;flex-direction:column;margin-block-start:var(--gxg-ide-loader-content-wrapper__mbs);gap:var(--mer-spacing--xs);max-block-size:var(--gxg-ide-loader-content-wrapper__max-width);animation:fadeIn var(--mer-timing--fast) forwards;opacity:1}.loader__content-wrapper--hidden{display:none}@keyframes wrapper{0%{background-color:var(--gxg-ide-loader-wrapper__background-color--from)}100%{background-color:var(--gxg-ide-loader-wrapper__background-color--to)}}@keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}:host([display-border]) .loader__wrapper{border:1px solid var(--mer-color__elevation--02)}@keyframes fadeIn{0%{opacity:0}}";
3
+ const ideLoaderCss = ".loader__wrapper{position:absolute;border:none;opacity:0;transition:var(--show-transition) opacity;inline-size:100%;block-size:100%;display:flex;background-color:var(--gxg-ide-loader-wrapper__background-color--from);backdrop-filter:var(--gxg-ide-loader-wrapper__backdrop-filter);padding:var(--gxg-ide-loader-wrapper__padding);flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;color:var(--gxg-ide-loader-wrapper__color);z-index:99;animation:fadeIn var(--mer-timing--fast) forwards}.loader__wrapper--visible{opacity:1}.loader__spinner{border:var(--gxg-ide-loader-spinner__border);border-block-start:var(--gxg-ide-loader-spinner__border-top);border-radius:50%;animation:spinner 0.6s infinite linear;inline-size:var(--gxg-ide-loader-spinner__width);block-size:var(--gxg-ide-loader-spinner__width);flex-shrink:0;opacity:1}.loader__content-wrapper{display:flex;text-align:center;flex-direction:column;margin-block-start:var(--gxg-ide-loader-content-wrapper__mbs);gap:var(--mer-spacing--md);max-block-size:var(--gxg-ide-loader-content-wrapper__max-width);opacity:1}.loader__content-wrapper--hidden{display:none}@keyframes wrapper{0%{background-color:var(--gxg-ide-loader-wrapper__background-color--from)}100%{background-color:var(--gxg-ide-loader-wrapper__background-color--to)}}@keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}:host([display-border]) .loader__wrapper{border:1px solid var(--mer-color__elevation--02)}@keyframes fadeIn{0%{opacity:0}}";
4
4
 
5
5
  var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) {
6
6
  if (kind === "a" && !f)
@@ -1 +1 @@
1
- {"file":"gx-ide-loader.entry.js","mappings":";;AAAA,MAAM,YAAY,GAAG,o+CAAo+C;;;;;;;;;;ACYz/C,MAAM,WAAW,GAAmB;IAClC,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;CACnB,CAAC;MAMW,SAAS;;;;QACpB,8CAAiD;QA+CjD,mCAAiB;YACf,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB,IAAI,CAAC,cAAc,EAAE,CAAC;aACvB;YACD,YAAY,CAAC,uBAAA,IAAI,mCAAkB,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;SACnB,EAAC;QAEF,wCAAsB,MACpB,IAAI,CAAC,WAAW,KACd,eACE,cACE,KAAK,EAAC,kBAAkB,EACxB,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,uBAAA,IAAI,gCAAe,IAE3B,IAAI,CAAC,WAAW,CACV,CACL,CACP,EAAC;QAEJ,uCAAqB,MACnB,IAAI,CAAC,WAAW,IAAI,SAAG,KAAK,EAAC,oBAAoB,IAAE,IAAI,CAAC,WAAW,CAAK,EAAC;QAE3E,iCAAe,MACb,IAAI,CAAC,WAAW,IAAI,SAAG,KAAK,EAAC,qBAAqB,IAAE,IAAI,CAAC,WAAW,CAAK,EAAC;2BAnErD,IAAI;yBAKU,CAAC,GAAG,EAAE,GAAG,IAAI;;;;6BAoBS,KAAK;;oBAUhC,KAAK;;IAkCrC,MAAM;QACJ,QACE,EAAC,IAAI,QACH,gBAAU,KAAK,EAAE,WAAW,GAAa,EACxC,IAAI,CAAC,IAAI,KACR,WACE,KAAK,EAAE;gBACL,CAAC,iBAAiB,GAAG,IAAI;gBACzB,0BAA0B,EAAE,IAAI,CAAC,WAAW;aAC7C,EACD,IAAI,EAAC,gBAAgB,EACrB,OAAO,EAAC,EAAE,IAEV,WAAK,KAAK,EAAC,iBAAiB,GAAO,EACnC,WACE,KAAK,EAAE;gBACL,yBAAyB,EAAE,IAAI;gBAC/B,iCAAiC,EAC/B,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;aAC9D,IAEA,uBAAA,IAAI,8BAAa,MAAjB,IAAI,CAAe,EACnB,uBAAA,IAAI,oCAAmB,MAAvB,IAAI,CAAqB,EACzB,uBAAA,IAAI,qCAAoB,MAAxB,IAAI,CAAsB,CACvB,CACF,CACP,CACI,EACP;KACH;;;;;;;","names":[],"sources":["src/components/_helpers/ide-loader/ide-loader.scss?tag=gx-ide-loader&encapsulation=shadow","src/components/_helpers/ide-loader/ide-loader.tsx"],"sourcesContent":["$animation: fadeIn var(--mer-timing--fast) forwards;\n\n.loader {\n &__wrapper {\n position: absolute;\n border: none;\n opacity: 0;\n transition: var(--show-transition) opacity;\n inline-size: 100%;\n block-size: 100%;\n display: flex;\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n backdrop-filter: var(--gxg-ide-loader-wrapper__backdrop-filter);\n padding: var(--gxg-ide-loader-wrapper__padding);\n flex-direction: column;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n color: var(--gxg-ide-loader-wrapper__color);\n z-index: 99; // WA to prevent tree-view chevron arrow to appear above.\n\n &--visible {\n opacity: 1;\n }\n }\n &__spinner {\n border: var(--gxg-ide-loader-spinner__border);\n border-block-start: var(--gxg-ide-loader-spinner__border-top);\n border-radius: 50%;\n animation: spinner 0.6s infinite linear;\n inline-size: var(--gxg-ide-loader-spinner__width);\n block-size: var(--gxg-ide-loader-spinner__width);\n flex-shrink: 0;\n opacity: 1;\n }\n\n &__content-wrapper {\n display: flex;\n text-align: center;\n flex-direction: column;\n margin-block-start: var(--gxg-ide-loader-content-wrapper__mbs);\n gap: var(--mer-spacing--xs);\n max-block-size: var(--gxg-ide-loader-content-wrapper__max-width);\n &--hidden {\n display: none;\n }\n animation: $animation;\n opacity: 1;\n }\n}\n\n/*background color animation*/\n@keyframes wrapper {\n 0% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n }\n 100% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--to);\n }\n}\n@keyframes spinner {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(359deg);\n }\n}\n\n:host([display-border]) {\n .loader {\n &__wrapper {\n border: 1px solid var(--mer-color__elevation--02);\n }\n }\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Event,\n EventEmitter\n} from \"@stencil/core\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"utils/typography\"\n];\n@Component({\n tag: \"gx-ide-loader\",\n styleUrl: \"ide-loader.scss\",\n shadow: true\n})\nexport class IdeLoader {\n #timeoutReference: ReturnType<typeof setTimeout>;\n\n /**\n * shows the '.loader-wrapper'\n */\n @State() showWrapper = true;\n\n /**\n * The time the loader will await before abort.\n */\n @Prop() readonly abortTime: number = 5 * 60 * 1000; // 5 minutes\n\n /**\n * The cancel callback\n */\n @Prop() readonly cancelCallback: IdeLoaderCancelCallback;\n\n /**\n * The cancel button label (optional)\n */\n @Prop() readonly cancelLabel: string;\n\n /**\n * The loader description (optional)\n */\n @Prop() readonly description: string;\n\n /**\n * Displays a border all around\n */\n @Prop({ reflect: true }) readonly displayBorder: boolean = false;\n\n /**\n * The loader title (optional)\n */\n @Prop() readonly loaderTitle: string;\n\n /**\n * It shows the loader\n */\n @Prop({ mutable: true }) show = false;\n\n /**\n * This event is emitted when \"show\" is false.\n */\n @Event() loaderFinished: EventEmitter<void>;\n\n #cancelProcess = (): void => {\n if (this.cancelCallback) {\n this.cancelCallback();\n }\n clearTimeout(this.#timeoutReference);\n this.show = false;\n };\n\n #renderCancelButton = (): HTMLButtonElement | null =>\n this.cancelLabel && (\n <div>\n <button\n class=\"button-secondary\"\n type=\"button\"\n onClick={this.#cancelProcess}\n >\n {this.cancelLabel}\n </button>\n </div>\n );\n\n #renderDescription = (): HTMLParagraphElement | null =>\n this.description && <p class=\"text-body-italic-s\">{this.description}</p>;\n\n #renderTitle = (): HTMLParagraphElement | null =>\n this.loaderTitle && <p class=\"text-body-regular-m\">{this.loaderTitle}</p>;\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n {this.show && (\n <div\n class={{\n [`loader__wrapper`]: true,\n \"loader__wrapper--visible\": this.showWrapper\n }}\n part=\"loader-wrapper\"\n popover=\"\"\n >\n <div class=\"loader__spinner\"></div>\n <div\n class={{\n \"loader__content-wrapper\": true,\n \"loader__content-wrapper--hidden\":\n !this.description && !this.loaderTitle && !this.cancelLabel\n }}\n >\n {this.#renderTitle()}\n {this.#renderDescription()}\n {this.#renderCancelButton()}\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n\nexport type IdeLoaderCancelCallback = () => void;\n"],"version":3}
1
+ {"file":"gx-ide-loader.entry.js","mappings":";;AAAA,MAAM,YAAY,GAAG,o+CAAo+C;;;;;;;;;;ACYz/C,MAAM,WAAW,GAAmB;IAClC,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;CACnB,CAAC;MAMW,SAAS;;;;QACpB,8CAAiD;QA+CjD,mCAAiB;YACf,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB,IAAI,CAAC,cAAc,EAAE,CAAC;aACvB;YACD,YAAY,CAAC,uBAAA,IAAI,mCAAkB,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;SACnB,EAAC;QAEF,wCAAsB,MACpB,IAAI,CAAC,WAAW,KACd,eACE,cACE,KAAK,EAAC,kBAAkB,EACxB,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,uBAAA,IAAI,gCAAe,IAE3B,IAAI,CAAC,WAAW,CACV,CACL,CACP,EAAC;QAEJ,uCAAqB,MACnB,IAAI,CAAC,WAAW,IAAI,SAAG,KAAK,EAAC,oBAAoB,IAAE,IAAI,CAAC,WAAW,CAAK,EAAC;QAE3E,iCAAe,MACb,IAAI,CAAC,WAAW,IAAI,SAAG,KAAK,EAAC,qBAAqB,IAAE,IAAI,CAAC,WAAW,CAAK,EAAC;2BAnErD,IAAI;yBAKU,CAAC,GAAG,EAAE,GAAG,IAAI;;;;6BAoBS,KAAK;;oBAUhC,KAAK;;IAkCrC,MAAM;QACJ,QACE,EAAC,IAAI,QACH,gBAAU,KAAK,EAAE,WAAW,GAAa,EACxC,IAAI,CAAC,IAAI,KACR,WACE,KAAK,EAAE;gBACL,CAAC,iBAAiB,GAAG,IAAI;gBACzB,0BAA0B,EAAE,IAAI,CAAC,WAAW;aAC7C,EACD,IAAI,EAAC,gBAAgB,EACrB,OAAO,EAAC,EAAE,IAEV,WAAK,KAAK,EAAC,iBAAiB,GAAO,EACnC,WACE,KAAK,EAAE;gBACL,yBAAyB,EAAE,IAAI;gBAC/B,iCAAiC,EAC/B,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;aAC9D,IAEA,uBAAA,IAAI,8BAAa,MAAjB,IAAI,CAAe,EACnB,uBAAA,IAAI,oCAAmB,MAAvB,IAAI,CAAqB,EACzB,uBAAA,IAAI,qCAAoB,MAAxB,IAAI,CAAsB,CACvB,CACF,CACP,CACI,EACP;KACH;;;;;;;","names":[],"sources":["src/components/_helpers/ide-loader/ide-loader.scss?tag=gx-ide-loader&encapsulation=shadow","src/components/_helpers/ide-loader/ide-loader.tsx"],"sourcesContent":[".loader {\n &__wrapper {\n position: absolute;\n border: none;\n opacity: 0;\n transition: var(--show-transition) opacity;\n inline-size: 100%;\n block-size: 100%;\n display: flex;\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n backdrop-filter: var(--gxg-ide-loader-wrapper__backdrop-filter);\n padding: var(--gxg-ide-loader-wrapper__padding);\n flex-direction: column;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n color: var(--gxg-ide-loader-wrapper__color);\n z-index: 99; // WA to prevent tree-view chevron arrow to appear above.\n animation: fadeIn var(--mer-timing--fast) forwards;\n\n &--visible {\n opacity: 1;\n }\n }\n &__spinner {\n border: var(--gxg-ide-loader-spinner__border);\n border-block-start: var(--gxg-ide-loader-spinner__border-top);\n border-radius: 50%;\n animation: spinner 0.6s infinite linear;\n inline-size: var(--gxg-ide-loader-spinner__width);\n block-size: var(--gxg-ide-loader-spinner__width);\n flex-shrink: 0;\n opacity: 1;\n }\n\n &__content-wrapper {\n display: flex;\n text-align: center;\n flex-direction: column;\n margin-block-start: var(--gxg-ide-loader-content-wrapper__mbs);\n gap: var(--mer-spacing--md);\n max-block-size: var(--gxg-ide-loader-content-wrapper__max-width);\n &--hidden {\n display: none;\n }\n opacity: 1;\n }\n}\n\n/*background color animation*/\n@keyframes wrapper {\n 0% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n }\n 100% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--to);\n }\n}\n@keyframes spinner {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(359deg);\n }\n}\n\n:host([display-border]) {\n .loader {\n &__wrapper {\n border: 1px solid var(--mer-color__elevation--02);\n }\n }\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Event,\n EventEmitter\n} from \"@stencil/core\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"utils/typography\"\n];\n@Component({\n tag: \"gx-ide-loader\",\n styleUrl: \"ide-loader.scss\",\n shadow: true\n})\nexport class IdeLoader {\n #timeoutReference: ReturnType<typeof setTimeout>;\n\n /**\n * shows the '.loader-wrapper'\n */\n @State() showWrapper = true;\n\n /**\n * The time the loader will await before abort.\n */\n @Prop() readonly abortTime: number = 5 * 60 * 1000; // 5 minutes\n\n /**\n * The cancel callback\n */\n @Prop() readonly cancelCallback: IdeLoaderCancelCallback;\n\n /**\n * The cancel button label (optional)\n */\n @Prop() readonly cancelLabel: string;\n\n /**\n * The loader description (optional)\n */\n @Prop() readonly description: string;\n\n /**\n * Displays a border all around\n */\n @Prop({ reflect: true }) readonly displayBorder: boolean = false;\n\n /**\n * The loader title (optional)\n */\n @Prop() readonly loaderTitle: string;\n\n /**\n * It shows the loader\n */\n @Prop({ mutable: true }) show = false;\n\n /**\n * This event is emitted when \"show\" is false.\n */\n @Event() loaderFinished: EventEmitter<void>;\n\n #cancelProcess = (): void => {\n if (this.cancelCallback) {\n this.cancelCallback();\n }\n clearTimeout(this.#timeoutReference);\n this.show = false;\n };\n\n #renderCancelButton = (): HTMLButtonElement | null =>\n this.cancelLabel && (\n <div>\n <button\n class=\"button-secondary\"\n type=\"button\"\n onClick={this.#cancelProcess}\n >\n {this.cancelLabel}\n </button>\n </div>\n );\n\n #renderDescription = (): HTMLParagraphElement | null =>\n this.description && <p class=\"text-body-italic-s\">{this.description}</p>;\n\n #renderTitle = (): HTMLParagraphElement | null =>\n this.loaderTitle && <p class=\"text-body-regular-m\">{this.loaderTitle}</p>;\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n {this.show && (\n <div\n class={{\n [`loader__wrapper`]: true,\n \"loader__wrapper--visible\": this.showWrapper\n }}\n part=\"loader-wrapper\"\n popover=\"\"\n >\n <div class=\"loader__spinner\"></div>\n <div\n class={{\n \"loader__content-wrapper\": true,\n \"loader__content-wrapper--hidden\":\n !this.description && !this.loaderTitle && !this.cancelLabel\n }}\n >\n {this.#renderTitle()}\n {this.#renderDescription()}\n {this.#renderCancelButton()}\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n\nexport type IdeLoaderCancelCallback = () => void;\n"],"version":3}
@@ -26,7 +26,7 @@ var _GxIdeRecentNews_NEWS_ITEM_CLASS_SELECTOR, _GxIdeRecentNews_newsRendered, _G
26
26
  const NEWS_ICON = getIconPath({
27
27
  category: "system",
28
28
  name: "news",
29
- colorType: "on-surface"
29
+ colorType: "on-elevation"
30
30
  });
31
31
  const CSS_BUNDLES = [
32
32
  "resets/box-sizing",
@@ -1 +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@include hiChar();\n\n:host(.empty) {\n overflow: hidden !important; // WA to avoid scrollbar \"flickering\"\n}\n.news-container {\n display: grid;\n gap: var(--mer-spacing--xs);\n grid-auto-rows: max-content;\n // padding-inline-end: var(--mer-spacing--xs);\n}\n.news-item {\n opacity: 0;\n transition: 150ms opacity;\n\n &.visible {\n opacity: 1;\n }\n}\n.card-news {\n display: flex;\n flex-direction: column;\n align-items: start;\n gap: var(--mer-spacing--xs);\n\n &__header {\n display: flex;\n gap: var(--mer-spacing--sm);\n align-items: center;\n }\n}\n\ngx-ide-loader::part(loader-wrapper) {\n border: var(--mer-border__width--sm) solid\n var(--mer-border-color__on-elevation--01);\n border-radius: var(--mer-border__radius--md);\n}\n\n.text-link {\n color: var(--mer-accent__primary);\n\n &:hover {\n text-decoration: underline;\n }\n}\n","import { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { hiChar } from \"../../common/helpers\";\nimport { NewsData, GetNewsCallback, OpenNewsCallback } from \"./start-page\";\n\nconst NEWS_ICON = getIconPath({\n category: \"system\",\n name: \"news\",\n colorType: \"on-surface\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"components/icon\",\n \"utils/typography\",\n \"utils/layout\",\n \"chameleon/scrollbar\"\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 /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n\n #NEWS_ITEM_CLASS_SELECTOR = \"news-item\";\n #newsRendered = false;\n #setTimeOutNewsDelay = 75;\n\n @Element() el: HTMLGxIdeRecentNewsElement;\n\n #newsContainerEl: HTMLDivElement;\n\n /**\n * The list of news after the filter\n */\n @State() filteredNews: NewsData[] = [];\n\n /**\n * True if news are being requested\n */\n @State() loadingNews = true;\n\n /**\n * The list of news\n */\n @State() news: NewsData[] = [];\n @Watch(\"news\")\n newsChanged(news: NewsData[]) {\n this.#refreshFilteredNews(this.filterValue, news);\n this.#displayNews();\n }\n\n /**\n * True if news couldn't be loaded\n */\n @State() newsLoadFailed = false;\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 /**\n * The news filter value inserted by the user on the news input filter\n */\n @Prop() readonly filterValue: string = \"\";\n @Watch(\"filterValue\")\n watchNews(newFilterValue: string) {\n this.#refreshFilteredNews(newFilterValue, this.news);\n }\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidRender() {\n this.#evaluateNewsDisplay();\n }\n\n componentDidLoad() {\n this.#getNews();\n }\n\n #displayNews = () => {\n if (this.#newsContainerEl !== undefined) {\n const news = Array.from(\n this.#newsContainerEl.querySelectorAll(\n `.${this.#NEWS_ITEM_CLASS_SELECTOR}`\n )\n );\n news.forEach(news => {\n // display news with a cascade effect\n setTimeout(() => {\n news.classList.add(\"visible\");\n }, this.#setTimeOutNewsDelay);\n this.#setTimeOutNewsDelay += 45;\n });\n }\n };\n\n #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 #evaluateNewsRender = (): HTMLElement => {\n if (this.newsLoadFailed) {\n return (\n <gx-ide-empty-state\n stateIconSrc={NEWS_ICON}\n stateTitle={this._componentLocale.recentNews.newsNotFetched.title}\n >\n <button\n class=\"empty-state__button button-primary\"\n onClick={this.#getNews}\n >\n {\n this._componentLocale.recentNews.newsNotFetched\n .tryAgainButtonLabel\n }\n </button>\n <a\n class=\"text-link text-body-regular-s\"\n href={this._componentLocale.recentNews.newsNotFetched.onlineNewsURL}\n target=\"_blank\"\n >\n {this._componentLocale.recentNews.newsNotFetched.readThemOnline}\n </a>\n </gx-ide-empty-state>\n );\n }\n if (this.news.length === 0) {\n return (\n <gx-ide-empty-state\n stateIconSrc={NEWS_ICON}\n stateTitle={this._componentLocale.recentNews.noNewsToDisplay.title}\n >\n <a\n class=\"empty-state__link text-body-regular-s\"\n href={this._componentLocale.recentNews.onlineNewsURL}\n target=\"_blank\"\n >\n {this._componentLocale.recentNews.readThemOnline}\n </a>\n </gx-ide-empty-state>\n );\n }\n if (this.filteredNews?.length === 0) {\n return (\n <gx-ide-empty-state\n class=\"news-empty-state\"\n stateIconSrc={NEWS_ICON}\n stateTitle={this._componentLocale.recentNews.noNewsFiltered.title}\n ></gx-ide-empty-state>\n );\n }\n return this.#renderNewsList();\n };\n\n #getNews = async () => {\n this.loadingNews = true;\n const newsResult = await this.getNewsCallback();\n this.loadingNews = 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 #openNewsHandler = (newsId: string) => async () => {\n await this.openNewsCallback(newsId);\n };\n\n #refreshFilteredNews = (filterValue: string, news: NewsData[]) => {\n this.filteredNews = news.filter(\n singleNews =>\n singleNews.title?.toLowerCase().includes(filterValue) ||\n singleNews.body?.toLowerCase().includes(filterValue)\n );\n };\n\n #renderNewsItem = (news: NewsData): HTMLGxgCardElement | null => {\n if (news.id && news.title) {\n return (\n <article>\n <button\n class={{\n \"card-small\": true,\n \"card-small--actionable\": true,\n \"card-news\": true,\n [this.#NEWS_ITEM_CLASS_SELECTOR]: true,\n \"visible\": this.#newsRendered\n }}\n id={news.id}\n key={news.id}\n type=\"button\"\n onClick={this.#openNewsHandler(news.id)}\n >\n <header class=\"card-news__header\">\n <ch-image src={NEWS_ICON} class=\"icon-md\"></ch-image>\n <h2 class={config.headingsClasses.cardSmall}>\n {hiChar(news.title, this.filterValue)}\n </h2>\n </header>\n {news.body && (\n <p class=\"text-body-regular-s\">\n {hiChar(news.body, this.filterValue)}\n </p>\n )}\n </button>\n </article>\n );\n }\n return null;\n };\n\n #renderNewsList = (): HTMLElement => (\n <div\n class=\"news-container\"\n ref={el => (this.#newsContainerEl = el as HTMLDivElement)}\n >\n {this.filteredNews?.map(this.#renderNewsItem)}\n </div>\n );\n\n render() {\n return (\n <Host\n // Improve accessibility by announcing live changes\n aria-live=\"polite\"\n // Wait until all changes are made to prevents assistive\n // technologies from announcing changes before updates are done\n aria-busy={this.loadingNews ? \"true\" : \"false\"}\n class={{ empty: this.filteredNews.length === 0, scrollable: true }}\n >\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n {this.loadingNews ? (\n <gx-ide-loader\n abortTime={8000}\n loaderTitle={this._componentLocale.loader.title}\n description={this._componentLocale.loader.description}\n show={true}\n ></gx-ide-loader>\n ) : (\n this.#evaluateNewsRender()\n )}\n </Host>\n );\n }\n}\n"],"version":3}
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@include hiChar();\n\n:host(.empty) {\n overflow: hidden !important; // WA to avoid scrollbar \"flickering\"\n}\n.news-container {\n display: grid;\n gap: var(--mer-spacing--xs);\n grid-auto-rows: max-content;\n // padding-inline-end: var(--mer-spacing--xs);\n}\n.news-item {\n opacity: 0;\n transition: 150ms opacity;\n\n &.visible {\n opacity: 1;\n }\n}\n.card-news {\n display: flex;\n flex-direction: column;\n align-items: start;\n gap: var(--mer-spacing--xs);\n\n &__header {\n display: flex;\n gap: var(--mer-spacing--sm);\n align-items: center;\n }\n}\n\ngx-ide-loader::part(loader-wrapper) {\n border: var(--mer-border__width--sm) solid\n var(--mer-border-color__on-elevation--01);\n border-radius: var(--mer-border__radius--md);\n}\n\n.text-link {\n color: var(--mer-accent__primary);\n\n &:hover {\n text-decoration: underline;\n }\n}\n","import { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { hiChar } from \"../../common/helpers\";\nimport { NewsData, GetNewsCallback, OpenNewsCallback } from \"./start-page\";\n\nconst NEWS_ICON = getIconPath({\n category: \"system\",\n name: \"news\",\n colorType: \"on-elevation\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"components/icon\",\n \"utils/typography\",\n \"utils/layout\",\n \"chameleon/scrollbar\"\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 /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n\n #NEWS_ITEM_CLASS_SELECTOR = \"news-item\";\n #newsRendered = false;\n #setTimeOutNewsDelay = 75;\n\n @Element() el: HTMLGxIdeRecentNewsElement;\n\n #newsContainerEl: HTMLDivElement;\n\n /**\n * The list of news after the filter\n */\n @State() filteredNews: NewsData[] = [];\n\n /**\n * True if news are being requested\n */\n @State() loadingNews = true;\n\n /**\n * The list of news\n */\n @State() news: NewsData[] = [];\n @Watch(\"news\")\n newsChanged(news: NewsData[]) {\n this.#refreshFilteredNews(this.filterValue, news);\n this.#displayNews();\n }\n\n /**\n * True if news couldn't be loaded\n */\n @State() newsLoadFailed = false;\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 /**\n * The news filter value inserted by the user on the news input filter\n */\n @Prop() readonly filterValue: string = \"\";\n @Watch(\"filterValue\")\n watchNews(newFilterValue: string) {\n this.#refreshFilteredNews(newFilterValue, this.news);\n }\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidRender() {\n this.#evaluateNewsDisplay();\n }\n\n componentDidLoad() {\n this.#getNews();\n }\n\n #displayNews = () => {\n if (this.#newsContainerEl !== undefined) {\n const news = Array.from(\n this.#newsContainerEl.querySelectorAll(\n `.${this.#NEWS_ITEM_CLASS_SELECTOR}`\n )\n );\n news.forEach(news => {\n // display news with a cascade effect\n setTimeout(() => {\n news.classList.add(\"visible\");\n }, this.#setTimeOutNewsDelay);\n this.#setTimeOutNewsDelay += 45;\n });\n }\n };\n\n #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 #evaluateNewsRender = (): HTMLElement => {\n if (this.newsLoadFailed) {\n return (\n <gx-ide-empty-state\n stateIconSrc={NEWS_ICON}\n stateTitle={this._componentLocale.recentNews.newsNotFetched.title}\n >\n <button\n class=\"empty-state__button button-primary\"\n onClick={this.#getNews}\n >\n {\n this._componentLocale.recentNews.newsNotFetched\n .tryAgainButtonLabel\n }\n </button>\n <a\n class=\"text-link text-body-regular-s\"\n href={this._componentLocale.recentNews.newsNotFetched.onlineNewsURL}\n target=\"_blank\"\n >\n {this._componentLocale.recentNews.newsNotFetched.readThemOnline}\n </a>\n </gx-ide-empty-state>\n );\n }\n if (this.news.length === 0) {\n return (\n <gx-ide-empty-state\n stateIconSrc={NEWS_ICON}\n stateTitle={this._componentLocale.recentNews.noNewsToDisplay.title}\n >\n <a\n class=\"empty-state__link text-body-regular-s\"\n href={this._componentLocale.recentNews.onlineNewsURL}\n target=\"_blank\"\n >\n {this._componentLocale.recentNews.readThemOnline}\n </a>\n </gx-ide-empty-state>\n );\n }\n if (this.filteredNews?.length === 0) {\n return (\n <gx-ide-empty-state\n class=\"news-empty-state\"\n stateIconSrc={NEWS_ICON}\n stateTitle={this._componentLocale.recentNews.noNewsFiltered.title}\n ></gx-ide-empty-state>\n );\n }\n return this.#renderNewsList();\n };\n\n #getNews = async () => {\n this.loadingNews = true;\n const newsResult = await this.getNewsCallback();\n this.loadingNews = 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 #openNewsHandler = (newsId: string) => async () => {\n await this.openNewsCallback(newsId);\n };\n\n #refreshFilteredNews = (filterValue: string, news: NewsData[]) => {\n this.filteredNews = news.filter(\n singleNews =>\n singleNews.title?.toLowerCase().includes(filterValue) ||\n singleNews.body?.toLowerCase().includes(filterValue)\n );\n };\n\n #renderNewsItem = (news: NewsData): HTMLGxgCardElement | null => {\n if (news.id && news.title) {\n return (\n <article>\n <button\n class={{\n \"card-small\": true,\n \"card-small--actionable\": true,\n \"card-news\": true,\n [this.#NEWS_ITEM_CLASS_SELECTOR]: true,\n \"visible\": this.#newsRendered\n }}\n id={news.id}\n key={news.id}\n type=\"button\"\n onClick={this.#openNewsHandler(news.id)}\n >\n <header class=\"card-news__header\">\n <ch-image src={NEWS_ICON} class=\"icon-md\"></ch-image>\n <h2 class={config.headingsClasses.cardSmall}>\n {hiChar(news.title, this.filterValue)}\n </h2>\n </header>\n {news.body && (\n <p class=\"text-body-regular-s\">\n {hiChar(news.body, this.filterValue)}\n </p>\n )}\n </button>\n </article>\n );\n }\n return null;\n };\n\n #renderNewsList = (): HTMLElement => (\n <div\n class=\"news-container\"\n ref={el => (this.#newsContainerEl = el as HTMLDivElement)}\n >\n {this.filteredNews?.map(this.#renderNewsItem)}\n </div>\n );\n\n render() {\n return (\n <Host\n // Improve accessibility by announcing live changes\n aria-live=\"polite\"\n // Wait until all changes are made to prevents assistive\n // technologies from announcing changes before updates are done\n aria-busy={this.loadingNews ? \"true\" : \"false\"}\n class={{ empty: this.filteredNews.length === 0, scrollable: true }}\n >\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n {this.loadingNews ? (\n <gx-ide-loader\n abortTime={8000}\n loaderTitle={this._componentLocale.loader.title}\n description={this._componentLocale.loader.description}\n show={true}\n ></gx-ide-loader>\n ) : (\n this.#evaluateNewsRender()\n )}\n </Host>\n );\n }\n}\n"],"version":3}
@@ -22,7 +22,7 @@ var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) ||
22
22
  throw new TypeError("Cannot write private member to an object whose class did not declare it");
23
23
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
24
24
  };
25
- var _GxIdeStartPage_recentKbsFilter, _GxIdeStartPage_kbsFilterValue, _GxIdeStartPage_evaluateRenderKbs, _GxIdeStartPage_filterKbs, _GxIdeStartPage_getNewsCallbackRecentNews, _GxIdeStartPage_openKbHandler, _GxIdeStartPage_renderKb, _GxIdeStartPage_renderKbs, _GxIdeStartPage_searchKbsInputHandler, _GxIdeStartPage_searchNewsInputHandler;
25
+ var _GxIdeStartPage_recentKbsFilter, _GxIdeStartPage_kbsFilterValue, _GxIdeStartPage_kbRefs, _GxIdeStartPage_evaluateRenderKbs, _GxIdeStartPage_filterKbs, _GxIdeStartPage_getNewsCallbackRecentNews, _GxIdeStartPage_openKbHandler, _GxIdeStartPage_renderKb, _GxIdeStartPage_renderKbs, _GxIdeStartPage_searchKbsInputHandler, _GxIdeStartPage_searchNewsInputHandler;
26
26
  const CSS_BUNDLES = [
27
27
  "resets/box-sizing",
28
28
  "utils/typography",
@@ -46,6 +46,7 @@ const GxIdeStartPage = class {
46
46
  registerInstance(this, hostRef);
47
47
  _GxIdeStartPage_recentKbsFilter.set(this, void 0);
48
48
  _GxIdeStartPage_kbsFilterValue.set(this, "");
49
+ _GxIdeStartPage_kbRefs.set(this, {}); // Object to store kbs refs
49
50
  _GxIdeStartPage_evaluateRenderKbs.set(this, () => {
50
51
  var _a;
51
52
  if (((_a = this.kbs) === null || _a === void 0 ? void 0 : _a.length) > 0) {
@@ -80,7 +81,7 @@ const GxIdeStartPage = class {
80
81
  "card-kb": true,
81
82
  "exact-match-bright": ((_a = kb.name) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) ===
82
83
  ((_b = __classPrivateFieldGet(this, _GxIdeStartPage_kbsFilterValue, "f")) === null || _b === void 0 ? void 0 : _b.toLowerCase())
83
- }, id: kb.id, key: kb.id, type: "button", onClick: __classPrivateFieldGet(this, _GxIdeStartPage_openKbHandler, "f") }, h("div", { class: "card-kb__left-col" }, h("ch-image", { src: KB_ICON, class: "icon-md" }), h("h2", { class: config.headingsClasses.cardSmall }, hiChar(kb.name, __classPrivateFieldGet(this, _GxIdeStartPage_kbsFilterValue, "f")))), dateCaption && h("div", { class: "card-kb__right-col" }, dateCaption))));
84
+ }, id: kb.id, key: kb.id, type: "button", ref: el => (__classPrivateFieldGet(this, _GxIdeStartPage_kbRefs, "f")[kb.id] = el), onClick: __classPrivateFieldGet(this, _GxIdeStartPage_openKbHandler, "f") }, h("div", { class: "card-kb__left-col" }, h("ch-image", { src: KB_ICON, class: "icon-md", containerRef: __classPrivateFieldGet(this, _GxIdeStartPage_kbRefs, "f")[kb.id] }), h("h2", { class: config.headingsClasses.cardSmall }, hiChar(kb.name, __classPrivateFieldGet(this, _GxIdeStartPage_kbsFilterValue, "f")))), dateCaption && h("div", { class: "card-kb__right-col" }, dateCaption))));
84
85
  });
85
86
  _GxIdeStartPage_renderKbs.set(this, () => {
86
87
  var _a;
@@ -152,7 +153,7 @@ const GxIdeStartPage = class {
152
153
  "kbs": ["kbsChanged"]
153
154
  }; }
154
155
  };
155
- _GxIdeStartPage_recentKbsFilter = new WeakMap(), _GxIdeStartPage_kbsFilterValue = new WeakMap(), _GxIdeStartPage_evaluateRenderKbs = new WeakMap(), _GxIdeStartPage_filterKbs = new WeakMap(), _GxIdeStartPage_getNewsCallbackRecentNews = new WeakMap(), _GxIdeStartPage_openKbHandler = new WeakMap(), _GxIdeStartPage_renderKb = new WeakMap(), _GxIdeStartPage_renderKbs = new WeakMap(), _GxIdeStartPage_searchKbsInputHandler = new WeakMap(), _GxIdeStartPage_searchNewsInputHandler = new WeakMap();
156
+ _GxIdeStartPage_recentKbsFilter = new WeakMap(), _GxIdeStartPage_kbsFilterValue = new WeakMap(), _GxIdeStartPage_kbRefs = new WeakMap(), _GxIdeStartPage_evaluateRenderKbs = new WeakMap(), _GxIdeStartPage_filterKbs = new WeakMap(), _GxIdeStartPage_getNewsCallbackRecentNews = new WeakMap(), _GxIdeStartPage_openKbHandler = new WeakMap(), _GxIdeStartPage_renderKb = new WeakMap(), _GxIdeStartPage_renderKbs = new WeakMap(), _GxIdeStartPage_searchKbsInputHandler = new WeakMap(), _GxIdeStartPage_searchNewsInputHandler = new WeakMap();
156
157
  GxIdeStartPage.style = startPageCss;
157
158
 
158
159
  export { GxIdeStartPage as gx_ide_start_page };
@@ -1 +1 @@
1
- {"file":"gx-ide-start-page.entry.js","mappings":"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","names":[],"sources":["src/components/start-page/start-page.scss?tag=gx-ide-start-page&encapsulation=shadow","src/components/start-page/start-page.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n@import \"../../global/reset.scss\";\n\n@include hiChar();\n\n:host {\n overflow: auto;\n container-type: inline-size;\n container-name: host;\n}\n\n.layout-main,\n.layout__panel {\n block-size: 100%;\n overflow: auto;\n}\n@container host (max-width: 768px) {\n .layout.layout-main {\n grid-template-columns: 1fr;\n grid-template-rows: 1fr 1fr;\n }\n}\n\n// recent kb's\n.panel-recent-kbs {\n position: relative;\n}\n.recent-kbs,\n.recent-news {\n display: grid;\n grid-template-rows: auto 1fr;\n gap: var(--mer-spacing--md);\n overflow: auto;\n\n &__header {\n display: grid;\n gap: var(--mer-spacing--md);\n }\n}\n\n.kbs-container {\n display: grid;\n gap: var(--mer-spacing--xs);\n overflow: auto;\n grid-auto-rows: max-content;\n container-type: inline-size;\n container-name: kb-container;\n animation: fadeIn var(--mer-timing--super-fast) forwards linear;\n}\n\n.card-kb {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mer-spacing--lg);\n container-type: inline-size;\n container-name: card-kb;\n\n &__left-col {\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--sm);\n }\n}\n@container kb-container (max-width: 360px) {\n .card-kb {\n align-items: center;\n flex-direction: column;\n gap: var(--mer-spacing--xs);\n justify-content: start;\n }\n}\n\n// recent news\ngx-ide-recent-news {\n overflow: auto;\n}\n.panel-recent-news {\n position: relative;\n}\n\n@keyframes exactMatchBright {\n 100% {\n filter: brightness(1.25);\n }\n}\n.exact-match-bright {\n animation: exactMatchBright var(--mer-timing--super-fast) ease-in-out 4\n alternate;\n}\n\ngx-ide-loader::part(loader-wrapper) {\n border: var(--mer-border__width--sm) solid\n var(--mer-border-color__on-elevation--01);\n border-radius: var(--mer-border__radius--md);\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","/* STENCIL IMPORTS */\nimport { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { formatDate, hiChar } from \"../../common/helpers\";\nimport { ChEditCustomEvent } from \"@genexus/chameleon-controls-library\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"utils/layout\",\n \"components/edit\",\n \"components/icon\",\n \"components/button\",\n \"chameleon/scrollbar\"\n];\n\nconst KB_ICON = getIconPath({\n category: \"objects\",\n name: \"knowledge-base\"\n});\nconst FOLDER_ICON = getIconPath({\n category: \"system\",\n name: \"folder\",\n colorType: \"on-elevation\"\n});\n\n@Component({\n tag: \"gx-ide-start-page\",\n styleUrl: \"start-page.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/start-page\"]\n})\nexport class GxIdeStartPage {\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n\n #recentKbsFilter: HTMLChEditElement;\n #kbsFilterValue: string = \"\";\n\n @Element() el: HTMLGxIdeStartPageElement;\n\n /**\n * The condition required to display the kbs filter\n */\n @State() displayKbsFilter: boolean = true;\n\n /**\n * The condition required to display the news filter\n */\n @State() displayNewsFilter: boolean = false;\n\n /**\n * The filtered KBs after user input\n */\n @State() filteredKbs: RecentKBData[] = [];\n\n /**\n * The filtered news after user input\n */\n @State() filteredNews: NewsData[] = [];\n\n /**\n * True if kbs have been not loaded yet.\n */\n @State() loadingKbs: boolean = true;\n\n /**\n * A list of recent news\n */\n @State() news: NewsData[];\n @Watch(\"news\")\n watchNews(news: NewsData[]) {\n if (news?.length >= this.newsFilterThreshold) {\n this.displayNewsFilter = true;\n } else {\n this.displayNewsFilter = false;\n }\n }\n\n /**\n * The filter value for the recent news set by the user input\n */\n @State() newsFilterValue: string;\n\n /**\n * True if the component has been rendered for the first time.\n */\n @State() renderedFirstTime = false;\n\n /**\n * Callback invoked to load the news feed (right panel \"Recent News\").\n */\n @Prop() readonly getNewsCallback!: GetNewsCallback;\n\n /**\n * Ann array of the user's KB's\n */\n @Prop() readonly kbs: RecentKBData[] = [];\n @Watch(\"kbs\")\n kbsChanged(kbs: RecentKBData[]) {\n this.loadingKbs = false;\n this.#filterKbs();\n if (kbs?.length >= this.kbsFilterThreshold) {\n this.displayKbsFilter = true;\n } else {\n this.displayKbsFilter = false;\n }\n }\n\n /**\n * The minimum number of \"kbs\" that is required to display the kb's filter.\n */\n @Prop() readonly kbsFilterThreshold: number = 6;\n\n /**\n * The minimum number of \"news\" that is required to display the news's filter.\n */\n @Prop() readonly newsFilterThreshold: number = 6;\n\n /**\n * Callback invoked to open a knowledge base when the user clicks on a KB card.\n */\n @Prop() readonly openKbCallback!: OpenKbCallback;\n\n /**\n * Callback invoked to open a news article.\n */\n @Prop() readonly openNewsCallback!: OpenNewsCallback;\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidLoad() {\n this.#recentKbsFilter?.focus();\n }\n\n #evaluateRenderKbs = () => {\n if (this.kbs?.length > 0) {\n return this.#renderKbs();\n } else {\n return (\n <gx-ide-empty-state\n class=\"kbs-empty-state\"\n stateIconSrc={FOLDER_ICON}\n stateTitle={this._componentLocale.emptyState.title}\n stateDescription={this._componentLocale.emptyState.description}\n ></gx-ide-empty-state>\n );\n }\n };\n\n #filterKbs = () => {\n this.filteredKbs = this.kbs.filter(kb =>\n kb.name?.toLowerCase().includes(this.#kbsFilterValue)\n );\n };\n\n #getNewsCallbackRecentNews = async (): Promise<NewsData[]> => {\n return new Promise(async resolve => {\n this.news = await this.getNewsCallback();\n resolve(this.news);\n });\n };\n\n #openKbHandler = async (e: MouseEvent) => {\n const kbId = (e.currentTarget as HTMLElement).id;\n await this.openKbCallback(kbId);\n };\n\n #renderKb = (kb: RecentKBData): HTMLButtonElement | null => {\n const formattedDate = formatDate(kb.lastOpenedDate, \"pretty\");\n const dateCaption = formattedDate\n ? `${this._componentLocale.recentKbs.lastOpened} ${formattedDate}`\n : null;\n return (\n <article class=\"display-contents\">\n <button\n class={{\n \"card-small\": true,\n \"card-small--actionable\": true,\n \"card-kb\": true,\n \"exact-match-bright\":\n kb.name?.toLocaleLowerCase() ===\n this.#kbsFilterValue?.toLowerCase()\n }}\n id={kb.id}\n key={kb.id}\n type=\"button\"\n onClick={this.#openKbHandler}\n >\n <div class=\"card-kb__left-col\">\n <ch-image src={KB_ICON} class=\"icon-md\"></ch-image>\n <h2 class={config.headingsClasses.cardSmall}>\n {hiChar(kb.name, this.#kbsFilterValue)}\n </h2>\n </div>\n {dateCaption && <div class=\"card-kb__right-col\">{dateCaption}</div>}\n </button>\n </article>\n );\n };\n\n #renderKbs = () => {\n if (this.filteredKbs.length) {\n return (\n <div class=\"kbs-container scrollable\">\n {this.filteredKbs?.map(this.#renderKb)}\n </div>\n );\n }\n return (\n <gx-ide-empty-state\n stateIconSrc={KB_ICON}\n stateTitle={this._componentLocale.recentKbs.noKbsFiltered.title}\n ></gx-ide-empty-state>\n );\n };\n\n #searchKbsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.#kbsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n this.#filterKbs();\n };\n\n #searchNewsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.newsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n };\n\n render() {\n return (\n <Host class=\"start-page-host\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"layout layout-main layout--cols-2\">\n <div class=\"layout__panel panel-recent-kbs\">\n <section class=\"card-regular recent-kbs\">\n <header class=\"recent-kbs__header\">\n <h2\n class={{\n [config.headingsClasses.cardRegular]: true,\n \"recent-kbs__title\": true\n }}\n >\n {this._componentLocale.recentKbs.title}\n </h2>\n {this.displayKbsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-kbs__name-filter\"\n placeholder={this._componentLocale.recentKbs.placeholder}\n onInput={this.#searchKbsInputHandler}\n ref={el =>\n (this.#recentKbsFilter = el as HTMLChEditElement)\n }\n disabled={!(this.kbs?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n {this.loadingKbs ? (\n <gx-ide-loader\n loaderTitle={this._componentLocale.recentKbs.loader.title}\n description={\n this._componentLocale.recentKbs.loader.description\n }\n show={true}\n ></gx-ide-loader>\n ) : (\n this.#evaluateRenderKbs()\n )}\n </section>\n </div>\n\n <div class=\"layout__panel panel-recent-news\">\n <section class=\"card-regular recent-news\">\n <header class=\"recent-news__header\">\n <h2 class={config.headingsClasses.cardRegular}>\n {this._componentLocale.recentNews.title}\n </h2>\n {this.displayNewsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-news__filter\"\n placeholder={\n this._componentLocale.recentNews.inputPlaceholder\n }\n onInput={\n this.news?.length > 0\n ? this.#searchNewsInputHandler\n : null\n }\n disabled={!(this.news?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n <gx-ide-recent-news\n getNewsCallback={this.#getNewsCallbackRecentNews}\n openNewsCallback={this.openNewsCallback}\n filterValue={this.newsFilterValue}\n ></gx-ide-recent-news>\n </section>\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type OpenKbCallback = (id: string) => Promise<void>;\nexport type GetNewsCallback = () => Promise<NewsData[]>;\nexport type OpenNewsCallback = (id: string) => Promise<void>;\n\nexport type RecentKBData = {\n id: string;\n name: string;\n lastOpenedDate?: Date;\n};\nexport type NewsData = {\n id: string;\n title: string;\n body: string;\n};\n"],"version":3}
1
+ {"file":"gx-ide-start-page.entry.js","mappings":"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","names":[],"sources":["src/components/start-page/start-page.scss?tag=gx-ide-start-page&encapsulation=shadow","src/components/start-page/start-page.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n@import \"../../global/reset.scss\";\n\n@include hiChar();\n\n:host {\n overflow: auto;\n container-type: inline-size;\n container-name: host;\n}\n\n.layout-main,\n.layout__panel {\n block-size: 100%;\n overflow: auto;\n}\n@container host (max-width: 768px) {\n .layout.layout-main {\n grid-template-columns: 1fr;\n grid-template-rows: 1fr 1fr;\n }\n}\n\n// recent kb's\n.panel-recent-kbs {\n position: relative;\n}\n.recent-kbs,\n.recent-news {\n display: grid;\n grid-template-rows: auto 1fr;\n gap: var(--mer-spacing--md);\n overflow: auto;\n\n &__header {\n display: grid;\n gap: var(--mer-spacing--md);\n }\n}\n\n.kbs-container {\n display: grid;\n gap: var(--mer-spacing--xs);\n overflow: auto;\n grid-auto-rows: max-content;\n container-type: inline-size;\n container-name: kb-container;\n animation: fadeIn var(--mer-timing--super-fast) forwards linear;\n}\n\n.card-kb {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mer-spacing--lg);\n container-type: inline-size;\n container-name: card-kb;\n\n &__left-col {\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--sm);\n }\n}\n@container kb-container (max-width: 360px) {\n .card-kb {\n align-items: center;\n flex-direction: column;\n gap: var(--mer-spacing--xs);\n justify-content: start;\n }\n}\n\n// recent news\ngx-ide-recent-news {\n overflow: auto;\n}\n.panel-recent-news {\n position: relative;\n}\n\n@keyframes exactMatchBright {\n 100% {\n filter: brightness(1.25);\n }\n}\n.exact-match-bright {\n animation: exactMatchBright var(--mer-timing--super-fast) ease-in-out 4\n alternate;\n}\n\ngx-ide-loader::part(loader-wrapper) {\n border: var(--mer-border__width--sm) solid\n var(--mer-border-color__on-elevation--01);\n border-radius: var(--mer-border__radius--md);\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","/* STENCIL IMPORTS */\nimport { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { formatDate, hiChar } from \"../../common/helpers\";\nimport { ChEditCustomEvent } from \"@genexus/chameleon-controls-library\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"utils/layout\",\n \"components/edit\",\n \"components/icon\",\n \"components/button\",\n \"chameleon/scrollbar\"\n];\n\nconst KB_ICON = getIconPath({\n category: \"objects\",\n name: \"knowledge-base\"\n});\nconst FOLDER_ICON = getIconPath({\n category: \"system\",\n name: \"folder\",\n colorType: \"on-elevation\"\n});\n\n@Component({\n tag: \"gx-ide-start-page\",\n styleUrl: \"start-page.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/start-page\"]\n})\nexport class GxIdeStartPage {\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n\n #recentKbsFilter: HTMLChEditElement;\n #kbsFilterValue: string = \"\";\n #kbRefs: { [key: string]: HTMLButtonElement | null } = {}; // Object to store kbs refs\n\n @Element() el: HTMLGxIdeStartPageElement;\n\n /**\n * The condition required to display the kbs filter\n */\n @State() displayKbsFilter: boolean = true;\n\n /**\n * The condition required to display the news filter\n */\n @State() displayNewsFilter: boolean = false;\n\n /**\n * The filtered KBs after user input\n */\n @State() filteredKbs: RecentKBData[] = [];\n\n /**\n * The filtered news after user input\n */\n @State() filteredNews: NewsData[] = [];\n\n /**\n * True if kbs have been not loaded yet.\n */\n @State() loadingKbs: boolean = true;\n\n /**\n * A list of recent news\n */\n @State() news: NewsData[];\n @Watch(\"news\")\n watchNews(news: NewsData[]) {\n if (news?.length >= this.newsFilterThreshold) {\n this.displayNewsFilter = true;\n } else {\n this.displayNewsFilter = false;\n }\n }\n\n /**\n * The filter value for the recent news set by the user input\n */\n @State() newsFilterValue: string;\n\n /**\n * True if the component has been rendered for the first time.\n */\n @State() renderedFirstTime = false;\n\n /**\n * Callback invoked to load the news feed (right panel \"Recent News\").\n */\n @Prop() readonly getNewsCallback!: GetNewsCallback;\n\n /**\n * Ann array of the user's KB's\n */\n @Prop() readonly kbs: RecentKBData[] = [];\n @Watch(\"kbs\")\n kbsChanged(kbs: RecentKBData[]) {\n this.loadingKbs = false;\n this.#filterKbs();\n if (kbs?.length >= this.kbsFilterThreshold) {\n this.displayKbsFilter = true;\n } else {\n this.displayKbsFilter = false;\n }\n }\n\n /**\n * The minimum number of \"kbs\" that is required to display the kb's filter.\n */\n @Prop() readonly kbsFilterThreshold: number = 6;\n\n /**\n * The minimum number of \"news\" that is required to display the news's filter.\n */\n @Prop() readonly newsFilterThreshold: number = 6;\n\n /**\n * Callback invoked to open a knowledge base when the user clicks on a KB card.\n */\n @Prop() readonly openKbCallback!: OpenKbCallback;\n\n /**\n * Callback invoked to open a news article.\n */\n @Prop() readonly openNewsCallback!: OpenNewsCallback;\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidLoad() {\n this.#recentKbsFilter?.focus();\n }\n\n #evaluateRenderKbs = () => {\n if (this.kbs?.length > 0) {\n return this.#renderKbs();\n } else {\n return (\n <gx-ide-empty-state\n class=\"kbs-empty-state\"\n stateIconSrc={FOLDER_ICON}\n stateTitle={this._componentLocale.emptyState.title}\n stateDescription={this._componentLocale.emptyState.description}\n ></gx-ide-empty-state>\n );\n }\n };\n\n #filterKbs = () => {\n this.filteredKbs = this.kbs.filter(kb =>\n kb.name?.toLowerCase().includes(this.#kbsFilterValue)\n );\n };\n\n #getNewsCallbackRecentNews = async (): Promise<NewsData[]> => {\n return new Promise(async resolve => {\n this.news = await this.getNewsCallback();\n resolve(this.news);\n });\n };\n\n #openKbHandler = async (e: MouseEvent) => {\n const kbId = (e.currentTarget as HTMLElement).id;\n await this.openKbCallback(kbId);\n };\n\n #renderKb = (kb: RecentKBData): HTMLButtonElement | null => {\n const formattedDate = formatDate(kb.lastOpenedDate, \"pretty\");\n const dateCaption = formattedDate\n ? `${this._componentLocale.recentKbs.lastOpened} ${formattedDate}`\n : null;\n return (\n <article class=\"display-contents\">\n <button\n class={{\n \"card-small\": true,\n \"card-small--actionable\": true,\n \"card-kb\": true,\n \"exact-match-bright\":\n kb.name?.toLocaleLowerCase() ===\n this.#kbsFilterValue?.toLowerCase()\n }}\n id={kb.id}\n key={kb.id}\n type=\"button\"\n ref={el => (this.#kbRefs[kb.id] = el as HTMLButtonElement)}\n onClick={this.#openKbHandler}\n >\n <div class=\"card-kb__left-col\">\n <ch-image\n src={KB_ICON}\n class=\"icon-md\"\n containerRef={this.#kbRefs[kb.id]}\n ></ch-image>\n <h2 class={config.headingsClasses.cardSmall}>\n {hiChar(kb.name, this.#kbsFilterValue)}\n </h2>\n </div>\n {dateCaption && <div class=\"card-kb__right-col\">{dateCaption}</div>}\n </button>\n </article>\n );\n };\n\n #renderKbs = () => {\n if (this.filteredKbs.length) {\n return (\n <div class=\"kbs-container scrollable\">\n {this.filteredKbs?.map(this.#renderKb)}\n </div>\n );\n }\n return (\n <gx-ide-empty-state\n stateIconSrc={KB_ICON}\n stateTitle={this._componentLocale.recentKbs.noKbsFiltered.title}\n ></gx-ide-empty-state>\n );\n };\n\n #searchKbsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.#kbsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n this.#filterKbs();\n };\n\n #searchNewsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.newsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n };\n\n render() {\n return (\n <Host class=\"start-page-host\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"layout layout-main layout--cols-2\">\n <div class=\"layout__panel panel-recent-kbs\">\n <section class=\"card-regular recent-kbs\">\n <header class=\"recent-kbs__header\">\n <h2\n class={{\n [config.headingsClasses.cardRegular]: true,\n \"recent-kbs__title\": true\n }}\n >\n {this._componentLocale.recentKbs.title}\n </h2>\n {this.displayKbsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-kbs__name-filter\"\n placeholder={this._componentLocale.recentKbs.placeholder}\n onInput={this.#searchKbsInputHandler}\n ref={el =>\n (this.#recentKbsFilter = el as HTMLChEditElement)\n }\n disabled={!(this.kbs?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n {this.loadingKbs ? (\n <gx-ide-loader\n loaderTitle={this._componentLocale.recentKbs.loader.title}\n description={\n this._componentLocale.recentKbs.loader.description\n }\n show={true}\n ></gx-ide-loader>\n ) : (\n this.#evaluateRenderKbs()\n )}\n </section>\n </div>\n\n <div class=\"layout__panel panel-recent-news\">\n <section class=\"card-regular recent-news\">\n <header class=\"recent-news__header\">\n <h2 class={config.headingsClasses.cardRegular}>\n {this._componentLocale.recentNews.title}\n </h2>\n {this.displayNewsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-news__filter\"\n placeholder={\n this._componentLocale.recentNews.inputPlaceholder\n }\n onInput={\n this.news?.length > 0\n ? this.#searchNewsInputHandler\n : null\n }\n disabled={!(this.news?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n <gx-ide-recent-news\n getNewsCallback={this.#getNewsCallbackRecentNews}\n openNewsCallback={this.openNewsCallback}\n filterValue={this.newsFilterValue}\n ></gx-ide-recent-news>\n </section>\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type OpenKbCallback = (id: string) => Promise<void>;\nexport type GetNewsCallback = () => Promise<NewsData[]>;\nexport type OpenNewsCallback = (id: string) => Promise<void>;\n\nexport type RecentKBData = {\n id: string;\n name: string;\n lastOpenedDate?: Date;\n};\nexport type NewsData = {\n id: string;\n title: string;\n body: string;\n};\n"],"version":3}