ModalData.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <div class="p-2">
  3. <NForm :model="form" :rules="rules" label-placement="left" style="width: 100%" ref="formRef" label-width="88px"
  4. size="small">
  5. <NFormItem label="SN" path="sn">
  6. <NInput v-model:value="form.sn" :allow-input="handleAllowInput" />
  7. </NFormItem>
  8. <NFormItem label="描述" path="description">
  9. <NInput type="textarea" v-model:value="form.description" />
  10. </NFormItem>
  11. <NFormItem label="时间" path="timePeriod">
  12. <NDatePicker v-model:formatted-value="form.timePeriod" value-format="yyyy-MM-dd" type="daterange" clearable />
  13. </NFormItem>
  14. <NCollapse :trigger-areas="['arrow']" class="p-4">
  15. <NCollapseItem :disable="!form.options.enableTimeline" title="时间线数据">
  16. <template #header-extra>
  17. <NSwitch v-model:value="form.options.enableTimeline" size="small" />
  18. </template>
  19. </NCollapseItem>
  20. <NCollapseItem :disable="!form.options.enableRuntime" title="运行时数据">
  21. <template #header-extra>
  22. <NSwitch v-model:value="form.options.enableRuntime" size="small" />
  23. </template>
  24. </NCollapseItem>
  25. </NCollapse>
  26. </NForm>
  27. <div class="flex justify-end gap-x-4">
  28. <NButton secondary @click="emits('cancel')">
  29. 取消
  30. </NButton>
  31. <NButton secondary type="warning" @click="reset">
  32. 重置
  33. </NButton>
  34. <NButton type="success" @click="handleSubmitClick">
  35. 确定
  36. </NButton>
  37. </div>
  38. </div>
  39. </template>
  40. <script setup lang="ts">
  41. import { onMounted, useTemplateRef } from 'vue'
  42. import { NForm, NFormItem, NInput, NButton, NCollapseItem, NSwitch, NDatePicker } from 'naive-ui'
  43. import type { FormRules } from 'naive-ui'
  44. import { useResettableReactive } from '@/composable/useResettable'
  45. import type { AnalysisConfig } from '@/service/sitesAnalysis/interface'
  46. import { getManageConfig } from '@/service/sitesAnalysis'
  47. interface AnalysisConfigForm extends AnalysisConfig { }
  48. const { id } = defineProps<{
  49. id?: string
  50. }>()
  51. const formRef = useTemplateRef<InstanceType<typeof NForm>>('formRef')
  52. const emits = defineEmits<{
  53. (e: 'submit', value: AnalysisConfig): void
  54. (e: 'cancel'): void
  55. }>()
  56. const [form, setUserForm, reset, updateInitialState] = useResettableReactive<AnalysisConfigForm>({
  57. id: '',
  58. sn: '',
  59. description: '',
  60. timePeriod: null,
  61. options: {
  62. enableTimeline: true,
  63. enableRuntime: true
  64. }
  65. })
  66. const handleAllowInput = (value: string) => {
  67. // 如果输入不匹配 URL 允许的字符,去掉不合法字符
  68. const res = /\W/.test(value)
  69. return !res
  70. };
  71. const rules: FormRules = {
  72. sn: { required: true, message: '请输入站点SN', trigger: ['input'] },
  73. timePeriod: [
  74. // { required: true, message: '请选择时间范围', trigger: ['change', 'blur'] },
  75. {
  76. validator: (rule, value: [string, string] | null) => {
  77. // ✅ 先判断是否有值
  78. if (!value || !value[0] || !value[1]) {
  79. return Promise.reject('请选择时间范围')
  80. }
  81. // ✅ 再判断时间先后
  82. const [start, end] = value
  83. if (!start || !end) return false
  84. // 将字符串转成 Date 再比较
  85. const startTime = new Date(start.replace(/\./g, '-')).getTime()
  86. const endTime = new Date(end.replace(/\./g, '-')).getTime()
  87. if (endTime < startTime) {
  88. return Promise.reject('结束时间必须晚于开始时间')
  89. }
  90. return Promise.resolve()
  91. },
  92. trigger: ['change', 'blur']
  93. }
  94. ],
  95. }
  96. const handleSubmitClick = () => {
  97. formRef.value?.validate().then((valid) => {
  98. if (valid) {
  99. emits('submit', form)
  100. }
  101. })
  102. }
  103. onMounted(async () => {
  104. if (id !== undefined) {
  105. // 请求表单数据
  106. const cfg = await getManageConfig(id)
  107. // 填入表单数据
  108. setUserForm({ ...cfg })
  109. // 设置表单数据重置状态
  110. updateInitialState({ ...cfg })
  111. }
  112. })
  113. </script>