Browse Source

feat: share to group

lejianwen 9 months ago
parent
commit
68bbcf17b0
2 changed files with 98 additions and 21 deletions
  1. 52 8
      src/views/address_book/rule.js
  2. 46 13
      src/views/address_book/rule.vue

+ 52 - 8
src/views/address_book/rule.js

@@ -59,13 +59,20 @@ export function useRepositories (api_type = 'my') {
59 59
     { label: T('ReadWrite'), value: 2 },
60 60
     { label: T('FullControl'), value: 3 },
61 61
   ])
62
-
62
+  const TYPE_U = 1
63
+  const TYPE_G = 2
64
+  const types = computed(_ => [
65
+    { label: T('Group'), value: TYPE_G },
66
+    { label: T('User'), value: TYPE_U },
67
+  ])
63 68
   const formVisible = ref(false)
64 69
   const formData = reactive({
65 70
     id: 0,
66 71
     collection_id: null,
67
-    type: 1,
72
+    type: TYPE_U,
68 73
     rule: 1,
74
+    g_id: null,
75
+    u_id: null,
69 76
     to_id: null,
70 77
     user_id: null,
71 78
   })
@@ -76,28 +83,60 @@ export function useRepositories (api_type = 'my') {
76 83
     Object.keys(formData).forEach(key => {
77 84
       formData[key] = row[key]
78 85
     })
79
-
86
+    if (row.type === TYPE_U) {
87
+      formData.u_id = row.to_id
88
+      formData.g_id = users.value.find(u => u.id === row.to_id)?.group_id
89
+    } else {
90
+      formData.g_id = row.to_id
91
+      formData.u_id = null
92
+    }
80 93
   }
81 94
   const toAdd = () => {
95
+    //初始化formData
96
+    formData.id = 0
97
+    formData.type = TYPE_U
98
+    formData.rule = 1
99
+    formData.g_id = null
100
+    formData.u_id = null
101
+
82 102
     formVisible.value = true
83 103
 
84 104
   }
85 105
   const submit = async () => {
86 106
     const api = formData.id ? apis[api_type].update : apis[api_type].create
87
-    const res = await api(formData).catch(_ => false)
107
+    const form = {
108
+      ...formData,
109
+    }
110
+    form.to_id = form.type === TYPE_G ? form.g_id : form.u_id
111
+    const res = await api(form).catch(_ => false)
88 112
     if (res) {
89 113
       ElMessage.success(T('OperationSuccess'))
90 114
       formVisible.value = false
91 115
       getList()
92 116
     }
93 117
   }
94
-  const groupUsersList = ref([])
118
+  const groups = ref([])
119
+  const users = ref([])
95 120
   const getGroupUsers = async () => {
96
-    const res = await groupUsers({ user_id: formData.user_id }).catch(_ => false)
121
+    const res = await groupUsers().catch(_ => false)
97 122
     if (res) {
98
-      groupUsersList.value = res.data
123
+      groups.value = res.data.groups.map(item => {
124
+        if (!item.children) {
125
+          item.children = []
126
+        }
127
+        res.data.users.map(u => {
128
+          if (item.id === u.group_id) {
129
+            item.children.push(u)
130
+          }
131
+        })
132
+        return item
133
+      })
134
+      users.value = res.data.users
99 135
     }
100 136
   }
137
+  const changeGId = () => {
138
+    formData.u_id = null
139
+  }
101 140
   return {
102 141
     listRes,
103 142
     listQuery,
@@ -110,7 +149,12 @@ export function useRepositories (api_type = 'my') {
110 149
     toAdd,
111 150
     submit,
112 151
     rules,
113
-    groupUsersList,
152
+    types,
153
+    groups,
154
+    users,
114 155
     getGroupUsers,
156
+    TYPE_G,
157
+    TYPE_U,
158
+    changeGId,
115 159
   }
116 160
 }

+ 46 - 13
src/views/address_book/rule.vue

@@ -17,10 +17,20 @@
17 17
             </div>
18 18
           </template>
19 19
         </el-table-column>
20
+        <el-table-column prop="type" :label="T('Type')" align="center">
21
+          <template #default="{row}">
22
+            <div>
23
+              {{ types.find(t => t.value === row.type)?.label }}
24
+            </div>
25
+          </template>
26
+        </el-table-column>
20 27
         <el-table-column prop="to_id" :label="T('ShareTo')" align="center">
21 28
           <template #default="{row}">
22
-            <div v-if="row.type===1">
23
-              {{ groupUsersList.find(u => u.id === row.to_id)?.username }}
29
+            <div v-if="row.type===TYPE_U">
30
+              {{ users.find(u => u.id === row.to_id)?.username }}
31
+            </div>
32
+            <div v-else-if="row.type===TYPE_G">
33
+              {{ groups.find(g => g.id === row.to_id)?.name }}
24 34
             </div>
25 35
           </template>
26 36
         </el-table-column>
@@ -55,17 +65,35 @@
55 65
             </el-radio>
56 66
           </el-radio-group>
57 67
         </el-form-item>
58
-        <el-form-item :label="T('ShareTo')" prop="to_id" required>
68
+        <el-form-item :label="T('Type')" prop="type" required>
69
+          <el-radio-group v-model="formData.type">
70
+            <el-radio v-for="item in types" :key="item.value" :label="parseInt(item.value)">
71
+              {{ item.label }}
72
+            </el-radio>
73
+          </el-radio-group>
74
+        </el-form-item>
75
+        <el-form-item :label="T('ShareTo')" prop="g_id" required>
59 76
           <!--          <el-input-number v-model="formData.to_id"></el-input-number>-->
60
-          <el-select v-model="formData.to_id">
61
-            <el-option
62
-                v-for="item in groupUsersList"
63
-                :key="item.id"
64
-                :label="item.username"
65
-                :value="item.id"
66
-                :disabled="!item.status"
67
-            ></el-option>
68
-          </el-select>
77
+          <div style="width: 30%">
78
+            <el-select v-model="formData.g_id" @change="changeGId">
79
+              <el-option
80
+                  v-for="item in groups"
81
+                  :key="item.id"
82
+                  :label="item.name"
83
+                  :value="item.id"
84
+              ></el-option>
85
+            </el-select>
86
+          </div>
87
+          <div style="width: 30%;margin-left: 20px">
88
+            <el-select v-model="formData.u_id" v-if="formData.type===TYPE_U">
89
+              <el-option
90
+                  v-for="item in users.filter(u => u.group_id === formData.g_id)"
91
+                  :key="item.id"
92
+                  :label="item.username"
93
+                  :value="item.id"
94
+              ></el-option>
95
+            </el-select>
96
+          </div>
69 97
         </el-form-item>
70 98
         <el-form-item>
71 99
           <el-button @click="formVisible = false">{{ T('Cancel') }}</el-button>
@@ -104,8 +132,13 @@
104 132
     toAdd,
105 133
     submit,
106 134
     rules,
107
-    groupUsersList,
135
+    types,
136
+    groups,
137
+    users,
108 138
     getGroupUsers,
139
+    TYPE_G,
140
+    TYPE_U,
141
+    changeGId,
109 142
   } = useRepositories(props.is_my ? 'my' : 'admin')
110 143
 
111 144
   formData.collection_id = props.collection.id