@gitlab/ui 37.1.0 → 37.4.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 (93) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/components/base/form/form_group/form_group.documentation.js +2 -6
  3. package/dist/components/base/form/form_input_group/form_input_group.documentation.js +2 -26
  4. package/dist/components/base/form/form_input_group/form_input_group.js +7 -0
  5. package/dist/components/base/loading_icon/loading_icon.js +1 -1
  6. package/dist/components/base/pagination/pagination.js +22 -2
  7. package/dist/components/base/path/path.js +9 -3
  8. package/dist/components/base/search_box_by_click/search_box_by_click.documentation.js +2 -80
  9. package/dist/components/base/search_box_by_click/search_box_by_click.js +60 -1
  10. package/dist/components/base/search_box_by_type/search_box_by_type.documentation.js +2 -20
  11. package/dist/components/base/search_box_by_type/search_box_by_type.js +19 -5
  12. package/dist/directives/hover_load/hover_load.documentation.js +1 -1
  13. package/dist/directives/resize_observer/resize_observer.documentation.js +2 -5
  14. package/dist/directives/safe_html/safe_html.documentation.js +1 -1
  15. package/dist/directives/safe_link/safe_link.documentation.js +2 -3
  16. package/dist/index.css +1 -1
  17. package/dist/index.css.map +1 -1
  18. package/dist/utility_classes.css +1 -1
  19. package/dist/utility_classes.css.map +1 -1
  20. package/documentation/documented_stories.js +8 -0
  21. package/package.json +1 -1
  22. package/src/components/base/button/button.scss +5 -9
  23. package/src/components/base/form/form_group/form_group.documentation.js +0 -3
  24. package/src/components/base/form/form_group/form_group.md +0 -2
  25. package/src/components/base/form/form_group/form_group.stories.js +106 -145
  26. package/src/components/base/form/form_input_group/form_input_group.documentation.js +0 -28
  27. package/src/components/base/form/form_input_group/form_input_group.md +0 -4
  28. package/src/components/base/form/form_input_group/form_input_group.stories.js +84 -62
  29. package/src/components/base/form/form_input_group/form_input_group.vue +9 -0
  30. package/src/components/base/loading_icon/loading_icon.vue +1 -1
  31. package/src/components/base/pagination/pagination.spec.js +9 -2
  32. package/src/components/base/pagination/pagination.vue +22 -6
  33. package/src/components/base/path/path.spec.js +12 -0
  34. package/src/components/base/path/path.vue +8 -3
  35. package/src/components/base/search_box_by_click/search_box_by_click.documentation.js +0 -90
  36. package/src/components/base/search_box_by_click/search_box_by_click.md +0 -2
  37. package/src/components/base/search_box_by_click/search_box_by_click.stories.js +91 -48
  38. package/src/components/base/search_box_by_click/search_box_by_click.vue +50 -1
  39. package/src/components/base/search_box_by_type/search_box_by_type.documentation.js +0 -18
  40. package/src/components/base/search_box_by_type/search_box_by_type.md +0 -2
  41. package/src/components/base/search_box_by_type/search_box_by_type.stories.js +49 -43
  42. package/src/components/base/search_box_by_type/search_box_by_type.vue +16 -6
  43. package/src/components/base/tabs/tabs/tabs.stories.js +2 -4
  44. package/src/directives/hover_load/hover_load.md +0 -2
  45. package/src/directives/hover_load/hover_load.stories.js +39 -34
  46. package/src/directives/resize_observer/resize_observer.documentation.js +0 -2
  47. package/src/directives/resize_observer/resize_observer.md +0 -6
  48. package/src/directives/resize_observer/resize_observer.stories.js +70 -51
  49. package/src/directives/safe_html/safe_html.md +0 -4
  50. package/src/directives/safe_html/safe_html.stories.js +53 -44
  51. package/src/directives/safe_link/safe_link.documentation.js +0 -1
  52. package/src/directives/safe_link/safe_link.md +0 -4
  53. package/src/directives/safe_link/safe_link.stories.js +31 -30
  54. package/src/scss/utilities.scss +8 -0
  55. package/src/scss/utility-mixins/background.scss +4 -0
  56. package/dist/components/base/form/form_group/examples/form_group/form_group.basic.example.js +0 -38
  57. package/dist/components/base/form/form_group/examples/form_group/form_group.disabled.example.js +0 -48
  58. package/dist/components/base/form/form_group/examples/form_group/form_group.textarea.example.js +0 -48
  59. package/dist/components/base/form/form_group/examples/form_group/form_group.validation.example.js +0 -66
  60. package/dist/components/base/form/form_group/examples/form_group/index.js +0 -27
  61. package/dist/components/base/form/form_input_group/examples/form_input_group.basic.example.js +0 -38
  62. package/dist/components/base/form/form_input_group/examples/form_input_group.predefined_options.example.js +0 -54
  63. package/dist/components/base/form/form_input_group/examples/form_input_group.predefined_reactive.example.js +0 -55
  64. package/dist/components/base/form/form_input_group/examples/form_input_group.reactive.example.js +0 -48
  65. package/dist/components/base/form/form_input_group/examples/index.js +0 -27
  66. package/dist/components/base/search_box_by_click/examples/index.js +0 -22
  67. package/dist/components/base/search_box_by_click/examples/search_box_by_click.default.example.js +0 -48
  68. package/dist/components/base/search_box_by_click/examples/search_box_by_click.history.example.js +0 -51
  69. package/dist/components/base/search_box_by_click/examples/search_box_by_click.v_model.example.js +0 -54
  70. package/dist/components/base/search_box_by_type/examples/index.js +0 -17
  71. package/dist/components/base/search_box_by_type/examples/search_box_by_type.default.example.js +0 -48
  72. package/dist/components/base/search_box_by_type/examples/search_box_by_type.loading.example.js +0 -65
  73. package/dist/directives/resize_observer/examples/index.js +0 -12
  74. package/dist/directives/resize_observer/examples/resize_observer.basic.example.js +0 -62
  75. package/src/components/base/form/form_group/examples/form_group/form_group.basic.example.vue +0 -11
  76. package/src/components/base/form/form_group/examples/form_group/form_group.disabled.example.vue +0 -21
  77. package/src/components/base/form/form_group/examples/form_group/form_group.textarea.example.vue +0 -15
  78. package/src/components/base/form/form_group/examples/form_group/form_group.validation.example.vue +0 -36
  79. package/src/components/base/form/form_group/examples/form_group/index.js +0 -32
  80. package/src/components/base/form/form_input_group/examples/form_input_group.basic.example.vue +0 -10
  81. package/src/components/base/form/form_input_group/examples/form_input_group.predefined_options.example.vue +0 -25
  82. package/src/components/base/form/form_input_group/examples/form_input_group.predefined_reactive.example.vue +0 -32
  83. package/src/components/base/form/form_input_group/examples/form_input_group.reactive.example.vue +0 -25
  84. package/src/components/base/form/form_input_group/examples/index.js +0 -32
  85. package/src/components/base/search_box_by_click/examples/index.js +0 -26
  86. package/src/components/base/search_box_by_click/examples/search_box_by_click.default.example.vue +0 -14
  87. package/src/components/base/search_box_by_click/examples/search_box_by_click.history.example.vue +0 -23
  88. package/src/components/base/search_box_by_click/examples/search_box_by_click.v_model.example.vue +0 -23
  89. package/src/components/base/search_box_by_type/examples/index.js +0 -20
  90. package/src/components/base/search_box_by_type/examples/search_box_by_type.default.example.vue +0 -14
  91. package/src/components/base/search_box_by_type/examples/search_box_by_type.loading.example.vue +0 -34
  92. package/src/directives/resize_observer/examples/index.js +0 -14
  93. package/src/directives/resize_observer/examples/resize_observer.basic.example.vue +0 -21
@@ -261,6 +261,22 @@ export default {
261
261
  nextPageIsDisabled() {
262
262
  return this.pageIsDisabled(this.value + 1);
263
263
  },
264
+ prevPageAriaLabel() {
265
+ return this.prevPageIsDisabled ? false : this.labelPrevPage || this.labelPage(this.value - 1);
266
+ },
267
+ nextPageAriaLabel() {
268
+ return this.nextPageIsDisabled ? false : this.labelNextPage || this.labelPage(this.value + 1);
269
+ },
270
+ prevPageHref() {
271
+ if (this.prevPageIsDisabled) return false;
272
+ if (this.isLinkBased) return this.linkGen(this.value - 1);
273
+ return '#';
274
+ },
275
+ nextPageHref() {
276
+ if (this.nextPageIsDisabled) return false;
277
+ if (this.isLinkBased) return this.linkGen(this.value + 1);
278
+ return '#';
279
+ },
264
280
  },
265
281
  created() {
266
282
  window.addEventListener('resize', debounce(this.setBreakpoint, resizeDebounceTime));
@@ -369,13 +385,13 @@ export default {
369
385
  disabled: prevPageIsDisabled,
370
386
  'flex-fill': isFillAlign,
371
387
  }"
388
+ :aria-hidden="prevPageIsDisabled"
372
389
  >
373
390
  <component
374
391
  :is="prevPageIsDisabled ? 'span' : 'a'"
375
392
  class="gl-link page-link prev-page-item gl-display-flex"
376
- :aria-disabled="prevPageIsDisabled"
377
- :aria-label="labelPrevPage || labelPage(value - 1)"
378
- :href="isLinkBased ? linkGen(value - 1) : '#'"
393
+ :aria-label="prevPageAriaLabel"
394
+ :href="prevPageHref"
379
395
  @click="handlePrevious($event, value - 1)"
380
396
  >
381
397
  <!--
@@ -432,13 +448,13 @@ export default {
432
448
  disabled: nextPageIsDisabled,
433
449
  'flex-fill': isFillAlign,
434
450
  }"
451
+ :aria-hidden="nextPageIsDisabled"
435
452
  >
436
453
  <component
437
454
  :is="nextPageIsDisabled ? 'span' : 'a'"
438
455
  class="gl-link page-link next-page-item gl-display-flex"
439
- :aria-disabled="nextPageIsDisabled"
440
- :aria-label="labelNextPage || labelPage(value + 1)"
441
- :href="isLinkBased ? linkGen(value + 1) : '#'"
456
+ :aria-label="nextPageAriaLabel"
457
+ :href="nextPageHref"
442
458
  @click="handleNext($event, value + 1)"
443
459
  >
444
460
  <!--
@@ -1,3 +1,4 @@
1
+ import { nextTick } from 'vue';
1
2
  import { shallowMount } from '@vue/test-utils';
2
3
  import { mockPathItems } from './data';
3
4
  import GlPath from './path.vue';
@@ -143,6 +144,17 @@ describe('Path', () => {
143
144
  it('selects the first item', () => {
144
145
  expect(pathItemAt(0).classList).toContain(SELECTED_CLASS_INDIGO);
145
146
  });
147
+
148
+ it('updates the selected item when props change', async () => {
149
+ const items = JSON.parse(JSON.stringify(mockPathItems));
150
+ items[3].selected = true;
151
+
152
+ wrapper.setProps({ items });
153
+ await nextTick();
154
+
155
+ expect(pathItemAt(0).classList).not.toContain(SELECTED_CLASS_INDIGO);
156
+ expect(pathItemAt(3).classList).toContain(SELECTED_CLASS_INDIGO);
157
+ });
146
158
  });
147
159
 
148
160
  describe('with a specifically selected item passed in', () => {
@@ -79,9 +79,14 @@ export default {
79
79
  return this.scrollLeft + BOUNDARY_WIDTH;
80
80
  },
81
81
  },
82
- mounted() {
83
- const selectedIndex = this.items.findIndex((item) => item.selected);
84
- this.selectedIndex = selectedIndex > 0 ? selectedIndex : 0;
82
+ watch: {
83
+ items: {
84
+ immediate: true,
85
+ handler(items) {
86
+ const selectedIndex = items.findIndex((item) => item.selected);
87
+ this.selectedIndex = selectedIndex > 0 ? selectedIndex : 0;
88
+ },
89
+ },
85
90
  },
86
91
  beforeCreate() {
87
92
  this.pathUuid = uniqueId('path-');
@@ -1,96 +1,6 @@
1
- import examples from './examples';
2
1
  import description from './search_box_by_click.md';
3
2
 
4
3
  export default {
5
4
  followsDesignSystem: true,
6
5
  description,
7
- examples,
8
- propsInfo: {
9
- value: {
10
- additionalInfo: 'If provided, used as value of search input',
11
- },
12
- historyItems: {
13
- type: Array,
14
- required: false,
15
- additionalInfo: 'If provided, used as history items for this component',
16
- },
17
- placeholder: {
18
- type: String,
19
- required: false,
20
- additionalInfo: 'If provided, used as history items for this component',
21
- },
22
- disabled: {
23
- type: Boolean,
24
- required: false,
25
- additionalInfo: 'If provided and true, disables the input and controls',
26
- },
27
- recentSearchesHeader: {
28
- type: String,
29
- required: false,
30
- default: 'Recent searches',
31
- additionalInfo: 'i18n for recent searches title within history dropdown',
32
- },
33
- clearButtonTitle: {
34
- type: String,
35
- required: false,
36
- default: 'Clear',
37
- additionalInfo: 'i18n for clear button title',
38
- },
39
- closeButtonTitle: {
40
- type: String,
41
- required: false,
42
- default: 'Close',
43
- additionalInfo: 'i18n for close button title within history dropdown',
44
- },
45
- clearRecentSearchesText: {
46
- type: String,
47
- required: false,
48
- default: 'Clear recent searches',
49
- additionalInfo: 'i18n for recent searches clear text',
50
- },
51
- tooltipContainer: {
52
- additionalInfo:
53
- 'Container for tooltip. Valid values: DOM node, selector string or `false` for default',
54
- },
55
- searchButtonAttributes: {
56
- additionalInfo: 'HTML attributes to add to the search button',
57
- },
58
- },
59
- events: [
60
- {
61
- event: 'clear',
62
- description: 'Emitted when search is cleared',
63
- },
64
- {
65
- event: 'submit',
66
- args: [
67
- {
68
- arg: 'value',
69
- description: 'Search value',
70
- },
71
- ],
72
- description: 'Emitted when search is submitted',
73
- },
74
- {
75
- event: 'history-item-selected',
76
- args: [
77
- {
78
- arg: 'value',
79
- description: 'History item',
80
- },
81
- ],
82
- description: 'Emitted when item from history is selected',
83
- },
84
- {
85
- event: 'clear-history',
86
- description: 'Emitted when clear history button is clicked',
87
- },
88
- ],
89
- slots: [
90
- {
91
- name: 'history-item',
92
- description:
93
- 'Slot to customize history item in history dropdown. Used only with history-items prop',
94
- },
95
- ],
96
6
  };
@@ -1,3 +1 @@
1
- # Search Box By Click
2
-
3
1
  Provides a clearable text input with loading state to be used for [search](https://design.gitlab.com/components/search).
@@ -1,57 +1,100 @@
1
- import { withKnobs, boolean, text } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
3
1
  import { GlSearchBoxByClick } from '../../../index';
2
+ import { disableControls } from '../../../utils/stories_utils';
4
3
  import readme from './search_box_by_click.md';
5
4
 
6
- const components = {
7
- GlSearchBoxByClick,
8
- };
5
+ const template = `
6
+ <gl-search-box-by-click
7
+ :value="value"
8
+ :disabled="disabled"
9
+ :placeholder="placeholder"
10
+ :history-items="currentHistoryItems"
11
+ :clearable="clearable"
12
+ :recent-searches-header="recentSearchesHeader"
13
+ :clear-button-title="clearButtonTitle"
14
+ :close-button-title="closeButtonTitle"
15
+ :clear-recent-searches-text="clearRecentSearchesText"
16
+ :no-recent-searches-text="noRecentSearchesText"
17
+ :search-button-attributes="searchButtonAttributes"
18
+ @clear-history="clearCurrentHistory"
19
+ />
20
+ `;
9
21
 
10
- function generateProps({ disabled = false, value = '', placeholder = 'Search' } = {}) {
11
- return {
12
- disabled: {
13
- type: Boolean,
14
- default: boolean('disabled', disabled),
15
- },
16
- value: {
17
- type: String,
18
- default: text('value', value),
22
+ const defaultValue = (prop) => GlSearchBoxByClick.props[prop].default;
23
+
24
+ const generateProps = ({
25
+ disabled = defaultValue('disabled'),
26
+ value = defaultValue('value'),
27
+ placeholder = defaultValue('placeholder'),
28
+ historyItems = defaultValue('historyItems'),
29
+ clearable = defaultValue('clearable'),
30
+ recentSearchesHeader = defaultValue('recentSearchesHeader'),
31
+ clearButtonTitle = defaultValue('clearButtonTitle'),
32
+ closeButtonTitle = defaultValue('closeButtonTitle'),
33
+ clearRecentSearchesText = defaultValue('clearRecentSearchesText'),
34
+ noRecentSearchesText = defaultValue('noRecentSearchesText'),
35
+ searchButtonAttributes = defaultValue('searchButtonAttributes')(),
36
+ } = {}) => ({
37
+ disabled,
38
+ value,
39
+ placeholder,
40
+ historyItems,
41
+ clearable,
42
+ recentSearchesHeader,
43
+ clearButtonTitle,
44
+ closeButtonTitle,
45
+ clearRecentSearchesText,
46
+ noRecentSearchesText,
47
+ searchButtonAttributes,
48
+ });
49
+
50
+ const Template = (args, { argTypes }) => ({
51
+ components: {
52
+ GlSearchBoxByClick,
53
+ },
54
+ props: Object.keys(argTypes),
55
+ template,
56
+ data() {
57
+ return {
58
+ currentHistoryItems: this.historyItems,
59
+ };
60
+ },
61
+ watch: {
62
+ historyItems(historyItems) {
63
+ this.currentHistoryItems = historyItems;
19
64
  },
20
- placeholder: {
21
- type: String,
22
- default: text('placeholder', placeholder),
65
+ },
66
+ methods: {
67
+ clearCurrentHistory() {
68
+ this.currentHistoryItems = [];
23
69
  },
24
- };
25
- }
70
+ },
71
+ });
72
+
73
+ export const Default = Template.bind({});
74
+ Default.args = generateProps();
26
75
 
27
- documentedStoriesOf('base/search-box-by-click', readme)
28
- .addDecorator(withKnobs)
29
- .add('default', () => ({
30
- props: generateProps(),
31
- components,
32
- template: `
33
- <gl-search-box-by-click
34
- :value="value"
35
- :disabled="disabled"
36
- :placeholder="placeholder"
37
- />
38
- `,
39
- }))
40
- .add('with history', () => ({
41
- props: {
42
- ...generateProps(),
43
- history: {
44
- type: Array,
45
- default: ['author:@admin', 'assignee:@admin milestone:%12.5', 'label:~test'],
76
+ export const History = Template.bind({});
77
+ History.args = generateProps({
78
+ historyItems: ['author:@admin', 'assignee:@admin milestone:%12.5', 'label:~test'],
79
+ });
80
+
81
+ export default {
82
+ title: 'base/search-box-by-click',
83
+ component: GlSearchBoxByClick,
84
+ parameters: {
85
+ knobs: { disable: true },
86
+ docs: {
87
+ description: {
88
+ component: readme,
89
+ },
90
+ },
91
+ },
92
+ argTypes: {
93
+ ...disableControls(['tooltipContainer']),
94
+ historyItems: {
95
+ control: {
96
+ type: 'object',
46
97
  },
47
98
  },
48
- components,
49
- template: `
50
- <gl-search-box-by-click
51
- :value="value"
52
- :disabled="disabled"
53
- :placeholder="placeholder"
54
- :history-items="history"
55
- />
56
- `,
57
- }));
99
+ },
100
+ };
@@ -26,6 +26,9 @@ export default {
26
26
  GlTooltip: GlTooltipDirective,
27
27
  },
28
28
  props: {
29
+ /**
30
+ * If provided, used as value of search input
31
+ */
29
32
  value: {
30
33
  required: false,
31
34
  default: '',
@@ -33,11 +36,17 @@ export default {
33
36
  // so we should not force any specific type for value here
34
37
  validator: () => true,
35
38
  },
39
+ /**
40
+ * If provided, used as history items for this component
41
+ */
36
42
  historyItems: {
37
43
  type: Array,
38
44
  required: false,
39
45
  default: null,
40
46
  },
47
+ /**
48
+ * If provided, used as a placeholder for this component
49
+ */
41
50
  placeholder: {
42
51
  type: String,
43
52
  required: false,
@@ -48,26 +57,41 @@ export default {
48
57
  required: false,
49
58
  default: true,
50
59
  },
60
+ /**
61
+ * If provided and true, disables the input and controls
62
+ */
51
63
  disabled: {
52
64
  type: Boolean,
53
65
  required: false,
54
66
  default: false,
55
67
  },
68
+ /**
69
+ * i18n for recent searches title within history dropdown
70
+ */
56
71
  recentSearchesHeader: {
57
72
  type: String,
58
73
  required: false,
59
74
  default: 'Recent searches',
60
75
  },
76
+ /**
77
+ * i18n for clear button title
78
+ */
61
79
  clearButtonTitle: {
62
80
  type: String,
63
81
  required: false,
64
82
  default: 'Clear',
65
83
  },
84
+ /**
85
+ * i18n for close button title within history dropdown
86
+ */
66
87
  closeButtonTitle: {
67
88
  type: String,
68
89
  required: false,
69
90
  default: 'Close',
70
91
  },
92
+ /**
93
+ * i18n for recent searches clear text
94
+ */
71
95
  clearRecentSearchesText: {
72
96
  type: String,
73
97
  required: false,
@@ -78,12 +102,18 @@ export default {
78
102
  required: false,
79
103
  default: "You don't have any recent searches",
80
104
  },
105
+ /**
106
+ * Container for tooltip. Valid values: DOM node, selector string or `false` for default
107
+ */
81
108
  tooltipContainer: {
82
109
  required: false,
83
110
  default: false,
84
111
  validator: (value) =>
85
112
  value === false || typeof value === 'string' || value instanceof HTMLElement,
86
113
  },
114
+ /**
115
+ * HTML attributes to add to the search button
116
+ */
87
117
  searchButtonAttributes: {
88
118
  type: Object,
89
119
  required: false,
@@ -130,10 +160,19 @@ export default {
130
160
  this.$refs.historyDropdown.hide();
131
161
  },
132
162
  search(value) {
163
+ /**
164
+ * Emitted when search is submitted
165
+ * @property {*} value Search value
166
+ */
133
167
  this.$emit('submit', value);
134
168
  },
135
169
  selectHistoryItem(item) {
136
170
  this.currentValue = item;
171
+
172
+ /**
173
+ * Emitted when item from history is selected
174
+ * @property {*} item History item
175
+ */
137
176
  this.$emit('history-item-selected', item);
138
177
  setTimeout(() => {
139
178
  document.activeElement.blur();
@@ -141,11 +180,20 @@ export default {
141
180
  },
142
181
  clearInput() {
143
182
  this.currentValue = '';
183
+ /**
184
+ * Emitted when search is cleared
185
+ */
144
186
  this.$emit('clear');
145
187
  if (this.$refs.input) {
146
188
  this.$refs.input.$el.focus();
147
189
  }
148
190
  },
191
+ emitClearHistory() {
192
+ /**
193
+ * Emitted when clear history button is clicked
194
+ */
195
+ this.$emit('clear-history');
196
+ },
149
197
  },
150
198
  };
151
199
  </script>
@@ -187,10 +235,11 @@ export default {
187
235
  class="gl-search-box-by-click-history-item"
188
236
  @click="selectHistoryItem(item)"
189
237
  >
238
+ <!-- @slot Slot to customize history item in history dropdown. Used only with history-items prop -->
190
239
  <slot name="history-item" :historyItem="item">{{ item }}</slot>
191
240
  </gl-dropdown-item>
192
241
  <gl-dropdown-divider />
193
- <gl-dropdown-item ref="clearHistory" @click="$emit('clear-history')">{{
242
+ <gl-dropdown-item ref="clearHistory" @click="emitClearHistory">{{
194
243
  clearRecentSearchesText
195
244
  }}</gl-dropdown-item>
196
245
  </template>
@@ -1,24 +1,6 @@
1
- import examples from './examples';
2
1
  import description from './search_box_by_type.md';
3
2
 
4
3
  export default {
5
4
  followsDesignSystem: true,
6
5
  description,
7
- propsInfo: {
8
- value: {
9
- additionalInfo: 'If provided, used as value of search input',
10
- },
11
- disabled: {
12
- additionalInfo: 'If provided and true, disables the input and controls',
13
- },
14
- isLoading: {
15
- additionalInfo: 'Puts search box into loading state, rendering spinner',
16
- },
17
- tooltipContainer: {
18
- additionalInfo:
19
- 'Container for tooltip. Valid values: DOM node, selector string or `false` for default',
20
- },
21
- },
22
- examples,
23
- bootstrapComponent: 'b-form-input',
24
6
  };
@@ -1,3 +1 @@
1
- # Search Box By Type
2
-
3
1
  Provides a clearable text input with loading state to be used for [search](https://design.gitlab.com/components/search).
@@ -1,49 +1,55 @@
1
- import { withKnobs, boolean, text } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
3
1
  import { GlSearchBoxByType } from '../../../index';
2
+ import { disableControls } from '../../../utils/stories_utils';
4
3
  import readme from './search_box_by_type.md';
5
4
 
6
- const components = {
7
- GlSearchBoxByType,
8
- };
5
+ const template = `
6
+ <gl-search-box-by-type
7
+ v-model="searchQuery"
8
+ :clear-button-title="clearButtonTitle"
9
+ :disabled="disabled"
10
+ :is-loading="isLoading"
11
+ :placeholder="placeholder"
12
+ />
13
+ `;
14
+
15
+ const defaultValue = (prop) => GlSearchBoxByType.props[prop].default;
9
16
 
10
- function generateProps({
11
- disabled = false,
12
- value = '',
17
+ const generateProps = ({
18
+ clearButtonTitle = defaultValue('clearButtonTitle'),
19
+ disabled = defaultValue('disabled'),
13
20
  placeholder = 'Search',
14
- isLoading = false,
15
- } = {}) {
16
- return {
17
- disabled: {
18
- type: Boolean,
19
- default: boolean('disabled', disabled),
20
- },
21
- value: {
22
- type: String,
23
- default: text('value', value),
24
- },
25
- placeholder: {
26
- type: String,
27
- default: text('placeholder', placeholder),
28
- },
29
- isLoading: {
30
- type: Boolean,
31
- default: boolean('isLoading', isLoading),
32
- },
33
- };
34
- }
21
+ isLoading = defaultValue('isLoading'),
22
+ } = {}) => ({
23
+ clearButtonTitle,
24
+ disabled,
25
+ placeholder,
26
+ isLoading,
27
+ });
28
+
29
+ const Template = (args, { argTypes }) => ({
30
+ components: {
31
+ GlSearchBoxByType,
32
+ },
33
+ props: Object.keys(argTypes),
34
+ data: () => ({ searchQuery: '' }),
35
+ template,
36
+ });
37
+ export const Default = Template.bind({});
38
+ Default.args = generateProps();
35
39
 
36
- documentedStoriesOf('base/search-box-by-type', readme)
37
- .addDecorator(withKnobs)
38
- .add('default', () => ({
39
- props: generateProps(),
40
- components,
41
- template: `
42
- <gl-search-box-by-type
43
- :value="value"
44
- :disabled="disabled"
45
- :is-loading="isLoading"
46
- :placeholder="placeholder"
47
- />
48
- `,
49
- }));
40
+ export default {
41
+ title: 'base/search-box-by-type',
42
+ component: GlSearchBoxByType,
43
+ parameters: {
44
+ knobs: { disable: true },
45
+ bootstrapComponent: 'b-form-input',
46
+ docs: {
47
+ description: {
48
+ component: readme,
49
+ },
50
+ },
51
+ },
52
+ argTypes: {
53
+ ...disableControls(['value']),
54
+ },
55
+ };
@@ -4,11 +4,6 @@ import GlFormInput from '../form/form_input/form_input.vue';
4
4
  import GlIcon from '../icon/icon.vue';
5
5
  import GlLoadingIcon from '../loading_icon/loading_icon.vue';
6
6
 
7
- const model = {
8
- prop: 'value',
9
- event: 'input',
10
- };
11
-
12
7
  export default {
13
8
  components: {
14
9
  GlClearIconButton,
@@ -17,8 +12,14 @@ export default {
17
12
  GlLoadingIcon,
18
13
  },
19
14
  inheritAttrs: false,
20
- model,
15
+ model: {
16
+ prop: 'value',
17
+ event: 'input',
18
+ },
21
19
  props: {
20
+ /**
21
+ * If provided, used as value of search input
22
+ */
22
23
  value: {
23
24
  type: String,
24
25
  required: false,
@@ -29,16 +30,25 @@ export default {
29
30
  required: false,
30
31
  default: 'Clear',
31
32
  },
33
+ /**
34
+ * If provided and true, disables the input and controls
35
+ */
32
36
  disabled: {
33
37
  type: Boolean,
34
38
  required: false,
35
39
  default: false,
36
40
  },
41
+ /**
42
+ * Puts search box into loading state, rendering spinner
43
+ */
37
44
  isLoading: {
38
45
  type: Boolean,
39
46
  required: false,
40
47
  default: false,
41
48
  },
49
+ /**
50
+ * Container for tooltip. Valid values: DOM node, selector string or `false` for default
51
+ */
42
52
  tooltipContainer: {
43
53
  required: false,
44
54
  default: false,