design-system-next 2.7.29 → 2.7.31
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.js +4140 -3983
- package/dist/design-system-next.js.gz +0 -0
- package/dist/main.css +1 -1
- package/dist/main.css.gz +0 -0
- package/package.json +1 -1
- package/src/App.vue +1 -47
- package/src/components/file-upload/file-upload.ts +13 -0
- package/src/components/file-upload/file-upload.vue +14 -8
- package/src/components/file-upload/use-file-upload.ts +6 -3
- package/src/components/list/ladderized-list/ladderized-list-back.vue +8 -10
- package/src/components/list/ladderized-list/ladderized-list.ts +1 -1
- package/src/components/list/ladderized-list/ladderized-list.vue +28 -6
- package/src/components/list/ladderized-list/use-ladderized-list.ts +40 -37
- package/src/components/list/use-list.ts +22 -15
- package/src/components/switch/switch.vue +14 -4
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
|
-
class="
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
spr-cursor-pointer
|
|
9
|
-
"
|
|
3
|
+
:class="[
|
|
4
|
+
'spr-flex spr-cursor-pointer spr-items-center spr-gap-size-spacing-5xs spr-px-size-spacing-xs spr-py-size-spacing-2xs',
|
|
5
|
+
'spr-body-xs-regular',
|
|
6
|
+
'spr-border-color-weak spr-border-0 spr-border-b spr-border-solid',
|
|
7
|
+
]"
|
|
10
8
|
@click="handleBackClick"
|
|
11
9
|
>
|
|
12
10
|
<Icon icon="ph:arrow-left" class="spr-size-4" />
|
|
@@ -20,15 +18,15 @@ import { Icon } from '@iconify/vue';
|
|
|
20
18
|
const props = defineProps({
|
|
21
19
|
label: {
|
|
22
20
|
type: String,
|
|
23
|
-
default:
|
|
21
|
+
default: 'Back',
|
|
24
22
|
},
|
|
25
23
|
});
|
|
26
24
|
|
|
27
25
|
const emit = defineEmits({
|
|
28
|
-
back: () => true
|
|
26
|
+
back: () => true,
|
|
29
27
|
});
|
|
30
28
|
|
|
31
29
|
const handleBackClick = () => {
|
|
32
|
-
emit(
|
|
30
|
+
emit('back');
|
|
33
31
|
};
|
|
34
32
|
</script>
|
|
@@ -3,12 +3,26 @@
|
|
|
3
3
|
<transition :name="transitionName" mode="out-in">
|
|
4
4
|
<div v-if="activeLevel % 2 === 0">
|
|
5
5
|
<spr-ladderized-list-back v-if="activeLevel > 0" :label="backLabel ?? 'Back'" @back="handleBackClick" />
|
|
6
|
-
<spr-list
|
|
6
|
+
<spr-list
|
|
7
|
+
v-model="selectedListItem"
|
|
8
|
+
class="spr-p-size-spacing-3xs"
|
|
9
|
+
:menu-list="activeList"
|
|
10
|
+
:multi-select="false"
|
|
11
|
+
:ladderized="true"
|
|
12
|
+
@update:model-value="(value) => handleSelectedListItem(value[0])"
|
|
13
|
+
/>
|
|
7
14
|
</div>
|
|
8
|
-
|
|
15
|
+
|
|
9
16
|
<div v-else>
|
|
10
17
|
<spr-ladderized-list-back v-if="activeLevel > 0" :label="backLabel ?? 'Back'" @back="handleBackClick" />
|
|
11
|
-
<spr-list
|
|
18
|
+
<spr-list
|
|
19
|
+
v-model="selectedListItem"
|
|
20
|
+
class="spr-p-size-spacing-3xs"
|
|
21
|
+
:menu-list="activeList"
|
|
22
|
+
:multi-select="false"
|
|
23
|
+
:ladderized="true"
|
|
24
|
+
@update:model-value="(value) => handleSelectedListItem(value[0])"
|
|
25
|
+
/>
|
|
12
26
|
</div>
|
|
13
27
|
</transition>
|
|
14
28
|
</div>
|
|
@@ -16,6 +30,7 @@
|
|
|
16
30
|
|
|
17
31
|
<script setup lang="ts">
|
|
18
32
|
import SprList from '@/components/list/list.vue';
|
|
33
|
+
|
|
19
34
|
import { ladderizedListPropTypes, ladderizedListEmitTypes } from './ladderized-list';
|
|
20
35
|
import { useLadderizedList } from './use-ladderized-list';
|
|
21
36
|
import SprLadderizedListBack from './ladderized-list-back.vue';
|
|
@@ -23,8 +38,15 @@ import SprLadderizedListBack from './ladderized-list-back.vue';
|
|
|
23
38
|
const props = defineProps(ladderizedListPropTypes);
|
|
24
39
|
const emit = defineEmits(ladderizedListEmitTypes);
|
|
25
40
|
|
|
26
|
-
const {
|
|
27
|
-
|
|
41
|
+
const {
|
|
42
|
+
activeLevel,
|
|
43
|
+
selectedListItem,
|
|
44
|
+
handleSelectedListItem,
|
|
45
|
+
activeList,
|
|
46
|
+
handleBackClick,
|
|
47
|
+
transitionName,
|
|
48
|
+
backLabel,
|
|
49
|
+
} = useLadderizedList(props, emit);
|
|
28
50
|
</script>
|
|
29
51
|
|
|
30
52
|
<style scoped>
|
|
@@ -32,7 +54,7 @@ const { activeLevel, selectedListItem, handleSelectedListItem, activeList, handl
|
|
|
32
54
|
.slide-left-leave-active,
|
|
33
55
|
.slide-right-enter-active,
|
|
34
56
|
.slide-right-leave-active {
|
|
35
|
-
transition: all
|
|
57
|
+
transition: all 150ms ease-out;
|
|
36
58
|
}
|
|
37
59
|
|
|
38
60
|
.slide-left-enter-from,
|
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
import { computed, onBeforeMount, ref, toRefs } from 'vue';
|
|
2
|
+
import { useVModel } from '@vueuse/core';
|
|
3
|
+
|
|
4
|
+
import { LadderizedListPropTypes, LadderizedListEmitTypes } from './ladderized-list';
|
|
5
|
+
|
|
2
6
|
import type { SetupContext } from 'vue';
|
|
3
7
|
import type { MenuListType } from '../list';
|
|
4
|
-
import { LadderizedListPropTypes, LadderizedListEmitTypes } from './ladderized-list';
|
|
5
|
-
import { useVModel } from '@vueuse/core'
|
|
6
8
|
|
|
7
|
-
export const useLadderizedList = (
|
|
9
|
+
export const useLadderizedList = (
|
|
10
|
+
props: LadderizedListPropTypes,
|
|
11
|
+
emit: SetupContext<LadderizedListEmitTypes>['emit'],
|
|
12
|
+
) => {
|
|
8
13
|
const ladderizedListOutput = useVModel(props, 'modelValue', emit); // List of items for v-model
|
|
9
14
|
const { menuList, removeCurrentLevelInBackLabel } = toRefs(props);
|
|
10
|
-
const transitionName = ref(
|
|
11
|
-
const backLabel = ref(
|
|
12
|
-
|
|
15
|
+
const transitionName = ref('slide-left');
|
|
16
|
+
const backLabel = ref('');
|
|
17
|
+
|
|
13
18
|
// Variables used for internal logic
|
|
14
19
|
const selectedListItem = ref<MenuListType[]>([]); // List of items for recording the selected item
|
|
15
20
|
const activeLevel = ref(0);
|
|
16
|
-
const activeList =
|
|
21
|
+
const activeList = ref<MenuListType[]>(menuList.value); // List of items to display in the active level
|
|
17
22
|
const prevList = ref<MenuListType[]>([]);
|
|
18
23
|
|
|
19
24
|
const handleSelectedListItem = (item: MenuListType) => {
|
|
20
|
-
transitionName.value =
|
|
25
|
+
transitionName.value = 'slide-left';
|
|
21
26
|
// Update UI for selectedListItem
|
|
22
27
|
updateSelectedListItem(item);
|
|
23
28
|
|
|
24
|
-
const isSameLevel = computed(() => prevList.value.some(listItem => listItem.value === item.value));
|
|
29
|
+
const isSameLevel = computed(() => prevList.value.some((listItem) => listItem.value === item.value));
|
|
25
30
|
|
|
26
31
|
// Update the activeList and activeLevel
|
|
27
32
|
if (!isSameLevel.value) {
|
|
@@ -29,27 +34,27 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
|
|
|
29
34
|
} else {
|
|
30
35
|
replaceItemInOutput(item);
|
|
31
36
|
}
|
|
32
|
-
|
|
37
|
+
|
|
33
38
|
if (item.sublevel && item.sublevel.length > 0) updateLevel(item);
|
|
34
39
|
// Update output value
|
|
35
|
-
emit(
|
|
40
|
+
emit('update:modelValue', ladderizedListOutput.value);
|
|
36
41
|
};
|
|
37
42
|
|
|
38
43
|
// Update UI display for selectedListItem
|
|
39
44
|
const updateSelectedListItem = (item: MenuListType) => {
|
|
40
|
-
if(selectedListItem.value[activeLevel.value]) {
|
|
45
|
+
if (selectedListItem.value[activeLevel.value]) {
|
|
41
46
|
selectedListItem.value[activeLevel.value] = item;
|
|
42
47
|
} else {
|
|
43
48
|
selectedListItem.value.push(item);
|
|
44
49
|
}
|
|
45
|
-
}
|
|
50
|
+
};
|
|
46
51
|
|
|
47
52
|
// Update the activeList, prevList and activeLevel
|
|
48
53
|
const updateLevel = (item: MenuListType) => {
|
|
49
54
|
activeLevel.value += 1;
|
|
50
55
|
prevList.value = activeList.value;
|
|
51
56
|
activeList.value = item.sublevel ?? activeList.value;
|
|
52
|
-
}
|
|
57
|
+
};
|
|
53
58
|
|
|
54
59
|
// Append the new item to the output
|
|
55
60
|
const appendItemToOutput = (item: MenuListType) => {
|
|
@@ -57,41 +62,41 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
|
|
|
57
62
|
if (ladderizedListOutput.value[ladderizedListOutput.value.length - 1] === item.value) return;
|
|
58
63
|
|
|
59
64
|
// Update back label text
|
|
60
|
-
if (backLabel.value !==
|
|
61
|
-
const textArray = backLabel.value.split(
|
|
65
|
+
if (backLabel.value !== '') {
|
|
66
|
+
const textArray = backLabel.value.split(', ');
|
|
62
67
|
textArray?.push(item.text);
|
|
63
|
-
backLabel.value = textArray?.join(
|
|
68
|
+
backLabel.value = textArray?.join(', ') ?? '';
|
|
64
69
|
} else {
|
|
65
70
|
backLabel.value = item.text;
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
// Update output value
|
|
69
74
|
ladderizedListOutput.value.push(item.value.toString());
|
|
70
|
-
}
|
|
75
|
+
};
|
|
71
76
|
|
|
72
77
|
// Replace the last item in the output with the new item
|
|
73
78
|
const replaceItemInOutput = (item: MenuListType) => {
|
|
74
79
|
// Update back label text
|
|
75
|
-
const textArray = backLabel.value.trim().split(
|
|
80
|
+
const textArray = backLabel.value.trim().split(',');
|
|
76
81
|
textArray?.pop();
|
|
77
82
|
textArray?.push(item.text);
|
|
78
|
-
backLabel.value = textArray?.join(
|
|
83
|
+
backLabel.value = textArray?.join(', ') ?? '';
|
|
79
84
|
|
|
80
85
|
// Update output value
|
|
81
86
|
const valueArray = ladderizedListOutput.value;
|
|
82
87
|
valueArray?.pop();
|
|
83
88
|
valueArray?.push(item.value);
|
|
84
89
|
ladderizedListOutput.value = valueArray ?? [];
|
|
85
|
-
}
|
|
90
|
+
};
|
|
86
91
|
|
|
87
92
|
const handleBackClick = () => {
|
|
88
|
-
transitionName.value =
|
|
93
|
+
transitionName.value = 'slide-right';
|
|
89
94
|
activeLevel.value -= 1;
|
|
90
95
|
if (activeLevel.value > 0) {
|
|
91
96
|
// Update back label text
|
|
92
|
-
const textArray = backLabel.value.trim().split(
|
|
97
|
+
const textArray = backLabel.value.trim().split(',');
|
|
93
98
|
textArray?.pop();
|
|
94
|
-
backLabel.value = textArray?.join(
|
|
99
|
+
backLabel.value = textArray?.join(', ') ?? '';
|
|
95
100
|
// Update output value
|
|
96
101
|
const valueArray = ladderizedListOutput.value;
|
|
97
102
|
valueArray?.pop();
|
|
@@ -99,13 +104,13 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
|
|
|
99
104
|
|
|
100
105
|
// Get previous activeList from menuList
|
|
101
106
|
for (let i = 0; i < activeLevel.value; i++) {
|
|
102
|
-
activeList.value = props.menuList.find(item => item.value === ladderizedListOutput.value[i])?.sublevel ?? [];
|
|
107
|
+
activeList.value = props.menuList.find((item) => item.value === ladderizedListOutput.value[i])?.sublevel ?? [];
|
|
103
108
|
}
|
|
104
109
|
} else {
|
|
105
110
|
// Reset values
|
|
106
111
|
activeList.value = props.menuList;
|
|
107
112
|
ladderizedListOutput.value = [];
|
|
108
|
-
backLabel.value =
|
|
113
|
+
backLabel.value = '';
|
|
109
114
|
activeLevel.value = 0;
|
|
110
115
|
}
|
|
111
116
|
};
|
|
@@ -118,9 +123,7 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
|
|
|
118
123
|
|
|
119
124
|
// On initialize, traverse through the activeList based from ladderizedListOutput
|
|
120
125
|
ladderizedListOutput.value.forEach((preSelectedItem: string) => {
|
|
121
|
-
const item = activeList.value.find(
|
|
122
|
-
(menuItem) => String(menuItem.value) === String(preSelectedItem),
|
|
123
|
-
);
|
|
126
|
+
const item = activeList.value.find((menuItem) => String(menuItem.value) === String(preSelectedItem));
|
|
124
127
|
|
|
125
128
|
if (item) {
|
|
126
129
|
updateSelectedListItem(item);
|
|
@@ -134,12 +137,12 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
|
|
|
134
137
|
}
|
|
135
138
|
});
|
|
136
139
|
|
|
137
|
-
if(removeCurrentLevelInBackLabel.value && tempBackLabel.length > 0) {
|
|
140
|
+
if (removeCurrentLevelInBackLabel.value && tempBackLabel.length > 0) {
|
|
138
141
|
tempBackLabel.pop();
|
|
139
142
|
}
|
|
140
143
|
|
|
141
144
|
// Update back label text
|
|
142
|
-
backLabel.value = tempBackLabel.length > 0 ? tempBackLabel.join(
|
|
145
|
+
backLabel.value = tempBackLabel.length > 0 ? tempBackLabel.join(', ') : 'Back';
|
|
143
146
|
}
|
|
144
147
|
};
|
|
145
148
|
|
|
@@ -148,12 +151,12 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
|
|
|
148
151
|
initializeMenuList();
|
|
149
152
|
});
|
|
150
153
|
|
|
151
|
-
return {
|
|
152
|
-
activeLevel,
|
|
153
|
-
activeList,
|
|
154
|
-
handleSelectedListItem,
|
|
155
|
-
handleBackClick,
|
|
156
|
-
selectedListItem,
|
|
154
|
+
return {
|
|
155
|
+
activeLevel,
|
|
156
|
+
activeList,
|
|
157
|
+
handleSelectedListItem,
|
|
158
|
+
handleBackClick,
|
|
159
|
+
selectedListItem,
|
|
157
160
|
transitionName,
|
|
158
161
|
backLabel,
|
|
159
162
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ref, toRefs, computed, ComputedRef, watch, onMounted } from 'vue';
|
|
2
|
+
import { useVModel } from '@vueuse/core';
|
|
3
|
+
|
|
2
4
|
import classNames from 'classnames';
|
|
5
|
+
|
|
3
6
|
import type { SetupContext } from 'vue';
|
|
4
7
|
import type { ListPropTypes, ListEmitTypes, MenuListType, GroupedMenuListType } from './list';
|
|
5
|
-
import { useVModel } from '@vueuse/core';
|
|
6
8
|
|
|
7
9
|
interface ListClasses {
|
|
8
10
|
listItemClasses: string;
|
|
@@ -91,20 +93,25 @@ export const useList = (props: ListPropTypes, emit: SetupContext<ListEmitTypes>[
|
|
|
91
93
|
};
|
|
92
94
|
|
|
93
95
|
const setPreSelectedItems = () => {
|
|
94
|
-
if (preSelectedItems.value
|
|
95
|
-
preSelectedItems.value.forEach((preSelectedItem: string) => {
|
|
96
|
-
const alreadySelected = selectedItems.value.some(
|
|
97
|
-
(selectedItem) => String(selectedItem.value) === String(preSelectedItem),
|
|
98
|
-
);
|
|
96
|
+
if (!preSelectedItems.value?.length) return;
|
|
99
97
|
|
|
100
|
-
|
|
98
|
+
const selected = preSelectedItems.value
|
|
99
|
+
.map((preSelectedItem: string) =>
|
|
100
|
+
localizedMenuList.value.find((menuItem) => String(menuItem.value) === String(preSelectedItem)),
|
|
101
|
+
)
|
|
102
|
+
.filter(Boolean) as MenuListType[];
|
|
101
103
|
|
|
102
|
-
|
|
104
|
+
if (multiSelect.value) {
|
|
105
|
+
selectedItems.value = selected;
|
|
106
|
+
} else {
|
|
107
|
+
const firstItem = selected[0];
|
|
103
108
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
if (
|
|
110
|
+
firstItem &&
|
|
111
|
+
!selectedItems.value.some((selectedItem) => String(selectedItem.value) === String(firstItem.value))
|
|
112
|
+
) {
|
|
113
|
+
selectedItems.value = [firstItem];
|
|
114
|
+
}
|
|
108
115
|
}
|
|
109
116
|
};
|
|
110
117
|
|
|
@@ -114,9 +121,7 @@ export const useList = (props: ListPropTypes, emit: SetupContext<ListEmitTypes>[
|
|
|
114
121
|
});
|
|
115
122
|
|
|
116
123
|
const handleSelectedItem = (item: MenuListType) => {
|
|
117
|
-
if (
|
|
118
|
-
selectedItems.value = [item];
|
|
119
|
-
} else {
|
|
124
|
+
if (multiSelect.value) {
|
|
120
125
|
const index = selectedItems.value.findIndex((selectedItem: MenuListType) => selectedItem.value === item.value);
|
|
121
126
|
|
|
122
127
|
if (index === -1) {
|
|
@@ -127,6 +132,8 @@ export const useList = (props: ListPropTypes, emit: SetupContext<ListEmitTypes>[
|
|
|
127
132
|
updatedItems.splice(index, 1);
|
|
128
133
|
selectedItems.value = updatedItems;
|
|
129
134
|
}
|
|
135
|
+
} else {
|
|
136
|
+
selectedItems.value = [item];
|
|
130
137
|
}
|
|
131
138
|
};
|
|
132
139
|
// #endregion - Helper Methods
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
}"
|
|
14
14
|
>
|
|
15
15
|
<input
|
|
16
|
+
:id="defaultId"
|
|
16
17
|
ref="switchRef"
|
|
17
18
|
v-model="proxyValue"
|
|
18
19
|
type="checkbox"
|
|
19
|
-
:id="defaultId"
|
|
20
20
|
name="checkbox"
|
|
21
21
|
:class="[
|
|
22
22
|
'input spr-absolute spr-left-0 spr-top-0 spr-z-10 spr-m-0 spr-h-6 spr-w-12 spr-opacity-0',
|
|
@@ -46,12 +46,22 @@ import { useSwitch } from './use-switch';
|
|
|
46
46
|
const props = defineProps(switchPropTypes);
|
|
47
47
|
const emit = defineEmits(switchEmitTypes);
|
|
48
48
|
|
|
49
|
-
const defaultId = props.id
|
|
49
|
+
const defaultId = props.id
|
|
50
|
+
? props.id + '_' + Math.random().toString(36).substring(2, 8)
|
|
51
|
+
: 'switch_input_' + Math.random().toString(36).substring(2, 8);
|
|
50
52
|
|
|
51
53
|
const proxyValue = useVModel(props, 'modelValue', emit);
|
|
52
54
|
|
|
53
|
-
const {
|
|
54
|
-
|
|
55
|
+
const {
|
|
56
|
+
switchWrapperRef,
|
|
57
|
+
switchRef,
|
|
58
|
+
switchProps,
|
|
59
|
+
switchMarkClass,
|
|
60
|
+
switchTextClass,
|
|
61
|
+
switchInputClass,
|
|
62
|
+
isLeftTextLabel,
|
|
63
|
+
isRightTextLabel,
|
|
64
|
+
} = useSwitch(props);
|
|
55
65
|
</script>
|
|
56
66
|
|
|
57
67
|
<style lang="scss" scoped>
|