useCrud.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /**********************************
  2. * @Author: Ronnie Zhang
  3. * @LastEditor: Ronnie Zhang
  4. * @LastEditTime: 2023/12/12 09:03:00
  5. * @Email: zclzone@outlook.com
  6. * Copyright © 2023 Ronnie Zhang(大脸怪) | https://isme.top
  7. **********************************/
  8. import { useForm, useModal } from '.'
  9. const ACTIONS = {
  10. view: '查看',
  11. edit: '编辑',
  12. add: '新增',
  13. }
  14. export function useCrud({ name, initForm = {}, doCreate, doDelete, doUpdate, refresh }) {
  15. const modalAction = ref('')
  16. const [modalRef, okLoading] = useModal()
  17. const [modalFormRef, modalForm, validation] = useForm(initForm)
  18. let handleAddcallback, handleEditcallback
  19. /** 新增 */
  20. function handleAdd(row = {}, title, addcallback) {
  21. handleOpen({ action: 'add', title, row: { ...initForm, ...row } })
  22. if (typeof addcallback === 'function') {
  23. handleAddcallback = addcallback
  24. }
  25. }
  26. /** 修改 */
  27. function handleEdit(row, title, editcallback) {
  28. handleOpen({ action: 'edit', title, row })
  29. if (typeof editcallback === 'function') {
  30. handleEditcallback = editcallback
  31. }
  32. }
  33. /** 查看 */
  34. function handleView(row, title) {
  35. handleOpen({ action: 'view', title, row })
  36. }
  37. /** 打开modal */
  38. function handleOpen(options = {}) {
  39. const { action, row, title, onOk } = options
  40. modalAction.value = action
  41. modalForm.value = { ...row }
  42. modalRef.value?.open({
  43. ...options,
  44. async onOk() {
  45. if (typeof onOk === 'function') {
  46. return await onOk()
  47. }
  48. else {
  49. return await handleSave()
  50. }
  51. },
  52. title: title ?? (ACTIONS[modalAction.value] || '') + name,
  53. })
  54. }
  55. /** 保存 */
  56. async function handleSave(action) {
  57. if (!action && !['edit', 'add'].includes(modalAction.value)) {
  58. return false
  59. }
  60. await validation()
  61. const actions = {
  62. add: {
  63. api: () => doCreate(modalForm.value),
  64. cb: () => {
  65. $message.success('新增成功')
  66. handleAddcallback && handleAddcallback()
  67. },
  68. },
  69. edit: {
  70. api: () => doUpdate(modalForm.value),
  71. cb: () => {
  72. $message.success('保存成功')
  73. handleEditcallback && handleEditcallback()
  74. // debugger
  75. },
  76. },
  77. }
  78. action = action || actions[modalAction.value]
  79. try {
  80. okLoading.value = true
  81. const data = await action.api()
  82. action.cb()
  83. okLoading.value = false
  84. data && refresh(data)
  85. }
  86. catch (error) {
  87. console.error(error)
  88. okLoading.value = false
  89. return false
  90. }
  91. }
  92. /** 删除 */
  93. function handleDelete(id, confirmOptions) {
  94. if (!id && id !== 0)
  95. return
  96. const d = $dialog.warning({
  97. content: '确定删除?',
  98. title: '提示',
  99. positiveText: '确定',
  100. negativeText: '取消',
  101. async onPositiveClick() {
  102. try {
  103. d.loading = true
  104. const data = await doDelete(id)
  105. $message.success('删除成功')
  106. d.loading = false
  107. refresh(data, true)
  108. }
  109. catch (error) {
  110. console.error(error)
  111. d.loading = false
  112. }
  113. },
  114. ...confirmOptions,
  115. })
  116. }
  117. return {
  118. modalRef,
  119. modalFormRef,
  120. modalAction,
  121. modalForm,
  122. okLoading,
  123. validation,
  124. handleAdd,
  125. handleDelete,
  126. handleEdit,
  127. handleView,
  128. handleOpen,
  129. handleSave,
  130. }
  131. }