edit.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <a-modal
  3. v-model:visible="visible"
  4. :title="`${editMember.teamId ? $t('sys.update') : $t('sys.add')} ${$t(
  5. 'material.name'
  6. )}`"
  7. width="480px"
  8. :after-close="onCancel"
  9. @ok="saveHandler"
  10. >
  11. <template #footer>
  12. <a-button class="action-bottom" size="middle" @click="visible = false">
  13. {{ $t('sys.cancel') }}
  14. </a-button>
  15. <a-button
  16. class="action-bottom"
  17. type="primary"
  18. size="middle"
  19. @click="saveHandler"
  20. >
  21. {{ $t('sys.save') }}
  22. </a-button>
  23. </template>
  24. <a-form
  25. ref="fromRef"
  26. :model="editMember"
  27. class="form"
  28. label-align="right"
  29. :label-col="{ span: 5 }"
  30. >
  31. <a-form-item
  32. name="userName"
  33. :label="$t('material.userNameLabel')"
  34. :rules="[{ required: true, message: $t('material.ruleUserName') }]"
  35. >
  36. <a-input
  37. v-model:value="editMember.userName"
  38. :disabled="!!editMember.teamId"
  39. :placeholder="$t('material.ruleUserName')"
  40. />
  41. </a-form-item>
  42. <a-form-item
  43. name="nickName"
  44. :label="$t('material.nickNameLabel')"
  45. :rules="[
  46. { required: true, message: $t('material.ruleNickName') },
  47. { max: 50, message: $t('material.ruleNickName1') }
  48. ]"
  49. >
  50. <a-input
  51. v-model:value="editMember.nickName"
  52. :placeholder="$t('material.ruleNickName')"
  53. />
  54. </a-form-item>
  55. <a-form-item
  56. :label="$t('material.roleLabel')"
  57. :rules="[{ required: true, message: $t('material.ruleRole') }]"
  58. >
  59. <a-select
  60. v-model:value="currentRole"
  61. :placeholder="$t('material.ruleRole')"
  62. >
  63. <a-select-option
  64. v-for="role in roleOptions"
  65. :key="role.roleId"
  66. :value="role.roleId"
  67. >{{ role.roleName }}</a-select-option
  68. >
  69. </a-select>
  70. </a-form-item>
  71. <a-form-item
  72. name="bindAccount"
  73. :label="$t('material.bindAccountLabel')"
  74. :rules="[phoneRule]"
  75. >
  76. <a-input
  77. v-model:value="editMember.bindAccount"
  78. :placeholder="$t('material.rulebindAccount')"
  79. />
  80. </a-form-item>
  81. <a-form-item
  82. name="remark"
  83. :label="$t('material.remarkLabel')"
  84. :rules="[
  85. {
  86. required: false,
  87. max: 200,
  88. message: $t('material.ruleRemark1', { max: 200 })
  89. }
  90. ]"
  91. >
  92. <a-textarea
  93. v-model:value.trim="editMember.remark"
  94. :resize="false"
  95. style="height: 104px; resize: none"
  96. :placeholder="$t('material.ruleRemark1', { max: 200 })"
  97. />
  98. </a-form-item>
  99. </a-form>
  100. </a-modal>
  101. </template>
  102. <script lang="ts" setup>
  103. import { ref, defineProps, toRaw, onMounted, computed } from 'vue'
  104. import { fetchRoleSelects } from '@/api'
  105. import router from '@/router'
  106. import { phoneRule } from '@/views/system/shared'
  107. import { message } from 'ant-design-vue'
  108. import type { Role, SetMemberProps } from '@/api'
  109. import type { FormInstance } from 'ant-design-vue'
  110. import { ui18n } from '@/lang'
  111. export type EditMember = PartialPart<SetMemberProps, 'projectId'>
  112. defineOptions({ name: 'EditMember' })
  113. const props = defineProps<{
  114. member?: EditMember
  115. onSave: (data: EditMember) => void
  116. onCancel: () => void
  117. }>()
  118. const currentRole = ref<number>()
  119. const roleOptions = ref<Pick<Role, 'roleId' | 'roleName'>[]>()
  120. const currentProjectId = computed(() =>
  121. Number(router.currentRoute.value.params.id)
  122. )
  123. const editMember = ref<EditMember>(
  124. props.member
  125. ? { ...props.member }
  126. : {
  127. userName: '',
  128. nickName: '',
  129. remark: '',
  130. roles: [],
  131. bindAccount: ''
  132. }
  133. )
  134. currentRole.value = editMember.value.roles[0]
  135. const fromRef = ref<FormInstance>()
  136. const visible = ref(true)
  137. const saveHandler = async () => {
  138. if (!currentRole.value) {
  139. throw message.error(ui18n.t('material.ruleRole'))
  140. }
  141. await fromRef.value?.validate()
  142. await props.onSave({
  143. ...toRaw(editMember.value),
  144. remark: editMember.value.remark || '',
  145. bindAccount: editMember.value.bindAccount || '',
  146. roles: currentRole.value ? [currentRole.value] : []
  147. })
  148. visible.value = false
  149. }
  150. onMounted(async () => {
  151. roleOptions.value = await fetchRoleSelects(currentProjectId.value)
  152. if (!currentRole.value) {
  153. currentRole.value = roleOptions.value[0].roleId
  154. }
  155. })
  156. </script>
  157. <style lang="scss" scoped>
  158. .footer {
  159. display: flex;
  160. justify-content: space-between;
  161. align-items: center;
  162. p {
  163. margin-bottom: 0;
  164. color: #646566;
  165. font-size: 14px;
  166. }
  167. }
  168. </style>