@tplc/wot 1.0.29 → 1.0.31

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/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [1.0.31](https://gitlab888.30jia.com.cn/tourism-front/zero-code-pro/compare/v0.7.78...v1.0.31) (2026-01-18)
6
+
7
+
8
+ ### ✨ Features | 新功能
9
+
10
+ * **calendar:** add defaultDays prop to support automatic end date selection in date ranges ([2e5157a](https://gitlab888.30jia.com.cn/tourism-front/zero-code-pro/commit/2e5157af7fb0fd198ce129bd5017eeb753617807))
11
+
12
+ ### [1.0.30](https://gitlab888.30jia.com.cn/tourism-front/zero-code-pro/compare/v1.0.29...v1.0.30) (2026-01-18)
13
+
14
+
15
+ ### ✨ Features | 新功能
16
+
17
+ * **wd-calendar:** add header slot support to calendar component ([67d4872](https://gitlab888.30jia.com.cn/tourism-front/zero-code-pro/commit/67d487278240242b97edd97ec22279d33fb9d769))
18
+
5
19
  ### [1.0.29](https://gitlab888.30jia.com.cn/tourism-front/zero-code-pro/compare/v0.7.77...v1.0.29) (2026-01-18)
6
20
 
7
21
  ### [1.0.28](https://gitlab888.30jia.com.cn/tourism-front/zero-code-pro/compare/v0.7.67...v1.0.28) (2026-01-13)
@@ -212,6 +212,11 @@ export const calendarProps = {
212
212
  * 默认为 true,使用内置单元格
213
213
  */
214
214
  withCell: makeBooleanProp(true),
215
+ /**
216
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
217
+ * 当传入该参数时,用户点击开始日期后会自动选中结束日期(开始日期 + defaultDays 天)
218
+ */
219
+ defaultDays: Number,
215
220
  }
216
221
 
217
222
  export type CalendarDisplayFormat = (value: number | number[], type: CalendarType) => string
@@ -106,6 +106,7 @@
106
106
  :hide-second="hideSecond"
107
107
  :show-panel-title="!range(type)"
108
108
  :immediate-change="immediateChange"
109
+ :default-days="defaultDays"
109
110
  @change="handleChange"
110
111
  />
111
112
  </view>
@@ -318,40 +318,65 @@ function handleDateRangeChange(date: CalendarDayItem) {
318
318
  const [startDate, endDate] = deepClone(isArray(props.value) ? props.value : [])
319
319
  const compare = compareDate(date.date, startDate)
320
320
 
321
- // 禁止选择同个日期
322
- if (
323
- !props.allowSameDay &&
324
- compare === 0 &&
325
- (props.type === 'daterange' || props.type === 'datetimerange') &&
326
- !endDate
327
- ) {
328
- return
329
- }
330
-
331
- if (startDate && !endDate && compare > -1) {
332
- // 不能选择超过最大范围的日期
333
- if (props.maxRange && getDayOffset(date.date, startDate) > props.maxRange) {
334
- const maxEndDate = getDayByOffset(startDate, props.maxRange - 1)
335
- value = [startDate, getDate(maxEndDate, true)]
336
- toast.show({
337
- msg: props.rangePrompt || translate('rangePrompt', props.maxRange),
338
- })
339
- } else {
340
- value = [startDate, getDate(date.date, true)]
341
- }
342
- } else if (props.type === 'datetimerange' && startDate && endDate) {
343
- // 时间范围类型,且有开始时间和结束时间,需要支持重新点击开始日期和结束日期可以重新修改时间
344
- if (compare === 0) {
321
+ // 如果设置了 defaultDays,则用户不能修改结束日期,只能重新选择开始日期
322
+ if (props.defaultDays && startDate && endDate) {
323
+ // 如果是 datetimerange 类型,点击开始日期可以重新修改开始时间
324
+ if (props.type === 'datetimerange' && compare === 0) {
345
325
  type = 'start'
346
326
  value = props.value as number[]
347
- } else if (compareDate(date.date, endDate) === 0) {
348
- type = 'end'
349
- value = props.value as number[]
350
327
  } else {
328
+ // 其他情况重新选择开始日期
351
329
  value = [getDate(date.date), null]
330
+ // 自动计算结束日期
331
+ const autoEndDate = calculateAutoEndDate(date.date)
332
+ if (autoEndDate) {
333
+ value = [getDate(date.date), getDate(autoEndDate, true)]
334
+ }
352
335
  }
353
- } else {
336
+ } else if (props.defaultDays && !startDate) {
337
+ // 首次选择开始日期,自动计算结束日期
354
338
  value = [getDate(date.date), null]
339
+ const autoEndDate = calculateAutoEndDate(date.date)
340
+ if (autoEndDate) {
341
+ value = [getDate(date.date), getDate(autoEndDate, true)]
342
+ }
343
+ } else {
344
+ // 原有逻辑:没有设置 defaultDays 的情况
345
+ // 禁止选择同个日期
346
+ if (
347
+ !props.allowSameDay &&
348
+ compare === 0 &&
349
+ (props.type === 'daterange' || props.type === 'datetimerange') &&
350
+ !endDate
351
+ ) {
352
+ return
353
+ }
354
+
355
+ if (startDate && !endDate && compare > -1) {
356
+ // 不能选择超过最大范围的日期
357
+ if (props.maxRange && getDayOffset(date.date, startDate) > props.maxRange) {
358
+ const maxEndDate = getDayByOffset(startDate, props.maxRange - 1)
359
+ value = [startDate, getDate(maxEndDate, true)]
360
+ toast.show({
361
+ msg: props.rangePrompt || translate('rangePrompt', props.maxRange),
362
+ })
363
+ } else {
364
+ value = [startDate, getDate(date.date, true)]
365
+ }
366
+ } else if (props.type === 'datetimerange' && startDate && endDate) {
367
+ // 时间范围类型,且有开始时间和结束时间,需要支持重新点击开始日期和结束日期可以重新修改时间
368
+ if (compare === 0) {
369
+ type = 'start'
370
+ value = props.value as number[]
371
+ } else if (compareDate(date.date, endDate) === 0) {
372
+ type = 'end'
373
+ value = props.value as number[]
374
+ } else {
375
+ value = [getDate(date.date), null]
376
+ }
377
+ } else {
378
+ value = [getDate(date.date), null]
379
+ }
355
380
  }
356
381
 
357
382
  emit('change', {
@@ -359,6 +384,33 @@ function handleDateRangeChange(date: CalendarDayItem) {
359
384
  type: type || (value[1] ? 'end' : 'start'),
360
385
  })
361
386
  }
387
+
388
+ /**
389
+ * 根据 defaultDays 计算自动结束日期
390
+ * @param startDate 开始日期时间戳
391
+ * @returns 结束日期时间戳,如果超出限制则返回限制边界
392
+ */
393
+ function calculateAutoEndDate(startDate: number): number | null {
394
+ if (!props.defaultDays) return null
395
+
396
+ // 计算目标结束日期
397
+ let targetDays = props.defaultDays
398
+
399
+ // 如果设置了 maxRange,取两者中较小的值
400
+ if (props.maxRange && targetDays > props.maxRange) {
401
+ targetDays = props.maxRange
402
+ }
403
+
404
+ // 计算结束日期 (开始日期 + defaultDays - 1 天,因为包含开始日期当天)
405
+ const endDate = getDayByOffset(startDate, targetDays - 1)
406
+
407
+ // 如果计算出的结束日期超过 maxDate,则截断到 maxDate
408
+ if (compareDate(endDate, props.maxDate) === 1) {
409
+ return props.maxDate
410
+ }
411
+
412
+ return endDate
413
+ }
362
414
  function handleWeekChange(date: CalendarDayItem) {
363
415
  const [weekStart] = getWeekRange(date.date, props.firstDayOfWeek)
364
416
 
@@ -16,4 +16,9 @@ export const monthProps = {
16
16
  defaultTime: {
17
17
  type: [Array] as PropType<Array<number[]>>,
18
18
  },
19
+ /**
20
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
21
+ * 当传入该参数时,用户点击开始日期后会自动选中结束日期(开始日期 + defaultDays 天)
22
+ */
23
+ defaultDays: Number,
19
24
  }
@@ -28,6 +28,7 @@
28
28
  :range-prompt="rangePrompt"
29
29
  :allow-same-day="allowSameDay"
30
30
  :default-time="defaultTime"
31
+ :default-days="defaultDays"
31
32
  @change="handleDateChange"
32
33
  />
33
34
  </view>
@@ -32,6 +32,10 @@ export const monthPanelProps = {
32
32
  * 是否在手指松开时立即触发picker-view的 change 事件。若不开启则会在滚动动画结束后触发 change 事件,1.2.25版本起提供,仅微信小程序和支付宝小程序支持。
33
33
  */
34
34
  immediateChange: makeBooleanProp(false),
35
+ /**
36
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
37
+ */
38
+ defaultDays: Number,
35
39
  }
36
40
 
37
41
  export type MonthPanelProps = ExtractPropTypes<typeof monthPanelProps>
@@ -92,6 +92,11 @@ export const calendarViewProps = {
92
92
  * 是否在手指松开时立即触发picker-view的 change 事件。若不开启则会在滚动动画结束后触发 change 事件,1.2.25版本起提供,仅微信小程序和支付宝小程序支持。
93
93
  */
94
94
  immediateChange: makeBooleanProp(false),
95
+ /**
96
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
97
+ * 当传入该参数时,用户点击开始日期后会自动选中结束日期(开始日期 + defaultDays 天)
98
+ */
99
+ defaultDays: Number,
95
100
  }
96
101
 
97
102
  export type CalendarViewProps = ExtractPropTypes<typeof calendarViewProps>
@@ -34,6 +34,7 @@
34
34
  :immediate-change="immediateChange"
35
35
  :time-filter="timeFilter"
36
36
  :hide-second="hideSecond"
37
+ :default-days="defaultDays"
37
38
  @change="handleChange"
38
39
  @pickstart="handlePickStart"
39
40
  @pickend="handlePickEnd"
@@ -71,13 +71,13 @@ export default {
71
71
  options: {
72
72
  virtualHost: true,
73
73
  addGlobalClass: true,
74
- styleIsolation: 'shared'
75
- }
74
+ styleIsolation: 'shared',
75
+ },
76
76
  }
77
77
  </script>
78
78
 
79
79
  <script lang="ts" setup>
80
- import { computed, onBeforeMount, ref } from 'vue'
80
+ import { computed, inject, onBeforeMount, ref, watch } from 'vue'
81
81
  import wdIcon from '../wd-icon/wd-icon.vue'
82
82
  import wdOverlay from '../wd-overlay/wd-overlay.vue'
83
83
  import wdTransition from '../wd-transition/wd-transition.vue'
@@ -96,7 +96,7 @@ const emit = defineEmits([
96
96
  'after-leave',
97
97
  'after-enter',
98
98
  'click-modal',
99
- 'close'
99
+ 'close',
100
100
  ])
101
101
 
102
102
  /**
@@ -125,7 +125,9 @@ const transitionName = computed<TransitionName | TransitionName[]>(() => {
125
125
  })
126
126
 
127
127
  const safeBottom = ref<number>(0)
128
-
128
+ const popupProvide = inject('wd-popup', {
129
+ value: false,
130
+ })
129
131
  const style = computed(() => {
130
132
  return `z-index:${props.zIndex}; padding-bottom: ${safeBottom.value}px;${props.customStyle}`
131
133
  })
@@ -150,6 +152,13 @@ onBeforeMount(() => {
150
152
  }
151
153
  }
152
154
  })
155
+ watch(
156
+ () => props.modelValue,
157
+ (newVal) => {
158
+ popupProvide.value = newVal
159
+ },
160
+ { deep: true, immediate: true },
161
+ )
153
162
 
154
163
  function handleClickModal() {
155
164
  emit('click-modal')
@@ -9,7 +9,13 @@
9
9
  >
10
10
  <slot />
11
11
  </view>
12
- <view :class="rootClass" :style="style" @transitionend="onTransitionEnd" @click="handleClick" v-else-if="isShow && !disableTouchMove">
12
+ <view
13
+ :class="rootClass"
14
+ :style="style"
15
+ @transitionend="onTransitionEnd"
16
+ @click="handleClick"
17
+ v-else-if="isShow && !disableTouchMove"
18
+ >
13
19
  <slot />
14
20
  </view>
15
21
  </template>
@@ -20,8 +26,8 @@ export default {
20
26
  options: {
21
27
  addGlobalClass: true,
22
28
  virtualHost: true,
23
- styleIsolation: 'shared'
24
- }
29
+ styleIsolation: 'shared',
30
+ },
25
31
  }
26
32
  </script>
27
33
 
@@ -51,15 +57,23 @@ const getClassNames = (name?: TransitionName | TransitionName[]) => {
51
57
  leaveTo = `wd-${name}-leave-to wd-${name}-leave-active ${leaveTo}`
52
58
  }
53
59
  return {
54
- enter: enter,
60
+ enter,
55
61
  'enter-to': enterTo,
56
- leave: leave,
57
- 'leave-to': leaveTo
62
+ leave,
63
+ 'leave-to': leaveTo,
58
64
  }
59
65
  }
60
66
 
61
67
  const props = defineProps(transitionProps)
62
- const emit = defineEmits(['click', 'before-enter', 'enter', 'before-leave', 'leave', 'after-leave', 'after-enter'])
68
+ const emit = defineEmits([
69
+ 'click',
70
+ 'before-enter',
71
+ 'enter',
72
+ 'before-leave',
73
+ 'leave',
74
+ 'after-leave',
75
+ 'after-enter',
76
+ ])
63
77
 
64
78
  // 初始化是否完成
65
79
  const inited = ref<boolean>(false)
@@ -107,7 +121,7 @@ watch(
107
121
  (newVal) => {
108
122
  handleShow(newVal)
109
123
  },
110
- { deep: true }
124
+ { deep: true },
111
125
  )
112
126
 
113
127
  function handleClick() {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "@tplc/wot",
3
3
  "name": "@tplc/wot",
4
- "version": "1.0.29",
4
+ "version": "1.0.31",
5
5
  "keywords": [
6
6
  "wot-design-uni",
7
7
  "国际化",
@@ -266,6 +266,11 @@ export declare const calendarProps: {
266
266
  type: BooleanConstructor
267
267
  default: boolean
268
268
  }
269
+ /**
270
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
271
+ * 当传入该参数时,用户点击开始日期后会自动选中结束日期(开始日期 + defaultDays 天)
272
+ */
273
+ defaultDays: NumberConstructor
269
274
  customStyle: {
270
275
  type: PropType<string>
271
276
  default: string
@@ -134,6 +134,7 @@ declare const _default: __VLS_WithTemplateSlots<
134
134
  type: BooleanConstructor
135
135
  default: boolean
136
136
  }
137
+ defaultDays: NumberConstructor
137
138
  customStyle: {
138
139
  type: import('vue').PropType<string>
139
140
  default: string
@@ -294,6 +295,7 @@ declare const _default: __VLS_WithTemplateSlots<
294
295
  type: BooleanConstructor
295
296
  default: boolean
296
297
  }
298
+ defaultDays: NumberConstructor
297
299
  customStyle: {
298
300
  type: import('vue').PropType<string>
299
301
  default: string
@@ -35,6 +35,7 @@ declare const _default: import('vue').DefineComponent<
35
35
  defaultTime: {
36
36
  type: import('vue').PropType<Array<number[]>>
37
37
  }
38
+ defaultDays: NumberConstructor
38
39
  },
39
40
  {},
40
41
  unknown,
@@ -83,6 +84,7 @@ declare const _default: import('vue').DefineComponent<
83
84
  defaultTime: {
84
85
  type: import('vue').PropType<Array<number[]>>
85
86
  }
87
+ defaultDays: NumberConstructor
86
88
  }>
87
89
  > & {
88
90
  onChange?: ((...args: any[]) => any) | undefined
@@ -35,4 +35,9 @@ export declare const monthProps: {
35
35
  defaultTime: {
36
36
  type: PropType<Array<number[]>>
37
37
  }
38
+ /**
39
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
40
+ * 当传入该参数时,用户点击开始日期后会自动选中结束日期(开始日期 + defaultDays 天)
41
+ */
42
+ defaultDays: NumberConstructor
38
43
  }
@@ -47,6 +47,7 @@ declare const _default: import('vue').DefineComponent<
47
47
  type: BooleanConstructor
48
48
  default: boolean
49
49
  }
50
+ defaultDays: NumberConstructor
50
51
  },
51
52
  {
52
53
  scrollIntoView: () => void
@@ -112,6 +113,7 @@ declare const _default: import('vue').DefineComponent<
112
113
  type: BooleanConstructor
113
114
  default: boolean
114
115
  }
116
+ defaultDays: NumberConstructor
115
117
  }>
116
118
  > & {
117
119
  onChange?: ((...args: any[]) => any) | undefined
@@ -58,6 +58,10 @@ export declare const monthPanelProps: {
58
58
  type: BooleanConstructor
59
59
  default: boolean
60
60
  }
61
+ /**
62
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
63
+ */
64
+ defaultDays: NumberConstructor
61
65
  }
62
66
  export type MonthPanelProps = ExtractPropTypes<typeof monthPanelProps>
63
67
  export type MonthPanelTimeType = 'start' | 'end' | ''
@@ -100,6 +100,11 @@ export declare const calendarViewProps: {
100
100
  type: BooleanConstructor
101
101
  default: boolean
102
102
  }
103
+ /**
104
+ * type 为 daterange 或 datetimerange 时有效,默认选中的天数
105
+ * 当传入该参数时,用户点击开始日期后会自动选中结束日期(开始日期 + defaultDays 天)
106
+ */
107
+ defaultDays: NumberConstructor
103
108
  customStyle: {
104
109
  type: PropType<string>
105
110
  default: string
@@ -48,6 +48,7 @@ declare const _default: import('vue').DefineComponent<
48
48
  type: BooleanConstructor
49
49
  default: boolean
50
50
  }
51
+ defaultDays: NumberConstructor
51
52
  customStyle: {
52
53
  type: import('vue').PropType<string>
53
54
  default: string
@@ -123,6 +124,7 @@ declare const _default: import('vue').DefineComponent<
123
124
  type: BooleanConstructor
124
125
  default: boolean
125
126
  }
127
+ defaultDays: NumberConstructor
126
128
  customStyle: {
127
129
  type: import('vue').PropType<string>
128
130
  default: string