@zap-wunschlachen/wl-shared-components 1.0.25 → 1.0.26
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/.github/workflows/playwright.yml +205 -205
- package/.github/workflows/static.yml +61 -61
- package/.github/workflows/update-snapshots.yml +37 -37
- package/.prettierrc +5 -5
- package/.storybook/main.ts +18 -18
- package/.storybook/preview.ts +37 -37
- package/.storybook/storyWrapper.vue +18 -18
- package/.storybook/withVuetifyTheme.decorator.ts +21 -21
- package/App.vue +34 -176
- package/README.md +56 -56
- package/heroicons.ts +75 -75
- package/index.html +19 -19
- package/package.json +67 -67
- package/playwright.config.ts +48 -48
- package/public/background.svg +60 -60
- package/public/style.css +187 -187
- package/public/technologies.svg +22 -22
- package/src/assets/css/base.css +235 -235
- package/src/assets/css/variables.css +107 -96
- package/src/components/Accordion/Accordion.css +59 -59
- package/src/components/Accordion/AccordionGroup.vue +51 -51
- package/src/components/Accordion/AccordionItem.vue +66 -66
- package/src/components/Appointment/Card/Actions.css +54 -54
- package/src/components/Appointment/Card/Actions.vue +99 -99
- package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
- package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
- package/src/components/Appointment/Card/Card.css +80 -80
- package/src/components/Appointment/Card/Card.vue +93 -93
- package/src/components/Appointment/Card/Details.css +50 -50
- package/src/components/Appointment/Card/Details.vue +43 -43
- package/src/components/Audio/Audio.vue +187 -187
- package/src/components/Audio/Waveform.vue +117 -117
- package/src/components/Background/Background.css +39 -0
- package/src/components/Background/Background.vue +19 -0
- package/src/components/Background/WhiteCocoonBackground.vue +9 -0
- package/src/components/Background/WunschlachenBackground.vue +11 -0
- package/src/components/Button/Button.vue +119 -119
- package/src/components/CheckBox/CheckBox.css +185 -185
- package/src/components/CheckBox/Checkbox.vue +130 -130
- package/src/components/DateInput/DateInput.css +2 -2
- package/src/components/DateInput/DateInput.vue +262 -262
- package/src/components/Dialog/Dialog.css +6 -6
- package/src/components/Dialog/Dialog.vue +29 -29
- package/src/components/EditField/EditField.css +19 -19
- package/src/components/EditField/EditField.vue +202 -202
- package/src/components/ErrorPage/ErrorPage.css +124 -0
- package/src/components/ErrorPage/ErrorPage.vue +45 -0
- package/src/components/ErrorPage/ErrorPageLogo.vue +26 -0
- package/src/components/IconBullet/IconBullet.vue +86 -86
- package/src/components/IconBullet/IconBulletList.vue +41 -41
- package/src/components/Icons/AdvanceAppointments.vue +153 -153
- package/src/components/Icons/Audio/CloudFailed.vue +20 -20
- package/src/components/Icons/Audio/CloudSaved.vue +21 -21
- package/src/components/Icons/Audio/Delete.vue +15 -15
- package/src/components/Icons/Audio/Pause.vue +18 -18
- package/src/components/Icons/Audio/Play.vue +15 -15
- package/src/components/Icons/CalendarNotification.vue +126 -126
- package/src/components/Icons/Chair.vue +32 -32
- package/src/components/Icons/ChairNotification.vue +35 -35
- package/src/components/Icons/Circle.vue +66 -66
- package/src/components/Icons/FavIcon.vue +22 -22
- package/src/components/Icons/FilledCircle.vue +11 -11
- package/src/components/Icons/Group3.vue +46 -46
- package/src/components/Icons/Logo.vue +108 -0
- package/src/components/Icons/RingNotification.vue +54 -54
- package/src/components/Icons/SolidArrowRight.vue +14 -14
- package/src/components/Icons/calendar.vue +17 -17
- package/src/components/Icons/checkbox.vue +19 -19
- package/src/components/Icons/outlineChecked.vue +27 -27
- package/src/components/Icons/play.vue +5 -5
- package/src/components/Input/Input.css +187 -187
- package/src/components/Input/Input.vue +247 -247
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
- package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
- package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
- package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
- package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
- package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
- package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
- package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
- package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
- package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
- package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
- package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
- package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
- package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
- package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
- package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
- package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
- package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
- package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
- package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
- package/src/components/Loader/Loader.css +51 -51
- package/src/components/MaintenanceBanner/MaintenanceBanner.css +289 -0
- package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -0
- package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -0
- package/src/components/Modal/Modal.css +5 -5
- package/src/components/Modal/Modal.vue +22 -22
- package/src/components/NotificationBubble/NotificationBubble.css +4 -4
- package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
- package/src/components/OtpInput/OtpInput.css +39 -39
- package/src/components/OtpInput/OtpInput.vue +143 -143
- package/src/components/PhoneInput/PhoneInput.css +31 -31
- package/src/components/PhoneInput/PhoneInput.vue +113 -113
- package/src/components/Select/Select.css +150 -150
- package/src/components/Select/Select.vue +315 -315
- package/src/components/TextArea/TextArea.css +3 -3
- package/src/components/TextArea/TextArea.vue +126 -126
- package/src/components/TickBox/TickBox.css +49 -49
- package/src/components/TickBox/TickBox.vue +126 -126
- package/src/components/index.ts +26 -24
- package/src/constants/iconEnums.ts +3 -3
- package/src/i18n/i18n.ts +15 -15
- package/src/i18n/locales/de.json +30 -30
- package/src/i18n/locales/en.json +30 -30
- package/src/index.ts +34 -34
- package/src/main.ts +11 -11
- package/src/plugins/vuetify.ts +139 -131
- package/src/shims-vue.d.ts +10 -10
- package/src/stories/Accordion.stories.ts +650 -650
- package/src/stories/Audio.stories.ts +28 -28
- package/src/stories/Button.stories.ts +263 -263
- package/src/stories/CheckBox.stories.ts +348 -348
- package/src/stories/DateInput.stories.ts +53 -53
- package/src/stories/Dialog.stories.ts +147 -147
- package/src/stories/EditField.stories.ts +78 -78
- package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
- package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
- package/src/stories/Input.stories.ts +351 -351
- package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
- package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
- package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
- package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
- package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
- package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
- package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
- package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
- package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
- package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
- package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
- package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
- package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
- package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
- package/src/stories/Laboratory/Timeline.stories.ts +403 -403
- package/src/stories/NotificationBubble.stories.ts +194 -194
- package/src/stories/OtpInput.stories.ts +100 -100
- package/src/stories/PhoneInput.stories.ts +52 -52
- package/src/stories/Select.stories.ts +419 -419
- package/src/stories/TextArea.stories.ts +112 -112
- package/src/stories/TickBox.stories.ts +294 -294
- package/src/stories/v-icon.stories.ts +91 -91
- package/src/utils/index.ts +106 -100
- package/src/vite-env.d.ts +1 -1
- package/tests/e2e/README.md +220 -220
- package/tests/e2e/accessibility.spec.ts +638 -638
- package/tests/e2e/accordion.spec.ts +42 -42
- package/tests/e2e/additional-components.spec.ts +437 -437
- package/tests/e2e/all-components.spec.ts +135 -135
- package/tests/e2e/appointment-card.spec.ts +816 -816
- package/tests/e2e/button-fixed.spec.ts +58 -58
- package/tests/e2e/button.spec.ts +76 -76
- package/tests/e2e/checkbox.spec.ts +50 -50
- package/tests/e2e/date-input.spec.ts +46 -46
- package/tests/e2e/debug.spec.ts +51 -51
- package/tests/e2e/dialog.spec.ts +58 -58
- package/tests/e2e/input.spec.ts +55 -55
- package/tests/e2e/laboratory-components.spec.ts +320 -320
- package/tests/e2e/otp-input.spec.ts +50 -50
- package/tests/e2e/select.spec.ts +52 -52
- package/tests/e2e/storybook-utils.ts +59 -59
- package/tests/e2e/test-basic.spec.ts +33 -33
- package/tests/e2e/visual-regression.spec.ts +350 -350
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
- package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
- package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
- package/tests/unit/components/Audio/Audio.spec.ts +403 -403
- package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
- package/tests/unit/components/Core/Button.spec.ts +336 -336
- package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
- package/tests/unit/components/Core/DateInput.spec.ts +690 -690
- package/tests/unit/components/Core/Dialog.spec.ts +485 -485
- package/tests/unit/components/Core/EditField.spec.ts +782 -782
- package/tests/unit/components/Core/Input.spec.ts +512 -512
- package/tests/unit/components/Core/Modal.spec.ts +518 -518
- package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
- package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
- package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
- package/tests/unit/components/Core/Select.spec.ts +712 -712
- package/tests/unit/components/Core/TextArea.spec.ts +565 -565
- package/tests/unit/components/Core/TickBox.spec.ts +779 -779
- package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
- package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
- package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
- package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
- package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
- package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
- package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
- package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
- package/tests/unit/components/Icons/Chair.spec.ts +234 -234
- package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
- package/tests/unit/components/Icons/Circle.spec.ts +255 -255
- package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
- package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
- package/tests/unit/components/Icons/Group3.spec.ts +355 -355
- package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
- package/tests/unit/components/Icons/calendar.spec.ts +286 -286
- package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
- package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
- package/tests/unit/components/Icons/play.spec.ts +308 -308
- package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
- package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
- package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
- package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
- package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
- package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
- package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
- package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
- package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
- package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
- package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
- package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
- package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
- package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
- package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
- package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
- package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
- package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
- package/tests/unit/constants/iconEnums.spec.ts +39 -39
- package/tests/unit/i18n/i18n.spec.ts +88 -88
- package/tests/unit/plugins/vuetify.spec.ts +220 -220
- package/tests/unit/setup.ts +189 -189
- package/tests/unit/src/components/index.spec.ts.skip +192 -192
- package/tests/unit/src/index.spec.ts.skip +182 -182
- package/tests/unit/src/main.spec.ts +151 -151
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +83 -83
|
@@ -1,419 +1,419 @@
|
|
|
1
|
-
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
-
import Select from '../components/Select/Select.vue';
|
|
3
|
-
import { action } from '@storybook/addon-actions';
|
|
4
|
-
import { ref } from 'vue';
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof Select> = {
|
|
7
|
-
title: 'WL/Select',
|
|
8
|
-
component: Select,
|
|
9
|
-
tags: ['autodocs'],
|
|
10
|
-
argTypes: {
|
|
11
|
-
clearable: { control: 'boolean' },
|
|
12
|
-
label: { control: 'text' },
|
|
13
|
-
chips: { control: 'boolean' },
|
|
14
|
-
multiple: { control: 'boolean' },
|
|
15
|
-
closableChips: { control: 'boolean' },
|
|
16
|
-
items: { control: 'object' },
|
|
17
|
-
returnObject: { control: 'boolean' },
|
|
18
|
-
'click:append': { action: 'click:append' },
|
|
19
|
-
'click:prepend': { action: 'click:prepend' },
|
|
20
|
-
'click:append-inner': { action: 'click:append-inner' },
|
|
21
|
-
'click:prepend-inner': { action: 'click:prepend-inner' },
|
|
22
|
-
'click:clear': { action: 'click:clear' },
|
|
23
|
-
'update:modelValue': { action: 'update:modelValue' },
|
|
24
|
-
'update:search': { action: 'update:search' },
|
|
25
|
-
},
|
|
26
|
-
args: {
|
|
27
|
-
items: ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'],
|
|
28
|
-
label: 'Select a state',
|
|
29
|
-
},
|
|
30
|
-
parameters: {
|
|
31
|
-
docs: {
|
|
32
|
-
description: {
|
|
33
|
-
component: `
|
|
34
|
-
The \`Select\` component allows for a customizable dropdown menu with options for multiple selections, chips, clearable selections, and icons.
|
|
35
|
-
|
|
36
|
-
### Props
|
|
37
|
-
- **\`clearable\`**: Allows the selection to be cleared.
|
|
38
|
-
- **\`label\`**: Specifies the label for the select input.
|
|
39
|
-
- **\`chips\`**: Displays selected items as chips within the input.
|
|
40
|
-
- **\`multiple\`**: Enables selection of multiple items.
|
|
41
|
-
- **\`closableChips\`**: Allows chips to be individually closed.
|
|
42
|
-
- **\`items\`**: An array of items to display in the dropdown.
|
|
43
|
-
- **\`returnObject\`**: Returns the entire item object instead of just the value.
|
|
44
|
-
|
|
45
|
-
### Slots
|
|
46
|
-
- **\`prependIcon\`**: Adds an icon before the input.
|
|
47
|
-
- **\`appendIcon\`**: Adds an icon after the input.
|
|
48
|
-
|
|
49
|
-
### Example Usage
|
|
50
|
-
The following examples demonstrate various configurations, including single and multiple selections, clearable, and chips.
|
|
51
|
-
`,
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export default meta;
|
|
58
|
-
type Story = StoryObj<typeof meta>;
|
|
59
|
-
|
|
60
|
-
const Template: Story = {
|
|
61
|
-
render: (args) => ({
|
|
62
|
-
components: { Select },
|
|
63
|
-
setup() {
|
|
64
|
-
const prependClick = action('click:prepend');
|
|
65
|
-
const appendClick = action('click:append');
|
|
66
|
-
const prependInnerClick = action('click:prepend-inner');
|
|
67
|
-
const appendInnerClick = action('click:append-inner');
|
|
68
|
-
const clearClick = action('click:clear');
|
|
69
|
-
const updateModelValue = action('update:modelValue');
|
|
70
|
-
const updateSearch = action('update:search');
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
args,
|
|
74
|
-
prependClick,
|
|
75
|
-
appendClick,
|
|
76
|
-
prependInnerClick,
|
|
77
|
-
appendInnerClick,
|
|
78
|
-
clearClick,
|
|
79
|
-
updateModelValue,
|
|
80
|
-
updateSearch,
|
|
81
|
-
};
|
|
82
|
-
},
|
|
83
|
-
template: `
|
|
84
|
-
<div style="padding: 16px;">
|
|
85
|
-
<Select
|
|
86
|
-
v-bind="args"
|
|
87
|
-
@click:prepend="prependClick"
|
|
88
|
-
@click:append="appendClick"
|
|
89
|
-
@click:prepend-inner="prependInnerClick"
|
|
90
|
-
@click:append-inner="appendInnerClick"
|
|
91
|
-
@click:clear="clearClick"
|
|
92
|
-
@update:modelValue="updateModelValue"
|
|
93
|
-
@update:search="updateSearch"
|
|
94
|
-
/>
|
|
95
|
-
</div>
|
|
96
|
-
`,
|
|
97
|
-
}),
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
// Default story without any additional props like chips or clearable
|
|
101
|
-
export const Default: Story = {
|
|
102
|
-
...Template,
|
|
103
|
-
args: {},
|
|
104
|
-
parameters: {
|
|
105
|
-
docs: {
|
|
106
|
-
source: {
|
|
107
|
-
code: `<Select :items="['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming']" label="Select a state" />`,
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
// Story with chips enabled and clearable set to true
|
|
114
|
-
export const WithChips: Story = {
|
|
115
|
-
...Template,
|
|
116
|
-
args: {
|
|
117
|
-
chips: true,
|
|
118
|
-
closableChips: true,
|
|
119
|
-
},
|
|
120
|
-
parameters: {
|
|
121
|
-
docs: {
|
|
122
|
-
source: {
|
|
123
|
-
code: `<Select chips closableChips />`,
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
// Story with prepend and append icons
|
|
130
|
-
export const WithPrependAppendIcons: Story = {
|
|
131
|
-
...Template,
|
|
132
|
-
args: {
|
|
133
|
-
prependIcon: 'heroicons:calendar',
|
|
134
|
-
appendIcon: 'heroicons:calendar',
|
|
135
|
-
},
|
|
136
|
-
parameters: {
|
|
137
|
-
docs: {
|
|
138
|
-
source: {
|
|
139
|
-
code: `<Select prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
// Disabled state story
|
|
146
|
-
export const Disabled: Story = {
|
|
147
|
-
...Template,
|
|
148
|
-
args: { disabled: true },
|
|
149
|
-
parameters: {
|
|
150
|
-
docs: {
|
|
151
|
-
source: {
|
|
152
|
-
code: `<Select disabled />`,
|
|
153
|
-
},
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
// Story with compact density
|
|
159
|
-
export const CompactSelect: Story = {
|
|
160
|
-
...Template,
|
|
161
|
-
args: { density: 'compact' },
|
|
162
|
-
parameters: {
|
|
163
|
-
docs: {
|
|
164
|
-
source: {
|
|
165
|
-
code: `<Select density="compact" />`,
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
// Disabled state with icons
|
|
172
|
-
export const DisabledWithIcons: Story = {
|
|
173
|
-
...Template,
|
|
174
|
-
args: {
|
|
175
|
-
disabled: true,
|
|
176
|
-
prependIcon: 'heroicons:calendar',
|
|
177
|
-
appendIcon: 'heroicons:calendar',
|
|
178
|
-
appendInnerIcon: 'heroicons:calendar',
|
|
179
|
-
prependInnerIcon: 'heroicons:calendar',
|
|
180
|
-
},
|
|
181
|
-
parameters: {
|
|
182
|
-
docs: {
|
|
183
|
-
source: {
|
|
184
|
-
code: `<Select disabled prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
},
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
// Story with custom icons
|
|
191
|
-
export const CustomIcons: Story = {
|
|
192
|
-
...Template,
|
|
193
|
-
args: {
|
|
194
|
-
prependIcon: 'heroicons:sparkles',
|
|
195
|
-
appendIcon: 'heroicons:paper-airplane',
|
|
196
|
-
},
|
|
197
|
-
parameters: {
|
|
198
|
-
docs: {
|
|
199
|
-
source: {
|
|
200
|
-
code: `<Select prependIcon="heroicons:sparkles" appendIcon="heroicons:paper-airplane" />`,
|
|
201
|
-
},
|
|
202
|
-
},
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// Without chips
|
|
207
|
-
export const WithoutChips: Story = {
|
|
208
|
-
...Template,
|
|
209
|
-
args: { chips: false },
|
|
210
|
-
parameters: {
|
|
211
|
-
docs: {
|
|
212
|
-
source: {
|
|
213
|
-
code: `<Select chips="false" />`,
|
|
214
|
-
},
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
|
-
};
|
|
218
|
-
|
|
219
|
-
// Multiple selection with chips enabled
|
|
220
|
-
export const MultipleWithChips: Story = {
|
|
221
|
-
...Template,
|
|
222
|
-
args: {
|
|
223
|
-
multiple: true,
|
|
224
|
-
chips: true,
|
|
225
|
-
closableChips: true,
|
|
226
|
-
items: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'],
|
|
227
|
-
},
|
|
228
|
-
parameters: {
|
|
229
|
-
docs: {
|
|
230
|
-
source: {
|
|
231
|
-
code: `<Select multiple chips closableChips :items="['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']" />`,
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
},
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
// Closable chips story
|
|
238
|
-
export const ClosableChips: Story = {
|
|
239
|
-
...Template,
|
|
240
|
-
args: {
|
|
241
|
-
chips: true,
|
|
242
|
-
closableChips: true,
|
|
243
|
-
items: ['Red', 'Blue', 'Green', 'Yellow', 'Purple'],
|
|
244
|
-
},
|
|
245
|
-
parameters: {
|
|
246
|
-
docs: {
|
|
247
|
-
source: {
|
|
248
|
-
code: `<Select chips closableChips :items="['Red', 'Blue', 'Green', 'Yellow', 'Purple']" />`,
|
|
249
|
-
},
|
|
250
|
-
},
|
|
251
|
-
},
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
// Menu and clear icons
|
|
255
|
-
export const WithMenuAndClearIcons: Story = {
|
|
256
|
-
...Template,
|
|
257
|
-
args: {
|
|
258
|
-
menuIcon: 'heroicons:menu',
|
|
259
|
-
clearIcon: 'heroicons:x-circle',
|
|
260
|
-
},
|
|
261
|
-
parameters: {
|
|
262
|
-
docs: {
|
|
263
|
-
source: {
|
|
264
|
-
code: `<Select menuIcon="heroicons:menu" clearIcon="heroicons:x-circle" />`,
|
|
265
|
-
},
|
|
266
|
-
},
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
// Clearable and multiple disabled
|
|
271
|
-
export const ClearableAndMultiple: Story = {
|
|
272
|
-
...Template,
|
|
273
|
-
args: {
|
|
274
|
-
clearable: false,
|
|
275
|
-
multiple: false,
|
|
276
|
-
},
|
|
277
|
-
parameters: {
|
|
278
|
-
docs: {
|
|
279
|
-
source: {
|
|
280
|
-
code: `<Select clearable="false" multiple="false" />`,
|
|
281
|
-
},
|
|
282
|
-
},
|
|
283
|
-
},
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
// Preselected values with returnObject variations
|
|
287
|
-
export const PreselectedValues: Story = {
|
|
288
|
-
render: (args) => ({
|
|
289
|
-
components: { Select },
|
|
290
|
-
setup() {
|
|
291
|
-
const items = [
|
|
292
|
-
{ title: 'California', value: 'CA' },
|
|
293
|
-
{ title: 'Colorado', value: 'CO' },
|
|
294
|
-
{ title: 'Florida', value: 'FL' },
|
|
295
|
-
{ title: 'Georgia', value: 'GA' },
|
|
296
|
-
{ title: 'Texas', value: 'TX' },
|
|
297
|
-
{ title: 'Wyoming', value: 'WY' },
|
|
298
|
-
];
|
|
299
|
-
|
|
300
|
-
const selectedValueFalse = ref('CA'); // Single selection, returnObject: false
|
|
301
|
-
const selectedObjectTrue = ref(items.find((item) => item.value === 'FL')); // Single selection, returnObject: true
|
|
302
|
-
const selectedValuesFalse = ref(['CA', 'GA']); // Multiple selection, returnObject: false
|
|
303
|
-
const selectedObjectsTrue = ref(
|
|
304
|
-
items.filter((item) => ['TX', 'WY'].includes(item.value)),
|
|
305
|
-
); // Multiple selection, returnObject: true
|
|
306
|
-
|
|
307
|
-
const updateModelValue = action('update:modelValue');
|
|
308
|
-
|
|
309
|
-
return {
|
|
310
|
-
args: { ...args, items, itemTitle: 'title', itemValue: 'value' },
|
|
311
|
-
selectedValueFalse,
|
|
312
|
-
selectedObjectTrue,
|
|
313
|
-
selectedValuesFalse,
|
|
314
|
-
selectedObjectsTrue,
|
|
315
|
-
updateModelValue,
|
|
316
|
-
};
|
|
317
|
-
},
|
|
318
|
-
template: `
|
|
319
|
-
<div style="padding: 16px; display: flex; flex-direction: column; gap: 24px;">
|
|
320
|
-
<!-- Single selection with returnObject: false -->
|
|
321
|
-
<Select v-bind="args" :returnObject="false" :multiple="false" v-model="selectedValueFalse" @update:modelValue="updateModelValue" />
|
|
322
|
-
<p>Selected Value (returnObject: false): {{ selectedValueFalse }}</p>
|
|
323
|
-
|
|
324
|
-
<!-- Single selection with returnObject: true -->
|
|
325
|
-
<Select v-bind="args" :returnObject="true" :multiple="false" v-model="selectedObjectTrue" @update:modelValue="updateModelValue" />
|
|
326
|
-
<p>Selected Object (returnObject: true): {{ selectedObjectTrue }}</p>
|
|
327
|
-
|
|
328
|
-
<!-- Multiple selection with returnObject: false -->
|
|
329
|
-
<Select v-bind="args" :returnObject="false" :multiple="true" v-model="selectedValuesFalse" @update:modelValue="updateModelValue" />
|
|
330
|
-
<p>Selected Values (multiple, returnObject: false): {{ selectedValuesFalse }}</p>
|
|
331
|
-
|
|
332
|
-
<!-- Multiple selection with returnObject: true -->
|
|
333
|
-
<Select v-bind="args" :returnObject="true" :multiple="true" v-model="selectedObjectsTrue" @update:modelValue="updateModelValue" />
|
|
334
|
-
<p>Selected Objects (multiple, returnObject: true): {{ selectedObjectsTrue }}</p>
|
|
335
|
-
</div>
|
|
336
|
-
`,
|
|
337
|
-
}),
|
|
338
|
-
args: {},
|
|
339
|
-
parameters: {
|
|
340
|
-
docs: {
|
|
341
|
-
source: {
|
|
342
|
-
code: `
|
|
343
|
-
<template>
|
|
344
|
-
<Select
|
|
345
|
-
:items="[
|
|
346
|
-
{ title: 'California', value: 'CA' },
|
|
347
|
-
{ title: 'Colorado', value: 'CO' },
|
|
348
|
-
{ title: 'Florida', value: 'FL' },
|
|
349
|
-
{ title: 'Georgia', value: 'GA' },
|
|
350
|
-
{ title: 'Texas', value: 'TX' },
|
|
351
|
-
{ title: 'Wyoming', value: 'WY' }
|
|
352
|
-
]"
|
|
353
|
-
:returnObject="false"
|
|
354
|
-
:multiple="false"
|
|
355
|
-
v-model="selectedValueFalse"
|
|
356
|
-
/>
|
|
357
|
-
<Select
|
|
358
|
-
:items="[
|
|
359
|
-
{ title: 'California', value: 'CA' },
|
|
360
|
-
{ title: 'Colorado', value: 'CO' },
|
|
361
|
-
{ title: 'Florida', value: 'FL' },
|
|
362
|
-
{ title: 'Georgia', value: 'GA' },
|
|
363
|
-
{ title: 'Texas', value: 'TX' },
|
|
364
|
-
{ title: 'Wyoming', value: 'WY' }
|
|
365
|
-
]"
|
|
366
|
-
:returnObject="true"
|
|
367
|
-
:multiple="false"
|
|
368
|
-
v-model="selectedObjectTrue"
|
|
369
|
-
/>
|
|
370
|
-
<Select
|
|
371
|
-
:items="[
|
|
372
|
-
{ title: 'California', value: 'CA' },
|
|
373
|
-
{ title: 'Colorado', value: 'CO' },
|
|
374
|
-
{ title: 'Florida', value: 'FL' },
|
|
375
|
-
{ title: 'Georgia', value: 'GA' },
|
|
376
|
-
{ title: 'Texas', value: 'TX' },
|
|
377
|
-
{ title: 'Wyoming', value: 'WY' }
|
|
378
|
-
]"
|
|
379
|
-
:returnObject="false"
|
|
380
|
-
:multiple="true"
|
|
381
|
-
v-model="selectedValuesFalse"
|
|
382
|
-
/>
|
|
383
|
-
<Select
|
|
384
|
-
:items="[
|
|
385
|
-
{ title: 'California', value: 'CA' },
|
|
386
|
-
{ title: 'Colorado', value: 'CO' },
|
|
387
|
-
{ title: 'Florida', value: 'FL' },
|
|
388
|
-
{ title: 'Georgia', value: 'GA' },
|
|
389
|
-
{ title: 'Texas', value: 'TX' },
|
|
390
|
-
{ title: 'Wyoming', value: 'WY' }
|
|
391
|
-
]"
|
|
392
|
-
:returnObject="true"
|
|
393
|
-
:multiple="true"
|
|
394
|
-
v-model="selectedObjectsTrue"
|
|
395
|
-
/>
|
|
396
|
-
</template>
|
|
397
|
-
|
|
398
|
-
<script setup>
|
|
399
|
-
import { ref } from 'vue';
|
|
400
|
-
|
|
401
|
-
const items = [
|
|
402
|
-
{ title: 'California', value: 'CA' },
|
|
403
|
-
{ title: 'Colorado', value: 'CO' },
|
|
404
|
-
{ title: 'Florida', value: 'FL' },
|
|
405
|
-
{ title: 'Georgia', value: 'GA' },
|
|
406
|
-
{ title: 'Texas', value: 'TX' },
|
|
407
|
-
{ title: 'Wyoming', value: 'WY' },
|
|
408
|
-
];
|
|
409
|
-
|
|
410
|
-
const selectedValueFalse = ref('CA');
|
|
411
|
-
const selectedObjectTrue = ref(items.find((item) => item.value === 'FL'));
|
|
412
|
-
const selectedValuesFalse = ref(['CA', 'GA']);
|
|
413
|
-
const selectedObjectsTrue = ref(items.filter((item) => ['TX', 'WY'].includes(item.value)));
|
|
414
|
-
</script>
|
|
415
|
-
`,
|
|
416
|
-
},
|
|
417
|
-
},
|
|
418
|
-
},
|
|
419
|
-
};
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/vue3';
|
|
2
|
+
import Select from '../components/Select/Select.vue';
|
|
3
|
+
import { action } from '@storybook/addon-actions';
|
|
4
|
+
import { ref } from 'vue';
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof Select> = {
|
|
7
|
+
title: 'WL/Select',
|
|
8
|
+
component: Select,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
argTypes: {
|
|
11
|
+
clearable: { control: 'boolean' },
|
|
12
|
+
label: { control: 'text' },
|
|
13
|
+
chips: { control: 'boolean' },
|
|
14
|
+
multiple: { control: 'boolean' },
|
|
15
|
+
closableChips: { control: 'boolean' },
|
|
16
|
+
items: { control: 'object' },
|
|
17
|
+
returnObject: { control: 'boolean' },
|
|
18
|
+
'click:append': { action: 'click:append' },
|
|
19
|
+
'click:prepend': { action: 'click:prepend' },
|
|
20
|
+
'click:append-inner': { action: 'click:append-inner' },
|
|
21
|
+
'click:prepend-inner': { action: 'click:prepend-inner' },
|
|
22
|
+
'click:clear': { action: 'click:clear' },
|
|
23
|
+
'update:modelValue': { action: 'update:modelValue' },
|
|
24
|
+
'update:search': { action: 'update:search' },
|
|
25
|
+
},
|
|
26
|
+
args: {
|
|
27
|
+
items: ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'],
|
|
28
|
+
label: 'Select a state',
|
|
29
|
+
},
|
|
30
|
+
parameters: {
|
|
31
|
+
docs: {
|
|
32
|
+
description: {
|
|
33
|
+
component: `
|
|
34
|
+
The \`Select\` component allows for a customizable dropdown menu with options for multiple selections, chips, clearable selections, and icons.
|
|
35
|
+
|
|
36
|
+
### Props
|
|
37
|
+
- **\`clearable\`**: Allows the selection to be cleared.
|
|
38
|
+
- **\`label\`**: Specifies the label for the select input.
|
|
39
|
+
- **\`chips\`**: Displays selected items as chips within the input.
|
|
40
|
+
- **\`multiple\`**: Enables selection of multiple items.
|
|
41
|
+
- **\`closableChips\`**: Allows chips to be individually closed.
|
|
42
|
+
- **\`items\`**: An array of items to display in the dropdown.
|
|
43
|
+
- **\`returnObject\`**: Returns the entire item object instead of just the value.
|
|
44
|
+
|
|
45
|
+
### Slots
|
|
46
|
+
- **\`prependIcon\`**: Adds an icon before the input.
|
|
47
|
+
- **\`appendIcon\`**: Adds an icon after the input.
|
|
48
|
+
|
|
49
|
+
### Example Usage
|
|
50
|
+
The following examples demonstrate various configurations, including single and multiple selections, clearable, and chips.
|
|
51
|
+
`,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export default meta;
|
|
58
|
+
type Story = StoryObj<typeof meta>;
|
|
59
|
+
|
|
60
|
+
const Template: Story = {
|
|
61
|
+
render: (args) => ({
|
|
62
|
+
components: { Select },
|
|
63
|
+
setup() {
|
|
64
|
+
const prependClick = action('click:prepend');
|
|
65
|
+
const appendClick = action('click:append');
|
|
66
|
+
const prependInnerClick = action('click:prepend-inner');
|
|
67
|
+
const appendInnerClick = action('click:append-inner');
|
|
68
|
+
const clearClick = action('click:clear');
|
|
69
|
+
const updateModelValue = action('update:modelValue');
|
|
70
|
+
const updateSearch = action('update:search');
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
args,
|
|
74
|
+
prependClick,
|
|
75
|
+
appendClick,
|
|
76
|
+
prependInnerClick,
|
|
77
|
+
appendInnerClick,
|
|
78
|
+
clearClick,
|
|
79
|
+
updateModelValue,
|
|
80
|
+
updateSearch,
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
template: `
|
|
84
|
+
<div style="padding: 16px;">
|
|
85
|
+
<Select
|
|
86
|
+
v-bind="args"
|
|
87
|
+
@click:prepend="prependClick"
|
|
88
|
+
@click:append="appendClick"
|
|
89
|
+
@click:prepend-inner="prependInnerClick"
|
|
90
|
+
@click:append-inner="appendInnerClick"
|
|
91
|
+
@click:clear="clearClick"
|
|
92
|
+
@update:modelValue="updateModelValue"
|
|
93
|
+
@update:search="updateSearch"
|
|
94
|
+
/>
|
|
95
|
+
</div>
|
|
96
|
+
`,
|
|
97
|
+
}),
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// Default story without any additional props like chips or clearable
|
|
101
|
+
export const Default: Story = {
|
|
102
|
+
...Template,
|
|
103
|
+
args: {},
|
|
104
|
+
parameters: {
|
|
105
|
+
docs: {
|
|
106
|
+
source: {
|
|
107
|
+
code: `<Select :items="['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming']" label="Select a state" />`,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Story with chips enabled and clearable set to true
|
|
114
|
+
export const WithChips: Story = {
|
|
115
|
+
...Template,
|
|
116
|
+
args: {
|
|
117
|
+
chips: true,
|
|
118
|
+
closableChips: true,
|
|
119
|
+
},
|
|
120
|
+
parameters: {
|
|
121
|
+
docs: {
|
|
122
|
+
source: {
|
|
123
|
+
code: `<Select chips closableChips />`,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// Story with prepend and append icons
|
|
130
|
+
export const WithPrependAppendIcons: Story = {
|
|
131
|
+
...Template,
|
|
132
|
+
args: {
|
|
133
|
+
prependIcon: 'heroicons:calendar',
|
|
134
|
+
appendIcon: 'heroicons:calendar',
|
|
135
|
+
},
|
|
136
|
+
parameters: {
|
|
137
|
+
docs: {
|
|
138
|
+
source: {
|
|
139
|
+
code: `<Select prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// Disabled state story
|
|
146
|
+
export const Disabled: Story = {
|
|
147
|
+
...Template,
|
|
148
|
+
args: { disabled: true },
|
|
149
|
+
parameters: {
|
|
150
|
+
docs: {
|
|
151
|
+
source: {
|
|
152
|
+
code: `<Select disabled />`,
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// Story with compact density
|
|
159
|
+
export const CompactSelect: Story = {
|
|
160
|
+
...Template,
|
|
161
|
+
args: { density: 'compact' },
|
|
162
|
+
parameters: {
|
|
163
|
+
docs: {
|
|
164
|
+
source: {
|
|
165
|
+
code: `<Select density="compact" />`,
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// Disabled state with icons
|
|
172
|
+
export const DisabledWithIcons: Story = {
|
|
173
|
+
...Template,
|
|
174
|
+
args: {
|
|
175
|
+
disabled: true,
|
|
176
|
+
prependIcon: 'heroicons:calendar',
|
|
177
|
+
appendIcon: 'heroicons:calendar',
|
|
178
|
+
appendInnerIcon: 'heroicons:calendar',
|
|
179
|
+
prependInnerIcon: 'heroicons:calendar',
|
|
180
|
+
},
|
|
181
|
+
parameters: {
|
|
182
|
+
docs: {
|
|
183
|
+
source: {
|
|
184
|
+
code: `<Select disabled prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Story with custom icons
|
|
191
|
+
export const CustomIcons: Story = {
|
|
192
|
+
...Template,
|
|
193
|
+
args: {
|
|
194
|
+
prependIcon: 'heroicons:sparkles',
|
|
195
|
+
appendIcon: 'heroicons:paper-airplane',
|
|
196
|
+
},
|
|
197
|
+
parameters: {
|
|
198
|
+
docs: {
|
|
199
|
+
source: {
|
|
200
|
+
code: `<Select prependIcon="heroicons:sparkles" appendIcon="heroicons:paper-airplane" />`,
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// Without chips
|
|
207
|
+
export const WithoutChips: Story = {
|
|
208
|
+
...Template,
|
|
209
|
+
args: { chips: false },
|
|
210
|
+
parameters: {
|
|
211
|
+
docs: {
|
|
212
|
+
source: {
|
|
213
|
+
code: `<Select chips="false" />`,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
// Multiple selection with chips enabled
|
|
220
|
+
export const MultipleWithChips: Story = {
|
|
221
|
+
...Template,
|
|
222
|
+
args: {
|
|
223
|
+
multiple: true,
|
|
224
|
+
chips: true,
|
|
225
|
+
closableChips: true,
|
|
226
|
+
items: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'],
|
|
227
|
+
},
|
|
228
|
+
parameters: {
|
|
229
|
+
docs: {
|
|
230
|
+
source: {
|
|
231
|
+
code: `<Select multiple chips closableChips :items="['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']" />`,
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Closable chips story
|
|
238
|
+
export const ClosableChips: Story = {
|
|
239
|
+
...Template,
|
|
240
|
+
args: {
|
|
241
|
+
chips: true,
|
|
242
|
+
closableChips: true,
|
|
243
|
+
items: ['Red', 'Blue', 'Green', 'Yellow', 'Purple'],
|
|
244
|
+
},
|
|
245
|
+
parameters: {
|
|
246
|
+
docs: {
|
|
247
|
+
source: {
|
|
248
|
+
code: `<Select chips closableChips :items="['Red', 'Blue', 'Green', 'Yellow', 'Purple']" />`,
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
// Menu and clear icons
|
|
255
|
+
export const WithMenuAndClearIcons: Story = {
|
|
256
|
+
...Template,
|
|
257
|
+
args: {
|
|
258
|
+
menuIcon: 'heroicons:menu',
|
|
259
|
+
clearIcon: 'heroicons:x-circle',
|
|
260
|
+
},
|
|
261
|
+
parameters: {
|
|
262
|
+
docs: {
|
|
263
|
+
source: {
|
|
264
|
+
code: `<Select menuIcon="heroicons:menu" clearIcon="heroicons:x-circle" />`,
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// Clearable and multiple disabled
|
|
271
|
+
export const ClearableAndMultiple: Story = {
|
|
272
|
+
...Template,
|
|
273
|
+
args: {
|
|
274
|
+
clearable: false,
|
|
275
|
+
multiple: false,
|
|
276
|
+
},
|
|
277
|
+
parameters: {
|
|
278
|
+
docs: {
|
|
279
|
+
source: {
|
|
280
|
+
code: `<Select clearable="false" multiple="false" />`,
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// Preselected values with returnObject variations
|
|
287
|
+
export const PreselectedValues: Story = {
|
|
288
|
+
render: (args) => ({
|
|
289
|
+
components: { Select },
|
|
290
|
+
setup() {
|
|
291
|
+
const items = [
|
|
292
|
+
{ title: 'California', value: 'CA' },
|
|
293
|
+
{ title: 'Colorado', value: 'CO' },
|
|
294
|
+
{ title: 'Florida', value: 'FL' },
|
|
295
|
+
{ title: 'Georgia', value: 'GA' },
|
|
296
|
+
{ title: 'Texas', value: 'TX' },
|
|
297
|
+
{ title: 'Wyoming', value: 'WY' },
|
|
298
|
+
];
|
|
299
|
+
|
|
300
|
+
const selectedValueFalse = ref('CA'); // Single selection, returnObject: false
|
|
301
|
+
const selectedObjectTrue = ref(items.find((item) => item.value === 'FL')); // Single selection, returnObject: true
|
|
302
|
+
const selectedValuesFalse = ref(['CA', 'GA']); // Multiple selection, returnObject: false
|
|
303
|
+
const selectedObjectsTrue = ref(
|
|
304
|
+
items.filter((item) => ['TX', 'WY'].includes(item.value)),
|
|
305
|
+
); // Multiple selection, returnObject: true
|
|
306
|
+
|
|
307
|
+
const updateModelValue = action('update:modelValue');
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
args: { ...args, items, itemTitle: 'title', itemValue: 'value' },
|
|
311
|
+
selectedValueFalse,
|
|
312
|
+
selectedObjectTrue,
|
|
313
|
+
selectedValuesFalse,
|
|
314
|
+
selectedObjectsTrue,
|
|
315
|
+
updateModelValue,
|
|
316
|
+
};
|
|
317
|
+
},
|
|
318
|
+
template: `
|
|
319
|
+
<div style="padding: 16px; display: flex; flex-direction: column; gap: 24px;">
|
|
320
|
+
<!-- Single selection with returnObject: false -->
|
|
321
|
+
<Select v-bind="args" :returnObject="false" :multiple="false" v-model="selectedValueFalse" @update:modelValue="updateModelValue" />
|
|
322
|
+
<p>Selected Value (returnObject: false): {{ selectedValueFalse }}</p>
|
|
323
|
+
|
|
324
|
+
<!-- Single selection with returnObject: true -->
|
|
325
|
+
<Select v-bind="args" :returnObject="true" :multiple="false" v-model="selectedObjectTrue" @update:modelValue="updateModelValue" />
|
|
326
|
+
<p>Selected Object (returnObject: true): {{ selectedObjectTrue }}</p>
|
|
327
|
+
|
|
328
|
+
<!-- Multiple selection with returnObject: false -->
|
|
329
|
+
<Select v-bind="args" :returnObject="false" :multiple="true" v-model="selectedValuesFalse" @update:modelValue="updateModelValue" />
|
|
330
|
+
<p>Selected Values (multiple, returnObject: false): {{ selectedValuesFalse }}</p>
|
|
331
|
+
|
|
332
|
+
<!-- Multiple selection with returnObject: true -->
|
|
333
|
+
<Select v-bind="args" :returnObject="true" :multiple="true" v-model="selectedObjectsTrue" @update:modelValue="updateModelValue" />
|
|
334
|
+
<p>Selected Objects (multiple, returnObject: true): {{ selectedObjectsTrue }}</p>
|
|
335
|
+
</div>
|
|
336
|
+
`,
|
|
337
|
+
}),
|
|
338
|
+
args: {},
|
|
339
|
+
parameters: {
|
|
340
|
+
docs: {
|
|
341
|
+
source: {
|
|
342
|
+
code: `
|
|
343
|
+
<template>
|
|
344
|
+
<Select
|
|
345
|
+
:items="[
|
|
346
|
+
{ title: 'California', value: 'CA' },
|
|
347
|
+
{ title: 'Colorado', value: 'CO' },
|
|
348
|
+
{ title: 'Florida', value: 'FL' },
|
|
349
|
+
{ title: 'Georgia', value: 'GA' },
|
|
350
|
+
{ title: 'Texas', value: 'TX' },
|
|
351
|
+
{ title: 'Wyoming', value: 'WY' }
|
|
352
|
+
]"
|
|
353
|
+
:returnObject="false"
|
|
354
|
+
:multiple="false"
|
|
355
|
+
v-model="selectedValueFalse"
|
|
356
|
+
/>
|
|
357
|
+
<Select
|
|
358
|
+
:items="[
|
|
359
|
+
{ title: 'California', value: 'CA' },
|
|
360
|
+
{ title: 'Colorado', value: 'CO' },
|
|
361
|
+
{ title: 'Florida', value: 'FL' },
|
|
362
|
+
{ title: 'Georgia', value: 'GA' },
|
|
363
|
+
{ title: 'Texas', value: 'TX' },
|
|
364
|
+
{ title: 'Wyoming', value: 'WY' }
|
|
365
|
+
]"
|
|
366
|
+
:returnObject="true"
|
|
367
|
+
:multiple="false"
|
|
368
|
+
v-model="selectedObjectTrue"
|
|
369
|
+
/>
|
|
370
|
+
<Select
|
|
371
|
+
:items="[
|
|
372
|
+
{ title: 'California', value: 'CA' },
|
|
373
|
+
{ title: 'Colorado', value: 'CO' },
|
|
374
|
+
{ title: 'Florida', value: 'FL' },
|
|
375
|
+
{ title: 'Georgia', value: 'GA' },
|
|
376
|
+
{ title: 'Texas', value: 'TX' },
|
|
377
|
+
{ title: 'Wyoming', value: 'WY' }
|
|
378
|
+
]"
|
|
379
|
+
:returnObject="false"
|
|
380
|
+
:multiple="true"
|
|
381
|
+
v-model="selectedValuesFalse"
|
|
382
|
+
/>
|
|
383
|
+
<Select
|
|
384
|
+
:items="[
|
|
385
|
+
{ title: 'California', value: 'CA' },
|
|
386
|
+
{ title: 'Colorado', value: 'CO' },
|
|
387
|
+
{ title: 'Florida', value: 'FL' },
|
|
388
|
+
{ title: 'Georgia', value: 'GA' },
|
|
389
|
+
{ title: 'Texas', value: 'TX' },
|
|
390
|
+
{ title: 'Wyoming', value: 'WY' }
|
|
391
|
+
]"
|
|
392
|
+
:returnObject="true"
|
|
393
|
+
:multiple="true"
|
|
394
|
+
v-model="selectedObjectsTrue"
|
|
395
|
+
/>
|
|
396
|
+
</template>
|
|
397
|
+
|
|
398
|
+
<script setup>
|
|
399
|
+
import { ref } from 'vue';
|
|
400
|
+
|
|
401
|
+
const items = [
|
|
402
|
+
{ title: 'California', value: 'CA' },
|
|
403
|
+
{ title: 'Colorado', value: 'CO' },
|
|
404
|
+
{ title: 'Florida', value: 'FL' },
|
|
405
|
+
{ title: 'Georgia', value: 'GA' },
|
|
406
|
+
{ title: 'Texas', value: 'TX' },
|
|
407
|
+
{ title: 'Wyoming', value: 'WY' },
|
|
408
|
+
];
|
|
409
|
+
|
|
410
|
+
const selectedValueFalse = ref('CA');
|
|
411
|
+
const selectedObjectTrue = ref(items.find((item) => item.value === 'FL'));
|
|
412
|
+
const selectedValuesFalse = ref(['CA', 'GA']);
|
|
413
|
+
const selectedObjectsTrue = ref(items.filter((item) => ['TX', 'WY'].includes(item.value)));
|
|
414
|
+
</script>
|
|
415
|
+
`,
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
},
|
|
419
|
+
};
|