AddOrEditDrawer.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <bs-drawer
  3. :width="drawerOptions.width"
  4. :title="drawerOptions.title"
  5. :drawer-extra-props="drawerOptions.drawerExtraProps"
  6. :visible="drawerOptions.visible"
  7. @ok="handleOk"
  8. @cancel="handleCancel"
  9. @close="handleClose"
  10. >
  11. <bs-form
  12. :form-fields="formOptions.formFields"
  13. :form-data="formOptions.formData"
  14. :form-extra-props="formOptions.formExtraProps"
  15. :footer-render="() => null"
  16. :form-id="formOptions.formId"
  17. ref="bsFormRef"
  18. ></bs-form>
  19. </bs-drawer>
  20. </template>
  21. <script setup lang="jsx">
  22. import BsDrawer, { useBsDrawer } from '/@/components/BsUi/Drawer/index.js';
  23. import BsForm, { useBsForm } from '/@/components/BsUi/Form/index.js';
  24. import { h, ref } from 'vue';
  25. import { useBsTable } from '/@/components/BsUi/index.js';
  26. import { BorderOuterOutlined, SearchOutlined } from '@ant-design/icons-vue';
  27. import { message } from 'ant-design-vue';
  28. import { DISPLAY_STATE } from '/@/components/BsUi/constant.js';
  29. const bsFormRef = ref(null);
  30. const {
  31. setDrawerPropsValue: setDVal,
  32. drawerOptions,
  33. getDrawerPropsValue: getDVal,
  34. } = useBsDrawer({
  35. drawerOptions: {
  36. width: '500px',
  37. title: '标题',
  38. visible: false,
  39. drawerExtraProps: {
  40. destroyOnClose: true,
  41. },
  42. },
  43. });
  44. const { formOptions, setFormPropsValue: setFVal } = useBsForm({
  45. formOptions: {
  46. formFields: [
  47. {
  48. id: '1',
  49. label: '输入框',
  50. component: 'a-input',
  51. componentProps: {
  52. placeholder: '请输入',
  53. },
  54. field: 'name',
  55. sort: '1',
  56. visible: '1',
  57. required: '1',
  58. formItemExtraProps: {
  59. rules: [
  60. {
  61. validator: (_, value) => {
  62. // return Promise.reject(new Error('报错'));
  63. return Promise.resolve();
  64. },
  65. },
  66. ],
  67. },
  68. },
  69. {
  70. id: '2',
  71. label: '表格选择器',
  72. component: 'bs-table-selector',
  73. componentProps: {
  74. multiple: '1',
  75. placeholder: '请选择',
  76. labelField: 'name',
  77. valueField: 'id',
  78. tableOptions: {
  79. gridOptions: {
  80. loading: false,
  81. columns: [
  82. {
  83. field: 'id',
  84. title: 'ID',
  85. },
  86. {
  87. field: 'name',
  88. title: '名字',
  89. },
  90. ],
  91. rowKey: 'id',
  92. data: [],
  93. },
  94. async request() {
  95. return {
  96. list: Array.from({ length: 10 })
  97. .fill(0)
  98. .map((v, idx) => ({
  99. id: idx,
  100. name: 'name' + idx,
  101. })),
  102. total: 10,
  103. };
  104. },
  105. },
  106. modalOptions: {
  107. title: '表格选择器',
  108. },
  109. },
  110. field: 'name1',
  111. sort: '2',
  112. visible: '1',
  113. required: '1',
  114. formItemExtraProps: {
  115. rules: [
  116. {
  117. validator: (_, value) => {
  118. // return Promise.reject(new Error('报错'));
  119. return Promise.resolve();
  120. },
  121. },
  122. ],
  123. },
  124. },
  125. ],
  126. formData: {
  127. name: '韩晓辉',
  128. name1: [
  129. {
  130. id: 1,
  131. name: 'name1',
  132. },
  133. ],
  134. // name1: {
  135. // id: 1,
  136. // name: 'name1',
  137. // },
  138. },
  139. formId: 'formId',
  140. formExtraProps: {},
  141. },
  142. });
  143. const closeDrawer = () => {
  144. setDVal('visible', false);
  145. };
  146. const handleOk = async (setLoading) => {
  147. setLoading(true);
  148. bsFormRef.value
  149. .handlerFormValidator()
  150. .then((res) => {
  151. closeDrawer();
  152. })
  153. .finally(() => {
  154. setLoading(false);
  155. });
  156. };
  157. const handleCancel = async () => {
  158. closeDrawer();
  159. };
  160. const handleClose = async () => {
  161. setDVal('visible', false);
  162. };
  163. const showDrawer = ({ type, row }) => {
  164. setDVal('visible', true);
  165. if (type === 'add') {
  166. setDVal('title', '新增标题');
  167. setFVal('formData', {
  168. name: undefined,
  169. name1: undefined,
  170. });
  171. } else {
  172. setDVal('title', '编辑标题');
  173. setFVal('formData', {
  174. name: '王宗帅',
  175. });
  176. }
  177. };
  178. defineExpose({
  179. showDrawer,
  180. });
  181. </script>