@gitlab/ui 94.10.0 → 95.1.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 (56) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/components/base/progress_bar/progress_bar.js +1 -1
  3. package/dist/components/experimental/duo/chat/components/duo_chat_context/constants.js +4 -1
  4. package/dist/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_details_modal/duo_chat_context_item_details_modal.js +120 -0
  5. package/dist/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu.js +11 -1
  6. package/dist/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.js +29 -2
  7. package/dist/components/experimental/duo/chat/components/duo_chat_context/mock_context_data.js +14 -1
  8. package/dist/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.js +4 -1
  9. package/dist/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.js +7 -1
  10. package/dist/components/experimental/duo/chat/duo_chat.js +9 -1
  11. package/dist/index.css +2 -2
  12. package/dist/index.css.map +1 -1
  13. package/dist/tokens/build/js/tokens.dark.js +6 -1
  14. package/dist/tokens/build/js/tokens.js +6 -1
  15. package/dist/tokens/css/tokens.css +5 -0
  16. package/dist/tokens/css/tokens.dark.css +5 -0
  17. package/dist/tokens/js/tokens.dark.js +5 -0
  18. package/dist/tokens/js/tokens.js +5 -0
  19. package/dist/tokens/json/tokens.dark.json +110 -0
  20. package/dist/tokens/json/tokens.json +110 -0
  21. package/dist/tokens/scss/_tokens.dark.scss +5 -0
  22. package/dist/tokens/scss/_tokens.scss +5 -0
  23. package/dist/tokens/scss/_tokens_custom_properties.scss +5 -0
  24. package/dist/utils/constants.js +3 -14
  25. package/dist/vendor/bootstrap-vue/src/components/modal/modal.js +4 -34
  26. package/package.json +1 -1
  27. package/src/components/base/progress_bar/progress_bar.scss +19 -0
  28. package/src/components/base/progress_bar/progress_bar.vue +1 -1
  29. package/src/components/experimental/duo/chat/components/duo_chat_context/constants.js +4 -0
  30. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_details_modal/duo_chat_context_item_details_modal.vue +114 -0
  31. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu.vue +10 -0
  32. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.vue +42 -0
  33. package/src/components/experimental/duo/chat/components/duo_chat_context/mock_context_data.js +15 -0
  34. package/src/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.vue +4 -0
  35. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.vue +8 -0
  36. package/src/components/experimental/duo/chat/duo_chat.vue +9 -0
  37. package/src/scss/components.scss +1 -0
  38. package/src/tokens/build/css/tokens.css +5 -0
  39. package/src/tokens/build/css/tokens.dark.css +5 -0
  40. package/src/tokens/build/js/tokens.dark.js +5 -0
  41. package/src/tokens/build/js/tokens.js +5 -0
  42. package/src/tokens/build/json/tokens.dark.json +110 -0
  43. package/src/tokens/build/json/tokens.json +110 -0
  44. package/src/tokens/build/scss/_tokens.dark.scss +5 -0
  45. package/src/tokens/build/scss/_tokens.scss +5 -0
  46. package/src/tokens/build/scss/_tokens_custom_properties.scss +5 -0
  47. package/src/tokens/contextual/progress-bar.tokens.json +38 -0
  48. package/src/utils/constants.js +1 -11
  49. package/src/vendor/bootstrap-vue/src/components/modal/MODIFICATIONS.md +27 -0
  50. package/src/vendor/bootstrap-vue/src/components/modal/README.md +2 -118
  51. package/src/vendor/bootstrap-vue/src/components/modal/index.d.ts +0 -10
  52. package/src/vendor/bootstrap-vue/src/components/modal/modal.js +4 -43
  53. package/src/vendor/bootstrap-vue/src/components/modal/package.json +0 -36
  54. package/src/vendor/bootstrap-vue/src/components/progress/MODIFICATIONS.md +23 -0
  55. package/src/vendor/bootstrap-vue/src/components/progress/README.md +4 -17
  56. package/translations.js +1 -0
@@ -503,6 +503,7 @@ $gl-spinner-track-color-light: $gl-color-neutral-800; // Used for the static tra
503
503
  $gl-spinner-track-color-default: $gl-color-neutral-800; // Used for the static track (background) of a loading spinner.
504
504
  $gl-skeleton-loader-shimmer-color: $gl-color-neutral-700; // Used for the animated shimmer effect in a skeleton loader.
505
505
  $gl-skeleton-loader-background-color: $gl-color-neutral-800; // Used for the skeleton loader background color.
506
+ $gl-progress-bar-track-color: $gl-color-neutral-700; // Used for the track color for all progress-bar variants.
506
507
  $gl-link-mention-background-color-current: $gl-color-orange-800; // Used for the mention link background when referencing the current user.
507
508
  $gl-link-mention-background-color-default: $gl-color-blue-800; // Used for the mention link default background.
508
509
  $gl-link-mention-text-color-current: $gl-color-orange-100; // Used for the mention link text color when referencing the current user.
@@ -779,6 +780,10 @@ $gl-control-text-color-error: $gl-text-color-danger; // Used for the helper text
779
780
  $gl-token-foreground-color: $gl-text-color-default; // Used for the token foreground color.
780
781
  $gl-table-sorting-icon-color: $gl-text-color-heading; // Used for the color of the sorting icons in the column headers.
781
782
  $gl-table-row-background-color-hover: $gl-background-color-subtle; // Used for the background of a table row in hover state.
783
+ $gl-progress-bar-indicator-color-danger: $gl-status-danger-icon-color; // Used for the indicator color for the danger progress-bar variant.
784
+ $gl-progress-bar-indicator-color-warning: $gl-status-warning-icon-color; // Used for the indicator color for the warning progress-bar variant.
785
+ $gl-progress-bar-indicator-color-success: $gl-status-success-icon-color; // Used for the indicator color for the success progress-bar variant.
786
+ $gl-progress-bar-indicator-color-default: $gl-status-info-icon-color; // Used for the indicator color for the primary progress-bar variant.
782
787
  $gl-dropdown-option-background-color-selected-focus: $gl-dropdown-option-background-color-selected-hover; // Used for the background of a selected dropdown option in the focus state.
783
788
  $gl-dropdown-option-background-color-unselected-focus: $gl-action-neutral-background-color-focus; // Used for the background of an unselected dropdown option in the focus state.
784
789
  $gl-dropdown-option-indicator-color-selected-focus: $gl-color-neutral-0; // Used for the dropdown selected option indicator in the focus state.
@@ -503,6 +503,7 @@ $gl-spinner-track-color-light: $gl-color-neutral-800; // Used for the static tra
503
503
  $gl-spinner-track-color-default: $gl-color-neutral-100; // Used for the static track (background) of a loading spinner.
504
504
  $gl-skeleton-loader-shimmer-color: $gl-color-neutral-50; // Used for the animated shimmer effect in a skeleton loader.
505
505
  $gl-skeleton-loader-background-color: $gl-color-neutral-100; // Used for the skeleton loader background color.
506
+ $gl-progress-bar-track-color: $gl-color-neutral-200; // Used for the track color for all progress-bar variants.
506
507
  $gl-link-mention-background-color-current: $gl-color-orange-100; // Used for the mention link background when referencing the current user.
507
508
  $gl-link-mention-background-color-default: $gl-color-blue-100; // Used for the mention link default background.
508
509
  $gl-link-mention-text-color-current: $gl-color-orange-800; // Used for the mention link text color when referencing the current user.
@@ -779,6 +780,10 @@ $gl-control-text-color-error: $gl-text-color-danger; // Used for the helper text
779
780
  $gl-token-foreground-color: $gl-text-color-default; // Used for the token foreground color.
780
781
  $gl-table-sorting-icon-color: $gl-text-color-heading; // Used for the color of the sorting icons in the column headers.
781
782
  $gl-table-row-background-color-hover: $gl-background-color-subtle; // Used for the background of a table row in hover state.
783
+ $gl-progress-bar-indicator-color-danger: $gl-status-danger-icon-color; // Used for the indicator color for the danger progress-bar variant.
784
+ $gl-progress-bar-indicator-color-warning: $gl-status-warning-icon-color; // Used for the indicator color for the warning progress-bar variant.
785
+ $gl-progress-bar-indicator-color-success: $gl-status-success-icon-color; // Used for the indicator color for the success progress-bar variant.
786
+ $gl-progress-bar-indicator-color-default: $gl-status-info-icon-color; // Used for the indicator color for the primary progress-bar variant.
782
787
  $gl-dropdown-option-background-color-selected-focus: $gl-dropdown-option-background-color-selected-hover; // Used for the background of a selected dropdown option in the focus state.
783
788
  $gl-dropdown-option-background-color-unselected-focus: $gl-action-neutral-background-color-focus; // Used for the background of an unselected dropdown option in the focus state.
784
789
  $gl-dropdown-option-indicator-color-selected-focus: $gl-control-background-color-selected-focus; // Used for the dropdown selected option indicator in the focus state.
@@ -668,6 +668,11 @@ $gl-link-mention-text-color-default: var(--gl-link-mention-text-color-default);
668
668
  $gl-link-mention-text-color-current: var(--gl-link-mention-text-color-current);
669
669
  $gl-link-mention-background-color-default: var(--gl-link-mention-background-color-default);
670
670
  $gl-link-mention-background-color-current: var(--gl-link-mention-background-color-current);
671
+ $gl-progress-bar-indicator-color-default: var(--gl-progress-bar-indicator-color-default);
672
+ $gl-progress-bar-indicator-color-success: var(--gl-progress-bar-indicator-color-success);
673
+ $gl-progress-bar-indicator-color-warning: var(--gl-progress-bar-indicator-color-warning);
674
+ $gl-progress-bar-indicator-color-danger: var(--gl-progress-bar-indicator-color-danger);
675
+ $gl-progress-bar-track-color: var(--gl-progress-bar-track-color);
671
676
  $gl-skeleton-loader-background-color: var(--gl-skeleton-loader-background-color);
672
677
  $gl-skeleton-loader-shimmer-color: var(--gl-skeleton-loader-shimmer-color);
673
678
  $gl-spinner-track-color-default: var(--gl-spinner-track-color-default);
@@ -1,11 +1,5 @@
1
1
  import { POSITION } from '../components/utilities/truncate/constants';
2
2
 
3
- function appendDefaultOption(options) {
4
- return {
5
- ...options,
6
- default: ''
7
- };
8
- }
9
3
  const COMMA = ',';
10
4
  const CONTRAST_LEVELS = [{
11
5
  grade: 'F',
@@ -26,15 +20,11 @@ const CONTRAST_LEVELS = [{
26
20
  }];
27
21
  const HEX_REGEX = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
28
22
  const LEFT_MOUSE_BUTTON = 0;
29
- const variantOptions = {
23
+ const progressBarVariantOptions = {
30
24
  primary: 'primary',
31
- secondary: 'secondary',
32
25
  success: 'success',
33
26
  warning: 'warning',
34
- danger: 'danger',
35
- info: 'info',
36
- light: 'light',
37
- dark: 'dark'
27
+ danger: 'danger'
38
28
  };
39
29
  const badgeSizeOptions = {
40
30
  sm: 'sm',
@@ -251,7 +241,6 @@ const tabsButtonDefaults = {
251
241
  };
252
242
  const tokenVariants = ['default', 'search-type', 'search-value'];
253
243
  const resizeDebounceTime = 200;
254
- const variantOptionsWithNoDefault = appendDefaultOption(variantOptions);
255
244
 
256
245
  // Datetime constants
257
246
  const defaultDateFormat = 'YYYY-MM-DD';
@@ -305,4 +294,4 @@ const loadingIconVariants = {
305
294
  dots: 'dots'
306
295
  };
307
296
 
308
- export { COMMA, CONTRAST_LEVELS, HEX_REGEX, LEFT_MOUSE_BUTTON, alertVariantIconMap, alertVariantOptions, alignOptions, avatarShapeOptions, avatarSizeOptions, avatarsInlineSizeOptions, badgeForButtonOptions, badgeIconSizeOptions, badgeSizeOptions, badgeVariantOptions, bannerVariants, buttonCategoryOptions, buttonSizeOptions, buttonVariantOptions, colorThemes, columnOptions, datepickerWidthOptionsMap, defaultDateFormat, drawerVariants, dropdownAllowedAutoPlacements, dropdownPlacements, dropdownVariantOptions, focusableTags, formInputWidths, formStateOptions, iconSizeOptions, iconVariantOptions, keyboard, labelColorOptions, loadingIconSizes, loadingIconVariants, maxZIndex, modalButtonDefaults, modalSizeOptions, popoverPlacements, resizeDebounceTime, tabsButtonDefaults, targetOptions, toggleLabelPosition, tokenVariants, tooltipActionEvents, tooltipDelay, tooltipPlacements, triggerVariantOptions, truncateOptions, variantCssColorMap, variantOptions, variantOptionsWithNoDefault, viewModeOptions };
297
+ export { COMMA, CONTRAST_LEVELS, HEX_REGEX, LEFT_MOUSE_BUTTON, alertVariantIconMap, alertVariantOptions, alignOptions, avatarShapeOptions, avatarSizeOptions, avatarsInlineSizeOptions, badgeForButtonOptions, badgeIconSizeOptions, badgeSizeOptions, badgeVariantOptions, bannerVariants, buttonCategoryOptions, buttonSizeOptions, buttonVariantOptions, colorThemes, columnOptions, datepickerWidthOptionsMap, defaultDateFormat, drawerVariants, dropdownAllowedAutoPlacements, dropdownPlacements, dropdownVariantOptions, focusableTags, formInputWidths, formStateOptions, iconSizeOptions, iconVariantOptions, keyboard, labelColorOptions, loadingIconSizes, loadingIconVariants, maxZIndex, modalButtonDefaults, modalSizeOptions, popoverPlacements, progressBarVariantOptions, resizeDebounceTime, tabsButtonDefaults, targetOptions, toggleLabelPosition, tokenVariants, tooltipActionEvents, tooltipDelay, tooltipPlacements, triggerVariantOptions, truncateOptions, variantCssColorMap, viewModeOptions };
@@ -71,9 +71,7 @@ const props = makePropsConfigurable(sortKeys({
71
71
  autoFocusButton: makeProp(PROP_TYPE_STRING, null, /* istanbul ignore next */value => {
72
72
  return isUndefinedOrNull(value) || arrayIncludes(BUTTONS, value);
73
73
  }),
74
- bodyBgVariant: makeProp(PROP_TYPE_STRING),
75
74
  bodyClass: makeProp(PROP_TYPE_ARRAY_OBJECT_STRING),
76
- bodyTextVariant: makeProp(PROP_TYPE_STRING),
77
75
  busy: makeProp(PROP_TYPE_BOOLEAN, false),
78
76
  buttonSize: makeProp(PROP_TYPE_STRING),
79
77
  cancelDisabled: makeProp(PROP_TYPE_BOOLEAN, false),
@@ -83,19 +81,12 @@ const props = makePropsConfigurable(sortKeys({
83
81
  centered: makeProp(PROP_TYPE_BOOLEAN, false),
84
82
  contentClass: makeProp(PROP_TYPE_ARRAY_OBJECT_STRING),
85
83
  dialogClass: makeProp(PROP_TYPE_ARRAY_OBJECT_STRING),
86
- footerBgVariant: makeProp(PROP_TYPE_STRING),
87
- footerBorderVariant: makeProp(PROP_TYPE_STRING),
88
84
  footerClass: makeProp(PROP_TYPE_ARRAY_OBJECT_STRING),
89
85
  footerTag: makeProp(PROP_TYPE_STRING, 'footer'),
90
- footerTextVariant: makeProp(PROP_TYPE_STRING),
91
- headerBgVariant: makeProp(PROP_TYPE_STRING),
92
- headerBorderVariant: makeProp(PROP_TYPE_STRING),
93
86
  headerClass: makeProp(PROP_TYPE_ARRAY_OBJECT_STRING),
94
87
  headerCloseContent: makeProp(PROP_TYPE_STRING, '×'),
95
88
  headerCloseLabel: makeProp(PROP_TYPE_STRING, 'Close'),
96
- headerCloseVariant: makeProp(PROP_TYPE_STRING),
97
89
  headerTag: makeProp(PROP_TYPE_STRING, 'header'),
98
- headerTextVariant: makeProp(PROP_TYPE_STRING),
99
90
  // TODO: Rename to `noBackdrop` and deprecate `hideBackdrop`
100
91
  hideBackdrop: makeProp(PROP_TYPE_BOOLEAN, false),
101
92
  // TODO: Rename to `noFooter` and deprecate `hideFooter`
@@ -209,31 +200,11 @@ const BModal = /*#__PURE__*/extend({
209
200
  'modal-dialog-scrollable': this.scrollable
210
201
  }, this.dialogClass];
211
202
  },
212
- headerClasses() {
213
- return [{
214
- [`bg-${this.headerBgVariant}`]: this.headerBgVariant,
215
- [`text-${this.headerTextVariant}`]: this.headerTextVariant,
216
- [`border-${this.headerBorderVariant}`]: this.headerBorderVariant
217
- }, this.headerClass];
218
- },
219
203
  titleClasses() {
220
204
  return [{
221
205
  'sr-only': this.titleSrOnly
222
206
  }, this.titleClass];
223
207
  },
224
- bodyClasses() {
225
- return [{
226
- [`bg-${this.bodyBgVariant}`]: this.bodyBgVariant,
227
- [`text-${this.bodyTextVariant}`]: this.bodyTextVariant
228
- }, this.bodyClass];
229
- },
230
- footerClasses() {
231
- return [{
232
- [`bg-${this.footerBgVariant}`]: this.footerBgVariant,
233
- [`text-${this.footerTextVariant}`]: this.footerTextVariant,
234
- [`border-${this.footerBorderVariant}`]: this.footerBorderVariant
235
- }, this.footerClass];
236
- },
237
208
  modalOuterStyle() {
238
209
  // Styles needed for proper stacking of modals
239
210
  return {
@@ -706,8 +677,7 @@ const BModal = /*#__PURE__*/extend({
706
677
  props: {
707
678
  content: this.headerCloseContent,
708
679
  disabled: this.isTransitioning,
709
- ariaLabel: this.headerCloseLabel,
710
- textVariant: this.headerCloseVariant || this.headerTextVariant
680
+ ariaLabel: this.headerCloseLabel
711
681
  },
712
682
  on: {
713
683
  click: this.onClose
@@ -731,7 +701,7 @@ const BModal = /*#__PURE__*/extend({
731
701
  }
732
702
  $header = h(this.headerTag, {
733
703
  staticClass: 'modal-header',
734
- class: this.headerClasses,
704
+ class: this.headerClass,
735
705
  attrs: {
736
706
  id: this.modalHeaderId
737
707
  },
@@ -742,7 +712,7 @@ const BModal = /*#__PURE__*/extend({
742
712
  // Modal body
743
713
  const $body = h('div', {
744
714
  staticClass: 'modal-body',
745
- class: this.bodyClasses,
715
+ class: this.bodyClass,
746
716
  attrs: {
747
717
  id: this.modalBodyId
748
718
  },
@@ -792,7 +762,7 @@ const BModal = /*#__PURE__*/extend({
792
762
  }
793
763
  $footer = h(this.footerTag, {
794
764
  staticClass: 'modal-footer',
795
- class: this.footerClasses,
765
+ class: this.footerClass,
796
766
  attrs: {
797
767
  id: this.modalFooterId
798
768
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "94.10.0",
3
+ "version": "95.1.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,19 @@
1
+ .gl-progress-bar {
2
+ background-color: var(--gl-progress-bar-track-color);
3
+
4
+ .bg-primary {
5
+ background-color: var(--gl-progress-bar-indicator-color-default) !important;
6
+ }
7
+
8
+ .bg-success {
9
+ background-color: var(--gl-progress-bar-indicator-color-success) !important;
10
+ }
11
+
12
+ .bg-warning {
13
+ background-color: var(--gl-progress-bar-indicator-color-warning) !important;
14
+ }
15
+
16
+ .bg-danger {
17
+ background-color: var(--gl-progress-bar-indicator-color-danger) !important;
18
+ }
19
+ }
@@ -11,5 +11,5 @@ export default {
11
11
  </script>
12
12
 
13
13
  <template>
14
- <b-progress v-bind="$attrs" />
14
+ <b-progress v-bind="$attrs" class="gl-progress-bar" />
15
15
  </template>
@@ -5,3 +5,7 @@ export const CONTEXT_ITEM_CATEGORY_LOCAL_GIT = 'local_git';
5
5
 
6
6
  export const CONTEXT_ITEM_LOCAL_GIT_COMMIT = 'commit';
7
7
  export const CONTEXT_ITEM_LOCAL_GIT_DIFF = 'diff';
8
+
9
+ export const LANGUAGE_IDENTIFIER_PREFIX = 'language-';
10
+ export const LANGUAGE_IDENTIFIER_DIFF = 'language-diff';
11
+ export const LANGUAGE_IDENTIFIER_PLAINTEXT = 'language-plaintext';
@@ -0,0 +1,114 @@
1
+ <script>
2
+ import { nextTick } from 'vue';
3
+ import { contextItemValidator } from '../utils';
4
+ import GlModal from '../../../../../../base/modal/modal.vue';
5
+ import { SafeHtmlDirective as SafeHtml } from '../../../../../../../directives/safe_html/safe_html';
6
+ import GlSkeletonLoader from '../../../../../../base/skeleton_loader/skeleton_loader.vue';
7
+ import { translate } from '../../../../../../../utils/i18n';
8
+ import {
9
+ CONTEXT_ITEM_CATEGORY_LOCAL_GIT,
10
+ LANGUAGE_IDENTIFIER_DIFF,
11
+ LANGUAGE_IDENTIFIER_PLAINTEXT,
12
+ LANGUAGE_IDENTIFIER_PREFIX,
13
+ } from '../constants';
14
+
15
+ export default {
16
+ name: 'GlDuoChatContextItemDetailsModal',
17
+ components: {
18
+ GlSkeletonLoader,
19
+ GlModal,
20
+ },
21
+ directives: {
22
+ SafeHtml,
23
+ },
24
+ inject: {
25
+ renderGFM: {
26
+ from: 'renderGFM',
27
+ default: () => (element) => {
28
+ element.classList.add('gl-markdown', 'gl-compact-markdown');
29
+ },
30
+ },
31
+ },
32
+ props: {
33
+ /**
34
+ * Context items to preview. If it has no `content`, the loading state will be displayed.
35
+ */
36
+ contextItem: {
37
+ type: Object,
38
+ required: true,
39
+ validator: contextItemValidator,
40
+ },
41
+ },
42
+ computed: {
43
+ isLoadingContent() {
44
+ return this.contextItem.content === undefined;
45
+ },
46
+ languageIdentifierClass() {
47
+ if (this.contextItem.category === CONTEXT_ITEM_CATEGORY_LOCAL_GIT) {
48
+ return LANGUAGE_IDENTIFIER_DIFF;
49
+ }
50
+
51
+ const fileExtension = this.contextItem.metadata?.relativePath?.split('.').at(-1);
52
+ if (fileExtension && fileExtension !== this.contextItem.metadata?.relativePath) {
53
+ return `${LANGUAGE_IDENTIFIER_PREFIX}${fileExtension}`;
54
+ }
55
+
56
+ return LANGUAGE_IDENTIFIER_PLAINTEXT;
57
+ },
58
+ title() {
59
+ return (
60
+ this.contextItem.metadata?.title ||
61
+ this.contextItem.metadata?.relativePath ||
62
+ translate('GlDuoChatContextItemDetailsModal.title', 'Preview')
63
+ );
64
+ },
65
+ },
66
+ watch: {
67
+ contextItem: {
68
+ async handler(newVal, oldVal) {
69
+ const shouldFormat = newVal?.content !== oldVal?.content && newVal?.content;
70
+ if (shouldFormat) {
71
+ await nextTick();
72
+ await this.hydrateContentWithGFM();
73
+ }
74
+ },
75
+ immediate: true,
76
+ },
77
+ },
78
+ methods: {
79
+ async hydrateContentWithGFM() {
80
+ await nextTick();
81
+
82
+ if (this.$refs.content) {
83
+ this.renderGFM(this.$refs.content);
84
+ }
85
+ },
86
+ onModalVisibilityChange(isVisible) {
87
+ if (!isVisible) {
88
+ this.$emit('close');
89
+ }
90
+ },
91
+ },
92
+ };
93
+ </script>
94
+
95
+ <template>
96
+ <gl-modal
97
+ modal-id="context-item-details-modal"
98
+ :title="title"
99
+ :visible="true"
100
+ :scrollable="true"
101
+ hide-footer
102
+ size="lg"
103
+ @change="onModalVisibilityChange"
104
+ >
105
+ <gl-skeleton-loader v-if="isLoadingContent" />
106
+ <div v-else ref="content" data-testid="context-item-content">
107
+ <pre
108
+ v-safe-html="contextItem.content"
109
+ class="code js-syntax-highlight gl-p-3"
110
+ :class="languageIdentifierClass"
111
+ ></pre>
112
+ </div>
113
+ </gl-modal>
114
+ </template>
@@ -218,6 +218,14 @@ export default {
218
218
 
219
219
  this.activeIndex = newIndex;
220
220
  },
221
+ onGetContextItemContent(contextItem) {
222
+ /**
223
+ * Emit get-context-item-content event that tells clients to load the full file content for a selected context item.
224
+ * The fully hydrated context item should be updated in the context item selections.
225
+ * @param {*} event An event containing the context item to hydrate
226
+ */
227
+ this.$emit('get-context-item-content', { contextItem });
228
+ },
221
229
  },
222
230
  i18n: {
223
231
  selectedContextItemsTitle: translate(
@@ -233,11 +241,13 @@ export default {
233
241
  <gl-duo-chat-context-item-selections
234
242
  v-if="selections.length"
235
243
  :selections="selections"
244
+ :categories="categories"
236
245
  :removable="true"
237
246
  :title="$options.i18n.selectedContextItemsTitle"
238
247
  :default-collapsed="false"
239
248
  class="gl-mb-3"
240
249
  @remove="removeItem"
250
+ @get-content="onGetContextItemContent"
241
251
  />
242
252
  <gl-card
243
253
  v-if="open"
@@ -4,12 +4,15 @@ import GlIcon from '../../../../../../base/icon/icon.vue';
4
4
  import GlToken from '../../../../../../base/token/token.vue';
5
5
  import GlTruncate from '../../../../../../utilities/truncate/truncate.vue';
6
6
  import GlDuoChatContextItemPopover from '../duo_chat_context_item_popover/duo_chat_context_item_popover.vue';
7
+ import { CONTEXT_ITEM_CATEGORY_FILE, CONTEXT_ITEM_CATEGORY_LOCAL_GIT } from '../constants';
8
+ import GlDuoChatContextItemDetailsModal from '../duo_chat_context_item_details_modal/duo_chat_context_item_details_modal.vue';
7
9
  import { contextItemsValidator, getContextItemIcon } from '../utils';
8
10
 
9
11
  export default {
10
12
  name: 'GlDuoChatContextItemSelections',
11
13
  components: {
12
14
  GlTruncate,
15
+ GlDuoChatContextItemDetailsModal,
13
16
  GlIcon,
14
17
  GlDuoChatContextItemPopover,
15
18
  GlToken,
@@ -55,6 +58,7 @@ export default {
55
58
  return {
56
59
  isCollapsed: this.defaultCollapsed,
57
60
  selectionsId: uniqueId(),
61
+ previewContextItemId: null,
58
62
  };
59
63
  },
60
64
  computed: {
@@ -73,6 +77,9 @@ export default {
73
77
  }
74
78
  return '';
75
79
  },
80
+ contextItemPreview() {
81
+ return this.selections.find((item) => item.id === this.previewContextItemId);
82
+ },
76
83
  },
77
84
  methods: {
78
85
  getContextItemIcon,
@@ -86,6 +93,30 @@ export default {
86
93
  */
87
94
  this.$emit('remove', contextItem);
88
95
  },
96
+ onOpenItem(event, contextItem) {
97
+ const isKeypressOnCloseButton =
98
+ event.type === 'keydown' && event.target !== event.currentTarget;
99
+ if (isKeypressOnCloseButton) {
100
+ // don't respond to events triggered by the gl-token children (e.g. the close button)
101
+ return;
102
+ }
103
+
104
+ if (!this.canOpen(contextItem)) {
105
+ return;
106
+ }
107
+ if (!contextItem.content) {
108
+ this.$emit('get-content', contextItem);
109
+ }
110
+ this.previewContextItemId = contextItem.id;
111
+ },
112
+ canOpen(contextItem) {
113
+ return [CONTEXT_ITEM_CATEGORY_LOCAL_GIT, CONTEXT_ITEM_CATEGORY_FILE].includes(
114
+ contextItem.category
115
+ );
116
+ },
117
+ onClosePreview() {
118
+ this.previewContextItemId = null;
119
+ },
89
120
  },
90
121
  };
91
122
  </script>
@@ -114,6 +145,11 @@ export default {
114
145
  variant="default"
115
146
  class="gl-mb-2 gl-mr-2 gl-max-w-full"
116
147
  :class="tokenVariantClasses"
148
+ :tabindex="canOpen(item) ? 0 : -1"
149
+ :role="canOpen(item) ? 'button' : undefined"
150
+ @click="onOpenItem($event, item)"
151
+ @keydown.enter="onOpenItem($event, item)"
152
+ @keydown.space.prevent="onOpenItem($event, item)"
117
153
  @close="onRemoveItem(item)"
118
154
  >
119
155
  <div
@@ -132,8 +168,14 @@ export default {
132
168
  :context-item="item"
133
169
  :target="`context-item-${item.id}-${selectionsId}-token`"
134
170
  placement="bottom"
171
+ @show-git-diff="onOpenItem(item)"
135
172
  />
136
173
  </gl-token>
137
174
  </div>
175
+ <gl-duo-chat-context-item-details-modal
176
+ v-if="contextItemPreview"
177
+ :context-item="contextItemPreview"
178
+ @close="onClosePreview"
179
+ />
138
180
  </div>
139
181
  </template>
@@ -16,6 +16,21 @@ export function getMockCategory(categoryValue) {
16
16
  return MOCK_CATEGORIES.find((cat) => cat.value === categoryValue);
17
17
  }
18
18
 
19
+ export const MOCK_CONTEXT_FILE_CONTENT = `export function waterPlants() {
20
+ console.log('sprinkle');
21
+ }`;
22
+
23
+ export const MOCK_CONTEXT_FILE_DIFF_CONTENT = `diff --git a/src/plants/strawberry.ts b/src/plants/strawberry.ts
24
+ index 1234567..8901234 100644
25
+ --- a/src/plants/strawberry.ts
26
+ +++ b/src/plants/strawberry.ts
27
+ @@ -1,4 +1,4 @@
28
+ export const strawberry = {
29
+ name: 'Strawberry',
30
+ - waterNeeds: 'moderate',
31
+ + waterNeeds: 'high',
32
+ };`;
33
+
19
34
  export const MOCK_CONTEXT_ITEM_FILE = {
20
35
  id: '123e4567-e89b-12d3-a456-426614174000',
21
36
  category: CONTEXT_ITEM_CATEGORY_FILE,
@@ -57,6 +57,9 @@ export default {
57
57
  onInsertCodeSnippet(e) {
58
58
  this.$emit('insert-code-snippet', e);
59
59
  },
60
+ onGetContextItemContent(e) {
61
+ this.$emit('get-context-item-content', e);
62
+ },
60
63
  },
61
64
  i18n,
62
65
  };
@@ -81,6 +84,7 @@ export default {
81
84
  :is-cancelled="canceledRequestIds.includes(msg.requestId)"
82
85
  @track-feedback="onTrackFeedback"
83
86
  @insert-code-snippet="onInsertCodeSnippet"
87
+ @get-context-item-content="onGetContextItemContent"
84
88
  />
85
89
  </div>
86
90
  </template>
@@ -234,6 +234,12 @@ export default {
234
234
  onInsertCodeSnippet(e) {
235
235
  this.$emit('insert-code-snippet', e);
236
236
  },
237
+ onGetContextItemContent(contextItem) {
238
+ this.$emit('get-context-item-content', {
239
+ messageId: this.message.id,
240
+ contextItem,
241
+ });
242
+ },
237
243
  },
238
244
  };
239
245
  </script>
@@ -264,6 +270,7 @@ export default {
264
270
  :title="selectedContextItemsTitle"
265
271
  :default-collapsed="selectedContextItemsDefaultCollapsed"
266
272
  variant="assistant"
273
+ @get-content="onGetContextItemContent"
267
274
  />
268
275
  <div
269
276
  v-if="error"
@@ -309,6 +316,7 @@ export default {
309
316
  :title="selectedContextItemsTitle"
310
317
  :default-collapsed="selectedContextItemsDefaultCollapsed"
311
318
  variant="user"
319
+ @get-content="onGetContextItemContent"
312
320
  />
313
321
  </div>
314
322
  </div>
@@ -518,6 +518,14 @@ export default {
518
518
  */
519
519
  this.$emit('insert-code-snippet', e);
520
520
  },
521
+ onGetContextItemContent(event) {
522
+ /**
523
+ * Emit get-context-item-content event that tells clients to load the full file content for a selected context item.
524
+ * The fully hydrated context item should be updated in the chat message context item.
525
+ * @param {*} event An event containing the message ID and context item to hydrate
526
+ */
527
+ this.$emit('get-context-item-content', event);
528
+ },
521
529
  closeContextItemsMenuOpen() {
522
530
  this.contextItemsMenuIsOpen = false;
523
531
  this.setPromptAndFocus();
@@ -603,6 +611,7 @@ export default {
603
611
  :show-delimiter="index > 0"
604
612
  @track-feedback="onTrackFeedback"
605
613
  @insert-code-snippet="onInsertCodeSnippet"
614
+ @get-context-item-content="onGetContextItemContent"
606
615
  />
607
616
  <template v-if="!hasMessages && !isLoading">
608
617
  <gl-empty-state
@@ -58,6 +58,7 @@
58
58
  @import '../components/base/pagination/pagination';
59
59
  @import '../components/base/path/path';
60
60
  @import '../components/base/popover/popover';
61
+ @import '../components/base/progress_bar/progress_bar';
61
62
  @import '../components/base/search_box_by_type/search_box_by_type';
62
63
  @import '../components/base/search_box_by_click/search_box_by_click';
63
64
  @import '../components/base/segmented_control/segmented_control';
@@ -505,6 +505,7 @@
505
505
  --gl-spinner-track-color-default: var(--gl-color-neutral-100); /* Used for the static track (background) of a loading spinner. */
506
506
  --gl-skeleton-loader-shimmer-color: var(--gl-color-neutral-50); /* Used for the animated shimmer effect in a skeleton loader. */
507
507
  --gl-skeleton-loader-background-color: var(--gl-color-neutral-100); /* Used for the skeleton loader background color. */
508
+ --gl-progress-bar-track-color: var(--gl-color-neutral-200); /* Used for the track color for all progress-bar variants. */
508
509
  --gl-link-mention-background-color-current: var(--gl-color-orange-100); /* Used for the mention link background when referencing the current user. */
509
510
  --gl-link-mention-background-color-default: var(--gl-color-blue-100); /* Used for the mention link default background. */
510
511
  --gl-link-mention-text-color-current: var(--gl-color-orange-800); /* Used for the mention link text color when referencing the current user. */
@@ -781,6 +782,10 @@
781
782
  --gl-token-foreground-color: var(--gl-text-color-default); /* Used for the token foreground color. */
782
783
  --gl-table-sorting-icon-color: var(--gl-text-color-heading); /* Used for the color of the sorting icons in the column headers. */
783
784
  --gl-table-row-background-color-hover: var(--gl-background-color-subtle); /* Used for the background of a table row in hover state. */
785
+ --gl-progress-bar-indicator-color-danger: var(--gl-status-danger-icon-color); /* Used for the indicator color for the danger progress-bar variant. */
786
+ --gl-progress-bar-indicator-color-warning: var(--gl-status-warning-icon-color); /* Used for the indicator color for the warning progress-bar variant. */
787
+ --gl-progress-bar-indicator-color-success: var(--gl-status-success-icon-color); /* Used for the indicator color for the success progress-bar variant. */
788
+ --gl-progress-bar-indicator-color-default: var(--gl-status-info-icon-color); /* Used for the indicator color for the primary progress-bar variant. */
784
789
  --gl-dropdown-option-background-color-selected-focus: var(--gl-dropdown-option-background-color-selected-hover); /* Used for the background of a selected dropdown option in the focus state. */
785
790
  --gl-dropdown-option-background-color-unselected-focus: var(--gl-action-neutral-background-color-focus); /* Used for the background of an unselected dropdown option in the focus state. */
786
791
  --gl-dropdown-option-indicator-color-selected-focus: var(--gl-control-background-color-selected-focus); /* Used for the dropdown selected option indicator in the focus state. */
@@ -505,6 +505,7 @@
505
505
  --gl-spinner-track-color-default: var(--gl-color-neutral-800); /* Used for the static track (background) of a loading spinner. */
506
506
  --gl-skeleton-loader-shimmer-color: var(--gl-color-neutral-700); /* Used for the animated shimmer effect in a skeleton loader. */
507
507
  --gl-skeleton-loader-background-color: var(--gl-color-neutral-800); /* Used for the skeleton loader background color. */
508
+ --gl-progress-bar-track-color: var(--gl-color-neutral-700); /* Used for the track color for all progress-bar variants. */
508
509
  --gl-link-mention-background-color-current: var(--gl-color-orange-800); /* Used for the mention link background when referencing the current user. */
509
510
  --gl-link-mention-background-color-default: var(--gl-color-blue-800); /* Used for the mention link default background. */
510
511
  --gl-link-mention-text-color-current: var(--gl-color-orange-100); /* Used for the mention link text color when referencing the current user. */
@@ -781,6 +782,10 @@
781
782
  --gl-token-foreground-color: var(--gl-text-color-default); /* Used for the token foreground color. */
782
783
  --gl-table-sorting-icon-color: var(--gl-text-color-heading); /* Used for the color of the sorting icons in the column headers. */
783
784
  --gl-table-row-background-color-hover: var(--gl-background-color-subtle); /* Used for the background of a table row in hover state. */
785
+ --gl-progress-bar-indicator-color-danger: var(--gl-status-danger-icon-color); /* Used for the indicator color for the danger progress-bar variant. */
786
+ --gl-progress-bar-indicator-color-warning: var(--gl-status-warning-icon-color); /* Used for the indicator color for the warning progress-bar variant. */
787
+ --gl-progress-bar-indicator-color-success: var(--gl-status-success-icon-color); /* Used for the indicator color for the success progress-bar variant. */
788
+ --gl-progress-bar-indicator-color-default: var(--gl-status-info-icon-color); /* Used for the indicator color for the primary progress-bar variant. */
784
789
  --gl-dropdown-option-background-color-selected-focus: var(--gl-dropdown-option-background-color-selected-hover); /* Used for the background of a selected dropdown option in the focus state. */
785
790
  --gl-dropdown-option-background-color-unselected-focus: var(--gl-action-neutral-background-color-focus); /* Used for the background of an unselected dropdown option in the focus state. */
786
791
  --gl-dropdown-option-indicator-color-selected-focus: var(--gl-color-neutral-0); /* Used for the dropdown selected option indicator in the focus state. */
@@ -668,6 +668,11 @@ export const GL_LINK_MENTION_TEXT_COLOR_DEFAULT = '#9dc7f1'; // Used for the men
668
668
  export const GL_LINK_MENTION_TEXT_COLOR_CURRENT = '#f5d9a8'; // Used for the mention link text color when referencing the current user.
669
669
  export const GL_LINK_MENTION_BACKGROUND_COLOR_DEFAULT = '#064787'; // Used for the mention link default background.
670
670
  export const GL_LINK_MENTION_BACKGROUND_COLOR_CURRENT = '#703800'; // Used for the mention link background when referencing the current user.
671
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_DEFAULT = '#428fdc'; // Used for the indicator color for the primary progress-bar variant.
672
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_SUCCESS = '#2da160'; // Used for the indicator color for the success progress-bar variant.
673
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_WARNING = '#c17d10'; // Used for the indicator color for the warning progress-bar variant.
674
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_DANGER = '#ec5941'; // Used for the indicator color for the danger progress-bar variant.
675
+ export const GL_PROGRESS_BAR_TRACK_COLOR = '#4c4b51'; // Used for the track color for all progress-bar variants.
671
676
  export const GL_SKELETON_LOADER_BACKGROUND_COLOR = '#3a383f'; // Used for the skeleton loader background color.
672
677
  export const GL_SKELETON_LOADER_SHIMMER_COLOR = '#4c4b51'; // Used for the animated shimmer effect in a skeleton loader.
673
678
  export const GL_SPINNER_TRACK_COLOR_DEFAULT = '#3a383f'; // Used for the static track (background) of a loading spinner.
@@ -668,6 +668,11 @@ export const GL_LINK_MENTION_TEXT_COLOR_DEFAULT = '#0b5cad'; // Used for the men
668
668
  export const GL_LINK_MENTION_TEXT_COLOR_CURRENT = '#703800'; // Used for the mention link text color when referencing the current user.
669
669
  export const GL_LINK_MENTION_BACKGROUND_COLOR_DEFAULT = '#cbe2f9'; // Used for the mention link default background.
670
670
  export const GL_LINK_MENTION_BACKGROUND_COLOR_CURRENT = '#f5d9a8'; // Used for the mention link background when referencing the current user.
671
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_DEFAULT = '#1f75cb'; // Used for the indicator color for the primary progress-bar variant.
672
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_SUCCESS = '#108548'; // Used for the indicator color for the success progress-bar variant.
673
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_WARNING = '#ab6100'; // Used for the indicator color for the warning progress-bar variant.
674
+ export const GL_PROGRESS_BAR_INDICATOR_COLOR_DANGER = '#dd2b0e'; // Used for the indicator color for the danger progress-bar variant.
675
+ export const GL_PROGRESS_BAR_TRACK_COLOR = '#bfbfc3'; // Used for the track color for all progress-bar variants.
671
676
  export const GL_SKELETON_LOADER_BACKGROUND_COLOR = '#dcdcde'; // Used for the skeleton loader background color.
672
677
  export const GL_SKELETON_LOADER_SHIMMER_COLOR = '#ececef'; // Used for the animated shimmer effect in a skeleton loader.
673
678
  export const GL_SPINNER_TRACK_COLOR_DEFAULT = '#dcdcde'; // Used for the static track (background) of a loading spinner.