@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-assistant.js","sourceRoot":"","sources":["../../../src/components/ai-assistant/ai-assistant.tsx"],"names":[],"mappings":"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","sourcesContent":["/* 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"]}
|
|
1
|
+
{"version":3,"file":"ai-assistant.js","sourceRoot":"","sources":["../../../src/components/ai-assistant/ai-assistant.tsx"],"names":[],"mappings":"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","sourcesContent":["/* 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"]}
|
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
"componentName": "Enable Workflow",
|
|
3
3
|
"header": {},
|
|
4
4
|
"description": {
|
|
5
|
-
"installation": "By enabling Workflow, the Workflow API will be imported and the Workflow engine tables will be created.
|
|
5
|
+
"installation": "By enabling Workflow, the Workflow API will be imported and the Workflow engine tables will be created.Additionally!, installing the GXflow client will provide access to the Inbox, Outbox, Task Manager, Process Manager, etc.",
|
|
6
6
|
"update": "Here you can select to install the GXflow client that will provide access to the Inbox, Outbox, Task Manager, Process Manager, etc."
|
|
7
7
|
},
|
|
8
8
|
"prompt": {
|
|
9
9
|
"installation": "¿Do you want to Enable Workflow?",
|
|
10
|
-
"update": "Select Save to apply your changes or Cancel to ignore them"
|
|
10
|
+
"update": "Select Save to apply your changes or Cancel to ignore them:"
|
|
11
11
|
},
|
|
12
12
|
"upgradesOptions": [
|
|
13
13
|
"Install updates automatically",
|
|
14
14
|
"Prompt me to update",
|
|
15
|
-
"
|
|
15
|
+
"Never update"
|
|
16
16
|
],
|
|
17
17
|
"installGxFlow": "Install GXFlow client",
|
|
18
|
-
"manageUpgrades": "Select how to manage the future upgrades",
|
|
18
|
+
"manageUpgrades": "Select how to manage the future upgrades:",
|
|
19
19
|
"footer": {
|
|
20
20
|
"confirmButton": {
|
|
21
21
|
"installation": "Enable Workflow",
|
|
@@ -26,6 +26,10 @@ export class GxIdeWFSettings {
|
|
|
26
26
|
};
|
|
27
27
|
this.displayTitle = false;
|
|
28
28
|
this.configurationType = "installation";
|
|
29
|
+
this.defaultConfiguration = {
|
|
30
|
+
installClient: true,
|
|
31
|
+
futureUpgrades: "automatic"
|
|
32
|
+
};
|
|
29
33
|
this.saveCallback = undefined;
|
|
30
34
|
this.cancelCallback = undefined;
|
|
31
35
|
}
|
|
@@ -41,7 +45,7 @@ export class GxIdeWFSettings {
|
|
|
41
45
|
}
|
|
42
46
|
// 10.RENDER() FUNCTION //
|
|
43
47
|
render() {
|
|
44
|
-
return (h(Host, { class: "gx-ide-component" }, h("div", { class: "gx-ide-main-wrapper" }, h("gx-ide-container", { containerTitle: this.displayTitle ? this._componentLocale.componentName : null, slimmerFooter: config.gxIdeContainer.slimmerFooter }, h("div", { class: "message-item" }, h("gxg-icon", { type: "gx-server/changes-commit-pending", color: "auto", size: "small" }), h("gxg-text", null, this._componentLocale.description[this.configurationType])), h("div", { class: "options" }, h("gxg-form-checkbox", { label: this._componentLocale.installGxFlow, ref: el => (this.installGxFlowEl = el) }), h("gxg-combo-box", { class: "upgrades-options", label: this._componentLocale.manageUpgrades, disableFilter: true, ref: el => (this.futureUpgradesEl = el) }, h("gxg-combo-box-item", { value: "automatic" }, this._componentLocale.upgradesOptions[0]), h("gxg-combo-box-item", { value: "prompt" }, this._componentLocale.upgradesOptions[1]), h("gxg-combo-box-item", { value: "never" }, this._componentLocale.upgradesOptions[2]))), h("gxg-text", { textAlign: "end", type: "text-regular" }, this._componentLocale.prompt[this.configurationType]), h("gxg-button", { slot: "footer-end", type: "outlined", onClick: this.cancelHandler }, "Cancel"), h("gxg-button", { slot: "footer-end", onClick: this.saveCallbackHandler }, this._componentLocale.footer.confirmButton[this.configurationType])))));
|
|
48
|
+
return (h(Host, { class: "gx-ide-component" }, h("div", { class: "gx-ide-main-wrapper" }, h("gx-ide-container", { containerTitle: this.displayTitle ? this._componentLocale.componentName : null, slimmerFooter: config.gxIdeContainer.slimmerFooter }, h("div", { class: "message-item" }, h("gxg-icon", { type: "gx-server/changes-commit-pending", color: "auto", size: "small" }), h("gxg-text", null, this._componentLocale.description[this.configurationType])), h("div", { class: "options" }, h("gxg-form-checkbox", { label: this._componentLocale.installGxFlow, checked: this.defaultConfiguration.installClient, ref: el => (this.installGxFlowEl = el) }), h("gxg-combo-box", { class: "upgrades-options", label: this._componentLocale.manageUpgrades, disableFilter: true, value: this.defaultConfiguration.futureUpgrades, ref: el => (this.futureUpgradesEl = el) }, h("gxg-combo-box-item", { value: "automatic" }, this._componentLocale.upgradesOptions[0]), h("gxg-combo-box-item", { value: "prompt" }, this._componentLocale.upgradesOptions[1]), h("gxg-combo-box-item", { value: "never" }, this._componentLocale.upgradesOptions[2]))), h("gxg-text", { textAlign: "end", type: "text-regular" }, this._componentLocale.prompt[this.configurationType]), h("gxg-button", { slot: "footer-end", type: "outlined", onClick: this.cancelHandler }, "Cancel"), h("gxg-button", { slot: "footer-end", onClick: this.saveCallbackHandler }, this._componentLocale.footer.confirmButton[this.configurationType])))));
|
|
45
49
|
}
|
|
46
50
|
static get is() { return "gx-ide-wf-settings"; }
|
|
47
51
|
static get encapsulation() { return "shadow"; }
|
|
@@ -80,13 +84,31 @@ export class GxIdeWFSettings {
|
|
|
80
84
|
"type": "string",
|
|
81
85
|
"mutable": false,
|
|
82
86
|
"complexType": {
|
|
83
|
-
"original": "
|
|
87
|
+
"original": "\"installation\" | \"update\"",
|
|
84
88
|
"resolved": "\"installation\" | \"update\"",
|
|
89
|
+
"references": {}
|
|
90
|
+
},
|
|
91
|
+
"required": false,
|
|
92
|
+
"optional": false,
|
|
93
|
+
"docs": {
|
|
94
|
+
"tags": [],
|
|
95
|
+
"text": "Indicates the type of configuration being run, the value of this property should be used to determine\nwhat long text should be displayed in this dialog."
|
|
96
|
+
},
|
|
97
|
+
"attribute": "configuration-type",
|
|
98
|
+
"reflect": false,
|
|
99
|
+
"defaultValue": "\"installation\""
|
|
100
|
+
},
|
|
101
|
+
"defaultConfiguration": {
|
|
102
|
+
"type": "unknown",
|
|
103
|
+
"mutable": false,
|
|
104
|
+
"complexType": {
|
|
105
|
+
"original": "WFConfigData | undefined",
|
|
106
|
+
"resolved": "{ installClient: boolean; futureUpgrades: \"prompt\" | \"never\" | \"automatic\"; }",
|
|
85
107
|
"references": {
|
|
86
|
-
"
|
|
108
|
+
"WFConfigData": {
|
|
87
109
|
"location": "local",
|
|
88
110
|
"path": "/home/runner/work/genexus-ide-ui/genexus-ide-ui/src/components/wf-settings/wf-settings.tsx",
|
|
89
|
-
"id": "src/components/wf-settings/wf-settings.tsx::
|
|
111
|
+
"id": "src/components/wf-settings/wf-settings.tsx::WFConfigData"
|
|
90
112
|
}
|
|
91
113
|
}
|
|
92
114
|
},
|
|
@@ -94,11 +116,9 @@ export class GxIdeWFSettings {
|
|
|
94
116
|
"optional": false,
|
|
95
117
|
"docs": {
|
|
96
118
|
"tags": [],
|
|
97
|
-
"text": "
|
|
119
|
+
"text": "Defines default config to initialize dialog"
|
|
98
120
|
},
|
|
99
|
-
"
|
|
100
|
-
"reflect": false,
|
|
101
|
-
"defaultValue": "\"installation\""
|
|
121
|
+
"defaultValue": "{\n installClient: true,\n futureUpgrades: \"automatic\"\n }"
|
|
102
122
|
},
|
|
103
123
|
"saveCallback": {
|
|
104
124
|
"type": "unknown",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wf-settings.js","sourceRoot":"","sources":["../../../src/components/wf-settings/wf-settings.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EACL,SAAS,EACT,IAAI,EACJ,CAAC,EACD,IAAI,EACJ,OAAO,EACP,KAAK,EAEN,MAAM,eAAe,CAAC;AACvB,6BAA6B;AAC7B,oBAAoB;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAQ7C,MAAM,OAAO,eAAe;;QAOlB,sBAAiB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"wf-settings.js","sourceRoot":"","sources":["../../../src/components/wf-settings/wf-settings.tsx"],"names":[],"mappings":"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","sourcesContent":["/* 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 * Indicates the type of configuration being run, the value of this property should be used to determine\n * what long text should be displayed in this dialog.\n */\n @Prop() readonly configurationType: \"installation\" | \"update\" =\n \"installation\";\n\n /**\n * Defines default config to initialize dialog\n */\n @Prop() readonly defaultConfiguration: WFConfigData | undefined = {\n installClient: true,\n futureUpgrades: \"automatic\"\n };\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 checked={this.defaultConfiguration.installClient}\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 value={this.defaultConfiguration.futureUpgrades}\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 saveCallback = (config: WFConfigData) => Promise<void>;\n"]}
|
|
@@ -103,6 +103,9 @@ const GxIdeTemplate = /*@__PURE__*/ proxyCustomElement(class GxIdeTemplate exten
|
|
|
103
103
|
this.clearMessages = () => {
|
|
104
104
|
this.messages = [];
|
|
105
105
|
this.textAreaEl.focus();
|
|
106
|
+
if (this.clearCallback) {
|
|
107
|
+
this.clearCallback();
|
|
108
|
+
}
|
|
106
109
|
};
|
|
107
110
|
this.attachShortcuts = () => {
|
|
108
111
|
var _a;
|
|
@@ -176,6 +179,7 @@ const GxIdeTemplate = /*@__PURE__*/ proxyCustomElement(class GxIdeTemplate exten
|
|
|
176
179
|
this.assistantStatus = "indeterminate";
|
|
177
180
|
this.focusShortcuts = undefined;
|
|
178
181
|
this.userMessageCallback = undefined;
|
|
182
|
+
this.clearCallback = undefined;
|
|
179
183
|
this.promptValue = undefined;
|
|
180
184
|
this.filter = true;
|
|
181
185
|
}
|
|
@@ -216,6 +220,12 @@ const GxIdeTemplate = /*@__PURE__*/ proxyCustomElement(class GxIdeTemplate exten
|
|
|
216
220
|
}, 200);
|
|
217
221
|
}
|
|
218
222
|
// 7.LISTENERS //
|
|
223
|
+
handleFocus(event) {
|
|
224
|
+
if (this.textAreaEl) {
|
|
225
|
+
event.preventDefault();
|
|
226
|
+
this.textAreaEl.focus();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
219
229
|
// 8.PUBLIC METHODS API //
|
|
220
230
|
/**
|
|
221
231
|
* Clear the list of messages
|
|
@@ -266,6 +276,7 @@ const GxIdeTemplate = /*@__PURE__*/ proxyCustomElement(class GxIdeTemplate exten
|
|
|
266
276
|
return i <= 2 ? (h("span", { class: "prompt__shortcut" }, shortcut)) : null;
|
|
267
277
|
}))) : null))));
|
|
268
278
|
}
|
|
279
|
+
static get delegatesFocus() { return true; }
|
|
269
280
|
static get assetsDirs() { return ["gx-ide-assets/ai-assistant"]; }
|
|
270
281
|
get el() { return this; }
|
|
271
282
|
static get watchers() { return {
|
|
@@ -273,12 +284,13 @@ const GxIdeTemplate = /*@__PURE__*/ proxyCustomElement(class GxIdeTemplate exten
|
|
|
273
284
|
"messages": ["watchMessagesHandler"]
|
|
274
285
|
}; }
|
|
275
286
|
static get style() { return aiAssistantCss; }
|
|
276
|
-
}, [
|
|
287
|
+
}, [17, "gx-ide-ai-assistant", {
|
|
277
288
|
"messages": [1040],
|
|
278
289
|
"promptMaxHeight": [1, "prompt-max-height"],
|
|
279
290
|
"assistantStatus": [1025, "assistant-status"],
|
|
280
291
|
"focusShortcuts": [16],
|
|
281
292
|
"userMessageCallback": [16],
|
|
293
|
+
"clearCallback": [16],
|
|
282
294
|
"promptValue": [1, "prompt-value"],
|
|
283
295
|
"filter": [4],
|
|
284
296
|
"userHasTyped": [32],
|
|
@@ -288,7 +300,7 @@ const GxIdeTemplate = /*@__PURE__*/ proxyCustomElement(class GxIdeTemplate exten
|
|
|
288
300
|
"filterValue": [32],
|
|
289
301
|
"clear": [64],
|
|
290
302
|
"addMessage": [64]
|
|
291
|
-
},
|
|
303
|
+
}, [[2, "focus", "handleFocus"]], {
|
|
292
304
|
"aIInProgress": ["watchAIInProgressHandler"],
|
|
293
305
|
"messages": ["watchMessagesHandler"]
|
|
294
306
|
}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"gx-ide-ai-assistant.js","mappings":"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","names":[],"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"],"version":3}
|
|
1
|
+
{"file":"gx-ide-ai-assistant.js","mappings":"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","names":[],"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"],"version":3}
|
|
@@ -43,6 +43,10 @@ const GxIdeWFSettings = /*@__PURE__*/ proxyCustomElement(class GxIdeWFSettings e
|
|
|
43
43
|
};
|
|
44
44
|
this.displayTitle = false;
|
|
45
45
|
this.configurationType = "installation";
|
|
46
|
+
this.defaultConfiguration = {
|
|
47
|
+
installClient: true,
|
|
48
|
+
futureUpgrades: "automatic"
|
|
49
|
+
};
|
|
46
50
|
this.saveCallback = undefined;
|
|
47
51
|
this.cancelCallback = undefined;
|
|
48
52
|
}
|
|
@@ -58,7 +62,7 @@ const GxIdeWFSettings = /*@__PURE__*/ proxyCustomElement(class GxIdeWFSettings e
|
|
|
58
62
|
}
|
|
59
63
|
// 10.RENDER() FUNCTION //
|
|
60
64
|
render() {
|
|
61
|
-
return (h(Host, { class: "gx-ide-component" }, h("div", { class: "gx-ide-main-wrapper" }, h("gx-ide-container", { containerTitle: this.displayTitle ? this._componentLocale.componentName : null, slimmerFooter: config.gxIdeContainer.slimmerFooter }, h("div", { class: "message-item" }, h("gxg-icon", { type: "gx-server/changes-commit-pending", color: "auto", size: "small" }), h("gxg-text", null, this._componentLocale.description[this.configurationType])), h("div", { class: "options" }, h("gxg-form-checkbox", { label: this._componentLocale.installGxFlow, ref: el => (this.installGxFlowEl = el) }), h("gxg-combo-box", { class: "upgrades-options", label: this._componentLocale.manageUpgrades, disableFilter: true, ref: el => (this.futureUpgradesEl = el) }, h("gxg-combo-box-item", { value: "automatic" }, this._componentLocale.upgradesOptions[0]), h("gxg-combo-box-item", { value: "prompt" }, this._componentLocale.upgradesOptions[1]), h("gxg-combo-box-item", { value: "never" }, this._componentLocale.upgradesOptions[2]))), h("gxg-text", { textAlign: "end", type: "text-regular" }, this._componentLocale.prompt[this.configurationType]), h("gxg-button", { slot: "footer-end", type: "outlined", onClick: this.cancelHandler }, "Cancel"), h("gxg-button", { slot: "footer-end", onClick: this.saveCallbackHandler }, this._componentLocale.footer.confirmButton[this.configurationType])))));
|
|
65
|
+
return (h(Host, { class: "gx-ide-component" }, h("div", { class: "gx-ide-main-wrapper" }, h("gx-ide-container", { containerTitle: this.displayTitle ? this._componentLocale.componentName : null, slimmerFooter: config.gxIdeContainer.slimmerFooter }, h("div", { class: "message-item" }, h("gxg-icon", { type: "gx-server/changes-commit-pending", color: "auto", size: "small" }), h("gxg-text", null, this._componentLocale.description[this.configurationType])), h("div", { class: "options" }, h("gxg-form-checkbox", { label: this._componentLocale.installGxFlow, checked: this.defaultConfiguration.installClient, ref: el => (this.installGxFlowEl = el) }), h("gxg-combo-box", { class: "upgrades-options", label: this._componentLocale.manageUpgrades, disableFilter: true, value: this.defaultConfiguration.futureUpgrades, ref: el => (this.futureUpgradesEl = el) }, h("gxg-combo-box-item", { value: "automatic" }, this._componentLocale.upgradesOptions[0]), h("gxg-combo-box-item", { value: "prompt" }, this._componentLocale.upgradesOptions[1]), h("gxg-combo-box-item", { value: "never" }, this._componentLocale.upgradesOptions[2]))), h("gxg-text", { textAlign: "end", type: "text-regular" }, this._componentLocale.prompt[this.configurationType]), h("gxg-button", { slot: "footer-end", type: "outlined", onClick: this.cancelHandler }, "Cancel"), h("gxg-button", { slot: "footer-end", onClick: this.saveCallbackHandler }, this._componentLocale.footer.confirmButton[this.configurationType])))));
|
|
62
66
|
}
|
|
63
67
|
static get assetsDirs() { return ["gx-ide-assets/wf-settings"]; }
|
|
64
68
|
get el() { return this; }
|
|
@@ -66,6 +70,7 @@ const GxIdeWFSettings = /*@__PURE__*/ proxyCustomElement(class GxIdeWFSettings e
|
|
|
66
70
|
}, [1, "gx-ide-wf-settings", {
|
|
67
71
|
"displayTitle": [4, "display-title"],
|
|
68
72
|
"configurationType": [1, "configuration-type"],
|
|
73
|
+
"defaultConfiguration": [16],
|
|
69
74
|
"saveCallback": [16],
|
|
70
75
|
"cancelCallback": [16]
|
|
71
76
|
}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"gx-ide-wf-settings.js","mappings":";;;;;;;;;;;;;;;;;AAAA,MAAM,aAAa,GAAG,qkWAAqkW;;MCqB9kW,eAAe;;;;;;QAOlB,sBAAiB,GAAG,KAAK,CAAC;;;;
|
|
1
|
+
{"file":"gx-ide-wf-settings.js","mappings":"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","names":[],"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 * Indicates the type of configuration being run, the value of this property should be used to determine\n * what long text should be displayed in this dialog.\n */\n @Prop() readonly configurationType: \"installation\" | \"update\" =\n \"installation\";\n\n /**\n * Defines default config to initialize dialog\n */\n @Prop() readonly defaultConfiguration: WFConfigData | undefined = {\n installClient: true,\n futureUpgrades: \"automatic\"\n };\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 checked={this.defaultConfiguration.installClient}\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 value={this.defaultConfiguration.futureUpgrades}\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 saveCallback = (config: WFConfigData) => Promise<void>;\n"],"version":3}
|