@genexus/genexus-ide-ui 0.0.148 → 0.0.150
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/genexus-ide-ui.cjs.js +1 -1
- package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js +11 -0
- package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-wf-settings.cjs.entry.js +5 -1
- package/dist/cjs/gx-ide-wf-settings.cjs.entry.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/components/ai-assistant/ai-assistant.js +40 -0
- package/dist/collection/components/ai-assistant/ai-assistant.js.map +1 -1
- package/dist/collection/components/wf-settings/gx-ide-assets/wf-settings/langs/wf-settings.lang.en.json +4 -4
- package/dist/collection/components/wf-settings/wf-settings.js +28 -8
- package/dist/collection/components/wf-settings/wf-settings.js.map +1 -1
- package/dist/components/gx-ide-ai-assistant.js +14 -2
- package/dist/components/gx-ide-ai-assistant.js.map +1 -1
- package/dist/components/gx-ide-wf-settings.js +6 -1
- package/dist/components/gx-ide-wf-settings.js.map +1 -1
- package/dist/esm/genexus-ide-ui.js +1 -1
- package/dist/esm/gx-ide-ai-assistant.entry.js +11 -0
- package/dist/esm/gx-ide-ai-assistant.entry.js.map +1 -1
- package/dist/esm/gx-ide-wf-settings.entry.js +5 -1
- package/dist/esm/gx-ide-wf-settings.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
- package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
- package/dist/genexus-ide-ui/gx-ide-assets/wf-settings/langs/wf-settings.lang.en.json +4 -4
- package/dist/genexus-ide-ui/{p-460046af.entry.js → p-e8c0e1ab.entry.js} +14 -8
- package/dist/genexus-ide-ui/p-e8c0e1ab.entry.js.map +1 -0
- package/dist/genexus-ide-ui/{p-be17c139.entry.js → p-f6848e69.entry.js} +14 -1
- package/dist/genexus-ide-ui/p-f6848e69.entry.js.map +1 -0
- package/dist/types/components/ai-assistant/ai-assistant.d.ts +5 -0
- package/dist/types/components/wf-settings/wf-settings.d.ts +7 -3
- package/dist/types/components.d.ts +22 -6
- package/package.json +1 -1
- package/dist/genexus-ide-ui/p-460046af.entry.js.map +0 -1
- package/dist/genexus-ide-ui/p-be17c139.entry.js.map +0 -1
|
@@ -89,6 +89,9 @@ const l = class {
|
|
|
89
89
|
this.clearMessages = () => {
|
|
90
90
|
this.messages = [];
|
|
91
91
|
this.textAreaEl.focus();
|
|
92
|
+
if (this.clearCallback) {
|
|
93
|
+
this.clearCallback();
|
|
94
|
+
}
|
|
92
95
|
};
|
|
93
96
|
this.attachShortcuts = () => {
|
|
94
97
|
var t;
|
|
@@ -150,6 +153,7 @@ const l = class {
|
|
|
150
153
|
this.assistantStatus = "indeterminate";
|
|
151
154
|
this.focusShortcuts = undefined;
|
|
152
155
|
this.userMessageCallback = undefined;
|
|
156
|
+
this.clearCallback = undefined;
|
|
153
157
|
this.promptValue = undefined;
|
|
154
158
|
this.filter = true;
|
|
155
159
|
}
|
|
@@ -189,6 +193,12 @@ const l = class {
|
|
|
189
193
|
}), 200);
|
|
190
194
|
}
|
|
191
195
|
// 7.LISTENERS //
|
|
196
|
+
handleFocus(t) {
|
|
197
|
+
if (this.textAreaEl) {
|
|
198
|
+
t.preventDefault();
|
|
199
|
+
this.textAreaEl.focus();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
192
202
|
// 8.PUBLIC METHODS API //
|
|
193
203
|
/**
|
|
194
204
|
* Clear the list of messages
|
|
@@ -285,6 +295,9 @@ const l = class {
|
|
|
285
295
|
class: "prompt__shortcut"
|
|
286
296
|
}, t) : null))) : null)));
|
|
287
297
|
}
|
|
298
|
+
static get delegatesFocus() {
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
288
301
|
static get assetsDirs() {
|
|
289
302
|
return [ "gx-ide-assets/ai-assistant" ];
|
|
290
303
|
}
|
|
@@ -302,4 +315,4 @@ const l = class {
|
|
|
302
315
|
l.style = s;
|
|
303
316
|
|
|
304
317
|
export { l as gx_ide_ai_assistant };
|
|
305
|
-
//# sourceMappingURL=p-
|
|
318
|
+
//# sourceMappingURL=p-f6848e69.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["aiAssistantCss","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","filter","icon","onClick","disabled","onInput","ref","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-color__neutral-gray--1000);\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 background-color: var(--mer-color__neutral-gray--1100);\n }\n &::part(textarea) {\n border: none;\n }\n }\n &__shortcuts {\n position: absolute;\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--xxs);\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--xxs);\n padding: var(--mer-spacing--xxxs) 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 */\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\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 }, 0);\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 <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 }}\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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"}
|
|
@@ -55,6 +55,10 @@ export declare class GxIdeTemplate {
|
|
|
55
55
|
* List of keys that make up the shortcut to focus on the component's text input
|
|
56
56
|
*/
|
|
57
57
|
readonly userMessageCallback: UserMessageCallback;
|
|
58
|
+
/**
|
|
59
|
+
* Callback that must be invoked when the conversation is cleared, using the header button.
|
|
60
|
+
*/
|
|
61
|
+
readonly clearCallback: () => Promise<void>;
|
|
58
62
|
/**
|
|
59
63
|
* the prompt value
|
|
60
64
|
*/
|
|
@@ -70,6 +74,7 @@ export declare class GxIdeTemplate {
|
|
|
70
74
|
componentWillLoad(): Promise<void>;
|
|
71
75
|
componentDidLoad(): void;
|
|
72
76
|
componentDidRender(): void;
|
|
77
|
+
handleFocus(event: FocusEvent): void;
|
|
73
78
|
/**
|
|
74
79
|
* Clear the list of messages
|
|
75
80
|
*/
|
|
@@ -13,9 +13,14 @@ export declare class GxIdeWFSettings {
|
|
|
13
13
|
*/
|
|
14
14
|
readonly displayTitle = false;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Indicates the type of configuration being run, the value of this property should be used to determine
|
|
17
|
+
* what long text should be displayed in this dialog.
|
|
17
18
|
*/
|
|
18
|
-
readonly configurationType:
|
|
19
|
+
readonly configurationType: "installation" | "update";
|
|
20
|
+
/**
|
|
21
|
+
* Defines default config to initialize dialog
|
|
22
|
+
*/
|
|
23
|
+
readonly defaultConfiguration: WFConfigData | undefined;
|
|
19
24
|
/**
|
|
20
25
|
* Callback invoked when the user presses the 'OK' button. As a parameter, it receives the data entered by the user
|
|
21
26
|
*/
|
|
@@ -38,5 +43,4 @@ export type WFConfigData = {
|
|
|
38
43
|
installClient: boolean;
|
|
39
44
|
futureUpgrades: "never" | "prompt" | "automatic";
|
|
40
45
|
};
|
|
41
|
-
export type ConfigurationType = "installation" | "update";
|
|
42
46
|
export type saveCallback = (config: WFConfigData) => Promise<void>;
|
|
@@ -53,7 +53,7 @@ import { ConfirmCallback as ConfirmCallback5, GridContextMenuCallback, LoadCallb
|
|
|
53
53
|
import { AddCallback, CancelCallback as CancelCallback13, ConfirmCallback as ConfirmCallback6, ObjectData as ObjectData2 } from "./components/team-dev/update-partial-selection/update-partial-selection";
|
|
54
54
|
import { cancelCallbackFn, confirmCallbackFn } from "./components/team-dev/update-to-revision/update-to-revision";
|
|
55
55
|
import { TitleAlignment as TitleAlignment1, TitleType as TitleType1 } from "./components/_helpers/title/title";
|
|
56
|
-
import {
|
|
56
|
+
import { WFConfigData } from "./components/wf-settings/wf-settings";
|
|
57
57
|
import { ContextMenuCallback, DeleteSelectionCallback, LoadCallback as LoadCallback5, LoadImageItemsCallback, NewObjectCallback as NewObjectCallback1, OpenSelectionCallback as OpenSelectionCallback1, SelectionObjectCallback, SelectModuleCallback as SelectModuleCallback3 } from "./components/ww-images/ww-images";
|
|
58
58
|
export { AiStatus, Message, UserMessageCallback } from "./components/ai-assistant/ai-assistant";
|
|
59
59
|
export { MessageType } from "./components/ai-assistant/ai-assistant";
|
|
@@ -103,7 +103,7 @@ export { ConfirmCallback as ConfirmCallback5, GridContextMenuCallback, LoadCallb
|
|
|
103
103
|
export { AddCallback, CancelCallback as CancelCallback13, ConfirmCallback as ConfirmCallback6, ObjectData as ObjectData2 } from "./components/team-dev/update-partial-selection/update-partial-selection";
|
|
104
104
|
export { cancelCallbackFn, confirmCallbackFn } from "./components/team-dev/update-to-revision/update-to-revision";
|
|
105
105
|
export { TitleAlignment as TitleAlignment1, TitleType as TitleType1 } from "./components/_helpers/title/title";
|
|
106
|
-
export {
|
|
106
|
+
export { WFConfigData } from "./components/wf-settings/wf-settings";
|
|
107
107
|
export { ContextMenuCallback, DeleteSelectionCallback, LoadCallback as LoadCallback5, LoadImageItemsCallback, NewObjectCallback as NewObjectCallback1, OpenSelectionCallback as OpenSelectionCallback1, SelectionObjectCallback, SelectModuleCallback as SelectModuleCallback3 } from "./components/ww-images/ww-images";
|
|
108
108
|
export namespace Components {
|
|
109
109
|
interface GxIdeAiAssistant {
|
|
@@ -119,6 +119,10 @@ export namespace Components {
|
|
|
119
119
|
* Clear the list of messages
|
|
120
120
|
*/
|
|
121
121
|
"clear": () => Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Callback that must be invoked when the conversation is cleared, using the header button.
|
|
124
|
+
*/
|
|
125
|
+
"clearCallback": () => Promise<void>;
|
|
122
126
|
/**
|
|
123
127
|
* If tue, it will display a filter.
|
|
124
128
|
*/
|
|
@@ -1732,9 +1736,13 @@ export namespace Components {
|
|
|
1732
1736
|
*/
|
|
1733
1737
|
"cancelCallback": () => Promise<void>;
|
|
1734
1738
|
/**
|
|
1735
|
-
*
|
|
1739
|
+
* Indicates the type of configuration being run, the value of this property should be used to determine what long text should be displayed in this dialog.
|
|
1740
|
+
*/
|
|
1741
|
+
"configurationType": "installation" | "update";
|
|
1742
|
+
/**
|
|
1743
|
+
* Defines default config to initialize dialog
|
|
1736
1744
|
*/
|
|
1737
|
-
"
|
|
1745
|
+
"defaultConfiguration": WFConfigData | undefined;
|
|
1738
1746
|
/**
|
|
1739
1747
|
* If true it displays the component title on the header
|
|
1740
1748
|
*/
|
|
@@ -2793,6 +2801,10 @@ declare namespace LocalJSX {
|
|
|
2793
2801
|
* A temporary property to illustrate the assistant status
|
|
2794
2802
|
*/
|
|
2795
2803
|
"assistantStatus"?: AiStatus;
|
|
2804
|
+
/**
|
|
2805
|
+
* Callback that must be invoked when the conversation is cleared, using the header button.
|
|
2806
|
+
*/
|
|
2807
|
+
"clearCallback"?: () => Promise<void>;
|
|
2796
2808
|
/**
|
|
2797
2809
|
* If tue, it will display a filter.
|
|
2798
2810
|
*/
|
|
@@ -4558,9 +4570,13 @@ declare namespace LocalJSX {
|
|
|
4558
4570
|
*/
|
|
4559
4571
|
"cancelCallback"?: () => Promise<void>;
|
|
4560
4572
|
/**
|
|
4561
|
-
*
|
|
4573
|
+
* Indicates the type of configuration being run, the value of this property should be used to determine what long text should be displayed in this dialog.
|
|
4574
|
+
*/
|
|
4575
|
+
"configurationType"?: "installation" | "update";
|
|
4576
|
+
/**
|
|
4577
|
+
* Defines default config to initialize dialog
|
|
4562
4578
|
*/
|
|
4563
|
-
"
|
|
4579
|
+
"defaultConfiguration"?: WFConfigData | undefined;
|
|
4564
4580
|
/**
|
|
4565
4581
|
* If true it displays the component title on the header
|
|
4566
4582
|
*/
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["wfSettingsCss","GxIdeWFSettings","this","renderedFirstTime","cancelHandler","cancelCallback","saveCallbackHandler","saveCallback","wfConfigData","installClient","installGxFlowEl","checked","futureUpgrades","futureUpgradesEl","value","componentWillLoad","_componentLocale","Locale","getComponentStrings","el","componentDidRender","componentDidRenderFirstTime","emit","componentName","render","h","Host","class","containerTitle","displayTitle","slimmerFooter","config","gxIdeContainer","type","color","size","description","configurationType","label","installGxFlow","ref","manageUpgrades","disableFilter","upgradesOptions","textAlign","prompt","slot","onClick","footer","confirmButton"],"sources":["src/components/wf-settings/wf-settings.scss?tag=gx-ide-wf-settings&encapsulation=shadow","src/components/wf-settings/wf-settings.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n\n:host {\n display: block;\n}\n\n.options {\n max-width: 50%;\n display: flex;\n flex-direction: column;\n gap: var(--gx-ide-form-items-gap);\n}\n.message-item {\n display: flex;\n align-items: start;\n gap: var(--mer-spacing--xs);\n}\n","/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Element,\n Event,\n EventEmitter\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\n/* CUSTOM IMPORTS */\nimport { config } from \"../../common/config\";\nimport { Locale } from \"../../common/locale\";\n\n@Component({\n tag: \"gx-ide-wf-settings\",\n styleUrl: \"wf-settings.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/wf-settings\"]\n})\nexport class GxIdeWFSettings {\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private renderedFirstTime = false;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeWfSettingsElement;\n private installGxFlowEl!: HTMLGxgFormCheckboxElement;\n private futureUpgradesEl!: HTMLGxgComboBoxElement;\n\n // 3.STATE() VARIABLES //\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * If true it displays the component title on the header\n */\n @Prop() readonly displayTitle = false;\n\n /**\n * The configuration type\n */\n @Prop() readonly configurationType: ConfigurationType = \"installation\";\n\n /**\n * Callback invoked when the user presses the 'OK' button. As a parameter, it receives the data entered by the user\n */\n @Prop() readonly saveCallback: (config: WFConfigData) => Promise<void>;\n\n /**\n * Callback invoked when the user presses the 'Cancel' button.\n */\n @Prop() readonly cancelCallback: () => Promise<void>;\n\n // 5.EVENTS (EMIT) //\n\n /**\n * @description Gets fired when the component has rendered for the first time.\n */\n @Event() componentDidRenderFirstTime: EventEmitter<string>;\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidRender() {\n if (!this.renderedFirstTime) {\n this.componentDidRenderFirstTime.emit(\n this._componentLocale.componentName\n );\n this.renderedFirstTime = true;\n }\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n // 9.LOCAL METHODS //\n\n private cancelHandler = () => {\n if (this.cancelCallback) {\n this.cancelCallback();\n }\n };\n\n private saveCallbackHandler = () => {\n if (this.saveCallback) {\n const wfConfigData: WFConfigData = {\n installClient: this.installGxFlowEl.checked,\n futureUpgrades: this.futureUpgradesEl.value\n };\n this.saveCallback(wfConfigData);\n }\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <Host class=\"gx-ide-component\">\n <div class=\"gx-ide-main-wrapper\">\n <gx-ide-container\n containerTitle={\n this.displayTitle ? this._componentLocale.componentName : null\n }\n slimmerFooter={config.gxIdeContainer.slimmerFooter}\n >\n <div class=\"message-item\">\n <gxg-icon\n type=\"gx-server/changes-commit-pending\"\n color=\"auto\"\n size=\"small\"\n ></gxg-icon>\n <gxg-text>\n {this._componentLocale.description[this.configurationType]}\n </gxg-text>\n </div>\n <div class=\"options\">\n <gxg-form-checkbox\n label={this._componentLocale.installGxFlow}\n ref={el =>\n (this.installGxFlowEl = el as HTMLGxgFormCheckboxElement)\n }\n ></gxg-form-checkbox>\n <gxg-combo-box\n class=\"upgrades-options\"\n label={this._componentLocale.manageUpgrades}\n disableFilter\n ref={el =>\n (this.futureUpgradesEl = el as HTMLGxgComboBoxElement)\n }\n >\n <gxg-combo-box-item value=\"automatic\">\n {this._componentLocale.upgradesOptions[0]}\n </gxg-combo-box-item>\n <gxg-combo-box-item value=\"prompt\">\n {this._componentLocale.upgradesOptions[1]}\n </gxg-combo-box-item>\n <gxg-combo-box-item value=\"never\">\n {this._componentLocale.upgradesOptions[2]}\n </gxg-combo-box-item>\n </gxg-combo-box>\n </div>\n <gxg-text textAlign=\"end\" type=\"text-regular\">\n {this._componentLocale.prompt[this.configurationType]}\n </gxg-text>\n <gxg-button\n slot=\"footer-end\"\n type=\"outlined\"\n onClick={this.cancelHandler}\n >\n Cancel\n </gxg-button>\n <gxg-button slot=\"footer-end\" onClick={this.saveCallbackHandler}>\n {\n this._componentLocale.footer.confirmButton[\n this.configurationType\n ]\n }\n </gxg-button>\n </gx-ide-container>\n </div>\n </Host>\n );\n }\n}\n\nexport type WFConfigData = {\n installClient: boolean;\n futureUpgrades: \"never\" | \"prompt\" | \"automatic\";\n};\n\nexport type ConfigurationType = \"installation\" | \"update\";\n\nexport type saveCallback = (config: WFConfigData) => Promise<void>;\n"],"mappings":";;;;;;AAAA,MAAMA,IAAgB;;MCqBTC,IAAe;;;;IAOlBC,KAAAC,oBAAoB;;;;QA4DpBD,KAAAE,gBAAgB;MACtB,IAAIF,KAAKG,gBAAgB;QACvBH,KAAKG;;;IAIDH,KAAAI,sBAAsB;MAC5B,IAAIJ,KAAKK,cAAc;QACrB,MAAMC,IAA6B;UACjCC,eAAeP,KAAKQ,gBAAgBC;UACpCC,gBAAgBV,KAAKW,iBAAiBC;;QAExCZ,KAAKK,aAAaC;;;wBAzDU;6BAKwB;;;;;EAqBxD,uBAAMO;IACJb,KAAKc,yBAAyBC,EAAOC,oBAAoBhB,KAAKiB;;EAGhE,kBAAAC;IACE,KAAKlB,KAAKC,mBAAmB;MAC3BD,KAAKmB,4BAA4BC,KAC/BpB,KAAKc,iBAAiBO;MAExBrB,KAAKC,oBAAoB;;;;EA4B7B,MAAAqB;IACE,OACEC,EAACC,GAAI;MAACC,OAAM;OACVF,EAAA;MAAKE,OAAM;OACTF,EAAA;MACEG,gBACE1B,KAAK2B,eAAe3B,KAAKc,iBAAiBO,gBAAgB;MAE5DO,eAAeC,EAAOC,eAAeF;OAErCL,EAAA;MAAKE,OAAM;OACTF,EAAA;MACEQ,MAAK;MACLC,OAAM;MACNC,MAAK;QAEPV,EAAA,kBACGvB,KAAKc,iBAAiBoB,YAAYlC,KAAKmC,sBAG5CZ,EAAA;MAAKE,OAAM;OACTF,EAAA;MACEa,OAAOpC,KAAKc,iBAAiBuB;MAC7BC,KAAKrB,KACFjB,KAAKQ,kBAAkBS;QAG5BM,EAAA;MACEE,OAAM;MACNW,OAAOpC,KAAKc,iBAAiByB;MAC7BC,eAAa;MACbF,KAAKrB,KACFjB,KAAKW,mBAAmBM;OAG3BM,EAAA;MAAoBX,OAAM;OACvBZ,KAAKc,iBAAiB2B,gBAAgB,KAEzClB,EAAA;MAAoBX,OAAM;OACvBZ,KAAKc,iBAAiB2B,gBAAgB,KAEzClB,EAAA;MAAoBX,OAAM;OACvBZ,KAAKc,iBAAiB2B,gBAAgB,OAI7ClB,EAAA;MAAUmB,WAAU;MAAMX,MAAK;OAC5B/B,KAAKc,iBAAiB6B,OAAO3C,KAAKmC,qBAErCZ,EAAA;MACEqB,MAAK;MACLb,MAAK;MACLc,SAAS7C,KAAKE;OAAa,WAI7BqB,EAAA;MAAYqB,MAAK;MAAaC,SAAS7C,KAAKI;OAExCJ,KAAKc,iBAAiBgC,OAAOC,cAC3B/C,KAAKmC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["aiAssistantCss","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","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","clear","updateInProgressMessage","pop","push","render","Host","class","filter","icon","onClick","disabled","onInput","ref","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-color__neutral-gray--1000);\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 background-color: var(--mer-color__neutral-gray--1100);\n }\n &::part(textarea) {\n border: none;\n }\n }\n &__shortcuts {\n position: absolute;\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--xxs);\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--xxs);\n padding: var(--mer-spacing--xxxs) 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} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\n\n@Component({\n tag: \"gx-ide-ai-assistant\",\n styleUrl: \"ai-assistant.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/ai-assistant\"]\n})\nexport class GxIdeTemplate {\n /*\nINDEX:\n1.OWN PROPERTIES \n2.REFERENCE TO ELEMENTS\n3.STATE() VARIABLES\n4.PUBLIC PROPERTY API | WATCH'S\n5.EVENTS (EMIT)\n6.COMPONENT LIFECYCLE METHODS\n7.LISTENERS\n8.PUBLIC METHODS API\n9.LOCAL METHODS\n10.RENDER() FUNCTION\n*/\n\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n 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 * 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 }, 0);\n }\n setTimeout(() => {\n this.scrollToBottom();\n }, 200);\n }\n\n // 7.LISTENERS //\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 };\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 <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 }}\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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"}
|