share-modal.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <script setup lang="ts">
  2. import { ref, computed, reactive } from "vue";
  3. import { useAsync } from "/@/hooks";
  4. import { ElForm } from "element-plus";
  5. import { rules } from "../../company/config/configs";
  6. import {
  7. httpUserList,
  8. httpMenuList,
  9. httpUserGroup,
  10. httpAdd,
  11. httpDetail,
  12. httpUpdate
  13. } from "/@/api/interest/dataShare";
  14. const emit = defineEmits(["reload"]);
  15. const id = ref("");
  16. const readonly = ref(false);
  17. const visible = ref(false);
  18. const formRef = ref<InstanceType<typeof ElForm>>(null);
  19. const isCreate = computed(() => !id.value);
  20. const initalData = {
  21. menu_ids: [],
  22. source_uid: "",
  23. source_data_group_id: "",
  24. uid: "",
  25. data_group_id: "",
  26. type: "2"
  27. };
  28. const shareTypes = reactive({
  29. source: "1",
  30. target: "1"
  31. });
  32. const title = computed(() => {
  33. if (readonly.value) return "数据共享详情";
  34. return isCreate.value ? "创建数据共享" : "编辑数据共享";
  35. });
  36. const onBeforeAction = () => {
  37. visible.value = false;
  38. emit("reload");
  39. };
  40. const initalLoading = computed(
  41. () =>
  42. groupLoading.value ||
  43. menuLoading.value ||
  44. userLoading.value ||
  45. detailLoading.value
  46. );
  47. const actionLoading = computed(
  48. () => createLoading.value || updateLoading.value
  49. );
  50. const formData = ref({ ...initalData });
  51. const {
  52. run: userlistRun,
  53. data: userlist,
  54. loading: userLoading
  55. } = useAsync<Array<Record<string, string>>>({
  56. initalData: []
  57. });
  58. const {
  59. run: menulistRun,
  60. data: menulist,
  61. loading: menuLoading
  62. } = useAsync<Array<Record<string, string>>>({
  63. initalData: []
  64. });
  65. const {
  66. run: grouplistRun,
  67. data: grouplist,
  68. loading: groupLoading
  69. } = useAsync<Array<Record<string, string>>>({
  70. initalData: [],
  71. isList: true
  72. });
  73. const { run: createDataShareRun, loading: createLoading } = useAsync({
  74. success: () => onBeforeAction()
  75. });
  76. const { run: updateDateShareRun, loading: updateLoading } = useAsync({
  77. success: () => onBeforeAction()
  78. });
  79. const {
  80. run: dataShareDetailRun,
  81. data: dataShareDetail,
  82. loading: detailLoading
  83. } = useAsync<Record<string, any>>({
  84. initalData: {},
  85. success: () => {
  86. let {
  87. menu_list,
  88. source_data_group_id,
  89. data_group_id,
  90. uid,
  91. source_uid,
  92. type
  93. } = dataShareDetail.value;
  94. shareTypes.source = source_uid === "0" ? "2" : "1";
  95. shareTypes.target = uid === "0" ? "2" : "1";
  96. data_group_id = data_group_id === "0" ? "" : data_group_id;
  97. source_data_group_id =
  98. source_data_group_id === "0" ? "" : source_data_group_id;
  99. uid = uid === "0" ? "" : uid;
  100. source_uid = source_uid === "0" ? "" : source_uid;
  101. formData.value = {
  102. menu_ids: menu_list.map(({ id }) => id),
  103. source_data_group_id,
  104. data_group_id,
  105. source_uid,
  106. uid,
  107. type
  108. };
  109. }
  110. });
  111. function createDataShare() {
  112. createDataShareRun(httpAdd(formData.value));
  113. }
  114. function updateDataShare() {
  115. updateDateShareRun(
  116. httpUpdate({
  117. id: id.value,
  118. ...formData.value
  119. })
  120. );
  121. }
  122. function handleConfirm() {
  123. formRef.value.validate(isValid => {
  124. console.log(isValid);
  125. if (!isValid) return;
  126. if (isCreate.value) return createDataShare();
  127. updateDataShare();
  128. });
  129. }
  130. defineExpose({
  131. onDisplay(_id = "", _readonly = false) {
  132. visible.value = true;
  133. userlistRun(httpUserList({size: 100}));
  134. menulistRun(httpMenuList({size: 100}));
  135. grouplistRun(httpUserGroup({size:100}));
  136. readonly.value = _readonly;
  137. id.value = _id;
  138. if (!_id) return (formData.value = { ...initalData });
  139. dataShareDetailRun(httpDetail({ id: id.value }));
  140. }
  141. });
  142. </script>
  143. <template>
  144. <el-dialog :close-on-click-modal="false" v-model="visible" :title="title" center
  145. @close="() => (formData = { ...initalData })">
  146. <el-form label-width="120px" ref="formRef" :model="formData" :disabled="readonly" v-loading="initalLoading"
  147. :rules="rules">
  148. <el-form-item prop="menu_ids" label="共享的菜单数据">
  149. <el-select w-full v-model="formData.menu_ids" multiple>
  150. <el-option-group v-for="menu in menulist" :key="menu.id" :label="menu.menu_name">
  151. <el-option v-for="(item, i) in menu.child" :key="'item' + item.menu_name + i" :label="item.menu_name"
  152. :value="item.id" />
  153. </el-option-group>
  154. </el-select>
  155. </el-form-item>
  156. <el-form-item label="数据源共享对象" :prop="shareTypes.source === '1' ? 'source_uid' : 'source_data_group_id'
  157. ">
  158. <el-select w-100px v-model="shareTypes.source" @change="val =>
  159. val === '1'
  160. ? (formData.source_data_group_id = '')
  161. : (formData.source_uid = '')
  162. ">
  163. <el-option value="1" label="用户" />
  164. <el-option value="2" label="用户组" />
  165. </el-select>
  166. <el-select flex-1 placeholder="请选择用户" v-if="shareTypes.source === '1'" v-model="formData.source_uid">
  167. <el-option v-for="user in userlist" :key="user.id" :value="user.id" :label="user.nickname" />
  168. </el-select>
  169. <el-select flex-1 placeholder="请选择用户组" v-else v-model="formData.source_data_group_id">
  170. <el-option v-for="group in grouplist" :key="group.id" :value="group.id" :label="group.title" />
  171. </el-select>
  172. </el-form-item>
  173. <el-divider />
  174. <el-form-item label="数据共享对象" :prop="shareTypes.target === '1' ? 'uid' : 'data_group_id'">
  175. <el-select w-100px v-model="shareTypes.target" @change="val =>
  176. val === '1' ? (formData.source_uid = '') : (formData.uid = '')
  177. ">
  178. <el-option value="1" label="用户" />
  179. <el-option value="2" label="用户组" />
  180. </el-select>
  181. <el-select flex-1 placeholder="请选择用户" v-if="shareTypes.target === '1'" v-model="formData.uid">
  182. <el-option v-for="user in userlist" :key="user.id" :value="user.id" :label="user.nickname" />
  183. </el-select>
  184. <el-select flex-1 placeholder="请选择用户组" v-else v-model="formData.data_group_id">
  185. <el-option v-for="group in grouplist" :key="group.id" :value="group.id" :label="group.title" />
  186. </el-select>
  187. </el-form-item>
  188. <el-form-item label="共享的数据权限" prop="type">
  189. <el-radio-group v-model="formData.type">
  190. <el-radio label="2">只读</el-radio>
  191. <el-radio label="1">读写</el-radio>
  192. </el-radio-group>
  193. </el-form-item>
  194. <el-form-item>
  195. <div w-full flex justify-end>
  196. <el-button type="primary" @click="() => handleConfirm()" :loading="actionLoading">提交
  197. </el-button>
  198. <el-button @click="() => (visible = false)">取消</el-button>
  199. </div>
  200. </el-form-item>
  201. </el-form>
  202. </el-dialog>
  203. </template>