pet/uni_modules/uview-next/components/u-calendar/u-calendar.vue

212 lines
8.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<uView
v-if="insert"
ref="calendarView"
:title="title"
:showTitle="showTitle"
:showSubtitle="showSubtitle"
:mode="mode"
:startText="startText"
:endText="endText"
:customList="customList"
:color="color"
:minDate="minDate"
:maxDate="maxDate"
:defaultDate="defaultDate"
:maxCount="maxCount"
:rowHeight="rowHeight"
:formatter="formatter"
:showLunar="showLunar"
:showMark="showMark"
:readonly="readonly"
:maxRange="maxRange"
:rangePrompt="rangePrompt"
:showRangePrompt="showRangePrompt"
:allowSameDay="allowSameDay"
:monthNum="monthNum"
:shape="shape"
:disabledDate="disabledDate"
:disabledFun="disabledFun"
:weekdays="weekdays"
@monthSelected="monthSelected"
/>
<u-popup
v-else
:show="show"
mode="bottom"
closeable
@close="close"
@open="open"
:round="round"
:closeOnClickOverlay="closeOnClickOverlay"
>
<uView
ref="calendarView"
:title="title"
:showTitle="showTitle"
:showSubtitle="showSubtitle"
:mode="mode"
:startText="startText"
:endText="endText"
:customList="customList"
:color="color"
:minDate="minDate"
:maxDate="maxDate"
:defaultDate="defaultDate"
:maxCount="maxCount"
:rowHeight="rowHeight"
:formatter="formatter"
:showLunar="showLunar"
:showMark="showMark"
:readonly="readonly"
:maxRange="maxRange"
:rangePrompt="rangePrompt"
:showRangePrompt="showRangePrompt"
:allowSameDay="allowSameDay"
:monthNum="monthNum"
:shape="shape"
:disabledDate="disabledDate"
:disabledFun="disabledFun"
:weekdays="weekdays"
@monthSelected="monthSelected"
/>
<slot name="footer" v-if="showConfirm">
<view class="u-calendar__confirm">
<u-button
shape="circle"
:text="buttonDisabled ? confirmDisabledText : confirmText"
:color="color"
@click="confirm"
:disabled="buttonDisabled"
></u-button>
</view>
</slot>
</u-popup>
</template>
<script>
import props from './props.js';
import mixin from '../../libs/mixin/mixin';
import mpMixin from '../../libs/mixin/mpMixin';
import uView from './view.vue';
/**
* Calendar 日历
* @description 此组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中.
* @tutorial https://uview.d3u.cn/components/calendar.html
*
* @property {String} title 标题内容 (默认 日期选择 )
* @property {Boolean} showTitle 是否显示标题 (默认 true )
* @property {String} shape 选中的日期的形状circle圆形square带圆角 (默认 'square'
* @property {Boolean} showSubtitle 是否显示副标题 (默认 true )
* @property {String} mode 日期类型选择 single-选择单个日期multiple-可以选择多个日期range-选择日期范围 默认 'single' )
* @property {String} startText mode=range时第一个日期底部的提示文字 (默认 '开始' )
* @property {String} endText mode=range时最后一个日期底部的提示文字 (默认 '结束' )
* @property {Array} customList 自定义列表
* @property {String} color 主题色,对底部按钮和选中日期有效 (默认 #3c9cff' )
* @property {String | Number} minDate 最小的可选日期 (默认 0 )
* @property {String | Number} maxDate 最大可选日期 (默认 0 )
* @property {Array | String| Date} defaultDate 默认选中的日期mode为multiple或range是必须为数组格式
* @property {String | Number} maxCount mode=multiple时最多可选多少个日期 (默认 Number.MAX_SAFE_INTEGER )
* @property {String | Number} rowHeight 日期行高 (默认 56 )
* @property {Function} formatter 日期格式化函数
* @property {Boolean} showLunar 是否显示农历 (默认 false )
* @property {Boolean} showMark 是否显示月份背景色 (默认 true )
* @property {String} confirmText 确定按钮的文字 (默认 '确定' )
* @property {String} confirmDisabledText 确认按钮处于禁用状态时的文字 (默认 '确定' )
* @property {Boolean} show 是否显示日历弹窗 (默认 false )
* @property {Boolean} closeOnClickOverlay 是否允许点击遮罩关闭日历 (默认 false )
* @property {Boolean} readonly 是否为只读状态,只读状态下禁止选择日期 (默认 false )
* @property {String | Number} maxRange 日期区间最多可选天数默认无限制mode = range时有效
* @property {String} rangePrompt 范围选择超过最多可选天数时的提示文案mode = range时有效
* @property {Boolean} showRangePrompt 范围选择超过最多可选天数时是否展示提示文案mode = range时有效 (默认 true )
* @property {Boolean} allowSameDay 是否允许日期范围的起止时间为同一天mode = range时有效 (默认 false )
* @property {Number|String} round 圆角值,默认无圆角 (默认 0 )
* @property {Number|String} monthNum 最多展示的月份数量 (默认 3 )
* @property {Boolean} insert 是否插入模式 (默认 false )
* @property {Array | String| Date} disabledDate 禁止选择的日期
* @property {Function} disabledFun 禁止选择的日期函数
*
* @event {Function()} confirm 点击确定按钮时触发 选择日期相关的返回参数
* @event {Function()} close 日历关闭时触发 可定义页面关闭时的回调事件
* @event {Function()} change 插入模式下,选择日期时触发
* @example <u-calendar :defaultDate="defaultDateMultiple" :show="show" mode="multiple" @confirm="confirm">
</u-calendar>
* */
export default {
name: 'u-calendar',
mixins: [mpMixin, mixin, props],
components: {
uView,
},
data() {
return {
// month组件中选择的日期数组
selected: [],
};
},
computed: {
buttonDisabled() {
// 如果为range类型且选择的日期个数不足1个时让底部的按钮出于disabled状态
if (this.mode === 'range') {
if (this.selected.length <= 1) {
return true;
} else {
return false;
}
} else {
return false;
}
},
},
// #ifdef VUE3
emits: ['confirm', 'close', 'change'],
// #endif
methods: {
close() {
this.$emit('close');
},
open(){
this.$nextTick(() => {
this.$refs.calendarView.setMonth();
});
},
// 点击确定按钮
confirm() {
if (!this.buttonDisabled) {
this.$emit('confirm', this.selected);
}
},
// month组件内部选择日期后通过事件通知给父组件
monthSelected(e) {
this.selected = e;
if (this.insert) {
this.$emit('change', e);
} else {
if (!this.showConfirm) {
// 在不需要确认按钮的情况下如果为单选或者范围多选且已选长度大于2则直接进行返还
if (
this.mode === 'multiple' ||
this.mode === 'single' ||
(this.mode === 'range' && this.selected.length >= 2)
) {
this.$emit('confirm', this.selected);
}
}
}
},
},
};
</script>
<style lang="scss" scoped>
@import '../../libs/css/components.scss';
.u-calendar {
&__confirm {
padding: 7px 18px;
}
}
</style>