From 3d775bfea16b5ac26ff0baac10f43b3367b0bf95 Mon Sep 17 00:00:00 2001 From: whycq <913841844@qq.com> Date: 星期日, 08 十月 2023 13:28:42 +0800 Subject: [PATCH] # --- uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue | 981 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 981 insertions(+), 0 deletions(-) diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 0000000..e844331 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,981 @@ +<template> + <view class="uni-date"> + <view class="uni-date-editor" @click="show"> + <slot> + <view class="uni-date-editor--x" :class="{'uni-date-editor--x__disabled': disabled, + 'uni-date-x--border': border}"> + <view v-if="!isRange" class="uni-date-x uni-date-single"> + <uni-icons type="calendar" color="#e1e1e1" size="22"></uni-icons> + <input class="uni-date__x-input" type="text" v-model="singleVal" + :placeholder="singlePlaceholderText" :disabled="true" /> + </view> + <view v-else class="uni-date-x uni-date-range"> + <uni-icons type="calendar" color="#e1e1e1" size="22"></uni-icons> + <input class="uni-date__x-input t-c" type="text" v-model="range.startDate" + :placeholder="startPlaceholderText" :disabled="true" /> + <slot> + <view class="">{{rangeSeparator}}</view> + </slot> + <input class="uni-date__x-input t-c" type="text" v-model="range.endDate" + :placeholder="endPlaceholderText" :disabled="true" /> + </view> + <view v-if="showClearIcon" class="uni-date__icon-clear" @click.stop="clear"> + <uni-icons type="clear" color="#e1e1e1" size="18"></uni-icons> + </view> + </view> + </slot> + </view> + + <view v-show="popup" class="uni-date-mask" @click="close"></view> + <view v-if="!isPhone" ref="datePicker" v-show="popup" class="uni-date-picker__container"> + <view v-if="!isRange" class="uni-date-single--x" :style="popover"> + <view class="uni-popper__arrow"></view> + <view v-if="hasTime" class="uni-date-changed popup-x-header"> + <input class="uni-date__input t-c" type="text" v-model="tempSingleDate" + :placeholder="selectDateText" /> + <time-picker type="time" v-model="time" :border="false" :disabled="!tempSingleDate" + :start="reactStartTime" :end="reactEndTime" :hideSecond="hideSecond" style="width: 100%;"> + <input class="uni-date__input t-c" type="text" v-model="time" :placeholder="selectTimeText" + :disabled="!tempSingleDate" /> + </time-picker> + </view> + <calendar ref="pcSingle" :showMonth="false" + :start-date="caleRange.startDate" :end-date="caleRange.endDate" :date="defSingleDate" + @change="singleChange" style="padding: 0 8px;" /> + <view v-if="hasTime" class="popup-x-footer"> + <!-- <text class="">姝ゅ埢</text> --> + <text class="confirm" @click="confirmSingleChange">{{okText}}</text> + </view> + <view class="uni-date-popper__arrow"></view> + </view> + + <view v-else class="uni-date-range--x" :style="popover"> + <view class="uni-popper__arrow"></view> + <view v-if="hasTime" class="popup-x-header uni-date-changed"> + <view class="popup-x-header--datetime"> + <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startDate" + :placeholder="startDateText" /> + <time-picker type="time" v-model="tempRange.startTime" :start="reactStartTime" :border="false" + :disabled="!tempRange.startDate" :hideSecond="hideSecond"> + <input class="uni-date__input uni-date-range__input" type="text" + v-model="tempRange.startTime" :placeholder="startTimeText" + :disabled="!tempRange.startDate" /> + </time-picker> + </view> + <uni-icons type="arrowthinright" color="#999" style="line-height: 40px;"></uni-icons> + <view class="popup-x-header--datetime"> + <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endDate" + :placeholder="endDateText" /> + <time-picker type="time" v-model="tempRange.endTime" :end="reactEndTime" :border="false" + :disabled="!tempRange.endDate" :hideSecond="hideSecond"> + <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endTime" + :placeholder="endTimeText" :disabled="!tempRange.endDate" /> + </time-picker> + </view> + </view> + <view class="popup-x-body"> + <calendar ref="left" :showMonth="false" + :start-date="caleRange.startDate" :end-date="caleRange.endDate" :range="true" + @change="leftChange" :pleStatus="endMultipleStatus" @firstEnterCale="updateRightCale" + @monthSwitch="leftMonthSwitch" style="padding: 0 8px;" /> + <calendar ref="right" :showMonth="false" + :start-date="caleRange.startDate" :end-date="caleRange.endDate" :range="true" + @change="rightChange" :pleStatus="startMultipleStatus" @firstEnterCale="updateLeftCale" + @monthSwitch="rightMonthSwitch" style="padding: 0 8px;border-left: 1px solid #F1F1F1;" /> + </view> + <view v-if="hasTime" class="popup-x-footer"> + <text class="" @click="clear">{{clearText}}</text> + <text class="confirm" @click="confirmRangeChange">{{okText}}</text> + </view> + </view> + </view> + <calendar v-show="isPhone" ref="mobile" :clearDate="false" :date="defSingleDate" :defTime="reactMobDefTime" + :start-date="caleRange.startDate" :end-date="caleRange.endDate" :selectableTimes="mobSelectableTime" + :pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :typeHasTime="hasTime" :insert="false" + :hideSecond="hideSecond" @confirm="mobileChange" /> + </view> +</template> +<script> + /** + * DatetimePicker 鏃堕棿閫夋嫨鍣� + * @description 鍚屾椂鏀寔 PC 鍜岀Щ鍔ㄧ浣跨敤鏃ュ巻閫夋嫨鏃ユ湡鍜屾棩鏈熻寖鍥� + * @tutorial https://ext.dcloud.net.cn/plugin?id=3962 + * @property {String} type 閫夋嫨鍣ㄧ被鍨� + * @property {String|Number|Array|Date} value 缁戝畾鍊� + * @property {String} placeholder 鍗曢�夋嫨鏃剁殑鍗犱綅鍐呭 + * @property {String} start 璧峰鏃堕棿 + * @property {String} end 缁堟鏃堕棿 + * @property {String} start-placeholder 鑼冨洿閫夋嫨鏃跺紑濮嬫棩鏈熺殑鍗犱綅鍐呭 + * @property {String} end-placeholder 鑼冨洿閫夋嫨鏃剁粨鏉熸棩鏈熺殑鍗犱綅鍐呭 + * @property {String} range-separator 閫夋嫨鑼冨洿鏃剁殑鍒嗛殧绗� + * @property {Boolean} border = [true|false] 鏄惁鏈夎竟妗� + * @property {Boolean} disabled = [true|false] 鏄惁绂佺敤 + * @property {Boolean} clearIcon = [true|false] 鏄惁鏄剧ず娓呴櫎鎸夐挳锛堜粎PC绔�傜敤锛� + * @event {Function} change 纭畾鏃ユ湡鏃惰Е鍙戠殑浜嬩欢 + * @event {Function} show 鎵撳紑寮瑰嚭灞� + * @event {Function} close 鍏抽棴寮瑰嚭灞� + * @event {Function} clear 娓呴櫎涓婃閫変腑鐨勭姸鎬佸拰鍊� + **/ + import calendar from './calendar.vue' + import timePicker from './time-picker.vue' + import { + initVueI18n + } from '@dcloudio/uni-i18n' + import messages from './i18n/index.js' + const { + t + } = initVueI18n(messages) + + export default { + name: 'UniDatetimePicker', + components: { + calendar, + timePicker + }, + data() { + return { + isRange: false, + hasTime: false, + mobileRange: false, + // 鍗曢�� + singleVal: '', + tempSingleDate: '', + defSingleDate: '', + time: '', + // 鑼冨洿閫� + caleRange: { + startDate: '', + startTime: '', + endDate: '', + endTime: '' + }, + range: { + startDate: '', + // startTime: '', + endDate: '', + // endTime: '' + }, + tempRange: { + startDate: '', + startTime: '', + endDate: '', + endTime: '' + }, + // 宸﹀彸鏃ュ巻鍚屾鏁版嵁 + startMultipleStatus: { + before: '', + after: '', + data: [], + fulldate: '' + }, + endMultipleStatus: { + before: '', + after: '', + data: [], + fulldate: '' + }, + visible: false, + popup: false, + popover: null, + isEmitValue: false, + isPhone: false, + isFirstShow: true, + } + }, + props: { + type: { + type: String, + default: 'datetime' + }, + value: { + type: [String, Number, Array, Date], + default: '' + }, + modelValue: { + type: [String, Number, Array, Date], + default: '' + }, + start: { + type: [Number, String], + default: '' + }, + end: { + type: [Number, String], + default: '' + }, + returnType: { + type: String, + default: 'string' + }, + placeholder: { + type: String, + default: '' + }, + startPlaceholder: { + type: String, + default: '' + }, + endPlaceholder: { + type: String, + default: '' + }, + rangeSeparator: { + type: String, + default: '-' + }, + border: { + type: [Boolean], + default: true + }, + disabled: { + type: [Boolean], + default: false + }, + clearIcon: { + type: [Boolean], + default: true + }, + hideSecond: { + type: [Boolean], + default: false + } + }, + watch: { + type: { + immediate: true, + handler(newVal, oldVal) { + if (newVal.indexOf('time') !== -1) { + this.hasTime = true + } else { + this.hasTime = false + } + if (newVal.indexOf('range') !== -1) { + this.isRange = true + } else { + this.isRange = false + } + } + }, + value: { + immediate: true, + handler(newVal, oldVal) { + if (this.isEmitValue) { + this.isEmitValue = false + return + } + this.initPicker(newVal) + } + }, + + start: { + immediate: true, + handler(newVal, oldVal) { + if (!newVal) return + const { + defDate, + defTime + } = this.parseDate(newVal) + this.caleRange.startDate = defDate + if (this.hasTime) { + this.caleRange.startTime = defTime + } + } + }, + + end: { + immediate: true, + handler(newVal, oldVal) { + if (!newVal) return + const { + defDate, + defTime + } = this.parseDate(newVal) + this.caleRange.endDate = defDate + if (this.hasTime) { + this.caleRange.endTime = defTime + } + } + }, + }, + computed: { + reactStartTime() { + const activeDate = this.isRange ? this.tempRange.startDate : this.tempSingleDate + const res = activeDate === this.caleRange.startDate ? this.caleRange.startTime : '' + return res + }, + reactEndTime() { + const activeDate = this.isRange ? this.tempRange.endDate : this.tempSingleDate + const res = activeDate === this.caleRange.endDate ? this.caleRange.endTime : '' + return res + }, + reactMobDefTime() { + const times = { + start: this.tempRange.startTime, + end: this.tempRange.endTime + } + return this.isRange ? times : this.time + }, + mobSelectableTime() { + return { + start: this.caleRange.startTime, + end: this.caleRange.endTime + } + }, + datePopupWidth() { + // todo + return this.isRange ? 653 : 301 + }, + + /** + * for i18n + */ + singlePlaceholderText() { + return this.placeholder || (this.type === 'date' ? this.selectDateText : t( + "uni-datetime-picker.selectDateTime")) + }, + startPlaceholderText() { + return this.startPlaceholder || this.startDateText + }, + endPlaceholderText() { + return this.endPlaceholder || this.endDateText + }, + selectDateText() { + return t("uni-datetime-picker.selectDate") + }, + selectTimeText() { + return t("uni-datetime-picker.selectTime") + }, + startDateText() { + return this.startPlaceholder || t("uni-datetime-picker.startDate") + }, + startTimeText() { + return t("uni-datetime-picker.startTime") + }, + endDateText() { + return this.endPlaceholder || t("uni-datetime-picker.endDate") + }, + endTimeText() { + return t("uni-datetime-picker.endTime") + }, + okText() { + return t("uni-datetime-picker.ok") + }, + clearText() { + return t("uni-datetime-picker.clear") + }, + showClearIcon() { + const { clearIcon, disabled, singleVal, range } = this + const bool = clearIcon && !disabled && (singleVal || (range.startDate && range.endDate)) + return bool + } + }, + created() { + this.form = this.getForm('uniForms') + this.formItem = this.getForm('uniFormsItem') + + // if (this.formItem) { + // if (this.formItem.name) { + // this.rename = this.formItem.name + // this.form.inputChildrens.push(this) + // } + // } + }, + mounted() { + this.platform() + }, + methods: { + /** + * 鑾峰彇鐖跺厓绱犲疄渚� + */ + getForm(name = 'uniForms') { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== name) { + parent = parent.$parent; + if (!parent) return false + parentName = parent.$options.name; + } + return parent; + }, + initPicker(newVal) { + if (!newVal || Array.isArray(newVal) && !newVal.length) { + this.$nextTick(() => { + this.clear(false) + }) + return + } + if (!Array.isArray(newVal) && !this.isRange) { + const { + defDate, + defTime + } = this.parseDate(newVal) + this.singleVal = defDate + this.tempSingleDate = defDate + this.defSingleDate = defDate + if (this.hasTime) { + this.singleVal = defDate + ' ' + defTime + this.time = defTime + } + } else { + const [before, after] = newVal + if (!before && !after) return + const defBefore = this.parseDate(before) + const defAfter = this.parseDate(after) + const startDate = defBefore.defDate + const endDate = defAfter.defDate + this.range.startDate = this.tempRange.startDate = startDate + this.range.endDate = this.tempRange.endDate = endDate + + if (this.hasTime) { + this.range.startDate = defBefore.defDate + ' ' + defBefore.defTime + this.range.endDate = defAfter.defDate + ' ' + defAfter.defTime + this.tempRange.startTime = defBefore.defTime + this.tempRange.endTime = defAfter.defTime + } + const defaultRange = { + before: defBefore.defDate, + after: defAfter.defDate + } + this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, defaultRange, { + which: 'right' + }) + this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, defaultRange, { + which: 'left' + }) + } + }, + updateLeftCale(e) { + const left = this.$refs.left + // 璁剧疆鑼冨洿閫� + left.cale.setHoverMultiple(e.after) + left.setDate(this.$refs.left.nowDate.fullDate) + }, + updateRightCale(e) { + const right = this.$refs.right + // 璁剧疆鑼冨洿閫� + right.cale.setHoverMultiple(e.after) + right.setDate(this.$refs.right.nowDate.fullDate) + }, + platform() { + const systemInfo = uni.getSystemInfoSync() + this.isPhone = systemInfo.windowWidth <= 500 + this.windowWidth = systemInfo.windowWidth + }, + show(event) { + if (this.disabled) { + return + } + this.platform() + if (this.isPhone) { + this.$refs.mobile.open() + return + } + this.popover = { + top: '10px' + } + const dateEditor = uni.createSelectorQuery().in(this).select(".uni-date-editor") + dateEditor.boundingClientRect(rect => { + if (this.windowWidth - rect.left < this.datePopupWidth) { + this.popover.right = 0 + } + }).exec() + setTimeout(() => { + this.popup = !this.popup + if (!this.isPhone && this.isRange && this.isFirstShow) { + this.isFirstShow = false + const { + startDate, + endDate + } = this.range + if (startDate && endDate) { + if (this.diffDate(startDate, endDate) < 30) { + this.$refs.right.next() + } + } else { + this.$refs.right.next() + this.$refs.right.cale.lastHover = false + } + } + + }, 50) + }, + + close() { + setTimeout(() => { + this.popup = false + this.$emit('maskClick', this.value) + }, 20) + }, + setEmit(value) { + if (this.returnType === "timestamp" || this.returnType === "date") { + if (!Array.isArray(value)) { + if (!this.hasTime) { + value = value + ' ' + '00:00:00' + } + value = this.createTimestamp(value) + if (this.returnType === "date") { + value = new Date(value) + } + } else { + if (!this.hasTime) { + value[0] = value[0] + ' ' + '00:00:00' + value[1] = value[1] + ' ' + '00:00:00' + } + value[0] = this.createTimestamp(value[0]) + value[1] = this.createTimestamp(value[1]) + if (this.returnType === "date") { + value[0] = new Date(value[0]) + value[1] = new Date(value[1]) + } + } + } + this.formItem && this.formItem.setValue(value) + this.$emit('change', value) + this.$emit('input', value) + this.$emit('update:modelValue', value) + this.isEmitValue = true + }, + createTimestamp(date) { + date = this.fixIosDateFormat(date) + return Date.parse(new Date(date)) + }, + singleChange(e) { + this.tempSingleDate = e.fulldate + if (this.hasTime) return + this.confirmSingleChange() + }, + + confirmSingleChange() { + if (!this.tempSingleDate) { + this.popup = false + return + } + if (this.hasTime) { + this.singleVal = this.tempSingleDate + ' ' + (this.time ? this.time : '00:00:00') + } else { + this.singleVal = this.tempSingleDate + } + this.setEmit(this.singleVal) + this.popup = false + }, + + leftChange(e) { + const { + before, + after + } = e.range + this.rangeChange(before, after) + const obj = { + before: e.range.before, + after: e.range.after, + data: e.range.data, + fulldate: e.fulldate + } + this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, obj) + }, + + rightChange(e) { + const { + before, + after + } = e.range + this.rangeChange(before, after) + const obj = { + before: e.range.before, + after: e.range.after, + data: e.range.data, + fulldate: e.fulldate + } + this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, obj) + }, + + mobileChange(e) { + if (this.isRange) { + const { + before, + after + } = e.range + this.handleStartAndEnd(before, after, true) + if (this.hasTime) { + const { + startTime, + endTime + } = e.timeRange + this.tempRange.startTime = startTime + this.tempRange.endTime = endTime + } + this.confirmRangeChange() + + } else { + if (this.hasTime) { + this.singleVal = e.fulldate + ' ' + e.time + } else { + this.singleVal = e.fulldate + } + this.setEmit(this.singleVal) + } + this.$refs.mobile.close() + }, + + rangeChange(before, after) { + if (!(before && after)) return + this.handleStartAndEnd(before, after, true) + if (this.hasTime) return + this.confirmRangeChange() + }, + + confirmRangeChange() { + if (!this.tempRange.startDate && !this.tempRange.endDate) { + this.popup = false + return + } + let start, end + if (!this.hasTime) { + start = this.range.startDate = this.tempRange.startDate + end = this.range.endDate = this.tempRange.endDate + } else { + start = this.range.startDate = this.tempRange.startDate + ' ' + + (this.tempRange.startTime ? this.tempRange.startTime : '00:00:00') + end = this.range.endDate = this.tempRange.endDate + ' ' + + (this.tempRange.endTime ? this.tempRange.endTime : '00:00:00') + } + const displayRange = [start, end] + this.setEmit(displayRange) + this.popup = false + }, + + handleStartAndEnd(before, after, temp = false) { + if (!(before && after)) return + const type = temp ? 'tempRange' : 'range' + if (this.dateCompare(before, after)) { + this[type].startDate = before + this[type].endDate = after + } else { + this[type].startDate = after + this[type].endDate = before + } + }, + + /** + * 姣旇緝鏃堕棿澶у皬 + */ + dateCompare(startDate, endDate) { + // 璁$畻鎴鏃堕棿 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 璁$畻璇︾粏椤圭殑鎴鏃堕棿 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + }, + + /** + * 姣旇緝鏃堕棿宸� + */ + diffDate(startDate, endDate) { + // 璁$畻鎴鏃堕棿 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 璁$畻璇︾粏椤圭殑鎴鏃堕棿 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + const diff = (endDate - startDate) / (24 * 60 * 60 * 1000) + return Math.abs(diff) + }, + + clear(needEmit = true) { + if (!this.isRange) { + this.singleVal = '' + this.tempSingleDate = '' + this.time = '' + if (this.isPhone) { + this.$refs.mobile && this.$refs.mobile.clearCalender() + } else { + this.$refs.pcSingle && this.$refs.pcSingle.clearCalender() + } + if (needEmit) { + this.formItem && this.formItem.setValue('') + this.$emit('change', '') + this.$emit('input', '') + this.$emit('update:modelValue', '') + } + } else { + this.range.startDate = '' + this.range.endDate = '' + this.tempRange.startDate = '' + this.tempRange.startTime = '' + this.tempRange.endDate = '' + this.tempRange.endTime = '' + if (this.isPhone) { + this.$refs.mobile && this.$refs.mobile.clearCalender() + } else { + this.$refs.left && this.$refs.left.clearCalender() + this.$refs.right && this.$refs.right.clearCalender() + this.$refs.right && this.$refs.right.next() + } + if (needEmit) { + this.formItem && this.formItem.setValue([]) + this.$emit('change', []) + this.$emit('input', []) + this.$emit('update:modelValue', []) + } + } + }, + + parseDate(date) { + date = this.fixIosDateFormat(date) + const defVal = new Date(date) + const year = defVal.getFullYear() + const month = defVal.getMonth() + 1 + const day = defVal.getDate() + const hour = defVal.getHours() + const minute = defVal.getMinutes() + const second = defVal.getSeconds() + const defDate = year + '-' + this.lessTen(month) + '-' + this.lessTen(day) + const defTime = this.lessTen(hour) + ':' + this.lessTen(minute) + (this.hideSecond ? '' : (':' + this + .lessTen(second))) + return { + defDate, + defTime + } + }, + + lessTen(item) { + return item < 10 ? '0' + item : item + }, + + //鍏煎 iOS銆乻afari 鏃ユ湡鏍煎紡 + fixIosDateFormat(value) { + if (typeof value === 'string') { + value = value.replace(/-/g, '/') + } + return value + }, + + leftMonthSwitch(e) { + // console.log('leftMonthSwitch 杩斿洖:', e) + }, + rightMonthSwitch(e) { + // console.log('rightMonthSwitch 杩斿洖:', e) + } + } + } +</script> + +<style> + .uni-date-x { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + padding: 0 10px; + border-radius: 4px; + background-color: #fff; + color: #666; + font-size: 14px; + } + + .uni-date-x--border { + box-sizing: border-box; + border-radius: 4px; + border: 1px solid #dcdfe6; + } + + .uni-date-editor--x { + position: relative; + } + + .uni-date-editor--x .uni-date__icon-clear { + position: absolute; + top: 0; + right: 0; + display: inline-block; + box-sizing: border-box; + border: 9px solid transparent; + /* #ifdef H5 */ + cursor: pointer; + /* #endif */ + } + + .uni-date__x-input { + padding: 0 8px; + height: 40px; + width: 100%; + line-height: 40px; + font-size: 14px; + } + + .t-c { + text-align: center; + } + + .uni-date__input { + height: 40px; + width: 100%; + line-height: 40px; + font-size: 14px; + } + + .uni-date-range__input { + text-align: center; + max-width: 142px; + } + + .uni-date-picker__container { + position: relative; + /* position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + box-sizing: border-box; + z-index: 996; + font-size: 14px; */ + } + + .uni-date-mask { + position: fixed; + bottom: 0px; + top: 0px; + left: 0px; + right: 0px; + background-color: rgba(0, 0, 0, 0); + transition-duration: 0.3s; + z-index: 996; + } + + .uni-date-single--x { + /* padding: 0 8px; */ + background-color: #fff; + position: absolute; + top: 0; + z-index: 999; + border: 1px solid #EBEEF5; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + border-radius: 4px; + } + + .uni-date-range--x { + /* padding: 0 8px; */ + background-color: #fff; + position: absolute; + top: 0; + z-index: 999; + border: 1px solid #EBEEF5; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + border-radius: 4px; + } + + .uni-date-editor--x__disabled { + opacity: 0.4; + cursor: default; + } + + .uni-date-editor--logo { + width: 16px; + height: 16px; + vertical-align: middle; + } + + /* 娣诲姞鏃堕棿 */ + .popup-x-header { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + /* justify-content: space-between; */ + } + + .popup-x-header--datetime { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + flex: 1; + } + + .popup-x-body { + display: flex; + } + + .popup-x-footer { + padding: 0 15px; + border-top-color: #F1F1F1; + border-top-style: solid; + border-top-width: 1px; + /* background-color: #fff; */ + line-height: 40px; + text-align: right; + color: #666; + } + + .popup-x-footer text:hover { + color: #007aff; + cursor: pointer; + opacity: 0.8; + } + + .popup-x-footer .confirm { + margin-left: 20px; + color: #007aff; + } + + .uni-date-changed { + /* background-color: #fff; */ + text-align: center; + color: #333; + border-bottom-color: #F1F1F1; + border-bottom-style: solid; + border-bottom-width: 1px; + /* padding: 0 50px; */ + } + + .uni-date-changed--time text { + /* padding: 0 20px; */ + height: 50px; + line-height: 50px; + } + + .uni-date-changed .uni-date-changed--time { + /* display: flex; */ + flex: 1; + } + + .uni-date-changed--time-date { + color: #333; + opacity: 0.6; + } + + .mr-50 { + margin-right: 50px; + } + + /* picker 寮瑰嚭灞傞�氱敤鐨勬寚绀哄皬涓夎, todo锛氭墿灞曡嚦涓婁笅宸﹀彸鏂瑰悜瀹氫綅 */ + .uni-popper__arrow, + .uni-popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 6px; + } + + .uni-popper__arrow { + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); + top: -6px; + left: 10%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: #EBEEF5; + } + + .uni-popper__arrow::after { + content: " "; + top: 1px; + margin-left: -6px; + border-top-width: 0; + border-bottom-color: #fff; + } +</style> -- Gitblit v1.9.1