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 ||
|
|
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 ||
|
|
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
|
-
|
|
138
|
-
const
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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 (
|
|
161
|
-
emit('update:end',
|
|
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
|
|
103
|
-
'update:end': (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>
|