@genexus/genexus-ide-ui 1.0.38 → 1.0.40

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 (75) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js +26 -16
  3. package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js.map +1 -1
  4. package/dist/cjs/gx-ide-ai-message.cjs.entry.js +22 -11
  5. package/dist/cjs/gx-ide-ai-message.cjs.entry.js.map +1 -1
  6. package/dist/cjs/gx-ide-current-user-info.cjs.entry.js +42 -3
  7. package/dist/cjs/gx-ide-current-user-info.cjs.entry.js.map +1 -1
  8. package/dist/cjs/gx-ide-data-type-selector.cjs.entry.js +226 -0
  9. package/dist/cjs/gx-ide-data-type-selector.cjs.entry.js.map +1 -0
  10. package/dist/cjs/loader.cjs.js +1 -1
  11. package/dist/collection/collection-manifest.json +1 -0
  12. package/dist/collection/components/ai-assistant/ai-assistant.js +26 -35
  13. package/dist/collection/components/ai-assistant/ai-assistant.js.map +1 -1
  14. package/dist/collection/components/ai-assistant/ai-message.css +13 -11
  15. package/dist/collection/components/ai-assistant/ai-message.js +41 -13
  16. package/dist/collection/components/ai-assistant/ai-message.js.map +1 -1
  17. package/dist/collection/components/current-user-info/current-user-info.css +7 -0
  18. package/dist/collection/components/current-user-info/current-user-info.js +4 -2
  19. package/dist/collection/components/current-user-info/current-user-info.js.map +1 -1
  20. package/dist/collection/components/current-user-info/helpers.js +38 -1
  21. package/dist/collection/components/current-user-info/helpers.js.map +1 -1
  22. package/dist/collection/components/data-type-selector/data-type-selector.css +24 -0
  23. package/dist/collection/components/data-type-selector/data-type-selector.js +275 -0
  24. package/dist/collection/components/data-type-selector/data-type-selector.js.map +1 -0
  25. package/dist/collection/components/data-type-selector/gx-ide-assets/data-type-selector/langs/data-type-selector.lang.en.json +13 -0
  26. package/dist/collection/components/data-type-selector/gx-ide-assets/data-type-selector/langs/data-type-selector.lang.ja.json +13 -0
  27. package/dist/collection/components/data-type-selector/gx-ide-assets/data-type-selector/langs/data-type-selector.lang.zh.json +13 -0
  28. package/dist/collection/components/data-type-selector/helpers.js +38 -0
  29. package/dist/collection/components/data-type-selector/helpers.js.map +1 -0
  30. package/dist/collection/components/kb-manager-import/kb-manager-import.js +1 -1
  31. package/dist/collection/components/team-dev/update/update.js +1 -1
  32. package/dist/collection/testing/locale.e2e.js +1 -0
  33. package/dist/collection/testing/locale.e2e.js.map +1 -1
  34. package/dist/components/ai-message.js +23 -11
  35. package/dist/components/ai-message.js.map +1 -1
  36. package/dist/components/gx-ide-ai-assistant.js +28 -18
  37. package/dist/components/gx-ide-ai-assistant.js.map +1 -1
  38. package/dist/components/gx-ide-current-user-info.js +42 -3
  39. package/dist/components/gx-ide-current-user-info.js.map +1 -1
  40. package/dist/components/gx-ide-data-type-selector.d.ts +11 -0
  41. package/dist/components/gx-ide-data-type-selector.js +258 -0
  42. package/dist/components/gx-ide-data-type-selector.js.map +1 -0
  43. package/dist/esm/genexus-ide-ui.js +1 -1
  44. package/dist/esm/gx-ide-ai-assistant.entry.js +27 -17
  45. package/dist/esm/gx-ide-ai-assistant.entry.js.map +1 -1
  46. package/dist/esm/gx-ide-ai-message.entry.js +22 -11
  47. package/dist/esm/gx-ide-ai-message.entry.js.map +1 -1
  48. package/dist/esm/gx-ide-current-user-info.entry.js +42 -3
  49. package/dist/esm/gx-ide-current-user-info.entry.js.map +1 -1
  50. package/dist/esm/gx-ide-data-type-selector.entry.js +222 -0
  51. package/dist/esm/gx-ide-data-type-selector.entry.js.map +1 -0
  52. package/dist/esm/loader.js +1 -1
  53. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  54. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  55. package/dist/genexus-ide-ui/gx-ide-assets/data-type-selector/langs/data-type-selector.lang.en.json +13 -0
  56. package/dist/genexus-ide-ui/gx-ide-assets/data-type-selector/langs/data-type-selector.lang.ja.json +13 -0
  57. package/dist/genexus-ide-ui/gx-ide-assets/data-type-selector/langs/data-type-selector.lang.zh.json +13 -0
  58. package/dist/genexus-ide-ui/{p-798eb91a.entry.js → p-6e993843.entry.js} +42 -22
  59. package/dist/genexus-ide-ui/p-6e993843.entry.js.map +1 -0
  60. package/dist/genexus-ide-ui/p-a3a43593.entry.js +255 -0
  61. package/dist/genexus-ide-ui/p-a3a43593.entry.js.map +1 -0
  62. package/dist/genexus-ide-ui/{p-dd890eed.entry.js → p-c2ec8185.entry.js} +85 -46
  63. package/dist/genexus-ide-ui/p-c2ec8185.entry.js.map +1 -0
  64. package/dist/genexus-ide-ui/{p-a7dcfedd.entry.js → p-fdd9de33.entry.js} +62 -54
  65. package/dist/genexus-ide-ui/p-fdd9de33.entry.js.map +1 -0
  66. package/dist/types/components/ai-assistant/ai-assistant.d.ts +1 -6
  67. package/dist/types/components/ai-assistant/ai-message.d.ts +5 -0
  68. package/dist/types/components/current-user-info/helpers.d.ts +24 -1
  69. package/dist/types/components/data-type-selector/data-type-selector.d.ts +46 -0
  70. package/dist/types/components/data-type-selector/helpers.d.ts +4 -0
  71. package/dist/types/components.d.ts +47 -19
  72. package/package.json +2 -1
  73. package/dist/genexus-ide-ui/p-798eb91a.entry.js.map +0 -1
  74. package/dist/genexus-ide-ui/p-a7dcfedd.entry.js.map +0 -1
  75. package/dist/genexus-ide-ui/p-dd890eed.entry.js.map +0 -1
@@ -26,6 +26,7 @@ import { KBData, KBVersion, KnowledgeBaseInfo } from "./components/team-dev/crea
26
26
  import { Mode, UserInfo } from "./components/current-user-info/current-user-info";
27
27
  import { EditResult, EnvironmentData, KBData as KBData1, recentObjectData } from "./components/dashboard-home/dashboard-home";
28
28
  import { CancelCallback as CancelCallback3, ConfirmCallback as ConfirmCallback2, EditCallback, LoadItemsCallback, NewVariableCallback, SelectObjectCallback } from "./components/data-selector/data-selector";
29
+ import { DataTypeCategoryData, DataTypeData, DataTypeSelectedCallback } from "./components/data-type-selector/data-type-selector";
29
30
  import { CancelCallback as CancelCallback4, ConfirmCallback as ConfirmCallback3, LoadCallback, LoadDesignSystemCallback, LoadFontCallback, LoadImageCallback, LoadPanelDataCallback, ReactiveSettings, RequiresAccessTokenCallback, SelectModuleCallback, TextEditorFactoryCallback } from "./components/design-import/design-import";
30
31
  import { DirectorySelectorLabels, LabelPosition } from "./components/_helpers/directory-selector/directory-selector";
31
32
  import { ModuleServerData, ModuleServerType } from "./components/modules/types";
@@ -79,6 +80,7 @@ export { KBData, KBVersion, KnowledgeBaseInfo } from "./components/team-dev/crea
79
80
  export { Mode, UserInfo } from "./components/current-user-info/current-user-info";
80
81
  export { EditResult, EnvironmentData, KBData as KBData1, recentObjectData } from "./components/dashboard-home/dashboard-home";
81
82
  export { CancelCallback as CancelCallback3, ConfirmCallback as ConfirmCallback2, EditCallback, LoadItemsCallback, NewVariableCallback, SelectObjectCallback } from "./components/data-selector/data-selector";
83
+ export { DataTypeCategoryData, DataTypeData, DataTypeSelectedCallback } from "./components/data-type-selector/data-type-selector";
82
84
  export { CancelCallback as CancelCallback4, ConfirmCallback as ConfirmCallback3, LoadCallback, LoadDesignSystemCallback, LoadFontCallback, LoadImageCallback, LoadPanelDataCallback, ReactiveSettings, RequiresAccessTokenCallback, SelectModuleCallback, TextEditorFactoryCallback } from "./components/design-import/design-import";
83
85
  export { DirectorySelectorLabels, LabelPosition } from "./components/_helpers/directory-selector/directory-selector";
84
86
  export { ModuleServerData, ModuleServerType } from "./components/modules/types";
@@ -155,6 +157,10 @@ export namespace Components {
155
157
  "userMessageCallback": UserMessageCallback;
156
158
  }
157
159
  interface GxIdeAiMessage {
160
+ /**
161
+ * A reference to the gx-ide-ai-assistant host element
162
+ */
163
+ "aiAssistantHostRef": HTMLGxIdeAiAssistantElement;
158
164
  /**
159
165
  * The filter value
160
166
  */
@@ -666,6 +672,20 @@ export namespace Components {
666
672
  */
667
673
  "validate": () => Promise<boolean>;
668
674
  }
675
+ interface GxIdeDataTypeSelector {
676
+ /**
677
+ * All possible types and its category
678
+ */
679
+ "categories": DataTypeCategoryData[];
680
+ /**
681
+ * Callback invoked when user select an item type
682
+ */
683
+ "dataTypeSelectedCallback": DataTypeSelectedCallback;
684
+ /**
685
+ * All recently used types list
686
+ */
687
+ "recentlyUsed": DataTypeData[];
688
+ }
669
689
  interface GxIdeDesignImport {
670
690
  /**
671
691
  * The access token for the given path, which is not always required
@@ -1944,10 +1964,6 @@ export namespace Components {
1944
1964
  "validate": () => Promise<boolean>;
1945
1965
  }
1946
1966
  }
1947
- export interface GxIdeAiAssistantCustomEvent<T> extends CustomEvent<T> {
1948
- detail: T;
1949
- target: HTMLGxIdeAiAssistantElement;
1950
- }
1951
1967
  export interface GxIdeBpmAppDeclarationCustomEvent<T> extends CustomEvent<T> {
1952
1968
  detail: T;
1953
1969
  target: HTMLGxIdeBpmAppDeclarationElement;
@@ -2073,18 +2089,7 @@ export interface GxIdeWwImagesCustomEvent<T> extends CustomEvent<T> {
2073
2089
  target: HTMLGxIdeWwImagesElement;
2074
2090
  }
2075
2091
  declare global {
2076
- interface HTMLGxIdeAiAssistantElementEventMap {
2077
- "componentDidRenderFirstTime": boolean;
2078
- }
2079
2092
  interface HTMLGxIdeAiAssistantElement extends Components.GxIdeAiAssistant, HTMLStencilElement {
2080
- addEventListener<K extends keyof HTMLGxIdeAiAssistantElementEventMap>(type: K, listener: (this: HTMLGxIdeAiAssistantElement, ev: GxIdeAiAssistantCustomEvent<HTMLGxIdeAiAssistantElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2081
- addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2082
- addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2083
- addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2084
- removeEventListener<K extends keyof HTMLGxIdeAiAssistantElementEventMap>(type: K, listener: (this: HTMLGxIdeAiAssistantElement, ev: GxIdeAiAssistantCustomEvent<HTMLGxIdeAiAssistantElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2085
- removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2086
- removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2087
- removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2088
2093
  }
2089
2094
  var HTMLGxIdeAiAssistantElement: {
2090
2095
  prototype: HTMLGxIdeAiAssistantElement;
@@ -2281,6 +2286,12 @@ declare global {
2281
2286
  prototype: HTMLGxIdeDataSelectorElement;
2282
2287
  new (): HTMLGxIdeDataSelectorElement;
2283
2288
  };
2289
+ interface HTMLGxIdeDataTypeSelectorElement extends Components.GxIdeDataTypeSelector, HTMLStencilElement {
2290
+ }
2291
+ var HTMLGxIdeDataTypeSelectorElement: {
2292
+ prototype: HTMLGxIdeDataTypeSelectorElement;
2293
+ new (): HTMLGxIdeDataTypeSelectorElement;
2294
+ };
2284
2295
  interface HTMLGxIdeDesignImportElement extends Components.GxIdeDesignImport, HTMLStencilElement {
2285
2296
  }
2286
2297
  var HTMLGxIdeDesignImportElement: {
@@ -2789,6 +2800,7 @@ declare global {
2789
2800
  "gx-ide-current-user-info": HTMLGxIdeCurrentUserInfoElement;
2790
2801
  "gx-ide-dashboard-home": HTMLGxIdeDashboardHomeElement;
2791
2802
  "gx-ide-data-selector": HTMLGxIdeDataSelectorElement;
2803
+ "gx-ide-data-type-selector": HTMLGxIdeDataTypeSelectorElement;
2792
2804
  "gx-ide-design-import": HTMLGxIdeDesignImportElement;
2793
2805
  "gx-ide-directory-selector": HTMLGxIdeDirectorySelectorElement;
2794
2806
  "gx-ide-edit-module-server": HTMLGxIdeEditModuleServerElement;
@@ -2853,10 +2865,6 @@ declare namespace LocalJSX {
2853
2865
  * List of messages displayed by the component
2854
2866
  */
2855
2867
  "messages"?: Message[];
2856
- /**
2857
- * This event is emitted once just after the component is fully loaded and the first render() occurs
2858
- */
2859
- "onComponentDidRenderFirstTime"?: (event: GxIdeAiAssistantCustomEvent<boolean>) => void;
2860
2868
  /**
2861
2869
  * The prompt textarea max-height
2862
2870
  */
@@ -2871,6 +2879,10 @@ declare namespace LocalJSX {
2871
2879
  "userMessageCallback"?: UserMessageCallback;
2872
2880
  }
2873
2881
  interface GxIdeAiMessage {
2882
+ /**
2883
+ * A reference to the gx-ide-ai-assistant host element
2884
+ */
2885
+ "aiAssistantHostRef"?: HTMLGxIdeAiAssistantElement;
2874
2886
  /**
2875
2887
  * The filter value
2876
2888
  */
@@ -3418,6 +3430,20 @@ declare namespace LocalJSX {
3418
3430
  */
3419
3431
  "selectionType"?: "single" | "multiple";
3420
3432
  }
3433
+ interface GxIdeDataTypeSelector {
3434
+ /**
3435
+ * All possible types and its category
3436
+ */
3437
+ "categories"?: DataTypeCategoryData[];
3438
+ /**
3439
+ * Callback invoked when user select an item type
3440
+ */
3441
+ "dataTypeSelectedCallback"?: DataTypeSelectedCallback;
3442
+ /**
3443
+ * All recently used types list
3444
+ */
3445
+ "recentlyUsed"?: DataTypeData[];
3446
+ }
3421
3447
  interface GxIdeDesignImport {
3422
3448
  /**
3423
3449
  * The access token for the given path, which is not always required
@@ -4776,6 +4802,7 @@ declare namespace LocalJSX {
4776
4802
  "gx-ide-current-user-info": GxIdeCurrentUserInfo;
4777
4803
  "gx-ide-dashboard-home": GxIdeDashboardHome;
4778
4804
  "gx-ide-data-selector": GxIdeDataSelector;
4805
+ "gx-ide-data-type-selector": GxIdeDataTypeSelector;
4779
4806
  "gx-ide-design-import": GxIdeDesignImport;
4780
4807
  "gx-ide-directory-selector": GxIdeDirectorySelector;
4781
4808
  "gx-ide-edit-module-server": GxIdeEditModuleServer;
@@ -4838,6 +4865,7 @@ declare module "@stencil/core" {
4838
4865
  "gx-ide-current-user-info": LocalJSX.GxIdeCurrentUserInfo & JSXBase.HTMLAttributes<HTMLGxIdeCurrentUserInfoElement>;
4839
4866
  "gx-ide-dashboard-home": LocalJSX.GxIdeDashboardHome & JSXBase.HTMLAttributes<HTMLGxIdeDashboardHomeElement>;
4840
4867
  "gx-ide-data-selector": LocalJSX.GxIdeDataSelector & JSXBase.HTMLAttributes<HTMLGxIdeDataSelectorElement>;
4868
+ "gx-ide-data-type-selector": LocalJSX.GxIdeDataTypeSelector & JSXBase.HTMLAttributes<HTMLGxIdeDataTypeSelectorElement>;
4841
4869
  "gx-ide-design-import": LocalJSX.GxIdeDesignImport & JSXBase.HTMLAttributes<HTMLGxIdeDesignImportElement>;
4842
4870
  "gx-ide-directory-selector": LocalJSX.GxIdeDirectorySelector & JSXBase.HTMLAttributes<HTMLGxIdeDirectorySelectorElement>;
4843
4871
  "gx-ide-edit-module-server": LocalJSX.GxIdeEditModuleServer & JSXBase.HTMLAttributes<HTMLGxIdeEditModuleServerElement>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genexus/genexus-ide-ui",
3
3
  "license": "Apache-2.0",
4
- "version": "1.0.38",
4
+ "version": "1.0.40",
5
5
  "description": "GeneXus IDE UI components",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.js",
@@ -46,6 +46,7 @@
46
46
  "@stencil/core": "~4.9.0",
47
47
  "@stencil/sass": "~1.4.0",
48
48
  "@types/jest": "~29.5.1",
49
+ "@types/ws": "^8.5.13",
49
50
  "@typescript-eslint/eslint-plugin": "^6.15.0",
50
51
  "@typescript-eslint/parser": "^6.15.0",
51
52
  "eslint": "^8.56.0",
@@ -1 +0,0 @@
1
- {"version":3,"names":["aiMessageCss","COPY_ICON","getIconPath","category","name","colorType","GxIdeAiMessage","this","copyable","copyMessage","messageInfo","JSON","stringify","messageType","message","navigator","clipboard","writeText","showCopiedMessage","setTimeout","evaluateMessageIsCopyable","evaluateCopyIcon","h","class","src","componentWillLoad","_componentLocale","Locale","getComponentStrings","el","componentDidRender","visible","messagesList","parentElement","scrollTo","render","hidden","onClick","you","message__role","assistant","message__caption","translations","hiChar","filterValue"],"sources":["src/components/ai-assistant/ai-message.scss?tag=gx-ide-ai-message","src/components/ai-assistant/ai-message.tsx"],"sourcesContent":["@import \"../../global/gx-ide-mixins.scss\";\n\n:host {\n font-family: var(--mer-font-family--primary);\n}\n/*--- Messages ---*/\n.message {\n color: var(--mer-color__neutral-gray--100);\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 100ms;\n transition: grid-template-rows 100ms, -ms-grid-rows 100ms;\n &__outer-wrapper {\n overflow: hidden;\n }\n &__inner-wrapper {\n padding: var(--mer-spacing--sm) var(--mer-spacing--sm);\n border-radius: var(--mer-border__radius--sm);\n border-inline-start: var(--mer-border__width--md) solid transparent;\n background-color: var(--mer-color__neutral-gray--1200);\n margin-block-start: var(--mer-spacing--xs);\n position: relative;\n }\n &__header {\n display: flex;\n gap: var(--mer-spacing--xs);\n justify-content: space-between;\n pointer-events: none;\n\n .icon-md {\n opacity: 0;\n }\n }\n &__role {\n display: inline-block;\n font-weight: var(--mer-font__weight--semi-bold);\n margin-block-end: var(--mer-spacing--xs);\n display: inline-grid;\n grid-template-columns: max-content max-content;\n gap: 6px;\n &:before {\n content: \"\";\n display: grid;\n place-self: center flex-end;\n inline-size: 4px;\n block-size: 4px;\n border-radius: 50%;\n background-color: currentcolor;\n }\n\n &--user {\n color: var(--mer-color__primary--300);\n }\n &--assistant {\n }\n &--hidden {\n display: none;\n }\n }\n &__caption {\n font-size: var(--mer-font__size--xs);\n line-height: var(--mer-line-height--regular);\n }\n &--visible {\n grid-template-rows: 1fr;\n }\n &--copying {\n pointer-events: none;\n span:not(.copied),\n .message__caption {\n color: transparent;\n -webkit-user-select: none; /* Safari */\n -ms-user-select: none; /* IE 10 and IE 11 */\n user-select: none; /* Standard syntax */\n }\n }\n /*--- Types of messages ---*/\n &--user {\n .message__inner-wrapper {\n background-color: rgba(91, 167, 255, 0.08);\n border-color: var(--mer-border-color__primary);\n }\n }\n &--assistant-action {\n .message__inner-wrapper {\n background-color: rgba(63, 168, 155, 0.05);\n border-color: var(--mer-border-color__success);\n }\n }\n &--assistant-chat {\n .message__inner-wrapper {\n background-color: var(--mer-surface__elevation--01);\n }\n }\n &--assistant-in-progress {\n color: var(--mer-color__neutral-gray--500);\n .message__inner-wrapper {\n font-style: italic;\n display: grid;\n grid-template-columns: 1fr auto;\n gap: var(--mer-spacing--xs);\n\n .message__caption {\n @include ellipsis;\n flex: 1;\n }\n .animation-wrapper {\n flex: none;\n }\n }\n }\n &--assistant-error {\n .message__inner-wrapper {\n background-color: rgba(251, 124, 132, 0.05);\n border-color: var(--mer-border-color__error);\n }\n }\n &--copyable {\n cursor: pointer;\n &:hover {\n filter: brightness(1.2);\n .icon-md {\n opacity: 1;\n }\n }\n }\n &:last-child {\n margin-block-end: 0;\n }\n}\n:host(:first-child) {\n .message {\n &__inner-wrapper {\n margin-block-end: 0;\n }\n }\n}\n\n/*--- Dot Pulse Sweet Animation ---*/\n.animation-wrapper {\n width: 45px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n$color: var(--mer-color__neutral-gray--400);\n.dot-pulse {\n position: relative;\n left: -9999px;\n width: 5px;\n height: 5px;\n border-radius: 2.5px;\n background-color: $color;\n color: $color;\n box-shadow: 9999px 0 0 -5px;\n animation: dot-pulse 1.5s infinite linear;\n animation-delay: 0.25s;\n &::before,\n &::after {\n content: \"\";\n display: inline-block;\n position: absolute;\n top: 0;\n width: 5px;\n height: 5px;\n border-radius: 2.5px;\n background-color: $color;\n color: $color;\n }\n &::before {\n box-shadow: 9984px 0 0 -5px;\n animation: dot-pulse-before 1.5s infinite linear;\n animation-delay: 0s;\n }\n &::after {\n box-shadow: 10014px 0 0 -5px;\n animation: dot-pulse-after 1.5s infinite linear;\n animation-delay: 0.5s;\n }\n}\n@keyframes dot-pulse-before {\n 0% {\n box-shadow: 9984px 0 0 -5px;\n }\n 30% {\n box-shadow: 9984px 0 0 2px;\n }\n 60%,\n 100% {\n box-shadow: 9984px 0 0 -5px;\n }\n}\n@keyframes dot-pulse {\n 0% {\n box-shadow: 9999px 0 0 -5px;\n }\n 30% {\n box-shadow: 9999px 0 0 2px;\n }\n 60%,\n 100% {\n box-shadow: 9999px 0 0 -5px;\n }\n}\n@keyframes dot-pulse-after {\n 0% {\n box-shadow: 10014px 0 0 -5px;\n }\n 30% {\n box-shadow: 10014px 0 0 2px;\n }\n 60%,\n 100% {\n box-shadow: 10014px 0 0 -5px;\n }\n}\n\n/*--- Copy Message ---*/\n.copied {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mer-color__neutral-gray--300);\n display: flex;\n gap: var(--mer-spacing--xs);\n opacity: 0;\n animation: fadeIn var(--mer-timing--fast) ease-out forwards;\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@include hiChar;\n","/* STENCIL IMPORTS */\nimport { Component, h, Prop, Element, State } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { getIconPath } from \"@genexus/mercury\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { MessageType } from \"./ai-assistant\";\nimport { hiChar } from \"../../common/helpers\";\n\nconst COPY_ICON = getIconPath({\n category: \"bpm\",\n name: \"tasks\",\n colorType: \"neutral\"\n});\n@Component({\n tag: \"gx-ide-ai-message\",\n styleUrl: \"ai-message.scss\",\n shadow: false,\n assetsDirs: [\"gx-ide-assets/ai-message\"]\n})\nexport class GxIdeAiMessage {\n /*\nINDEX:\n1.OWN PROPERTIES \n2.REFERENCE TO ELEMENTS\n3.STATE() VARIABLES\n4.PUBLIC PROPERTY API | WATCH'S\n5.EVENTS (EMIT)\n6.COMPONENT LIFECYCLE METHODS\n7.LISTENERS\n8.PUBLIC METHODS API\n9.LOCAL METHODS\n10.RENDER() FUNCTION\n*/\n\n // 1.OWN PROPERTIES //\n\n /* The message allows to be copied*/\n private _componentLocale: any;\n private copyable = false;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeAiMessageElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * This wil display the message if true\n */\n @State() visible = false;\n\n /**\n * This wil show the user a text, indicating that the message has been copied\n */\n @State() showCopiedMessage = false;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * The actual message\n */\n @Prop() readonly message: string;\n\n /**\n * The message type\n */\n @Prop() readonly messageType: MessageType;\n\n /**\n * The filter value\n */\n @Prop() readonly filterValue: string;\n\n /**\n * It hides the message (used for the filter)\n */\n @Prop() readonly hidden: boolean;\n\n /**\n * An object with the needed string translations.\n */\n @Prop() readonly translations: Translations;\n\n // 5.EVENTS (EMIT) //\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n this.evaluateMessageIsCopyable();\n }\n\n componentDidRender() {\n setTimeout(() => {\n /* Without the timeout it appears instantly (no apparent transition)*/\n this.visible = true;\n const messagesList = this.el.parentElement;\n messagesList.scrollTo(0, 0);\n }, 0);\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n // 9.LOCAL METHODS //\n\n private copyMessage = () => {\n const messageInfo = JSON.stringify(\n {\n messageType: this.messageType,\n message: this.message\n },\n null,\n 2\n );\n\n navigator.clipboard.writeText(messageInfo);\n this.showCopiedMessage = true;\n setTimeout(() => {\n this.showCopiedMessage = false;\n }, 1500);\n };\n\n private evaluateMessageIsCopyable = () => {\n this.copyable = this.messageType !== \"assistant-in-progress\";\n };\n\n private evaluateCopyIcon = () => {\n return this.copyable ? (\n <ch-image class=\"icon-md\" src={COPY_ICON}></ch-image>\n ) : null;\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <li\n class={{\n \"message\": true,\n \"message--visible\": this.visible && !this.hidden,\n [`message--${[this.messageType]}`]: true,\n \"message--assistant\": this.messageType !== \"user\",\n \"message--copyable\": this.copyable,\n \"message--copying\": this.showCopiedMessage\n }}\n onClick={this.copyable && this.copyMessage}\n >\n <div class=\"message__outer-wrapper\">\n <div\n class={{\n \"message__inner-wrapper\": true\n }}\n >\n {this.messageType === \"user\" ? (\n <div class=\"message__header\">\n <span class=\"message__role message__role--user\">\n {this._componentLocale.you}\n </span>\n {this.evaluateCopyIcon()}\n </div>\n ) : (\n <div class=\"message__header\">\n <span\n class={{\n \"message__role\":\n this.messageType !== \"assistant-in-progress\",\n \"message__role--hidden\":\n this.messageType === \"assistant-in-progress\",\n \"message__role--assistant\": true\n }}\n >\n {this._componentLocale.assistant}\n </span>\n {this.evaluateCopyIcon()}\n </div>\n )}\n <div\n class={{\n \"message__caption\": true,\n \"message__caption--in-progress\":\n this.messageType === \"assistant-in-progress\"\n }}\n >\n {this.showCopiedMessage ? (\n <span class=\"copied\">\n <ch-image class=\"icon-md\" src={COPY_ICON}></ch-image>\n {this.translations[\"copied\"]}\n </span>\n ) : null}\n {hiChar(this.message, this.filterValue)}\n </div>\n {this.messageType === \"assistant-in-progress\" ? (\n <div class=\"animation-wrapper\">\n <div class=\"dot-pulse\"></div>\n </div>\n ) : null}\n </div>\n </div>\n </li>\n );\n }\n}\n\nexport type Translations = {\n [key: string]: string;\n};\n"],"mappings":";;;;;;;;AAAA,MAAMA,IAAe;;ACSrB,MAAMC,IAAYC,EAAY;EAC5BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;MAQAC,IAAc;;;IAmBjBC,KAAAC,WAAW;;;;QAqEXD,KAAAE,cAAc;MACpB,MAAMC,IAAcC,KAAKC,UACvB;QACEC,aAAaN,KAAKM;QAClBC,SAASP,KAAKO;SAEhB,MACA;MAGFC,UAAUC,UAAUC,UAAUP;MAC9BH,KAAKW,oBAAoB;MACzBC,YAAW;QACTZ,KAAKW,oBAAoB;AAAK,UAC7B;AAAK;IAGFX,KAAAa,4BAA4B;MAClCb,KAAKC,WAAWD,KAAKM,gBAAgB;AAAuB;IAGtDN,KAAAc,mBAAmB,MAClBd,KAAKC,WACVc,EAAA;MAAUC,OAAM;MAAUC,KAAKvB;SAC7B;mBAlFa;6BAKU;;;;;;;;;EAiC7B,uBAAMwB;IACJlB,KAAKmB,yBAAyBC,EAAOC,oBAAoBrB,KAAKsB;IAC9DtB,KAAKa;;EAGP,kBAAAU;IACEX,YAAW;;MAETZ,KAAKwB,UAAU;MACf,MAAMC,IAAezB,KAAKsB,GAAGI;MAC7BD,EAAaE,SAAS,GAAG;AAAE,QAC1B;;;EAsCL,MAAAC;IACE,OACEb,EAAA;MACEC,OAAO;QACLT,SAAW;QACX,oBAAoBP,KAAKwB,YAAYxB,KAAK6B;QAC1C,CAAC,YAAY,EAAC7B,KAAKM,kBAAiB;QACpC,sBAAsBN,KAAKM,gBAAgB;QAC3C,qBAAqBN,KAAKC;QAC1B,oBAAoBD,KAAKW;;MAE3BmB,SAAS9B,KAAKC,YAAYD,KAAKE;OAE/Ba,EAAA;MAAKC,OAAM;OACTD,EAAA;MACEC,OAAO;QACL,0BAA0B;;OAG3BhB,KAAKM,gBAAgB,SACpBS,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAMC,OAAM;OACThB,KAAKmB,iBAAiBY,MAExB/B,KAAKc,sBAGRC,EAAA;MAAKC,OAAM;OACTD,EAAA;MACEC,OAAO;QACLgB,eACEhC,KAAKM,gBAAgB;QACvB,yBACEN,KAAKM,gBAAgB;QACvB,4BAA4B;;OAG7BN,KAAKmB,iBAAiBc,YAExBjC,KAAKc,qBAGVC,EAAA;MACEC,OAAO;QACLkB,kBAAoB;QACpB,iCACElC,KAAKM,gBAAgB;;OAGxBN,KAAKW,oBACJI,EAAA;MAAMC,OAAM;OACVD,EAAA;MAAUC,OAAM;MAAUC,KAAKvB;QAC9BM,KAAKmC,aAAa,aAEnB,MACHC,EAAOpC,KAAKO,SAASP,KAAKqC,eAE5BrC,KAAKM,gBAAgB,0BACpBS,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAKC,OAAM;UAEX"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["aiAssistantCss","CSS_BUNDLES","GxIdeTemplate","this","renderedFirstTime","setFocus","scrollToBottomFlag","evaluateAiInProgress","_a","messages","length","type","aIInProgress","evaluateAiStatus","assistantStatus","renderMessage","message","i","text","h","messageType","hidden","filterValue","key","toString","translations","_componentLocale","aiMessage","textAreaInputHandler","userHasTyped","showFilter","filterEl","value","promptEnterHandler","async","prompt","promptTrimmed","detail","replace","textAreaEl","setTimeout","lastUserMessageHeight","offsetHeight","addMessage","userMessageCallback","then","filterMessagesHandler","e","toLowerCase","filteredMessages","forEach","includes","clearMessages","focus","clearCallback","attachShortcuts","focusShortcuts","ctrlFocusIndex","findIndex","toLocaleLowerCase","shiftFocusIndex","cmdKeyIndex","keyFocus","find","document","addEventListener","ctrlKey","shiftKey","metaKey","promptArrowUpHandler","lastUserMessage","textareaShadowPart","style","height","toggleFilterHandler","promptFocusHandler","promptHasFocus","promptBlurHandler","scrollToBottom","messagesWrapperEl","scrollTo","scrollHeight","scrollTop","clientHeight","watchAIInProgressHandler","aiInProgress","watchMessagesHandler","componentWillLoad","Locale","getComponentStrings","el","componentDidLoad","shadowRoot","querySelector","componentDidRender","componentDidRenderFirstTime","emit","componentName","handleFocus","event","preventDefault","clear","updateInProgressMessage","pop","push","render","Host","class","model","filter","icon","onClick","disabled","onInput","ref","scrollable","map","ai","promptValue","maxHeight","promptMaxHeight","placeholder","processingQueryPlaceholder","promptPlaceholder","onEnter","onArrowUpPressed","onBlur","onFocus","_b","prompt__shortcuts","shortcut"],"sources":["src/components/ai-assistant/ai-assistant.scss?tag=gx-ide-ai-assistant&encapsulation=shadow","src/components/ai-assistant/ai-assistant.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n@import \"../../../node_modules/@genexus/gemini/dist/gemini/globals/mixins.scss\";\n\n:host {\n font-family: var(--mer-font-family--primary);\n display: block;\n height: 100%;\n flex-basis: 286px;\n flex-shrink: 0;\n height: 100%;\n overflow-y: auto;\n}\n.gx-ide-main-wrapper {\n padding: 0 10px 52px 10px;\n background-color: var(--mer-surface);\n height: 100%;\n display: grid;\n grid-template-rows: auto 1fr auto;\n gap: var(--mer-spacing--sm);\n}\n\n/*--- Header ---*/\n.header {\n padding-block-start: var(--mer-spacing--sm);\n display: flex;\n flex-direction: column;\n\n &__actions-wrapper {\n display: flex;\n gap: var(--ai-assistant-header-actions-gap);\n margin-inline-start: auto;\n }\n &__first-row {\n display: flex;\n gap: var(--mer-spacing--xs);\n align-items: center;\n justify-content: space-between;\n }\n &__filter {\n margin-block-start: var(--mer-spacing--xs);\n }\n &__second-row {\n transition: 100ms grid-template-rows;\n display: grid;\n grid-template-rows: 0fr;\n\n &--visible {\n grid-template-rows: 1fr;\n }\n }\n .filter-inner-wrapper {\n overflow: hidden;\n }\n}\n\n/*--- Messages ---*/\n.messages-wrapper {\n position: relative;\n overflow: auto;\n display: flex;\n flex-direction: column;\n scroll-behavior: smooth;\n @include gxg-scrollbar();\n}\n.messages {\n display: flex;\n flex-direction: column;\n list-style-type: none;\n padding: 0;\n margin: 0;\n}\n\n/*--- Prompt ---*/\n.prompt {\n position: relative;\n margin-top: auto;\n\n &__textarea {\n &::part(textarea-wrapper) {\n border: none;\n }\n &::part(textarea) {\n border: none;\n background-color: var(--mer-color__neutral-gray--800);\n }\n }\n &__shortcuts {\n position: absolute;\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--2xs);\n padding-inline-end: var(--mer-spacing--xs);\n right: 0;\n top: 0;\n height: 100%;\n }\n &__shortcut {\n color: var(--mer-color__neutral-gray--400);\n font-size: var(--mer-font__size--2xs);\n padding: var(--mer-spacing--3xs) var(--mer-spacing--xs);\n background-color: var(--mer-color__neutral-gray--700);\n border-radius: var(--mer-border__radius--xs);\n }\n}\n","/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Element,\n Method,\n State,\n Watch,\n Listen\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nconst CSS_BUNDLES: MercuryBundles = [\"resets/box-sizing\", \"components/icon\"];\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\n\n@Component({\n tag: \"gx-ide-ai-assistant\",\n styleUrl: \"ai-assistant.scss\",\n shadow: { delegatesFocus: true },\n assetsDirs: [\"gx-ide-assets/ai-assistant\"]\n})\nexport class GxIdeTemplate {\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private renderedFirstTime = false;\n /* lastUserMessageHeight is used to set the appropriate height on the textarea, if user presses arrowUp (recover last message)*/\n private lastUserMessageHeight: number;\n private setFocus = true;\n private scrollToBottomFlag = true;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeAiAssistantElement;\n private textAreaEl!: HTMLGxgFormTextareaElement;\n private textareaShadowPart: HTMLTextAreaElement;\n private filterEl: HTMLGxgFormTextElement;\n private messagesWrapperEl!: HTMLDivElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * Flag used to hide the shortcuts\n */\n @State() userHasTyped = false;\n\n /**\n * This is true if the last message is of type 'assistant-in-progress'\n */\n @State() aIInProgress = false;\n @Watch(\"aIInProgress\")\n watchAIInProgressHandler(aiInProgress: boolean) {\n if (!aiInProgress) {\n this.setFocus = true;\n }\n }\n\n /**\n * This displays or hides the messages filter\n */\n @State() showFilter = false;\n\n /**\n * True if the prompt textbox has focus\n */\n @State() promptHasFocus = false;\n\n /**\n * The filter value\n */\n @State() filterValue: string;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * List of messages displayed by the component\n */\n @Prop({ mutable: true }) messages: Message[] = [];\n @Watch(\"messages\")\n watchMessagesHandler() {\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n }\n\n /**\n * The prompt textarea max-height\n */\n @Prop() readonly promptMaxHeight = \"128px\";\n\n /**\n * A temporary property to illustrate the assistant status\n */\n @Prop({ mutable: true }) assistantStatus: AiStatus = \"indeterminate\";\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly focusShortcuts: string[];\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly userMessageCallback: UserMessageCallback;\n\n /**\n * Callback that must be invoked when the conversation is cleared, using the header button.\n */\n @Prop() readonly clearCallback: () => Promise<void>;\n\n /**\n * the prompt value\n */\n @Prop() readonly promptValue: string;\n\n /**\n * If tue, it will display a filter.\n */\n @Prop() readonly filter = true;\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() componentDidRenderFirstTime: EventEmitter<boolean>;\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n this.attachShortcuts();\n }\n\n componentDidLoad() {\n this.textareaShadowPart =\n this.textAreaEl.shadowRoot.querySelector(\"textarea\");\n }\n\n componentDidRender() {\n if (!this.renderedFirstTime) {\n this.componentDidRenderFirstTime.emit(\n this._componentLocale.componentName\n );\n this.renderedFirstTime = true;\n }\n if (this.setFocus) {\n setTimeout(() => {\n /* Doesn't seems to work without the setTimeout */\n this.textAreaEl.focus();\n this.setFocus = false;\n }, 50);\n }\n setTimeout(() => {\n this.scrollToBottom();\n }, 200);\n }\n\n // 7.LISTENERS //\n\n @Listen(\"focus\", { capture: true })\n handleFocus(event: FocusEvent) {\n if (this.textAreaEl) {\n event.preventDefault();\n this.textAreaEl.focus();\n }\n }\n\n // 8.PUBLIC METHODS API //\n\n /**\n * Clear the list of messages\n */\n @Method()\n async clear() {\n this.messages = [];\n }\n\n /**\n * Add a message. This method will be used by the host to add messages from the assistant\n */\n @Method()\n async addMessage(message: Message) {\n if (message.text?.length > 0) {\n const messages = [...this.messages];\n const updateInProgressMessage =\n messages?.length > 0 &&\n messages[messages.length - 1].type === \"assistant-in-progress\";\n if (updateInProgressMessage) {\n messages.pop();\n }\n messages.push(message);\n this.messages = messages;\n }\n }\n\n // 9.LOCAL METHODS //\n\n private evaluateAiInProgress = () => {\n if (\n this.messages?.length > 0 &&\n this.messages[this.messages.length - 1].type === \"assistant-in-progress\"\n ) {\n this.aIInProgress = true;\n } else {\n this.aIInProgress = false;\n }\n };\n\n private evaluateAiStatus = () => {\n if (this.messages?.length === 0) {\n this.assistantStatus = \"indeterminate\";\n return;\n }\n if (\n this.messages[this.messages.length - 1].type ===\n \"assistant-in-progress\" ||\n this.messages[this.messages.length - 1].type === \"user\"\n ) {\n this.assistantStatus = \"indeterminate\";\n } else if (\n this.messages[this.messages.length - 1].type === \"assistant-error\"\n ) {\n this.assistantStatus = \"error\";\n } else {\n this.assistantStatus = \"success\";\n }\n };\n\n private renderMessage = (\n message: Message,\n i: number\n ): HTMLLIElement | void => {\n if (message.text.length > 0) {\n return (\n <gx-ide-ai-message\n message={message.text}\n messageType={message.type}\n hidden={message.hidden}\n filterValue={this.filterValue}\n key={`${i.toString()}-${message.type}`}\n translations={this._componentLocale.aiMessage}\n ></gx-ide-ai-message>\n );\n }\n };\n\n private textAreaInputHandler = () => {\n this.userHasTyped = true;\n this.showFilter = false;\n this.filterEl.value = \"\";\n this.filterValue = \"\";\n this.scrollToBottomFlag = true;\n };\n\n private promptEnterHandler = async (prompt: CustomEvent<string>) => {\n /* First remove double spaces */\n const promptTrimmed = prompt.detail.replace(/\\s+/g, \" \");\n /* Update textarea value to get the proper height */\n this.textAreaEl.value = promptTrimmed;\n setTimeout(() => {\n /* Then save the actual height (setTimeOut required) */\n this.lastUserMessageHeight = this.textAreaEl.offsetHeight;\n }, 0);\n /* The clear the textarea */\n this.textAreaEl.value = \"\";\n /* Insert the user message */\n this.addMessage({\n type: \"user\",\n text: promptTrimmed\n });\n /* Call the callback */\n if (this.userMessageCallback && !this.aIInProgress) {\n this.aIInProgress = true;\n this.userMessageCallback(promptTrimmed).then(() => {\n this.aIInProgress = false;\n });\n }\n };\n\n private filterMessagesHandler = (e: CustomEvent<string>) => {\n this.scrollToBottomFlag = false;\n this.filterValue = e.detail.toLowerCase();\n const filteredMessages = [...this.messages];\n filteredMessages.forEach(message => {\n if (message.text.toLowerCase().includes(this.filterValue)) {\n message.hidden = false;\n } else {\n message.hidden = true;\n }\n });\n this.messages = filteredMessages;\n };\n\n private clearMessages = () => {\n this.messages = [];\n this.textAreaEl.focus();\n if (this.clearCallback) {\n this.clearCallback();\n }\n };\n\n private attachShortcuts = () => {\n if (this.focusShortcuts?.length > 0) {\n const ctrlFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"ctrl\"\n );\n const shiftFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"shift\"\n );\n const cmdKeyIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"cmd\"\n );\n const keyFocus = this.focusShortcuts\n .find(key => {\n return (\n key.toLocaleLowerCase() !== \"ctrl\" &&\n key.toLocaleLowerCase() !== \"shift\" &&\n key.toLocaleLowerCase() !== \"cmd\"\n );\n })\n .toLowerCase();\n document.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === keyFocus && ctrlFocusIndex !== -1 && e.ctrlKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && shiftFocusIndex !== -1 && e.shiftKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && cmdKeyIndex !== -1 && e.metaKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n }\n });\n }\n };\n\n private promptArrowUpHandler = () => {\n this.userHasTyped = true;\n const lastUserMessage = this.messages?.find(message => {\n return message.type === \"user\";\n });\n if (lastUserMessage) {\n if (this.lastUserMessageHeight) {\n this.textareaShadowPart.style.height = `${this.lastUserMessageHeight}px`;\n }\n this.textAreaEl.value = lastUserMessage.text;\n }\n };\n\n private toggleFilterHandler = () => {\n this.showFilter = !this.showFilter;\n if (this.showFilter) {\n this.filterEl.focus();\n }\n };\n\n private promptFocusHandler = () => {\n this.promptHasFocus = true;\n };\n\n private promptBlurHandler = () => {\n this.promptHasFocus = false;\n };\n\n private scrollToBottom = () => {\n if (this.scrollToBottomFlag) {\n this.messagesWrapperEl.scrollTo(0, this.messagesWrapperEl.scrollHeight);\n this.messagesWrapperEl.scrollTop =\n this.messagesWrapperEl.scrollHeight -\n this.messagesWrapperEl.clientHeight;\n }\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <Host\n class={{\n [`assistant--${this.assistantStatus}`]: true,\n \"assistant--in-progress\": this.aIInProgress\n }}\n >\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"gx-ide-main-wrapper\">\n <header class=\"header\">\n <div class=\"header__first-row\">\n <gxg-title type=\"title-02\">\n {this._componentLocale.componentName}\n </gxg-title>\n <div class=\"header__actions-wrapper\">\n {this.filter ? (\n <gxg-button\n class=\"header__filter-button\"\n type=\"tertiary\"\n icon=\"menus/find\"\n onClick={this.toggleFilterHandler}\n disabled={this.messages.length === 0}\n ></gxg-button>\n ) : null}\n\n <gxg-button\n class=\"header__clear-button\"\n type=\"tertiary\"\n icon=\"bpm/delete\"\n onClick={this.clearMessages}\n disabled={this.messages.length === 0}\n ></gxg-button>\n </div>\n </div>\n {this.filter ? (\n <div\n class={{\n \"header__second-row\": true,\n \"header__second-row--visible\": this.showFilter\n }}\n >\n <div class=\"filter-inner-wrapper\">\n <gxg-form-text\n class=\"header__filter\"\n onInput={this.filterMessagesHandler as any}\n ref={el => (this.filterEl = el as HTMLGxgFormTextElement)}\n ></gxg-form-text>\n </div>\n </div>\n ) : null}\n </header>\n\n <div\n class={{\n \"messages-wrapper\": true,\n \"scrollable\": true\n }}\n ref={el => (this.messagesWrapperEl = el as HTMLDivElement)}\n >\n {this.messages?.length ? (\n <ol class={{ messages: true }}>\n {this.messages.map((message, i) => {\n return this.renderMessage(message, i);\n })}\n </ol>\n ) : null}\n </div>\n\n <div\n class={{\n prompt: true\n }}\n >\n <gxg-form-textarea\n ai\n class=\"prompt__textarea\"\n value={this.promptValue}\n maxHeight={this.promptMaxHeight}\n placeholder={\n this.aIInProgress\n ? this._componentLocale.processingQueryPlaceholder\n : this._componentLocale.promptPlaceholder\n }\n onInput={this.textAreaInputHandler}\n onEnter={this.promptEnterHandler}\n onArrowUpPressed={this.promptArrowUpHandler}\n onBlur={this.promptBlurHandler}\n onFocus={this.promptFocusHandler}\n disabled={this.aIInProgress}\n ref={el => (this.textAreaEl = el as HTMLGxgFormTextareaElement)}\n ></gxg-form-textarea>\n {!this.userHasTyped &&\n !this.aIInProgress &&\n !this.promptHasFocus &&\n this.focusShortcuts?.length > 0 ? (\n <div\n class={{\n prompt__shortcuts: true\n }}\n >\n {this.focusShortcuts.map((shortcut, i) => {\n /* Up to three keys allowed*/\n return i <= 2 ? (\n <span class=\"prompt__shortcut\">{shortcut}</span>\n ) : null;\n })}\n </div>\n ) : null}\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type AiStatus = \"indeterminate\" | \"success\" | \"error\";\n\nexport type Message = {\n type: MessageType;\n text: string;\n hidden?: boolean;\n filterValue?: string;\n};\n\nexport type MessageType =\n | \"user\"\n | \"assistant-chat\"\n | \"assistant-action\"\n | \"assistant-in-progress\"\n | \"assistant-error\";\n\nexport type UserMessageCallback = (text: string) => Promise<void>;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["getInitialsFromName","name","nameData","split","length","toUpperCase","currentUserInfoCss","CSS_BUNDLES","CHEVRON_DOWN_ICON","getIconPath","category","colorType","MY_ACCOUNT_ID","CHANGE_TEAM_ID","SIGN_OUT_ID","LANGUAGE_ID","GxIdeNewEnvironment","_GxIdeNewEnvironment_componentLocale","set","this","_GxIdeNewEnvironment_initials","_GxIdeNewEnvironment_menuDropdownModel","_GxIdeNewEnvironment_userLoginButton","_GxIdeNewEnvironment_dropDownitemClickHandler","_event","_target","itemId","myAccountCallback","changeTeamCallback","signOutCallback","changeLanguageCallback","componentWillLoad","__classPrivateFieldSet","Locale","getComponentStrings","el","userInfo","id","caption","__classPrivateFieldGet","myAccountLabel","showSeparator","changeTeamLabel","signOutLabel","render","h","Host","class","model","position","itemClickCallback","ref","slot","team","src","containerRef","onClick","showTermsCallback","privacyAndTerms"],"sources":["src/components/current-user-info/helpers.tsx","src/components/current-user-info/current-user-info.scss?tag=gx-ide-current-user-info&encapsulation=shadow","src/components/current-user-info/current-user-info.tsx"],"sourcesContent":["export const getInitialsFromName = (name: string): string => {\n const nameData = name.split(\" \");\n if (nameData.length === 1) {\n return nameData[0][0].toUpperCase();\n } else {\n return `${nameData[0][0].toUpperCase()}${nameData[1][0].toUpperCase()}`;\n }\n};\n","@import \"../../../node_modules/@genexus/mercury/dist/mercury.scss\";\n\n:host {\n display: inline-grid;\n justify-items: end;\n block-size: 100%;\n}\n\n.user-login {\n &__button {\n all: unset;\n display: grid;\n grid-template-columns: max-content max-content max-content;\n align-items: center;\n gap: var(--mer-spacing--sm);\n block-size: auto;\n cursor: pointer;\n }\n &__details {\n display: grid;\n grid-template-rows: max-content max-content;\n gap: var(--mer-spacing--3xs);\n justify-items: end;\n }\n &__name {\n font-weight: var(--mer-font__weight--medium);\n font-size: var(--mer-font__size--3xs);\n color: var(--mer-text__on-elevation);\n }\n &__organization {\n font-weight: var(--mer-font__weight--light);\n font-size: var(--mer-font__size--4xs);\n color: var(--mer-text__neutral);\n }\n &__avatar {\n font-size: 9px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n block-size: var(--mer-spacing--lg);\n inline-size: var(--mer-spacing--lg);\n color: var(--mer-text__on-elevation);\n border-radius: 50%;\n background-color: var(--mer-color__tinted-primary--10);\n border: var(--mer-border__width--sm) solid var(--mer-color__primary--200);\n }\n}\n\n.privacy-policy {\n text-decoration: underline;\n cursor: pointer;\n}\n","/* STENCIL IMPORTS */\nimport { Component, Element, Host, Prop, State, h } from \"@stencil/core\";\n\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\n\nimport { Locale } from \"../../common/locale\";\nimport { getInitialsFromName } from \"./helpers\";\nimport { DropdownModel } from \"@genexus/chameleon-controls-library\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n // TODO: review if \"utils/form--full\" is required.\n \"resets/box-sizing\",\n \"components/tooltip\",\n \"components/toggle\",\n \"components/icon\",\n \"components/dropdown\",\n \"utils/layout\",\n \"utils/typography\",\n \"utils/spacing\",\n \"chameleon/scrollbar\"\n];\n\nconst CHEVRON_DOWN_ICON = getIconPath({\n category: \"navigation\",\n name: \"chevron-down\",\n colorType: \"neutral\"\n});\n\nconst MY_ACCOUNT_ID = \"my-account\";\nconst CHANGE_TEAM_ID = \"change-team\";\nconst SIGN_OUT_ID = \"sign-out\";\nconst LANGUAGE_ID = \"language\";\n\n@Component({\n tag: \"gx-ide-current-user-info\",\n styleUrl: \"current-user-info.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/current-user-info\"]\n})\nexport class GxIdeNewEnvironment {\n #componentLocale: any;\n #initials: string = \"\";\n // #mode: Mode;\n #menuDropdownModel: DropdownModel;\n\n @Element() el: HTMLGxIdeCurrentUserInfoElement;\n #userLoginButton: HTMLButtonElement;\n\n @State() showMenu: boolean = false;\n\n /**\n * User data\n */\n @Prop() readonly userInfo: UserInfo;\n\n /**\n * Callback executed when the user click \"My Account\" link\n */\n @Prop() readonly myAccountCallback!: () => Promise<void>;\n\n /**\n * Callback executed when the user click \"change team\" link\n */\n @Prop() readonly changeTeamCallback!: () => Promise<void>;\n\n /**\n * Callback executed when the user click \"Language\" link\n */\n @Prop() readonly changeLanguageCallback!: () => Promise<void>;\n\n /**\n * Callback executed when the user switch the \"Mode\" status\n */\n @Prop() readonly changeModeCallback!: (mode: Mode) => Promise<void>;\n\n /**\n * Callback executed when the user click \"Sign Out\" link\n */\n @Prop() readonly signOutCallback!: () => Promise<void>;\n\n /**\n * Callback executed when the user click \"Privacy Policy & Terms of use\" link\n */\n @Prop() readonly showTermsCallback!: () => Promise<void>;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.#initials = getInitialsFromName(this.userInfo.name);\n this.#menuDropdownModel = [\n {\n id: MY_ACCOUNT_ID,\n caption: this.#componentLocale.myAccountLabel,\n showSeparator: false\n },\n {\n id: CHANGE_TEAM_ID,\n caption: this.#componentLocale.changeTeamLabel,\n showSeparator: false\n },\n {\n id: SIGN_OUT_ID,\n caption: this.#componentLocale.signOutLabel,\n showSeparator: true\n }\n // {\n // id: LANGUAGE_ID,\n // caption: this.#componentLocale.languageLabel,\n // showSeparator: true\n // }\n ];\n }\n\n // #handleModeSwitch = () => {\n // this.#mode = this.#mode === \"dark\" ? \"light\" : \"dark\";\n // if (this.changeModeCallback) {\n // this.changeModeCallback(this.#mode);\n // }\n // };\n\n #dropDownitemClickHandler = (\n _event: UIEvent,\n _target: string,\n itemId: string\n ): void => {\n if (itemId === MY_ACCOUNT_ID) {\n this.myAccountCallback();\n } else if (itemId === CHANGE_TEAM_ID) {\n this.changeTeamCallback();\n } else if (itemId === SIGN_OUT_ID) {\n this.signOutCallback();\n } else if (itemId === LANGUAGE_ID) {\n this.changeLanguageCallback();\n }\n };\n\n render() {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <ch-dropdown-render\n class=\"dropdown\"\n model={this.#menuDropdownModel}\n position=\"InsideEnd_OutsideEnd\"\n itemClickCallback={this.#dropDownitemClickHandler}\n >\n <button\n class=\"user-login__button\"\n ref={el => (this.#userLoginButton = el as HTMLButtonElement)}\n slot=\"action\"\n >\n <div class=\"user-login__details\">\n <span class=\"user-login__name\">{this.userInfo.name}</span>\n <span class=\"user-login__organization\">{this.userInfo.team}</span>\n </div>\n <div class=\"user-login__avatar\">{this.#initials}</div>\n <ch-image\n src={CHEVRON_DOWN_ICON}\n class=\"icon-md\"\n containerRef={this.#userLoginButton}\n ></ch-image>\n </button>\n <div class=\"user-login__footer footer-slot\" slot=\"footer\">\n <p\n class=\"text-body-regular-s privacy-policy\"\n onClick={this.showTermsCallback}\n >\n {this.#componentLocale.privacyAndTerms}\n </p>\n </div>\n </ch-dropdown-render>\n </Host>\n );\n }\n}\n\nexport type UserInfo = {\n name: string;\n team: string;\n};\n\nexport type Mode = \"dark\" | \"light\";\n"],"mappings":";;;;;;AAAO,MAAMA,sBAAuBC;EAClC,MAAMC,IAAWD,EAAKE,MAAM;EAC5B,IAAID,EAASE,WAAW,GAAG;IACzB,OAAOF,EAAS,GAAG,GAAGG;SACjB;IACL,OAAO,GAAGH,EAAS,GAAG,GAAGG,gBAAgBH,EAAS,GAAG,GAAGG;;;;ACL5D,MAAMC,IAAqB;;;;;;;;;;;;;;;;;ACS3B,MAAMC,IAA8B;;AAElC,qBACA,sBACA,qBACA,mBACA,uBACA,gBACA,oBACA,iBACA;;AAGF,MAAMC,IAAoBC,EAAY;EACpCC,UAAU;EACVT,MAAM;EACNU,WAAW;;;AAGb,MAAMC,IAAgB;;AACtB,MAAMC,IAAiB;;AACvB,MAAMC,IAAc;;AACpB,MAAMC,IAAc;;MAQPC,IAAmB;;;IAC9BC,EAAAC,IAAAC,WAAA;IACAC,EAAAF,IAAAC,MAAoB;;QAEpBE,EAAAH,IAAAC,WAAA;IAGAG,EAAAJ,IAAAC,WAAA;;;;;;;QAyEAI,EAAAL,IAAAC,OAA4B,CAC1BK,GACAC,GACAC;MAEA,IAAIA,MAAWd,GAAe;QAC5BO,KAAKQ;aACA,IAAID,MAAWb,GAAgB;QACpCM,KAAKS;aACA,IAAIF,MAAWZ,GAAa;QACjCK,KAAKU;aACA,IAAIH,MAAWX,GAAa;QACjCI,KAAKW;;;oBAnFoB;;;;;;;;;EAqC7B,uBAAMC;IACJC,EAAAb,MAAIF,SAA0BgB,EAAOC,oBAAoBf,KAAKgB,KAAG;IACjEH,EAAAb,MAAIC,GAAapB,oBAAoBmB,KAAKiB,SAASnC,OAAK;IACxD+B,EAAAb,MAAIE,GAAsB,EACxB;MACEgB,IAAIzB;MACJ0B,SAASC,EAAApB,MAAIF,GAAA,KAAkBuB;MAC/BC,eAAe;OAEjB;MACEJ,IAAIxB;MACJyB,SAASC,EAAApB,MAAIF,GAAA,KAAkByB;MAC/BD,eAAe;OAEjB;MACEJ,IAAIvB;MACJwB,SAASC,EAAApB,MAAIF,GAAA,KAAkB0B;MAC/BF,eAAe;SAOlB;;EA0BH,MAAAG;IACE,OACEC,EAACC,GAAI;MAACC,OAAM;OACVF,EAAA;MAAUG,OAAOzC;QACjBsC,EAAA;MACEE,OAAM;MACNC,OAAOT,EAAApB,MAAIE,GAAA;MACX4B,UAAS;MACTC,mBAAmBX,EAAApB,MAAII,GAAA;OAEvBsB,EAAA;MACEE,OAAM;MACNI,KAAKhB,KAAOH,EAAAb,MAAIG,GAAoBa,GAAuB;MAC3DiB,MAAK;OAELP,EAAA;MAAKE,OAAM;OACTF,EAAA;MAAME,OAAM;OAAoB5B,KAAKiB,SAASnC,OAC9C4C,EAAA;MAAME,OAAM;OAA4B5B,KAAKiB,SAASiB,QAExDR,EAAA;MAAKE,OAAM;OAAsBR,EAAApB,MAAIC,GAAA,OACrCyB,EAAA;MACES,KAAK9C;MACLuC,OAAM;MACNQ,cAAchB,EAAApB,MAAIG,GAAA;SAGtBuB,EAAA;MAAKE,OAAM;MAAiCK,MAAK;OAC/CP,EAAA;MACEE,OAAM;MACNS,SAASrC,KAAKsC;OAEblB,EAAApB,MAAIF,GAAA,KAAkByC"}