design-system-next 2.11.11 → 2.11.17
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 +9372 -8159
- package/dist/design-system-next.es.js.gz +0 -0
- package/dist/design-system-next.umd.js +12 -12
- 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 +1 -1
- package/package.json +1 -1
- package/src/assets/scripts/border-radius.ts +15 -15
- package/src/assets/scripts/colors.ts +134 -134
- package/src/assets/scripts/max-width.ts +11 -11
- package/src/assets/scripts/spacing.ts +23 -23
- package/src/assets/scripts/utilities.ts +15 -15
- package/src/assets/styles/tailwind.css +20 -0
- package/src/components/accordion/accordion.ts +43 -43
- package/src/components/accordion/use-accordion.ts +43 -43
- package/src/components/avatar/avatar.ts +64 -64
- package/src/components/badge/badge.ts +43 -43
- package/src/components/banner/banner.ts +20 -20
- package/src/components/button/button.ts +72 -72
- package/src/components/button/button.vue +15 -15
- package/src/components/calendar/calendar.ts +89 -89
- package/src/components/card/card.ts +52 -52
- package/src/components/checkbox/checkbox.ts +45 -45
- package/src/components/chips/chips.ts +95 -95
- package/src/components/collapsible/collapsible.ts +21 -21
- package/src/components/collapsible/collapsible.vue +27 -27
- package/src/components/date-picker/__tests__/date-picker.test.ts +112 -112
- package/src/components/date-picker/date-picker.ts +157 -157
- package/src/components/date-picker/date-range-picker/date-range-picker.ts +193 -0
- package/src/components/date-picker/date-range-picker/date-range-picker.vue +412 -0
- package/src/components/date-picker/date-range-picker/use-date-range-picker.ts +957 -0
- package/src/components/dropdown/__tests__/dropdown-fixes.spec.ts +106 -106
- package/src/components/dropdown/__tests__/dropdown-value-types.spec.ts +213 -213
- package/src/components/dropdown/fix-multi-number.ts +92 -92
- package/src/components/dropdown/use-dropdown.ts +488 -488
- package/src/components/empty-state/empty-state.ts +50 -50
- package/src/components/file-upload/file-upload.ts +87 -87
- package/src/components/floating-action/floating-action.ts +12 -12
- package/src/components/input/input-contact-number/input-contact-number.ts +83 -83
- package/src/components/input/input-email/input-email.vue +17 -17
- package/src/components/input/input-password/use-input-password.ts +19 -19
- package/src/components/input/input-search/input-search.vue +13 -13
- package/src/components/input/input-url/input-url.vue +20 -20
- package/src/components/input/input-username/input-username.vue +17 -17
- package/src/components/input/input.vue +72 -72
- package/src/components/list/ladderized-list/ladderized-list.ts +39 -39
- package/src/components/list/ladderized-list/use-ladderized-list.ts +92 -9
- package/src/components/list/list.ts +1 -1
- package/src/components/list/list.vue +95 -73
- package/src/components/list/use-list.ts +214 -77
- package/src/components/logo/logo.ts +43 -43
- package/src/components/logo/logo.vue +14 -14
- package/src/components/logo/use-logo.ts +41 -41
- package/src/components/lozenge/lozenge.ts +61 -61
- package/src/components/modal/modal.ts +45 -45
- package/src/components/progress-bar/progress-bar.ts +39 -39
- package/src/components/radio/radio.ts +42 -42
- package/src/components/select/select-ladderized/select-ladderized.ts +2 -0
- package/src/components/select/select-ladderized/select-ladderized.vue +2 -2
- package/src/components/select/select-ladderized/use-select-ladderized.ts +53 -3
- package/src/components/select/select-multiple/select-multiple.ts +1 -1
- package/src/components/select/select.ts +144 -144
- package/src/components/sidenav/sidenav.ts +173 -173
- package/src/components/sidepanel/sidepanel.ts +100 -100
- package/src/components/sidepanel/sidepanel.vue +55 -55
- package/src/components/sidepanel/stacking-sidepanel/stacking-sidepanel.ts +16 -16
- package/src/components/sidepanel/stacking-sidepanel/stacking-sidepanel.vue +39 -39
- package/src/components/slider/slider.ts +38 -38
- package/src/components/snackbar/snack/snack.ts +71 -71
- package/src/components/snackbar/use-snackbar.ts +34 -34
- package/src/components/status/status.ts +19 -19
- package/src/components/status/status.vue +13 -13
- package/src/components/stepper/step/step.ts +47 -47
- package/src/components/stepper/stepper.ts +47 -47
- package/src/components/stepper/stepper.vue +34 -34
- package/src/components/switch/switch.ts +42 -42
- package/src/components/table/table-actions/table-actions.ts +42 -42
- package/src/components/table/table-actions/table-actions.vue +40 -40
- package/src/components/table/table-chips-title/table-chips-title.ts +27 -27
- package/src/components/table/table-chips-title/table-chips-title.vue +32 -32
- package/src/components/table/table-chips-title/use-table-chips-title.ts +22 -22
- package/src/components/table/table-lozenge-title/table-lozenge-title.ts +23 -23
- package/src/components/table/table-lozenge-title/table-lozenge-title.vue +26 -26
- package/src/components/table/table-lozenge-title/use-table-lozenge-title.ts +21 -21
- package/src/components/table/table-pagination/table-pagination.ts +63 -63
- package/src/components/table/table-pagination/table-pagination.vue +72 -72
- package/src/components/table/table.ts +173 -173
- package/src/components/tabs/tabs.ts +43 -43
- package/src/components/tabs/use-tabs.ts +16 -2
- package/src/components/textarea/textarea.ts +72 -72
- package/src/components/textarea/textarea.vue +45 -45
- package/src/components/time-picker/time-picker.ts +69 -69
- package/src/components/tooltip/tooltip.ts +46 -46
- package/src/components/tooltip/use-tooltip.ts +13 -13
- package/src/examples/dropdown-number-multi-select.vue +76 -76
- package/src/stores/useSnackbarStore.ts +44 -44
- package/src/vite-env.d.ts +6 -0
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
import type { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
-
|
|
3
|
-
export const definePropType = <T>(val: unknown): PropType<T> => val as PropType<T>;
|
|
4
|
-
|
|
5
|
-
export const LOZENGE_TONE = ['plain', 'pending', 'information', 'success', 'danger', 'neutral', 'caution'] as const;
|
|
6
|
-
|
|
7
|
-
export const lozengePropTypes = {
|
|
8
|
-
/**
|
|
9
|
-
* @description Lozenge Label
|
|
10
|
-
*/
|
|
11
|
-
label: {
|
|
12
|
-
type: String,
|
|
13
|
-
default: 'label',
|
|
14
|
-
},
|
|
15
|
-
/**
|
|
16
|
-
* @description Lozenge tone
|
|
17
|
-
*/
|
|
18
|
-
tone: {
|
|
19
|
-
type: String as PropType<(typeof LOZENGE_TONE)[number]>,
|
|
20
|
-
validator: (value: (typeof LOZENGE_TONE)[number]) => LOZENGE_TONE.includes(value),
|
|
21
|
-
default: 'plain',
|
|
22
|
-
},
|
|
23
|
-
/**
|
|
24
|
-
* @description Lozenge type (fill or outline)
|
|
25
|
-
*/
|
|
26
|
-
fill: {
|
|
27
|
-
type: Boolean,
|
|
28
|
-
default: false,
|
|
29
|
-
},
|
|
30
|
-
/**
|
|
31
|
-
* @description Lozenge removable
|
|
32
|
-
*/
|
|
33
|
-
removable: {
|
|
34
|
-
type: Boolean,
|
|
35
|
-
default: false,
|
|
36
|
-
},
|
|
37
|
-
/**
|
|
38
|
-
* @description avatar image url
|
|
39
|
-
*/
|
|
40
|
-
url: {
|
|
41
|
-
type: String,
|
|
42
|
-
default: '',
|
|
43
|
-
},
|
|
44
|
-
/**
|
|
45
|
-
* @description handler if the lozenge is visible
|
|
46
|
-
*/
|
|
47
|
-
visible: {
|
|
48
|
-
type: Boolean,
|
|
49
|
-
default: true,
|
|
50
|
-
},
|
|
51
|
-
loading: {
|
|
52
|
-
type: Boolean,
|
|
53
|
-
default: false,
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export type LozengePropTypes = ExtractPropTypes<typeof lozengePropTypes>;
|
|
58
|
-
export const removeEmitTypes = {
|
|
59
|
-
onRemove: (evt: MouseEvent): evt is MouseEvent => evt instanceof MouseEvent,
|
|
60
|
-
};
|
|
61
|
-
export type RemoveEmitTypes = typeof removeEmitTypes;
|
|
1
|
+
import type { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
+
|
|
3
|
+
export const definePropType = <T>(val: unknown): PropType<T> => val as PropType<T>;
|
|
4
|
+
|
|
5
|
+
export const LOZENGE_TONE = ['plain', 'pending', 'information', 'success', 'danger', 'neutral', 'caution'] as const;
|
|
6
|
+
|
|
7
|
+
export const lozengePropTypes = {
|
|
8
|
+
/**
|
|
9
|
+
* @description Lozenge Label
|
|
10
|
+
*/
|
|
11
|
+
label: {
|
|
12
|
+
type: String,
|
|
13
|
+
default: 'label',
|
|
14
|
+
},
|
|
15
|
+
/**
|
|
16
|
+
* @description Lozenge tone
|
|
17
|
+
*/
|
|
18
|
+
tone: {
|
|
19
|
+
type: String as PropType<(typeof LOZENGE_TONE)[number]>,
|
|
20
|
+
validator: (value: (typeof LOZENGE_TONE)[number]) => LOZENGE_TONE.includes(value),
|
|
21
|
+
default: 'plain',
|
|
22
|
+
},
|
|
23
|
+
/**
|
|
24
|
+
* @description Lozenge type (fill or outline)
|
|
25
|
+
*/
|
|
26
|
+
fill: {
|
|
27
|
+
type: Boolean,
|
|
28
|
+
default: false,
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* @description Lozenge removable
|
|
32
|
+
*/
|
|
33
|
+
removable: {
|
|
34
|
+
type: Boolean,
|
|
35
|
+
default: false,
|
|
36
|
+
},
|
|
37
|
+
/**
|
|
38
|
+
* @description avatar image url
|
|
39
|
+
*/
|
|
40
|
+
url: {
|
|
41
|
+
type: String,
|
|
42
|
+
default: '',
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* @description handler if the lozenge is visible
|
|
46
|
+
*/
|
|
47
|
+
visible: {
|
|
48
|
+
type: Boolean,
|
|
49
|
+
default: true,
|
|
50
|
+
},
|
|
51
|
+
loading: {
|
|
52
|
+
type: Boolean,
|
|
53
|
+
default: false,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export type LozengePropTypes = ExtractPropTypes<typeof lozengePropTypes>;
|
|
58
|
+
export const removeEmitTypes = {
|
|
59
|
+
onRemove: (evt: MouseEvent): evt is MouseEvent => evt instanceof MouseEvent,
|
|
60
|
+
};
|
|
61
|
+
export type RemoveEmitTypes = typeof removeEmitTypes;
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import type { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
-
|
|
3
|
-
export const definePropType = <T>(val: unknown): PropType<T> => val as PropType<T>;
|
|
4
|
-
|
|
5
|
-
const MODAL_SIZE = ['sm', 'md', 'lg', 'xl'] as const;
|
|
6
|
-
|
|
7
|
-
export const modalPropTypes = {
|
|
8
|
-
modelValue: {
|
|
9
|
-
type: Boolean,
|
|
10
|
-
default: false,
|
|
11
|
-
},
|
|
12
|
-
title: {
|
|
13
|
-
type: String,
|
|
14
|
-
default: '',
|
|
15
|
-
},
|
|
16
|
-
closeButtonX: {
|
|
17
|
-
type: Boolean,
|
|
18
|
-
default: true,
|
|
19
|
-
},
|
|
20
|
-
contentPadding: {
|
|
21
|
-
type: Boolean,
|
|
22
|
-
default: true,
|
|
23
|
-
},
|
|
24
|
-
hasFooter: {
|
|
25
|
-
type: Boolean,
|
|
26
|
-
default: true,
|
|
27
|
-
},
|
|
28
|
-
size: {
|
|
29
|
-
type: String as PropType<(typeof MODAL_SIZE)[number]>,
|
|
30
|
-
validator: (value: (typeof MODAL_SIZE)[number]) => MODAL_SIZE.includes(value),
|
|
31
|
-
default: 'md',
|
|
32
|
-
},
|
|
33
|
-
staticBackdrop: {
|
|
34
|
-
type: Boolean,
|
|
35
|
-
default: false,
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export type ModalPropTypes = ExtractPropTypes<typeof modalPropTypes>;
|
|
40
|
-
|
|
41
|
-
export const modalEmitTypes = {
|
|
42
|
-
'update:modelValue': (value: boolean) => value,
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export type ModalEmitTypes = typeof modalEmitTypes;
|
|
1
|
+
import type { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
+
|
|
3
|
+
export const definePropType = <T>(val: unknown): PropType<T> => val as PropType<T>;
|
|
4
|
+
|
|
5
|
+
const MODAL_SIZE = ['sm', 'md', 'lg', 'xl'] as const;
|
|
6
|
+
|
|
7
|
+
export const modalPropTypes = {
|
|
8
|
+
modelValue: {
|
|
9
|
+
type: Boolean,
|
|
10
|
+
default: false,
|
|
11
|
+
},
|
|
12
|
+
title: {
|
|
13
|
+
type: String,
|
|
14
|
+
default: '',
|
|
15
|
+
},
|
|
16
|
+
closeButtonX: {
|
|
17
|
+
type: Boolean,
|
|
18
|
+
default: true,
|
|
19
|
+
},
|
|
20
|
+
contentPadding: {
|
|
21
|
+
type: Boolean,
|
|
22
|
+
default: true,
|
|
23
|
+
},
|
|
24
|
+
hasFooter: {
|
|
25
|
+
type: Boolean,
|
|
26
|
+
default: true,
|
|
27
|
+
},
|
|
28
|
+
size: {
|
|
29
|
+
type: String as PropType<(typeof MODAL_SIZE)[number]>,
|
|
30
|
+
validator: (value: (typeof MODAL_SIZE)[number]) => MODAL_SIZE.includes(value),
|
|
31
|
+
default: 'md',
|
|
32
|
+
},
|
|
33
|
+
staticBackdrop: {
|
|
34
|
+
type: Boolean,
|
|
35
|
+
default: false,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type ModalPropTypes = ExtractPropTypes<typeof modalPropTypes>;
|
|
40
|
+
|
|
41
|
+
export const modalEmitTypes = {
|
|
42
|
+
'update:modelValue': (value: boolean) => value,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export type ModalEmitTypes = typeof modalEmitTypes;
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
-
|
|
3
|
-
const PROGRESS_BAR_SIZES = ['xs', 'sm', 'lg'] as const;
|
|
4
|
-
|
|
5
|
-
export const progressBarPropTypes = {
|
|
6
|
-
size: {
|
|
7
|
-
type: String as PropType<(typeof PROGRESS_BAR_SIZES)[number]>,
|
|
8
|
-
validator: (value: (typeof PROGRESS_BAR_SIZES)[number]) => PROGRESS_BAR_SIZES.includes(value),
|
|
9
|
-
default: 'lg',
|
|
10
|
-
},
|
|
11
|
-
label: {
|
|
12
|
-
type: Boolean,
|
|
13
|
-
default: true,
|
|
14
|
-
},
|
|
15
|
-
value: {
|
|
16
|
-
type: Number,
|
|
17
|
-
default: 0,
|
|
18
|
-
validator(value: number, props: { max: number }) {
|
|
19
|
-
if (value < 0 || value > props.max) {
|
|
20
|
-
console.error(`Invalid prop: "value" (${value}) must be between 0 and ${props.max}.`);
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
return true;
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
max: {
|
|
27
|
-
type: Number,
|
|
28
|
-
default: 100,
|
|
29
|
-
validator(value: number) {
|
|
30
|
-
if (value <= 0 || value > 100) {
|
|
31
|
-
console.error('Invalid prop: "max" must be between 1 and 100.');
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
return true;
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export type ProgressBarPropTypes = ExtractPropTypes<typeof progressBarPropTypes>;
|
|
1
|
+
import { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
+
|
|
3
|
+
const PROGRESS_BAR_SIZES = ['xs', 'sm', 'lg'] as const;
|
|
4
|
+
|
|
5
|
+
export const progressBarPropTypes = {
|
|
6
|
+
size: {
|
|
7
|
+
type: String as PropType<(typeof PROGRESS_BAR_SIZES)[number]>,
|
|
8
|
+
validator: (value: (typeof PROGRESS_BAR_SIZES)[number]) => PROGRESS_BAR_SIZES.includes(value),
|
|
9
|
+
default: 'lg',
|
|
10
|
+
},
|
|
11
|
+
label: {
|
|
12
|
+
type: Boolean,
|
|
13
|
+
default: true,
|
|
14
|
+
},
|
|
15
|
+
value: {
|
|
16
|
+
type: Number,
|
|
17
|
+
default: 0,
|
|
18
|
+
validator(value: number, props: { max: number }) {
|
|
19
|
+
if (value < 0 || value > props.max) {
|
|
20
|
+
console.error(`Invalid prop: "value" (${value}) must be between 0 and ${props.max}.`);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
max: {
|
|
27
|
+
type: Number,
|
|
28
|
+
default: 100,
|
|
29
|
+
validator(value: number) {
|
|
30
|
+
if (value <= 0 || value > 100) {
|
|
31
|
+
console.error('Invalid prop: "max" must be between 1 and 100.');
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type ProgressBarPropTypes = ExtractPropTypes<typeof progressBarPropTypes>;
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import type { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
-
|
|
3
|
-
export const definePropType = <T>(val: unknown): PropType<T> => val as PropType<T>;
|
|
4
|
-
|
|
5
|
-
export const radioPropTypes = {
|
|
6
|
-
id: {
|
|
7
|
-
type: String,
|
|
8
|
-
required: true,
|
|
9
|
-
},
|
|
10
|
-
modelValue: {
|
|
11
|
-
type: [String, Number, Boolean],
|
|
12
|
-
},
|
|
13
|
-
disabled: {
|
|
14
|
-
type: Boolean,
|
|
15
|
-
default: false,
|
|
16
|
-
},
|
|
17
|
-
name: {
|
|
18
|
-
type: String,
|
|
19
|
-
required: true,
|
|
20
|
-
},
|
|
21
|
-
value: {
|
|
22
|
-
type: [String, Number, Boolean],
|
|
23
|
-
required: true,
|
|
24
|
-
},
|
|
25
|
-
description: {
|
|
26
|
-
type: String,
|
|
27
|
-
},
|
|
28
|
-
bordered: {
|
|
29
|
-
type: Boolean,
|
|
30
|
-
default: false,
|
|
31
|
-
},
|
|
32
|
-
fullWidth: {
|
|
33
|
-
type: Boolean,
|
|
34
|
-
default: false,
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export const radioEmitTypes = ['update:modelValue'];
|
|
39
|
-
|
|
40
|
-
export type RadioPropTypes = ExtractPropTypes<typeof radioPropTypes>;
|
|
41
|
-
|
|
42
|
-
export type RadioEmitTypes = typeof radioEmitTypes;
|
|
1
|
+
import type { PropType, ExtractPropTypes } from 'vue';
|
|
2
|
+
|
|
3
|
+
export const definePropType = <T>(val: unknown): PropType<T> => val as PropType<T>;
|
|
4
|
+
|
|
5
|
+
export const radioPropTypes = {
|
|
6
|
+
id: {
|
|
7
|
+
type: String,
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
modelValue: {
|
|
11
|
+
type: [String, Number, Boolean],
|
|
12
|
+
},
|
|
13
|
+
disabled: {
|
|
14
|
+
type: Boolean,
|
|
15
|
+
default: false,
|
|
16
|
+
},
|
|
17
|
+
name: {
|
|
18
|
+
type: String,
|
|
19
|
+
required: true,
|
|
20
|
+
},
|
|
21
|
+
value: {
|
|
22
|
+
type: [String, Number, Boolean],
|
|
23
|
+
required: true,
|
|
24
|
+
},
|
|
25
|
+
description: {
|
|
26
|
+
type: String,
|
|
27
|
+
},
|
|
28
|
+
bordered: {
|
|
29
|
+
type: Boolean,
|
|
30
|
+
default: false,
|
|
31
|
+
},
|
|
32
|
+
fullWidth: {
|
|
33
|
+
type: Boolean,
|
|
34
|
+
default: false,
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const radioEmitTypes = ['update:modelValue'];
|
|
39
|
+
|
|
40
|
+
export type RadioPropTypes = ExtractPropTypes<typeof radioPropTypes>;
|
|
41
|
+
|
|
42
|
+
export type RadioEmitTypes = typeof radioEmitTypes;
|
|
@@ -105,5 +105,7 @@ export const selectLadderizedEmitTypes = {
|
|
|
105
105
|
'update:modelValue': (_value: unknown) => true,
|
|
106
106
|
};
|
|
107
107
|
|
|
108
|
+
export type SelectLadderizedEmitFn = (event: string, ...args: unknown[]) => void;
|
|
109
|
+
|
|
108
110
|
export type SelectLadderizedPropTypes = ExtractPropTypes<typeof selectLadderizedPropTypes>;
|
|
109
111
|
export type SelectLadderizedEmitTypes = typeof selectLadderizedEmitTypes;
|
|
@@ -90,7 +90,7 @@ import 'floating-vue/dist/style.css';
|
|
|
90
90
|
import SprInput from '@/components/input/input.vue';
|
|
91
91
|
import SprLadderizedList from '@/components/list/ladderized-list/ladderized-list.vue';
|
|
92
92
|
|
|
93
|
-
import { selectLadderizedPropTypes, selectLadderizedEmitTypes } from './select-ladderized';
|
|
93
|
+
import { selectLadderizedPropTypes, selectLadderizedEmitTypes, SelectLadderizedEmitFn } from './select-ladderized';
|
|
94
94
|
import { useSelectLadderized } from './use-select-ladderized';
|
|
95
95
|
|
|
96
96
|
const props = defineProps(selectLadderizedPropTypes);
|
|
@@ -108,5 +108,5 @@ const {
|
|
|
108
108
|
handleSearch,
|
|
109
109
|
handleClear,
|
|
110
110
|
handleOptionsToggle,
|
|
111
|
-
} = useSelectLadderized(props, emit);
|
|
111
|
+
} = useSelectLadderized(props, emit as SelectLadderizedEmitFn);
|
|
112
112
|
</script>
|
|
@@ -55,23 +55,70 @@ export const useSelectLadderized = (
|
|
|
55
55
|
|
|
56
56
|
const handleSelectedLadderizedItem = (selectedItems: string[], selectedItem?: MenuListType) => {
|
|
57
57
|
wasCleared.value = false;
|
|
58
|
+
|
|
59
|
+
// If the selectedItems is a single value (leaf from search), reconstruct the full path
|
|
60
|
+
let fullPath: string[] | null = null;
|
|
61
|
+
|
|
62
|
+
if (selectedItems.length === 1) {
|
|
63
|
+
// Find the full path from root to leaf
|
|
64
|
+
fullPath = findPathToValue(ladderizedSelectOptions.value, selectedItems[0]);
|
|
65
|
+
|
|
66
|
+
if (fullPath) {
|
|
67
|
+
// Traverse the tree by path, always matching the next text in the sublevel
|
|
68
|
+
let currentLevel = ladderizedSelectOptions.value;
|
|
69
|
+
const valuePath: (string | number)[] = [];
|
|
70
|
+
|
|
71
|
+
for (const text of fullPath) {
|
|
72
|
+
const found = currentLevel.find((item) => item.text === text);
|
|
73
|
+
|
|
74
|
+
if (found) {
|
|
75
|
+
valuePath.push(found.value);
|
|
76
|
+
currentLevel = found.sublevel || [];
|
|
77
|
+
} else {
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
ladderizedSelectModel.value = valuePath.map(String);
|
|
83
|
+
inputText.value = fullPath.join(' > ');
|
|
84
|
+
|
|
85
|
+
// Find the actual item object for the last value in the path
|
|
86
|
+
let leafItem: MenuListType | undefined = undefined;
|
|
87
|
+
let leafLevel = ladderizedSelectOptions.value;
|
|
88
|
+
|
|
89
|
+
for (const text of fullPath) {
|
|
90
|
+
const found = leafLevel.find((item) => item.text === text);
|
|
91
|
+
|
|
92
|
+
if (found) {
|
|
93
|
+
leafItem = found;
|
|
94
|
+
leafLevel = found.sublevel || [];
|
|
95
|
+
} else {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (leafItem && isLeafNode(leafItem)) {
|
|
101
|
+
ladderizedSelectPopperState.value = false;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
58
108
|
ladderizedSelectModel.value = selectedItems;
|
|
59
109
|
|
|
60
110
|
let itemToCheck = selectedItem;
|
|
61
111
|
|
|
62
|
-
// Fallback: if selectedItem is not provided, try to find it from the value
|
|
63
112
|
if (!itemToCheck && selectedItems.length > 0) {
|
|
64
113
|
const findItemByValue = (items: MenuListType[], value: string | number): MenuListType | undefined => {
|
|
65
114
|
for (const item of items) {
|
|
66
115
|
if (item.value === value) return item;
|
|
67
|
-
|
|
68
116
|
if (item.sublevel) {
|
|
69
117
|
const found = findItemByValue(item.sublevel, value);
|
|
70
118
|
|
|
71
119
|
if (found) return found;
|
|
72
120
|
}
|
|
73
121
|
}
|
|
74
|
-
|
|
75
122
|
return undefined;
|
|
76
123
|
};
|
|
77
124
|
|
|
@@ -122,6 +169,7 @@ export const useSelectLadderized = (
|
|
|
122
169
|
if (wasCleared.value) {
|
|
123
170
|
inputText.value = '';
|
|
124
171
|
wasCleared.value = false;
|
|
172
|
+
|
|
125
173
|
return;
|
|
126
174
|
}
|
|
127
175
|
|
|
@@ -133,7 +181,9 @@ export const useSelectLadderized = (
|
|
|
133
181
|
|
|
134
182
|
for (const value of newVal) {
|
|
135
183
|
const found = currentLevel.find((item) => item.value === value);
|
|
184
|
+
|
|
136
185
|
if (!found) break;
|
|
186
|
+
|
|
137
187
|
pathTexts.push(found.text);
|
|
138
188
|
currentLevel = found.sublevel || [];
|
|
139
189
|
}
|
|
@@ -142,7 +142,7 @@ export const multiSelectPropTypes = {
|
|
|
142
142
|
export const multiSelectEmitTypes = {
|
|
143
143
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
144
144
|
'update:modelValue': (_value: unknown) => true,
|
|
145
|
-
'update:
|
|
145
|
+
'update:searchValue': (value: string) => typeof value === 'string',
|
|
146
146
|
'infinite-scroll-trigger': Boolean,
|
|
147
147
|
};
|
|
148
148
|
|