AppendModal.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <script setup lang="ts">
  2. import { ref, reactive, toRaw, watch } from "vue";
  3. import type { FormInstance, FormRules } from "element-plus";
  4. import _ from "lodash";
  5. import type { TreeData } from "./Tree";
  6. const props = defineProps<{ contextData: TreeData; appendLoading: boolean }>();
  7. const show = defineModel<boolean>("show");
  8. const emit = defineEmits(["ok", "cancel"]);
  9. const form$ = ref<FormInstance>();
  10. const formData = reactive({
  11. isDir: false,
  12. filename: "",
  13. });
  14. const rules = reactive<FormRules<typeof formData>>({
  15. filename: [
  16. {
  17. validator: (rule, value, callback, source, options) => {
  18. if (
  19. _.includes(
  20. props.contextData.children?.map((c) => c.key),
  21. `${props.contextData.key ? `${props.contextData.key}/` : ""}${value}`
  22. )
  23. ) {
  24. callback("文件重名");
  25. }
  26. callback();
  27. },
  28. trigger: "change",
  29. },
  30. {
  31. pattern: /[^\\/:"*?<>|]/,
  32. message: '有非法字符: \\/:"*?<>|',
  33. trigger: "change",
  34. },
  35. ],
  36. });
  37. const onOk = async () => {
  38. try {
  39. const result = await form$.value?.validate();
  40. if (result) {
  41. emit("ok", _.cloneDeep(toRaw(formData)));
  42. }
  43. } catch (e) {
  44. console.warn(e);
  45. }
  46. };
  47. const onCancel = () => {
  48. emit("cancel");
  49. show.value = false;
  50. };
  51. watch(
  52. () => show.value,
  53. () => {
  54. if (!show.value) {
  55. form$.value?.resetFields();
  56. }
  57. }
  58. );
  59. </script>
  60. <template>
  61. <el-dialog width="400px" v-model="show">
  62. <el-form ref="form$" :model="formData" :rules="rules">
  63. <el-form-item label="是否文件夹" prop="isDir">
  64. <el-switch v-model="formData.isDir" inline-prompt></el-switch>
  65. </el-form-item>
  66. <el-form-item :label="formData.isDir ? '文件夹名' : '文件名'" prop="filename">
  67. <el-input v-model="formData.filename">
  68. <template v-if="!formData.isDir" #append>.md</template>
  69. </el-input>
  70. </el-form-item>
  71. <el-form-item>
  72. <el-button
  73. :disabled="!formData.filename"
  74. :loading="appendLoading"
  75. @click="onOk"
  76. type="primary"
  77. >ok</el-button
  78. >
  79. <el-button @click="onCancel">cancel</el-button>
  80. </el-form-item>
  81. </el-form>
  82. </el-dialog>
  83. </template>