@rancher/shell 1.2.1 → 1.2.2

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/package.json +1 -1
  2. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  3. package/rancher-components/Banner/Banner.test.ts +5 -1
  4. package/rancher-components/Banner/Banner.vue +2 -2
  5. package/rancher-components/Card/Card.vue +4 -4
  6. package/rancher-components/Form/Checkbox/Checkbox.vue +3 -4
  7. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -18
  8. package/rancher-components/Form/LabeledInput/LabeledInput.vue +37 -65
  9. package/rancher-components/Form/Radio/RadioButton.test.ts +3 -1
  10. package/rancher-components/Form/Radio/RadioButton.vue +7 -13
  11. package/rancher-components/Form/Radio/RadioGroup.vue +3 -4
  12. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -6
  13. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +4 -7
  14. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +4 -9
  15. package/rancher-components/StringList/StringList.test.ts +0 -270
  16. package/rancher-components/StringList/StringList.vue +26 -65
  17. package/scripts/publish-shell.sh +1 -0
  18. package/rancher-components/Accordion/Accordion.test.ts +0 -45
  19. package/rancher-components/Accordion/Accordion.vue +0 -86
  20. package/rancher-components/Accordion/index.ts +0 -1
  21. package/rancher-components/BadgeState/BadgeState.test.ts +0 -12
  22. package/rancher-components/components/Accordion/Accordion.test.ts +0 -45
  23. package/rancher-components/components/Accordion/Accordion.vue +0 -86
  24. package/rancher-components/components/Accordion/index.ts +0 -1
  25. package/rancher-components/components/BadgeState/BadgeState.test.ts +0 -12
  26. package/rancher-components/components/BadgeState/BadgeState.vue +0 -111
  27. package/rancher-components/components/BadgeState/index.ts +0 -1
  28. package/rancher-components/components/Banner/Banner.test.ts +0 -63
  29. package/rancher-components/components/Banner/Banner.vue +0 -244
  30. package/rancher-components/components/Banner/index.ts +0 -1
  31. package/rancher-components/components/Card/Card.test.ts +0 -37
  32. package/rancher-components/components/Card/Card.vue +0 -167
  33. package/rancher-components/components/Card/index.ts +0 -1
  34. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +0 -68
  35. package/rancher-components/components/Form/Checkbox/Checkbox.vue +0 -420
  36. package/rancher-components/components/Form/Checkbox/index.ts +0 -1
  37. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +0 -23
  38. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +0 -369
  39. package/rancher-components/components/Form/LabeledInput/index.ts +0 -1
  40. package/rancher-components/components/Form/Radio/RadioButton.test.ts +0 -35
  41. package/rancher-components/components/Form/Radio/RadioButton.vue +0 -287
  42. package/rancher-components/components/Form/Radio/RadioGroup.test.ts +0 -30
  43. package/rancher-components/components/Form/Radio/RadioGroup.vue +0 -258
  44. package/rancher-components/components/Form/Radio/index.ts +0 -2
  45. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +0 -170
  46. package/rancher-components/components/Form/TextArea/index.ts +0 -1
  47. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +0 -94
  48. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +0 -149
  49. package/rancher-components/components/Form/ToggleSwitch/index.ts +0 -1
  50. package/rancher-components/components/Form/index.ts +0 -5
  51. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -151
  52. package/rancher-components/components/LabeledTooltip/index.ts +0 -1
  53. package/rancher-components/components/StringList/StringList.test.ts +0 -484
  54. package/rancher-components/components/StringList/StringList.vue +0 -611
  55. package/rancher-components/components/StringList/index.ts +0 -1
  56. /package/rancher-components/{components/BadgeState → BadgeState}/BadgeState.spec.ts +0 -0
@@ -1,151 +0,0 @@
1
- <script lang="ts">
2
- import Vue from 'vue';
3
-
4
- export default Vue.extend({
5
- props: {
6
- /**
7
- * The Labeled Tooltip value.
8
- */
9
- value: {
10
- type: [String, Object],
11
- default: null
12
- },
13
-
14
- /**
15
- * The status for the Labeled Tooltip. Controls the Labeled Tooltip class.
16
- * @values info, success, warning, error
17
- */
18
- status: {
19
- type: String,
20
- default: 'error'
21
- },
22
-
23
- /**
24
- * Displays the Labeled Tooltip on mouse hover.
25
- */
26
- hover: {
27
- type: Boolean,
28
- default: true
29
- }
30
- },
31
- computed: {
32
- iconClass() {
33
- return this.status === 'error' ? 'icon-warning' : 'icon-info';
34
- }
35
- }
36
- });
37
- </script>
38
-
39
- <template>
40
- <div
41
- ref="container"
42
- class="labeled-tooltip"
43
- :class="{[status]: true, hoverable: hover}"
44
- >
45
- <template v-if="hover">
46
- <i
47
- v-clean-tooltip="value.content ? { ...{content: value.content, classes: [`tooltip-${status}`]}, ...value } : value"
48
- :class="{'hover':!value, [iconClass]: true}"
49
- class="icon status-icon"
50
- />
51
- </template>
52
- <template v-else>
53
- <i
54
- :class="{'hover':!value}"
55
- class="icon status-icon"
56
- />
57
- <div
58
- v-if="value"
59
- class="tooltip"
60
- x-placement="bottom"
61
- >
62
- <div class="tooltip-arrow" />
63
- <div class="tooltip-inner">
64
- {{ value }}
65
- </div>
66
- </div>
67
- </template>
68
- </div>
69
- </template>
70
-
71
- <style lang='scss'>
72
- .labeled-tooltip {
73
- position: absolute;
74
- width: 100%;
75
- height: 100%;
76
- left: 0;
77
- top: 0;
78
-
79
- &.hoverable {
80
- height: 0%;
81
- }
82
-
83
- .status-icon {
84
- position: absolute;
85
- right: 30px;
86
- top: $input-padding-lg;
87
- z-index: z-index(hoverOverContent);
88
- }
89
-
90
- .tooltip {
91
- position: absolute;
92
- width: calc(100% + 2px);
93
- top: calc(100% + 6px);
94
-
95
- .tooltip-arrow {
96
- right: 30px;
97
- }
98
-
99
- .tooltip-inner {
100
- padding: 10px;
101
- }
102
- }
103
-
104
- @mixin tooltipColors($color) {
105
- .status-icon {
106
- color: $color;
107
- }
108
- .tooltip {
109
- .tooltip-inner {
110
- color: var(--input-bg);
111
- background: $color;
112
- border-color: $color;
113
- }
114
-
115
- .tooltip-arrow {
116
- border-bottom-color: $color;
117
- &:after {
118
- border: none;
119
- }
120
- }
121
- }
122
- }
123
-
124
- &.error {
125
- @include tooltipColors(var(--error));
126
-
127
- .status-icon {
128
- top: 7px;
129
- right: 5px;
130
- }
131
- }
132
-
133
- &.warning {
134
- @include tooltipColors(var(--warning));
135
- }
136
-
137
- &.success {
138
- @include tooltipColors(var(--success));
139
- }
140
- }
141
-
142
- // Ensure code blocks inside tootips don't look awful
143
- .tooltip {
144
- .tooltip-inner {
145
- > pre {
146
- padding: 2px;
147
- vertical-align: middle;
148
- }
149
- }
150
- }
151
- </style>
@@ -1 +0,0 @@
1
- export { default as LabeledTooltip } from './LabeledTooltip.vue';
@@ -1,484 +0,0 @@
1
- /* eslint-disable jest/no-hooks */
2
- import { mount, Wrapper } from '@vue/test-utils';
3
- import { StringList } from './index';
4
-
5
- describe('stringList.vue', () => {
6
- let wrapper: Wrapper<InstanceType<typeof StringList>>;
7
-
8
- beforeEach(() => {
9
- wrapper = mount(StringList, { propsData: { items: [] } });
10
- });
11
-
12
- describe('list box', () => {
13
- it('is empty', () => {
14
- const box = wrapper.find('[data-testid="div-string-list-box"]').element as HTMLElement;
15
-
16
- expect(box.children).toHaveLength(0);
17
- });
18
-
19
- it('show multiple items', async() => {
20
- const items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'];
21
-
22
- await wrapper.setProps({ items });
23
-
24
- const elements = wrapper.findAll('[data-testid^="div-item"]');
25
-
26
- expect(elements).toHaveLength(10);
27
- });
28
-
29
- it('double click triggers inline edit mode', async() => {
30
- const items = ['test'];
31
-
32
- await wrapper.setProps({ items });
33
-
34
- const item = wrapper.find('[data-testid="div-item-test"]');
35
-
36
- await item.trigger('dblclick');
37
-
38
- const inputField = wrapper.find('[data-testid^="item-edit"]');
39
-
40
- expect(inputField.element).toBeDefined();
41
- });
42
-
43
- it('double click on empty space triggers create mode', async() => {
44
- await wrapper.setProps({ items: [] });
45
-
46
- // double click on empty space
47
- const box = wrapper.find('[data-testid="div-string-list-box"]');
48
-
49
- await box.trigger('dblclick');
50
-
51
- const inputField = wrapper.find('[data-testid="item-create"]');
52
-
53
- expect(inputField.element).toBeDefined();
54
- });
55
-
56
- it('select item when click on it', async() => {
57
- const items = ['test'];
58
-
59
- await wrapper.setProps({ items });
60
-
61
- // select item
62
- const item = wrapper.find('[data-testid^="div-item"]');
63
-
64
- await item.trigger('mousedown');
65
-
66
- expect(item.element.className).toContain('selected');
67
- });
68
-
69
- it('double click to edit item not allowed when readonly', async() => {
70
- const items = ['test'];
71
-
72
- await wrapper.setProps({
73
- items,
74
- readonly: true,
75
- });
76
-
77
- const item = wrapper.find('[data-testid="div-item-test"]');
78
-
79
- await item.trigger('dblclick');
80
-
81
- const inputField = wrapper.find('[data-testid^="item-edit"]');
82
-
83
- expect(inputField.element).toBeUndefined();
84
- });
85
-
86
- it('double click on empty space to create item not allowed when readonly', async() => {
87
- await wrapper.setProps({
88
- items: [],
89
- readonly: true,
90
- });
91
-
92
- // double click on empty space
93
- const box = wrapper.find('[data-testid="div-string-list-box"]');
94
-
95
- await box.trigger('dblclick');
96
-
97
- const inputField = wrapper.find('[data-testid="item-create"]');
98
-
99
- expect(inputField.element).toBeUndefined();
100
- });
101
-
102
- it('select item not allowed when readonly', async() => {
103
- const items = ['test'];
104
-
105
- await wrapper.setProps({
106
- items,
107
- readonly: true,
108
- });
109
-
110
- // select item
111
- const item = wrapper.find('[data-testid^="div-item"]');
112
-
113
- await item.trigger('mousedown');
114
-
115
- expect(item.element.className).not.toContain('selected');
116
- });
117
-
118
- it('emit type:item event', async() => {
119
- // activate create mode
120
- await wrapper.setData({ isCreateItem: true });
121
-
122
- const inputField = wrapper.find('[data-testid="item-create"]');
123
-
124
- // set input value to 'F'
125
- await inputField.setValue('F');
126
- await wrapper.vm.$nextTick();
127
-
128
- const emitted = (wrapper.emitted('type:item') || [])[0][0][0];
129
-
130
- expect(emitted).toBe('F');
131
- });
132
- });
133
-
134
- describe('buttons', () => {
135
- it('are visible by default', () => {
136
- const actionButtons = wrapper.find('[data-testid="div-action-buttons"]');
137
-
138
- expect(actionButtons.element).toBeDefined();
139
- });
140
-
141
- it('are hidden when is view-only mode', async() => {
142
- await wrapper.setProps({ readonly: true });
143
- const actionButtons = wrapper.find('[data-testid="div-action-buttons"]');
144
-
145
- expect(actionButtons.element).toBeUndefined();
146
- });
147
-
148
- describe('add button', () => {
149
- it('is enabled by default', () => {
150
- const addButton = wrapper.find('[data-testid="button-add"]')?.element as HTMLButtonElement;
151
-
152
- expect(addButton.disabled).toBe(false);
153
- });
154
-
155
- it('show the input field when is clicked', async() => {
156
- // click add button
157
- const addButton = wrapper.find('[data-testid="button-add"]');
158
-
159
- await addButton.trigger('click');
160
-
161
- const inputField = wrapper.find('[data-testid="item-create"]');
162
-
163
- expect(inputField.element).toBeDefined();
164
- });
165
-
166
- it('is disabled when create mode is active', async() => {
167
- // click add button
168
- const addButton = wrapper.find('[data-testid="button-add"]');
169
-
170
- await addButton.trigger('click');
171
-
172
- wrapper.find('[data-testid="item-create"]');
173
-
174
- const buttonElem = addButton.element as HTMLButtonElement;
175
-
176
- expect(buttonElem.disabled).toBe(true);
177
- });
178
- });
179
-
180
- describe('remove button', () => {
181
- it('is disabled by default', () => {
182
- const removeButton = wrapper.find('[data-testid="button-remove"]');
183
- const buttonElem = removeButton.element as HTMLButtonElement;
184
-
185
- expect(buttonElem.disabled).toBe(true);
186
- });
187
-
188
- it('is enabled when create mode is active', async() => {
189
- // click add button
190
- const addButton = wrapper.find('[data-testid="button-add"]');
191
-
192
- await addButton.trigger('click');
193
-
194
- const removeButton = wrapper.find('[data-testid="button-remove"]');
195
- const buttonElem = removeButton.element as HTMLButtonElement;
196
-
197
- expect(buttonElem.disabled).toBe(false);
198
- });
199
-
200
- it('is enabled when edit mode is active', async() => {
201
- const items = ['test'];
202
-
203
- await wrapper.setProps({ items });
204
-
205
- // activate edit mode
206
- await wrapper.setData({ editedItem: 'test' });
207
-
208
- const removeButton = wrapper.find('[data-testid="button-remove"]');
209
- const buttonElem = removeButton.element as HTMLButtonElement;
210
-
211
- expect(buttonElem.disabled).toBe(false);
212
- });
213
-
214
- it('is enabled when an item is selected', async() => {
215
- const items = ['test'];
216
-
217
- await wrapper.setProps({ items });
218
-
219
- // select item
220
- await wrapper.setData({ selected: 'test' });
221
-
222
- // click remove button
223
- const removeButton = wrapper.find('[data-testid="button-remove"]');
224
- const buttonElem = removeButton.element as HTMLButtonElement;
225
-
226
- expect(buttonElem.disabled).toBe(false);
227
- });
228
-
229
- it('removes items when an item is selected', async() => {
230
- const items = ['a'];
231
-
232
- await wrapper.setProps({ items });
233
-
234
- // select item
235
- await wrapper.setData({ selected: 'a' });
236
-
237
- // click remove button
238
- const removeButton = wrapper.find('[data-testid="button-remove"]');
239
-
240
- await removeButton.trigger('mousedown');
241
-
242
- await wrapper.vm.$nextTick();
243
-
244
- const itemsCount = (wrapper.emitted('change') || [])[0][0].length;
245
-
246
- expect(itemsCount).toBe(0);
247
- });
248
-
249
- it('deactivates create mode', async() => {
250
- // activate create mode
251
- await wrapper.setData({ isCreateItem: true });
252
-
253
- // click remove button
254
- const removeButton = wrapper.find('[data-testid="button-remove"]');
255
-
256
- await removeButton.trigger('mousedown');
257
-
258
- const inputField = await wrapper.find('[data-testid="item-create"]');
259
-
260
- expect(inputField.element).toBeUndefined();
261
- });
262
-
263
- it('deactivates edit mode', async() => {
264
- const items = ['test'];
265
-
266
- await wrapper.setProps({ items });
267
-
268
- // activate edit mode
269
- await wrapper.setData({ editedItem: 'test' });
270
-
271
- // click remove button
272
- const removeButton = wrapper.find('[data-testid="button-remove"]');
273
-
274
- await removeButton.trigger('mousedown');
275
-
276
- const inputField = wrapper.find('[data-testid^="item-edit"]');
277
-
278
- expect(inputField.element).toBeUndefined();
279
- });
280
- });
281
- });
282
-
283
- describe('list edit', () => {
284
- const validItem = ' item name ';
285
- const emptyItem = ' ';
286
-
287
- it('save a new item in create mode by pressing Enter key', async() => {
288
- // activate create mode
289
- await wrapper.setData({ isCreateItem: true });
290
-
291
- // type item name
292
- const inputField = wrapper.find('[data-testid="item-create"]');
293
-
294
- await inputField.setValue(validItem);
295
-
296
- // press enter
297
- await inputField.trigger('keydown.enter');
298
- await wrapper.vm.$nextTick();
299
-
300
- const emitted = (wrapper.emitted('change') || [])[0][0][0];
301
-
302
- expect(emitted).toBe(validItem.trim());
303
- });
304
-
305
- it('save item in edit mode by pressing Enter key', async() => {
306
- const items = ['test'];
307
-
308
- await wrapper.setProps({ items });
309
-
310
- // activate edit mode
311
- await wrapper.setData({ editedItem: 'test' });
312
- const inputField = wrapper.find('[data-testid^="item-edit"]');
313
-
314
- // edit item name
315
- await inputField.setValue(validItem);
316
-
317
- // press enter
318
- await inputField.trigger('keydown.enter');
319
- await wrapper.vm.$nextTick();
320
-
321
- const emitted = (wrapper.emitted('change') || [])[0][0][0];
322
-
323
- expect(emitted).toBe(validItem.trim());
324
- });
325
-
326
- it('reject a new item in create mode when item name is empty', async() => {
327
- // activate create mode
328
- await wrapper.setData({ isCreateItem: true });
329
-
330
- // type item name
331
- const inputField = wrapper.find('[data-testid="item-create"]');
332
-
333
- await inputField.setValue(emptyItem);
334
-
335
- // press enter
336
- await inputField.trigger('keydown.enter');
337
- await wrapper.vm.$nextTick();
338
-
339
- expect(wrapper.emitted('change')).toBeFalsy();
340
- });
341
-
342
- it('reject a new item in create mode when item name is duplicate', async() => {
343
- const items = ['test'];
344
-
345
- await wrapper.setProps({ items });
346
-
347
- // activate create mode
348
- await wrapper.setData({ isCreateItem: true });
349
-
350
- // type item name
351
- const inputField = wrapper.find('[data-testid="item-create"]');
352
-
353
- await inputField.setValue('test');
354
-
355
- // press enter
356
- await inputField.trigger('keydown.enter');
357
- await wrapper.vm.$nextTick();
358
-
359
- expect(wrapper.emitted('change')).toBeFalsy();
360
- });
361
-
362
- it('reject an item in edit mode when item name is empty', async() => {
363
- const items = ['test'];
364
-
365
- await wrapper.setProps({ items });
366
-
367
- // activate edit mode
368
- await wrapper.setData({ editedItem: 'test' });
369
- const inputField = wrapper.find('[data-testid^="item-edit"]');
370
-
371
- // edit item name
372
- await inputField.setValue(emptyItem);
373
-
374
- // press enter
375
- await inputField.trigger('keydown.enter');
376
- await wrapper.vm.$nextTick();
377
-
378
- expect(wrapper.emitted('change')).toBeFalsy();
379
- });
380
-
381
- it('reject an item in edit mode when item name is duplicate', async() => {
382
- const items = ['test', 'test-1'];
383
-
384
- await wrapper.setProps({ items });
385
-
386
- // activate edit mode
387
- await wrapper.setData({ editedItem: 'test' });
388
- const inputField = wrapper.find('[data-testid^="item-edit"]');
389
-
390
- // edit item name
391
- await inputField.setValue('test-1');
392
-
393
- // press enter
394
- await inputField.trigger('keydown.enter');
395
- await wrapper.vm.$nextTick();
396
-
397
- expect(wrapper.emitted('change')).toBeFalsy();
398
- });
399
- });
400
-
401
- describe('errors handling', () => {
402
- it('show duplicate warning icon when errorMessages is defined', async() => {
403
- const items = ['test'];
404
-
405
- await wrapper.setProps({
406
- items,
407
- errorMessages: { duplicate: 'error, item is duplicate.' },
408
- });
409
-
410
- // activate edit mode
411
- await wrapper.setData({ isCreateItem: true });
412
-
413
- // type item name
414
- const inputField = wrapper.find('[data-testid="item-create"]');
415
-
416
- await inputField.setValue('test');
417
-
418
- const icon = wrapper.find('[data-testid="i-warning-icon"]');
419
-
420
- expect(icon.element).toBeDefined();
421
- });
422
-
423
- it('show duplicate warning message when errorMessages is defined', async() => {
424
- const items = ['test'];
425
-
426
- await wrapper.setProps({
427
- items,
428
- errorMessages: { duplicate: 'error, item is duplicate.' },
429
- });
430
-
431
- // activate edit mode
432
- await wrapper.setData({ isCreateItem: true });
433
-
434
- // type item name
435
- const inputField = wrapper.find('[data-testid="item-create"]');
436
-
437
- await inputField.setValue('test');
438
-
439
- const message = wrapper.find('[data-testid^="span-error-message"]');
440
-
441
- expect(message.element).toBeDefined();
442
- });
443
-
444
- it('emit duplicate errors', async() => {
445
- const items = ['test'];
446
-
447
- await wrapper.setProps({ items });
448
-
449
- // activate edit mode
450
- await wrapper.setData({ isCreateItem: true });
451
-
452
- // type item name
453
- const inputField = wrapper.find('[data-testid="item-create"]');
454
-
455
- await inputField.setValue('test');
456
-
457
- const isDuplicate = (wrapper.emitted('errors') || [])[0][0].duplicate;
458
-
459
- expect(isDuplicate).toBe(true);
460
- });
461
-
462
- it('emit duplicate errors, reset error', async() => {
463
- const items = ['test'];
464
-
465
- await wrapper.setProps({ items });
466
-
467
- // activate edit mode
468
- await wrapper.setData({ isCreateItem: true });
469
-
470
- // type item name
471
- const inputField = wrapper.find('[data-testid="item-create"]');
472
-
473
- // emit duplicate errors
474
- await inputField.setValue('test');
475
-
476
- // it is not duplicate, reset duplicate error -> emit false
477
- await inputField.setValue('test-1');
478
-
479
- const isDuplicate = (wrapper.emitted('errors') || [])[0][0].duplicate;
480
-
481
- expect(isDuplicate).toBe(false);
482
- });
483
- });
484
- });