@gitlab/ui 71.8.0 → 71.9.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "71.8.0",
3
+ "version": "71.9.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -122,7 +122,7 @@
122
122
  "babel-loader": "^8.0.5",
123
123
  "babel-plugin-require-context-hook": "^1.0.0",
124
124
  "bootstrap": "4.6.2",
125
- "cypress": "13.6.0",
125
+ "cypress": "13.6.1",
126
126
  "cypress-axe": "^1.4.0",
127
127
  "cypress-real-events": "^1.11.0",
128
128
  "dompurify": "^3.0.0",
@@ -3,15 +3,9 @@
3
3
 
4
4
  &-child {
5
5
  @include gl-display-inline-flex;
6
- @include gl-mr-3;
7
- }
8
-
9
- &.collapsed {
10
- @include gl-relative;
11
6
 
12
- .gl-avatars-inline-child {
13
- @include gl-absolute;
14
- @include gl-mr-0;
7
+ &:not(:last-child) {
8
+ @include gl-mr-3;
15
9
  }
16
10
  }
17
11
 
@@ -33,12 +33,6 @@ describe('avatars inline', () => {
33
33
  expect(wrapper.findAllComponents(Avatar).length).toBe(avatars.length);
34
34
  });
35
35
 
36
- it('adds collapsed class selector when collapsed=true', () => {
37
- buildWrapper({ avatars, maxVisible: 2, avatarSize: 24, collapsed: true });
38
-
39
- expect(wrapper.classes()).toContain('collapsed');
40
- });
41
-
42
36
  describe('when component is collapsed and maxVisible is the number of avatars', () => {
43
37
  beforeEach(() => {
44
38
  buildWrapper({ avatars, maxVisible: avatars.length, avatarSize: 24, collapsed: true });
@@ -55,12 +55,6 @@ export default {
55
55
  visibleAvatars() {
56
56
  return this.collapsed ? this.avatars.slice(0, this.maxVisible) : this.avatars;
57
57
  },
58
- containerSizeStyles() {
59
- return {
60
- width: `${this.avatarSize * this.visibleAvatars.length}px`,
61
- height: `${this.avatarSize}px`,
62
- };
63
- },
64
58
  badgeSize() {
65
59
  return this.avatarSize === 24 ? 'md' : 'lg';
66
60
  },
@@ -84,25 +78,31 @@ export default {
84
78
  },
85
79
  },
86
80
  methods: {
87
- calcAvatarPosition(avatarIndex) {
81
+ calcAvatarStyles(avatarIndex) {
88
82
  // According to pajamas, overlap is 25% of the avatar height
89
- const overlapDistance = this.avatarSize * 0.75;
83
+ const overlap = this.avatarSize * 0.25;
84
+
85
+ const marginRight =
86
+ avatarIndex === this.maxVisible ||
87
+ avatarIndex === this.avatars.length - 1 ||
88
+ !this.collapsed
89
+ ? undefined
90
+ : `-${overlap}px`;
90
91
 
91
92
  return {
92
- left: `${overlapDistance * avatarIndex}px`,
93
- zIndex: this.maxVisible + (avatarIndex - 1),
93
+ marginRight,
94
94
  };
95
95
  },
96
96
  },
97
97
  };
98
98
  </script>
99
99
  <template>
100
- <div :class="['gl-avatars-inline', { collapsed: collapsed }]" :style="containerSizeStyles">
100
+ <div class="gl-avatars-inline">
101
101
  <div
102
102
  v-for="(avatar, index) in visibleAvatars"
103
103
  :key="index"
104
104
  class="gl-avatars-inline-child"
105
- :style="calcAvatarPosition(index)"
105
+ :style="calcAvatarStyles(index)"
106
106
  >
107
107
  <slot name="avatar" :avatar="avatar">
108
108
  <gl-avatar v-bind="avatar" :size="avatarSize" />
@@ -111,7 +111,7 @@ export default {
111
111
  <div
112
112
  v-if="collapsed && collapsable"
113
113
  class="gl-avatars-inline-child"
114
- :style="calcAvatarPosition(visibleAvatars.length)"
114
+ :style="calcAvatarStyles(visibleAvatars.length)"
115
115
  >
116
116
  <gl-tooltip v-if="badgeTooltipProp" :target="() => $refs.badge">
117
117
  {{ badgeTooltipTitle }}
@@ -286,4 +286,22 @@ describe('Daterange Picker', () => {
286
286
 
287
287
  expect(wrapper.find(`[data-testid="${testid}"]`).classes()).toContain(value);
288
288
  });
289
+
290
+ describe('startOpened', () => {
291
+ beforeEach(() => {
292
+ factory({ startOpened: true });
293
+ });
294
+ it('sets start-opened on the from date picker', () => {
295
+ expect(findStartPicker().props('startOpened')).toBe(true);
296
+ });
297
+
298
+ it('defaults to false', () => {
299
+ factory();
300
+ expect(findStartPicker().props('startOpened')).toBe(false);
301
+ });
302
+
303
+ it('does not set start-opened on the end date picker', () => {
304
+ expect(findEndPicker().props('startOpened')).toBe(false);
305
+ });
306
+ });
289
307
  });
@@ -25,6 +25,7 @@ const generateProps = ({
25
25
  endPickerClass,
26
26
  labelClass,
27
27
  theme = defaultValue('theme'),
28
+ startOpened = false,
28
29
  } = {}) => ({
29
30
  defaultMinDate: new Date(defaultMinDate),
30
31
  defaultMaxDate: new Date(defaultMaxDate),
@@ -39,6 +40,7 @@ const generateProps = ({
39
40
  endPickerClass,
40
41
  labelClass,
41
42
  theme,
43
+ startOpened,
42
44
  });
43
45
 
44
46
  const Template = (template, props) => ({
@@ -79,6 +81,7 @@ const defaultTemplate = `
79
81
  :end-picker-class="endPickerClass"
80
82
  :label-class="labelClass"
81
83
  :theme="theme"
84
+ :start-opened="startOpened"
82
85
  /> `;
83
86
  export const Default = Template.bind({}, defaultTemplate);
84
87
  Default.args = generateProps();
@@ -97,6 +100,7 @@ const withDatesSelectedAndTooltipTemplate = `<gl-daterange-picker
97
100
  :start-picker-class="startPickerClass"
98
101
  :end-picker-class="endPickerClass"
99
102
  :label-class="labelClass"
103
+ :start-opened="startOpened"
100
104
  :theme="theme">
101
105
  <template #default="{ daysSelected }">
102
106
  <span v-if="daysSelected === 1">{{ daysSelected }} day selected</span>
@@ -128,6 +128,11 @@ export default {
128
128
  required: false,
129
129
  default: '',
130
130
  },
131
+ startOpened: {
132
+ type: Boolean,
133
+ required: false,
134
+ default: false,
135
+ },
131
136
  },
132
137
  data() {
133
138
  return {
@@ -261,6 +266,7 @@ export default {
261
266
  :i18n="i18n"
262
267
  :target="startPickerTarget"
263
268
  :container="startPickerContainer"
269
+ :start-opened="startOpened"
264
270
  @input="onStartDateSelected"
265
271
  @open="onStartPickerOpen"
266
272
  @close="onStartPickerClose"
@@ -196,16 +196,23 @@ describe('Filtered search token', () => {
196
196
  expect(findOperatorSegment().props().active).toBe(true);
197
197
  });
198
198
 
199
- it.each(['complete', 'split', 'submit', 'select'])(
200
- 'passes-through %s event when data segment emits it',
201
- (event) => {
202
- createComponent({ active: true, value: { operator: '=', data: 'something' } });
199
+ it.each([
200
+ ['complete', true],
201
+ ['split', true],
202
+ ['submit', false],
203
+ ['select', true],
204
+ ])('passes-through %s event when data segment emits it', (event, shouldIncludeValue) => {
205
+ createComponent({ active: true, value: { operator: '=', data: 'something' } });
203
206
 
204
- findDataSegment().vm.$emit(event);
207
+ findDataSegment().vm.$emit(event, 'value');
205
208
 
206
- expect(wrapper.emitted(event)).toHaveLength(1);
209
+ expect(wrapper.emitted(event)).toHaveLength(1);
210
+ if (shouldIncludeValue) {
211
+ expect(wrapper.emitted(event)[0][0]).toBe('value');
212
+ } else {
213
+ expect(wrapper.emitted(event)[0][0]).toBeUndefined();
207
214
  }
208
- );
215
+ });
209
216
 
210
217
  it('keeps value when replaced by compatible token', () => {
211
218
  const originalValue = { operator: '=', data: 'something' };
@@ -323,7 +330,7 @@ describe('Filtered search token', () => {
323
330
  beforeDataInputButton.trigger('click');
324
331
 
325
332
  expect(wrapper.emitted()).toEqual({
326
- complete: [[]],
333
+ complete: [[TEST_APPLY_VALUE]],
327
334
  select: [[TEST_APPLY_VALUE]],
328
335
  });
329
336
  });
@@ -304,13 +304,13 @@ export default {
304
304
  this.intendedCursorPosition = 'start';
305
305
  },
306
306
 
307
- handleComplete() {
307
+ handleComplete(value) {
308
308
  /**
309
309
  * Emitted when the token entry has been completed.
310
310
  *
311
311
  * @event complete
312
312
  */
313
- this.$emit('complete');
313
+ this.$emit('complete', value);
314
314
  },
315
315
 
316
316
  stopMousedownOnCloseButton(event) {
@@ -4388,6 +4388,14 @@ $gl-animate-skeleton-loader-max-width: 64 * $grid-size;
4388
4388
  top: 66vh !important;
4389
4389
  }
4390
4390
 
4391
+ .gl-top-full {
4392
+ top: 100%;
4393
+ }
4394
+
4395
+ .gl-top-full\! {
4396
+ top: 100% !important;
4397
+ }
4398
+
4391
4399
  .gl-right-auto {
4392
4400
  right: auto;
4393
4401
  }
@@ -90,6 +90,10 @@
90
90
  top: 66vh;
91
91
  }
92
92
 
93
+ @mixin gl-top-full {
94
+ top: 100%;
95
+ }
96
+
93
97
  @mixin gl-right-auto {
94
98
  right: auto;
95
99
  }