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 || 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,33 +156,58 @@ 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
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
- const emitRangeChange = () => {
149
- if (props.start && props.end) {
150
- emit('change', {
151
- start: props.start,
152
- end: props.end,
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 (!props.allowReverse && props.end && dayjs(val).isAfter(props.end)) {
161
- emit('update:end', val)
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: Date) => isDate(value),
103
- 'update:end': (value: Date) => isDate(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>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "papayaui",
3
- "version": "0.3.6",
3
+ "version": "0.3.7",
4
4
  "description": "适用于uniapp的ui扩展库",
5
5
  "main": "index.ts",
6
6
  "module": "index.ts",