popup.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <template>
  2. <BasicModal
  3. width="800px"
  4. :minHeight="550"
  5. v-bind="$attrs"
  6. @register="register"
  7. @ok="confirm"
  8. :title="title"
  9. >
  10. <BasicForm @register="registerForm" :model="model" />
  11. <!-- <MenuTree /> -->
  12. </BasicModal>
  13. </template>
  14. <script lang="ts">
  15. import { Tree } from 'ant-design-vue';
  16. import { defineComponent, PropType, reactive, ref, toRefs } from 'vue';
  17. import { BasicModal, useModalInner } from '/@/components/Modal';
  18. import { useMessage } from '/@/hooks/web/useMessage';
  19. import { BasicForm, useForm } from '/@/components/Form/index';
  20. import { schemas } from './data';
  21. interface PopupData {
  22. title: string;
  23. }
  24. interface Role {
  25. id: string | number;
  26. }
  27. export default defineComponent({
  28. components: { BasicModal, BasicForm, [Tree.name]: Tree },
  29. props: {
  30. popupData: {
  31. type: Object as PropType<PopupData>,
  32. default: () => {},
  33. },
  34. },
  35. emits: ['register', 'saveData'],
  36. setup(props, { emit }) {
  37. const { createMessage } = useMessage();
  38. const { error } = createMessage;
  39. const role = reactive<Role>({
  40. id: 0,
  41. });
  42. const popupData = props.popupData as PopupData;
  43. console.log(`popupData`, popupData);
  44. const modelRef = ref({});
  45. const [registerForm, { updateSchema, setFieldsValue, resetFields, validate }] = useForm({
  46. labelWidth: 120,
  47. schemas,
  48. showActionButtonGroup: false,
  49. actionColOptions: {
  50. span: 24,
  51. },
  52. });
  53. // const [register, { closeModal }] = useModalInner((data) => {
  54. // modelRef.value = data;
  55. //
  56. // });
  57. const [register, { closeModal }] = useModalInner((data) => {
  58. resetFields();
  59. if (data) {
  60. role.id = data.id;
  61. updateSchema({
  62. field: 'password',
  63. required: false,
  64. });
  65. } else {
  66. role.id = 0;
  67. updateSchema({
  68. field: 'password',
  69. required: true,
  70. });
  71. }
  72. setFieldsValue(data);
  73. });
  74. async function confirm() {
  75. try {
  76. const data = await validate();
  77. if (role.id) {
  78. data.id = role.id;
  79. }
  80. const popupData = { closeModal, data };
  81. emit('saveData', popupData);
  82. } catch (err: any) {
  83. error(err.errorFields[0].errors[0]);
  84. }
  85. }
  86. return {
  87. register,
  88. schemas,
  89. registerForm,
  90. model: modelRef,
  91. confirm,
  92. ...toRefs(popupData),
  93. };
  94. },
  95. });
  96. </script>
  97. <style lang="less">
  98. .ant-form-item-label {
  99. text-align: center !important;
  100. }
  101. .tree-label {
  102. width: 20.6%;
  103. margin-top: 8px;
  104. margin-bottom: 1em;
  105. text-align: center;
  106. }
  107. @media (max-width: 639px) {
  108. .ant-form-item-label {
  109. line-height: 2.5715 !important;
  110. text-align: center !important;
  111. }
  112. .tree-label {
  113. width: 33%;
  114. margin-top: 8px;
  115. margin-bottom: 1em;
  116. text-align: center;
  117. }
  118. }
  119. </style>