dolphinscheduler-ui/src/components/crontab/modules/day.tsx (533 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { defineComponent, onMounted, PropType, ref, watch } from 'vue' import { NInputNumber, NRadio, NRadioGroup, NSelect } from 'naive-ui' import { useI18n } from 'vue-i18n' import { isStr, isWeek, week, specificWeek, lastWeeks, specificList } from '../common' import styles from '../index.module.scss' const props = { dayValue: { type: String as PropType<string>, default: '*' }, weekValue: { type: String as PropType<string>, default: '?' } } export default defineComponent({ name: 'CrontabDay', props, emits: ['update:dayValue', 'update:weekValue'], setup(props, ctx) { const { t } = useI18n() const weekOptions = week.map((v) => ({ label: t(v.label), value: v.value })) const lastWeekOptions = lastWeeks.map((v) => ({ label: t(v.label), value: v.value })) const radioRef = ref() const dayRef = ref() const weekRef = ref() const WkintervalWeekStartRef = ref(2) const WkintervalWeekPerformRef = ref(2) const intervalDayStartRef = ref(1) const intervalDayPerformRef = ref(1) const WkspecificDayRef = ref<Array<number>>([]) const WkspecificWeekRef = ref<Array<string>>([]) const monthLastDaysRef = ref('L') const monthLastWorkingDaysRef = ref('LW') const monthLastWeeksRef = ref('?') const monthTailBeforeRef = ref(1) const recentlyWorkingDaysMonthRef = ref(1) const WkmonthNumWeeksDayRef = ref(1) const WkmonthNumWeeksWeekRef = ref(1) /** * Parse parameter value */ const analyticalValue = () => { const $dayVal = props.dayValue const $weekVal = props.weekValue const isWeek1 = $weekVal.indexOf('/') !== -1 const isWeek2 = $weekVal.indexOf('#') !== -1 // Initialization if ($dayVal === '*' && $weekVal === '?') { radioRef.value = 'everyDay' return } // week if (isWeek1 || isWeek2 || isWeek($weekVal)) { dayRef.value = '?' /** * Processing by sequence number (excluding days) * @param [ * WkintervalWeek=>(/), * WkspecificWeek=>(TUE,WED), * WkmonthNumWeeks=>(#) * ] */ const hanleWeekOne = () => { const a = isStr($weekVal, '/') as string[] WkintervalWeekStartRef.value = parseInt(a[0]) WkintervalWeekPerformRef.value = parseInt(a[1]) dayRef.value = '?' weekRef.value = `${WkintervalWeekPerformRef.value}/${WkintervalWeekStartRef.value}` radioRef.value = 'WkintervalWeek' } const hanleWeekTwo = () => { WkspecificWeekRef.value = $weekVal.split(',') radioRef.value = 'WkspecificWeek' } const hanleWeekThree = () => { const a = isStr($weekVal, '#') as string[] WkmonthNumWeeksDayRef.value = parseInt(a[0]) WkmonthNumWeeksDayRef.value = parseInt(a[1]) radioRef.value = 'WkmonthNumWeeks' } // Processing week if (isStr($weekVal, '/')) { hanleWeekOne() } else if (isStr($weekVal, '#')) { hanleWeekThree() } else if (isWeek($weekVal)) { hanleWeekTwo() } } else { weekRef.value = '?' /** * Processing by sequence number (excluding week) * @param [ * everyDay=>(*), * intervalDay=>(1/1), * specificDay=>(1,2,5,3,4), * monthLastDays=>(L), * monthLastWorkingDays=>(LW), * monthLastWeeks=>(3L), * monthTailBefore=>(L-4), * recentlyWorkingDaysMonth=>(6W) * ] */ const hanleDayOne = () => { radioRef.value = 'everyDay' } const hanleDayTwo = () => { const a = isStr($dayVal, '/') as string[] intervalDayStartRef.value = parseInt(a[0]) intervalDayPerformRef.value = parseInt(a[1]) radioRef.value = 'intervalDay' } const hanleDayThree = () => { WkspecificDayRef.value = $dayVal .split(',') .map((item) => parseInt(item)) radioRef.value = 'specificDay' } const hanleDayFour = () => { radioRef.value = 'monthLastDays' } const hanleDayFive = () => { radioRef.value = 'monthLastWorkingDays' } const hanleDaySix = () => { monthLastWeeksRef.value = $dayVal radioRef.value = 'monthLastWeeks' } const hanleDaySeven = () => { const a = isStr($dayVal, '-') as string[] monthTailBeforeRef.value = parseInt(a[1]) radioRef.value = 'monthTailBefore' } const hanleDayEight = () => { recentlyWorkingDaysMonthRef.value = parseInt( $dayVal.slice(0, $dayVal.length - 1) ) radioRef.value = 'recentlyWorkingDaysMonth' } if ($dayVal === '*') { hanleDayOne() } else if (isStr($dayVal, '/')) { hanleDayTwo() } else if ($dayVal === 'L') { hanleDayFour() } else if ($dayVal === 'LW') { hanleDayFive() } else if ($dayVal.charAt($dayVal.length - 1) === 'L') { hanleDaySix() } else if (isStr($dayVal, '-')) { hanleDaySeven() } else if ($dayVal.charAt($dayVal.length - 1) === 'W') { hanleDayEight() } else { hanleDayThree() } } } // Every few weeks const onWkintervalWeekPerform = (value: number | null) => { WkintervalWeekPerformRef.value = value || 0 if (radioRef.value === 'WkintervalWeek') { dayRef.value = '?' weekRef.value = `${WkintervalWeekStartRef.value}/${WkintervalWeekPerformRef.value}` } } // Every few weeks const onWkintervalWeekStart = (value: number | null) => { WkintervalWeekStartRef.value = value || 0 if (radioRef.value === 'WkintervalWeek') { dayRef.value = '?' weekRef.value = `${WkintervalWeekStartRef.value}/${WkintervalWeekPerformRef.value}` } } // Interval start time(1) const onIntervalDayStart = (value: number | null) => { intervalDayStartRef.value = value || 0 if (radioRef.value === 'intervalDay') { intervalDaySet() } } // Interval execution time(2) const onIntervalDayPerform = (value: number | null) => { intervalDayPerformRef.value = value || 0 if (radioRef.value === 'intervalDay') { intervalDaySet() } } // Specific day of the week (multiple choice) const onWkspecificWeek = (arr: Array<string>) => { WkspecificWeekRef.value = arr if (radioRef.value === 'WkspecificWeek') { dayRef.value = '?' weekRef.value = arr.join(',') } } // Specific days (multiple choices) const onWkspecificDay = (arr: Array<number>) => { WkspecificDayRef.value = arr if (radioRef.value === 'specificDay') { weekRef.value = '?' dayRef.value = arr.join(',') } } const onMonthLastWeeks = (value: string | null) => { monthLastWeeksRef.value = value || '?' if (radioRef.value === 'monthLastWeeks') { weekRef.value = value dayRef.value = '?' } } // Specific days const onSpecificDays = (arr: Array<number>) => { WkspecificDayRef.value = arr if (radioRef.value === 'specificDay') { specificSet() } } // By the end of this month const onMonthTailBefore = (value: number | null) => { monthTailBeforeRef.value = value || 0 if (radioRef.value === 'monthTailBefore') { dayRef.value = `L-${monthTailBeforeRef.value}` } } // Last working day const onRecentlyWorkingDaysMonth = (value: number | null) => { recentlyWorkingDaysMonthRef.value = value || 0 if (radioRef.value === 'recentlyWorkingDaysMonth') { dayRef.value = `${recentlyWorkingDaysMonthRef.value}W` } } // On the day of this month const onWkmonthNumWeeksDay = (value: number | null) => { WkmonthNumWeeksDayRef.value = value || 0 if (radioRef.value === 'WkmonthNumWeeks') { weekRef.value = `${WkmonthNumWeeksWeekRef.value}#${WkmonthNumWeeksDayRef.value}` } } // On the week of this month const onWkmonthNumWeeksWeek = (value: number | null) => { if (radioRef.value === 'WkmonthNumWeeks') { dayRef.value = '?' weekRef.value = `${value}#${WkmonthNumWeeksDayRef.value}` } } // Reset every day const everyDaySet = () => { dayRef.value = '*' } // Reset interval week starts from * const WkintervalWeekReset = () => { weekRef.value = `${WkintervalWeekStartRef.value}/${WkintervalWeekPerformRef.value}` } // Reset interval days const intervalDaySet = () => { dayRef.value = `${intervalDayStartRef.value}/${intervalDayPerformRef.value}` } // Specific week (multiple choices) const WkspecificWeekReset = () => { weekRef.value = WkspecificWeekRef.value.length ? WkspecificWeekRef.value.join(',') : '*' } // Reset specific days const specificSet = () => { if (WkspecificDayRef.value.length) { dayRef.value = WkspecificDayRef.value.join(',') } else { dayRef.value = '*' } } // On the last day of the month const monthLastDaysReset = () => { dayRef.value = monthLastDaysRef.value } // On the last working day of the month const monthLastWorkingDaysReset = () => { dayRef.value = monthLastWorkingDaysRef.value } // At the end of the month* const monthLastWeeksReset = () => { dayRef.value = monthLastWeeksRef.value } // By the end of this month const monthTailBeforeReset = () => { dayRef.value = `L-${monthTailBeforeRef.value}` } // Last working day (Monday to Friday) to this month const recentlyWorkingDaysMonthReset = () => { dayRef.value = `${recentlyWorkingDaysMonthRef.value}W` } // On the day of this month const WkmonthNumReset = () => { weekRef.value = `${WkmonthNumWeeksWeekRef.value}#${WkmonthNumWeeksDayRef.value}` } const updateRadioDay = (value: string) => { switch (value) { case 'everyDay': weekRef.value = '?' everyDaySet() break case 'WkintervalWeek': dayRef.value = '?' WkintervalWeekReset() break case 'intervalDay': weekRef.value = '?' intervalDaySet() break case 'WkspecificWeek': dayRef.value = '?' WkspecificWeekReset() break case 'specificDay': weekRef.value = '?' specificSet() break case 'monthLastDays': weekRef.value = '?' monthLastDaysReset() break case 'monthLastWorkingDays': weekRef.value = '?' monthLastWorkingDaysReset() break case 'monthLastWeeks': weekRef.value = '1L' monthLastWeeksReset() break case 'monthTailBefore': weekRef.value = '?' monthTailBeforeReset() break case 'recentlyWorkingDaysMonth': weekRef.value = '?' recentlyWorkingDaysMonthReset() break case 'WkmonthNumWeeks': dayRef.value = '?' WkmonthNumReset() break } } watch( () => dayRef.value, () => ctx.emit('update:dayValue', dayRef.value.toString()) ) watch( () => weekRef.value, () => ctx.emit('update:weekValue', weekRef.value.toString()) ) onMounted(() => analyticalValue()) return { weekOptions, lastWeekOptions, radioRef, WkintervalWeekStartRef, WkintervalWeekPerformRef, intervalDayStartRef, intervalDayPerformRef, WkspecificWeekRef, WkspecificDayRef, monthLastWeeksRef, monthTailBeforeRef, recentlyWorkingDaysMonthRef, WkmonthNumWeeksDayRef, WkmonthNumWeeksWeekRef, updateRadioDay, onWkintervalWeekStart, onWkintervalWeekPerform, onIntervalDayStart, onIntervalDayPerform, onSpecificDays, onWkspecificWeek, onWkspecificDay, onMonthLastWeeks, onMonthTailBefore, onRecentlyWorkingDaysMonth, onWkmonthNumWeeksDay, onWkmonthNumWeeksWeek } }, render() { const { t } = useI18n() return ( <NRadioGroup v-model:value={this.radioRef} onUpdateValue={this.updateRadioDay} > <div class={styles['crontab-list']}> <NRadio value={'everyDay'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.every_day')}</div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'WkintervalWeek'} /> <div class={styles['crontab-list-item']}> <div class={styles['item-text']}>{t('crontab.every')}</div> <div class={styles['number-input']}> <NInputNumber defaultValue={0} min={0} max={7} v-model:value={this.WkintervalWeekPerformRef} onUpdateValue={this.onWkintervalWeekPerform} /> </div> <div class={styles['item-text']}> {t('crontab.day_carried_out')} </div> <div> <NSelect options={this.weekOptions} defaultValue={this.WkintervalWeekStartRef} v-model:value={this.WkintervalWeekStartRef} onUpdateValue={this.onWkintervalWeekStart} /> </div> <div>{t('crontab.start')}</div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'intervalDay'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.every')}</div> <div class={styles['number-input']}> <NInputNumber defaultValue={0} min={0} max={31} v-model:value={this.intervalDayPerformRef} onUpdateValue={this.onIntervalDayPerform} /> </div> <div>{t('crontab.day_carried_out')}</div> <div class={styles['number-input']}> <NInputNumber defaultValue={0} min={1} max={31} v-model:value={this.intervalDayStartRef} onUpdateValue={this.onIntervalDayStart} /> </div> <div>{t('crontab.day_start')}</div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'WkspecificWeek'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.specific_week')}</div> <div> <NSelect style={{ width: '300px' }} multiple options={specificWeek} placeholder={t('crontab.specific_week_tip')} v-model:value={this.WkspecificWeekRef} onUpdateValue={this.onWkspecificWeek} /> </div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'specificDay'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.specific_day')}</div> <div> <NSelect style={{ width: '300px' }} multiple options={specificList.day} placeholder={t('crontab.specific_day_tip')} v-model:value={this.WkspecificDayRef} onUpdateValue={this.onWkspecificDay} /> </div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'monthLastDays'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.last_day_of_month')}</div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'monthLastWorkingDays'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.last_work_day_of_month')}</div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'monthLastWeeks'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.last_of_month')}</div> <div> <NSelect style={{ width: '150px' }} options={this.lastWeekOptions} defaultValue={this.monthLastWeeksRef} v-model:value={this.monthLastWeeksRef} onUpdateValue={this.onMonthLastWeeks} /> </div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'monthTailBefore'} /> <div class={styles['crontab-list-item']}> <div class={styles['number-input']}> <NInputNumber defaultValue={0} min={0} max={31} v-model:value={this.monthTailBeforeRef} onUpdateValue={this.onMonthTailBefore} /> </div> <div>{t('crontab.before_end_of_month')}</div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'recentlyWorkingDaysMonth'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.recent_business_day_to_month')}</div> <div class={styles['number-input']}> <NInputNumber style={{ width: '100px' }} defaultValue={0} min={0} max={31} v-model:value={this.recentlyWorkingDaysMonthRef} onUpdateValue={this.onRecentlyWorkingDaysMonth} /> </div> <div style={{ width: '50px' }}>{t('crontab.one_day')}</div> </div> </div> <div class={styles['crontab-list']}> <NRadio value={'WkmonthNumWeeks'} /> <div class={styles['crontab-list-item']}> <div>{t('crontab.in_this_months')}</div> <div class={styles['number-input']}> <NInputNumber defaultValue={0} min={0} max={31} v-model:value={this.WkmonthNumWeeksDayRef} onUpdateValue={this.onWkmonthNumWeeksDay} /> </div> <div> <NSelect style={{ width: '150px' }} options={this.weekOptions} defaultValue={this.WkmonthNumWeeksWeekRef} v-model:value={this.WkmonthNumWeeksWeekRef} onUpdateValue={this.onWkmonthNumWeeksWeek} /> </div> </div> </div> </NRadioGroup> ) } })