papayaui 0.3.6 → 0.3.7
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,33 +156,58 @@ 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
|
|
141
175
|
showStartPopup.value = true
|
|
142
176
|
}
|
|
143
177
|
|
|
144
178
|
const openEnd = () => {
|
|
179
|
+
if (!canOpenPopup.value) return
|
|
145
180
|
showEndPopup.value = true
|
|
146
181
|
}
|
|
147
182
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
183
|
+
/** 清空当前区间值 */
|
|
184
|
+
const onClear = () => {
|
|
185
|
+
showStartPopup.value = false
|
|
186
|
+
showEndPopup.value = false
|
|
187
|
+
emit('update:start', undefined)
|
|
188
|
+
emit('update:end', undefined)
|
|
189
|
+
emit('clear')
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** 处理开始时间变更 */
|
|
193
|
+
const onStartChange = (val: Date) => {
|
|
194
|
+
if (!props.showToolbar) {
|
|
195
|
+
onStartConfirm(val)
|
|
154
196
|
}
|
|
155
197
|
}
|
|
156
198
|
|
|
157
199
|
const onStartConfirm = (val: Date) => {
|
|
200
|
+
const finalStart = val
|
|
201
|
+
const finalEnd =
|
|
202
|
+
!props.allowReverse && props.end && dayjs(val).isAfter(props.end) ? val : props.end
|
|
203
|
+
|
|
158
204
|
emit('update:start', val)
|
|
159
205
|
showStartPopup.value = false
|
|
160
|
-
if (
|
|
161
|
-
emit('update:end',
|
|
206
|
+
if (finalEnd !== props.end) {
|
|
207
|
+
emit('update:end', finalEnd)
|
|
162
208
|
}
|
|
163
|
-
emitRangeChange()
|
|
209
|
+
emitRangeChange(finalStart, finalEnd)
|
|
210
|
+
emitRangeConfirm(finalStart, finalEnd)
|
|
164
211
|
}
|
|
165
212
|
|
|
166
213
|
const onStartCancel = () => {
|
|
@@ -173,9 +220,18 @@ const onEndConfirm = (val: Date) => {
|
|
|
173
220
|
if (!props.allowReverse && props.start && dayjs(val).isBefore(props.start)) {
|
|
174
221
|
finalEnd = props.start
|
|
175
222
|
}
|
|
223
|
+
const finalStart = props.start
|
|
176
224
|
emit('update:end', finalEnd)
|
|
177
225
|
showEndPopup.value = false
|
|
178
|
-
emitRangeChange()
|
|
226
|
+
emitRangeChange(finalStart, finalEnd)
|
|
227
|
+
emitRangeConfirm(finalStart, finalEnd)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** 处理结束时间变更 */
|
|
231
|
+
const onEndChange = (val: Date) => {
|
|
232
|
+
if (!props.showToolbar) {
|
|
233
|
+
onEndConfirm(val)
|
|
234
|
+
}
|
|
179
235
|
}
|
|
180
236
|
|
|
181
237
|
const onEndCancel = () => {
|
|
@@ -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
|
/**
|
|
@@ -74,6 +74,18 @@ export const dateRangePickerProps = {
|
|
|
74
74
|
type: Boolean,
|
|
75
75
|
default: false,
|
|
76
76
|
},
|
|
77
|
+
/**
|
|
78
|
+
* 是否禁用
|
|
79
|
+
*/
|
|
80
|
+
disabled: Boolean,
|
|
81
|
+
/**
|
|
82
|
+
* 是否只读
|
|
83
|
+
*/
|
|
84
|
+
readonly: Boolean,
|
|
85
|
+
/**
|
|
86
|
+
* 是否显示清空控件
|
|
87
|
+
*/
|
|
88
|
+
clearable: Boolean,
|
|
77
89
|
/**
|
|
78
90
|
* 开始时间标签
|
|
79
91
|
*/
|
|
@@ -82,6 +94,20 @@ export const dateRangePickerProps = {
|
|
|
82
94
|
* 结束时间标签
|
|
83
95
|
*/
|
|
84
96
|
endLabel: String,
|
|
97
|
+
/**
|
|
98
|
+
* 开始时间占位文字
|
|
99
|
+
*/
|
|
100
|
+
startPlaceholder: {
|
|
101
|
+
type: String,
|
|
102
|
+
default: '开始时间',
|
|
103
|
+
},
|
|
104
|
+
/**
|
|
105
|
+
* 结束时间占位文字
|
|
106
|
+
*/
|
|
107
|
+
endPlaceholder: {
|
|
108
|
+
type: String,
|
|
109
|
+
default: '结束时间',
|
|
110
|
+
},
|
|
85
111
|
/**
|
|
86
112
|
* 确认按钮文字
|
|
87
113
|
*/
|
|
@@ -99,11 +125,12 @@ export const dateRangePickerProps = {
|
|
|
99
125
|
} as const
|
|
100
126
|
|
|
101
127
|
export const dateRangePickerEmits = {
|
|
102
|
-
'update:start': (value
|
|
103
|
-
'update:end': (value
|
|
128
|
+
'update:start': (value?: Date) => isDate(value) || isUndefined(value),
|
|
129
|
+
'update:end': (value?: Date) => isDate(value) || isUndefined(value),
|
|
104
130
|
change: (value: { start: Date; end: Date }) => isDate(value.start) && isDate(value.end),
|
|
105
131
|
confirm: (value: { start: Date; end: Date }) => isDate(value.start) && isDate(value.end),
|
|
106
132
|
cancel: () => true,
|
|
133
|
+
clear: () => true,
|
|
107
134
|
}
|
|
108
135
|
|
|
109
136
|
export type DateRangePickerProps = ExtractPropTypes<typeof dateRangePickerProps>
|