@gitlab/duo-ui 0.4.0 → 1.0.0

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 (39) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/chat/components/duo_chat_context/constants.js +2 -1
  3. package/dist/components/chat/components/duo_chat_context/duo_chat_context_item_details_modal/duo_chat_context_item_details_modal.js +36 -9
  4. package/dist/components/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu.js +1 -1
  5. package/dist/components/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_search_item.js +8 -16
  6. package/dist/components/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_search_items_loading.js +1 -1
  7. package/dist/components/chat/components/duo_chat_context/duo_chat_context_item_popover/duo_chat_context_item_popover.js +12 -8
  8. package/dist/components/chat/components/duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.js +2 -2
  9. package/dist/components/chat/components/duo_chat_context/mock_context_data.js +118 -9
  10. package/dist/components/chat/components/duo_chat_context/utils.js +28 -2
  11. package/dist/components/chat/components/duo_chat_conversation/duo_chat_conversation.js +1 -1
  12. package/dist/components/chat/components/duo_chat_loader/duo_chat_loader.js +1 -1
  13. package/dist/components/chat/duo_chat.js +4 -4
  14. package/dist/components/workflow/components/duo_workflow_panel/duo_workflow_panel.js +1 -1
  15. package/dist/components/workflow/components/duo_workflow_prompt/duo_workflow_prompt.js +1 -1
  16. package/dist/components.css +1 -1
  17. package/dist/components.css.map +1 -1
  18. package/dist/tailwind.css +1 -1
  19. package/dist/tailwind.css.map +1 -1
  20. package/dist/utils/i18n.js +63 -0
  21. package/package.json +2 -2
  22. package/src/components/chat/components/duo_chat_context/constants.js +1 -0
  23. package/src/components/chat/components/duo_chat_context/duo_chat_context_item_details_modal/duo_chat_context_item_details_modal.vue +61 -6
  24. package/src/components/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu.md +35 -0
  25. package/src/components/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu.vue +1 -1
  26. package/src/components/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_search_item.vue +17 -25
  27. package/src/components/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_search_items_loading.vue +1 -1
  28. package/src/components/chat/components/duo_chat_context/duo_chat_context_item_popover/duo_chat_context_item_popover.vue +20 -15
  29. package/src/components/chat/components/duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.vue +10 -4
  30. package/src/components/chat/components/duo_chat_context/mock_context_data.js +148 -9
  31. package/src/components/chat/components/duo_chat_context/utils.js +32 -1
  32. package/src/components/chat/components/duo_chat_conversation/duo_chat_conversation.vue +1 -1
  33. package/src/components/chat/components/duo_chat_loader/duo_chat_loader.vue +1 -1
  34. package/src/components/chat/duo_chat.scss +19 -8
  35. package/src/components/chat/duo_chat.vue +15 -11
  36. package/src/components/workflow/components/duo_workflow_panel/duo_workflow_panel.vue +1 -1
  37. package/src/components/workflow/components/duo_workflow_prompt/duo_workflow_prompt.vue +1 -1
  38. package/src/utils/i18n.js +62 -0
  39. package/translations.js +2 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [1.0.0](https://gitlab.com/gitlab-org/duo-ui/compare/v0.4.0...v1.0.0) (2024-11-12)
2
+
3
+
4
+ ### Features
5
+
6
+ * refactor translation mechanism ([e28fc10](https://gitlab.com/gitlab-org/duo-ui/commit/e28fc108870446555a9a75bd71f0b0e2cf6d8198))
7
+ * Update Duo Components to match GitLab UI v101.16.0 ([58c6bf9](https://gitlab.com/gitlab-org/duo-ui/commit/58c6bf91c1b237485d29717ecad581319d83ad64))
8
+
9
+
10
+ ### BREAKING CHANGES
11
+
12
+ * Synced Duo components with GitLab UI v101.16.0
13
+ see: https://gitlab.com/gitlab-org/gitlab-ui/-/releases/v101.16.0
14
+
1
15
  # [0.4.0](https://gitlab.com/gitlab-org/duo-ui/compare/v0.3.0...v0.4.0) (2024-11-07)
2
16
 
3
17
 
@@ -2,10 +2,11 @@ const CONTEXT_ITEM_CATEGORY_ISSUE = 'issue';
2
2
  const CONTEXT_ITEM_CATEGORY_MERGE_REQUEST = 'merge_request';
3
3
  const CONTEXT_ITEM_CATEGORY_FILE = 'file';
4
4
  const CONTEXT_ITEM_CATEGORY_LOCAL_GIT = 'local_git';
5
+ const CONTEXT_ITEM_CATEGORY_DEPENDENCY = 'dependency';
5
6
  const CONTEXT_ITEM_LOCAL_GIT_COMMIT = 'commit';
6
7
  const CONTEXT_ITEM_LOCAL_GIT_DIFF = 'diff';
7
8
  const LANGUAGE_IDENTIFIER_PREFIX = 'language-';
8
9
  const LANGUAGE_IDENTIFIER_DIFF = 'language-diff';
9
10
  const LANGUAGE_IDENTIFIER_PLAINTEXT = 'language-plaintext';
10
11
 
11
- export { CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST, CONTEXT_ITEM_LOCAL_GIT_COMMIT, CONTEXT_ITEM_LOCAL_GIT_DIFF, LANGUAGE_IDENTIFIER_DIFF, LANGUAGE_IDENTIFIER_PLAINTEXT, LANGUAGE_IDENTIFIER_PREFIX };
12
+ export { CONTEXT_ITEM_CATEGORY_DEPENDENCY, CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST, CONTEXT_ITEM_LOCAL_GIT_COMMIT, CONTEXT_ITEM_LOCAL_GIT_DIFF, LANGUAGE_IDENTIFIER_DIFF, LANGUAGE_IDENTIFIER_PLAINTEXT, LANGUAGE_IDENTIFIER_PREFIX };
@@ -1,13 +1,14 @@
1
1
  import { nextTick } from 'vue';
2
- import { GlSkeletonLoader, GlModal, GlSafeHtmlDirective } from '@gitlab/ui';
3
- import { translate } from '@gitlab/ui/dist/utils/i18n';
2
+ import { GlAlert, GlSkeletonLoader, GlModal, GlSafeHtmlDirective } from '@gitlab/ui';
3
+ import { translate } from '../../../../../utils/i18n';
4
4
  import { contextItemValidator } from '../utils';
5
- import { CONTEXT_ITEM_CATEGORY_LOCAL_GIT, LANGUAGE_IDENTIFIER_DIFF, LANGUAGE_IDENTIFIER_PREFIX, LANGUAGE_IDENTIFIER_PLAINTEXT } from '../constants';
5
+ import { CONTEXT_ITEM_CATEGORY_LOCAL_GIT, LANGUAGE_IDENTIFIER_DIFF, LANGUAGE_IDENTIFIER_PREFIX, LANGUAGE_IDENTIFIER_PLAINTEXT, CONTEXT_ITEM_CATEGORY_DEPENDENCY } from '../constants';
6
6
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
7
7
 
8
8
  var script = {
9
9
  name: 'GlDuoChatContextItemDetailsModal',
10
10
  components: {
11
+ GlAlert,
11
12
  GlSkeletonLoader,
12
13
  GlModal
13
14
  },
@@ -32,6 +33,11 @@ var script = {
32
33
  validator: contextItemValidator
33
34
  }
34
35
  },
36
+ data() {
37
+ return {
38
+ contentErrorIsVisible: false
39
+ };
40
+ },
35
41
  computed: {
36
42
  isLoadingContent() {
37
43
  return this.contextItem.content === undefined;
@@ -50,16 +56,25 @@ var script = {
50
56
  title() {
51
57
  var _this$contextItem$met4, _this$contextItem$met5;
52
58
  return ((_this$contextItem$met4 = this.contextItem.metadata) === null || _this$contextItem$met4 === void 0 ? void 0 : _this$contextItem$met4.title) || ((_this$contextItem$met5 = this.contextItem.metadata) === null || _this$contextItem$met5 === void 0 ? void 0 : _this$contextItem$met5.relativePath) || translate('GlDuoChatContextItemDetailsModal.title', 'Preview');
59
+ },
60
+ isDependencies() {
61
+ return this.contextItem.category === CONTEXT_ITEM_CATEGORY_DEPENDENCY;
53
62
  }
54
63
  },
55
64
  watch: {
56
65
  contextItem: {
57
66
  async handler(newVal, oldVal) {
58
- const shouldFormat = (newVal === null || newVal === void 0 ? void 0 : newVal.content) !== (oldVal === null || oldVal === void 0 ? void 0 : oldVal.content) && (newVal === null || newVal === void 0 ? void 0 : newVal.content);
59
- if (shouldFormat) {
60
- await nextTick();
61
- await this.hydrateContentWithGFM();
67
+ // Dependency items contain structured data as content, not code/markdown.
68
+ // So skip running this content through GFM, we'll parse and render it here in the component.
69
+ if (newVal.category === CONTEXT_ITEM_CATEGORY_DEPENDENCY) {
70
+ return;
62
71
  }
72
+ const isUnchangedOrEmptyContent = !(newVal !== null && newVal !== void 0 && newVal.content) || (newVal === null || newVal === void 0 ? void 0 : newVal.content) === (oldVal === null || oldVal === void 0 ? void 0 : oldVal.content);
73
+ if (isUnchangedOrEmptyContent) {
74
+ return;
75
+ }
76
+ await nextTick();
77
+ await this.hydrateContentWithGFM();
63
78
  },
64
79
  immediate: true
65
80
  }
@@ -71,19 +86,31 @@ var script = {
71
86
  this.renderGFM(this.$refs.content);
72
87
  }
73
88
  },
89
+ parseDependencies() {
90
+ if (this.contextItem.category !== CONTEXT_ITEM_CATEGORY_DEPENDENCY) {
91
+ return null;
92
+ }
93
+ try {
94
+ return JSON.parse(this.contextItem.content);
95
+ } catch (error) {
96
+ this.contentErrorIsVisible = true;
97
+ return {};
98
+ }
99
+ },
74
100
  onModalVisibilityChange(isVisible) {
75
101
  if (!isVisible) {
76
102
  this.$emit('close');
77
103
  }
78
104
  }
79
- }
105
+ },
106
+ CONTENT_ERROR_MESSAGE: translate('GlDuoChatContextItemDetailsModal.contentErrorMessage', 'Item content could not be displayed.')
80
107
  };
81
108
 
82
109
  /* script */
83
110
  const __vue_script__ = script;
84
111
 
85
112
  /* template */
86
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-modal',{attrs:{"modal-id":"context-item-details-modal","title":_vm.title,"visible":true,"scrollable":true,"hide-footer":"","size":"lg"},on:{"change":_vm.onModalVisibilityChange}},[(_vm.isLoadingContent)?_c('gl-skeleton-loader'):_c('div',{ref:"content",attrs:{"data-testid":"context-item-content"}},[_c('pre',{directives:[{name:"safe-html",rawName:"v-safe-html",value:(_vm.contextItem.content),expression:"contextItem.content"}],staticClass:"code js-syntax-highlight gl-p-3",class:_vm.languageIdentifierClass})])],1)};
113
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-modal',{attrs:{"modal-id":"context-item-details-modal","title":_vm.title,"visible":true,"scrollable":true,"hide-footer":"","size":"lg"},on:{"change":_vm.onModalVisibilityChange}},[(_vm.isLoadingContent)?_c('gl-skeleton-loader'):(_vm.contentErrorIsVisible)?_c('gl-alert',{attrs:{"variant":"danger","dismissible":false,"data-testid":"content-error-alert"}},[_vm._v("\n "+_vm._s(_vm.$options.CONTENT_ERROR_MESSAGE)+"\n ")]):(_vm.isDependencies)?_c('div',{attrs:{"data-testid":"context-item-content"}},[_c('p',[_vm._v("Project dependencies from "+_vm._s(_vm.contextItem.metadata.secondaryText))]),_vm._v(" "),_vm._l((_vm.parseDependencies()),function(matches,index){return _c('div',{key:index},_vm._l((matches),function(dependencies,language){return _c('div',{key:language},[_c('h3',{staticClass:"gl-heading-4 gl-mb-2"},[_vm._v(_vm._s(language))]),_vm._v(" "),_c('ul',{staticClass:"gl-pl-6"},_vm._l((dependencies),function(dependency){return _c('li',{key:dependency},[_vm._v("\n "+_vm._s(dependency)+"\n ")])}),0)])}),0)})],2):_c('div',{ref:"content",attrs:{"data-testid":"context-item-content"}},[_c('pre',{directives:[{name:"safe-html",rawName:"v-safe-html",value:(_vm.contextItem.content),expression:"contextItem.content"}],staticClass:"code js-syntax-highlight gl-p-3",class:_vm.languageIdentifierClass})])],1)};
87
114
  var __vue_staticRenderFns__ = [];
88
115
 
89
116
  /* style */
@@ -1,6 +1,6 @@
1
1
  import debounce from 'lodash/debounce';
2
- import { translate } from '@gitlab/ui/dist/utils/i18n';
3
2
  import { GlCard } from '@gitlab/ui';
3
+ import { translate } from '../../../../../utils/i18n';
4
4
  import GlDuoChatContextItemSelections from '../duo_chat_context_item_selections/duo_chat_context_item_selections';
5
5
  import { contextItemsValidator, categoriesValidator, wrapIndex } from '../utils';
6
6
  import GlDuoChatContextItemMenuCategoryItems from './duo_chat_context_item_menu_category_items';
@@ -1,12 +1,12 @@
1
- import { GlTruncate, GlIcon } from '@gitlab/ui';
1
+ import { GlBadge, GlTruncate, GlIcon } from '@gitlab/ui';
2
2
  import GlDuoChatContextItemPopover from '../duo_chat_context_item_popover/duo_chat_context_item_popover';
3
- import { categoryValidator, contextItemValidator, formatGitItemSecondaryText, formatMergeRequestId, formatIssueId, getContextItemIcon } from '../utils';
4
- import { CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST, CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_FILE } from '../constants';
3
+ import { categoryValidator, contextItemValidator, getContextItemSecondaryText, getContextItemIcon, getContextItemSource } from '../utils';
5
4
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
6
5
 
7
6
  var script = {
8
7
  name: 'GlDuoChatContextItemMenuSearchItem',
9
8
  components: {
9
+ GlBadge,
10
10
  GlTruncate,
11
11
  GlIcon,
12
12
  GlDuoChatContextItemPopover
@@ -29,21 +29,13 @@ var script = {
29
29
  return ((_this$contextItem$met = this.contextItem.metadata) === null || _this$contextItem$met === void 0 ? void 0 : _this$contextItem$met.title) || '';
30
30
  },
31
31
  secondaryText() {
32
- switch (this.category.value) {
33
- case CONTEXT_ITEM_CATEGORY_FILE:
34
- return this.contextItem.metadata.relativePath;
35
- case CONTEXT_ITEM_CATEGORY_ISSUE:
36
- return formatIssueId(this.contextItem.metadata.iid);
37
- case CONTEXT_ITEM_CATEGORY_MERGE_REQUEST:
38
- return formatMergeRequestId(this.contextItem.metadata.iid);
39
- case CONTEXT_ITEM_CATEGORY_LOCAL_GIT:
40
- return formatGitItemSecondaryText(this.contextItem);
41
- default:
42
- return '';
43
- }
32
+ return getContextItemSecondaryText(this.contextItem);
44
33
  },
45
34
  icon() {
46
35
  return getContextItemIcon(this.contextItem, this.category);
36
+ },
37
+ itemSource() {
38
+ return getContextItemSource(this.contextItem);
47
39
  }
48
40
  }
49
41
  };
@@ -52,7 +44,7 @@ var script = {
52
44
  const __vue_script__ = script;
53
45
 
54
46
  /* template */
55
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-flex gl-flex-col"},[_c('div',{staticClass:"gl-flex gl-items-center"},[_c('gl-icon',{staticClass:"gl-mr-2 gl-shrink-0",attrs:{"name":_vm.icon,"data-testid":"category-icon"}}),_vm._v(" "),_c('gl-truncate',{staticClass:"gl-min-w-0",attrs:{"text":_vm.title,"data-testid":"item-title"}}),_vm._v(" "),_c('gl-icon',{staticClass:"gl-ml-2 gl-shrink-0 gl-cursor-pointer gl-text-secondary",attrs:{"id":("info-icon-" + (_vm.contextItem.id)),"name":"information-o","size":12}}),_vm._v(" "),_c('gl-duo-chat-context-item-popover',{attrs:{"context-item":_vm.contextItem,"target":("info-icon-" + (_vm.contextItem.id)),"placement":"left"}})],1),_vm._v(" "),(_vm.secondaryText)?_c('div',{staticClass:"gl-mt-1 gl-shrink-0 gl-whitespace-nowrap gl-text-secondary",attrs:{"data-testid":"item-secondary-text"}},[_c('gl-truncate',{attrs:{"text":_vm.secondaryText}})],1):_vm._e()])};
47
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-flex gl-flex-col"},[_c('div',{staticClass:"gl-flex gl-items-center"},[_c('gl-icon',{staticClass:"gl-mr-2 gl-shrink-0",attrs:{"name":_vm.icon,"data-testid":"category-icon"}}),_vm._v(" "),_c('gl-truncate',{staticClass:"gl-min-w-0",attrs:{"text":_vm.title,"data-testid":"item-title"}}),_vm._v(" "),_c('gl-icon',{staticClass:"gl-ml-2 gl-shrink-0 gl-cursor-pointer gl-text-secondary",attrs:{"id":("info-icon-" + (_vm.contextItem.id)),"name":"information-o","size":12}}),_vm._v(" "),_c('gl-duo-chat-context-item-popover',{attrs:{"context-item":_vm.contextItem,"target":("info-icon-" + (_vm.contextItem.id)),"placement":"left"}})],1),_vm._v(" "),(_vm.secondaryText)?_c('div',{staticClass:"gl-align-items-center gl-mt-1 gl-flex gl-shrink-0 gl-whitespace-nowrap gl-text-secondary",attrs:{"data-testid":"item-secondary-text"}},[(_vm.itemSource)?_c('gl-badge',{staticClass:"gl-mr-1",attrs:{"variant":"neutral","data-testid":"context-item-source"}},[_vm._v(_vm._s(_vm.itemSource))]):_vm._e(),_vm._v(" "),_c('gl-truncate',{staticClass:"gl-min-w-0",attrs:{"position":"middle","text":_vm.secondaryText}})],1):_vm._e()])};
56
48
  var __vue_staticRenderFns__ = [];
57
49
 
58
50
  /* style */
@@ -1,4 +1,4 @@
1
- import { translate } from '@gitlab/ui/dist/utils/i18n';
1
+ import { translate } from '../../../../../utils/i18n';
2
2
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
3
3
 
4
4
  var script = {
@@ -1,12 +1,13 @@
1
- import { GlTruncate, GlAlert, GlIcon, GlPopover } from '@gitlab/ui';
2
- import { translate } from '@gitlab/ui/dist/utils/i18n';
3
- import { CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST, CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_LOCAL_GIT } from '../constants';
4
- import { formatMergeRequestId, formatIssueId, formatGitItemSecondaryText, getContextItemIcon, getContextItemTypeLabel } from '../utils';
1
+ import { GlBadge, GlTruncate, GlAlert, GlIcon, GlPopover } from '@gitlab/ui';
2
+ import { translate } from '../../../../../utils/i18n';
3
+ import { CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST, CONTEXT_ITEM_CATEGORY_FILE } from '../constants';
4
+ import { formatMergeRequestId, formatIssueId, getContextItemIcon, getContextItemTypeLabel, getContextItemSecondaryText, getContextItemSource } from '../utils';
5
5
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
6
6
 
7
7
  var script = {
8
8
  name: 'DuoChatContextItemPopover',
9
9
  components: {
10
+ GlBadge,
10
11
  GlTruncate,
11
12
  GlAlert,
12
13
  GlIcon,
@@ -61,9 +62,6 @@ var script = {
61
62
  var _this$filePath;
62
63
  return (_this$filePath = this.filePath) === null || _this$filePath === void 0 ? void 0 : _this$filePath.split('/');
63
64
  },
64
- gitDetails() {
65
- return this.contextItem.category === CONTEXT_ITEM_CATEGORY_LOCAL_GIT ? formatGitItemSecondaryText(this.contextItem) : null;
66
- },
67
65
  isEnabled() {
68
66
  return this.contextItem.metadata.enabled !== false;
69
67
  },
@@ -75,6 +73,12 @@ var script = {
75
73
  },
76
74
  itemTypeLabel() {
77
75
  return getContextItemTypeLabel(this.contextItem);
76
+ },
77
+ secondaryText() {
78
+ return getContextItemSecondaryText(this.contextItem);
79
+ },
80
+ itemSource() {
81
+ return getContextItemSource(this.contextItem);
78
82
  }
79
83
  },
80
84
  methods: {
@@ -86,7 +90,7 @@ var script = {
86
90
  const __vue_script__ = script;
87
91
 
88
92
  /* template */
89
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-popover',{attrs:{"target":_vm.target,"triggers":"hover focus","placement":_vm.placement,"title":_vm.title,"custom-class":"gl-duo-chat-item-popover"},scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('div',[_c('div',{staticClass:"gl-heading-3 gl-mb-1 gl-mt-2 gl-leading-1",attrs:{"data-testid":"chat-context-popover-title"}},[_vm._v("\n "+_vm._s(_vm.title)+"\n ")]),_vm._v(" "),(_vm.itemTypeLabel)?_c('div',{staticClass:"gl-font-normal gl-text-subtle"},[_vm._v(_vm._s(_vm.itemTypeLabel))]):_vm._e()])]},proxy:true}])},[_vm._v(" "),_c('div',[(_vm.filePath)?_c('div',[_c('gl-icon',{attrs:{"name":"document","size":12,"variant":"subtle"}}),_vm._v(" "),_c('span',{staticClass:"gl-break-all"},[_vm._v(_vm._s(_vm.contextItem.metadata.project))]),_vm._v(" "),_vm._l((_vm.filePathArray),function(pathPart,index){return _c('span',{key:pathPart,staticClass:"gl-break-all"},[_vm._v(_vm._s(pathPart)+_vm._s(index + 1 < _vm.filePathArray.length ? '/' : ''))])})],2):(_vm.gitDetails)?_c('div',{staticClass:"gl-flex gl-items-center",attrs:{"data-testid":"git-details"}},[_c('gl-icon',{staticClass:"gl-mr-1 gl-shrink-0",attrs:{"name":_vm.iconName,"size":12,"variant":"subtle"}}),_vm._v(" "),_c('gl-truncate',{staticClass:"gl-min-w-0",attrs:{"text":_vm.gitDetails}})],1):_c('div',[(_vm.iconName)?_c('gl-icon',{attrs:{"name":_vm.iconName,"size":12,"variant":"subtle"}}):_vm._e(),_vm._v(" "),_c('span',{staticClass:"gl-break-all"},[_vm._v(_vm._s(_vm.contextItem.metadata.project))]),_vm._v(" "),(_vm.id)?_c('span',{staticClass:"gl-break-all"},[_vm._v(_vm._s(_vm.formattedId))]):_vm._e()],1),_vm._v(" "),(!_vm.isEnabled)?_c('gl-alert',{staticClass:"gl-mb-1 gl-mt-3 gl-p-4 gl-text-sm",attrs:{"variant":"danger","data-testid":"chat-context-popover-disabled","dismissible":false,"show-icon":false}},[_vm._v("\n "+_vm._s(_vm.disabledMessage)+"\n ")]):_vm._e()],1)])};
93
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-popover',{attrs:{"target":_vm.target,"triggers":"hover focus","placement":_vm.placement,"title":_vm.title,"custom-class":"gl-duo-chat-item-popover"},scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('div',[_c('div',{staticClass:"gl-heading-3 gl-mb-1 gl-mt-2 gl-leading-1",attrs:{"data-testid":"chat-context-popover-title"}},[_vm._v("\n "+_vm._s(_vm.title)+"\n ")]),_vm._v(" "),(_vm.itemTypeLabel)?_c('div',{staticClass:"gl-flex gl-items-center gl-font-normal gl-text-subtle"},[_c('gl-truncate',{staticClass:"gl-min-w-0",attrs:{"text":_vm.itemTypeLabel}})],1):_vm._e()])]},proxy:true}])},[_vm._v(" "),_c('div',[(_vm.secondaryText)?_c('div',{staticClass:"gl-flex gl-items-center"},[_c('gl-icon',{staticClass:"gl-mr-1 gl-shrink-0",attrs:{"name":_vm.iconName,"size":12,"variant":"subtle"}}),_vm._v(" "),(_vm.itemSource)?_c('gl-badge',{staticClass:"gl-mr-1"},[_vm._v(_vm._s(_vm.itemSource))]):_vm._e(),_vm._v(" "),_c('gl-truncate',{staticClass:"gl-min-w-0",attrs:{"text":_vm.secondaryText}})],1):(_vm.filePath)?_c('div',[_c('gl-icon',{attrs:{"name":"document","size":12,"variant":"subtle"}}),_vm._v(" "),_c('span',{staticClass:"gl-break-all"},[_vm._v(_vm._s(_vm.contextItem.metadata.project))]),_vm._v(" "),_vm._l((_vm.filePathArray),function(pathPart,index){return _c('span',{key:pathPart,staticClass:"gl-break-all"},[_vm._v(_vm._s(pathPart)+_vm._s(index + 1 < _vm.filePathArray.length ? '/' : ''))])})],2):_c('div',[(_vm.iconName)?_c('gl-icon',{attrs:{"name":_vm.iconName,"size":12,"variant":"subtle"}}):_vm._e(),_vm._v(" "),_c('span',{staticClass:"gl-break-all"},[_vm._v(_vm._s(_vm.contextItem.metadata.project))]),_vm._v(" "),(_vm.id)?_c('span',{staticClass:"gl-break-all"},[_vm._v(_vm._s(_vm.formattedId))]):_vm._e()],1),_vm._v(" "),(!_vm.isEnabled)?_c('gl-alert',{staticClass:"gl-mb-1 gl-mt-3 gl-p-4 gl-text-sm",attrs:{"variant":"danger","data-testid":"chat-context-popover-disabled","dismissible":false,"show-icon":false}},[_vm._v("\n "+_vm._s(_vm.disabledMessage)+"\n ")]):_vm._e()],1)])};
90
94
  var __vue_staticRenderFns__ = [];
91
95
 
92
96
  /* style */
@@ -1,7 +1,7 @@
1
1
  import uniqueId from 'lodash/uniqueId';
2
2
  import { GlTruncate, GlIcon, GlToken } from '@gitlab/ui';
3
3
  import GlDuoChatContextItemPopover from '../duo_chat_context_item_popover/duo_chat_context_item_popover';
4
- import { CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_FILE } from '../constants';
4
+ import { CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_DEPENDENCY } from '../constants';
5
5
  import GlDuoChatContextItemDetailsModal from '../duo_chat_context_item_details_modal/duo_chat_context_item_details_modal';
6
6
  import { contextItemsValidator, getContextItemIcon } from '../utils';
7
7
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
@@ -106,7 +106,7 @@ var script = {
106
106
  this.previewContextItemId = contextItem.id;
107
107
  },
108
108
  canOpen(contextItem) {
109
- return [CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_FILE].includes(contextItem.category);
109
+ return [CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_DEPENDENCY].includes(contextItem.category);
110
110
  },
111
111
  onClosePreview() {
112
112
  this.previewContextItemId = null;
@@ -1,4 +1,4 @@
1
- import { CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST } from './constants';
1
+ import { CONTEXT_ITEM_CATEGORY_DEPENDENCY, CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST } from './constants';
2
2
 
3
3
  const MOCK_CATEGORIES = [{
4
4
  label: 'Files',
@@ -16,6 +16,10 @@ const MOCK_CATEGORIES = [{
16
16
  label: 'Merge Requests',
17
17
  value: CONTEXT_ITEM_CATEGORY_MERGE_REQUEST,
18
18
  icon: 'merge-request'
19
+ }, {
20
+ label: 'Dependencies',
21
+ value: CONTEXT_ITEM_CATEGORY_DEPENDENCY,
22
+ icon: 'package'
19
23
  }];
20
24
  function getMockCategory(categoryValue) {
21
25
  return MOCK_CATEGORIES.find(cat => cat.value === categoryValue);
@@ -39,6 +43,9 @@ const MOCK_CONTEXT_ITEM_FILE = {
39
43
  metadata: {
40
44
  enabled: true,
41
45
  title: 'strawberry.ts',
46
+ secondaryText: 'src/plants/strawberry.ts',
47
+ subTypeLabel: 'Project file',
48
+ icon: 'document',
42
49
  project: 'example/garden',
43
50
  relativePath: 'src/plants/strawberry.ts'
44
51
  }
@@ -49,6 +56,9 @@ const MOCK_CONTEXT_ITEM_FILE_DISABLED = {
49
56
  metadata: {
50
57
  enabled: false,
51
58
  title: 'motorbike.cs',
59
+ secondaryText: '/src/VehicleFoo/motorbike.cs',
60
+ subTypeLabel: 'Project file',
61
+ icon: 'document',
52
62
  project: 'example/vehicles',
53
63
  relativePath: '/src/VehicleFoo/motorbike.cs'
54
64
  }
@@ -59,6 +69,9 @@ const mockFiles = [MOCK_CONTEXT_ITEM_FILE, {
59
69
  metadata: {
60
70
  enabled: true,
61
71
  title: 'potato.ts',
72
+ secondaryText: '/src/plants/potato.ts',
73
+ subTypeLabel: 'Project file',
74
+ icon: 'document',
62
75
  project: 'example/garden',
63
76
  relativePath: '/src/plants/potato.ts'
64
77
  }
@@ -69,7 +82,9 @@ const MOCK_CONTEXT_ITEM_ISSUE = {
69
82
  metadata: {
70
83
  enabled: true,
71
84
  title: 'Implement watering schedule',
72
- project: 'example/garden',
85
+ secondaryText: 'example/garden#1234',
86
+ subTypeLabel: 'Issue',
87
+ icon: 'issues',
73
88
  iid: 1234
74
89
  }
75
90
  };
@@ -80,7 +95,9 @@ const MOCK_CONTEXT_ITEM_ISSUE_DISABLED = {
80
95
  enabled: false,
81
96
  disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
82
97
  title: `Fix vehicle colours and make them look real nice and colourful won't that be wonderful wow this issue title is really long I sure hope it's gonna wrap OK`,
83
- project: 'example/vehicle',
98
+ secondaryText: 'example/vehicle#91011',
99
+ subTypeLabel: 'Issue',
100
+ icon: 'issues',
84
101
  iid: 91011
85
102
  }
86
103
  };
@@ -90,7 +107,9 @@ const mockIssues = [MOCK_CONTEXT_ITEM_ISSUE, {
90
107
  metadata: {
91
108
  enabled: true,
92
109
  title: 'Refactor plant growth rates',
93
- project: 'example/garden',
110
+ secondaryText: 'example/garden#5678',
111
+ subTypeLabel: 'Issue',
112
+ icon: 'issues',
94
113
  iid: 5678
95
114
  }
96
115
  }, MOCK_CONTEXT_ITEM_ISSUE_DISABLED];
@@ -100,7 +119,9 @@ const MOCK_CONTEXT_ITEM_MERGE_REQUEST = {
100
119
  metadata: {
101
120
  enabled: true,
102
121
  title: 'Improve database performance',
103
- project: 'example/garden',
122
+ secondaryText: 'example/garden!1122',
123
+ subTypeLabel: 'Merge request',
124
+ icon: 'merge-request',
104
125
  iid: 1122
105
126
  }
106
127
  };
@@ -111,7 +132,9 @@ const MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED = {
111
132
  enabled: false,
112
133
  disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
113
134
  title: 'Fix broken layout at small viewports',
114
- project: 'example/vehicle',
135
+ secondaryText: 'example/vehicle!5566',
136
+ subTypeLabel: 'Merge request',
137
+ icon: 'merge-request',
115
138
  iid: 5566
116
139
  }
117
140
  };
@@ -122,7 +145,9 @@ const mockMergeRequests = [MOCK_CONTEXT_ITEM_MERGE_REQUEST, {
122
145
  enabled: false,
123
146
  disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
124
147
  title: 'Add vehicle registration details',
125
- project: 'example/vehicle',
148
+ secondaryText: 'example/vehicle!3344',
149
+ subTypeLabel: 'Merge request',
150
+ icon: 'merge-request',
126
151
  iid: 3344
127
152
  }
128
153
  }, MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED];
@@ -132,6 +157,10 @@ const MOCK_CONTEXT_ITEM_GIT_DIFF = {
132
157
  metadata: {
133
158
  enabled: true,
134
159
  title: 'Current working changes',
160
+ secondaryText: 'main',
161
+ subType: 'local_git',
162
+ subTypeLabel: 'Local Git repository diff',
163
+ icon: 'comparison',
135
164
  commitId: 'main',
136
165
  repositoryName: 'example/garden',
137
166
  gitType: 'diff'
@@ -143,6 +172,10 @@ const MOCK_CONTEXT_ITEM_GIT_COMMIT = {
143
172
  metadata: {
144
173
  enabled: true,
145
174
  title: 'fix: some bug fix commit',
175
+ secondaryText: '20f8caf94cb8f5e5f9dbd1a9ac32702321de201b',
176
+ subType: 'local_git',
177
+ subTypeLabel: 'Local Git repository commit',
178
+ icon: 'commit',
146
179
  commitId: '20f8caf94cb8f5e5f9dbd1a9ac32702321de201b',
147
180
  repositoryName: 'example/garden',
148
181
  gitType: 'commit'
@@ -154,6 +187,9 @@ const mockGitItems = [MOCK_CONTEXT_ITEM_GIT_DIFF, {
154
187
  metadata: {
155
188
  enabled: true,
156
189
  title: 'Diff from default branch',
190
+ secondaryText: 'main',
191
+ subTypeLabel: 'Local Git repository diff',
192
+ icon: 'comparison',
157
193
  commitId: 'main',
158
194
  repositoryName: 'example/garden',
159
195
  gitType: 'diff'
@@ -164,6 +200,9 @@ const mockGitItems = [MOCK_CONTEXT_ITEM_GIT_DIFF, {
164
200
  metadata: {
165
201
  enabled: true,
166
202
  title: 'feat: add cool new feature',
203
+ secondaryText: '32b9b56b6de75b32909986755fbc470f20fb6fc0',
204
+ subTypeLabel: 'Local Git repository commit',
205
+ icon: 'commit',
167
206
  commitId: '32b9b56b6de75b32909986755fbc470f20fb6fc0',
168
207
  repositoryName: 'example/garden',
169
208
  gitType: 'commit'
@@ -174,13 +213,83 @@ const mockGitItems = [MOCK_CONTEXT_ITEM_GIT_DIFF, {
174
213
  metadata: {
175
214
  enabled: true,
176
215
  title: 'fix: stop foo from bar when baz because customers ding',
216
+ secondaryText: '775d7efdce25c1af48c55abcadbefd1f181b92ce',
217
+ subTypeLabel: 'Local Git repository commit',
218
+ icon: 'commit',
177
219
  commitId: '775d7efdce25c1af48c55abcadbefd1f181b92ce',
178
220
  repositoryName: 'example/garden',
179
221
  gitType: 'commit'
180
222
  }
181
223
  }];
224
+ const MOCK_CONTEXT_ITEM_DEPENDENCY = {
225
+ id: '823e4567-e89b-12d3-a456-426614174007',
226
+ category: CONTEXT_ITEM_CATEGORY_DEPENDENCY,
227
+ content: JSON.stringify([{
228
+ javascript: ['@types/node@16.11.7', '@vue/compiler-sfc@3.2.37', 'typescript@4.5.5', 'vue@3.2.37']
229
+ }]),
230
+ metadata: {
231
+ enabled: true,
232
+ title: 'example/garden',
233
+ secondaryText: 'package.json',
234
+ icon: 'package',
235
+ subType: 'dependency',
236
+ subTypeLabel: 'Project dependencies',
237
+ project: 'example/garden'
238
+ }
239
+ };
240
+ const MOCK_CONTEXT_ITEM_DEPENDENCY_DISABLED = {
241
+ id: '923e4567-e89b-12d3-a456-426614174008',
242
+ category: CONTEXT_ITEM_CATEGORY_DEPENDENCY,
243
+ content: JSON.stringify([{
244
+ javascript: ['@types/node@16.11.7', '@vue/compiler-sfc@3.2.37', 'typescript@4.5.5', 'vue@3.2.37'],
245
+ csharp: ['newtonsoft.json@13.0.1', 'microsoft.net.test.sdk@16.11.0']
246
+ }]),
247
+ metadata: {
248
+ enabled: false,
249
+ disabledReasons: ['Dependencies are not available for this project', 'Access restricted'],
250
+ title: 'example/vehicle',
251
+ secondaryText: 'package.json, vehicle.csproj',
252
+ icon: 'package',
253
+ subType: 'dependency',
254
+ subTypeLabel: 'Project dependencies',
255
+ project: 'example/vehicle'
256
+ }
257
+ };
258
+ const mockDependencies = [MOCK_CONTEXT_ITEM_DEPENDENCY, MOCK_CONTEXT_ITEM_DEPENDENCY_DISABLED, {
259
+ id: 'b23e4567-e89b-12d3-a456-426614174010',
260
+ category: CONTEXT_ITEM_CATEGORY_DEPENDENCY,
261
+ content: JSON.stringify([{
262
+ python: ['django@3.2.9', 'djangorestframework@3.12.4', 'psycopg2@2.9.2', 'celery@5.2.1'],
263
+ csharp: ['newtonsoft.json@13.0.1', 'microsoft.net.test.sdk@16.11.0']
264
+ }]),
265
+ metadata: {
266
+ enabled: true,
267
+ title: 'example/backend',
268
+ secondaryText: 'requirements.txt, some.backend.csproj',
269
+ icon: 'package',
270
+ subType: 'dependency',
271
+ subTypeLabel: 'Project dependencies',
272
+ project: 'example/backend'
273
+ }
274
+ }, {
275
+ id: 'c23e4567-e89b-12d3-a456-426614174011',
276
+ category: CONTEXT_ITEM_CATEGORY_DEPENDENCY,
277
+ content: JSON.stringify([{
278
+ javascript: ['jquery@3.5.1', 'backbone@1.4.0', 'underscore@1.13.1', 'moment@2.29.1']
279
+ }]),
280
+ metadata: {
281
+ enabled: false,
282
+ disabledReasons: ['Project is archived'],
283
+ title: 'example/legacy',
284
+ secondaryText: 'bower.json',
285
+ icon: 'package',
286
+ subType: 'dependency',
287
+ subTypeLabel: 'Project dependencies',
288
+ project: 'example/legacy'
289
+ }
290
+ }];
182
291
  const getMockContextItems = () => {
183
- const allItems = [...mockFiles, ...mockGitItems, ...mockIssues, ...mockMergeRequests];
292
+ const allItems = [...mockFiles, ...mockGitItems, ...mockIssues, ...mockMergeRequests, ...mockDependencies];
184
293
 
185
294
  // put disabled items in the back
186
295
  const disabledItems = allItems.filter(item => !item.metadata.enabled);
@@ -188,4 +297,4 @@ const getMockContextItems = () => {
188
297
  return [...enabledItems, ...disabledItems];
189
298
  };
190
299
 
191
- export { MOCK_CATEGORIES, MOCK_CONTEXT_FILE_CONTENT, MOCK_CONTEXT_FILE_DIFF_CONTENT, MOCK_CONTEXT_ITEM_FILE, MOCK_CONTEXT_ITEM_FILE_DISABLED, MOCK_CONTEXT_ITEM_GIT_COMMIT, MOCK_CONTEXT_ITEM_GIT_DIFF, MOCK_CONTEXT_ITEM_ISSUE, MOCK_CONTEXT_ITEM_ISSUE_DISABLED, MOCK_CONTEXT_ITEM_MERGE_REQUEST, MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED, getMockCategory, getMockContextItems };
300
+ export { MOCK_CATEGORIES, MOCK_CONTEXT_FILE_CONTENT, MOCK_CONTEXT_FILE_DIFF_CONTENT, MOCK_CONTEXT_ITEM_DEPENDENCY, MOCK_CONTEXT_ITEM_DEPENDENCY_DISABLED, MOCK_CONTEXT_ITEM_FILE, MOCK_CONTEXT_ITEM_FILE_DISABLED, MOCK_CONTEXT_ITEM_GIT_COMMIT, MOCK_CONTEXT_ITEM_GIT_DIFF, MOCK_CONTEXT_ITEM_ISSUE, MOCK_CONTEXT_ITEM_ISSUE_DISABLED, MOCK_CONTEXT_ITEM_MERGE_REQUEST, MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED, getMockCategory, getMockContextItems };
@@ -1,4 +1,4 @@
1
- import { translate } from '@gitlab/ui/dist/utils/i18n';
1
+ import { translate } from '../../../../utils/i18n';
2
2
  import { CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_LOCAL_GIT_COMMIT, CONTEXT_ITEM_LOCAL_GIT_DIFF, CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_ISSUE, CONTEXT_ITEM_CATEGORY_MERGE_REQUEST } from './constants';
3
3
 
4
4
  function categoryValidator(category) {
@@ -24,6 +24,9 @@ function formatMergeRequestId(iid) {
24
24
  if (!iid) return '';
25
25
  return `!${iid}`;
26
26
  }
27
+ function getContextItemSource(contextItem) {
28
+ return contextItem.metadata.repositoryName || contextItem.metadata.project || null;
29
+ }
27
30
  function getGitItemIcon(contextItem) {
28
31
  const iconMap = {
29
32
  [CONTEXT_ITEM_LOCAL_GIT_COMMIT]: 'commit',
@@ -42,6 +45,9 @@ function getContextItemIcon(contextItem) {
42
45
  let category = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
43
46
  icon: null
44
47
  };
48
+ if (contextItem.metadata.icon) {
49
+ return contextItem.metadata.icon;
50
+ }
45
51
  if (contextItem.category === CONTEXT_ITEM_CATEGORY_LOCAL_GIT) {
46
52
  const gitIcon = getGitItemIcon(contextItem);
47
53
  if (gitIcon) return gitIcon;
@@ -58,6 +64,9 @@ function getContextItemIcon(contextItem) {
58
64
  return iconMap[contextItem.category] || null;
59
65
  }
60
66
  function getContextItemTypeLabel(contextItem) {
67
+ if (contextItem.metadata.subTypeLabel) {
68
+ return contextItem.metadata.subTypeLabel;
69
+ }
61
70
  if (contextItem.category === CONTEXT_ITEM_CATEGORY_LOCAL_GIT) {
62
71
  switch (contextItem.metadata.gitType) {
63
72
  case CONTEXT_ITEM_LOCAL_GIT_DIFF:
@@ -91,6 +100,23 @@ function formatGitItemSecondaryText(contextItem) {
91
100
  const separator = commitId ? ' - ' : '';
92
101
  return `${repositoryName}${separator}${commitId || ''}`;
93
102
  }
103
+ function getContextItemSecondaryText(contextItem) {
104
+ if (contextItem.metadata.secondaryText) {
105
+ return contextItem.metadata.secondaryText;
106
+ }
107
+ switch (contextItem.category) {
108
+ case CONTEXT_ITEM_CATEGORY_FILE:
109
+ return contextItem.metadata.relativePath;
110
+ case CONTEXT_ITEM_CATEGORY_ISSUE:
111
+ return formatIssueId(contextItem.metadata.iid);
112
+ case CONTEXT_ITEM_CATEGORY_MERGE_REQUEST:
113
+ return formatMergeRequestId(contextItem.metadata.iid);
114
+ case CONTEXT_ITEM_CATEGORY_LOCAL_GIT:
115
+ return formatGitItemSecondaryText(contextItem);
116
+ default:
117
+ return '';
118
+ }
119
+ }
94
120
 
95
121
  /**
96
122
  * Calculates a new index within a range. If the new index would fall out of bounds, wraps to the start/end of the range.
@@ -103,4 +129,4 @@ function wrapIndex(currentIndex, step, totalLength) {
103
129
  return (currentIndex + step + totalLength) % totalLength;
104
130
  }
105
131
 
106
- export { categoriesValidator, categoryValidator, contextItemValidator, contextItemsValidator, formatGitItemSecondaryText, formatIssueId, formatMergeRequestId, getContextItemIcon, getContextItemTypeLabel, wrapIndex };
132
+ export { categoriesValidator, categoryValidator, contextItemValidator, contextItemsValidator, formatGitItemSecondaryText, formatIssueId, formatMergeRequestId, getContextItemIcon, getContextItemSecondaryText, getContextItemSource, getContextItemTypeLabel, wrapIndex };
@@ -1,4 +1,4 @@
1
- import { translate } from '@gitlab/ui/dist/utils/i18n';
1
+ import { translate } from '../../../../utils/i18n';
2
2
  import GlDuoChatMessage from '../duo_chat_message/duo_chat_message';
3
3
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
4
4
 
@@ -1,5 +1,5 @@
1
- import { translate } from '@gitlab/ui/dist/utils/i18n';
2
1
  import { GlSprintf } from '@gitlab/ui';
2
+ import { translate } from '../../../../utils/i18n';
3
3
  import { LOADING_TRANSITION_DURATION } from '../../constants';
4
4
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
5
5