@zap-wunschlachen/wl-shared-components 1.0.76 → 1.0.78

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.
Files changed (227) hide show
  1. package/.github/workflows/playwright.yml +229 -229
  2. package/.github/workflows/static.yml +61 -61
  3. package/.github/workflows/update-snapshots.yml +37 -37
  4. package/.prettierrc.json +8 -8
  5. package/.storybook/main.ts +18 -18
  6. package/.storybook/preview.ts +37 -37
  7. package/.storybook/storyWrapper.vue +18 -18
  8. package/.storybook/withVuetifyTheme.decorator.ts +21 -21
  9. package/App.vue +139 -139
  10. package/README.md +56 -56
  11. package/docs/assets.md +62 -62
  12. package/heroicons.ts +75 -75
  13. package/index.html +19 -19
  14. package/package.json +71 -71
  15. package/playwright.config.ts +48 -48
  16. package/public/background.svg +60 -60
  17. package/public/style.css +187 -187
  18. package/public/technologies.svg +22 -22
  19. package/scripts/check-translations.ts +352 -352
  20. package/src/assets/css/base.css +242 -242
  21. package/src/assets/css/variables.css +176 -176
  22. package/src/components/Accordion/Accordion.css +65 -65
  23. package/src/components/Accordion/AccordionGroup.vue +88 -88
  24. package/src/components/Accordion/AccordionItem.vue +272 -272
  25. package/src/components/Accordion/presets/default.css +4 -4
  26. package/src/components/Accordion/presets/elevated.css +25 -25
  27. package/src/components/Accordion/presets/filled.css +26 -26
  28. package/src/components/Accordion/presets/index.css +5 -5
  29. package/src/components/Accordion/presets/plain.css +34 -34
  30. package/src/components/Appointment/Card/Actions.css +54 -54
  31. package/src/components/Appointment/Card/Actions.vue +99 -99
  32. package/src/components/Appointment/Card/AnamneseNotification.css +20 -20
  33. package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
  34. package/src/components/Appointment/Card/Card.css +99 -99
  35. package/src/components/Appointment/Card/Card.vue +97 -97
  36. package/src/components/Appointment/Card/Details.css +62 -62
  37. package/src/components/Appointment/Card/Details.vue +44 -44
  38. package/src/components/Audio/Audio.vue +187 -187
  39. package/src/components/Audio/Waveform.vue +118 -118
  40. package/src/components/Banner/Banner.css +29 -29
  41. package/src/components/Banner/Banner.vue +89 -89
  42. package/src/components/Button/Button.vue +257 -257
  43. package/src/components/CheckBox/CheckBox.css +234 -234
  44. package/src/components/CheckBox/Checkbox.vue +184 -184
  45. package/src/components/DateInput/DateInput.css +2 -2
  46. package/src/components/DateInput/DateInput.vue +376 -370
  47. package/src/components/Dialog/Dialog.css +6 -6
  48. package/src/components/Dialog/Dialog.vue +46 -46
  49. package/src/components/EditField/EditField.css +19 -19
  50. package/src/components/EditField/EditField.vue +211 -211
  51. package/src/components/ErrorPage/ErrorPage.css +172 -172
  52. package/src/components/IconBullet/IconBullet.vue +104 -104
  53. package/src/components/IconBullet/IconBulletList.vue +55 -55
  54. package/src/components/Icons/AdvanceAppointments.vue +161 -161
  55. package/src/components/Icons/Audio/CloudFailed.vue +27 -27
  56. package/src/components/Icons/Audio/CloudSaved.vue +28 -28
  57. package/src/components/Icons/Audio/Delete.vue +22 -22
  58. package/src/components/Icons/Audio/Pause.vue +25 -25
  59. package/src/components/Icons/Audio/Play.vue +22 -22
  60. package/src/components/Icons/Calendar.vue +28 -28
  61. package/src/components/Icons/CalendarNotification.vue +137 -137
  62. package/src/components/Icons/Chair.vue +43 -43
  63. package/src/components/Icons/ChairNotification.vue +46 -46
  64. package/src/components/Icons/Circle.vue +66 -66
  65. package/src/components/Icons/FavIcon.vue +69 -69
  66. package/src/components/Icons/FilledCircle.vue +11 -11
  67. package/src/components/Icons/Group3.vue +57 -57
  68. package/src/components/Icons/Play.vue +16 -16
  69. package/src/components/Icons/RingNotification.vue +65 -65
  70. package/src/components/Icons/SolidArrowRight.vue +14 -14
  71. package/src/components/Icons/checkbox.vue +19 -19
  72. package/src/components/Icons/outlineChecked.vue +38 -38
  73. package/src/components/Input/Input.css +234 -234
  74. package/src/components/Input/Input.vue +281 -281
  75. package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
  76. package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
  77. package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
  78. package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
  79. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
  80. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
  81. package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
  82. package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
  83. package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
  84. package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
  85. package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
  86. package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
  87. package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
  88. package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
  89. package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
  90. package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
  91. package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
  92. package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
  93. package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
  94. package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
  95. package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
  96. package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
  97. package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
  98. package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
  99. package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
  100. package/src/components/Loader/Loader.css +78 -78
  101. package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
  102. package/src/components/MaintenanceBanner/MaintenanceBanner.vue +140 -140
  103. package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
  104. package/src/components/Modal/Modal.css +5 -5
  105. package/src/components/Modal/Modal.vue +29 -29
  106. package/src/components/NotificationBubble/NotificationBubble.css +4 -4
  107. package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
  108. package/src/components/OtpInput/OtpInput.css +43 -43
  109. package/src/components/OtpInput/OtpInput.vue +181 -181
  110. package/src/components/PhoneInput/PhoneInput.css +151 -126
  111. package/src/components/PhoneInput/PhoneInput.vue +230 -139
  112. package/src/components/RadioGroup/RadioGroup.css +65 -0
  113. package/src/components/RadioGroup/RadioGroup.vue +134 -0
  114. package/src/components/Select/Select.css +172 -172
  115. package/src/components/Select/Select.vue +377 -377
  116. package/src/components/SelectAutocomplete/SelectAutocomplete.css +172 -172
  117. package/src/components/SelectAutocomplete/SelectAutocomplete.vue +414 -414
  118. package/src/components/TextArea/TextArea.css +269 -269
  119. package/src/components/TextArea/TextArea.vue +207 -207
  120. package/src/components/TickBox/TickBox.css +116 -116
  121. package/src/components/TickBox/TickBox.vue +172 -172
  122. package/src/components/Tile/Tile.css +106 -106
  123. package/src/components/Tile/Tile.vue +173 -173
  124. package/src/components/accessibility.css +218 -218
  125. package/src/components/index.ts +110 -109
  126. package/src/constants/iconEnums.ts +3 -3
  127. package/src/i18n/i18n.ts +15 -15
  128. package/src/i18n/locales/de.json +30 -30
  129. package/src/i18n/locales/en.json +30 -30
  130. package/src/index.ts +43 -43
  131. package/src/main.ts +11 -11
  132. package/src/pages/AccordionGroupPage.vue +873 -873
  133. package/src/pages/AllPage.vue +2483 -2365
  134. package/src/pages/SelectPage.vue +1302 -1302
  135. package/src/pages/TilePage.vue +902 -902
  136. package/src/plugins/vuetify.ts +54 -54
  137. package/src/shims-vue.d.ts +30 -30
  138. package/src/utils/index.ts +733 -733
  139. package/src/vite-env.d.ts +1 -1
  140. package/tests/unit/accessibility/component-a11y.spec.ts +657 -657
  141. package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
  142. package/tests/unit/components/Accordion/AccordionItem.spec.ts +257 -257
  143. package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
  144. package/tests/unit/components/Appointment/Card/Actions.spec.ts +436 -436
  145. package/tests/unit/components/Appointment/Card/Card.spec.ts +531 -531
  146. package/tests/unit/components/Appointment/Card/Details.spec.ts +395 -395
  147. package/tests/unit/components/Audio/Audio.spec.ts +403 -403
  148. package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
  149. package/tests/unit/components/Background/Background.spec.ts +177 -177
  150. package/tests/unit/components/Core/AnamneseAnswerDialog.spec.ts +344 -0
  151. package/tests/unit/components/Core/Banner.spec.ts +187 -0
  152. package/tests/unit/components/Core/Button.spec.ts +346 -346
  153. package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
  154. package/tests/unit/components/Core/DateInput.spec.ts +702 -702
  155. package/tests/unit/components/Core/Dialog.spec.ts +448 -448
  156. package/tests/unit/components/Core/EditField.spec.ts +541 -541
  157. package/tests/unit/components/Core/Input.spec.ts +512 -512
  158. package/tests/unit/components/Core/List.spec.ts +163 -0
  159. package/tests/unit/components/Core/ListItem.spec.ts +205 -0
  160. package/tests/unit/components/Core/Modal.spec.ts +518 -518
  161. package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
  162. package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
  163. package/tests/unit/components/Core/PhoneInput.spec.ts +757 -619
  164. package/tests/unit/components/Core/RadioGroup.spec.ts +318 -0
  165. package/tests/unit/components/Core/Select.spec.ts +712 -712
  166. package/tests/unit/components/Core/SelectAutocomplete.spec.ts +361 -0
  167. package/tests/unit/components/Core/TextArea.spec.ts +565 -565
  168. package/tests/unit/components/Core/TickBox.spec.ts +836 -836
  169. package/tests/unit/components/Core/Tile.spec.ts +286 -0
  170. package/tests/unit/components/DateInput/DateInput.spec.ts +128 -0
  171. package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -313
  172. package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -153
  173. package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
  174. package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
  175. package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +186 -186
  176. package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
  177. package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
  178. package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
  179. package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
  180. package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
  181. package/tests/unit/components/Icons/CalendarNotification.spec.ts +193 -193
  182. package/tests/unit/components/Icons/Chair.spec.ts +241 -241
  183. package/tests/unit/components/Icons/ChairNotification.spec.ts +318 -318
  184. package/tests/unit/components/Icons/Circle.spec.ts +255 -255
  185. package/tests/unit/components/Icons/FavIcon.spec.ts +259 -259
  186. package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
  187. package/tests/unit/components/Icons/Group3.spec.ts +362 -362
  188. package/tests/unit/components/Icons/Logo.spec.ts +229 -229
  189. package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
  190. package/tests/unit/components/Icons/RingNotification.spec.ts +400 -400
  191. package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
  192. package/tests/unit/components/Icons/calendar.spec.ts +293 -293
  193. package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
  194. package/tests/unit/components/Icons/outlineChecked.spec.ts +441 -441
  195. package/tests/unit/components/Icons/play.spec.ts +315 -315
  196. package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
  197. package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
  198. package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
  199. package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
  200. package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
  201. package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
  202. package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
  203. package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
  204. package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
  205. package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
  206. package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
  207. package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
  208. package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
  209. package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
  210. package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
  211. package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
  212. package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
  213. package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
  214. package/tests/unit/components/Loader/Loader.spec.ts +197 -197
  215. package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -302
  216. package/tests/unit/constants/iconEnums.spec.ts +39 -39
  217. package/tests/unit/i18n/i18n.spec.ts +88 -88
  218. package/tests/unit/plugins/vuetify.spec.ts +182 -182
  219. package/tests/unit/setup.ts +237 -237
  220. package/tests/unit/src/components/index.spec.ts.skip +192 -192
  221. package/tests/unit/src/index.spec.ts.skip +182 -182
  222. package/tests/unit/src/main.spec.ts +111 -111
  223. package/tests/unit/utils/accessibility.spec.ts +318 -318
  224. package/tests/unit/utils/anamnese.spec.ts +531 -0
  225. package/tsconfig.json +26 -26
  226. package/vite.config.ts +29 -29
  227. package/vitest.config.ts +91 -91
@@ -1,34 +1,34 @@
1
- /* Plain preset - minimal styling, no background, no shadow, no dividers */
2
- .wl-accordion-item--plain {
3
- background: transparent !important;
4
- }
5
-
6
- .wl-accordion-item--plain.v-expansion-panel {
7
- background: transparent !important;
8
- }
9
-
10
- .wl-accordion-item--plain .v-expansion-panel__shadow {
11
- box-shadow: none !important;
12
- }
13
-
14
- .wl-accordion-item--plain .v-expansion-panel-title {
15
- padding: 12px 0 !important;
16
- min-height: auto !important;
17
- background: transparent !important;
18
- }
19
-
20
- .wl-accordion-item--plain .v-expansion-panel-title:hover {
21
- background: transparent !important;
22
- }
23
-
24
- .wl-accordion-item--plain .v-expansion-panel-title__overlay {
25
- opacity: 0 !important;
26
- }
27
-
28
- .wl-accordion-item--plain .v-expansion-panel-text {
29
- background: transparent !important;
30
- }
31
-
32
- .wl-accordion-item--plain .v-expansion-panel-text__wrapper {
33
- padding: 0 0 12px 0 !important;
34
- }
1
+ /* Plain preset - minimal styling, no background, no shadow, no dividers */
2
+ .wl-accordion-item--plain {
3
+ background: transparent !important;
4
+ }
5
+
6
+ .wl-accordion-item--plain.v-expansion-panel {
7
+ background: transparent !important;
8
+ }
9
+
10
+ .wl-accordion-item--plain .v-expansion-panel__shadow {
11
+ box-shadow: none !important;
12
+ }
13
+
14
+ .wl-accordion-item--plain .v-expansion-panel-title {
15
+ padding: 12px 0 !important;
16
+ min-height: auto !important;
17
+ background: transparent !important;
18
+ }
19
+
20
+ .wl-accordion-item--plain .v-expansion-panel-title:hover {
21
+ background: transparent !important;
22
+ }
23
+
24
+ .wl-accordion-item--plain .v-expansion-panel-title__overlay {
25
+ opacity: 0 !important;
26
+ }
27
+
28
+ .wl-accordion-item--plain .v-expansion-panel-text {
29
+ background: transparent !important;
30
+ }
31
+
32
+ .wl-accordion-item--plain .v-expansion-panel-text__wrapper {
33
+ padding: 0 0 12px 0 !important;
34
+ }
@@ -1,55 +1,55 @@
1
- /* Actions component styles */
2
- .actions-grid {
3
- margin-bottom: 1.25rem;
4
- display: flex;
5
- gap: 20px;
6
- color: var(--appointment_card_title);
7
- }
8
-
9
- .actions-column {
10
- display: flex;
11
- flex-direction: column;
12
- gap: 20px;
13
- }
14
-
15
- .action-button {
16
- font-weight: bold;
17
- flex: 1;
18
- }
19
-
20
- .action-button:first-child {
21
- padding-right: 0.5rem;
22
- }
23
-
24
- .action-button:last-child {
25
- padding-left: 0.5rem;
26
- }
27
-
28
- .full-width-button {
29
- width: 100%;
30
- }
31
-
32
- .full-width-button-opacity {
33
- width: 100%;
34
- opacity: 1;
35
- }
36
-
37
- .missed-info-box {
38
- background-color: var(--Dental-Light-Blue--3);
39
- }
40
-
41
- .border-rounded-md {
42
- border-radius: 0.375rem;
43
- }
44
-
45
- .p-4 {
46
- padding: 1rem;
47
- }
48
-
49
- .action-link {
50
- color: var(--appointment_card_title);
51
- }
52
-
53
- .status-error {
54
- color: var(--error-color, var(--Error-Red-0));
1
+ /* Actions component styles */
2
+ .actions-grid {
3
+ margin-bottom: 1.25rem;
4
+ display: flex;
5
+ gap: 20px;
6
+ color: var(--appointment_card_title);
7
+ }
8
+
9
+ .actions-column {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: 20px;
13
+ }
14
+
15
+ .action-button {
16
+ font-weight: bold;
17
+ flex: 1;
18
+ }
19
+
20
+ .action-button:first-child {
21
+ padding-right: 0.5rem;
22
+ }
23
+
24
+ .action-button:last-child {
25
+ padding-left: 0.5rem;
26
+ }
27
+
28
+ .full-width-button {
29
+ width: 100%;
30
+ }
31
+
32
+ .full-width-button-opacity {
33
+ width: 100%;
34
+ opacity: 1;
35
+ }
36
+
37
+ .missed-info-box {
38
+ background-color: var(--Dental-Light-Blue--3);
39
+ }
40
+
41
+ .border-rounded-md {
42
+ border-radius: 0.375rem;
43
+ }
44
+
45
+ .p-4 {
46
+ padding: 1rem;
47
+ }
48
+
49
+ .action-link {
50
+ color: var(--appointment_card_title);
51
+ }
52
+
53
+ .status-error {
54
+ color: var(--error-color, var(--Error-Red-0));
55
55
  }
@@ -1,100 +1,100 @@
1
- <template>
2
- <template v-if="appointment.status === 'upcoming'">
3
- <div class="actions-grid">
4
- <Button class="action-button" variant="outlined" prependIcon="heroicons:x-circle" :disabled="disabled"
5
- :label="t('wl.appointment_card.cancel')" size="small" @click="handleCancel" />
6
- <Button class="action-button" :variant="confirmable ? 'outlined' : 'flat'"
7
- prependIcon="heroicons:arrows-up-down" :disabled="disabled" :label="t('wl.appointment_card.reschedule')"
8
- size="small" @click="handleReschedule" />
9
- </div>
10
- <Button v-if="confirmable" class="full-width-button" :label="t('wl.appointment_card.confirm')"
11
- :disabled="disabled" @click="confirmAppointment" />
12
-
13
- </template>
14
- <template v-if="appointment.status === 'cancelled'">
15
- <div>
16
- <p class="text-center font-weight-bold status-error mb-5">
17
- <v-icon size="26" icon="heroicons:x-circle" />
18
- {{ t('appointments.status.cancelled') }}
19
- </p>
20
- <div class="actions-grid">
21
- <Button class="full-width-button-opacity" variant="outlined" prependIcon="heroicons:arrow-path"
22
- :disabled="disabled" :label="t('wl.appointment_card.reschedule_after_cancellation')"
23
- @click="handleReschedule" />
24
- </div>
25
- </div>
26
- </template>
27
- <template v-if="appointment.status === 'done' && appointment.for_patient">
28
- <div class="actions-grid">
29
- <Button class="full-width-button-opacity" variant="outlined" prependIcon="heroicons:arrow-path"
30
- :disabled="disabled" :label="t('wl.appointment_card.reschedule_after_cancellation')"
31
- @click="handleReschedule" />
32
- </div>
33
- </template>
34
- <template v-if="appointment.status === 'missed'">
35
- <p class="text-center font-weight-bold status-error mb-5">
36
- <v-icon size="26" icon="heroicons:x-circle" />
37
- {{ t('appointments.status.missed') }}
38
- </p>
39
- <div class="actions-grid justify-center align-center missed-info-box border border-rounded-md p-4">
40
- <div>
41
- <v-icon size="46" icon="heroicons:calendar-days" />
42
- </div>
43
- <div>
44
- <h4>{{ t('appointment.missed.title') }}</h4>
45
- <p>{{ t('phone') }}: <a rel="stylesheet" class="action-link" href="tel:030/495 20 10">030/495 20
46
- 10</a>
47
- <br />
48
- {{ t('email') }}: <a rel="stylesheet" class="action-link"
49
- href="mailto:info@wunschlachen.de">info@wunschlachen.de</a>
50
- </p>
51
- </div>
52
- </div>
53
- </template>
54
- </template>
55
-
56
-
57
- <script setup lang="ts">
58
- import { AppointmentData } from '@/types';
59
- import { computed } from 'vue';
60
- import Button from '../../Button/Button.vue';
61
- import { useI18n } from 'vue-i18n';
62
-
63
- const { t } = useI18n();
64
-
65
- const { appointment, disabled } = defineProps<{
66
- appointment: AppointmentData,
67
- disabled?: boolean,
68
- }>();
69
-
70
- // Emit events upward when actions occur
71
- const emit = defineEmits<{
72
- (e: 'confirmed', id: string): void
73
- (e: 'cancelled', id: string): void
74
- (e: 'rescheduled', id: string): void
75
- }>()
76
-
77
- // Determine visibility: only show confirm button when unconfirmed and appointment is within next 48h
78
- const confirmable = computed(() => {
79
- const now = Date.now()
80
- const startTime = new Date(appointment.start).getTime()
81
- const diff = startTime - now
82
- return !appointment.is_confirmed && diff > 0 && diff <= 48 * 3600 * 1000
83
- })
84
-
85
- // Log confirmation when the button is clicked
86
- const confirmAppointment = async () => {
87
- emit('confirmed', appointment.id)
88
- }
89
-
90
- const handleCancel = async () => {
91
- emit('cancelled', appointment.id)
92
- }
93
-
94
- const handleReschedule = async () => {
95
- emit('rescheduled', appointment.id)
96
- }
97
-
98
- </script>
99
-
1
+ <template>
2
+ <template v-if="appointment.status === 'upcoming'">
3
+ <div class="actions-grid">
4
+ <Button class="action-button" variant="outlined" prependIcon="heroicons:x-circle" :disabled="disabled"
5
+ :label="t('wl.appointment_card.cancel')" size="small" @click="handleCancel" />
6
+ <Button class="action-button" :variant="confirmable ? 'outlined' : 'flat'"
7
+ prependIcon="heroicons:arrows-up-down" :disabled="disabled" :label="t('wl.appointment_card.reschedule')"
8
+ size="small" @click="handleReschedule" />
9
+ </div>
10
+ <Button v-if="confirmable" class="full-width-button" :label="t('wl.appointment_card.confirm')"
11
+ :disabled="disabled" @click="confirmAppointment" />
12
+
13
+ </template>
14
+ <template v-if="appointment.status === 'cancelled'">
15
+ <div>
16
+ <p class="text-center font-weight-bold status-error mb-5">
17
+ <v-icon size="26" icon="heroicons:x-circle" />
18
+ {{ t('appointments.status.cancelled') }}
19
+ </p>
20
+ <div class="actions-grid">
21
+ <Button class="full-width-button-opacity" variant="outlined" prependIcon="heroicons:arrow-path"
22
+ :disabled="disabled" :label="t('wl.appointment_card.reschedule_after_cancellation')"
23
+ @click="handleReschedule" />
24
+ </div>
25
+ </div>
26
+ </template>
27
+ <template v-if="appointment.status === 'done' && appointment.for_patient">
28
+ <div class="actions-grid">
29
+ <Button class="full-width-button-opacity" variant="outlined" prependIcon="heroicons:arrow-path"
30
+ :disabled="disabled" :label="t('wl.appointment_card.reschedule_after_cancellation')"
31
+ @click="handleReschedule" />
32
+ </div>
33
+ </template>
34
+ <template v-if="appointment.status === 'missed'">
35
+ <p class="text-center font-weight-bold status-error mb-5">
36
+ <v-icon size="26" icon="heroicons:x-circle" />
37
+ {{ t('appointments.status.missed') }}
38
+ </p>
39
+ <div class="actions-grid justify-center align-center missed-info-box border border-rounded-md p-4">
40
+ <div>
41
+ <v-icon size="46" icon="heroicons:calendar-days" />
42
+ </div>
43
+ <div>
44
+ <h4>{{ t('appointment.missed.title') }}</h4>
45
+ <p>{{ t('phone') }}: <a rel="stylesheet" class="action-link" href="tel:030/495 20 10">030/495 20
46
+ 10</a>
47
+ <br />
48
+ {{ t('email') }}: <a rel="stylesheet" class="action-link"
49
+ href="mailto:info@wunschlachen.de">info@wunschlachen.de</a>
50
+ </p>
51
+ </div>
52
+ </div>
53
+ </template>
54
+ </template>
55
+
56
+
57
+ <script setup lang="ts">
58
+ import { AppointmentData } from '@/types';
59
+ import { computed } from 'vue';
60
+ import Button from '../../Button/Button.vue';
61
+ import { useI18n } from 'vue-i18n';
62
+
63
+ const { t } = useI18n();
64
+
65
+ const { appointment, disabled } = defineProps<{
66
+ appointment: AppointmentData,
67
+ disabled?: boolean,
68
+ }>();
69
+
70
+ // Emit events upward when actions occur
71
+ const emit = defineEmits<{
72
+ (e: 'confirmed', id: string): void
73
+ (e: 'cancelled', id: string): void
74
+ (e: 'rescheduled', id: string): void
75
+ }>()
76
+
77
+ // Determine visibility: only show confirm button when unconfirmed and appointment is within next 48h
78
+ const confirmable = computed(() => {
79
+ const now = Date.now()
80
+ const startTime = new Date(appointment.start).getTime()
81
+ const diff = startTime - now
82
+ return !appointment.is_confirmed && diff > 0 && diff <= 48 * 3600 * 1000
83
+ })
84
+
85
+ // Log confirmation when the button is clicked
86
+ const confirmAppointment = async () => {
87
+ emit('confirmed', appointment.id)
88
+ }
89
+
90
+ const handleCancel = async () => {
91
+ emit('cancelled', appointment.id)
92
+ }
93
+
94
+ const handleReschedule = async () => {
95
+ emit('rescheduled', appointment.id)
96
+ }
97
+
98
+ </script>
99
+
100
100
  <style src="./Actions.css" scoped></style>
@@ -1,21 +1,21 @@
1
- .main-container {
2
- display: flex;
3
- flex-direction: row;
4
- justify-content: space-between;
5
- align-items: center;
6
- background-color: var(--Power-Red--4);
7
- border-radius: 8px;
8
- padding: 15px 10px;
9
- margin-top: 10px;
10
- color: var(--appointment_card_title);
11
- }
12
-
13
- .text-container {
14
- display: flex;
15
- flex-direction: column;
16
- gap: 6px;
17
- }
18
-
19
- .text-container p {
20
- color: inherit;
1
+ .main-container {
2
+ display: flex;
3
+ flex-direction: row;
4
+ justify-content: space-between;
5
+ align-items: center;
6
+ background-color: var(--Power-Red--4);
7
+ border-radius: 8px;
8
+ padding: 15px 10px;
9
+ margin-top: 10px;
10
+ color: var(--appointment_card_title);
11
+ }
12
+
13
+ .text-container {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: 6px;
17
+ }
18
+
19
+ .text-container p {
20
+ color: inherit;
21
21
  }
@@ -1,24 +1,24 @@
1
- <template>
2
- <div class="main-container">
3
- <div class="text-container">
4
- <p>{{ t('wl.appointment_card.fill_form_title') }}</p>
5
- <p class="p-small">{{ t('wl.appointment_card.fill_form_description') }}</p>
6
- </div>
7
-
8
- <Button variant="outlined" :label="t('wl.appointment_card.anamnese_form')" @click="emit('fillAnamnese')"/>
9
- </div>
10
- </template>
11
-
12
- <script setup lang="ts">
13
- import Button from '../../Button/Button.vue';
14
- import { useI18n } from 'vue-i18n';
15
-
16
- const emit = defineEmits<{
17
- (e: 'fillAnamnese'): void
18
- }>()
19
-
20
- const { t } = useI18n();
21
-
22
- </script>
23
-
1
+ <template>
2
+ <div class="main-container">
3
+ <div class="text-container">
4
+ <p>{{ t('wl.appointment_card.fill_form_title') }}</p>
5
+ <p class="p-small">{{ t('wl.appointment_card.fill_form_description') }}</p>
6
+ </div>
7
+
8
+ <Button variant="outlined" :label="t('wl.appointment_card.anamnese_form')" @click="emit('fillAnamnese')"/>
9
+ </div>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import Button from '../../Button/Button.vue';
14
+ import { useI18n } from 'vue-i18n';
15
+
16
+ const emit = defineEmits<{
17
+ (e: 'fillAnamnese'): void
18
+ }>()
19
+
20
+ const { t } = useI18n();
21
+
22
+ </script>
23
+
24
24
  <style src="./AnamneseNotification.css" scoped></style>
@@ -1,100 +1,100 @@
1
- /* Card component styles */
2
- .appointment-card {
3
- display: block;
4
- border-top-left-radius: 0.5rem;
5
- border-top-right-radius: 0.5rem;
6
- overflow: hidden;
7
- text-decoration: none;
8
- }
9
-
10
- .card-opacity {
11
- opacity: 0.5;
12
- }
13
-
14
- .card-header {
15
- display: flex;
16
- justify-content: space-between;
17
- align-items: center;
18
- padding: 1rem;
19
- color: var(--appointment_card_header_text);
20
- }
21
-
22
- .card-header--default {
23
- background-color: var(--appointment_card_header_default_bg);
24
- }
25
-
26
- .card-header--cancelled {
27
- background-color: var(--Error-Red--1);
28
- }
29
-
30
- .header-item {
31
- display: flex;
32
- align-items: center;
33
- gap: 0.25rem;
34
- color: inherit;
35
- }
36
-
37
- .header-item p {
38
- color: inherit;
39
- }
40
-
41
- .header-icon {
42
- flex-shrink: 0;
43
- color: inherit;
44
- width: 16px;
45
- height: 16px;
46
- }
47
-
48
- .card-body {
49
- background-color: var(--appointment_card_default_bg);
50
- padding: 1rem;
51
- gap: 1rem;
52
- display: flex;
53
- flex-direction: column;
54
- color: var(--appointment_card_title);
55
- }
56
-
57
- .card-body h3 {
58
- color: inherit;
59
- }
60
-
61
- .card-footer {
62
- background-color: var(--appointment_card_default_bg);
63
- padding: 1rem;
64
- border-bottom-left-radius: 0.5rem;
65
- border-bottom-right-radius: 0.5rem;
66
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
67
- color: var(--appointment_card_title);
68
- }
69
-
70
- .card-body hr {
71
- border-color: var(--appointment_card_delimiter);
72
- }
73
-
74
- .appointment-detail {
75
- margin: 0;
76
- font-weight: 600;
77
- font-size: 1.125rem; /* text-lg */
78
- line-height: 1.75rem; /* leading-7 */
79
- text-align: left;
80
- }
81
- .card-body .flex {
82
- display: flex;
83
- }
84
- .card-body .items-center {
85
- align-items: center;
86
- }
87
- .card-body .gap-3 {
88
- gap: 0.75rem;
89
- }
90
- .card-body .flex-1 {
91
- flex: 1 1 0%;
92
- }
93
- .min-w-0{
94
- min-width: 0;
95
- }
96
- .truncate{
97
- overflow: hidden;
98
- text-overflow: ellipsis;
99
- white-space: nowrap;
1
+ /* Card component styles */
2
+ .appointment-card {
3
+ display: block;
4
+ border-top-left-radius: 0.5rem;
5
+ border-top-right-radius: 0.5rem;
6
+ overflow: hidden;
7
+ text-decoration: none;
8
+ }
9
+
10
+ .card-opacity {
11
+ opacity: 0.5;
12
+ }
13
+
14
+ .card-header {
15
+ display: flex;
16
+ justify-content: space-between;
17
+ align-items: center;
18
+ padding: 1rem;
19
+ color: var(--appointment_card_header_text);
20
+ }
21
+
22
+ .card-header--default {
23
+ background-color: var(--appointment_card_header_default_bg);
24
+ }
25
+
26
+ .card-header--cancelled {
27
+ background-color: var(--Error-Red--1);
28
+ }
29
+
30
+ .header-item {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 0.25rem;
34
+ color: inherit;
35
+ }
36
+
37
+ .header-item p {
38
+ color: inherit;
39
+ }
40
+
41
+ .header-icon {
42
+ flex-shrink: 0;
43
+ color: inherit;
44
+ width: 16px;
45
+ height: 16px;
46
+ }
47
+
48
+ .card-body {
49
+ background-color: var(--appointment_card_default_bg);
50
+ padding: 1rem;
51
+ gap: 1rem;
52
+ display: flex;
53
+ flex-direction: column;
54
+ color: var(--appointment_card_title);
55
+ }
56
+
57
+ .card-body h3 {
58
+ color: inherit;
59
+ }
60
+
61
+ .card-footer {
62
+ background-color: var(--appointment_card_default_bg);
63
+ padding: 1rem;
64
+ border-bottom-left-radius: 0.5rem;
65
+ border-bottom-right-radius: 0.5rem;
66
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
67
+ color: var(--appointment_card_title);
68
+ }
69
+
70
+ .card-body hr {
71
+ border-color: var(--appointment_card_delimiter);
72
+ }
73
+
74
+ .appointment-detail {
75
+ margin: 0;
76
+ font-weight: 600;
77
+ font-size: 1.125rem; /* text-lg */
78
+ line-height: 1.75rem; /* leading-7 */
79
+ text-align: left;
80
+ }
81
+ .card-body .flex {
82
+ display: flex;
83
+ }
84
+ .card-body .items-center {
85
+ align-items: center;
86
+ }
87
+ .card-body .gap-3 {
88
+ gap: 0.75rem;
89
+ }
90
+ .card-body .flex-1 {
91
+ flex: 1 1 0%;
92
+ }
93
+ .min-w-0{
94
+ min-width: 0;
95
+ }
96
+ .truncate{
97
+ overflow: hidden;
98
+ text-overflow: ellipsis;
99
+ white-space: nowrap;
100
100
  }