papayaui 0.3.6 → 0.3.8

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,13 +1,15 @@
1
1
  @import '../../styles/vars.scss';
2
2
 
3
3
  .#{$prefix}-date-range-picker {
4
+ display: block;
5
+
4
6
  &-inputs {
5
7
  display: flex;
6
8
  align-items: center;
7
9
  padding: 0;
8
- background-color: #fff;
9
- border-radius: 12rpx;
10
- border: 1rpx solid _var(color-border);
10
+ background-color: _var(date-range-picker-background, #fff);
11
+ border-radius: _var(date-range-picker-border-radius, 12rpx);
12
+ border: 1rpx solid _var(date-range-picker-border-color, _var(color-border));
11
13
  overflow: hidden;
12
14
  }
13
15
 
@@ -15,23 +17,59 @@
15
17
  flex: 1;
16
18
  display: flex;
17
19
  flex-direction: column;
18
- padding: 16rpx 20rpx;
20
+ padding: _var(date-range-picker-padding-y, 16rpx) _var(date-range-picker-padding-x, 20rpx);
21
+ min-width: 0;
19
22
  }
20
23
 
21
24
  &-label {
22
- font-size: 24rpx;
23
- color: _var(color-black);
24
- margin-bottom: 8rpx;
25
+ font-size: _var(date-range-picker-label-font-size, 24rpx);
26
+ color: _var(date-range-picker-label-color, _var(color-black));
27
+ margin-bottom: _var(date-range-picker-label-margin-bottom, 8rpx);
25
28
  }
26
29
 
27
30
  &-value {
28
- font-size: 26rpx;
29
- color: _var(color-text);
31
+ font-size: _var(date-range-picker-value-font-size, 26rpx);
32
+ color: _var(date-range-picker-value-color, _var(color-text));
33
+ }
34
+
35
+ &--placeholder {
36
+ color: _var(date-range-picker-placeholder-color, _var(color-disabled));
30
37
  }
31
38
 
32
39
  &-separator {
33
- margin: 0 12rpx;
34
- color: _var(color-text-secondary);
40
+ margin: 0 _var(date-range-picker-separator-margin, 12rpx);
41
+ color: _var(date-range-picker-separator-color, _var(color-text-secondary));
42
+ }
43
+
44
+ &-clear {
45
+ flex-shrink: 0;
46
+ font-size: _var(date-range-picker-clear-font-size, 32rpx);
47
+ color: _var(date-range-picker-clear-color, _var(color-disabled));
48
+ padding-right: _var(date-range-picker-clear-padding-right, 20rpx);
49
+ }
50
+
51
+ &--readonly &-inputs {
52
+ background-color: _var(date-range-picker-readonly-background, #fff);
53
+ }
54
+
55
+ &--disabled &-inputs {
56
+ background-color: _var(
57
+ date-range-picker-disabled-background,
58
+ _var(color-background-disabled, #f7f8fa)
59
+ );
60
+ border-color: _var(date-range-picker-disabled-border-color, _var(color-border));
61
+ }
62
+
63
+ &--readonly &-value,
64
+ &--readonly &-label,
65
+ &--readonly &-separator {
66
+ color: _var(date-range-picker-readonly-color, _var(color-text-secondary));
67
+ }
68
+
69
+ &--disabled &-value,
70
+ &--disabled &-label,
71
+ &--disabled &-separator {
72
+ color: _var(date-range-picker-disabled-color, _var(color-disabled));
35
73
  }
36
74
  }
37
75
 
@@ -1,12 +1,12 @@
1
1
  <template>
2
- <view :class="ns.b()">
2
+ <view :class="[ns.b(), ns.is('readonly', readonly), ns.is('disabled', disabled)]">
3
3
  <view :class="ns.b('inputs')">
4
4
  <view :class="ns.b('input')" @click="openStart">
5
5
  <view v-if="startLabel" :class="ns.b('label')">
6
6
  {{ startLabel }}
7
7
  </view>
8
- <view :class="ns.b('value')">
9
- {{ startText || placeholderStart }}
8
+ <view :class="[ns.b('value'), ns.is('placeholder', !startText)]">
9
+ {{ startText || startPlaceholder }}
10
10
  </view>
11
11
  </view>
12
12
  <view :class="ns.b('separator')">-</view>
@@ -14,10 +14,16 @@
14
14
  <view v-if="endLabel" :class="ns.b('label')">
15
15
  {{ endLabel }}
16
16
  </view>
17
- <view :class="ns.b('value')">
18
- {{ endText || placeholderEnd }}
17
+ <view :class="[ns.b('value'), ns.is('placeholder', !endText)]">
18
+ {{ endText || endPlaceholder }}
19
19
  </view>
20
20
  </view>
21
+ <pa-icon
22
+ v-if="showClear"
23
+ name="round-close-fill"
24
+ :class="ns.b('clear')"
25
+ @tap.stop="onClear"
26
+ />
21
27
  </view>
22
28
 
23
29
  <!-- 开始时间选择 -->
@@ -25,13 +31,17 @@
25
31
  <pa-date-picker
26
32
  v-model="innerStart"
27
33
  :columns-type="columnsType"
34
+ :show-toolbar="showToolbar"
28
35
  :show-columns-header="true"
29
36
  :min-date="minDate"
30
37
  :max-date="maxDate"
31
38
  :option-height="optionHeight"
32
39
  :visible-option-num="visibleOptionNum"
40
+ :confirm-button-text="confirmButtonText"
41
+ :cancel-button-text="cancelButtonText"
33
42
  :formatter="formatter"
34
43
  :filter="filter"
44
+ @change="onStartChange"
35
45
  @confirm="onStartConfirm"
36
46
  @cancel="onStartCancel"
37
47
  />
@@ -42,13 +52,17 @@
42
52
  <pa-date-picker
43
53
  v-model="innerEnd"
44
54
  :columns-type="columnsType"
55
+ :show-toolbar="showToolbar"
45
56
  :show-columns-header="true"
46
57
  :min-date="endMinDate"
47
58
  :max-date="maxDate"
48
59
  :option-height="optionHeight"
49
60
  :visible-option-num="visibleOptionNum"
61
+ :confirm-button-text="confirmButtonText"
62
+ :cancel-button-text="cancelButtonText"
50
63
  :formatter="formatter"
51
64
  :filter="filter"
65
+ @change="onEndChange"
52
66
  @confirm="onEndConfirm"
53
67
  @cancel="onEndCancel"
54
68
  />
@@ -75,6 +89,14 @@ const showEndPopup = ref(false)
75
89
  const innerStart = ref<Date | undefined>(props.start)
76
90
  const innerEnd = ref<Date | undefined>(props.end)
77
91
 
92
+ /** 是否允许打开弹窗 */
93
+ const canOpenPopup = computed(() => !props.disabled && !props.readonly)
94
+
95
+ /** 是否显示清空按钮 */
96
+ const showClear = computed(() => {
97
+ return !props.disabled && !props.readonly && props.clearable && (!!props.start || !!props.end)
98
+ })
99
+
78
100
  watch(
79
101
  () => props.start,
80
102
  (val) => {
@@ -134,36 +156,71 @@ const endText = computed(() =>
134
156
  props.end ? dayjs(props.end).format(getFormatByColumnsType()) : '',
135
157
  )
136
158
 
137
- const placeholderStart = computed(() => props.startLabel ?? '')
138
- const placeholderEnd = computed(() => props.endLabel ?? '')
159
+ /** 触发区间变更事件 */
160
+ const emitRangeChange = (start?: Date, end?: Date) => {
161
+ if (start && end) {
162
+ emit('change', { start, end })
163
+ }
164
+ }
165
+
166
+ /** 触发区间确认事件 */
167
+ const emitRangeConfirm = (start?: Date, end?: Date) => {
168
+ if (start && end) {
169
+ emit('confirm', { start, end })
170
+ }
171
+ }
139
172
 
140
173
  const openStart = () => {
174
+ if (!canOpenPopup.value) return
175
+ // 没有已选值时,用 defaultStartDate 或当前时间作为选择器初始时间
176
+ if (!innerStart.value) {
177
+ innerStart.value = props.defaultStartDate || new Date()
178
+ }
141
179
  showStartPopup.value = true
142
180
  }
143
181
 
144
182
  const openEnd = () => {
183
+ if (!canOpenPopup.value) return
184
+ // 没有已选值时,用 defaultEndDate 或当前时间作为选择器初始时间
185
+ if (!innerEnd.value) {
186
+ innerEnd.value = props.defaultEndDate || new Date()
187
+ }
145
188
  showEndPopup.value = true
146
189
  }
147
190
 
148
- const emitRangeChange = () => {
149
- if (props.start && props.end) {
150
- emit('change', {
151
- start: props.start,
152
- end: props.end,
153
- })
191
+ /** 清空当前区间值 */
192
+ const onClear = () => {
193
+ showStartPopup.value = false
194
+ showEndPopup.value = false
195
+ emit('update:start', undefined)
196
+ emit('update:end', undefined)
197
+ emit('clear')
198
+ }
199
+
200
+ /** 处理开始时间变更 */
201
+ const onStartChange = (val: Date) => {
202
+ if (!props.showToolbar) {
203
+ onStartConfirm(val)
154
204
  }
155
205
  }
156
206
 
157
207
  const onStartConfirm = (val: Date) => {
208
+ const finalStart = val
209
+ const finalEnd =
210
+ !props.allowReverse && props.end && dayjs(val).isAfter(props.end) ? val : props.end
211
+
158
212
  emit('update:start', val)
159
213
  showStartPopup.value = false
160
- if (!props.allowReverse && props.end && dayjs(val).isAfter(props.end)) {
161
- emit('update:end', val)
214
+ if (finalEnd !== props.end) {
215
+ emit('update:end', finalEnd)
162
216
  }
163
- emitRangeChange()
217
+ emitRangeChange(finalStart, finalEnd)
218
+ emitRangeConfirm(finalStart, finalEnd)
164
219
  }
165
220
 
166
221
  const onStartCancel = () => {
222
+ // 取消时恢复内部值,防止临时默认值影响下次打开
223
+ innerStart.value = props.start
167
224
  showStartPopup.value = false
168
225
  emit('cancel')
169
226
  }
@@ -173,12 +230,23 @@ const onEndConfirm = (val: Date) => {
173
230
  if (!props.allowReverse && props.start && dayjs(val).isBefore(props.start)) {
174
231
  finalEnd = props.start
175
232
  }
233
+ const finalStart = props.start
176
234
  emit('update:end', finalEnd)
177
235
  showEndPopup.value = false
178
- emitRangeChange()
236
+ emitRangeChange(finalStart, finalEnd)
237
+ emitRangeConfirm(finalStart, finalEnd)
238
+ }
239
+
240
+ /** 处理结束时间变更 */
241
+ const onEndChange = (val: Date) => {
242
+ if (!props.showToolbar) {
243
+ onEndConfirm(val)
244
+ }
179
245
  }
180
246
 
181
247
  const onEndCancel = () => {
248
+ // 取消时恢复内部值,防止临时默认值影响下次打开
249
+ innerEnd.value = props.end
182
250
  showEndPopup.value = false
183
251
  emit('cancel')
184
252
  }
@@ -4,7 +4,7 @@ import type {
4
4
  DatePickerFilter,
5
5
  DatePickerFormatter,
6
6
  } from '../../core/useDatePicker'
7
- import { isDate } from '../../utils'
7
+ import { isDate, isUndefined } from '../../utils'
8
8
 
9
9
  export const dateRangePickerProps = {
10
10
  /**
@@ -15,6 +15,14 @@ export const dateRangePickerProps = {
15
15
  * 结束时间
16
16
  */
17
17
  end: Date,
18
+ /**
19
+ * 开始时间默认值,未设置 start 时打开选择器的初始时间
20
+ */
21
+ defaultStartDate: Date,
22
+ /**
23
+ * 结束时间默认值,未设置 end 时打开选择器的初始时间
24
+ */
25
+ defaultEndDate: Date,
18
26
  /**
19
27
  * 选项类型
20
28
  */
@@ -74,6 +82,18 @@ export const dateRangePickerProps = {
74
82
  type: Boolean,
75
83
  default: false,
76
84
  },
85
+ /**
86
+ * 是否禁用
87
+ */
88
+ disabled: Boolean,
89
+ /**
90
+ * 是否只读
91
+ */
92
+ readonly: Boolean,
93
+ /**
94
+ * 是否显示清空控件
95
+ */
96
+ clearable: Boolean,
77
97
  /**
78
98
  * 开始时间标签
79
99
  */
@@ -82,6 +102,20 @@ export const dateRangePickerProps = {
82
102
  * 结束时间标签
83
103
  */
84
104
  endLabel: String,
105
+ /**
106
+ * 开始时间占位文字
107
+ */
108
+ startPlaceholder: {
109
+ type: String,
110
+ default: '开始时间',
111
+ },
112
+ /**
113
+ * 结束时间占位文字
114
+ */
115
+ endPlaceholder: {
116
+ type: String,
117
+ default: '结束时间',
118
+ },
85
119
  /**
86
120
  * 确认按钮文字
87
121
  */
@@ -99,11 +133,12 @@ export const dateRangePickerProps = {
99
133
  } as const
100
134
 
101
135
  export const dateRangePickerEmits = {
102
- 'update:start': (value: Date) => isDate(value),
103
- 'update:end': (value: Date) => isDate(value),
136
+ 'update:start': (value?: Date) => isDate(value) || isUndefined(value),
137
+ 'update:end': (value?: Date) => isDate(value) || isUndefined(value),
104
138
  change: (value: { start: Date; end: Date }) => isDate(value.start) && isDate(value.end),
105
139
  confirm: (value: { start: Date; end: Date }) => isDate(value.start) && isDate(value.end),
106
140
  cancel: () => true,
141
+ clear: () => true,
107
142
  }
108
143
 
109
144
  export type DateRangePickerProps = ExtractPropTypes<typeof dateRangePickerProps>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "papayaui",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "适用于uniapp的ui扩展库",
5
5
  "main": "index.ts",
6
6
  "module": "index.ts",