UNPKG

shiyzhangcron

Version:

> 一个基于vue3+Ant-Design-vue的cron表达式组件

206 lines (194 loc) 5.75 kB
/*********************************************** * @Author: shiyzhang zsyou0911@126.com * @Date: 2024-03-01 14:40 * @Description: useTabMixin.ts * ***********************************************/ // 主要用于日和星期的互斥使用 import { computed, inject, reactive, ref, unref, watch } from 'vue'; import { propTypes } from '../../_utils/propTypes'; export enum TypeEnum { unset = 'UNSET', every = 'EVERY', range = 'RANGE', loop = 'LOOP', work = 'WORK', last = 'LAST', specify = 'SPECIFY', } // use 公共 props export function useTabProps(options) { const defaultValue = options?.defaultValue ?? '?'; return { value: propTypes.string.def(defaultValue), disabled: propTypes.bool.def(false), ...options?.props, }; } // use 公共 emits export function useTabEmits() { return ['change', 'update:value']; } // use 公共 setup export function useTabSetup(props, context, options) { const { emit } = context; const prefixCls = inject('prefixCls'); const defaultValue = ref(options?.defaultValue ?? '?'); // 类型 const type = ref(options.defaultType ?? TypeEnum.every); const valueList = ref<any[]>([]); // 对于不同的类型,所定义的值也有所不同 const valueRange = reactive(options.valueRange); const valueLoop = reactive(options.valueLoop); const valueWeek = reactive(options.valueWeek); const valueWork = ref(options.valueWork); const maxValue = ref(options.maxValue); const minValue = ref(options.minValue); // 根据不同的类型计算出的value const computeValue = computed(() => { const valueArray: any[] = []; switch (type.value) { case TypeEnum.unset: valueArray.push('?'); break; case TypeEnum.every: valueArray.push('*'); break; case TypeEnum.range: valueArray.push(`${valueRange.start}-${valueRange.end}`); break; case TypeEnum.loop: valueArray.push(`${valueLoop.start}/${valueLoop.interval}`); break; case TypeEnum.work: valueArray.push(`${valueWork.value}W`); break; case TypeEnum.last: valueArray.push('L'); break; case TypeEnum.specify: if (valueList.value.length === 0) { valueList.value.push(minValue.value); } valueArray.push(valueList.value.join(',')); break; default: valueArray.push(defaultValue.value); break; } return valueArray.length > 0 ? valueArray.join('') : defaultValue.value; }); // 指定值范围区间,介于最小值和最大值之间 const specifyRange = computed(() => { const range: number[] = []; if (maxValue.value != null) { for (let i = minValue.value; i <= maxValue.value; i++) { range.push(i); } } return range; }); watch( () => props.value, (val) => { if (val !== computeValue.value) { parseValue(val); } }, { immediate: true }, ); watch(computeValue, (v) => updateValue(v)); function updateValue(value) { emit('change', value); emit('update:value', value); } /** * parseValue * @param value */ function parseValue(value) { if (value === computeValue.value) { return; } try { if (!value || value === defaultValue.value) { type.value = TypeEnum.every; } else if (value.indexOf('?') >= 0) { type.value = TypeEnum.unset; } else if (value.indexOf('-') >= 0) { type.value = TypeEnum.range; const values = value.split('-'); if (values.length >= 2) { valueRange.start = parseInt(values[0]); valueRange.end = parseInt(values[1]); } } else if (value.indexOf('/') >= 0) { type.value = TypeEnum.loop; const values = value.split('/'); if (values.length >= 2) { valueLoop.start = value[0] === '*' ? 0 : parseInt(values[0]); valueLoop.interval = parseInt(values[1]); } } else if (value.indexOf('W') >= 0) { type.value = TypeEnum.work; const values = value.split('W'); if (!values[0] && !isNaN(values[0])) { valueWork.value = parseInt(values[0]); } } else if (value.indexOf('L') >= 0) { type.value = TypeEnum.last; } else if (value.indexOf(',') >= 0 || !isNaN(value)) { type.value = TypeEnum.specify; valueList.value = value.split(',').map((item) => parseInt(item)); } else { type.value = TypeEnum.every; } } catch (e) { type.value = TypeEnum.every; } } const beforeRadioAttrs = computed(() => ({ class: ['choice'], disabled: props.disabled || unref(options.disabled), })); const inputNumberAttrs = computed(() => ({ class: ['w60'], max: maxValue.value, min: minValue.value, precision: 0, })); const typeRangeAttrs = computed(() => ({ disabled: type.value !== TypeEnum.range || props.disabled || unref(options.disabled), ...inputNumberAttrs.value, })); const typeLoopAttrs = computed(() => ({ disabled: type.value !== TypeEnum.loop || props.disabled || unref(options.disabled), ...inputNumberAttrs.value, })); const typeSpecifyAttrs = computed(() => ({ disabled: type.value !== TypeEnum.specify || props.disabled || unref(options.disabled), class: ['list-check-item'], })); return { type, TypeEnum, prefixCls, defaultValue, valueRange, valueLoop, valueWeek, valueList, valueWork, maxValue, minValue, computeValue, specifyRange, updateValue, parseValue, beforeRadioAttrs, inputNumberAttrs, typeRangeAttrs, typeLoopAttrs, typeSpecifyAttrs, }; }