@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,247 +1,247 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<v-text-field
|
|
3
|
-
:class="{
|
|
4
|
-
'is-success': success,
|
|
5
|
-
'is-error': error,
|
|
6
|
-
'is-warning': warning,
|
|
7
|
-
'custom-prepend-icon': true,
|
|
8
|
-
'border-on-hover': borderOnHover,
|
|
9
|
-
}"
|
|
10
|
-
ref="inputRef"
|
|
11
|
-
:placeholder="computedPlaceholder"
|
|
12
|
-
:variant="variant"
|
|
13
|
-
rounded="lg"
|
|
14
|
-
:prepend-icon="prependIcon"
|
|
15
|
-
:prepend-inner-icon="prependInnerIcon"
|
|
16
|
-
:append-inner-icon="appendInnerIcon"
|
|
17
|
-
:append-icon="appendIcon"
|
|
18
|
-
:disabled="disabled"
|
|
19
|
-
:density="density"
|
|
20
|
-
:hide-details="hideDetails"
|
|
21
|
-
:model-value="modelValue"
|
|
22
|
-
@update:modelValue="onInput"
|
|
23
|
-
:persistent-hint="persistentHint"
|
|
24
|
-
@click:prepend="onPrependClick"
|
|
25
|
-
@click:prepend-inner="onPrependInnerClick"
|
|
26
|
-
@click:append="onAppendClick"
|
|
27
|
-
@click:append-inner="onAppendInnerClick"
|
|
28
|
-
data-testid="root"
|
|
29
|
-
>
|
|
30
|
-
<!-- Prepend Slot (before v-field) -->
|
|
31
|
-
<template v-if="$slots.prepend" #prepend>
|
|
32
|
-
<slot name="prepend"></slot>
|
|
33
|
-
</template>
|
|
34
|
-
|
|
35
|
-
<!-- Prepend Inner Slot (at the start of v-field) -->
|
|
36
|
-
<template v-if="$slots['prepend-inner']" #prepend-inner>
|
|
37
|
-
<slot name="prepend-inner"></slot>
|
|
38
|
-
</template>
|
|
39
|
-
|
|
40
|
-
<!-- Append Inner Slot (at the end of v-field) -->
|
|
41
|
-
<template v-if="$slots['append-inner']" #append-inner>
|
|
42
|
-
<slot name="append-inner"></slot>
|
|
43
|
-
</template>
|
|
44
|
-
|
|
45
|
-
<!-- Append Slot (after v-field) -->
|
|
46
|
-
<template v-if="$slots.append" #append>
|
|
47
|
-
<slot name="append"></slot>
|
|
48
|
-
</template>
|
|
49
|
-
|
|
50
|
-
<!-- Details Slot (for messages, hints, etc.) -->
|
|
51
|
-
<template #details>
|
|
52
|
-
<div class="d-flex flex-row ga-1 align-center">
|
|
53
|
-
<v-icon icon="heroicons:exclamation-circle"></v-icon>
|
|
54
|
-
<span>{{ hint }}</span>
|
|
55
|
-
</div>
|
|
56
|
-
</template>
|
|
57
|
-
</v-text-field>
|
|
58
|
-
</template>
|
|
59
|
-
<script setup>
|
|
60
|
-
import { ref, nextTick, computed } from 'vue';
|
|
61
|
-
import './Input.css';
|
|
62
|
-
import { useI18n } from 'vue-i18n';
|
|
63
|
-
|
|
64
|
-
const { t } = useI18n();
|
|
65
|
-
|
|
66
|
-
// Define events that the component can emit
|
|
67
|
-
const emit = defineEmits([
|
|
68
|
-
'update:modelValue', // Emits when the input value is updated
|
|
69
|
-
'click:prepend', // Emits when the prepend icon is clicked
|
|
70
|
-
'click:append', // Emits when the append icon is clicked
|
|
71
|
-
'click:prepend-inner', // Emits when the prepend inner icon is clicked
|
|
72
|
-
'click:append-inner', // Emits when the append inner icon is clicked
|
|
73
|
-
]);
|
|
74
|
-
|
|
75
|
-
const computedPlaceholder = computed(() => {
|
|
76
|
-
return props.placeholder || t('wl.input.placeholder');
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// Define the component props
|
|
80
|
-
const props = defineProps({
|
|
81
|
-
/**
|
|
82
|
-
* Indicates if the input is in a success state.
|
|
83
|
-
* When true, the success style will be applied.
|
|
84
|
-
*/
|
|
85
|
-
success: Boolean,
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Indicates if the input is in an error state.
|
|
89
|
-
* When true, the error style will be applied.
|
|
90
|
-
*/
|
|
91
|
-
error: Boolean,
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Indicates if the input is in a warning state.
|
|
95
|
-
* When true, the warning style will be applied.
|
|
96
|
-
*/
|
|
97
|
-
warning: Boolean,
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Disables the input if true, making it non-interactive.
|
|
101
|
-
*/
|
|
102
|
-
disabled: Boolean,
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* The value of the input. It will be synced with v-model.
|
|
106
|
-
*/
|
|
107
|
-
modelValue: String,
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Controls the size and spacing of the input.
|
|
111
|
-
* Accepts 'compact' (default) or other values depending on the UI framework.
|
|
112
|
-
*/
|
|
113
|
-
density: {
|
|
114
|
-
type: String,
|
|
115
|
-
default: 'compact',
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* The placeholder text that appears when the input is empty.
|
|
120
|
-
*/
|
|
121
|
-
placeholder: {
|
|
122
|
-
type: String,
|
|
123
|
-
default: '',
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Hides the details or additional text when true.
|
|
128
|
-
*/
|
|
129
|
-
hideDetails: {
|
|
130
|
-
type: Boolean,
|
|
131
|
-
default: true,
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Icon to display before the input field.
|
|
136
|
-
*/
|
|
137
|
-
prependIcon: {
|
|
138
|
-
type: String,
|
|
139
|
-
default: '',
|
|
140
|
-
},
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Inner icon to display before the input field, but within the field itself.
|
|
144
|
-
*/
|
|
145
|
-
prependInnerIcon: {
|
|
146
|
-
type: String,
|
|
147
|
-
default: '',
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Icon to display after the input field.
|
|
152
|
-
*/
|
|
153
|
-
appendIcon: {
|
|
154
|
-
type: String,
|
|
155
|
-
default: '',
|
|
156
|
-
},
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Inner icon to display after the input field, but within the field itself.
|
|
160
|
-
*/
|
|
161
|
-
appendInnerIcon: {
|
|
162
|
-
type: String,
|
|
163
|
-
default: '',
|
|
164
|
-
},
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Hint text to display below the input.
|
|
168
|
-
*/
|
|
169
|
-
hint: {
|
|
170
|
-
type: String,
|
|
171
|
-
default: '',
|
|
172
|
-
},
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Keeps the hint text visible even when the input is focused.
|
|
176
|
-
*/
|
|
177
|
-
persistentHint: {
|
|
178
|
-
type: Boolean,
|
|
179
|
-
default: false,
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
-
variant: {
|
|
183
|
-
type: String,
|
|
184
|
-
default: 'outlined',
|
|
185
|
-
},
|
|
186
|
-
|
|
187
|
-
borderOnHover: {
|
|
188
|
-
type: Boolean,
|
|
189
|
-
default: false,
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
// Handle the event when the prepend icon is clicked
|
|
194
|
-
const onPrependClick = () => {
|
|
195
|
-
emit('click:prepend');
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
// Handle the event when the prepend inner icon is clicked
|
|
199
|
-
const onPrependInnerClick = () => {
|
|
200
|
-
emit('click:prepend-inner');
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
// Handle the event when the append icon is clicked
|
|
204
|
-
const onAppendClick = () => {
|
|
205
|
-
emit('click:append');
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
// Handle the event when the append inner icon is clicked
|
|
209
|
-
const onAppendInnerClick = () => {
|
|
210
|
-
emit('click:append-inner');
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
// Emit the updated value when the input changes, syncing with v-model
|
|
214
|
-
const onInput = (value) => {
|
|
215
|
-
emit('update:modelValue', value);
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
const inputRef = ref(null)
|
|
219
|
-
|
|
220
|
-
const getNativeInput = () => {
|
|
221
|
-
return inputRef.value?.$el?.querySelector('input');
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
const blur = () => {
|
|
225
|
-
nextTick(() => {
|
|
226
|
-
getNativeInput()?.blur();
|
|
227
|
-
});
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
const select = () => {
|
|
231
|
-
nextTick(() => {
|
|
232
|
-
getNativeInput()?.select();
|
|
233
|
-
});
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
const focus = () => {
|
|
237
|
-
nextTick(() => {
|
|
238
|
-
getNativeInput()?.focus();
|
|
239
|
-
});
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
defineExpose({
|
|
243
|
-
blur,
|
|
244
|
-
select,
|
|
245
|
-
focus
|
|
246
|
-
});
|
|
247
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<v-text-field
|
|
3
|
+
:class="{
|
|
4
|
+
'is-success': success,
|
|
5
|
+
'is-error': error,
|
|
6
|
+
'is-warning': warning,
|
|
7
|
+
'custom-prepend-icon': true,
|
|
8
|
+
'border-on-hover': borderOnHover,
|
|
9
|
+
}"
|
|
10
|
+
ref="inputRef"
|
|
11
|
+
:placeholder="computedPlaceholder"
|
|
12
|
+
:variant="variant"
|
|
13
|
+
rounded="lg"
|
|
14
|
+
:prepend-icon="prependIcon"
|
|
15
|
+
:prepend-inner-icon="prependInnerIcon"
|
|
16
|
+
:append-inner-icon="appendInnerIcon"
|
|
17
|
+
:append-icon="appendIcon"
|
|
18
|
+
:disabled="disabled"
|
|
19
|
+
:density="density"
|
|
20
|
+
:hide-details="hideDetails"
|
|
21
|
+
:model-value="modelValue"
|
|
22
|
+
@update:modelValue="onInput"
|
|
23
|
+
:persistent-hint="persistentHint"
|
|
24
|
+
@click:prepend="onPrependClick"
|
|
25
|
+
@click:prepend-inner="onPrependInnerClick"
|
|
26
|
+
@click:append="onAppendClick"
|
|
27
|
+
@click:append-inner="onAppendInnerClick"
|
|
28
|
+
data-testid="root"
|
|
29
|
+
>
|
|
30
|
+
<!-- Prepend Slot (before v-field) -->
|
|
31
|
+
<template v-if="$slots.prepend" #prepend>
|
|
32
|
+
<slot name="prepend"></slot>
|
|
33
|
+
</template>
|
|
34
|
+
|
|
35
|
+
<!-- Prepend Inner Slot (at the start of v-field) -->
|
|
36
|
+
<template v-if="$slots['prepend-inner']" #prepend-inner>
|
|
37
|
+
<slot name="prepend-inner"></slot>
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<!-- Append Inner Slot (at the end of v-field) -->
|
|
41
|
+
<template v-if="$slots['append-inner']" #append-inner>
|
|
42
|
+
<slot name="append-inner"></slot>
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<!-- Append Slot (after v-field) -->
|
|
46
|
+
<template v-if="$slots.append" #append>
|
|
47
|
+
<slot name="append"></slot>
|
|
48
|
+
</template>
|
|
49
|
+
|
|
50
|
+
<!-- Details Slot (for messages, hints, etc.) -->
|
|
51
|
+
<template #details>
|
|
52
|
+
<div class="d-flex flex-row ga-1 align-center">
|
|
53
|
+
<v-icon icon="heroicons:exclamation-circle"></v-icon>
|
|
54
|
+
<span>{{ hint }}</span>
|
|
55
|
+
</div>
|
|
56
|
+
</template>
|
|
57
|
+
</v-text-field>
|
|
58
|
+
</template>
|
|
59
|
+
<script setup>
|
|
60
|
+
import { ref, nextTick, computed } from 'vue';
|
|
61
|
+
import './Input.css';
|
|
62
|
+
import { useI18n } from 'vue-i18n';
|
|
63
|
+
|
|
64
|
+
const { t } = useI18n();
|
|
65
|
+
|
|
66
|
+
// Define events that the component can emit
|
|
67
|
+
const emit = defineEmits([
|
|
68
|
+
'update:modelValue', // Emits when the input value is updated
|
|
69
|
+
'click:prepend', // Emits when the prepend icon is clicked
|
|
70
|
+
'click:append', // Emits when the append icon is clicked
|
|
71
|
+
'click:prepend-inner', // Emits when the prepend inner icon is clicked
|
|
72
|
+
'click:append-inner', // Emits when the append inner icon is clicked
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
const computedPlaceholder = computed(() => {
|
|
76
|
+
return props.placeholder || t('wl.input.placeholder');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Define the component props
|
|
80
|
+
const props = defineProps({
|
|
81
|
+
/**
|
|
82
|
+
* Indicates if the input is in a success state.
|
|
83
|
+
* When true, the success style will be applied.
|
|
84
|
+
*/
|
|
85
|
+
success: Boolean,
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Indicates if the input is in an error state.
|
|
89
|
+
* When true, the error style will be applied.
|
|
90
|
+
*/
|
|
91
|
+
error: Boolean,
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Indicates if the input is in a warning state.
|
|
95
|
+
* When true, the warning style will be applied.
|
|
96
|
+
*/
|
|
97
|
+
warning: Boolean,
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Disables the input if true, making it non-interactive.
|
|
101
|
+
*/
|
|
102
|
+
disabled: Boolean,
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The value of the input. It will be synced with v-model.
|
|
106
|
+
*/
|
|
107
|
+
modelValue: String,
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Controls the size and spacing of the input.
|
|
111
|
+
* Accepts 'compact' (default) or other values depending on the UI framework.
|
|
112
|
+
*/
|
|
113
|
+
density: {
|
|
114
|
+
type: String,
|
|
115
|
+
default: 'compact',
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The placeholder text that appears when the input is empty.
|
|
120
|
+
*/
|
|
121
|
+
placeholder: {
|
|
122
|
+
type: String,
|
|
123
|
+
default: '',
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Hides the details or additional text when true.
|
|
128
|
+
*/
|
|
129
|
+
hideDetails: {
|
|
130
|
+
type: Boolean,
|
|
131
|
+
default: true,
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Icon to display before the input field.
|
|
136
|
+
*/
|
|
137
|
+
prependIcon: {
|
|
138
|
+
type: String,
|
|
139
|
+
default: '',
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Inner icon to display before the input field, but within the field itself.
|
|
144
|
+
*/
|
|
145
|
+
prependInnerIcon: {
|
|
146
|
+
type: String,
|
|
147
|
+
default: '',
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Icon to display after the input field.
|
|
152
|
+
*/
|
|
153
|
+
appendIcon: {
|
|
154
|
+
type: String,
|
|
155
|
+
default: '',
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Inner icon to display after the input field, but within the field itself.
|
|
160
|
+
*/
|
|
161
|
+
appendInnerIcon: {
|
|
162
|
+
type: String,
|
|
163
|
+
default: '',
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Hint text to display below the input.
|
|
168
|
+
*/
|
|
169
|
+
hint: {
|
|
170
|
+
type: String,
|
|
171
|
+
default: '',
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Keeps the hint text visible even when the input is focused.
|
|
176
|
+
*/
|
|
177
|
+
persistentHint: {
|
|
178
|
+
type: Boolean,
|
|
179
|
+
default: false,
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
variant: {
|
|
183
|
+
type: String,
|
|
184
|
+
default: 'outlined',
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
borderOnHover: {
|
|
188
|
+
type: Boolean,
|
|
189
|
+
default: false,
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Handle the event when the prepend icon is clicked
|
|
194
|
+
const onPrependClick = () => {
|
|
195
|
+
emit('click:prepend');
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// Handle the event when the prepend inner icon is clicked
|
|
199
|
+
const onPrependInnerClick = () => {
|
|
200
|
+
emit('click:prepend-inner');
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
// Handle the event when the append icon is clicked
|
|
204
|
+
const onAppendClick = () => {
|
|
205
|
+
emit('click:append');
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
// Handle the event when the append inner icon is clicked
|
|
209
|
+
const onAppendInnerClick = () => {
|
|
210
|
+
emit('click:append-inner');
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
// Emit the updated value when the input changes, syncing with v-model
|
|
214
|
+
const onInput = (value) => {
|
|
215
|
+
emit('update:modelValue', value);
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
const inputRef = ref(null)
|
|
219
|
+
|
|
220
|
+
const getNativeInput = () => {
|
|
221
|
+
return inputRef.value?.$el?.querySelector('input');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const blur = () => {
|
|
225
|
+
nextTick(() => {
|
|
226
|
+
getNativeInput()?.blur();
|
|
227
|
+
});
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const select = () => {
|
|
231
|
+
nextTick(() => {
|
|
232
|
+
getNativeInput()?.select();
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const focus = () => {
|
|
237
|
+
nextTick(() => {
|
|
238
|
+
getNativeInput()?.focus();
|
|
239
|
+
});
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
defineExpose({
|
|
243
|
+
blur,
|
|
244
|
+
select,
|
|
245
|
+
focus
|
|
246
|
+
});
|
|
247
|
+
</script>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
.appointment-card .v-btn {
|
|
2
|
-
padding: 6px 8px !important;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
.appointment-card .v-icon {
|
|
6
|
-
color: var(--Dental-Blue-0) !important;
|
|
7
|
-
}
|
|
1
|
+
.appointment-card .v-btn {
|
|
2
|
+
padding: 6px 8px !important;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.appointment-card .v-icon {
|
|
6
|
+
color: var(--Dental-Blue-0) !important;
|
|
7
|
+
}
|