form.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <script lang="ts" setup>
  2. import type { SystemModel } from '#/api';
  3. import { computed, ref } from 'vue';
  4. import { useVbenModal } from '@vben/common-ui';
  5. import { useRequest } from '@six/request';
  6. import { Button } from 'ant-design-vue';
  7. import { useVbenForm } from '#/adapter/form';
  8. import { editUserMethod } from '#/api';
  9. import { $t } from '#/locales';
  10. import { useUserFormSchema } from '../data';
  11. const emit = defineEmits(['success']);
  12. const edit = useRequest(editUserMethod, { immediate: false }).onSuccess(() => {
  13. emit('success');
  14. });
  15. const formData = ref<SystemModel.User>();
  16. const getTitle = computed(() => {
  17. return formData.value?.id
  18. ? $t('ui.actionTitle.edit', [$t('system.user._')])
  19. : $t('ui.actionTitle.create', [$t('system.user._')]);
  20. });
  21. const [Form, formApi] = useVbenForm({
  22. commonConfig: {
  23. labelWidth: 135, // 单位 px,按实际文案长度调整
  24. },
  25. schema: useUserFormSchema('add'),
  26. showDefaultActions: false,
  27. });
  28. function resetForm() {
  29. formApi.resetForm();
  30. formApi.setValues(formData.value || {});
  31. }
  32. const [Modal, modalApi] = useVbenModal({
  33. async onConfirm() {
  34. const { valid } = await formApi.validate();
  35. if (valid) {
  36. modalApi.lock();
  37. const data = await formApi.getValues();
  38. if (formData.value?.id && !data.password) {
  39. delete data.password;
  40. }
  41. try {
  42. await edit.send({ ...formData.value, ...data });
  43. await modalApi.close();
  44. } finally {
  45. modalApi.lock(false);
  46. }
  47. }
  48. },
  49. onOpenChange(isOpen) {
  50. if (isOpen) {
  51. const data = modalApi.getData<SystemModel.User>();
  52. if (data) {
  53. formApi.setState({
  54. schema: useUserFormSchema(data.id ? 'edit' : 'add'),
  55. });
  56. formData.value = data;
  57. formData.value.roles = data.roles?.map((role) =>
  58. typeof role === 'string' ? role : role.id,
  59. );
  60. formData.value.userType = data.userType === '01' ? '01' : '00';
  61. formApi.setValues(formData.value);
  62. }
  63. }
  64. },
  65. });
  66. </script>
  67. <template>
  68. <Modal :title="getTitle">
  69. <Form class="mx-4" />
  70. <template #prepend-footer>
  71. <div class="flex-auto">
  72. <Button type="primary" danger @click="resetForm">
  73. {{ $t('common.reset') }}
  74. </Button>
  75. </div>
  76. </template>
  77. </Modal>
  78. </template>