sprintify-ui 0.6.78 → 0.6.81
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/README.md +7 -1
- package/dist/sprintify-ui.es.js +10738 -10413
- package/dist/style.css +1 -1
- package/dist/types/src/components/BaseAddressForm.vue.d.ts +10 -0
- package/dist/types/src/components/BaseGantt.vue.d.ts +8 -8
- package/dist/types/src/components/BaseScrollColumn.vue.d.ts +53 -0
- package/dist/types/src/components/BaseTextareaAutoresize.vue.d.ts +1 -1
- package/dist/types/src/components/BaseTimePicker.vue.d.ts +118 -0
- package/dist/types/src/components/index.d.ts +2 -1
- package/dist/types/src/index.d.ts +8 -0
- package/package.json +1 -1
- package/src/assets/base-time-picker.css +10 -0
- package/src/assets/main.css +1 -0
- package/src/components/BaseAddressForm.vue +20 -0
- package/src/components/BaseScrollColumn.vue +130 -0
- package/src/components/BaseTimePicker.stories.js +71 -0
- package/src/components/BaseTimePicker.vue +378 -0
- package/src/components/index.ts +2 -0
- package/src/lang/en.json +5 -1
- package/src/lang/fr.json +5 -1
- package/src/stories/PageInputSizes.vue +26 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<BaseDropdown
|
|
3
|
+
:animated="true"
|
|
4
|
+
:keep-alive="false"
|
|
5
|
+
placement="bottom-end"
|
|
6
|
+
>
|
|
7
|
+
<template #button>
|
|
8
|
+
<div class="relative">
|
|
9
|
+
<div
|
|
10
|
+
:class="iconWrapClasses"
|
|
11
|
+
>
|
|
12
|
+
<BaseIcon
|
|
13
|
+
:class="iconClasses"
|
|
14
|
+
icon="heroicons:clock"
|
|
15
|
+
/>
|
|
16
|
+
</div>
|
|
17
|
+
<input
|
|
18
|
+
v-model="modelValueFormatted"
|
|
19
|
+
type="text"
|
|
20
|
+
:name="nameInternal"
|
|
21
|
+
:disabled="disabled"
|
|
22
|
+
class="w-full block"
|
|
23
|
+
:class="classes"
|
|
24
|
+
:placeholder="placeholder"
|
|
25
|
+
>
|
|
26
|
+
<div
|
|
27
|
+
v-if="modelValueFormatted && !disabled"
|
|
28
|
+
:class="closeWrapClasses"
|
|
29
|
+
>
|
|
30
|
+
<button
|
|
31
|
+
type="button"
|
|
32
|
+
class="flex justify-center items-center rounded hover:bg-slate-100 aspect-1"
|
|
33
|
+
@click="clear()"
|
|
34
|
+
>
|
|
35
|
+
<BaseIcon
|
|
36
|
+
:class="iconClasses"
|
|
37
|
+
icon="heroicons:x-mark"
|
|
38
|
+
/>
|
|
39
|
+
</button>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<template #dropdown="{ close }">
|
|
45
|
+
<div
|
|
46
|
+
class="inline-block w-[200px] overflow-hidden input-rounded ring-1 ring-black ring-opacity-10 bg-white py-2 shadow-2xl"
|
|
47
|
+
>
|
|
48
|
+
<div class="text-sm font-normal">
|
|
49
|
+
<div class="flex base-time-picker">
|
|
50
|
+
<!-- Hours -->
|
|
51
|
+
<div
|
|
52
|
+
ref="hoursContainer"
|
|
53
|
+
class="grow overflow-y-auto h-48 border-r pl-[8px]"
|
|
54
|
+
>
|
|
55
|
+
<BaseScrollColumn
|
|
56
|
+
:value="modelValue"
|
|
57
|
+
element="hourElements"
|
|
58
|
+
:container="hoursContainer"
|
|
59
|
+
:times="hours"
|
|
60
|
+
type="hour"
|
|
61
|
+
@select-time="selectTime"
|
|
62
|
+
/>
|
|
63
|
+
|
|
64
|
+
<div class="h-40" />
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<!-- Minutes -->
|
|
68
|
+
<div
|
|
69
|
+
ref="minutesContainer"
|
|
70
|
+
class="grow overflow-y-auto h-48 border-r pl-[8px]"
|
|
71
|
+
>
|
|
72
|
+
<BaseScrollColumn
|
|
73
|
+
:value="modelValue"
|
|
74
|
+
element="minuteElements"
|
|
75
|
+
:container="minutesContainer"
|
|
76
|
+
:times="minutes"
|
|
77
|
+
type="minute"
|
|
78
|
+
@select-time="selectTime"
|
|
79
|
+
/>
|
|
80
|
+
|
|
81
|
+
<div class="h-40" />
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<!-- Seconds -->
|
|
85
|
+
<div
|
|
86
|
+
v-if="!disabledSeconds"
|
|
87
|
+
ref="secondsContainer"
|
|
88
|
+
class="grow overflow-y-auto h-48 pl-[8px]"
|
|
89
|
+
>
|
|
90
|
+
<BaseScrollColumn
|
|
91
|
+
:value="modelValue"
|
|
92
|
+
element="secondElements"
|
|
93
|
+
:container="secondsContainer"
|
|
94
|
+
:times="seconds"
|
|
95
|
+
type="second"
|
|
96
|
+
@select-time="selectTime"
|
|
97
|
+
/>
|
|
98
|
+
|
|
99
|
+
<div class="h-40" />
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
<!-- Buttons Action -->
|
|
104
|
+
<div class="flex justify-between items-center pt-2 mt-1 px-2 border-t">
|
|
105
|
+
<button
|
|
106
|
+
class="btn btn-slate btn-sm block"
|
|
107
|
+
@click="now(close)"
|
|
108
|
+
>
|
|
109
|
+
{{ t('sui.now') }}
|
|
110
|
+
</button>
|
|
111
|
+
|
|
112
|
+
<button
|
|
113
|
+
class="btn btn-primary btn-sm block"
|
|
114
|
+
@click="ok(close)"
|
|
115
|
+
>
|
|
116
|
+
{{ t('sui.ok') }}
|
|
117
|
+
</button>
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</template>
|
|
122
|
+
</BaseDropdown>
|
|
123
|
+
</template>
|
|
124
|
+
|
|
125
|
+
<script lang="ts" setup>
|
|
126
|
+
import { PropType } from 'vue';
|
|
127
|
+
import { Icon as BaseIcon } from '@iconify/vue';
|
|
128
|
+
import { useField } from '@/composables/field';
|
|
129
|
+
|
|
130
|
+
import { t } from '@/i18n';
|
|
131
|
+
import { twMerge } from 'tailwind-merge';
|
|
132
|
+
import { Size, sizes } from '@/utils/sizes';
|
|
133
|
+
import BaseDropdown from './BaseDropdown.vue';
|
|
134
|
+
import BaseScrollColumn from './BaseScrollColumn.vue';
|
|
135
|
+
import { DateTime } from 'luxon';
|
|
136
|
+
|
|
137
|
+
const props = defineProps({
|
|
138
|
+
modelValue: {
|
|
139
|
+
default: undefined,
|
|
140
|
+
type: [String, null, undefined] as PropType<string | null | undefined>,
|
|
141
|
+
},
|
|
142
|
+
size: {
|
|
143
|
+
default: undefined,
|
|
144
|
+
type: String as PropType<Size>,
|
|
145
|
+
},
|
|
146
|
+
class: {
|
|
147
|
+
default: '',
|
|
148
|
+
type: [String, Array] as PropType<string | string[]>,
|
|
149
|
+
},
|
|
150
|
+
disabled: {
|
|
151
|
+
default: false,
|
|
152
|
+
type: Boolean,
|
|
153
|
+
},
|
|
154
|
+
name: {
|
|
155
|
+
default: '',
|
|
156
|
+
type: String,
|
|
157
|
+
},
|
|
158
|
+
placeholder: {
|
|
159
|
+
default () {
|
|
160
|
+
return t('sui.click_or_select_time');
|
|
161
|
+
},
|
|
162
|
+
type: String,
|
|
163
|
+
},
|
|
164
|
+
required: {
|
|
165
|
+
default: true,
|
|
166
|
+
type: Boolean,
|
|
167
|
+
},
|
|
168
|
+
hourStep: {
|
|
169
|
+
default: 1,
|
|
170
|
+
type: Number,
|
|
171
|
+
},
|
|
172
|
+
minuteStep: {
|
|
173
|
+
default: 1,
|
|
174
|
+
type: Number,
|
|
175
|
+
},
|
|
176
|
+
secondStep: {
|
|
177
|
+
default: 1,
|
|
178
|
+
type: Number,
|
|
179
|
+
},
|
|
180
|
+
disabledSeconds: {
|
|
181
|
+
default: false,
|
|
182
|
+
type: Boolean,
|
|
183
|
+
},
|
|
184
|
+
hasError: {
|
|
185
|
+
default: false,
|
|
186
|
+
type: Boolean,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
const emit = defineEmits(['update:modelValue']);
|
|
191
|
+
|
|
192
|
+
const { nameInternal, hasErrorInternal, emitUpdate, sizeInternal } =
|
|
193
|
+
useField({
|
|
194
|
+
name: computed(() => props.name),
|
|
195
|
+
required: computed(() => props.required),
|
|
196
|
+
size: computed(() => props.size),
|
|
197
|
+
hasError: computed(() => props.hasError),
|
|
198
|
+
emit: emit,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const timeRegex = computed(() => {
|
|
202
|
+
if (props.disabledSeconds) {
|
|
203
|
+
return new RegExp(
|
|
204
|
+
`^([01]?[0-9]|2[0-3]):([0-5][0-9])$`
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return new RegExp(
|
|
209
|
+
`^([01]?[0-9]|2[0-3]):([0-5][0-9])(:([0-5][0-9]))?$`
|
|
210
|
+
);
|
|
211
|
+
});
|
|
212
|
+
// const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/;
|
|
213
|
+
const modelValueFormatted = computed((): string | string[] | null => {
|
|
214
|
+
if (!props.modelValue) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (!timeRegex.value.test(props.modelValue)) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return props.modelValue;
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const classes = computed(() => {
|
|
226
|
+
const base = 'transition-colors duration-200 input-rounded';
|
|
227
|
+
const focus = 'focus:input-focus'
|
|
228
|
+
const error = hasErrorInternal.value ? 'border-red-500 focus:input-focus-error' : 'border-slate-300';
|
|
229
|
+
const disabled = 'disabled:cursor-not-allowed disabled:text-slate-300';
|
|
230
|
+
const sizeConfig = sizes[sizeInternal.value];
|
|
231
|
+
const padding = {
|
|
232
|
+
'xs': 'pl-[1.54rem] pr-5',
|
|
233
|
+
'sm': 'pl-[2.1rem] pr-6',
|
|
234
|
+
'md': 'pl-10 pr-7',
|
|
235
|
+
}[sizeInternal.value];
|
|
236
|
+
|
|
237
|
+
const paddingRight = props.modelValue ? padding : 'pr-0';
|
|
238
|
+
|
|
239
|
+
return twMerge(
|
|
240
|
+
base,
|
|
241
|
+
focus,
|
|
242
|
+
error,
|
|
243
|
+
disabled,
|
|
244
|
+
padding,
|
|
245
|
+
paddingRight,
|
|
246
|
+
sizeConfig.height,
|
|
247
|
+
sizeConfig.fontSize,
|
|
248
|
+
);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
const closeWrapClasses = computed(() => {
|
|
252
|
+
const base = 'absolute top-0 right-0 flex justify-center p-1';
|
|
253
|
+
const sizeConfig = sizes[sizeInternal.value];
|
|
254
|
+
|
|
255
|
+
return twMerge(
|
|
256
|
+
base,
|
|
257
|
+
sizeConfig.height,
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
const iconWrapClasses = computed(() => {
|
|
262
|
+
const base = 'pointer-events-none absolute top-0 left-0 flex items-center justify-center';
|
|
263
|
+
const sizeConfig = sizes[sizeInternal.value];
|
|
264
|
+
const padding = {
|
|
265
|
+
'xs': 'pl-2',
|
|
266
|
+
'sm': 'pl-2.5',
|
|
267
|
+
'md': 'pl-3',
|
|
268
|
+
}[sizeInternal.value];
|
|
269
|
+
|
|
270
|
+
return twMerge(
|
|
271
|
+
base,
|
|
272
|
+
sizeConfig.height,
|
|
273
|
+
padding
|
|
274
|
+
);
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
const iconClasses = computed(() => {
|
|
278
|
+
const base = '';
|
|
279
|
+
const error = hasErrorInternal.value ? 'text-red-500' : 'text-slate-500';
|
|
280
|
+
const sizeConfig = sizes[sizeInternal.value];
|
|
281
|
+
|
|
282
|
+
return twMerge(
|
|
283
|
+
base,
|
|
284
|
+
error,
|
|
285
|
+
sizeConfig.iconSize,
|
|
286
|
+
);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
function clear() {
|
|
290
|
+
emitUpdate(null);
|
|
291
|
+
clearSelectedValues();
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Time picker process begin
|
|
296
|
+
*/
|
|
297
|
+
|
|
298
|
+
const hoursContainer = ref<HTMLElement | null>(null);
|
|
299
|
+
|
|
300
|
+
const minutesContainer = ref<HTMLElement | null>(null);
|
|
301
|
+
|
|
302
|
+
const secondsContainer = ref<HTMLElement | null>(null);
|
|
303
|
+
|
|
304
|
+
const hourValue = ref('' as string | null);
|
|
305
|
+
const minuteValue = ref('' as string | null);
|
|
306
|
+
const secondValue = ref('' as string | null);
|
|
307
|
+
|
|
308
|
+
const generateValues = (length: number, step: number) => {
|
|
309
|
+
return Array.from({ length }, (_, i) => i)
|
|
310
|
+
.filter(value => value % step === 0)
|
|
311
|
+
.map(value => value < 10 ? `0${value}` : `${value}`);
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
const hours = computed(() => generateValues(24, props.hourStep));
|
|
315
|
+
const minutes = computed(() => generateValues(60, props.minuteStep));
|
|
316
|
+
const seconds = computed(() => generateValues(60, props.secondStep));
|
|
317
|
+
|
|
318
|
+
function selectTime(time: string, type: string) {
|
|
319
|
+
|
|
320
|
+
if (type === 'hour') {
|
|
321
|
+
hourValue.value = time;
|
|
322
|
+
}
|
|
323
|
+
if (type === 'minute') {
|
|
324
|
+
minuteValue.value = time;
|
|
325
|
+
}
|
|
326
|
+
if (type === 'second') {
|
|
327
|
+
secondValue.value = time;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (props.disabledSeconds) {
|
|
331
|
+
secondValue.value = '00';
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function ok(close: () => void) {
|
|
336
|
+
let time = `${hourValue.value}:${minuteValue.value}:${secondValue.value}`;
|
|
337
|
+
|
|
338
|
+
if (props.disabledSeconds) {
|
|
339
|
+
time = `${hourValue.value}:${minuteValue.value}`;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (!timeRegex.value.test(time)) {
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
emitUpdate(time);
|
|
347
|
+
|
|
348
|
+
console.log('time', time);
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
close();
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
function now(close: () => void) {
|
|
355
|
+
const now = DateTime.now();
|
|
356
|
+
|
|
357
|
+
hourValue.value = now.hour.toString().padStart(2, '0');
|
|
358
|
+
minuteValue.value = now.minute.toString().padStart(2, '0');
|
|
359
|
+
secondValue.value = now.second.toString().padStart(2, '0');
|
|
360
|
+
|
|
361
|
+
let time = `${hourValue.value}:${minuteValue.value}:${secondValue.value}`;
|
|
362
|
+
|
|
363
|
+
if (props.disabledSeconds) {
|
|
364
|
+
time = `${hourValue.value}:${minuteValue.value}`;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
emitUpdate(time);
|
|
368
|
+
|
|
369
|
+
close();
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const clearSelectedValues = () => {
|
|
373
|
+
hourValue.value = null;
|
|
374
|
+
minuteValue.value = null;
|
|
375
|
+
secondValue.value = null;
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
</script>
|
package/src/components/index.ts
CHANGED
|
@@ -28,6 +28,7 @@ import BaseCropperModal from './BaseCropperModal.vue';
|
|
|
28
28
|
import BaseDataIterator from './BaseDataIterator.vue';
|
|
29
29
|
import BaseDataTable from './BaseDataTable.vue';
|
|
30
30
|
import BaseDatePicker from './BaseDatePicker.vue';
|
|
31
|
+
import BaseTimePicker from './BaseTimePicker.vue';
|
|
31
32
|
import BaseDateSelect from './BaseDateSelect.vue';
|
|
32
33
|
import BaseDescriptionList from './BaseDescriptionList.vue';
|
|
33
34
|
import BaseDescriptionListItem from './BaseDescriptionListItem.vue';
|
|
@@ -133,6 +134,7 @@ export {
|
|
|
133
134
|
BaseDataIterator,
|
|
134
135
|
BaseDataTable,
|
|
135
136
|
BaseDatePicker,
|
|
137
|
+
BaseTimePicker,
|
|
136
138
|
BaseDateSelect,
|
|
137
139
|
BaseDescriptionList,
|
|
138
140
|
BaseDescriptionListItem,
|
package/src/lang/en.json
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
"month": "Month",
|
|
8
8
|
"save": "Save",
|
|
9
9
|
"sui": {
|
|
10
|
+
"notes": "Notes",
|
|
10
11
|
"address": "Address",
|
|
11
12
|
"address_1_placeholder": "Postal address",
|
|
12
13
|
"address_2_description": "Apartment, suite, unit, building",
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
"city": "City",
|
|
21
22
|
"clear": "Clear",
|
|
22
23
|
"click_or_select_date": "Click or select date",
|
|
24
|
+
"click_or_select_time": "Enter time (HH:mm:ss)",
|
|
23
25
|
"click_to_copy": "Click to copy",
|
|
24
26
|
"columns": "Columns",
|
|
25
27
|
"confirm": "Confirm",
|
|
@@ -50,7 +52,9 @@
|
|
|
50
52
|
"none": "None",
|
|
51
53
|
"nothing_found": "Nothing found",
|
|
52
54
|
"notifications_empty": "You have no new notifications",
|
|
55
|
+
"now": "Now",
|
|
53
56
|
"of": "of",
|
|
57
|
+
"ok": "Ok",
|
|
54
58
|
"or": "or",
|
|
55
59
|
"page": "Page",
|
|
56
60
|
"pagination_detail_1": "Viewing",
|
|
@@ -92,4 +96,4 @@
|
|
|
92
96
|
"today": "Today",
|
|
93
97
|
"week": "Week",
|
|
94
98
|
"year": "Year"
|
|
95
|
-
}
|
|
99
|
+
}
|
package/src/lang/fr.json
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
"month": "Mois",
|
|
8
8
|
"save": "Sauvegarder",
|
|
9
9
|
"sui": {
|
|
10
|
+
"notes": "Notes",
|
|
10
11
|
"address": "Adresse",
|
|
11
12
|
"address_1_placeholder": "Adresse postale",
|
|
12
13
|
"address_2_description": "Appartement, suite, unité, immeuble",
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
"city": "Ville",
|
|
21
22
|
"clear": "Effacer",
|
|
22
23
|
"click_or_select_date": "Cliquer ou sélectionner une date",
|
|
24
|
+
"click_or_select_time": "Entrez l'heure (HH:mm:ss)",
|
|
23
25
|
"click_to_copy": "Cliquer pour copier",
|
|
24
26
|
"columns": "Colonnes",
|
|
25
27
|
"confirm": "Confirmer",
|
|
@@ -50,7 +52,9 @@
|
|
|
50
52
|
"none": "Aucun",
|
|
51
53
|
"nothing_found": "Rien n'a été trouvé",
|
|
52
54
|
"notifications_empty": "Vous n'avez aucune nouvelle notification",
|
|
55
|
+
"now": "Maintenant",
|
|
53
56
|
"of": "de",
|
|
57
|
+
"ok": "Appliquer",
|
|
54
58
|
"or": "ou",
|
|
55
59
|
"page": "Page",
|
|
56
60
|
"pagination_detail_1": "Affichage de",
|
|
@@ -92,4 +96,4 @@
|
|
|
92
96
|
"today": "Aujourd\\'hui",
|
|
93
97
|
"week": "Semaine",
|
|
94
98
|
"year": "Année"
|
|
95
|
-
}
|
|
99
|
+
}
|
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
>
|
|
28
28
|
<BaseDatePicker v-model="date" />
|
|
29
29
|
</BaseField>
|
|
30
|
+
|
|
31
|
+
<BaseField
|
|
32
|
+
:size="size"
|
|
33
|
+
class="min-w-[200px]"
|
|
34
|
+
>
|
|
35
|
+
<BaseTimePicker v-model="date" />
|
|
36
|
+
</BaseField>
|
|
37
|
+
|
|
30
38
|
<BaseField
|
|
31
39
|
:size="size"
|
|
32
40
|
>
|
|
@@ -147,6 +155,23 @@
|
|
|
147
155
|
:size="size"
|
|
148
156
|
/>
|
|
149
157
|
</div>
|
|
158
|
+
|
|
159
|
+
<div
|
|
160
|
+
v-for="size in sizes"
|
|
161
|
+
:key="size"
|
|
162
|
+
class="flex flex-col gap-3"
|
|
163
|
+
>
|
|
164
|
+
<BaseInput
|
|
165
|
+
v-model="text"
|
|
166
|
+
:size="size"
|
|
167
|
+
placeholder="Name"
|
|
168
|
+
icon-left="heroicons:calendar"
|
|
169
|
+
/>
|
|
170
|
+
<BaseTimePicker
|
|
171
|
+
v-model="date"
|
|
172
|
+
:size="size"
|
|
173
|
+
/>
|
|
174
|
+
</div>
|
|
150
175
|
</div>
|
|
151
176
|
</template>
|
|
152
177
|
|
|
@@ -168,6 +193,7 @@ import BaseInputPercent from '@/components/BaseInputPercent.vue';
|
|
|
168
193
|
import BaseTextareaAutoresize from '@/components/BaseTextareaAutoresize.vue';
|
|
169
194
|
import BaseDatePicker from '@/components/BaseDatePicker.vue';
|
|
170
195
|
import BaseDateSelect from '@/components/BaseDateSelect.vue';
|
|
196
|
+
import BaseTimePicker from '@/components/BaseTimePicker.vue';
|
|
171
197
|
|
|
172
198
|
const sizes = ref<Size[]>(['xs', 'sm', 'md']);
|
|
173
199
|
|