@genexus/genexus-ide-ui 0.0.147 → 0.0.149

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js +11 -0
  3. package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js.map +1 -1
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/collection/components/_helpers/card/gx-ide-assets/card/langs/card.lang.ja.json +9 -2
  6. package/dist/collection/components/_helpers/status-buttons/gx-ide-assets/status-buttons/langs/status-buttons.lang.ja.json +13 -13
  7. package/dist/collection/components/_starting-template/gx-ide-assets/template/langs/template.lang.ja.json +9 -2
  8. package/dist/collection/components/ai-assistant/ai-assistant.js +40 -0
  9. package/dist/collection/components/ai-assistant/ai-assistant.js.map +1 -1
  10. package/dist/collection/components/ai-assistant/gx-ide-assets/ai-assistant/langs/ai-assistant.lang.ja.json +8 -2
  11. package/dist/collection/components/bpm/application-declaration/gx-ide-assets/bpm-app-declaration/langs/bpm-app-declaration.lang.ja.json +14 -2
  12. package/dist/collection/components/bpm/assign-roles/gx-ide-assets/bpm-assign-roles/langs/bpm-assign-roles.lang.ja.json +23 -2
  13. package/dist/collection/components/bpm/export-xpdl/gx-ide-assets/bpm-export-xpdl/langs/bpm-export-xpdl.lang.ja.json +18 -2
  14. package/dist/collection/components/bpm/import-files/gx-ide-assets/bpm-import-files/langs/bpm-import-files.lang.ja.json +17 -2
  15. package/dist/collection/components/bpm/import-gxpm/gx-ide-assets/bpm-import-gxpm/langs/bpm-import-gxpm.lang.ja.json +16 -2
  16. package/dist/collection/components/bpm/objects-selector/gx-ide-assets/bpm-objects-selector/langs/bpm-objects-selector.lang.ja.json +17 -3
  17. package/dist/collection/components/bpm/timer-duration/gx-ide-assets/bpm-timer-duration/langs/timer-duration.lang.ja.json +18 -2
  18. package/dist/collection/components/connect-gx-server/gx-ide-assets/connect-gx-server/langs/connect-gx-server.lang.ja.json +16 -2
  19. package/dist/collection/components/create-kb-from-server/gx-ide-assets/create-kb-from-server/langs/create-kb-from-server.lang.ja.json +18 -2
  20. package/dist/collection/components/dashboard-home/gx-ide-assets/dashboard-home/langs/dashboard-home.lang.ja.json +42 -2
  21. package/dist/collection/components/data-selector/gx-ide-assets/data-selector/langs/data-selector.lang.ja.json +22 -2
  22. package/dist/collection/components/design-import/gx-ide-assets/design-import/langs/design-import.lang.ja.json +36 -2
  23. package/dist/collection/components/gam-installation-settings/gx-ide-assets/gam-installation-settings/langs/gam-installation-settings.lang.ja.json +42 -2
  24. package/dist/collection/components/kb-manager-export/gx-ide-assets/kb-manager-export/langs/kb-manager-export.lang.ja.json +26 -2
  25. package/dist/collection/components/kb-manager-import/gx-ide-assets/kb-manager-import/langs/kb-manager-import.lang.ja.json +31 -2
  26. package/dist/collection/components/modules/edit-module-server/gx-ide-assets/edit-module-server/langs/edit-module-server.lang.ja.json +10 -2
  27. package/dist/collection/components/modules/manage-module-references/gx-ide-assets/manage-module-references/langs/manage-module-references.lang.ja.json +38 -2
  28. package/dist/collection/components/modules/manage-module-references-v2/gx-ide-assets/manage-module-references-v2/langs/manage-module-references-v2.lang.ja.json +38 -2
  29. package/dist/collection/components/new-environment/gx-ide-assets/new-environment/langs/new-environment.lang.ja.json +24 -2
  30. package/dist/collection/components/new-kb/gx-ide-assets/new-kb/langs/new-kb.lang.ja.json +75 -2
  31. package/dist/collection/components/new-object/gx-ide-assets/new-object/langs/new-object.lang.ja.json +12 -8
  32. package/dist/collection/components/object-selector/gx-ide-assets/object-selector/langs/object-selector.lang.ja.json +47 -2
  33. package/dist/collection/components/references/gx-ide-assets/references/langs/references.lang.ja.json +14 -2
  34. package/dist/collection/components/share-kb/gx-ide-assets/share-kb/langs/share-kb.lang.ja.json +12 -2
  35. package/dist/collection/components/start-page/gx-ide-assets/recent-news/langs/recent-news.lang.ja.json +13 -2
  36. package/dist/collection/components/start-page/gx-ide-assets/start-page/langs/start-page.lang.ja.json +22 -2
  37. package/dist/collection/components/team-dev/commit/gx-ide-assets/team-dev-commit/langs/team-dev-commit.lang.ja.json +21 -2
  38. package/dist/collection/components/team-dev/select-recent-comment/gx-ide-assets/team-dev-select-recent-comment/langs/team-dev-select-recent-comment.lang.ja.json +4 -2
  39. package/dist/collection/components/team-dev/update/gx-ide-assets/team-dev-update/langs/team-dev-update.lang.ja.json +44 -2
  40. package/dist/collection/components/team-dev/update-partial-selection/gx-ide-assets/team-dev-update-partial-selection/langs/team-dev-update-partial-selection.lang.ja.json +16 -2
  41. package/dist/collection/components/team-dev/update-to-revision/gx-ide-assets/team-dev-update-to-revision/langs/team-dev-update-to-revision.lang.ja.json +10 -2
  42. package/dist/collection/components/wf-settings/gx-ide-assets/wf-settings/langs/wf-settings.lang.ja.json +28 -2
  43. package/dist/collection/components/ww-images/gx-ide-assets/ww-images/langs/ww-images.lang.ja.json +48 -2
  44. package/dist/components/gx-ide-ai-assistant.js +14 -2
  45. package/dist/components/gx-ide-ai-assistant.js.map +1 -1
  46. package/dist/esm/genexus-ide-ui.js +1 -1
  47. package/dist/esm/gx-ide-ai-assistant.entry.js +11 -0
  48. package/dist/esm/gx-ide-ai-assistant.entry.js.map +1 -1
  49. package/dist/esm/loader.js +1 -1
  50. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  51. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  52. package/dist/genexus-ide-ui/gx-ide-assets/ai-assistant/langs/ai-assistant.lang.ja.json +8 -2
  53. package/dist/genexus-ide-ui/gx-ide-assets/bpm-app-declaration/langs/bpm-app-declaration.lang.ja.json +14 -2
  54. package/dist/genexus-ide-ui/gx-ide-assets/bpm-assign-roles/langs/bpm-assign-roles.lang.ja.json +23 -2
  55. package/dist/genexus-ide-ui/gx-ide-assets/bpm-export-xpdl/langs/bpm-export-xpdl.lang.ja.json +18 -2
  56. package/dist/genexus-ide-ui/gx-ide-assets/bpm-import-files/langs/bpm-import-files.lang.ja.json +17 -2
  57. package/dist/genexus-ide-ui/gx-ide-assets/bpm-import-gxpm/langs/bpm-import-gxpm.lang.ja.json +16 -2
  58. package/dist/genexus-ide-ui/gx-ide-assets/bpm-objects-selector/langs/bpm-objects-selector.lang.ja.json +17 -3
  59. package/dist/genexus-ide-ui/gx-ide-assets/bpm-timer-duration/langs/timer-duration.lang.ja.json +18 -2
  60. package/dist/genexus-ide-ui/gx-ide-assets/card/langs/card.lang.ja.json +9 -2
  61. package/dist/genexus-ide-ui/gx-ide-assets/connect-gx-server/langs/connect-gx-server.lang.ja.json +16 -2
  62. package/dist/genexus-ide-ui/gx-ide-assets/create-kb-from-server/langs/create-kb-from-server.lang.ja.json +18 -2
  63. package/dist/genexus-ide-ui/gx-ide-assets/dashboard-home/langs/dashboard-home.lang.ja.json +42 -2
  64. package/dist/genexus-ide-ui/gx-ide-assets/data-selector/langs/data-selector.lang.ja.json +22 -2
  65. package/dist/genexus-ide-ui/gx-ide-assets/design-import/langs/design-import.lang.ja.json +36 -2
  66. package/dist/genexus-ide-ui/gx-ide-assets/edit-module-server/langs/edit-module-server.lang.ja.json +10 -2
  67. package/dist/genexus-ide-ui/gx-ide-assets/gam-installation-settings/langs/gam-installation-settings.lang.ja.json +42 -2
  68. package/dist/genexus-ide-ui/gx-ide-assets/kb-manager-export/langs/kb-manager-export.lang.ja.json +26 -2
  69. package/dist/genexus-ide-ui/gx-ide-assets/kb-manager-import/langs/kb-manager-import.lang.ja.json +31 -2
  70. package/dist/genexus-ide-ui/gx-ide-assets/manage-module-references/langs/manage-module-references.lang.ja.json +38 -2
  71. package/dist/genexus-ide-ui/gx-ide-assets/manage-module-references-v2/langs/manage-module-references-v2.lang.ja.json +38 -2
  72. package/dist/genexus-ide-ui/gx-ide-assets/new-environment/langs/new-environment.lang.ja.json +24 -2
  73. package/dist/genexus-ide-ui/gx-ide-assets/new-kb/langs/new-kb.lang.ja.json +75 -2
  74. package/dist/genexus-ide-ui/gx-ide-assets/new-object/langs/new-object.lang.ja.json +12 -8
  75. package/dist/genexus-ide-ui/gx-ide-assets/object-selector/langs/object-selector.lang.ja.json +47 -2
  76. package/dist/genexus-ide-ui/gx-ide-assets/recent-news/langs/recent-news.lang.ja.json +13 -2
  77. package/dist/genexus-ide-ui/gx-ide-assets/references/langs/references.lang.ja.json +14 -2
  78. package/dist/genexus-ide-ui/gx-ide-assets/share-kb/langs/share-kb.lang.ja.json +12 -2
  79. package/dist/genexus-ide-ui/gx-ide-assets/start-page/langs/start-page.lang.ja.json +22 -2
  80. package/dist/genexus-ide-ui/gx-ide-assets/status-buttons/langs/status-buttons.lang.ja.json +13 -13
  81. package/dist/genexus-ide-ui/gx-ide-assets/team-dev-commit/langs/team-dev-commit.lang.ja.json +21 -2
  82. package/dist/genexus-ide-ui/gx-ide-assets/team-dev-select-recent-comment/langs/team-dev-select-recent-comment.lang.ja.json +4 -2
  83. package/dist/genexus-ide-ui/gx-ide-assets/team-dev-update/langs/team-dev-update.lang.ja.json +44 -2
  84. package/dist/genexus-ide-ui/gx-ide-assets/team-dev-update-partial-selection/langs/team-dev-update-partial-selection.lang.ja.json +16 -2
  85. package/dist/genexus-ide-ui/gx-ide-assets/team-dev-update-to-revision/langs/team-dev-update-to-revision.lang.ja.json +10 -2
  86. package/dist/genexus-ide-ui/gx-ide-assets/template/langs/template.lang.ja.json +9 -2
  87. package/dist/genexus-ide-ui/gx-ide-assets/wf-settings/langs/wf-settings.lang.ja.json +28 -2
  88. package/dist/genexus-ide-ui/gx-ide-assets/ww-images/langs/ww-images.lang.ja.json +48 -2
  89. package/dist/genexus-ide-ui/{p-be17c139.entry.js → p-f6848e69.entry.js} +14 -1
  90. package/dist/genexus-ide-ui/p-f6848e69.entry.js.map +1 -0
  91. package/dist/types/components/ai-assistant/ai-assistant.d.ts +5 -0
  92. package/dist/types/components.d.ts +8 -0
  93. package/package.json +1 -1
  94. package/dist/genexus-ide-ui/p-be17c139.entry.js.map +0 -1
@@ -1,3 +1,13 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "KB を共有",
3
+ "main": {
4
+ "kbName": "ナレッジベース:",
5
+ "serverUrl": "GXServer URL:",
6
+ "authentication": "認証タイプ:",
7
+ "userName": "ユーザー名:",
8
+ "password": "パスワード:"
9
+ },
10
+ "footer": {
11
+ "shareBtn": "KB を共有"
12
+ }
13
+ }
@@ -1,3 +1,23 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "開始ページ",
3
+ "tabs": {
4
+ "home": "ホーム",
5
+ "learn": "学習",
6
+ "samples": "サンプル",
7
+ "marketplace": "Marketplace",
8
+ "updates": "更新"
9
+ },
10
+ "recentKbs": {
11
+ "title": "最近の KB",
12
+ "lastOpened": "最終アクセス日",
13
+ "modified": "変更済み:"
14
+ },
15
+ "recentNews": {
16
+ "title": "最近のニュース",
17
+ "linkLabel": "すべてのニュースを確認",
18
+ "linkUrl": "https://www.genexus.com/en/news"
19
+ },
20
+ "loader": {
21
+ "title": "GeneXus の最近のニュースのロード中..."
22
+ }
23
+ }
@@ -1,18 +1,18 @@
1
1
  {
2
- "errorLabel": {
3
- "singular": "",
4
- "plural": ""
2
+ "errors": {
3
+ "singular": "エラー",
4
+ "plural": "エラー"
5
5
  },
6
- "warningLabel": {
7
- "singular": "",
8
- "plural": ""
6
+ "warnings": {
7
+ "singular": "警告",
8
+ "plural": "警告"
9
9
  },
10
- "successLabel": {
11
- "singular": "",
12
- "plural": ""
10
+ "successes": {
11
+ "singular": "成功",
12
+ "plural": "成功"
13
13
  },
14
- "messageLabel": {
15
- "singular": "",
16
- "plural": ""
14
+ "messages": {
15
+ "singular": "メッセージ",
16
+ "plural": "メッセージ"
17
17
  }
18
- }
18
+ }
@@ -1,3 +1,22 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "チーム開発のコミット",
3
+ "header": {
4
+ "commentLabel": "コミットのコメント:",
5
+ "commentPlaceholder": "このコミットに含まれている変更を表示...",
6
+ "recentCommentsButton": "最近のコメント"
7
+ },
8
+ "filtersMenu": {
9
+ "patternLabel": "パターン:",
10
+ "changesetLabel": "チェンジセット:",
11
+ "typeLabel": "タイプ:",
12
+ "folderLabel": "フォルダ:",
13
+ "categoryLabel": "カテゴリ:"
14
+ },
15
+ "tabs": {
16
+ "pendingCommits": "保留中のコミット",
17
+ "ignoredObjects": "無視されたオブジェクト"
18
+ },
19
+ "footer": {
20
+ "commitButton": "コミット"
21
+ }
22
+ }
@@ -1,3 +1,5 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "チーム開発の最近のコメント",
3
+ "confirmButton": "実行",
4
+ "cancelButton": "キャンセル"
5
+ }
@@ -1,3 +1,45 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "チーム開発の更新",
3
+ "options": {
4
+ "updateFrom": "GeneXus Server",
5
+ "scope": "適用範囲",
6
+ "genexusServer": "GeneXus Server",
7
+ "knowledgeBase": "ナレッジベース",
8
+ "version": "バージョン",
9
+ "lastFullUpdate": "最後の全体更新",
10
+ "objects": "オブジェクト",
11
+ "revision": "リビジョン",
12
+ "kbProperties": "KB プロパティ",
13
+ "changeBtn": "変更",
14
+ "scopeData": {
15
+ "objects": {
16
+ "all": "すべて",
17
+ "partial": "部分"
18
+ },
19
+ "revision": {
20
+ "latest": "最新"
21
+ }
22
+ }
23
+ },
24
+ "filter": {
25
+ "pattern": "パターン",
26
+ "type": "タイプ"
27
+ },
28
+ "tabs": {
29
+ "pendingForUpdate": "保留中の更新",
30
+ "ignoredObjects": "無視されたオブジェクト",
31
+ "results": "結果"
32
+ },
33
+ "tableHead": {
34
+ "name": "名前",
35
+ "type": "タイプ",
36
+ "description": "デスクリプション",
37
+ "modifiedOn": "変更日",
38
+ "status": "ステータス",
39
+ "action": "アクション",
40
+ "notes": "注釈"
41
+ },
42
+ "footer": {
43
+ "btnUpdate": "更新"
44
+ }
45
+ }
@@ -1,3 +1,17 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "チーム開発の部分選択の更新",
3
+ "title": "部分選択",
4
+ "btnAddObject": "追加",
5
+ "btnRemoveSelectedObjects": "選択項目を削除",
6
+ "tableHead": {
7
+ "name": "名前",
8
+ "type": "タイプ",
9
+ "description": "デスクリプション",
10
+ "modifiedOn": "変更日"
11
+ },
12
+ "footer": {
13
+ "btnRemoveAll": "すべて削除",
14
+ "btnConfirm": "実行",
15
+ "btnCancel": "キャンセル"
16
+ }
17
+ }
@@ -1,3 +1,11 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "チーム開発のリビジョンへの更新",
3
+ "options": {
4
+ "updateToLatest": "最新のリビジョンに更新",
5
+ "updateToRevision": "リビジョン # に更新"
6
+ },
7
+ "footer": {
8
+ "btnUpdate": "更新",
9
+ "btnCancel": "キャンセル"
10
+ }
11
+ }
@@ -1,3 +1,10 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "コンポーネントのタイトル",
3
+ "header": {},
4
+ "main": {},
5
+ "footer": {},
6
+ "loader": {
7
+ "title": "ロード中...",
8
+ "cancelLabel": "キャンセル"
9
+ }
10
+ }
@@ -1,3 +1,29 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "ワークフローを有効化",
3
+ "header": {},
4
+ "description": {
5
+ "installation": "ワークフローを有効にすると、Workflow API がインポートされ、ワークフローエンジンのテーブルが作成されます。また、GXflow クライアントをインストールすると、受信トレイ、送信トレイ、タスクマネージャ、プロセスマネージャなどを利用できます。",
6
+ "update": "以下を選択すると、GXflow クライアントがインストールされます。インストール後に、受信トレイ、送信トレイ、タスクマネージャ、プロセスマネージャなどを利用できます。"
7
+ },
8
+ "prompt": {
9
+ "installation": "ワークフローを有効にしますか?",
10
+ "update": "変更を適用する場合は [保存]、変更を無視する場合は [キャンセル] を選択します"
11
+ },
12
+ "upgradesOptions": [
13
+ "更新プログラムを自動的にインストール",
14
+ "更新を確認",
15
+ "更新しない"
16
+ ],
17
+ "installGxFlow": "GXflow クライアントをインストール",
18
+ "manageUpgrades": "今後のアップグレードの管理方法を選択",
19
+ "footer": {
20
+ "confirmButton": {
21
+ "installation": "ワークフローを有効化",
22
+ "update": "保存"
23
+ }
24
+ },
25
+ "loader": {
26
+ "title": "ロード中...",
27
+ "cancelLabel": "キャンセル"
28
+ }
29
+ }
@@ -1,3 +1,49 @@
1
1
  {
2
- "presentation": "「こんにちは、私の名前は {0} です。オレゴンに住んでいます。」"
3
- }
2
+ "componentName": "画像リスト",
3
+ "location": "場所",
4
+ "filter": {
5
+ "title": "フィルタ",
6
+ "name": "名前",
7
+ "type": "タイプ",
8
+ "category": "カテゴリ",
9
+ "moduleFolder": "モジュール/フォルダ",
10
+ "search": "コンテンツを検索",
11
+ "allDescendants": "すべての下位項目",
12
+ "modified": "変更あり",
13
+ "user": "ユーザー",
14
+ "dateTime": "日付/時刻",
15
+ "afterLabel": "以降",
16
+ "afterNone": "なし",
17
+ "afterDateTime": "日付/時刻以降",
18
+ "afterLastBuild": "最後のビルド以降",
19
+ "afterImport": "インポート以降",
20
+ "style": "スタイル",
21
+ "language": "言語",
22
+ "density": "画面密度",
23
+ "layer": "レイヤー",
24
+ "btnMore": "詳細 >>",
25
+ "btnLess": "<< 標準"
26
+ },
27
+ "objCount": {
28
+ "selected": "選択されたオブジェクト",
29
+ "matching": "一致するオブジェクト"
30
+ },
31
+ "tableHead": {
32
+ "name": "名前",
33
+ "type": "タイプ",
34
+ "module": "モジュール",
35
+ "description": "デスクリプション",
36
+ "modifiedDate": "変更日付",
37
+ "importDate": "インポート日付",
38
+ "lastBuildDate": "前回のビルドの日付",
39
+ "lastUser": "前回のユーザー"
40
+ },
41
+ "footer": {
42
+ "btnSelectAll": "すべて選択",
43
+ "btnNew": "新規画像",
44
+ "btnOk": "OK",
45
+ "btnCancel": "キャンセル"
46
+ },
47
+ "imagesTitle": "タイル",
48
+ "imagesDataTitle": "画像情報"
49
+ }
@@ -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-be17c139.entry.js.map
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
  */
@@ -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
  */
@@ -2793,6 +2797,10 @@ declare namespace LocalJSX {
2793
2797
  * A temporary property to illustrate the assistant status
2794
2798
  */
2795
2799
  "assistantStatus"?: AiStatus;
2800
+ /**
2801
+ * Callback that must be invoked when the conversation is cleared, using the header button.
2802
+ */
2803
+ "clearCallback"?: () => Promise<void>;
2796
2804
  /**
2797
2805
  * If tue, it will display a filter.
2798
2806
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genexus/genexus-ide-ui",
3
3
  "license": "Apache-2.0",
4
- "version": "0.0.147",
4
+ "version": "0.0.149",
5
5
  "description": "GeneXus IDE UI components",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.js",
@@ -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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"}