@gitlab/ui 79.1.0 → 79.2.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 (26) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/components/base/form/form_textarea/form_textarea.js +6 -3
  3. package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +9 -6
  4. package/dist/components/base/new_dropdowns/constants.js +2 -2
  5. package/dist/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.js +17 -8
  6. package/dist/index.css +1 -1
  7. package/dist/index.css.map +1 -1
  8. package/dist/tokens/css/tokens.css +1 -1
  9. package/dist/tokens/css/tokens.dark.css +1 -1
  10. package/dist/tokens/js/tokens.dark.js +1 -1
  11. package/dist/tokens/js/tokens.js +1 -1
  12. package/dist/tokens/scss/_tokens.dark.scss +1 -1
  13. package/dist/tokens/scss/_tokens.scss +1 -1
  14. package/dist/utils/utils.js +19 -1
  15. package/package.json +1 -1
  16. package/src/components/base/form/form_textarea/form_textarea.spec.js +37 -0
  17. package/src/components/base/form/form_textarea/form_textarea.vue +6 -3
  18. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.spec.js +31 -26
  19. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +16 -6
  20. package/src/components/base/new_dropdowns/constants.js +1 -1
  21. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.scss +15 -1
  22. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.spec.js +51 -45
  23. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.stories.js +8 -0
  24. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.vue +52 -28
  25. package/src/utils/utils.js +18 -0
  26. package/src/utils/utils.spec.js +52 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [79.2.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v79.1.1...v79.2.0) (2024-04-24)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **dropdowns:** ignore vertical boundaries ([3fec816](https://gitlab.com/gitlab-org/gitlab-ui/commit/3fec81641a0f625810a89a05129737767792df13))
7
+
8
+
9
+ ### Features
10
+
11
+ * **GlDuoChatMessage:** output errors ([f4c804a](https://gitlab.com/gitlab-org/gitlab-ui/commit/f4c804abc033a7b23823366d2b1fa1e065abf056))
12
+
13
+ ## [79.1.1](https://gitlab.com/gitlab-org/gitlab-ui/compare/v79.1.0...v79.1.1) (2024-04-24)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **GlFormTextarea:** fix bug when `value` prop is `null` ([dffde58](https://gitlab.com/gitlab-org/gitlab-ui/commit/dffde58ea067b8b0a59cd4e4e264f5a1ee477541))
19
+
1
20
  # [79.1.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v79.0.0...v79.1.0) (2024-04-24)
2
21
 
3
22
 
@@ -103,7 +103,7 @@ var script = {
103
103
  if (!this.showCharacterCount) {
104
104
  return;
105
105
  }
106
- this.remainingCharacterCount = this.characterCount - newValue.length;
106
+ this.remainingCharacterCount = this.characterCount - this.valueLength(newValue);
107
107
  this.debouncedUpdateRemainingCharacterCountSrOnly(newValue);
108
108
  }
109
109
  },
@@ -113,16 +113,19 @@ var script = {
113
113
  this.debouncedUpdateRemainingCharacterCountSrOnly = debounce(this.updateRemainingCharacterCountSrOnly, 1000);
114
114
  },
115
115
  methods: {
116
+ valueLength(value) {
117
+ return (value === null || value === void 0 ? void 0 : value.length) || 0;
118
+ },
116
119
  handleKeyPress(e) {
117
120
  if (e.keyCode === 13 && (e.metaKey || e.ctrlKey)) {
118
121
  this.$emit('submit');
119
122
  }
120
123
  },
121
124
  updateRemainingCharacterCountSrOnly(newValue) {
122
- this.remainingCharacterCountSrOnly = this.characterCount - newValue.length;
125
+ this.remainingCharacterCountSrOnly = this.characterCount - this.valueLength(newValue);
123
126
  },
124
127
  initialRemainingCharacterCount() {
125
- return this.characterCount - this.value.length;
128
+ return this.characterCount - this.valueLength(this.value);
126
129
  }
127
130
  }
128
131
  };
@@ -1,8 +1,8 @@
1
1
  import uniqueId from 'lodash/uniqueId';
2
2
  import { offset, autoPlacement, shift, size, autoUpdate, computePosition } from '@floating-ui/dom';
3
3
  import { buttonCategoryOptions, dropdownVariantOptions, buttonSizeOptions, dropdownPlacements, dropdownAllowedAutoPlacements } from '../../../../utils/constants';
4
- import { POSITION_ABSOLUTE, POSITION_FIXED, GL_DROPDOWN_BOUNDARY_SELECTOR, GL_DROPDOWN_CONTENTS_CLASS, GL_DROPDOWN_BEFORE_CLOSE, GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, ENTER, SPACE, ARROW_DOWN, GL_DROPDOWN_FOCUS_CONTENT } from '../constants';
5
- import { logWarning, isElementFocusable, isElementTabbable } from '../../../../utils/utils';
4
+ import { POSITION_ABSOLUTE, POSITION_FIXED, GL_DROPDOWN_HORIZONTAL_BOUNDARY_SELECTOR, GL_DROPDOWN_CONTENTS_CLASS, GL_DROPDOWN_BEFORE_CLOSE, GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, ENTER, SPACE, ARROW_DOWN, GL_DROPDOWN_FOCUS_CONTENT } from '../constants';
5
+ import { logWarning, getHorizontalBoundingClientRect, isElementFocusable, isElementTabbable } from '../../../../utils/utils';
6
6
  import GlButton from '../../button/button';
7
7
  import GlIcon from '../../icon/icon';
8
8
  import { OutsideDirective } from '../../../../directives/outside/outside';
@@ -250,10 +250,13 @@ var script = {
250
250
  return {
251
251
  placement,
252
252
  strategy: this.positioningStrategy,
253
- middleware: [offset(this.offset), autoPlacement({
254
- alignment,
255
- boundary: this.$el.closest(GL_DROPDOWN_BOUNDARY_SELECTOR) || 'clippingAncestors',
256
- allowedPlacements: dropdownAllowedAutoPlacements[this.placement]
253
+ middleware: [offset(this.offset), autoPlacement(() => {
254
+ const autoHorizontalBoundary = getHorizontalBoundingClientRect(this.$el.closest(GL_DROPDOWN_HORIZONTAL_BOUNDARY_SELECTOR));
255
+ return {
256
+ alignment,
257
+ boundary: autoHorizontalBoundary || 'clippingAncestors',
258
+ allowedPlacements: dropdownAllowedAutoPlacements[this.placement]
259
+ };
257
260
  }), shift(), size({
258
261
  apply: _ref => {
259
262
  var _this$nonScrollableCo;
@@ -1,5 +1,5 @@
1
1
  // base dropdown events
2
- const GL_DROPDOWN_BOUNDARY_SELECTOR = 'main';
2
+ const GL_DROPDOWN_HORIZONTAL_BOUNDARY_SELECTOR = 'main';
3
3
  const GL_DROPDOWN_SHOWN = 'shown';
4
4
  const GL_DROPDOWN_HIDDEN = 'hidden';
5
5
  const GL_DROPDOWN_BEFORE_CLOSE = 'beforeClose';
@@ -19,4 +19,4 @@ const POSITION_ABSOLUTE = 'absolute';
19
19
  const POSITION_FIXED = 'fixed';
20
20
  const GL_DROPDOWN_CONTENTS_CLASS = 'gl-new-dropdown-contents';
21
21
 
22
- export { ARROW_DOWN, ARROW_UP, END, ENTER, GL_DROPDOWN_BEFORE_CLOSE, GL_DROPDOWN_BOUNDARY_SELECTOR, GL_DROPDOWN_CONTENTS_CLASS, GL_DROPDOWN_FOCUS_CONTENT, GL_DROPDOWN_HIDDEN, GL_DROPDOWN_SHOWN, HOME, POSITION_ABSOLUTE, POSITION_FIXED, SPACE };
22
+ export { ARROW_DOWN, ARROW_UP, END, ENTER, GL_DROPDOWN_BEFORE_CLOSE, GL_DROPDOWN_CONTENTS_CLASS, GL_DROPDOWN_FOCUS_CONTENT, GL_DROPDOWN_HIDDEN, GL_DROPDOWN_HORIZONTAL_BOUNDARY_SELECTOR, GL_DROPDOWN_SHOWN, HOME, POSITION_ABSOLUTE, POSITION_FIXED, SPACE };
@@ -1,3 +1,5 @@
1
+ import GlIcon from '../../../../../base/icon/icon';
2
+ import { GlTooltipDirective } from '../../../../../../directives/tooltip';
1
3
  import GlDuoUserFeedback from '../../../user_feedback/user_feedback';
2
4
  import GlFormGroup from '../../../../../base/form/form_group/form_group';
3
5
  import GlFormTextarea from '../../../../../base/form/form_textarea/form_textarea';
@@ -16,11 +18,13 @@ const i18n = {
16
18
  DID_WHAT: 'What were you doing?',
17
19
  INTERACTION: 'The situation in which you interacted with GitLab Duo Chat.',
18
20
  IMPROVE_WHAT: 'How could the response be improved?',
19
- BETTER_RESPONSE: 'How the response might better meet your needs.'
21
+ BETTER_RESPONSE: 'How the response might better meet your needs.',
22
+ MESSAGE_ERROR: 'Error sending the message'
20
23
  }
21
24
  };
22
25
  var script = {
23
26
  name: 'GlDuoChatMessage',
27
+ i18n,
24
28
  safeHtmlConfigExtension: {
25
29
  ADD_TAGS: ['copy-code']
26
30
  },
@@ -28,10 +32,12 @@ var script = {
28
32
  DocumentationSources,
29
33
  GlDuoUserFeedback,
30
34
  GlFormGroup,
31
- GlFormTextarea
35
+ GlFormTextarea,
36
+ GlIcon
32
37
  },
33
38
  directives: {
34
- SafeHtml: SafeHtmlDirective
39
+ SafeHtml: SafeHtmlDirective,
40
+ GlTooltip: GlTooltipDirective
35
41
  },
36
42
  provide() {
37
43
  return {
@@ -92,7 +98,6 @@ var script = {
92
98
  return (_this$message$extras2 = this.message.extras) === null || _this$message$extras2 === void 0 ? void 0 : _this$message$extras2.hasFeedback;
93
99
  },
94
100
  defaultContent() {
95
- if (this.message.errors.length > 0) return this.renderMarkdown(this.message.errors.join('; '));
96
101
  if (this.message.contentHtml) {
97
102
  return this.message.contentHtml;
98
103
  }
@@ -103,6 +108,10 @@ var script = {
103
108
  return this.renderMarkdown(concatUntilEmpty(this.messageChunks));
104
109
  }
105
110
  return this.defaultContent || this.renderMarkdown(concatUntilEmpty(this.message.chunks));
111
+ },
112
+ error() {
113
+ var _this$message, _this$message$errors;
114
+ return Boolean((_this$message = this.message) === null || _this$message === void 0 ? void 0 : (_this$message$errors = _this$message.errors) === null || _this$message$errors === void 0 ? void 0 : _this$message$errors.length) && this.message.errors.join('; ');
106
115
  }
107
116
  },
108
117
  beforeCreate() {
@@ -142,7 +151,7 @@ var script = {
142
151
  }
143
152
  },
144
153
  hydrateContentWithGFM() {
145
- if (!this.isChunk) {
154
+ if (!this.isChunk && this.$refs.content) {
146
155
  this.$nextTick(this.renderGFM(this.$refs.content));
147
156
  }
148
157
  },
@@ -160,8 +169,7 @@ var script = {
160
169
  this.stopWatchingMessage();
161
170
  }
162
171
  }
163
- },
164
- i18n
172
+ }
165
173
  };
166
174
 
167
175
  /* script */
@@ -172,7 +180,8 @@ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=
172
180
  'gl-ml-auto gl-bg-blue-100 gl-text-blue-900 gl-rounded-bottom-right-none': _vm.isUserMessage,
173
181
  'gl-rounded-bottom-left-none gl-text-gray-900 gl-bg-white gl-border-1 gl-border-solid gl-border-gray-50':
174
182
  _vm.isAssistantMessage,
175
- }},[_c('div',{directives:[{name:"safe-html",rawName:"v-safe-html:[$options.safeHtmlConfigExtension]",value:(_vm.messageContent),expression:"messageContent",arg:_vm.$options.safeHtmlConfigExtension}],ref:"content"}),_vm._v(" "),(_vm.isAssistantMessage)?[(_vm.sources)?_c('documentation-sources',{attrs:{"sources":_vm.sources}}):_vm._e(),_vm._v(" "),_c('div',{staticClass:"gl-display-flex gl-align-items-flex-end gl-mt-4 duo-chat-message-feedback"},[_c('gl-duo-user-feedback',{attrs:{"feedback-received":_vm.hasFeedback,"modal-title":_vm.$options.i18n.MODAL.TITLE,"modal-alert":_vm.$options.i18n.MODAL.ALERT_TEXT},on:{"feedback":_vm.logEvent},scopedSlots:_vm._u([{key:"feedback-extra-fields",fn:function(){return [_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.DID_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.INTERACTION},model:{value:(_vm.didWhat),callback:function ($$v) {_vm.didWhat=$$v;},expression:"didWhat"}})],1),_vm._v(" "),_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.IMPROVE_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.BETTER_RESPONSE},model:{value:(_vm.improveWhat),callback:function ($$v) {_vm.improveWhat=$$v;},expression:"improveWhat"}})],1)]},proxy:true}],null,false,419229417)})],1)]:_vm._e()],2)};
183
+ 'gl-bg-red-50 gl-border-none!': _vm.error,
184
+ }},[(_vm.error)?_c('gl-icon',{staticClass:"gl-text-red-600 gl-border gl-border-red-500 gl-rounded-full gl-mr-3 gl-flex-shrink-0 error-icon",attrs:{"aria-label":_vm.$options.i18n.MESSAGE_ERROR,"name":"status_warning_borderless","size":16,"data-testid":"error"}}):_vm._e(),_vm._v(" "),_c('div',{ref:"content-wrapper",class:{ 'has-error': _vm.error }},[(_vm.error)?_c('div',{ref:"error-message",staticClass:"error-message"},[_vm._v(_vm._s(_vm.error))]):_c('div',[_c('div',{directives:[{name:"safe-html",rawName:"v-safe-html:[$options.safeHtmlConfigExtension]",value:(_vm.messageContent),expression:"messageContent",arg:_vm.$options.safeHtmlConfigExtension}],ref:"content"}),_vm._v(" "),(_vm.isAssistantMessage)?[(_vm.sources)?_c('documentation-sources',{attrs:{"sources":_vm.sources}}):_vm._e(),_vm._v(" "),_c('div',{staticClass:"gl-display-flex gl-align-items-flex-end gl-mt-4 duo-chat-message-feedback"},[_c('gl-duo-user-feedback',{attrs:{"feedback-received":_vm.hasFeedback,"modal-title":_vm.$options.i18n.MODAL.TITLE,"modal-alert":_vm.$options.i18n.MODAL.ALERT_TEXT},on:{"feedback":_vm.logEvent},scopedSlots:_vm._u([{key:"feedback-extra-fields",fn:function(){return [_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.DID_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.INTERACTION},model:{value:(_vm.didWhat),callback:function ($$v) {_vm.didWhat=$$v;},expression:"didWhat"}})],1),_vm._v(" "),_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.IMPROVE_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.BETTER_RESPONSE},model:{value:(_vm.improveWhat),callback:function ($$v) {_vm.improveWhat=$$v;},expression:"improveWhat"}})],1)]},proxy:true}],null,false,419229417)})],1)]:_vm._e()],2)])],1)};
176
185
  var __vue_staticRenderFns__ = [];
177
186
 
178
187
  /* style */