@cmstops/pro-compo 0.1.12 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,65 +1,77 @@
1
- import { defineComponent, ref, onMounted, computed, openBlock, createBlock, unref, withCtx, createTextVNode, toDisplayString, createElementVNode, createVNode } from "vue";
2
- import { Modal, AutoComplete, Collapse, CollapseItem, Tree } from "@arco-design/web-vue";
1
+ import { defineComponent, ref, onMounted, computed, openBlock, createBlock, unref, withCtx, createTextVNode, toDisplayString, createElementVNode, createVNode, createElementBlock, Fragment, renderList, normalizeStyle } from "vue";
2
+ import { Modal, Select, Option, Collapse, CollapseItem, Scrollbar, Button, Avatar, Message } from "@arco-design/web-vue";
3
+ import { IconDelete } from "@arco-design/web-vue/es/icon";
3
4
  import { DEFAULT_BASE_API } from "../config.js";
4
- import { getRoleAllUser, getDepartUserList, getRepoRoleList, getDepartList, getRepoUserList } from "./script/api.js";
5
+ import _sfc_main$1 from "./components/userTree.js";
6
+ import { getRepoRoleList, getDepartList, getRepoUserList, getRoleAllUser, getDepartUserList } from "./script/api.js";
5
7
  const _hoisted_1 = { class: "user-select-content" };
6
8
  const _hoisted_2 = { class: "user-select-left" };
7
- const _hoisted_3 = /* @__PURE__ */ createElementVNode("div", { class: "user-select-right" }, null, -1);
9
+ const _hoisted_3 = { class: "user-select-right" };
10
+ const _hoisted_4 = { class: "user-select-right-title" };
11
+ const _hoisted_5 = { class: "left" };
12
+ const _hoisted_6 = { class: "alias" };
13
+ const _hoisted_7 = { class: "action" };
8
14
  const _sfc_main = defineComponent({
9
15
  ...{ name: "userDirector" },
10
16
  __name: "component",
11
17
  props: {
12
18
  BASE_API: {},
13
19
  repositoryId: {},
20
+ defaultData: {},
14
21
  visible: { type: Boolean },
15
22
  title: {}
16
23
  },
17
- emits: ["update:visible"],
24
+ emits: ["update:visible", "submit"],
18
25
  setup(__props, { emit: __emit }) {
19
26
  const props = __props;
20
27
  const BASE_API = props.BASE_API || DEFAULT_BASE_API;
21
28
  const emit = __emit;
22
- const loadMore = () => {
23
- };
24
29
  const RoleTreeData = ref([]);
25
30
  const DepartTreeData = ref([]);
26
- const fieldNames = {
27
- children: "children",
28
- title: "alias",
29
- key: "node_key"
31
+ const userSelectedList = ref([]);
32
+ const clearUserSelectedList = () => {
33
+ userSelectedList.value = [];
30
34
  };
31
- const selectRoleNode = (selectedKeys, data) => {
32
- console.log("selectRoleNode", data);
35
+ const loadRoleAllUser = async (id) => {
36
+ const res = await getRoleAllUser(BASE_API, { id });
37
+ if (res.code === 0) {
38
+ return res.message.map((item) => {
39
+ item.node_key = `role_${id}_${item.uid}`;
40
+ item.isUser = true;
41
+ item.isLeaf = true;
42
+ return item;
43
+ });
44
+ }
45
+ return [];
33
46
  };
34
47
  const expandRoleNode = async (selectedKeys, data) => {
35
48
  if (data.node.isRole) {
36
- const res = await getRoleAllUser(BASE_API, { id: data.node.id });
37
- if (res.code === 0) {
38
- data.node.children = res.message.map((item) => {
39
- item.node_key = `role_${data.node.id}_${item.uid}`;
40
- item.isUser = true;
41
- item.isLeaf = true;
42
- return item;
43
- });
44
- }
49
+ data.node.children = await loadRoleAllUser(data.node.id);
45
50
  }
46
51
  };
47
- const selectDepartNode = (selectedKeys, data) => {
48
- console.log("selectDepartNode", data);
52
+ const loadDepartUserList = async (id) => {
53
+ const res = await getDepartUserList(BASE_API, { pid: id });
54
+ if (res.code === 0) {
55
+ return res.message.map((item) => {
56
+ item.node_key = `depart_${id}_${item.uid}`;
57
+ item.isUser = true;
58
+ item.isLeaf = true;
59
+ return item;
60
+ });
61
+ }
62
+ return [];
49
63
  };
50
64
  const expandDepartNode = async (selectedKeys, data) => {
51
65
  if (data.node.isDepart) {
52
- const res = await getDepartUserList(BASE_API, { pid: data.node.id });
53
- if (res.code === 0) {
54
- data.node.children = res.message.map((item) => {
55
- item.node_key = `depart_${data.node.id}_${item.uid}`;
56
- item.isUser = true;
57
- item.isLeaf = true;
58
- return item;
59
- });
60
- }
66
+ data.node.children = await loadDepartUserList(data.node.id);
61
67
  }
62
68
  };
69
+ const collapseStyle = ref({
70
+ paddingLfet: "0px",
71
+ paddingRigth: "0px",
72
+ border: "none",
73
+ background: "white"
74
+ });
63
75
  const collapseChange = async (keys) => {
64
76
  if (keys.includes("Role")) {
65
77
  getRepoRoleList(BASE_API, { repoID: props.repositoryId }).then((res) => {
@@ -85,22 +97,61 @@ const _sfc_main = defineComponent({
85
97
  }
86
98
  };
87
99
  const allUserList = ref([]);
88
- const completeUser = ref();
89
100
  const getUserList = async () => {
90
101
  const res = await getRepoUserList(BASE_API, { id: props.repositoryId });
91
102
  if (res.code === 0) {
92
- allUserList.value = res.message.map((item) => {
93
- item.value = item.uid;
94
- item.label = item.alias;
95
- return item;
103
+ allUserList.value = res.message;
104
+ }
105
+ };
106
+ const searchUserChange = (value) => {
107
+ const target = allUserList.value.find((item) => item.uid === value);
108
+ if (target) {
109
+ addUserSelectedList(target);
110
+ }
111
+ };
112
+ const userSelectedListFilter = (user) => {
113
+ const result = { ...user };
114
+ const userList = [].concat(userSelectedList.value);
115
+ for (const i of userList) {
116
+ if (result.id === i.id) {
117
+ return false;
118
+ }
119
+ }
120
+ return result;
121
+ };
122
+ const addItem = async (nodeData) => {
123
+ if (nodeData.isUser) {
124
+ addUserSelectedList(nodeData);
125
+ }
126
+ if (nodeData.isRole) {
127
+ const users = await loadRoleAllUser(nodeData.id);
128
+ users.forEach((user) => {
129
+ addUserSelectedList(user, false);
130
+ });
131
+ }
132
+ if (nodeData.isDepart) {
133
+ const users = await loadDepartUserList(nodeData.id);
134
+ users.forEach((user) => {
135
+ addUserSelectedList(user, false);
96
136
  });
97
137
  }
98
138
  };
99
- const selectUser = (value) => {
100
- console.log(value);
101
- setTimeout(() => {
102
- completeUser.value = "";
103
- }, 100);
139
+ const addUserSelectedList = (user, tip = true) => {
140
+ user = userSelectedListFilter(user);
141
+ if (user) {
142
+ user.rtype = "user";
143
+ userSelectedList.value.push(user);
144
+ } else if (tip) {
145
+ Message.warning("\u6210\u5458\u5DF2\u5B58\u5728");
146
+ }
147
+ };
148
+ const removeUserSelected = (index) => {
149
+ userSelectedList.value.splice(index, 1);
150
+ };
151
+ const handleOpen = () => {
152
+ if (props.defaultData) {
153
+ userSelectedList.value = [].concat(props.defaultData || []);
154
+ }
104
155
  };
105
156
  onMounted(() => {
106
157
  getUserList();
@@ -117,7 +168,7 @@ const _sfc_main = defineComponent({
117
168
  emit("update:visible", bool);
118
169
  };
119
170
  const handleOk = () => {
120
- setVisible(false);
171
+ emit("submit", JSON.parse(JSON.stringify(userSelectedList.value)));
121
172
  };
122
173
  const handleCancel = () => {
123
174
  setVisible(false);
@@ -125,11 +176,12 @@ const _sfc_main = defineComponent({
125
176
  return (_ctx, _cache) => {
126
177
  return openBlock(), createBlock(unref(Modal), {
127
178
  visible: visible.value,
128
- width: "986px",
179
+ width: "700px",
129
180
  "mask-closable": false,
130
- footer: false,
131
181
  "title-align": "start",
182
+ "body-class": "user-director-modal-body",
132
183
  "unmount-on-close": "",
184
+ onOpen: handleOpen,
133
185
  onOk: handleOk,
134
186
  onCancel: handleCancel
135
187
  }, {
@@ -139,57 +191,122 @@ const _sfc_main = defineComponent({
139
191
  default: withCtx(() => [
140
192
  createElementVNode("div", _hoisted_1, [
141
193
  createElementVNode("div", _hoisted_2, [
142
- createVNode(unref(AutoComplete), {
143
- modelValue: completeUser.value,
144
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => completeUser.value = $event),
145
- data: allUserList.value,
194
+ createVNode(unref(Select), {
146
195
  placeholder: "\u641C\u7D22\u59D3\u540D\u3001\u7528\u6237\u540D",
147
- onSelect: selectUser
148
- }, null, 8, ["modelValue", "data"]),
196
+ "allow-search": "",
197
+ size: "large",
198
+ onChange: searchUserChange
199
+ }, {
200
+ default: withCtx(() => [
201
+ (openBlock(true), createElementBlock(Fragment, null, renderList(allUserList.value, (item) => {
202
+ return openBlock(), createBlock(unref(Option), {
203
+ key: item.uid,
204
+ value: item.uid,
205
+ label: item.alias
206
+ }, null, 8, ["value", "label"]);
207
+ }), 128))
208
+ ]),
209
+ _: 1
210
+ }),
149
211
  createVNode(unref(Collapse), {
150
212
  accordion: "",
213
+ bordered: false,
151
214
  onChange: collapseChange
152
215
  }, {
153
216
  default: withCtx(() => [
154
217
  createVNode(unref(CollapseItem), {
155
218
  key: "Role",
156
- header: "\u6309\u89D2\u8272\u9009\u62E9"
219
+ header: "\u6309\u89D2\u8272\u9009\u62E9",
220
+ style: normalizeStyle(collapseStyle.value)
157
221
  }, {
158
222
  default: withCtx(() => [
159
- createVNode(unref(Tree), {
160
- data: RoleTreeData.value,
161
- "load-more": loadMore,
162
- "field-names": fieldNames,
163
- "action-on-node-click": "expand",
164
- onSelect: selectRoleNode,
165
- onExpand: expandRoleNode
166
- }, null, 8, ["data"])
223
+ createVNode(unref(Scrollbar), { style: { "height": "40vh", "overflow": "auto" } }, {
224
+ default: withCtx(() => [
225
+ createVNode(_sfc_main$1, {
226
+ list: RoleTreeData.value,
227
+ onExpand: expandRoleNode,
228
+ onAdd: addItem
229
+ }, null, 8, ["list"])
230
+ ]),
231
+ _: 1
232
+ })
167
233
  ]),
168
234
  _: 1
169
- }),
235
+ }, 8, ["style"]),
170
236
  createVNode(unref(CollapseItem), {
171
237
  key: "Depart",
172
- header: "\u6309\u7EC4\u7EC7\u67B6\u6784\u9009\u62E9"
238
+ header: "\u6309\u7EC4\u7EC7\u67B6\u6784\u9009\u62E9",
239
+ style: normalizeStyle(collapseStyle.value)
173
240
  }, {
174
241
  default: withCtx(() => [
175
- createVNode(unref(Tree), {
176
- size: "large",
177
- "block-node": "",
178
- "field-names": fieldNames,
179
- data: DepartTreeData.value,
180
- "load-more": loadMore,
181
- "action-on-node-click": "expand",
182
- onSelect: selectDepartNode,
183
- onExpand: expandDepartNode
184
- }, null, 8, ["data"])
242
+ createVNode(unref(Scrollbar), { style: { "height": "40vh", "overflow": "auto" } }, {
243
+ default: withCtx(() => [
244
+ createVNode(_sfc_main$1, {
245
+ list: DepartTreeData.value,
246
+ onExpand: expandDepartNode,
247
+ onAdd: addItem
248
+ }, null, 8, ["list"])
249
+ ]),
250
+ _: 1
251
+ })
185
252
  ]),
186
253
  _: 1
187
- })
254
+ }, 8, ["style"])
188
255
  ]),
189
256
  _: 1
190
257
  })
191
258
  ]),
192
- _hoisted_3
259
+ createElementVNode("div", _hoisted_3, [
260
+ createElementVNode("div", _hoisted_4, [
261
+ createElementVNode("span", null, "\u5DF2\u9009\u6210\u5458(" + toDisplayString(userSelectedList.value.length) + "\u4EBA)", 1),
262
+ createVNode(unref(Button), {
263
+ type: "text",
264
+ size: "mini",
265
+ onClick: clearUserSelectedList
266
+ }, {
267
+ default: withCtx(() => [
268
+ createTextVNode("\u5168\u90E8\u6E05\u9664")
269
+ ]),
270
+ _: 1
271
+ })
272
+ ]),
273
+ createVNode(unref(Scrollbar), {
274
+ "outer-class": "scroll",
275
+ style: { "height": "100%", "overflow": "auto" }
276
+ }, {
277
+ default: withCtx(() => [
278
+ (openBlock(true), createElementBlock(Fragment, null, renderList(userSelectedList.value, (item, index) => {
279
+ return openBlock(), createElementBlock("div", {
280
+ key: item.uid,
281
+ class: "user-item padding"
282
+ }, [
283
+ createElementVNode("div", _hoisted_5, [
284
+ createVNode(unref(Avatar), {
285
+ class: "avatar",
286
+ size: 32,
287
+ "image-url": item.avatar
288
+ }, null, 8, ["image-url"]),
289
+ createElementVNode("div", _hoisted_6, toDisplayString(item.alias), 1)
290
+ ]),
291
+ createElementVNode("div", _hoisted_7, [
292
+ createVNode(unref(Button), {
293
+ type: "primary",
294
+ size: "mini",
295
+ shape: "circle",
296
+ onClick: ($event) => removeUserSelected(index)
297
+ }, {
298
+ default: withCtx(() => [
299
+ createVNode(unref(IconDelete))
300
+ ]),
301
+ _: 2
302
+ }, 1032, ["onClick"])
303
+ ])
304
+ ]);
305
+ }), 128))
306
+ ]),
307
+ _: 1
308
+ })
309
+ ])
193
310
  ])
194
311
  ]),
195
312
  _: 1
File without changes
@@ -0,0 +1,77 @@
1
+ import { defineComponent, openBlock, createBlock, unref, withCtx, createCommentVNode, createElementVNode, toDisplayString, createVNode } from "vue";
2
+ import { Tree, Avatar, Button } from "@arco-design/web-vue";
3
+ import { IconUserGroup, IconPlus } from "@arco-design/web-vue/es/icon";
4
+ const _hoisted_1 = { class: "user-item" };
5
+ const _hoisted_2 = { class: "left" };
6
+ const _sfc_main = defineComponent({
7
+ __name: "userTree",
8
+ props: {
9
+ list: {}
10
+ },
11
+ emits: ["select", "expand", "add"],
12
+ setup(__props, { emit: __emit }) {
13
+ const props = __props;
14
+ const loadMore = () => {
15
+ };
16
+ const fieldNames = {
17
+ children: "children",
18
+ title: "alias",
19
+ key: "node_key"
20
+ };
21
+ const emit = __emit;
22
+ const select = (selectedKeys, data) => {
23
+ emit("select", selectedKeys, data);
24
+ };
25
+ const expand = (expandedKeys, data) => {
26
+ emit("expand", expandedKeys, data);
27
+ };
28
+ const addItem = (nodeData) => {
29
+ emit("add", nodeData);
30
+ };
31
+ return (_ctx, _cache) => {
32
+ return openBlock(), createBlock(unref(Tree), {
33
+ data: props.list,
34
+ "load-more": loadMore,
35
+ "block-node": "",
36
+ size: "large",
37
+ "field-names": fieldNames,
38
+ "action-on-node-click": "expand",
39
+ onSelect: select,
40
+ onExpand: expand
41
+ }, {
42
+ icon: withCtx((node) => [
43
+ !node.isLeaf ? (openBlock(), createBlock(unref(IconUserGroup), { key: 0 })) : createCommentVNode("v-if", true)
44
+ ]),
45
+ title: withCtx((nodeData) => [
46
+ createElementVNode("div", _hoisted_1, [
47
+ createElementVNode("div", _hoisted_2, [
48
+ nodeData.isUser ? (openBlock(), createBlock(unref(Avatar), {
49
+ key: 0,
50
+ class: "avatar",
51
+ size: 22,
52
+ "image-url": nodeData.avatar
53
+ }, null, 8, ["image-url"])) : createCommentVNode("v-if", true),
54
+ createElementVNode("span", null, toDisplayString(nodeData.alias), 1)
55
+ ])
56
+ ])
57
+ ]),
58
+ extra: withCtx((nodeData) => [
59
+ createVNode(unref(Button), {
60
+ class: "tree-action",
61
+ type: "primary",
62
+ size: "mini",
63
+ shape: "circle",
64
+ onClick: ($event) => addItem(nodeData)
65
+ }, {
66
+ default: withCtx(() => [
67
+ createVNode(unref(IconPlus))
68
+ ]),
69
+ _: 2
70
+ }, 1032, ["onClick"])
71
+ ]),
72
+ _: 1
73
+ }, 8, ["data"]);
74
+ };
75
+ }
76
+ });
77
+ export { _sfc_main as default };
@@ -1,8 +1,67 @@
1
+ .user-director-modal-body {
2
+ padding: 0;
3
+ }
4
+ .user-director-modal-body .arco-collapse {
5
+ height: calc(100% - 36px);
6
+ }
7
+ .user-director-modal-body .arco-collapse-item-content {
8
+ padding-left: 10px;
9
+ padding-right: 0;
10
+ background: white;
11
+ }
1
12
  .user-select-content {
2
- height: 60vh;
13
+ height: 50vh;
14
+ display: flex;
3
15
  }
4
16
  .user-select-content .user-select-left,
5
17
  .user-select-content .user-select-right {
6
18
  width: 50%;
7
19
  height: 100%;
8
20
  }
21
+ .user-select-content .user-select-left {
22
+ border-right: 1px solid var(--color-neutral-3);
23
+ }
24
+ .user-select-content .user-select-right .scroll {
25
+ height: calc(100% - 40px);
26
+ }
27
+ .user-select-content .user-select-right .user-select-right-title {
28
+ display: flex;
29
+ justify-content: space-between;
30
+ font-size: 14px;
31
+ font-weight: 500;
32
+ padding: 6px 16px;
33
+ border-bottom: 1px solid var(--color-neutral-3);
34
+ }
35
+ .user-select-content .user-item {
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: space-between;
39
+ }
40
+ .user-select-content .user-item.padding {
41
+ padding: 5px 16px;
42
+ }
43
+ .user-select-content .user-item .left {
44
+ display: flex;
45
+ align-items: center;
46
+ }
47
+ .user-select-content .user-item .left .avatar {
48
+ margin-right: 10px;
49
+ }
50
+ .user-select-content .user-item .action {
51
+ display: none;
52
+ }
53
+ .user-select-content .user-item:hover {
54
+ background-color: var(--color-fill-1);
55
+ }
56
+ .user-select-content .user-item:hover .action {
57
+ display: flex;
58
+ }
59
+ .user-select-content .tree-action {
60
+ position: absolute;
61
+ top: 7px;
62
+ right: 30px;
63
+ display: none;
64
+ }
65
+ .user-select-content .arco-tree-node:hover .tree-action {
66
+ display: inline-block;
67
+ }
@@ -1,8 +1,70 @@
1
+ .user-director-modal-body {
2
+ padding: 0;
3
+ .arco-collapse {
4
+ height: calc(100% - 36px);
5
+ }
6
+
7
+ .arco-collapse-item-content {
8
+ padding-left: 10px;
9
+ padding-right: 0;
10
+ background: white;
11
+ }
12
+ }
1
13
  .user-select-content {
2
- height: 60vh;
14
+ height: 50vh;
15
+ display: flex;
3
16
  .user-select-left,
4
17
  .user-select-right {
5
18
  width: 50%;
6
19
  height: 100%;
7
20
  }
21
+ .user-select-left {
22
+ border-right: 1px solid var(--color-neutral-3);
23
+ }
24
+ .user-select-right {
25
+ .scroll {
26
+ height: calc(100% - 40px);
27
+ }
28
+ .user-select-right-title {
29
+ display: flex;
30
+ justify-content: space-between;
31
+ font-size: 14px;
32
+ font-weight: 500;
33
+ padding: 6px 16px;
34
+ border-bottom: 1px solid var(--color-neutral-3);
35
+ }
36
+ }
37
+ .user-item {
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: space-between;
41
+ &.padding {
42
+ padding: 5px 16px;
43
+ }
44
+ .left {
45
+ display: flex;
46
+ align-items: center;
47
+ .avatar {
48
+ margin-right: 10px;
49
+ }
50
+ }
51
+ .action {
52
+ display: none;
53
+ }
54
+ &:hover {
55
+ background-color: var(--color-fill-1);
56
+ .action {
57
+ display: flex;
58
+ }
59
+ }
60
+ }
61
+ .tree-action {
62
+ position: absolute;
63
+ top: 7px;
64
+ right: 30px;
65
+ display: none;
66
+ }
67
+ .arco-tree-node:hover .tree-action {
68
+ display: inline-block;
69
+ }
8
70
  }