123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- <template>
- <a-modal
- v-model:visible="visible"
- title-align="start"
- title="添加时间"
- :width="800"
- top="10vh"
- :align-center="false"
- :mask-closable="false"
- :esc-to-close="false"
- modal-class="add-times"
- @before-open="modalBeforeOpen"
- >
- <a-form ref="formRef" :model="formData" auto-label-width>
- <a-form-item label="添加方式" required>
- <a-radio-group v-model="formData.type" @change="typeChange">
- <a-radio value="simple">简单创建</a-radio>
- <a-radio value="loop">循环创建</a-radio>
- </a-radio-group>
- </a-form-item>
- <a-form-item
- v-if="IS_LOOP"
- label="日期范围"
- field="date.startTime"
- :rules="[
- {
- required: true,
- message: '请选择时间',
- },
- ]"
- >
- <select-range-datetime
- v-model:startTime="formData.date.startTime"
- v-model:endTime="formData.date.endTime"
- :show-time="false"
- popup-container=".add-times"
- >
- </select-range-datetime>
- </a-form-item>
- <a-form-item
- v-for="(time, index) in formData.times"
- :key="index"
- :field="`times[${index}].startTime`"
- :rules="[
- {
- required: true,
- message: '请选择时间',
- },
- ]"
- :label="index + 1 + ''"
- >
- <select-range-time
- v-if="IS_LOOP"
- v-model:startTime="formData.times[index].startTime"
- v-model:endTime="formData.times[index].endTime"
- disable-confirm
- :style="{ width: '256px' }"
- popup-container=".add-times"
- >
- </select-range-time>
- <select-range-datetime
- v-else
- v-model:startTime="formData.times[index].startTime"
- v-model:endTime="formData.times[index].endTime"
- popup-container=".add-times"
- >
- </select-range-datetime>
- <a-button class="ml-10" @click="toAdd(index)">
- <template #icon>
- <icon-plus />
- </template>
- </a-button>
- <a-button
- status="danger"
- :disabled="formData.times.length === 1"
- @click="toDelete(index)"
- >
- <template #icon>
- <svg-icon name="icon-delete"></svg-icon>
- </template>
- </a-button>
- </a-form-item>
- </a-form>
- <template #footer>
- <a-button @click="close">取消</a-button>
- <a-button type="primary" @click="confirm">确认</a-button>
- </template>
- </a-modal>
- </template>
- <script setup lang="ts">
- import { computed, nextTick, reactive, ref } from 'vue';
- import type { FormInstance } from '@arco-design/web-vue/es/form';
- import useModal from '@/hooks/modal';
- import { formatDate, objModifyAssign } from '@/utils/utils';
- import { Message } from '@arco-design/web-vue';
- import { TaskItemDetail } from '@/api/types/order';
- defineOptions({
- name: 'AddTimes',
- });
- /* modal */
- const { visible, open, close } = useModal();
- defineExpose({ open, close });
- const emit = defineEmits(['confirm']);
- function getItemItem() {
- return {
- id: null,
- startTime: undefined,
- endTime: undefined,
- };
- }
- function getDefaultFormData() {
- return {
- type: 'simple',
- date: {
- startTime: undefined,
- endTime: undefined,
- },
- times: [getItemItem()],
- };
- }
- const formRef = ref<FormInstance>();
- const formData = reactive<{
- type: string;
- date: {
- startTime: number | undefined;
- endTime: number | undefined;
- };
- times: TaskItemDetail['timeList'];
- }>(getDefaultFormData());
- const IS_LOOP = computed(() => {
- return formData.type === 'loop';
- });
- function typeChange() {
- formData.times = [getItemItem()];
- }
- function toAdd(index: number) {
- formData.times.splice(index + 1, 0, getItemItem());
- }
- function toDelete(index: number) {
- if (formData.times.length <= 1) {
- Message.error('不可再删除!');
- return;
- }
- formData.times.splice(index, 1);
- }
- /* confirm */
- async function confirm() {
- const err = await formRef.value?.validate();
- if (err) return;
- if (!IS_LOOP.value) {
- emit('confirm', formData.times);
- close();
- return;
- }
- const times = [] as TaskItemDetail['timeList'];
- const oneDay = 24 * 60 * 60 * 1000;
- for (
- let i = formData.date.startTime as number;
- i <= (formData.date.endTime as number);
- i += oneDay
- ) {
- const curDate = formatDate('YYYY/MM/DD', new Date(i as number));
- formData.times.forEach((item) => {
- times.push({
- id: null,
- startTime: new Date(`${curDate} ${item.startTime}`).getTime(),
- endTime: new Date(`${curDate} ${item.endTime}`).getTime(),
- });
- });
- }
- emit('confirm', times);
- close();
- }
- /* init modal */
- function modalBeforeOpen() {
- objModifyAssign(formData, getDefaultFormData());
- nextTick(() => {
- formRef.value?.clearValidate();
- });
- }
- </script>
|