@genexus/genexus-ide-ui 3.1.0 → 3.1.1
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.
- package/dist/cjs/gx-ide-search.cjs.entry.js.map +1 -1
- package/dist/collection/components/search/search.js.map +1 -1
- package/dist/components/gx-ide-search.js.map +1 -1
- package/dist/esm/gx-ide-search.entry.js.map +1 -1
- package/dist/genexus-ide-ui/p-8b5c826b.entry.js.map +1 -1
- package/dist/types/components/search/search.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"gx-ide-search.entry.cjs.js","mappings":"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","names":["getIconPath","h","Locale","Host","config"],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"version":3}
|
|
1
|
+
{"file":"gx-ide-search.entry.cjs.js","mappings":"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","names":["getIconPath","h","Locale","Host","config"],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectTypeId: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"version":3}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/components/search/search.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"]}
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/components/search/search.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectTypeId: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"gx-ide-search.js","mappings":"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","names":["GxIdeSearch"],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"version":3}
|
|
1
|
+
{"file":"gx-ide-search.js","mappings":";;;;;;;;;;AAAA,MAAM,SAAS,GAAG,kzBAAkzB;;;;;;;;;;;;;;;;;;;ACqBp0B,MAAM,WAAW,GAAmB;IAClC,mBAAmB;IACnB,iBAAiB;IACjB,sBAAsB;IACtB,kBAAkB;IAClB,eAAe;IACf,qBAAqB;CACtB,CAAC;AACF,MAAM,WAAW,GAAG,WAAW,CAAC;IAC9B,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,YAAY;CACxB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,WAAW,CAAC;IACnC,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,gBAAgB;CAC5B,CAAC,CAAC;MAQUA,aAAW;;;;;QACtB,+CAAsB;QACtB,wCAA4B,EAAE,EAAC;QAyD/B,0CAAsB,OAAO,KAAuC;;YAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,OAAO;aACR;YAED,MAAM,YAAY,GAAG,KAAK,CAAC,MAA2B,CAAC;YACvD,MAAM,UAAU,GAAG,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,0CAAE,IAAI,EAAE,CAAC;YAC/C,uBAAA,IAAI,iCAAqB,UAAU,MAAA,CAAC;YAEpC,IAAI,CAAC,UAAU,EAAE;gBACf,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,OAAO;aACR;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAE5B,IAAI;gBACF,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;oBACjD,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,KAAK;oBACjB,iBAAiB,EAAE,IAAI;oBACvB,WAAW,EAAE,KAAK;oBAClB,MAAM,EAAE,KAAK;iBACd,CAAC,CAAC;gBAEH,IAAI,CAAC,iBAAiB;oBACpB,uBAAA,IAAI,mDAAgC,MAApC,IAAI,EAAiC,gBAAgB,CAAC,CAAC;aAC1D;oBAAS;gBACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;aAC1B;SACF,EAAC;QAEF,iDAA6B,CAAC,KAAoB;YAChD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBACzB,uBAAA,IAAI,uCAAoB,MAAxB,IAAI,EAAqB,KAAY,CAAC,CAAC;aACxC;SACF,EAAC;QAEF,sDAAkC,CAChC,gBAAoC;YAEpC,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACtD,OAAO,EAAE,CAAC;aACX;YACD,OAAO;gBACL;oBACE,EAAE,EAAE,MAAM;oBACV,OAAO,EAAE,GAAG,uBAAA,IAAI,oCAAiB,CAAC,MAAM,CAAC,OAAO,KAAK,gBAAgB,CAAC,MAAM,GAAG;oBAC/E,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,WAAW;oBAClB,KAAK,EAAE,gBAAgB,CAAC,GAAG,CACzB,CAAC,IAAI,MAAyB;wBAC5B,EAAE,EAAE,IAAI,CAAC,QAAQ;wBACjB,WAAW,EAAE,IAAI,CAAC,UAAU;wBAC5B,OAAO,EAAE,IAAI,CAAC,UAAU;wBACxB,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,aAAa;qBACrB,CAAC,CACH;iBACF;aACF,CAAC;SACH,EAAC;QAEF,kDAA8B,OAC5B,KAAiE;;YAEjE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,OAAM,MAAA,IAAI,CAAC,uBAAuB,qDAAG,MAAM,CAAC,CAAA,CAAC;SAC9C,EAAC;QAEF,2CAAuB;YACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,QACE,0BACE,UAAU,EAAE,uBAAA,IAAI,oCAAiB,CAAC,aAAa,CAAC,KAAK,EACrD,gBAAgB,EAAE,uBAAA,IAAI,oCAAiB,CAAC,aAAa,CAAC,WAAW,EACjE,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,IAAI,GACI,EACtB;aACH;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,QACE,qBACE,WAAW,EAAE,uBAAA,IAAI,oCAAiB,CAAC,MAAM,CAAC,KAAK,EAC/C,IAAI,EAAE,IAAI,GACK,EACjB;aACH;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrC,QACE,2BACE,KAAK,EAAC,WAAW,EACjB,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAC7B,gBAAgB,EAAC,IAAI,EACrB,aAAa,EAAE,KAAK,EACpB,mBAAmB,EAAE,uBAAA,IAAI,+CAA4B,GACrD,EACF;aACH;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,QACE,0BACE,UAAU,EAAE,uBAAA,IAAI,oCAAiB,CAAC,UAAU,CAAC,KAAK,EAClD,gBAAgB,EAAE,uBAAA,IAAI,oCAAiB,CAAC,UAAU,CAAC,WAAW,EAC9D,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,IAAI,GACI,EACtB;aACH;YAED,OAAO,IAAI,CAAC;SACb,EAAC;iCAzK0C,EAAE;2BAKvB,KAAK;2BAKL,KAAK;wBAKS,KAAK;;;;IAE1C,kBAAkB,CAAC,QAAiB;QAClC,IAAI,CAAC,QAAQ,EAAE;YACb,uBAAA,IAAI,iCAAqB,EAAE,MAAA,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;KACF;;;;IAkBD,MAAM,YAAY,CAAC,KAAc;QAC/B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;IAED,MAAM,iBAAiB;QACrB,uBAAA,IAAI,gCAAoB,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,MAAA,CAAC;KACnE;IA2HD,MAAM;QACJ,QACE,EAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,IAClB,gBAAU,KAAK,EAAE,WAAW,GAAa,EACzC,eAAS,KAAK,EAAE,qBAAqB,IACnC,cAAQ,KAAK,EAAC,gBAAgB,IAC5B,eACE,EAAE,EAAC,cAAc,EACjB,KAAK,EAAC,OAAO,EACb,cAAc,EAAE,uBAAA,IAAI,oCAAiB,CAAC,cAAc,EACpD,WAAW,EAAE,uBAAA,IAAI,oCAAiB,CAAC,YAAY,CAAC,MAAM,EACtD,QAAQ,EAAE,MAAM,CAAC,aAAa,EAC9B,OAAO,EAAE,uBAAA,IAAI,uCAAoB,EACjC,SAAS,EAAE,uBAAA,IAAI,8CAA2B,EAC1C,IAAI,EAAC,QAAQ,EACb,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,EACxB,KAAK,EAAE,uBAAA,IAAI,qCAAkB,GACpB,CACJ,EAET,YAAM,KAAK,EAAC,iBAAiB,IAAE,uBAAA,IAAI,wCAAqB,MAAzB,IAAI,CAAuB,CAAQ,CAC1D,CACL,EACP;KACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["GxIdeSearch"],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectTypeId: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"version":3}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"gx-ide-search.entry.js","mappings":"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","names":[],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"version":3}
|
|
1
|
+
{"file":"gx-ide-search.entry.js","mappings":";;;;;;;;;AAAA,MAAM,SAAS,GAAG,kzBAAkzB;;;;;;;;;;;;;;;;;;;ACqBp0B,MAAM,WAAW,GAAmB;IAClC,mBAAmB;IACnB,iBAAiB;IACjB,sBAAsB;IACtB,kBAAkB;IAClB,eAAe;IACf,qBAAqB;CACtB,CAAC;AACF,MAAM,WAAW,GAAG,WAAW,CAAC;IAC9B,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,YAAY;CACxB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,WAAW,CAAC;IACnC,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,gBAAgB;CAC5B,CAAC,CAAC;MAQU,WAAW;;;QACtB,+CAAsB;QACtB,wCAA4B,EAAE,EAAC;QAyD/B,0CAAsB,OAAO,KAAuC;;YAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,OAAO;aACR;YAED,MAAM,YAAY,GAAG,KAAK,CAAC,MAA2B,CAAC;YACvD,MAAM,UAAU,GAAG,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,0CAAE,IAAI,EAAE,CAAC;YAC/C,uBAAA,IAAI,iCAAqB,UAAU,MAAA,CAAC;YAEpC,IAAI,CAAC,UAAU,EAAE;gBACf,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,OAAO;aACR;YAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAE5B,IAAI;gBACF,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;oBACjD,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,KAAK;oBACjB,iBAAiB,EAAE,IAAI;oBACvB,WAAW,EAAE,KAAK;oBAClB,MAAM,EAAE,KAAK;iBACd,CAAC,CAAC;gBAEH,IAAI,CAAC,iBAAiB;oBACpB,uBAAA,IAAI,mDAAgC,MAApC,IAAI,EAAiC,gBAAgB,CAAC,CAAC;aAC1D;oBAAS;gBACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;aAC1B;SACF,EAAC;QAEF,iDAA6B,CAAC,KAAoB;YAChD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBACzB,uBAAA,IAAI,uCAAoB,MAAxB,IAAI,EAAqB,KAAY,CAAC,CAAC;aACxC;SACF,EAAC;QAEF,sDAAkC,CAChC,gBAAoC;YAEpC,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACtD,OAAO,EAAE,CAAC;aACX;YACD,OAAO;gBACL;oBACE,EAAE,EAAE,MAAM;oBACV,OAAO,EAAE,GAAG,uBAAA,IAAI,oCAAiB,CAAC,MAAM,CAAC,OAAO,KAAK,gBAAgB,CAAC,MAAM,GAAG;oBAC/E,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,WAAW;oBAClB,KAAK,EAAE,gBAAgB,CAAC,GAAG,CACzB,CAAC,IAAI,MAAyB;wBAC5B,EAAE,EAAE,IAAI,CAAC,QAAQ;wBACjB,WAAW,EAAE,IAAI,CAAC,UAAU;wBAC5B,OAAO,EAAE,IAAI,CAAC,UAAU;wBACxB,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,aAAa;qBACrB,CAAC,CACH;iBACF;aACF,CAAC;SACH,EAAC;QAEF,kDAA8B,OAC5B,KAAiE;;YAEjE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,OAAM,MAAA,IAAI,CAAC,uBAAuB,qDAAG,MAAM,CAAC,CAAA,CAAC;SAC9C,EAAC;QAEF,2CAAuB;YACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,QACE,0BACE,UAAU,EAAE,uBAAA,IAAI,oCAAiB,CAAC,aAAa,CAAC,KAAK,EACrD,gBAAgB,EAAE,uBAAA,IAAI,oCAAiB,CAAC,aAAa,CAAC,WAAW,EACjE,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,IAAI,GACI,EACtB;aACH;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,QACE,qBACE,WAAW,EAAE,uBAAA,IAAI,oCAAiB,CAAC,MAAM,CAAC,KAAK,EAC/C,IAAI,EAAE,IAAI,GACK,EACjB;aACH;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrC,QACE,2BACE,KAAK,EAAC,WAAW,EACjB,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAC7B,gBAAgB,EAAC,IAAI,EACrB,aAAa,EAAE,KAAK,EACpB,mBAAmB,EAAE,uBAAA,IAAI,+CAA4B,GACrD,EACF;aACH;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,QACE,0BACE,UAAU,EAAE,uBAAA,IAAI,oCAAiB,CAAC,UAAU,CAAC,KAAK,EAClD,gBAAgB,EAAE,uBAAA,IAAI,oCAAiB,CAAC,UAAU,CAAC,WAAW,EAC9D,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,IAAI,GACI,EACtB;aACH;YAED,OAAO,IAAI,CAAC;SACb,EAAC;iCAzK0C,EAAE;2BAKvB,KAAK;2BAKL,KAAK;wBAKS,KAAK;;;;IAE1C,kBAAkB,CAAC,QAAiB;QAClC,IAAI,CAAC,QAAQ,EAAE;YACb,uBAAA,IAAI,iCAAqB,EAAE,MAAA,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;KACF;;;;IAkBD,MAAM,YAAY,CAAC,KAAc;QAC/B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;IAED,MAAM,iBAAiB;QACrB,uBAAA,IAAI,gCAAoB,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,MAAA,CAAC;KACnE;IA2HD,MAAM;QACJ,QACE,EAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,IAClB,gBAAU,KAAK,EAAE,WAAW,GAAa,EACzC,eAAS,KAAK,EAAE,qBAAqB,IACnC,cAAQ,KAAK,EAAC,gBAAgB,IAC5B,eACE,EAAE,EAAC,cAAc,EACjB,KAAK,EAAC,OAAO,EACb,cAAc,EAAE,uBAAA,IAAI,oCAAiB,CAAC,cAAc,EACpD,WAAW,EAAE,uBAAA,IAAI,oCAAiB,CAAC,YAAY,CAAC,MAAM,EACtD,QAAQ,EAAE,MAAM,CAAC,aAAa,EAC9B,OAAO,EAAE,uBAAA,IAAI,uCAAoB,EACjC,SAAS,EAAE,uBAAA,IAAI,8CAA2B,EAC1C,IAAI,EAAC,QAAQ,EACb,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,EACxB,KAAK,EAAE,uBAAA,IAAI,qCAAkB,GACpB,CACJ,EAET,YAAM,KAAK,EAAC,iBAAiB,IAAE,uBAAA,IAAI,wCAAqB,MAAzB,IAAI,CAAuB,CAAQ,CAC1D,CACL,EACP;KACH;;;;;;;;;;;;","names":[],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectTypeId: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"version":3}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["searchCss","CSS_BUNDLES","SEARCH_ICON","getIconPath","category","name","colorType","INFORMATION_ICON","GxIdeSearch","_GxIdeSearch_componentLocale","set","this","_GxIdeSearch_searchInputValue","_GxIdeSearch_searchInputHandler","async","event","isKbOpen","inputElement","target","searchText","_a","value","trim","__classPrivateFieldSet","searchResultModel","hasSearched","isSearching","searchResultData","searchCallback","text","onlyTitles","includeSubModules","allBranches","forLLM","__classPrivateFieldGet","_GxIdeSearch_mapSearchResultToTreeViewModel","call","_GxIdeSearch_searchInputKeyDownHandler","key","length","id","caption","labels","results","expanded","parts","items","map","item","objectId","startImgSrc","objectIcon","objectName","leaf","_GxIdeSearch_treeItemDoubleClickHandler","itemId","detail","itemDoubleClickCallback","_GxIdeSearch_renderSearchResults","h","stateTitle","noKbOpenState","title","stateDescription","description","stateIconSrc","isAnimated","loaderTitle","loader","show","class","model","expandableButton","expandOnClick","onItemOpenReference","emptyState","valueChangeHandler","newValue","showSettings","_show","Promise","resolve","componentWillLoad","Locale","getComponentStrings","el","render","Host","accessibleName","placeholder","placeholders","search","debounce","config","inputDebounce","onInput","onKeyDown","type","disabled"],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["searchCss","CSS_BUNDLES","SEARCH_ICON","getIconPath","category","name","colorType","INFORMATION_ICON","GxIdeSearch","_GxIdeSearch_componentLocale","set","this","_GxIdeSearch_searchInputValue","_GxIdeSearch_searchInputHandler","async","event","isKbOpen","inputElement","target","searchText","_a","value","trim","__classPrivateFieldSet","searchResultModel","hasSearched","isSearching","searchResultData","searchCallback","text","onlyTitles","includeSubModules","allBranches","forLLM","__classPrivateFieldGet","_GxIdeSearch_mapSearchResultToTreeViewModel","call","_GxIdeSearch_searchInputKeyDownHandler","key","length","id","caption","labels","results","expanded","parts","items","map","item","objectId","startImgSrc","objectIcon","objectName","leaf","_GxIdeSearch_treeItemDoubleClickHandler","itemId","detail","itemDoubleClickCallback","_GxIdeSearch_renderSearchResults","h","stateTitle","noKbOpenState","title","stateDescription","description","stateIconSrc","isAnimated","loaderTitle","loader","show","class","model","expandableButton","expandOnClick","onItemOpenReference","emptyState","valueChangeHandler","newValue","showSettings","_show","Promise","resolve","componentWillLoad","Locale","getComponentStrings","el","render","Host","accessibleName","placeholder","placeholders","search","debounce","config","inputDebounce","onInput","onKeyDown","type","disabled"],"sources":["src/components/search/search.scss?tag=gx-ide-search&encapsulation=shadow","src/components/search/search.tsx"],"sourcesContent":[":host {\n display: grid;\n block-size: 100%;\n}\n\n.search {\n display: grid;\n grid-template-rows: max-content 1fr;\n gap: var(--spacing-gap-xl);\n\n &__header {\n display: grid;\n grid-template-columns: 1fr;\n }\n\n &__results {\n position: relative;\n }\n}\nch-tree-view-render::part(root-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-semi-bold);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n}\nch-tree-view-render::part(search-item item__header) {\n padding-inline-start: 0;\n font-weight: var(--font-style-regular);\n font-size: var(--font-size-body-s);\n line-height: var(--line-height-relaxed);\n font-family: var(--font-family-body);\n color: var(--color-text-neutral-neutral) !important;\n}\n.input--loading::part(start-img) {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n 100% {\n transform: rotate(360deg);\n }\n}\n","import {\n Component,\n Element,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch\n} from \"@stencil/core\";\n\nimport {\n ChTreeViewRenderCustomEvent,\n TreeViewItemModel,\n TreeViewItemOpenReferenceInfo,\n TreeViewModel\n} from \"@genexus/chameleon-controls-library\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/edit\",\n \"components/tree-view\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\nconst SEARCH_ICON = getIconPath({\n category: \"system\",\n name: \"search\",\n colorType: \"on-surface\"\n});\n\nconst INFORMATION_ICON = getIconPath({\n category: \"system\",\n name: \"information\",\n colorType: \"on-interactive\"\n});\n\n@Component({\n tag: \"gx-ide-search\",\n styleUrl: \"search.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/search\"]\n})\nexport class GxIdeSearch {\n #componentLocale: any;\n #searchInputValue: string = \"\";\n\n @Element() el: HTMLGxIdeSearchElement;\n\n /**\n * Holds the search results as a TreeViewModel\n */\n @State() searchResultModel: TreeViewModel = [];\n\n /**\n * Tracks if a search has been performed\n */\n @State() hasSearched = false;\n\n /**\n * Tracks if a search is currently in progress\n */\n @State() isSearching = false;\n\n /**\n * Indicates whether a Knowledge Base is currently open\n */\n @Prop() readonly isKbOpen: boolean = false;\n @Watch(\"isKbOpen\")\n valueChangeHandler(newValue: boolean) {\n if (!newValue) {\n this.#searchInputValue = \"\";\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n }\n }\n\n /**\n * Callback to fetch search results\n */\n @Prop() readonly searchCallback!: (\n searchParams: SearchParamsData\n ) => Promise<SearchResultData[]>;\n\n /**\n * Callback invoked when a search result item is double-clicked\n */\n @Prop() readonly itemDoubleClickCallback?: ItemDoubleClickCallback;\n\n /**\n * Method to show or hide the settings panel, can be called from the outside to control the visibility of the settings\n */\n @Method()\n async showSettings(_show: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #searchInputHandler = async (event: CustomEvent<string> | InputEvent) => {\n if (!this.isKbOpen) {\n return;\n }\n\n const inputElement = event.target as HTMLChEditElement;\n const searchText = inputElement?.value?.trim();\n this.#searchInputValue = searchText;\n\n if (!searchText) {\n this.searchResultModel = [];\n this.hasSearched = false;\n this.isSearching = false;\n return;\n }\n\n this.hasSearched = true;\n this.isSearching = true;\n this.searchResultModel = [];\n\n try {\n const searchResultData = await this.searchCallback({\n text: searchText,\n onlyTitles: false,\n includeSubModules: true,\n allBranches: false,\n forLLM: false\n });\n\n this.searchResultModel =\n this.#mapSearchResultToTreeViewModel(searchResultData);\n } finally {\n this.isSearching = false;\n }\n };\n\n #searchInputKeyDownHandler = (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.#searchInputHandler(event as any);\n }\n };\n\n #mapSearchResultToTreeViewModel = (\n searchResultData: SearchResultData[]\n ): TreeViewModel => {\n if (!searchResultData || searchResultData.length === 0) {\n return [];\n }\n return [\n {\n id: \"root\",\n caption: `${this.#componentLocale.labels.results} (${searchResultData.length})`,\n expanded: true,\n parts: \"root-item\",\n items: searchResultData.map(\n (item): TreeViewItemModel => ({\n id: item.objectId,\n startImgSrc: item.objectIcon,\n caption: item.objectName,\n leaf: true,\n parts: \"search-item\"\n })\n )\n }\n ];\n };\n\n #treeItemDoubleClickHandler = async (\n event: ChTreeViewRenderCustomEvent<TreeViewItemOpenReferenceInfo>\n ) => {\n const itemId = event.detail.id;\n await this.itemDoubleClickCallback?.(itemId);\n };\n\n #renderSearchResults = () => {\n if (!this.isKbOpen) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.noKbOpenState.title}\n stateDescription={this.#componentLocale.noKbOpenState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n if (this.isSearching) {\n return (\n <gx-ide-loader\n loaderTitle={this.#componentLocale.loader.title}\n show={true}\n ></gx-ide-loader>\n );\n }\n\n if (this.searchResultModel.length > 0) {\n return (\n <ch-tree-view-render\n class=\"tree-view\"\n model={this.searchResultModel}\n expandableButton=\"no\"\n expandOnClick={false}\n onItemOpenReference={this.#treeItemDoubleClickHandler}\n />\n );\n }\n\n if (this.hasSearched) {\n return (\n <gx-ide-empty-state\n stateTitle={this.#componentLocale.emptyState.title}\n stateDescription={this.#componentLocale.emptyState.description}\n stateIconSrc={INFORMATION_ICON}\n isAnimated={true}\n ></gx-ide-empty-state>\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class={\"spacing-body search\"}>\n <header class=\"search__header\">\n <ch-edit\n id=\"search-input\"\n class=\"input\"\n accessibleName={this.#componentLocale.accessibleName}\n placeholder={this.#componentLocale.placeholders.search}\n debounce={config.inputDebounce}\n onInput={this.#searchInputHandler}\n onKeyDown={this.#searchInputKeyDownHandler}\n type=\"search\"\n startImgSrc={SEARCH_ICON}\n disabled={!this.isKbOpen}\n value={this.#searchInputValue}\n ></ch-edit>\n </header>\n\n <main class=\"search__results\">{this.#renderSearchResults()}</main>\n </section>\n </Host>\n );\n }\n}\n\nexport type SearchResultData = {\n objectId: string;\n objectName: string;\n objectTypeName: string;\n objectTypeId: string;\n objectModuleName: string;\n objectUri: string;\n objectIcon: string;\n content: string;\n preview: string;\n};\n\nexport type SearchParamsData = {\n moduleGuid?: string;\n objectTypeName?: string;\n text: string;\n tags?: string;\n count?: number;\n onlyTitles: boolean;\n includeSubModules: boolean;\n allBranches: boolean;\n forLLM: boolean;\n};\n\nexport type ItemDoubleClickCallback = (itemId: string) => Promise<void>;\n\nexport type SearchCallback = (\n searchParams: SearchParamsData\n) => Promise<SearchResultData[]>;\n"],"mappings":"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"}
|