@7365admin1/layer-common 3.0.18 → 3.0.20

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.
@@ -1,186 +1,201 @@
1
1
  <template>
2
- <div class="d-flex flex-column">
3
- <v-text-field v-bind="$attrs" ref="dateTimePickerRef" :model-value="dateTimeFormattedReadOnly" autocomplete="off"
4
- :placeholder="inputPlaceholder" :rules="rules" style="z-index: 10" @click="openDatePicker">
5
- <template #append-inner>
6
- <v-icon icon="mdi-calendar" @click.stop="openDatePicker" />
7
- </template>
8
- </v-text-field>
9
- <div class="w-100 d-flex align-end ga-3 hidden-input">
10
- <input ref="dateInput" :type="inputType" v-model="dateTime" :min="minValue" />
11
- </div>
2
+ <div class="d-flex flex-column">
3
+ <v-text-field
4
+ v-bind="$attrs"
5
+ ref="dateTimePickerRef"
6
+ :model-value="dateTimeFormattedReadOnly"
7
+ autocomplete="off"
8
+ :placeholder="inputPlaceholder"
9
+ :rules="rules"
10
+ style="z-index: 10"
11
+ @click="openDatePicker"
12
+ >
13
+ <template #append-inner>
14
+ <v-icon icon="mdi-calendar" @click.stop="openDatePicker" />
15
+ </template>
16
+ </v-text-field>
17
+ <div class="w-100 d-flex align-end ga-3 hidden-input">
18
+ <input
19
+ ref="dateInput"
20
+ :type="inputType"
21
+ v-model="dateTime"
22
+ :min="minValue"
23
+ />
12
24
  </div>
25
+ </div>
13
26
  </template>
14
27
 
15
28
  <script setup lang="ts">
16
- import { ref, computed, watch } from 'vue'
29
+ import { ref, computed, watch } from "vue";
17
30
 
18
31
  const prop = defineProps({
19
- rules: {
20
- type: Array as PropType<Array<any>>,
21
- default: () => []
22
- },
23
- placeholder: {
24
- type: String,
25
- default: 'DD/MM/YYYY, HH:MM AM/PM'
26
- },
27
- dateOnly: {
28
- type: Boolean,
29
- default: false
30
- },
31
- min: {
32
- type: String,
33
- default: undefined
34
- }
35
- })
36
-
37
- const { formatDateISO8601 } = useUtils()
38
- const dateTime = defineModel<string | null>({ default: null }) //2025-10-10T13:09 format
39
- const dateTimeUTC = defineModel<string | null>('utc', { default: null }) // UTC format
40
-
41
- const dateTimeFormattedReadOnly = ref<string | null>(null)
42
- const inputType = computed(() => (prop.dateOnly ? 'date' : 'datetime-local'))
43
-
32
+ rules: {
33
+ type: Array as PropType<Array<any>>,
34
+ default: () => [],
35
+ },
36
+ placeholder: {
37
+ type: String,
38
+ default: "DD/MM/YYYY, HH:MM AM/PM",
39
+ },
40
+ dateOnly: {
41
+ type: Boolean,
42
+ default: false,
43
+ },
44
+ min: {
45
+ type: String,
46
+ default: undefined,
47
+ },
48
+ });
49
+
50
+ const { formatDateISO8601 } = useUtils();
51
+ const dateTime = defineModel<string | null>({ default: null }); //2025-10-10T13:09 format
52
+ const dateTimeUTC = defineModel<string | null>("utc", { default: null }); // UTC format
53
+
54
+ const dateTimeFormattedReadOnly = ref<string | null>(null);
55
+ const inputType = computed(() => (prop.dateOnly ? "date" : "datetime-local"));
44
56
 
45
57
  const minValue = computed(() => {
46
- if (!prop.min) return undefined
47
- if (/^\d{4}-\d{2}-\d{2}$/.test(prop.min)) {
48
- return prop.dateOnly ? prop.min : `${prop.min}T00:00`
49
- }
50
- return prop.min
51
- })
52
- const inputPlaceholder = computed(() => (
53
- prop.placeholder || (prop.dateOnly ? 'MM/DD/YYYY' : 'DD/MM/YYYY, HH:MM AM/PM')
54
- ))
55
-
56
-
57
-
58
-
59
- const dateInput = ref<HTMLInputElement | null>(null)
60
- const dateTimePickerRef = ref<HTMLInputElement | null>(null)
61
-
62
- const isInitialLoad = ref(true)
58
+ if (!prop.min) return undefined;
59
+ if (/^\d{4}-\d{2}-\d{2}$/.test(prop.min)) {
60
+ return prop.dateOnly ? prop.min : `${prop.min}T00:00`;
61
+ }
62
+ return prop.min;
63
+ });
64
+ const inputPlaceholder = computed(
65
+ () =>
66
+ prop.placeholder ||
67
+ (prop.dateOnly ? "MM/DD/YYYY" : "DD/MM/YYYY, HH:MM AM/PM")
68
+ );
69
+
70
+ const dateInput = ref<HTMLInputElement | null>(null);
71
+ const dateTimePickerRef = ref<HTMLInputElement | null>(null);
72
+
73
+ const isInitialLoad = ref(true);
63
74
 
64
75
  function openDatePicker() {
65
- setTimeout(() => {
66
- dateInput.value?.showPicker?.()
67
- }, 0)
76
+ setTimeout(() => {
77
+ dateInput.value?.showPicker?.();
78
+ }, 0);
68
79
  }
69
80
 
70
81
  function validate() {
71
- (dateTimePickerRef.value as any)?.validate()
82
+ (dateTimePickerRef.value as any)?.validate();
72
83
  }
73
84
 
74
85
  function convertToReadableFormat(dateStr: string): string {
86
+ if (!dateStr) return "";
75
87
 
76
- if (!dateStr) return "";
88
+ const date = new Date(dateStr);
89
+ if (Number.isNaN(date.getTime())) return "";
77
90
 
78
- const date = new Date(dateStr)
79
- if (Number.isNaN(date.getTime())) return "";
91
+ const month = String(date.getMonth() + 1).padStart(2, "0");
92
+ const day = String(date.getDate()).padStart(2, "0");
93
+ const year = date.getFullYear();
80
94
 
81
- const month = String(date.getMonth() + 1).padStart(2, '0')
82
- const day = String(date.getDate()).padStart(2, '0')
83
- const year = date.getFullYear()
95
+ if (prop.dateOnly) {
96
+ return `${day}/${month}/${year}`;
97
+ }
84
98
 
85
- if (prop.dateOnly) {
86
- return `${month}/${day}/${year}`
87
- }
99
+ let hours = date.getHours();
100
+ const minutes = String(date.getMinutes()).padStart(2, "0");
88
101
 
89
- let hours = date.getHours()
90
- const minutes = String(date.getMinutes()).padStart(2, '0')
102
+ const ampm = hours >= 12 ? "PM" : "AM";
103
+ hours = hours % 12;
104
+ hours = hours ? hours : 12;
91
105
 
92
- const ampm = hours >= 12 ? 'PM' : 'AM'
93
- hours = hours % 12
94
- hours = hours ? hours : 12
106
+ const formattedTime = `${String(hours).padStart(2, "0")}:${minutes} ${ampm}`;
95
107
 
96
- const formattedTime = `${String(hours).padStart(2, '0')}:${minutes} ${ampm}`
97
-
98
- return `${day}/${month}/${year}, ${formattedTime}`
108
+ return `${day}/${month}/${year}, ${formattedTime}`;
99
109
  }
100
110
 
101
111
  function toDateOnlyInputValue(dateStr: string): string {
102
- if (!dateStr) return ''
103
- if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return dateStr
104
- const date = new Date(dateStr)
105
- if (Number.isNaN(date.getTime())) return ''
106
- const year = date.getFullYear()
107
- const month = String(date.getMonth() + 1).padStart(2, '0')
108
- const day = String(date.getDate()).padStart(2, '0')
109
- return `${year}-${month}-${day}`
112
+ if (!dateStr) return "";
113
+ if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return dateStr;
114
+ const date = new Date(dateStr);
115
+ if (Number.isNaN(date.getTime())) return "";
116
+ const year = date.getFullYear();
117
+ const month = String(date.getMonth() + 1).padStart(2, "0");
118
+ const day = String(date.getDate()).padStart(2, "0");
119
+ return `${year}-${month}-${day}`;
110
120
  }
111
121
 
112
- function handleInitialDate(){
113
- const dateDefault = dateTime.value
114
- const dateUTC = dateTimeUTC.value
115
- if(dateDefault){
116
- dateTimeFormattedReadOnly.value = convertToReadableFormat(dateDefault)
117
- if (prop.dateOnly) {
118
- dateTimeUTC.value = toDateOnlyInputValue(dateDefault)
119
- } else {
120
- const localDate = new Date(dateDefault)
121
- dateTimeUTC.value = localDate.toISOString()
122
- }
123
- } else if (dateUTC){
124
- dateTimeFormattedReadOnly.value = convertToReadableFormat(dateUTC)
125
- if (prop.dateOnly) {
126
- dateTime.value = toDateOnlyInputValue(dateUTC)
127
- } else {
128
- const localDate = new Date(dateUTC)
129
- dateTime.value = formatDateISO8601(localDate)
130
- }
122
+ function handleInitialDate() {
123
+ const dateDefault = dateTime.value;
124
+ const dateUTC = dateTimeUTC.value;
125
+ if (dateDefault) {
126
+ dateTimeFormattedReadOnly.value = convertToReadableFormat(dateDefault);
127
+ if (prop.dateOnly) {
128
+ dateTimeUTC.value = toDateOnlyInputValue(dateDefault);
129
+ } else {
130
+ const localDate = new Date(dateDefault);
131
+ dateTimeUTC.value = localDate.toISOString();
132
+ }
133
+ } else if (dateUTC) {
134
+ dateTimeFormattedReadOnly.value = convertToReadableFormat(dateUTC);
135
+ if (prop.dateOnly) {
136
+ dateTime.value = toDateOnlyInputValue(dateUTC);
131
137
  } else {
132
- dateTimeFormattedReadOnly.value = null
138
+ const localDate = new Date(dateUTC);
139
+ dateTime.value = formatDateISO8601(localDate);
133
140
  }
141
+ } else {
142
+ dateTimeFormattedReadOnly.value = null;
143
+ }
134
144
  }
135
145
 
136
-
137
- watch(dateTime, (dateVal) => {
138
- if (isInitialLoad.value) return // ignore the first run
146
+ watch(
147
+ dateTime,
148
+ (dateVal) => {
149
+ if (isInitialLoad.value) return; // ignore the first run
139
150
  if (!dateVal) {
140
- dateTimeFormattedReadOnly.value = null;
141
- dateTimeUTC.value = null
142
- return
151
+ dateTimeFormattedReadOnly.value = null;
152
+ dateTimeUTC.value = null;
153
+ return;
143
154
  }
144
155
 
145
- dateTimeFormattedReadOnly.value = convertToReadableFormat(dateVal)
156
+ dateTimeFormattedReadOnly.value = convertToReadableFormat(dateVal);
146
157
  if (prop.dateOnly) {
147
- dateTimeUTC.value = toDateOnlyInputValue(dateVal)
158
+ dateTimeUTC.value = toDateOnlyInputValue(dateVal);
148
159
  } else {
149
- const localDate = new Date(dateVal)
150
- dateTimeUTC.value = localDate.toISOString()
160
+ const localDate = new Date(dateVal);
161
+ dateTimeUTC.value = localDate.toISOString();
151
162
  }
152
-
153
- }, { immediate: false })
154
-
155
- watch(dateTimeUTC, () => {
156
- handleInitialDate()
157
- }, { immediate: true})
158
-
163
+ },
164
+ { immediate: false }
165
+ );
166
+
167
+ watch(
168
+ dateTimeUTC,
169
+ () => {
170
+ handleInitialDate();
171
+ },
172
+ { immediate: true }
173
+ );
159
174
 
160
175
  onMounted(async () => {
161
- await nextTick()
162
- isInitialLoad.value = false
163
- // Wait until Vuetify renders its internal input
164
- const nativeInput = (dateTimePickerRef.value as any)?.$el?.querySelector('input')
165
- if (nativeInput) {
166
- nativeInput.addEventListener('click', (e: MouseEvent) => {
167
- e.stopPropagation()
168
- openDatePicker()
169
- })
170
- }
171
-
172
- })
173
-
176
+ await nextTick();
177
+ isInitialLoad.value = false;
178
+ // Wait until Vuetify renders its internal input
179
+ const nativeInput = (dateTimePickerRef.value as any)?.$el?.querySelector(
180
+ "input"
181
+ );
182
+ if (nativeInput) {
183
+ nativeInput.addEventListener("click", (e: MouseEvent) => {
184
+ e.stopPropagation();
185
+ openDatePicker();
186
+ });
187
+ }
188
+ });
174
189
 
175
190
  defineExpose({
176
- validate
177
- })
191
+ validate,
192
+ });
178
193
  </script>
179
194
 
180
195
  <style scoped>
181
196
  .hidden-input {
182
- opacity: 0;
183
- height: 0;
184
- width: 1px;
197
+ opacity: 0;
198
+ height: 0;
199
+ width: 1px;
185
200
  }
186
201
  </style>