design-system-next 2.13.5 → 2.14.1
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/dist/design-system-next.es.js +15071 -10300
- package/dist/design-system-next.es.js.gz +0 -0
- package/dist/design-system-next.umd.js +22 -13
- package/dist/design-system-next.umd.js.gz +0 -0
- package/dist/main.css +1 -1
- package/dist/main.css.gz +0 -0
- package/dist/package.json.d.ts +3 -2
- package/package.json +3 -2
- package/src/App.vue +1671 -67
- package/src/assets/styles/tailwind.css +4 -0
- package/src/components/dropdown/dropdown.ts +3 -2
- package/src/components/dropdown/dropdown.vue +2 -2
- package/src/components/dropdown/use-dropdown.ts +89 -70
- package/src/components/input/use-input.ts +2 -2
- package/src/components/list/ladderized-list/ladderized-list-back.vue +2 -1
- package/src/components/list/ladderized-list/ladderized-list.vue +3 -18
- package/src/components/list/ladderized-list/use-ladderized-list.ts +33 -21
- package/src/components/list/list.ts +4 -1
- package/src/components/list/list.vue +155 -136
- package/src/components/select/select-ladderized/select-ladderized.ts +19 -0
- package/src/components/select/select-ladderized/select-ladderized.vue +12 -11
- package/src/components/select/select-ladderized/use-select-ladderized.ts +20 -21
- package/src/components/select/select-multiple/select-multiple.ts +19 -0
- package/src/components/select/select-multiple/select-multiple.vue +74 -77
- package/src/components/select/select-multiple/use-select-multiple.ts +5 -15
- package/src/components/select/select.ts +19 -0
- package/src/components/select/select.vue +50 -53
- package/src/components/select/use-select.ts +4 -13
- package/src/components/sidenav/use-sidenav.ts +10 -3
- package/src/components/table/table-pagination/use-table-pagination.ts +1 -1
- package/src/components/table/table.ts +33 -3
- package/src/components/table/table.vue +150 -98
- package/src/components/table/use-table.ts +63 -7
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
</label>
|
|
9
9
|
|
|
10
10
|
<Menu
|
|
11
|
-
:shown="multiSelectPopperState"
|
|
11
|
+
v-model:shown="multiSelectPopperState"
|
|
12
12
|
aria-id="multi-select-wrapper"
|
|
13
13
|
distance="4"
|
|
14
14
|
:placement="props.placement"
|
|
15
|
-
:triggers="
|
|
16
|
-
:popper-
|
|
17
|
-
:auto-hide="
|
|
15
|
+
:triggers="props.triggers"
|
|
16
|
+
:popper-triggers="props.popperTriggers"
|
|
17
|
+
:auto-hide="props.autoHide"
|
|
18
18
|
:disabled="isMultiSelectPopperDisabled"
|
|
19
19
|
:container="`#${props.id}`"
|
|
20
20
|
:strategy="
|
|
@@ -27,66 +27,26 @@
|
|
|
27
27
|
}"
|
|
28
28
|
>
|
|
29
29
|
<div ref="multiSelectRef">
|
|
30
|
-
<
|
|
31
|
-
<
|
|
32
|
-
<div :class="multiSelectClasses.
|
|
33
|
-
<div
|
|
34
|
-
<
|
|
35
|
-
<template v-
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@close="handleChippedRemoveItem(String(item.value))"
|
|
43
|
-
/>
|
|
44
|
-
</template>
|
|
45
|
-
</template>
|
|
46
|
-
<template v-else>
|
|
47
|
-
<span class="spr-placeholder spr-px-3 spr-text-gray-400">{{ props.placeholder }}</span>
|
|
48
|
-
</template>
|
|
49
|
-
</div>
|
|
50
|
-
<div :class="multiSelectClasses.chippedIconClasses">
|
|
51
|
-
<div class="spr-flex spr-items-center spr-gap-1">
|
|
52
|
-
<Icon
|
|
53
|
-
v-if="props.clearable && inputText"
|
|
54
|
-
class="spr-cursor-pointer"
|
|
55
|
-
icon="ph:x"
|
|
56
|
-
@click.stop="handleClear"
|
|
30
|
+
<template v-if="props.chipped">
|
|
31
|
+
<div :class="multiSelectClasses.chippedInputTextBaseClasses">
|
|
32
|
+
<div ref="chippedInputTextRef" :class="multiSelectClasses.chippedInputTextClasses">
|
|
33
|
+
<div class="spr-h-auto spr-w-full">
|
|
34
|
+
<template v-if="multiSelectedListItems.length > 0">
|
|
35
|
+
<template v-for="item in multiSelectedListItems" :key="item.value">
|
|
36
|
+
<spr-chips
|
|
37
|
+
class="spr-m-1 spr-inline-block"
|
|
38
|
+
:label="String(item.text)"
|
|
39
|
+
closable
|
|
40
|
+
visible
|
|
41
|
+
@close="handleChippedRemoveItem(String(item.value))"
|
|
57
42
|
/>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
<div v-if="props.displayHelper" :class="multiSelectClasses.chippedHelperContainerClasses">
|
|
64
|
-
<div v-if="props.displayHelper" :class="multiSelectClasses.chippedHelperClasses">
|
|
65
|
-
<slot name="helperMessage">
|
|
66
|
-
<Icon v-if="props.helperIcon" :icon="props.helperIcon" width="20px" height="20px" />
|
|
67
|
-
<span>{{ props.helperText }}</span>
|
|
68
|
-
</slot>
|
|
43
|
+
</template>
|
|
44
|
+
</template>
|
|
45
|
+
<template v-else>
|
|
46
|
+
<span class="spr-placeholder spr-px-3 spr-text-gray-400">{{ props.placeholder }}</span>
|
|
47
|
+
</template>
|
|
69
48
|
</div>
|
|
70
|
-
|
|
71
|
-
</template>
|
|
72
|
-
<template v-else>
|
|
73
|
-
<spr-input
|
|
74
|
-
:id="`input-${props.id}`"
|
|
75
|
-
v-model="inputText"
|
|
76
|
-
:class="{
|
|
77
|
-
'spr-cursor-pointer': true,
|
|
78
|
-
}"
|
|
79
|
-
:placeholder="props.placeholder"
|
|
80
|
-
autocomplete="off"
|
|
81
|
-
:helper-text="props.helperText"
|
|
82
|
-
:helper-icon="props.helperIcon"
|
|
83
|
-
:display-helper="props.displayHelper"
|
|
84
|
-
:active="props.active"
|
|
85
|
-
:readonly="true"
|
|
86
|
-
:disabled="props.disabled"
|
|
87
|
-
:error="props.error"
|
|
88
|
-
>
|
|
89
|
-
<template #icon>
|
|
49
|
+
<div :class="multiSelectClasses.chippedIconClasses">
|
|
90
50
|
<div class="spr-flex spr-items-center spr-gap-1">
|
|
91
51
|
<Icon
|
|
92
52
|
v-if="props.clearable && inputText"
|
|
@@ -96,21 +56,59 @@
|
|
|
96
56
|
/>
|
|
97
57
|
<Icon icon="ph:caret-down" />
|
|
98
58
|
</div>
|
|
99
|
-
</
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
<div v-if="props.displayHelper" :class="multiSelectClasses.chippedHelperContainerClasses">
|
|
63
|
+
<div v-if="props.displayHelper" :class="multiSelectClasses.chippedHelperClasses">
|
|
64
|
+
<slot name="helperMessage">
|
|
65
|
+
<Icon v-if="props.helperIcon" :icon="props.helperIcon" width="20px" height="20px" />
|
|
66
|
+
<span>{{ props.helperText }}</span>
|
|
67
|
+
</slot>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</template>
|
|
71
|
+
<template v-else>
|
|
72
|
+
<spr-input
|
|
73
|
+
:id="`input-${props.id}`"
|
|
74
|
+
v-model="inputText"
|
|
75
|
+
:class="{
|
|
76
|
+
'spr-cursor-pointer': true,
|
|
77
|
+
}"
|
|
78
|
+
:placeholder="props.placeholder"
|
|
79
|
+
autocomplete="off"
|
|
80
|
+
:helper-text="props.helperText"
|
|
81
|
+
:helper-icon="props.helperIcon"
|
|
82
|
+
:display-helper="props.displayHelper"
|
|
83
|
+
:active="props.active"
|
|
84
|
+
:readonly="true"
|
|
85
|
+
:disabled="props.disabled"
|
|
86
|
+
:error="props.error"
|
|
87
|
+
>
|
|
88
|
+
<template #icon>
|
|
89
|
+
<div class="spr-flex spr-items-center spr-gap-1">
|
|
90
|
+
<Icon
|
|
91
|
+
v-if="props.clearable && inputText"
|
|
92
|
+
class="spr-cursor-pointer"
|
|
93
|
+
icon="ph:x"
|
|
94
|
+
@click.stop="handleClear"
|
|
95
|
+
/>
|
|
96
|
+
<Icon icon="ph:caret-down" />
|
|
97
|
+
</div>
|
|
98
|
+
</template>
|
|
100
99
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
<template #helperMessage>
|
|
101
|
+
<slot name="helperMessage" />
|
|
102
|
+
</template>
|
|
103
|
+
</spr-input>
|
|
104
|
+
</template>
|
|
106
105
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
</div>
|
|
106
|
+
<!-- Hidden Select for QA automation -->
|
|
107
|
+
<select v-if="multiSelectOptions && multiSelectOptions.length" v-model="multiSelectModel" multiple hidden>
|
|
108
|
+
<option v-for="option in multiSelectOptions" :key="option.value" :value="option.value">
|
|
109
|
+
{{ option.text }}
|
|
110
|
+
</option>
|
|
111
|
+
</select>
|
|
114
112
|
|
|
115
113
|
<!-- This div used to poppulate popper menu -->
|
|
116
114
|
<div
|
|
@@ -124,7 +122,7 @@
|
|
|
124
122
|
<template #popper>
|
|
125
123
|
<div
|
|
126
124
|
ref="multipleSelectPopperRef"
|
|
127
|
-
class="spr-grid spr-max-h-[300px] spr-gap-0.5 spr-overflow-y-auto spr-overflow-x-hidden
|
|
125
|
+
class="spr-grid spr-max-h-[300px] spr-gap-0.5 spr-overflow-y-auto spr-overflow-x-hidden"
|
|
128
126
|
>
|
|
129
127
|
<spr-list
|
|
130
128
|
v-model="multiSelectedListItems"
|
|
@@ -176,6 +174,5 @@ const {
|
|
|
176
174
|
handleMultiSelectedItem,
|
|
177
175
|
handleChippedRemoveItem,
|
|
178
176
|
handleClear,
|
|
179
|
-
handleOptionsToggle,
|
|
180
177
|
} = useMultiSelect(props, emit);
|
|
181
178
|
</script>
|
|
@@ -33,7 +33,7 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
|
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
const chippedInputTextBaseClasses = classNames(
|
|
36
|
-
'spr-relative spr-flex spr-items-center spr-min-h-
|
|
36
|
+
'spr-relative spr-flex spr-items-center spr-min-h-10 spr-rounded-border-radius-md spr-border-[1.5px] spr-border-solid',
|
|
37
37
|
{
|
|
38
38
|
'spr-cursor-pointer': !disabled.value,
|
|
39
39
|
|
|
@@ -188,15 +188,6 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
|
|
|
188
188
|
multiSelectOptions.value = options.value as MenuListType[];
|
|
189
189
|
};
|
|
190
190
|
|
|
191
|
-
/**
|
|
192
|
-
* Opens the multi-select options.
|
|
193
|
-
*/
|
|
194
|
-
const handleOptionsToggle = () => {
|
|
195
|
-
multiSelectPopperState.value = !multiSelectPopperState.value;
|
|
196
|
-
|
|
197
|
-
emit('popper-state', !multiSelectPopperState.value);
|
|
198
|
-
};
|
|
199
|
-
|
|
200
191
|
/**
|
|
201
192
|
* Handles selection changes from the multi-select and updates the model value.
|
|
202
193
|
* Converts stringified objects back to objects if needed.
|
|
@@ -330,8 +321,6 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
|
|
|
330
321
|
multiSelectedListItems.value = [];
|
|
331
322
|
inputText.value = '';
|
|
332
323
|
multiSelectPopperState.value = false;
|
|
333
|
-
|
|
334
|
-
emit('popper-state', false);
|
|
335
324
|
};
|
|
336
325
|
|
|
337
326
|
watch(multiSelectModel, () => {
|
|
@@ -360,6 +349,10 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
|
|
|
360
349
|
search.value = searchInput.value;
|
|
361
350
|
});
|
|
362
351
|
|
|
352
|
+
watch(multiSelectPopperState, (newState) => {
|
|
353
|
+
emit('popper-state', newState);
|
|
354
|
+
});
|
|
355
|
+
|
|
363
356
|
/**
|
|
364
357
|
* Handles closing the multi-select when clicking outside.
|
|
365
358
|
*/
|
|
@@ -367,8 +360,6 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
|
|
|
367
360
|
multiSelectPopperState.value = false;
|
|
368
361
|
|
|
369
362
|
updateMultiSelectedItemsFromValue();
|
|
370
|
-
|
|
371
|
-
emit('popper-state', false);
|
|
372
363
|
});
|
|
373
364
|
|
|
374
365
|
useInfiniteScroll(
|
|
@@ -404,6 +395,5 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
|
|
|
404
395
|
handleMultiSelectedItem,
|
|
405
396
|
handleChippedRemoveItem,
|
|
406
397
|
handleClear,
|
|
407
|
-
handleOptionsToggle,
|
|
408
398
|
};
|
|
409
399
|
};
|
|
@@ -24,6 +24,7 @@ const PLACEMENTS_TYPES = [
|
|
|
24
24
|
] as const;
|
|
25
25
|
|
|
26
26
|
const POPPER_STRATEGY_TYPES = ['fixed', 'absolute'] as const;
|
|
27
|
+
const TRIGGER_EVENTS = ['click', 'hover', 'focus', 'touch'] as const;
|
|
27
28
|
|
|
28
29
|
export const selectPropTypes = {
|
|
29
30
|
id: {
|
|
@@ -74,6 +75,24 @@ export const selectPropTypes = {
|
|
|
74
75
|
validator: (value: (typeof PLACEMENTS_TYPES)[number]) => PLACEMENTS_TYPES.includes(value),
|
|
75
76
|
default: 'bottom',
|
|
76
77
|
},
|
|
78
|
+
triggers: {
|
|
79
|
+
type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
|
|
80
|
+
validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
|
|
81
|
+
return value.every((val) => TRIGGER_EVENTS.includes(val));
|
|
82
|
+
},
|
|
83
|
+
default: () => ['click'],
|
|
84
|
+
},
|
|
85
|
+
popperTriggers: {
|
|
86
|
+
type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
|
|
87
|
+
validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
|
|
88
|
+
return value.every((val) => TRIGGER_EVENTS.includes(val));
|
|
89
|
+
},
|
|
90
|
+
default: () => [],
|
|
91
|
+
},
|
|
92
|
+
autoHide: {
|
|
93
|
+
type: Boolean,
|
|
94
|
+
default: true,
|
|
95
|
+
},
|
|
77
96
|
popperStrategy: {
|
|
78
97
|
type: String,
|
|
79
98
|
validator: (value: 'fixed' | 'absolute') => POPPER_STRATEGY_TYPES.includes(value),
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
</label>
|
|
9
9
|
|
|
10
10
|
<Menu
|
|
11
|
-
:shown="selectPopperState"
|
|
11
|
+
v-model:shown="selectPopperState"
|
|
12
12
|
aria-id="select-wrapper"
|
|
13
13
|
distance="4"
|
|
14
14
|
:placement="props.placement"
|
|
15
|
-
:triggers="
|
|
16
|
-
:popper-
|
|
17
|
-
:auto-hide="
|
|
15
|
+
:triggers="props.triggers"
|
|
16
|
+
:popper-triggers="props.popperTriggers"
|
|
17
|
+
:auto-hide="props.autoHide"
|
|
18
18
|
:disabled="isSelectPopperDisabled"
|
|
19
19
|
:container="`#${props.id}`"
|
|
20
20
|
:strategy="
|
|
@@ -27,55 +27,53 @@
|
|
|
27
27
|
}"
|
|
28
28
|
>
|
|
29
29
|
<div ref="selectRef">
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
>
|
|
48
|
-
<
|
|
49
|
-
<
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
</template>
|
|
30
|
+
<spr-input
|
|
31
|
+
:id="`input-${props.id}`"
|
|
32
|
+
v-model="inputText"
|
|
33
|
+
:class="{
|
|
34
|
+
'spr-cursor-pointer': !props.searchable,
|
|
35
|
+
}"
|
|
36
|
+
:placeholder="props.placeholder"
|
|
37
|
+
autocomplete="off"
|
|
38
|
+
:helper-text="props.helperText"
|
|
39
|
+
:helper-icon="props.helperIcon"
|
|
40
|
+
:display-helper="props.displayHelper"
|
|
41
|
+
:active="props.active"
|
|
42
|
+
:readonly="!props.searchable"
|
|
43
|
+
:disabled="props.disabled"
|
|
44
|
+
:error="props.error"
|
|
45
|
+
@keyup="handleSearch"
|
|
46
|
+
>
|
|
47
|
+
<template #icon>
|
|
48
|
+
<div class="spr-flex spr-cursor-pointer spr-items-center">
|
|
49
|
+
<Icon
|
|
50
|
+
v-if="props.clearable && inputText"
|
|
51
|
+
class="spr-cursor-pointer"
|
|
52
|
+
icon="ph:x"
|
|
53
|
+
@click.stop="handleClear"
|
|
54
|
+
/>
|
|
55
|
+
<Icon icon="ph:caret-down" />
|
|
56
|
+
</div>
|
|
57
|
+
</template>
|
|
59
58
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
<template #helperMessage>
|
|
60
|
+
<slot name="helperMessage" />
|
|
61
|
+
</template>
|
|
62
|
+
</spr-input>
|
|
64
63
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
</div>
|
|
64
|
+
<!-- Hidden Select for QA automation -->
|
|
65
|
+
<select
|
|
66
|
+
v-if="selectOptions && selectOptions.length"
|
|
67
|
+
:value="Array.isArray(selectModel) ? selectModel[0] : selectModel"
|
|
68
|
+
data-testid="qa-hidden-select"
|
|
69
|
+
tabindex="-1"
|
|
70
|
+
aria-hidden="true"
|
|
71
|
+
hidden
|
|
72
|
+
>
|
|
73
|
+
<option v-for="item in selectOptions" :key="item.value" :value="item.value">
|
|
74
|
+
{{ item.text }}
|
|
75
|
+
</option>
|
|
76
|
+
</select>
|
|
79
77
|
|
|
80
78
|
<!-- This div used to poppulate popper menu -->
|
|
81
79
|
<div
|
|
@@ -89,7 +87,7 @@
|
|
|
89
87
|
<template #popper>
|
|
90
88
|
<div
|
|
91
89
|
ref="selectPopperRef"
|
|
92
|
-
class="spr-grid spr-max-h-[300px] spr-gap-0.5 spr-overflow-y-auto spr-overflow-x-hidden
|
|
90
|
+
class="spr-grid spr-max-h-[300px] spr-gap-0.5 spr-overflow-y-auto spr-overflow-x-hidden"
|
|
93
91
|
>
|
|
94
92
|
<template v-if="isSearching">
|
|
95
93
|
<template v-if="!props.disabledLocalSearch">
|
|
@@ -178,6 +176,5 @@ const {
|
|
|
178
176
|
handleSelectedItem,
|
|
179
177
|
handleSearch,
|
|
180
178
|
handleClear,
|
|
181
|
-
handleOptionsToggle,
|
|
182
179
|
} = useSelect(props, emit);
|
|
183
180
|
</script>
|
|
@@ -159,15 +159,6 @@ export const useSelect = (props: SelectPropTypes, emit: SetupContext<SelectEmitT
|
|
|
159
159
|
emit('search-string', inputText.value);
|
|
160
160
|
}, 300);
|
|
161
161
|
|
|
162
|
-
// Toggle options popper state
|
|
163
|
-
const handleOptionsToggle = () => {
|
|
164
|
-
selectPopperState.value = !selectPopperState.value;
|
|
165
|
-
|
|
166
|
-
isSearching.value = false;
|
|
167
|
-
|
|
168
|
-
emit('popper-state', !selectPopperState.value);
|
|
169
|
-
};
|
|
170
|
-
|
|
171
162
|
// Handle selected item for simple list component
|
|
172
163
|
const handleSelectedItem = (selectedItems: MenuListType[]) => {
|
|
173
164
|
if (selectedItems.length === 0) {
|
|
@@ -207,7 +198,6 @@ export const useSelect = (props: SelectPropTypes, emit: SetupContext<SelectEmitT
|
|
|
207
198
|
// Always close select for single selection
|
|
208
199
|
setTimeout(() => {
|
|
209
200
|
selectPopperState.value = false;
|
|
210
|
-
emit('popper-state', false);
|
|
211
201
|
}, 10);
|
|
212
202
|
};
|
|
213
203
|
|
|
@@ -332,6 +322,10 @@ export const useSelect = (props: SelectPropTypes, emit: SetupContext<SelectEmitT
|
|
|
332
322
|
{ deep: true },
|
|
333
323
|
);
|
|
334
324
|
|
|
325
|
+
watch(selectPopperState, (newState) => {
|
|
326
|
+
emit('popper-state', newState);
|
|
327
|
+
});
|
|
328
|
+
|
|
335
329
|
onClickOutside(selectRef, () => {
|
|
336
330
|
selectPopperState.value = false;
|
|
337
331
|
|
|
@@ -341,8 +335,6 @@ export const useSelect = (props: SelectPropTypes, emit: SetupContext<SelectEmitT
|
|
|
341
335
|
}
|
|
342
336
|
|
|
343
337
|
isSearching.value = false;
|
|
344
|
-
|
|
345
|
-
emit('popper-state', false);
|
|
346
338
|
});
|
|
347
339
|
|
|
348
340
|
useInfiniteScroll(
|
|
@@ -377,7 +369,6 @@ export const useSelect = (props: SelectPropTypes, emit: SetupContext<SelectEmitT
|
|
|
377
369
|
inputText,
|
|
378
370
|
isSelectPopperDisabled,
|
|
379
371
|
isSearching,
|
|
380
|
-
handleOptionsToggle,
|
|
381
372
|
handleSelectedItem,
|
|
382
373
|
handleSearch,
|
|
383
374
|
handleClear,
|
|
@@ -37,9 +37,13 @@ export const useSidenav = (props: SidenavPropTypes, emit: SetupContext<SidenavEm
|
|
|
37
37
|
const handleRedirect = (objectItem: ObjectItem, parentNav: string, menu: string, submenu: string) => {
|
|
38
38
|
if (objectItem && objectItem.redirect) {
|
|
39
39
|
if (objectItem.redirect.openInNewTab) {
|
|
40
|
-
|
|
40
|
+
if (typeof window !== 'undefined') {
|
|
41
|
+
window.open(objectItem.redirect.link, '_blank');
|
|
42
|
+
}
|
|
41
43
|
} else if (objectItem.redirect.isAbsoluteURL) {
|
|
42
|
-
location
|
|
44
|
+
if (typeof window !== 'undefined' && typeof location !== 'undefined') {
|
|
45
|
+
location.href = objectItem.redirect.link;
|
|
46
|
+
}
|
|
43
47
|
} else {
|
|
44
48
|
const modifiedObjectItem = { ...objectItem };
|
|
45
49
|
|
|
@@ -72,9 +76,12 @@ export const useSidenav = (props: SidenavPropTypes, emit: SetupContext<SidenavEm
|
|
|
72
76
|
};
|
|
73
77
|
|
|
74
78
|
const confirmIfOwnDomain = (url: string) => {
|
|
79
|
+
// Guard against SSR where location is undefined
|
|
80
|
+
if (typeof window === 'undefined') return false;
|
|
81
|
+
|
|
75
82
|
const domain = window.location.hostname;
|
|
76
83
|
const urlHostname = new URL(url).hostname;
|
|
77
|
-
const isOwnDomain = domain === urlHostname ||
|
|
84
|
+
const isOwnDomain = domain === urlHostname || domain === 'localhost';
|
|
78
85
|
|
|
79
86
|
return isOwnDomain;
|
|
80
87
|
};
|
|
@@ -36,7 +36,7 @@ export const useTablePagination = (
|
|
|
36
36
|
'!spr-w-max [&_.dropdown-slot_div_div]:spr-border-color-base [&_.dropdown-slot_div_div]:spr-p-0'
|
|
37
37
|
);
|
|
38
38
|
|
|
39
|
-
const dropdownInputFieldClass = classNames('spr-max-w-[120px] spr-min-w-[48px] spr-h-full spr-font-
|
|
39
|
+
const dropdownInputFieldClass = classNames('spr-max-w-[120px] spr-min-w-[48px] spr-h-full spr-font-medium [&_input]:spr-py-size-spacing-3xs [&_input]:spr-pr-size-spacing-5xs');
|
|
40
40
|
const inputFieldIconClass = classNames('spr-text-mushroom-950 spr-pr-size-spacing-3xs spr-box-content');
|
|
41
41
|
const rightSideClass = classNames(
|
|
42
42
|
'spr-flex spr-justify-between spr-items-center',
|
|
@@ -48,6 +48,25 @@ interface SortEvent {
|
|
|
48
48
|
sortOrder: TABLE_SORT;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
export interface DragOnChangeEvent {
|
|
52
|
+
added?: DragOnChangeAddedProperties;
|
|
53
|
+
removed?: DragOnChangeRemovedProperties;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface DragOnChangeAddedProperties {
|
|
57
|
+
element: TableData;
|
|
58
|
+
newIndex: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface DragOnChangeRemovedProperties {
|
|
62
|
+
element: TableData;
|
|
63
|
+
oldIndex: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface DragOnChangeEmit extends DragOnChangeEvent {
|
|
67
|
+
updatedList: TableData[];
|
|
68
|
+
}
|
|
69
|
+
|
|
51
70
|
const TABLE_SORT = ['asc', 'desc'] as const;
|
|
52
71
|
const TABLE_VARIANT = ['surface', 'white'] as const;
|
|
53
72
|
export type TABLE_SORT = (typeof TABLE_SORT)[number];
|
|
@@ -86,11 +105,11 @@ export const tablePropTypes = {
|
|
|
86
105
|
},
|
|
87
106
|
emptyStateCustomClasses: {
|
|
88
107
|
type: String,
|
|
89
|
-
default: ''
|
|
108
|
+
default: '',
|
|
90
109
|
},
|
|
91
110
|
tableActionSlotCustomClasses: {
|
|
92
111
|
type: String,
|
|
93
|
-
default: ''
|
|
112
|
+
default: '',
|
|
94
113
|
},
|
|
95
114
|
loading: {
|
|
96
115
|
type: Boolean as PropType<boolean>,
|
|
@@ -121,7 +140,7 @@ export const tablePropTypes = {
|
|
|
121
140
|
sortOrder: {
|
|
122
141
|
type: String as PropType<(typeof TABLE_SORT)[number]>,
|
|
123
142
|
validator: (value: (typeof TABLE_SORT)[number]) => TABLE_SORT.includes(value),
|
|
124
|
-
default: 'asc'
|
|
143
|
+
default: 'asc',
|
|
125
144
|
},
|
|
126
145
|
|
|
127
146
|
variant: {
|
|
@@ -154,6 +173,14 @@ export const tablePropTypes = {
|
|
|
154
173
|
type: Boolean,
|
|
155
174
|
default: false,
|
|
156
175
|
},
|
|
176
|
+
allowSelfDrag: {
|
|
177
|
+
type: Boolean,
|
|
178
|
+
default: false,
|
|
179
|
+
},
|
|
180
|
+
isDraggable: {
|
|
181
|
+
type: Boolean,
|
|
182
|
+
default: false,
|
|
183
|
+
}
|
|
157
184
|
};
|
|
158
185
|
|
|
159
186
|
export const tableEmitTypes = {
|
|
@@ -169,6 +196,9 @@ export const tableEmitTypes = {
|
|
|
169
196
|
value.every(
|
|
170
197
|
(item) => (typeof item === 'object' || typeof item === 'string' || typeof item === 'number') && item !== null,
|
|
171
198
|
),
|
|
199
|
+
onDropToEmptyZone: (event: DragOnChangeEvent['added']): event is DragOnChangeEvent['added'] => event !== undefined,
|
|
200
|
+
onDragChange: (event: DragOnChangeEmit): event is DragOnChangeEmit =>
|
|
201
|
+
event !== undefined && Array.isArray(event.updatedList),
|
|
172
202
|
};
|
|
173
203
|
|
|
174
204
|
export type TablePropTypes = ExtractPropTypes<typeof tablePropTypes>;
|