bri-components 1.5.22 → 1.6.1

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.
Files changed (154) hide show
  1. package/README.md +83 -83
  2. package/lib/styles/bundle.css +12 -12
  3. package/lib/styles/font/fontello.svg +31 -31
  4. package/package.json +127 -125
  5. package/src/components/Error/Error403.vue +42 -42
  6. package/src/components/Error/Error404.vue +40 -40
  7. package/src/components/Error/Error500.vue +51 -51
  8. package/src/components/Error/error.less +162 -162
  9. package/src/components/Error/errorBack.vue +40 -40
  10. package/src/components/controls/DshControlInput.vue +195 -195
  11. package/src/components/controls/base/BriUpload/BriUpload.vue +435 -434
  12. package/src/components/controls/base/BriUpload/BriUploadImage.vue +430 -377
  13. package/src/components/controls/base/BriUpload/uploadList.vue +738 -727
  14. package/src/components/controls/base/BriUpload/uploadMixin.js +453 -446
  15. package/src/components/controls/base/DshCascader/DshCascader.vue +215 -215
  16. package/src/components/controls/base/DshCascader/components/cascaderModal.vue +366 -366
  17. package/src/components/controls/base/DshCascader/components/cascaderPicker.vue +416 -416
  18. package/src/components/controls/base/DshCascader/components/cascaderSimple.vue +141 -141
  19. package/src/components/controls/base/DshCascader/components/cascaderTree.vue +151 -151
  20. package/src/components/controls/base/DshCoordinates.vue +587 -585
  21. package/src/components/controls/base/DshDate/DshDate.vue +191 -191
  22. package/src/components/controls/base/DshDate/DshDaterange.vue +186 -186
  23. package/src/components/controls/base/DshDivider.vue +201 -201
  24. package/src/components/controls/base/DshEditor.vue +274 -274
  25. package/src/components/controls/base/DshInput/BriInputs.vue +166 -166
  26. package/src/components/controls/base/DshInput/DshInput.vue +260 -260
  27. package/src/components/controls/base/DshNumber/BriInputNumber/BriInputNumber.vue +435 -435
  28. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/emitter.js +34 -34
  29. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/form.js +14 -14
  30. package/src/components/controls/base/DshNumber/BriInputNumber/utils/assist.js +322 -322
  31. package/src/components/controls/base/DshNumber/DshNumber.vue +143 -143
  32. package/src/components/controls/base/DshNumber/DshNumberange.vue +109 -109
  33. package/src/components/controls/base/DshSelect/DshCheckbox.vue +168 -168
  34. package/src/components/controls/base/DshSelect/DshSelect.vue +180 -180
  35. package/src/components/controls/base/DshSelect/DshSelectAll.vue +269 -269
  36. package/src/components/controls/base/DshSwitch/DshSwitch.vue +115 -115
  37. package/src/components/controls/control.less +324 -324
  38. package/src/components/controls/controlMap.js +117 -117
  39. package/src/components/controls/extra/DshColor.vue +81 -81
  40. package/src/components/controls/extra/DshThemeColor.vue +100 -100
  41. package/src/components/controls/extra/DshThemeIcon.vue +122 -122
  42. package/src/components/controls/mixins/cascaderMixin.js +325 -325
  43. package/src/components/controls/mixins/cascaderPickerMixin.js +227 -227
  44. package/src/components/controls/mixins/cascaderTableMixin.js +130 -130
  45. package/src/components/controls/mixins/controlMixin.js +393 -393
  46. package/src/components/controls/mixins/dateMixin.js +149 -149
  47. package/src/components/controls/mixins/flatTableMixin.js +111 -111
  48. package/src/components/controls/mixins/numberMixin.js +112 -112
  49. package/src/components/controls/mixins/selectMixin.js +233 -233
  50. package/src/components/controls/mixins/switchMixin.js +87 -87
  51. package/src/components/controls/mixins/userAndDepartMixin.js +260 -260
  52. package/src/components/controls/senior/DshLabels.vue +333 -333
  53. package/src/components/controls/senior/DshPackage.vue +57 -57
  54. package/src/components/controls/senior/cascaderTable.vue +213 -213
  55. package/src/components/controls/senior/correlation.vue +135 -135
  56. package/src/components/controls/senior/flatTable.vue +138 -138
  57. package/src/components/controls/senior/selectDepartments.vue +397 -399
  58. package/src/components/controls/senior/selectUsers/departMenu.vue +296 -293
  59. package/src/components/controls/senior/selectUsers/selectUsers.vue +712 -712
  60. package/src/components/controls/special/DshBack.vue +42 -42
  61. package/src/components/controls/special/DshUndeveloped.vue +41 -41
  62. package/src/components/form/DshAdvSearch.vue +510 -510
  63. package/src/components/form/DshDefaultSearch.vue +260 -260
  64. package/src/components/form/DshForm.vue +494 -494
  65. package/src/components/form/searchMixin.js +376 -376
  66. package/src/components/list/BriCard.vue +95 -95
  67. package/src/components/list/BriTable.vue +205 -205
  68. package/src/components/list/BriTree.vue +529 -529
  69. package/src/components/list/BriTreeItem.vue +163 -163
  70. package/src/components/list/DshBox/DshBox.vue +219 -219
  71. package/src/components/list/DshBox/DshCard.vue +446 -446
  72. package/src/components/list/DshBox/DshCrossTable.vue +827 -827
  73. package/src/components/list/DshBox/DshList.vue +404 -404
  74. package/src/components/list/DshBox/DshPanel.vue +669 -669
  75. package/src/components/list/DshBox/DshSingleData.vue +119 -119
  76. package/src/components/list/DshBox/DshTable.vue +239 -239
  77. package/src/components/list/DshCascaderTable.vue +115 -115
  78. package/src/components/list/DshFlatTable.vue +334 -337
  79. package/src/components/list/DshPage.vue +194 -194
  80. package/src/components/list/DshTreeTable.vue +113 -113
  81. package/src/components/list/common/importModal.vue +243 -243
  82. package/src/components/list/common/quoteListModal.vue +206 -206
  83. package/src/components/list/mixins/DshCascaderTableMixin.js +278 -278
  84. package/src/components/list/mixins/DshFlatTableMixin.js +509 -509
  85. package/src/components/list/mixins/DshTreeTableMixin.js +286 -286
  86. package/src/components/list/mixins/tableBaseMixin.js +1653 -1653
  87. package/src/components/list/mixins/treeTableBaseMixin.js +145 -145
  88. package/src/components/other/BriAvatar.vue +166 -166
  89. package/src/components/other/BriCode.vue +125 -125
  90. package/src/components/other/BriCollapseTree.vue +207 -207
  91. package/src/components/other/BriGantt.vue +1087 -1087
  92. package/src/components/other/BriIframe.vue +116 -116
  93. package/src/components/other/BriLoading.vue +171 -171
  94. package/src/components/other/BriSvg.vue +27 -27
  95. package/src/components/other/DshColorPanel.vue +128 -128
  96. package/src/components/other/DshMenuNav.vue +188 -188
  97. package/src/components/other/DshVideoPlayer.vue +184 -0
  98. package/src/components/small/BriButton.vue +71 -71
  99. package/src/components/small/BriDrawer.vue +169 -169
  100. package/src/components/small/BriTooltip.vue +87 -87
  101. package/src/components/small/DshBtnModal.vue +68 -68
  102. package/src/components/small/DshButtons.vue +324 -324
  103. package/src/components/small/DshDropdown.vue +225 -225
  104. package/src/components/small/DshIcons.vue +59 -59
  105. package/src/components/small/DshListRender.js +21 -21
  106. package/src/components/small/DshModal.vue +160 -160
  107. package/src/components/small/DshSteps.vue +141 -141
  108. package/src/components/small/DshTabs.vue +598 -598
  109. package/src/components/small/DshTabsSet.vue +309 -309
  110. package/src/components/small/DshTags.vue +251 -251
  111. package/src/components/small/DshTitle.vue +50 -50
  112. package/src/components/small/render.js +20 -20
  113. package/src/components/unit/DshFormUnit.vue +398 -398
  114. package/src/components/unit/DshListUnit.vue +115 -115
  115. package/src/components/unit/unitMixin.js +86 -86
  116. package/src/data/index.js +4 -4
  117. package/src/index.js +287 -285
  118. package/src/styles/bundle.css +12 -12
  119. package/src/styles/components/BriButton.less +307 -307
  120. package/src/styles/components/BriTable.less +344 -344
  121. package/src/styles/components/DshModal.less +257 -257
  122. package/src/styles/components/index.less +3 -3
  123. package/src/styles/global/animate.less +11 -11
  124. package/src/styles/global/base.less +45 -45
  125. package/src/styles/global/box.less +186 -186
  126. package/src/styles/global/control.less +122 -122
  127. package/src/styles/global/flex.less +282 -282
  128. package/src/styles/global/global.less +8 -8
  129. package/src/styles/global/text.less +59 -59
  130. package/src/styles/global/variables.less +85 -85
  131. package/src/styles/iconfont/iconfont.css +254 -254
  132. package/src/styles/iconfont/iconfont.json +422 -422
  133. package/src/styles/iconfont/iconfont.svg +137 -137
  134. package/src/styles/index.less +26 -26
  135. package/src/styles/reset-easytable.less +21 -21
  136. package/src/styles/reset-iview-controls.less +145 -145
  137. package/src/styles/reset-iview-other.less +49 -49
  138. package/src/styles/reset-iview-variables.less +43 -43
  139. package/src/styles/reset.less +45 -45
  140. package/src/utils/index.js +3 -5
  141. package/lib/0.bri-components.min.js +0 -1
  142. package/lib/1.bri-components.min.js +0 -1
  143. package/lib/10.bri-components.min.js +0 -1
  144. package/lib/11.bri-components.min.js +0 -1
  145. package/lib/2.bri-components.min.js +0 -1
  146. package/lib/3.bri-components.min.js +0 -1
  147. package/lib/4.bri-components.min.js +0 -1
  148. package/lib/5.bri-components.min.js +0 -1
  149. package/lib/6.bri-components.min.js +0 -1
  150. package/lib/7.bri-components.min.js +0 -1
  151. package/lib/8.bri-components.min.js +0 -1
  152. package/lib/9.bri-components.min.js +0 -1
  153. package/lib/bri-components.min.js +0 -18
  154. package/src/utils/table.js +0 -175
@@ -1,712 +1,712 @@
1
- <template>
2
- <!-- 编辑 -->
3
- <div
4
- v-if="canEdit"
5
- class="selectUsers"
6
- >
7
- <bri-tooltip
8
- :content="showVal"
9
- :transfer="true"
10
- >
11
- <div @click="clickInput">
12
- <slot>
13
- <dsh-control-input
14
- :class="commonClass"
15
- :value="curValShowList"
16
- :disabled="disabled"
17
- :heightAuto="isHeightAuto"
18
- :propsObj="selfPropsObj"
19
- @clickItem="clickItem"
20
- @deleteItem="clickDeleteItem"
21
- @clear="clickClear"
22
- ></dsh-control-input>
23
- </slot>
24
- </div>
25
- </bri-tooltip>
26
-
27
- <!-- 点击选中项后的自定义内容 -->
28
- <dsh-render :render="itemTipRender"></dsh-render>
29
-
30
- <!-- 搜索选择框 -->
31
- <dsh-modal
32
- v-if="modalInited"
33
- class="selectUsers-modal"
34
- v-model="showModal"
35
- mode="custom"
36
- :propsObj="modalPropsObj"
37
- @cancel="clickCancel"
38
- >
39
- <div
40
- v-if="showModalContent"
41
- class="selectUsers-modal-wrap"
42
- >
43
- <!-- 上 -->
44
- <div class="head">
45
- <!-- 左 -->
46
- <div class="head-left">
47
- <!-- 上 筛选 -->
48
- <div
49
- v-if="curDepart._key !== '_highSearch'"
50
- class="search"
51
- >
52
- <dsh-input
53
- :value="searchData"
54
- :propsObj="inputPropsObj"
55
- @inputChange="search"
56
- ></dsh-input>
57
- </div>
58
-
59
- <!-- 下 -->
60
- <div class="content">
61
- <!-- 左 部门 -->
62
- <depart-menu
63
- class="content-menu"
64
- :canEdit="false"
65
- :useIcon="false"
66
- :list="departShowList"
67
- @departClick="changeDepart"
68
- ></depart-menu>
69
-
70
- <!-- 右 部门对应的成员 -->
71
- <div class="content-users">
72
- <bri-loading v-if="loading" />
73
- <template v-else>
74
- <!-- 有数据 -->
75
- <div
76
- v-if="userShowList.length"
77
- class="content-users-list"
78
- >
79
- <!-- 上 全选 -->
80
- <div
81
- v-if="multipleMode"
82
- class="content-users-list-check"
83
- >
84
- <Checkbox
85
- :indeterminate="false"
86
- :value="curCheckAll"
87
- @click.prevent.native="clickCheckAll(curCheckAll)"
88
- >全选</Checkbox>
89
- </div>
90
-
91
- <!-- 下 列表-->
92
- <div class="content-users-list-selects">
93
- <div
94
- v-for="dataItem in userShowList"
95
- :key="dataItem._key"
96
- class="content-users-list-selects-item"
97
- >
98
- <Checkbox
99
- v-model="dataItem.checked"
100
- @on-change="changeSelect(dataItem)"
101
- >
102
- {{ getShowName(dataItem) }}
103
- </Checkbox>
104
- </div>
105
- </div>
106
- </div>
107
-
108
- <!-- 无数据 -->
109
- <div
110
- v-else
111
- class="content-users-nodata"
112
- >
113
- <img
114
- :src="$imageSrcMap.nodata"
115
- alt="该部门暂无人员"
116
- >
117
- <div>
118
- 该部门暂无人员
119
- </div>
120
- </div>
121
- </template>
122
- </div>
123
- </div>
124
- </div>
125
-
126
- <!-- 中 图标 -->
127
- <div class="head-center">
128
- <Icon
129
- class="icon"
130
- type="ios-arrow-forward"
131
- />
132
- </div>
133
-
134
- <!-- 右 已选择项 -->
135
- <div class="head-right">
136
- <div class="list">
137
- <span
138
- v-for="(selectItem, selectIndex) in tmpValList"
139
- :key="selectIndex"
140
- class="list-item"
141
- >
142
- <span class="list-item-name">
143
- {{ getShowName(selectItem) }}
144
- </span>
145
-
146
- <Icon
147
- class="list-item-delete"
148
- type="ios-close-circle"
149
- @click="clickDeleteTmpItem(selectItem, selectIndex, tmpValList)"
150
- />
151
- </span>
152
- </div>
153
- </div>
154
- </div>
155
-
156
- <!-- footer -->
157
- <dsh-buttons
158
- class="footer"
159
- :list="$getOperationList(['canCancel', 'canConfirm'])"
160
- @click="$dispatchEvent($event)"
161
- ></dsh-buttons>
162
- </div>
163
- </dsh-modal>
164
- </div>
165
-
166
- <!-- 查看 -->
167
- <div
168
- v-else
169
- class="selectUsers-show"
170
- >
171
- <!-- 有值 -->
172
- <template v-if="!$isEmptyData(curValShowList)">
173
- <!-- 单元格查看 -->
174
- <template v-if="isUnitShow">
175
- <!-- 高度自由时 -->
176
- <div
177
- v-if="isHeightAuto"
178
- :class="{
179
- ...commonClass,
180
- 'selectUsers-show-auto': true,
181
- 'selectUsers-show-unit': true
182
- }"
183
- >
184
- <template v-for="item in curValShowList">
185
- <img
186
- :src="getAvatarUrl(item)"
187
- :key="item._key"
188
- class="selectUsers-show-unit-img"
189
- />
190
- <span
191
- :key="item._key + 'span'"
192
- class="selectUsers-show-unit-text"
193
- >
194
- {{ getShowName(item) }}
195
- </span>
196
- </template>
197
- </div>
198
-
199
- <!-- 高度不自由(不换行) -->
200
- <bri-tooltip
201
- v-else
202
- :content="showVal"
203
- :transfer="true"
204
- >
205
- <div :class="{
206
- ...commonClass,
207
- 'selectUsers-show-ellipsis': true,
208
- 'selectUsers-show-unit': true
209
- }">
210
- <template v-for="item in curValShowList">
211
- <img
212
- :src="getAvatarUrl(item)"
213
- :key="item._key"
214
- class="selectUsers-show-unit-img"
215
- />
216
- <span
217
- :key="item._key + 'span'"
218
- class="selectUsers-show-unit-text"
219
- >
220
- {{ getShowName(item) }}
221
- </span>
222
- </template>
223
- </div>
224
- </bri-tooltip>
225
- </template>
226
-
227
- <!-- 表单查看 -->
228
- <template v-else>
229
- <!-- 高度自由时 -->
230
- <dsh-tags
231
- v-if="isHeightAuto"
232
- :class="{
233
- ...commonClass,
234
- 'selectUsers-show-auto': true
235
- }"
236
- itemClass="selectUsers-show-auto-tag"
237
- :list="curValShowList"
238
- ></dsh-tags>
239
-
240
- <!-- 高度不自由(不换行) -->
241
- <bri-tooltip
242
- v-else
243
- :content="showVal"
244
- :transfer="true"
245
- >
246
- <dsh-tags
247
- :class="{
248
- ...commonClass,
249
- 'selectUsers-show-ellipsis': true
250
- }"
251
- itemClass="selectUsers-show-ellipsis-tag"
252
- :list="curValShowList"
253
- ></dsh-tags>
254
- </bri-tooltip>
255
- </template>
256
- </template>
257
-
258
- <!-- 无值 -->
259
- <div
260
- v-else
261
- :class="commonClass"
262
- >
263
- {{ emptyShowVal }}
264
- </div>
265
- </div>
266
- </template>
267
-
268
- <script>
269
- import userAndDepartMixin from "../../mixins/userAndDepartMixin.js";
270
- import departMenu from "./departMenu.vue";
271
-
272
- export default {
273
- name: "selectUsers",
274
- mixins: [
275
- userAndDepartMixin
276
- ],
277
- components: {
278
- departMenu
279
- },
280
- props: {},
281
- data () {
282
- return {
283
- // 弹框
284
- modalPropsObj: {
285
- title: "选择成员",
286
- showSlotClose: false,
287
- closable: true,
288
- class: "bri-modal-center"
289
- },
290
- inputPropsObj: {
291
- _name: "成员名称",
292
- _key: "name",
293
- _search: true,
294
- _clearable: false
295
- },
296
-
297
- curDepart: {
298
- _key: "",
299
- name: "全部",
300
- is_leaf: true,
301
- level: 1
302
- },
303
- highUserList: [
304
- {
305
- _key: "dyn_myself",
306
- realname: "当前用户"
307
- }
308
- ],
309
- userList: [],
310
- highList: [
311
- {
312
- _key: "_highSearch",
313
- name: "高级选项",
314
- level: 1,
315
- is_leaf: true
316
- }
317
- ],
318
-
319
- imageResizeConfig: {
320
- m: "fixed",
321
- w: 18,
322
- h: 18
323
- }
324
- };
325
- },
326
- computed: {
327
- selfBasePropsObj () {
328
- return {
329
- _icon: this.propsObj._multiple === true ? "ios-people" : "ios-person"
330
- };
331
- },
332
- isCompAdmin () {
333
- return (JSON.parse(sessionStorage.getItem("userData")) || {}).isCompAdmin || this.selfPropsObj._isCompAdmin;
334
- },
335
-
336
- // 展示的部门
337
- departShowList () {
338
- return [
339
- ...(this.highSearch ? this.highList : []),
340
- {
341
- name: "全部",
342
- _key: "",
343
- level: 1,
344
- is_leaf: true
345
- },
346
- ...this.selfDepartList,
347
- ...(
348
- this.isCompAdmin
349
- ? [
350
- {
351
- name: "离职人员",
352
- _key: "_resign",
353
- level: 1,
354
- is_leaf: true
355
- }
356
- ]
357
- : []
358
- )
359
- ];
360
- },
361
- allDepartShowKeys () {
362
- const loop = (arr = []) => {
363
- return arr.reduce((totalList, item) => {
364
- return [
365
- ...totalList,
366
- item,
367
- ...loop(item.children)
368
- ];
369
- }, []);
370
- };
371
-
372
- return loop(this.departShowList).map(item => item._key);
373
- },
374
- userShowList () {
375
- // 有部门过滤就只显示对应的部门,无过滤就涌全部用户(包含无部门用户)
376
- let list = this.filterVals.length || this.cascaderVals.length
377
- ? this.userList.filter(item => this.allDepartShowKeys.includes(item.departmentKey))
378
- : this.userList;
379
-
380
- list = this.curDepart._key === "_highSearch"
381
- ? this.highUserList
382
- : this.curDepart._key === "_resign"
383
- ? this.userList
384
- : !this.curDepart._key
385
- ? list
386
- : list.filter(item => item.departmentKey === this.curDepart._key);
387
-
388
- return this.transformShowList(list, this.tmpValKeys);
389
- },
390
- userKeys () {
391
- return this.userShowList.map(item => item._key);
392
- },
393
-
394
- curCheckAll () {
395
- return this.userKeys.length && this.userKeys.every(userKey =>
396
- this.tmpValKeys.includes(userKey)
397
- );
398
- },
399
- curValShowList () {
400
- return this.curValList;
401
- }
402
- },
403
- created () {},
404
- methods: {
405
- /* ---------- 弹框里 --------- */
406
- // 选择部门
407
- changeDepart (depart) {
408
- if (this.curDepart._key !== depart._key) {
409
- if (depart._key === "_resign") {
410
- this.curDepart = depart;
411
- this.getListData();
412
- } else {
413
- if (this.curDepart._key === "_resign") {
414
- this.curDepart = depart;
415
- this.getListData();
416
- } else {
417
- this.curDepart = depart;
418
- }
419
- }
420
- }
421
- },
422
- clickCheckAll (bool) {
423
- this.tmpValList = bool
424
- ? this.tmpValList.filter(tmpItem => !this.userKeys.includes(tmpItem._key))
425
- : [
426
- ...this.tmpValList,
427
- ...this.userShowList.filter(dataItem => !this.tmpValKeys.includes(dataItem._key))
428
- ];
429
- },
430
-
431
- /* ----------- 接口方法 ------------- */
432
- // 获取显示名
433
- getShowName (selectItem) {
434
- return selectItem.realname || selectItem.name || selectItem.mobile;
435
- },
436
- // 获取头像
437
- getAvatarUrl (selectItem) {
438
- return selectItem.avatarurl
439
- ? this.$imageResize(selectItem.avatarurl, this.imageResizeConfig)
440
- : this.$imageSrcMap.system.boy;
441
- },
442
- getData () {
443
- this.getDepartListData();
444
- this.getListData();
445
- },
446
- getListData () {
447
- this.loading = true;
448
-
449
- this.$https({
450
- url: {
451
- module: "company",
452
- name: this.curDepart._key === "_resign" ? "userResign" : "userIndex"
453
- },
454
- params: {
455
- search: {
456
- realname: this.searchData.name
457
- ? {
458
- $regex: `.*${this.$speciaWord(this.searchData.name)}.*`,
459
- $options: "i"
460
- }
461
- : undefined
462
- },
463
- // department: this.curDepart._key,
464
- pagination: this.pagePropsObj
465
- },
466
- loadingName: "loading",
467
- callback: data => {
468
- this.loadinged = true;
469
-
470
- this.userList = data.list;
471
- this.total = data.total;
472
- }
473
- });
474
- },
475
- getDepartListData () {
476
- this.$https({
477
- url: {
478
- module: "company",
479
- name: "compDepartCascaderAll"
480
- },
481
- params: {
482
- searchString: this.propsObj.searchString
483
- },
484
- callback: data => {
485
- this.departList = data.list;
486
- }
487
- });
488
- }
489
- }
490
- };
491
- </script>
492
-
493
- <style lang="less">
494
- @import url("../../control.less");
495
-
496
- .selectUsers {
497
- #control-show();
498
-
499
- &-show {
500
- &-auto,
501
- &-ellipsis {
502
- margin: 2px 0px;
503
- }
504
-
505
- &-unit {
506
- &-img {
507
- width: 23px;
508
- height: 18px;
509
- padding-left: 5px;
510
- border-radius: 50%;
511
- vertical-align: middle;
512
-
513
- &:first-of-type {
514
- width: 18px;
515
- padding-left: 0px;
516
- }
517
- }
518
-
519
- &-text {
520
- vertical-align: middle;
521
- }
522
- }
523
- }
524
-
525
- // 提示框的
526
- &-tip {
527
- &-modal {
528
- .wrap {
529
- width: 100%;
530
- height: 100%;
531
- display: flex;
532
- flex-direction: column;
533
-
534
- &-content {
535
- flex: 1;
536
- min-height: 0px;
537
- padding: 0px 12px;
538
- overflow: auto;
539
- }
540
-
541
- &-btns {
542
- margin: 10px;
543
- text-align: right;
544
-
545
- .ivu-btn {
546
- font-size: 16px;
547
- font-family: Microsoft YaHei-Semibold, Microsoft YaHei;
548
- font-weight: 600;
549
- border-radius: 4px;
550
- }
551
- }
552
- }
553
- }
554
- }
555
-
556
- // 弹框部分
557
- &-modal {
558
- .ivu-modal {
559
- width: 40%!important;
560
- min-width: 900px!important;
561
- height: 60%;
562
- min-height: 600px;
563
- }
564
-
565
- &-wrap {
566
- width: 100%;
567
- height: 100%;
568
- .dsh-flex-col-start-stretch();
569
-
570
- .head {
571
- width: 100%;
572
- flex: 1;
573
- min-height: 100px;
574
- .dsh-flex-row-start-stretch();
575
-
576
- &-left {
577
- flex: 2;
578
- min-width: 300px;
579
- border: 1px solid #E5E5E5;
580
- background: @white;
581
- overflow-y: auto;
582
-
583
- .search {
584
- padding: 10px 20px;
585
- }
586
-
587
- .content {
588
- display: flex;
589
- height: calc(100% - 52px);
590
- border-top: 1px solid #E5E5E5;
591
-
592
- &-menu {
593
- flex: 4;
594
- height: 100%;
595
- overflow: auto;
596
- }
597
-
598
- &-users {
599
- flex: 3;
600
- border-left: 1px solid #E5E5E5;
601
- position: relative;
602
-
603
- .ivu-checkbox-checked .ivu-checkbox-inner {
604
- border-color: @themeColor;
605
- background-color: @themeColor;
606
- }
607
-
608
- &-list {
609
- height: 100%;
610
- display: flex;
611
- flex-direction: column;
612
-
613
- &-check {
614
- height: 40px;
615
- line-height: 40px;
616
- border-bottom: 1px solid #E5E5E5;
617
- padding-left: 15px;
618
- }
619
-
620
- &-selects {
621
- flex: 1;
622
- overflow: auto;
623
- padding: 15px;
624
-
625
- &-item {
626
- margin-bottom: 5px;
627
- }
628
- }
629
- }
630
-
631
- &-nodata {
632
- position: absolute;
633
- top: 50%;
634
- width: 100%;
635
- text-align: center;
636
- transform: translateY(-50%);
637
- }
638
- }
639
- }
640
- }
641
-
642
- &-center {
643
- width: 100px;
644
- height: 100%;
645
- display: flex;
646
- justify-content: center;
647
- align-items: center;
648
-
649
- .icon {
650
- width: 24px;
651
- height: 24px;
652
- line-height: 24px;
653
- font-size: 18px;
654
- background-color: @themeColor;
655
- border-radius: 50%;
656
- color: #fff;
657
- text-align: center;
658
- }
659
- }
660
-
661
- &-right {
662
- flex: 1;
663
- min-width: 200px;
664
- height: 100%;
665
- padding: 20px;
666
- margin-left: 10px;
667
- border: 1px solid #E5E5E5;
668
- background: @white;
669
- overflow: auto;
670
- display: flex;
671
- flex-direction: column;
672
-
673
- .list {
674
- display: flex;
675
- flex-wrap: wrap;
676
- align-items: center;
677
-
678
- &-item {
679
- max-width: 150px;
680
- height: 24px;
681
- padding: 2px 6px 2px 10px;
682
- margin: 3px 5px;
683
- border-radius: 20px;
684
- background-color: @themeColor;
685
- color: #ffffff;
686
- font-size: 12px;
687
- display: flex;
688
- align-items: center;
689
-
690
- &-name {
691
- .dsh-ellipsis();
692
- }
693
-
694
- &-delete {
695
- padding: 3px;
696
- margin-left: 5px;
697
- font-size: 14px;
698
- cursor: pointer;
699
- }
700
- }
701
- }
702
- }
703
- }
704
-
705
- .footer {
706
- padding-top: 12px;
707
- text-align: right;
708
- }
709
- }
710
- }
711
- }
712
- </style>
1
+ <template>
2
+ <!-- 编辑 -->
3
+ <div
4
+ v-if="canEdit"
5
+ class="selectUsers"
6
+ >
7
+ <bri-tooltip
8
+ :content="showVal"
9
+ :transfer="true"
10
+ >
11
+ <div @click="clickInput">
12
+ <slot>
13
+ <dsh-control-input
14
+ :class="commonClass"
15
+ :value="curValShowList"
16
+ :disabled="disabled"
17
+ :heightAuto="isHeightAuto"
18
+ :propsObj="selfPropsObj"
19
+ @clickItem="clickItem"
20
+ @deleteItem="clickDeleteItem"
21
+ @clear="clickClear"
22
+ ></dsh-control-input>
23
+ </slot>
24
+ </div>
25
+ </bri-tooltip>
26
+
27
+ <!-- 点击选中项后的自定义内容 -->
28
+ <dsh-render :render="itemTipRender"></dsh-render>
29
+
30
+ <!-- 搜索选择框 -->
31
+ <dsh-modal
32
+ v-if="modalInited"
33
+ class="selectUsers-modal"
34
+ v-model="showModal"
35
+ mode="custom"
36
+ :propsObj="modalPropsObj"
37
+ @cancel="clickCancel"
38
+ >
39
+ <div
40
+ v-if="showModalContent"
41
+ class="selectUsers-modal-wrap"
42
+ >
43
+ <!-- 上 -->
44
+ <div class="head">
45
+ <!-- 左 -->
46
+ <div class="head-left">
47
+ <!-- 上 筛选 -->
48
+ <div
49
+ v-if="curDepart._key !== '_highSearch'"
50
+ class="search"
51
+ >
52
+ <dsh-input
53
+ :value="searchData"
54
+ :propsObj="inputPropsObj"
55
+ @inputChange="search"
56
+ ></dsh-input>
57
+ </div>
58
+
59
+ <!-- 下 -->
60
+ <div class="content">
61
+ <!-- 左 部门 -->
62
+ <depart-menu
63
+ class="content-menu"
64
+ :canEdit="false"
65
+ :useIcon="false"
66
+ :list="departShowList"
67
+ @departClick="changeDepart"
68
+ ></depart-menu>
69
+
70
+ <!-- 右 部门对应的成员 -->
71
+ <div class="content-users">
72
+ <bri-loading v-if="loading" />
73
+ <template v-else>
74
+ <!-- 有数据 -->
75
+ <div
76
+ v-if="userShowList.length"
77
+ class="content-users-list"
78
+ >
79
+ <!-- 上 全选 -->
80
+ <div
81
+ v-if="multipleMode"
82
+ class="content-users-list-check"
83
+ >
84
+ <Checkbox
85
+ :indeterminate="false"
86
+ :value="curCheckAll"
87
+ @click.prevent.native="clickCheckAll(curCheckAll)"
88
+ >全选</Checkbox>
89
+ </div>
90
+
91
+ <!-- 下 列表-->
92
+ <div class="content-users-list-selects">
93
+ <div
94
+ v-for="dataItem in userShowList"
95
+ :key="dataItem._key"
96
+ class="content-users-list-selects-item"
97
+ >
98
+ <Checkbox
99
+ v-model="dataItem.checked"
100
+ @on-change="changeSelect(dataItem)"
101
+ >
102
+ {{ getShowName(dataItem) }}
103
+ </Checkbox>
104
+ </div>
105
+ </div>
106
+ </div>
107
+
108
+ <!-- 无数据 -->
109
+ <div
110
+ v-else
111
+ class="content-users-nodata"
112
+ >
113
+ <img
114
+ :src="$imageSrcMap.nodata"
115
+ alt="该部门暂无人员"
116
+ >
117
+ <div>
118
+ 该部门暂无人员
119
+ </div>
120
+ </div>
121
+ </template>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+ <!-- 中 图标 -->
127
+ <div class="head-center">
128
+ <Icon
129
+ class="icon"
130
+ type="ios-arrow-forward"
131
+ />
132
+ </div>
133
+
134
+ <!-- 右 已选择项 -->
135
+ <div class="head-right">
136
+ <div class="list">
137
+ <span
138
+ v-for="(selectItem, selectIndex) in tmpValList"
139
+ :key="selectIndex"
140
+ class="list-item"
141
+ >
142
+ <span class="list-item-name">
143
+ {{ getShowName(selectItem) }}
144
+ </span>
145
+
146
+ <Icon
147
+ class="list-item-delete"
148
+ type="ios-close-circle"
149
+ @click="clickDeleteTmpItem(selectItem, selectIndex, tmpValList)"
150
+ />
151
+ </span>
152
+ </div>
153
+ </div>
154
+ </div>
155
+
156
+ <!-- footer -->
157
+ <dsh-buttons
158
+ class="footer"
159
+ :list="$getOperationList(['canCancel', 'canConfirm'])"
160
+ @click="$dispatchEvent($event)"
161
+ ></dsh-buttons>
162
+ </div>
163
+ </dsh-modal>
164
+ </div>
165
+
166
+ <!-- 查看 -->
167
+ <div
168
+ v-else
169
+ class="selectUsers-show"
170
+ >
171
+ <!-- 有值 -->
172
+ <template v-if="!$isEmptyData(curValShowList)">
173
+ <!-- 单元格查看 -->
174
+ <template v-if="isUnitShow">
175
+ <!-- 高度自由时 -->
176
+ <div
177
+ v-if="isHeightAuto"
178
+ :class="{
179
+ ...commonClass,
180
+ 'selectUsers-show-auto': true,
181
+ 'selectUsers-show-unit': true
182
+ }"
183
+ >
184
+ <template v-for="item in curValShowList">
185
+ <img
186
+ :src="getAvatarUrl(item)"
187
+ :key="item._key"
188
+ class="selectUsers-show-unit-img"
189
+ />
190
+ <span
191
+ :key="item._key + 'span'"
192
+ class="selectUsers-show-unit-text"
193
+ >
194
+ {{ getShowName(item) }}
195
+ </span>
196
+ </template>
197
+ </div>
198
+
199
+ <!-- 高度不自由(不换行) -->
200
+ <bri-tooltip
201
+ v-else
202
+ :content="showVal"
203
+ :transfer="true"
204
+ >
205
+ <div :class="{
206
+ ...commonClass,
207
+ 'selectUsers-show-ellipsis': true,
208
+ 'selectUsers-show-unit': true
209
+ }">
210
+ <template v-for="item in curValShowList">
211
+ <img
212
+ :src="getAvatarUrl(item)"
213
+ :key="item._key"
214
+ class="selectUsers-show-unit-img"
215
+ />
216
+ <span
217
+ :key="item._key + 'span'"
218
+ class="selectUsers-show-unit-text"
219
+ >
220
+ {{ getShowName(item) }}
221
+ </span>
222
+ </template>
223
+ </div>
224
+ </bri-tooltip>
225
+ </template>
226
+
227
+ <!-- 表单查看 -->
228
+ <template v-else>
229
+ <!-- 高度自由时 -->
230
+ <dsh-tags
231
+ v-if="isHeightAuto"
232
+ :class="{
233
+ ...commonClass,
234
+ 'selectUsers-show-auto': true
235
+ }"
236
+ itemClass="selectUsers-show-auto-tag"
237
+ :list="curValShowList"
238
+ ></dsh-tags>
239
+
240
+ <!-- 高度不自由(不换行) -->
241
+ <bri-tooltip
242
+ v-else
243
+ :content="showVal"
244
+ :transfer="true"
245
+ >
246
+ <dsh-tags
247
+ :class="{
248
+ ...commonClass,
249
+ 'selectUsers-show-ellipsis': true
250
+ }"
251
+ itemClass="selectUsers-show-ellipsis-tag"
252
+ :list="curValShowList"
253
+ ></dsh-tags>
254
+ </bri-tooltip>
255
+ </template>
256
+ </template>
257
+
258
+ <!-- 无值 -->
259
+ <div
260
+ v-else
261
+ :class="commonClass"
262
+ >
263
+ {{ emptyShowVal }}
264
+ </div>
265
+ </div>
266
+ </template>
267
+
268
+ <script>
269
+ import userAndDepartMixin from "../../mixins/userAndDepartMixin.js";
270
+ import departMenu from "./departMenu.vue";
271
+
272
+ export default {
273
+ name: "selectUsers",
274
+ mixins: [
275
+ userAndDepartMixin
276
+ ],
277
+ components: {
278
+ departMenu
279
+ },
280
+ props: {},
281
+ data () {
282
+ return {
283
+ // 弹框
284
+ modalPropsObj: {
285
+ title: "选择成员",
286
+ showSlotClose: false,
287
+ closable: true,
288
+ class: "bri-modal-center"
289
+ },
290
+ inputPropsObj: {
291
+ _name: "成员名称",
292
+ _key: "name",
293
+ _search: true,
294
+ _clearable: false
295
+ },
296
+
297
+ curDepart: {
298
+ _key: "",
299
+ name: "全部",
300
+ is_leaf: true,
301
+ level: 1
302
+ },
303
+ highUserList: [
304
+ {
305
+ _key: "dyn_myself",
306
+ realname: "当前用户"
307
+ }
308
+ ],
309
+ userList: [],
310
+ highList: [
311
+ {
312
+ _key: "_highSearch",
313
+ name: "高级选项",
314
+ level: 1,
315
+ is_leaf: true
316
+ }
317
+ ],
318
+
319
+ imageResizeConfig: {
320
+ m: "fixed",
321
+ w: 18,
322
+ h: 18
323
+ }
324
+ };
325
+ },
326
+ computed: {
327
+ selfBasePropsObj () {
328
+ return {
329
+ _icon: this.propsObj._multiple === true ? "ios-people" : "ios-person"
330
+ };
331
+ },
332
+ isCompAdmin () {
333
+ return (JSON.parse(sessionStorage.getItem("userData")) || {}).isCompAdmin || this.selfPropsObj._isCompAdmin;
334
+ },
335
+
336
+ // 展示的部门
337
+ departShowList () {
338
+ return [
339
+ ...(this.highSearch ? this.highList : []),
340
+ {
341
+ name: "全部",
342
+ _key: "",
343
+ level: 1,
344
+ is_leaf: true
345
+ },
346
+ ...this.selfDepartList,
347
+ ...(
348
+ this.isCompAdmin
349
+ ? [
350
+ {
351
+ name: "离职人员",
352
+ _key: "_resign",
353
+ level: 1,
354
+ is_leaf: true
355
+ }
356
+ ]
357
+ : []
358
+ )
359
+ ];
360
+ },
361
+ allDepartShowKeys () {
362
+ const loop = (arr = []) => {
363
+ return arr.reduce((totalList, item) => {
364
+ return [
365
+ ...totalList,
366
+ item,
367
+ ...loop(item.children)
368
+ ];
369
+ }, []);
370
+ };
371
+
372
+ return loop(this.departShowList).map(item => item._key);
373
+ },
374
+ userShowList () {
375
+ // 有部门过滤就只显示对应的部门,无过滤就涌全部用户(包含无部门用户)
376
+ let list = this.filterVals.length || this.cascaderVals.length
377
+ ? this.userList.filter(item => this.allDepartShowKeys.includes(item.departmentKey))
378
+ : this.userList;
379
+
380
+ list = this.curDepart._key === "_highSearch"
381
+ ? this.highUserList
382
+ : this.curDepart._key === "_resign"
383
+ ? this.userList
384
+ : !this.curDepart._key
385
+ ? list
386
+ : list.filter(item => item.departmentKey === this.curDepart._key);
387
+
388
+ return this.transformShowList(list, this.tmpValKeys);
389
+ },
390
+ userKeys () {
391
+ return this.userShowList.map(item => item._key);
392
+ },
393
+
394
+ curCheckAll () {
395
+ return this.userKeys.length && this.userKeys.every(userKey =>
396
+ this.tmpValKeys.includes(userKey)
397
+ );
398
+ },
399
+ curValShowList () {
400
+ return this.curValList;
401
+ }
402
+ },
403
+ created () {},
404
+ methods: {
405
+ /* ---------- 弹框里 --------- */
406
+ // 选择部门
407
+ changeDepart (depart) {
408
+ if (this.curDepart._key !== depart._key) {
409
+ if (depart._key === "_resign") {
410
+ this.curDepart = depart;
411
+ this.getListData();
412
+ } else {
413
+ if (this.curDepart._key === "_resign") {
414
+ this.curDepart = depart;
415
+ this.getListData();
416
+ } else {
417
+ this.curDepart = depart;
418
+ }
419
+ }
420
+ }
421
+ },
422
+ clickCheckAll (bool) {
423
+ this.tmpValList = bool
424
+ ? this.tmpValList.filter(tmpItem => !this.userKeys.includes(tmpItem._key))
425
+ : [
426
+ ...this.tmpValList,
427
+ ...this.userShowList.filter(dataItem => !this.tmpValKeys.includes(dataItem._key))
428
+ ];
429
+ },
430
+
431
+ /* ----------- 接口方法 ------------- */
432
+ // 获取显示名
433
+ getShowName (selectItem) {
434
+ return selectItem.realname || selectItem.name || selectItem.mobile;
435
+ },
436
+ // 获取头像
437
+ getAvatarUrl (selectItem) {
438
+ return selectItem.avatarurl
439
+ ? this.$imageResize(selectItem.avatarurl, this.imageResizeConfig)
440
+ : this.$imageSrcMap.system.boy;
441
+ },
442
+ getData () {
443
+ this.getDepartListData();
444
+ this.getListData();
445
+ },
446
+ getListData () {
447
+ this.loading = true;
448
+
449
+ this.$https({
450
+ url: {
451
+ module: "company",
452
+ name: this.curDepart._key === "_resign" ? "userResign" : "userIndex"
453
+ },
454
+ params: {
455
+ search: {
456
+ realname: this.searchData.name
457
+ ? {
458
+ $regex: `.*${this.$speciaWord(this.searchData.name)}.*`,
459
+ $options: "i"
460
+ }
461
+ : undefined
462
+ },
463
+ // department: this.curDepart._key,
464
+ pagination: this.pagePropsObj
465
+ },
466
+ loadingName: "loading",
467
+ callback: data => {
468
+ this.loadinged = true;
469
+
470
+ this.userList = data.list;
471
+ this.total = data.total;
472
+ }
473
+ });
474
+ },
475
+ getDepartListData () {
476
+ this.$https({
477
+ url: {
478
+ module: "company",
479
+ name: "compDepartCascaderAll"
480
+ },
481
+ params: {
482
+ searchString: this.propsObj.searchString
483
+ },
484
+ callback: data => {
485
+ this.departList = data.list;
486
+ }
487
+ });
488
+ }
489
+ }
490
+ };
491
+ </script>
492
+
493
+ <style lang="less">
494
+ @import url("../../control.less");
495
+
496
+ .selectUsers {
497
+ #control-show();
498
+
499
+ &-show {
500
+ &-auto,
501
+ &-ellipsis {
502
+ margin: 2px 0px;
503
+ }
504
+
505
+ &-unit {
506
+ &-img {
507
+ width: 23px;
508
+ height: 18px;
509
+ padding-left: 5px;
510
+ border-radius: 50%;
511
+ vertical-align: middle;
512
+
513
+ &:first-of-type {
514
+ width: 18px;
515
+ padding-left: 0px;
516
+ }
517
+ }
518
+
519
+ &-text {
520
+ vertical-align: middle;
521
+ }
522
+ }
523
+ }
524
+
525
+ // 提示框的
526
+ &-tip {
527
+ &-modal {
528
+ .wrap {
529
+ width: 100%;
530
+ height: 100%;
531
+ display: flex;
532
+ flex-direction: column;
533
+
534
+ &-content {
535
+ flex: 1;
536
+ min-height: 0px;
537
+ padding: 0px 12px;
538
+ overflow: auto;
539
+ }
540
+
541
+ &-btns {
542
+ margin: 10px;
543
+ text-align: right;
544
+
545
+ .ivu-btn {
546
+ font-size: 16px;
547
+ font-family: Microsoft YaHei-Semibold, Microsoft YaHei;
548
+ font-weight: 600;
549
+ border-radius: 4px;
550
+ }
551
+ }
552
+ }
553
+ }
554
+ }
555
+
556
+ // 弹框部分
557
+ &-modal {
558
+ .ivu-modal {
559
+ width: 40%!important;
560
+ min-width: 900px!important;
561
+ height: 60%;
562
+ min-height: 600px;
563
+ }
564
+
565
+ &-wrap {
566
+ width: 100%;
567
+ height: 100%;
568
+ .dsh-flex-col-start-stretch();
569
+
570
+ .head {
571
+ width: 100%;
572
+ flex: 1;
573
+ min-height: 100px;
574
+ .dsh-flex-row-start-stretch();
575
+
576
+ &-left {
577
+ flex: 2;
578
+ min-width: 300px;
579
+ border: 1px solid #E5E5E5;
580
+ background: @white;
581
+ overflow-y: auto;
582
+
583
+ .search {
584
+ padding: 10px 20px;
585
+ }
586
+
587
+ .content {
588
+ display: flex;
589
+ height: calc(100% - 52px);
590
+ border-top: 1px solid #E5E5E5;
591
+
592
+ &-menu {
593
+ flex: 4;
594
+ height: 100%;
595
+ overflow: auto;
596
+ }
597
+
598
+ &-users {
599
+ flex: 3;
600
+ border-left: 1px solid #E5E5E5;
601
+ position: relative;
602
+
603
+ .ivu-checkbox-checked .ivu-checkbox-inner {
604
+ border-color: @themeColor;
605
+ background-color: @themeColor;
606
+ }
607
+
608
+ &-list {
609
+ height: 100%;
610
+ display: flex;
611
+ flex-direction: column;
612
+
613
+ &-check {
614
+ height: 40px;
615
+ line-height: 40px;
616
+ border-bottom: 1px solid #E5E5E5;
617
+ padding-left: 15px;
618
+ }
619
+
620
+ &-selects {
621
+ flex: 1;
622
+ overflow: auto;
623
+ padding: 15px;
624
+
625
+ &-item {
626
+ margin-bottom: 5px;
627
+ }
628
+ }
629
+ }
630
+
631
+ &-nodata {
632
+ position: absolute;
633
+ top: 50%;
634
+ width: 100%;
635
+ text-align: center;
636
+ transform: translateY(-50%);
637
+ }
638
+ }
639
+ }
640
+ }
641
+
642
+ &-center {
643
+ width: 100px;
644
+ height: 100%;
645
+ display: flex;
646
+ justify-content: center;
647
+ align-items: center;
648
+
649
+ .icon {
650
+ width: 24px;
651
+ height: 24px;
652
+ line-height: 24px;
653
+ font-size: 18px;
654
+ background-color: @themeColor;
655
+ border-radius: 50%;
656
+ color: #fff;
657
+ text-align: center;
658
+ }
659
+ }
660
+
661
+ &-right {
662
+ flex: 1;
663
+ min-width: 200px;
664
+ height: 100%;
665
+ padding: 20px;
666
+ margin-left: 10px;
667
+ border: 1px solid #E5E5E5;
668
+ background: @white;
669
+ overflow: auto;
670
+ display: flex;
671
+ flex-direction: column;
672
+
673
+ .list {
674
+ display: flex;
675
+ flex-wrap: wrap;
676
+ align-items: center;
677
+
678
+ &-item {
679
+ max-width: 150px;
680
+ height: 24px;
681
+ padding: 2px 6px 2px 10px;
682
+ margin: 3px 5px;
683
+ border-radius: 20px;
684
+ background-color: @themeColor;
685
+ color: #ffffff;
686
+ font-size: 12px;
687
+ display: flex;
688
+ align-items: center;
689
+
690
+ &-name {
691
+ .dsh-ellipsis();
692
+ }
693
+
694
+ &-delete {
695
+ padding: 3px;
696
+ margin-left: 5px;
697
+ font-size: 14px;
698
+ cursor: pointer;
699
+ }
700
+ }
701
+ }
702
+ }
703
+ }
704
+
705
+ .footer {
706
+ padding-top: 12px;
707
+ text-align: right;
708
+ }
709
+ }
710
+ }
711
+ }
712
+ </style>