AppendModal.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. { required: true, trigger: "change" },
  17. {
  18. validator: (rule, value, callback, source, options) => {
  19. if (
  20. _.includes(
  21. props.contextData.children?.map((c) => c.key),
  22. `${props.contextData.key ? `${props.contextData.key}/` : ""}${value}`
  23. )
  24. ) {
  25. callback("文件重名");
  26. }
  27. callback();
  28. },
  29. trigger: "change",
  30. },
  31. ],
  32. });
  33. const onOk = async () => {
  34. try {
  35. const result = await form$.value?.validate();
  36. if (result) {
  37. emit("ok", _.cloneDeep(toRaw(formData)));
  38. }
  39. } catch (e) {
  40. console.warn(e);
  41. }
  42. };
  43. const onCancel = () => {
  44. emit("cancel");
  45. show.value = false;
  46. };
  47. watch(
  48. () => show.value,
  49. () => {
  50. if (!show.value) {
  51. form$.value?.resetFields();
  52. }
  53. }
  54. );
  55. </script>
  56. <template>
  57. <el-dialog v-model="show">
  58. <el-form ref="form$" :model="formData" :rules="rules">
  59. <el-form-item label="是否文件夹" prop="isDir">
  60. <el-switch v-model="formData.isDir" inline-prompt></el-switch>
  61. </el-form-item>
  62. <el-form-item :label="formData.isDir ? '文件夹名' : '文件名'" prop="filename">
  63. <el-input v-model="formData.filename"> </el-input>
  64. </el-form-item>
  65. <el-form-item>
  66. <el-button
  67. :disabled="!formData.filename"
  68. :loading="appendLoading"
  69. @click="onOk"
  70. type="primary"
  71. >ok</el-button
  72. >
  73. <el-button @click="onCancel">cancel</el-button>
  74. </el-form-item>
  75. </el-form>
  76. </el-dialog>
  77. </template>