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