modifySet.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <template>
  2. <a-modal
  3. v-model:visible="visible"
  4. :width="560"
  5. title-align="start"
  6. top="10vh"
  7. :align-center="false"
  8. :mask-closable="false"
  9. :esc-to-close="false"
  10. @before-open="modalBeforeOpen"
  11. >
  12. <template #title> 下载设置 </template>
  13. <a-form ref="formRef" :model="formData" :rules="rules" auto-label-width>
  14. <a-form-item field="pictureType" label="下载文件">
  15. <a-checkbox-group v-model="formData.pictureType" direction="vertical">
  16. <a-checkbox
  17. v-for="(option, index) in pictureOptions"
  18. :key="index"
  19. :value="option.value"
  20. >
  21. {{ option.label }}
  22. <span class="tips-info"
  23. >({{ pictureDesc[option.value as PictureTypeEnum] }})</span
  24. >
  25. </a-checkbox>
  26. </a-checkbox-group>
  27. </a-form-item>
  28. <a-form-item field="outputDir" label="保存目录" :content-flex="false">
  29. <a-input-search
  30. v-model.trim="formData.outputDir"
  31. :style="{ width: '420px' }"
  32. readonly
  33. search-button
  34. button-text="浏览"
  35. @search="toSelectDir"
  36. >
  37. </a-input-search>
  38. <a-checkbox v-model="formData.outputDirIsDefault"
  39. >设为默认下载路径</a-checkbox
  40. >
  41. </a-form-item>
  42. </a-form>
  43. <template #footer>
  44. <a-button @click="close">取消</a-button>
  45. <a-button type="primary" :disabled="loading" @click="confirm"
  46. >确认</a-button
  47. >
  48. </template>
  49. </a-modal>
  50. </template>
  51. <script setup lang="ts">
  52. import { nextTick, reactive, ref } from 'vue';
  53. import { Message } from '@arco-design/web-vue';
  54. import type { FormInstance } from '@arco-design/web-vue/es/form';
  55. import useLoading from '@/hooks/loading';
  56. import useModal from '@/hooks/modal';
  57. import { objAssign, objModifyAssign } from '@/utils/utils';
  58. import { FormRules } from '@/types/global';
  59. import useDictOption from '@/hooks/dict-option';
  60. import { useAppStore } from '@/store';
  61. import { TrackConfigType } from '@/store/modules/app/types';
  62. import { PictureTypeEnum } from '@/constants/enumerate';
  63. defineOptions({
  64. name: 'ModifySet',
  65. });
  66. /* modal */
  67. const { visible, open, close } = useModal();
  68. defineExpose({ open, close });
  69. const appStore = useAppStore();
  70. const { optionList: pictureOptions } = useDictOption('PICTURE_TYPE');
  71. const pictureDesc: Record<PictureTypeEnum, string> = {
  72. track: '批阅后图片',
  73. origin: '学生作答原图',
  74. pdf: '将学生批阅后的图片合并成一个PDF,一个学生一个PDF',
  75. };
  76. const defaultFormData = {
  77. pictureType: ['track'] as PictureTypeEnum[],
  78. outputDir: '',
  79. curOutputDir: '',
  80. outputDirIsDefault: true,
  81. };
  82. const emit = defineEmits(['modified']);
  83. const formRef = ref<FormInstance>();
  84. const formData = reactive<TrackConfigType>({ ...defaultFormData });
  85. const rules: FormRules<keyof TrackConfigType> = {
  86. pictureType: [
  87. {
  88. required: true,
  89. message: '请选择图片类型',
  90. },
  91. ],
  92. outputDir: [
  93. {
  94. required: true,
  95. message: '请选择保存目录',
  96. },
  97. ],
  98. };
  99. async function toSelectDir() {
  100. const result = await window.electron.dialogSelectFile({
  101. title: '选择保存目录',
  102. properties: ['openDirectory'],
  103. });
  104. if (result.canceled) return;
  105. formData.outputDir = result.filePaths[0];
  106. }
  107. /* confirm */
  108. const { loading, setLoading } = useLoading();
  109. async function confirm() {
  110. const err = await formRef.value?.validate();
  111. if (err) return;
  112. setLoading(true);
  113. const datas = objAssign(formData, {});
  114. if (datas.outputDirIsDefault) datas.curOutputDir = datas.outputDir;
  115. let res = true;
  116. await window.db
  117. .updateDict({ key: 'trackConfig', val: JSON.stringify(datas) })
  118. .catch(() => {
  119. res = false;
  120. });
  121. setLoading(false);
  122. if (!res) return;
  123. appStore.setInfo({ trackConfig: datas });
  124. Message.success('修改成功!');
  125. emit('modified', datas);
  126. close();
  127. }
  128. /* init modal */
  129. async function modalBeforeOpen() {
  130. const res = await window.db.getDict('trackConfig');
  131. if (res) {
  132. const config = JSON.parse(res);
  133. objModifyAssign(formData, config);
  134. } else {
  135. objModifyAssign(formData, defaultFormData);
  136. }
  137. nextTick(() => {
  138. formRef.value?.clearValidate();
  139. });
  140. }
  141. </script>