@bagelink/vue 1.15.170 → 1.15.172

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.
@@ -11,6 +11,12 @@ export declare const utc: typeof _parseUTC & {
11
11
  export declare const local: {
12
12
  /** Format a Date as ISO string with local TZ offset, e.g. "2026-05-05T11:00:00.000+03:00" */
13
13
  iso(date?: Date): string;
14
+ /**
15
+ * Format a Date as a local calendar day "YYYY-MM-DD" (no time, no TZ).
16
+ * Use for JSON Schema `format: "date"` / `$.date()` fields — never `toISOString()`,
17
+ * which shifts the day in non-UTC timezones (e.g. Israel midnight → previous UTC day).
18
+ */
19
+ date(date?: Date): string;
14
20
  /** Current device TZ offset string, e.g. "+03:00" or "-05:00" */
15
21
  offset(date?: Date): string;
16
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/vue",
3
3
  "type": "module",
4
- "version": "1.15.170",
4
+ "version": "1.15.172",
5
5
  "description": "Bagel core sdk packages",
6
6
  "author": {
7
7
  "name": "Bagel Studio",
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import type { ModeType } from '../../../utils/calendar/typings'
3
- import { TextInput, Dropdown, formatDate, useI18n, resolveI18n } from '@bagelink/vue'
3
+ import { TextInput, Dropdown, formatDate, useI18n, resolveI18n, local } from '@bagelink/vue'
4
4
  import { onClickOutside } from '@vueuse/core'
5
5
  import { ref, computed, onMounted, watch } from 'vue'
6
6
  import { WEEK_START_DAY } from '../../../utils/calendar/time'
@@ -104,9 +104,19 @@ function parseUserInput(input: string): Date | null {
104
104
 
105
105
  function normalizeDate(date: Date): string {
106
106
  if (props.enableTime) return date.toISOString()
107
- const normalized = new Date(date)
108
- normalized.setHours(0, 0, 0, 0)
109
- return normalized.toISOString().split('T')[0]
107
+ // Local calendar day — not toISOString().slice(0,10), which shifts TZ≠UTC.
108
+ return local.date(date)
109
+ }
110
+
111
+ /** Coerce legacy ISO datetimes into YYYY-MM-DD so format:"date" schemas accept them on save. */
112
+ function coerceDateOnlyValue(val: string | Date | DateRangeValue | undefined): string | Date | DateRangeValue | undefined {
113
+ if (props.enableTime || props.range || val == null) return val
114
+ if (typeof val === 'string' && val.includes('T')) {
115
+ const d = new Date(val)
116
+ if (!Number.isNaN(d.getTime())) return local.date(d)
117
+ }
118
+ if (val instanceof Date) return local.date(val)
119
+ return val
110
120
  }
111
121
 
112
122
  function hasModelValue(): boolean {
@@ -257,8 +267,15 @@ function handleIconClick() {
257
267
  isOpen.value = !isOpen.value
258
268
  }
259
269
 
260
- // Sync input display when date changes externally
261
- watch(() => selectedDate.value, syncInputValue, { immediate: true })
270
+ // Sync input display when date changes externally; coerce datetime → date-only.
271
+ watch(() => selectedDate.value, (val) => {
272
+ const coerced = coerceDateOnlyValue(val)
273
+ if (coerced !== val) {
274
+ selectedDate.value = coerced
275
+ return
276
+ }
277
+ syncInputValue()
278
+ }, { immediate: true })
262
279
 
263
280
  const hasValue = computed(() => inputValue.value.length > 0)
264
281
 
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import type { MaybeRefOrGetter } from 'vue'
3
3
  import type { ModeType } from '../../../utils/calendar/typings'
4
- import { Btn, NumberInput } from '@bagelink/vue'
4
+ import { Btn, NumberInput, local } from '@bagelink/vue'
5
5
  import { computed, ref, toValue } from 'vue'
6
6
  import Time, { WEEK_START_DAY } from '../../../utils/calendar/time'
7
7
 
@@ -383,10 +383,9 @@ function emitDateValue(date: Date) {
383
383
  if (props.enableTime) {
384
384
  emit('update:modelValue', date.toISOString())
385
385
  } else {
386
- // For date-only, set time to midnight
387
- const midnightDate = new Date(date)
388
- midnightDate.setHours(0, 0, 0, 0)
389
- emit('update:modelValue', midnightDate.toISOString())
386
+ // Date-only → YYYY-MM-DD (JSON Schema format: "date"). Never toISOString():
387
+ // local midnight becomes the previous UTC day (e.g. Asia/Jerusalem).
388
+ emit('update:modelValue', local.date(date))
390
389
  }
391
390
  }
392
391
 
@@ -409,7 +408,7 @@ const { selectMonth, selectYear, previousMonth, nextMonth, previousYear, nextYea
409
408
  const { hours, minutes, handleHourInput, handleMinuteInput } = useTimeHandling()
410
409
 
411
410
  function toDayString(date: Date): string {
412
- return new Date(date.getFullYear(), date.getMonth(), date.getDate()).toISOString()
411
+ return local.date(date)
413
412
  }
414
413
 
415
414
  // Range selection handler: first click sets start (clears end), second click
package/src/utils/date.ts CHANGED
@@ -69,7 +69,11 @@ export const utc = Object.assign(_parseUTC, {
69
69
  })
70
70
 
71
71
  // ── local — format dates with device TZ for server submission ───────────────
72
-
72
+ //
73
+ // local.iso(date) → "2026-05-05T11:00:00.000+03:00"
74
+ // local.date(date) → "2026-05-05" (calendar day for format:"date" fields)
75
+ // local.offset() → "+03:00"
76
+ //
73
77
  function _tzOffset(date: Date): string {
74
78
  const off = -date.getTimezoneOffset()
75
79
  const sign = off >= 0 ? '+' : '-'
@@ -94,6 +98,17 @@ export const local = {
94
98
  iso(date: Date = new Date()): string {
95
99
  return _localISO(date)
96
100
  },
101
+ /**
102
+ * Format a Date as a local calendar day "YYYY-MM-DD" (no time, no TZ).
103
+ * Use for JSON Schema `format: "date"` / `$.date()` fields — never `toISOString()`,
104
+ * which shifts the day in non-UTC timezones (e.g. Israel midnight → previous UTC day).
105
+ */
106
+ date(date: Date = new Date()): string {
107
+ const y = date.getFullYear()
108
+ const mo = String(date.getMonth() + 1).padStart(2, '0')
109
+ const d = String(date.getDate()).padStart(2, '0')
110
+ return `${y}-${mo}-${d}`
111
+ },
97
112
  /** Current device TZ offset string, e.g. "+03:00" or "-05:00" */
98
113
  offset(date: Date = new Date()): string {
99
114
  return _tzOffset(date)