eoss-ui 0.8.38 → 0.8.40

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 (100) hide show
  1. package/lib/eoss-ui.common.js +1326 -1617
  2. package/lib/flow-group.js +2 -2
  3. package/lib/flow-list.js +83 -22
  4. package/lib/flow.js +874 -763
  5. package/lib/index.js +1 -1
  6. package/lib/selector-panel.js +189 -110
  7. package/lib/selector.js +167 -699
  8. package/lib/theme-chalk/flow-list.css +1 -1
  9. package/lib/theme-chalk/flow.css +1 -1
  10. package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
  11. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  12. package/lib/theme-chalk/form.css +1 -1
  13. package/lib/theme-chalk/index.css +1 -1
  14. package/lib/theme-chalk/selector-panel.css +1 -1
  15. package/lib/theme-chalk/selector.css +1 -1
  16. package/lib/theme-chalk/tree.css +1 -1
  17. package/package.json +2 -2
  18. package/packages/flow/src/component/taskUnionExamine.vue +821 -771
  19. package/packages/flow/src/flow.vue +4549 -4526
  20. package/packages/flow/src/main.vue +4416 -4411
  21. package/packages/flow/src/selectUser.vue +2 -0
  22. package/packages/flow/src/startTaskRead.vue +718 -718
  23. package/packages/flow-group/src/main.vue +756 -756
  24. package/packages/flow-list/src/main.vue +72 -14
  25. package/packages/selector/src/main.vue +615 -761
  26. package/packages/selector-panel/src/main.vue +1071 -1036
  27. package/packages/selector-panel/src/tree.vue +24 -18
  28. package/packages/theme-chalk/lib/archives.css +1 -0
  29. package/packages/theme-chalk/lib/base.css +1 -0
  30. package/packages/theme-chalk/lib/button-group.css +1 -0
  31. package/packages/theme-chalk/lib/button.css +1 -0
  32. package/packages/theme-chalk/lib/calendar.css +1 -0
  33. package/packages/theme-chalk/lib/calogin.css +0 -0
  34. package/packages/theme-chalk/lib/card.css +1 -0
  35. package/packages/theme-chalk/lib/cascader.css +0 -0
  36. package/packages/theme-chalk/lib/checkbox-group.css +1 -0
  37. package/packages/theme-chalk/lib/clients.css +1 -0
  38. package/packages/theme-chalk/lib/data-table-form.css +1 -0
  39. package/packages/theme-chalk/lib/data-table.css +1 -0
  40. package/packages/theme-chalk/lib/date-picker.css +1 -0
  41. package/packages/theme-chalk/lib/dialog.css +1 -0
  42. package/packages/theme-chalk/lib/enable-drag.css +1 -0
  43. package/packages/theme-chalk/lib/enterprise.css +1 -0
  44. package/packages/theme-chalk/lib/error-page.css +1 -0
  45. package/packages/theme-chalk/lib/flow-chart.css +0 -0
  46. package/packages/theme-chalk/lib/flow-group.css +1 -0
  47. package/packages/theme-chalk/lib/flow-list.css +1 -0
  48. package/packages/theme-chalk/lib/flow.css +1 -0
  49. package/packages/theme-chalk/lib/fonts/iconfont.ttf +0 -0
  50. package/packages/theme-chalk/lib/fonts/iconfont.woff +0 -0
  51. package/packages/theme-chalk/lib/form.css +1 -0
  52. package/packages/theme-chalk/lib/handle-user.css +1 -0
  53. package/packages/theme-chalk/lib/handler.css +1 -0
  54. package/packages/theme-chalk/lib/icon.css +1 -0
  55. package/packages/theme-chalk/lib/icons.css +1 -0
  56. package/packages/theme-chalk/lib/index.css +1 -0
  57. package/packages/theme-chalk/lib/input-number.css +0 -0
  58. package/packages/theme-chalk/lib/input.css +1 -0
  59. package/packages/theme-chalk/lib/label.css +1 -0
  60. package/packages/theme-chalk/lib/layout.css +1 -0
  61. package/packages/theme-chalk/lib/login.css +1 -0
  62. package/packages/theme-chalk/lib/main.css +1 -0
  63. package/packages/theme-chalk/lib/menu.css +1 -0
  64. package/packages/theme-chalk/lib/nav.css +1 -0
  65. package/packages/theme-chalk/lib/notify.css +0 -0
  66. package/packages/theme-chalk/lib/page.css +1 -0
  67. package/packages/theme-chalk/lib/pagination.css +1 -0
  68. package/packages/theme-chalk/lib/player.css +1 -0
  69. package/packages/theme-chalk/lib/qr-code.css +1 -0
  70. package/packages/theme-chalk/lib/radio-group.css +1 -0
  71. package/packages/theme-chalk/lib/retrial-auth.css +1 -0
  72. package/packages/theme-chalk/lib/select-ganged.css +1 -0
  73. package/packages/theme-chalk/lib/select.css +1 -0
  74. package/packages/theme-chalk/lib/selector-panel.css +1 -0
  75. package/packages/theme-chalk/lib/selector.css +1 -0
  76. package/packages/theme-chalk/lib/simplicity-top.css +1 -0
  77. package/packages/theme-chalk/lib/simplicity.css +1 -0
  78. package/packages/theme-chalk/lib/sizer.css +1 -0
  79. package/packages/theme-chalk/lib/steps.css +1 -0
  80. package/packages/theme-chalk/lib/switch.css +1 -0
  81. package/packages/theme-chalk/lib/table-form.css +0 -0
  82. package/packages/theme-chalk/lib/tabs-panel.css +0 -0
  83. package/packages/theme-chalk/lib/tabs.css +1 -0
  84. package/packages/theme-chalk/lib/tips.css +1 -0
  85. package/packages/theme-chalk/lib/toolbar.css +1 -0
  86. package/packages/theme-chalk/lib/tree-group.css +1 -0
  87. package/packages/theme-chalk/lib/tree.css +1 -0
  88. package/packages/theme-chalk/lib/upload.css +1 -0
  89. package/packages/theme-chalk/lib/wujie.css +0 -0
  90. package/packages/theme-chalk/lib/wxlogin.css +1 -0
  91. package/packages/theme-chalk/src/flow-list.scss +61 -55
  92. package/packages/theme-chalk/src/flow.scss +16 -2
  93. package/packages/theme-chalk/src/fonts/iconfont.ttf +0 -0
  94. package/packages/theme-chalk/src/fonts/iconfont.woff +0 -0
  95. package/packages/theme-chalk/src/form.scss +5 -1
  96. package/packages/theme-chalk/src/selector-panel.scss +36 -6
  97. package/packages/theme-chalk/src/selector.scss +66 -115
  98. package/packages/theme-chalk/src/tree.scss +1 -1
  99. package/src/index.js +1 -1
  100. package/packages/theme-chalk/gulpfile.js +0 -25
@@ -1,761 +1,615 @@
1
- <template>
2
- <div
3
- v-if="isRender"
4
- class="es-selector"
5
- ref="esSelector"
6
- :class="{ 'es-pointer': !readonly && !filterable }"
7
- v-clickoutside="handleClose"
8
- >
9
- <template v-if="form">
10
- <el-button v-if="button" v-bind="button" @click="openDialog">
11
- <slot>
12
- <es-icon v-if="icon" :contents="icon"></es-icon>
13
- <template v-else>选择</template>
14
- </slot>
15
- </el-button>
16
- <template v-else>
17
- <div
18
- :class="[
19
- selectorSize ? 'el-select--' + selectorSize : 'es-selector-box',
20
- { 'es-selector-search': filterable }
21
- ]"
22
- @click.stop="toggleMenu"
23
- >
24
- <div
25
- v-if="multiple"
26
- ref="tags"
27
- class="el-select__tags"
28
- :class="{ 'es-selector-edit': !readonly }"
29
- >
30
- <div
31
- v-if="collapseTags && selected.length"
32
- class="es-selector-tags"
33
- :class="{ 'es-selector-more': selected.length > 1 }"
34
- >
35
- <el-tag
36
- v-for="(item, index) in selected.slice(
37
- 0,
38
- collapseTags === true ? 1 : collapseTags
39
- )"
40
- :key="getValueKey(item)"
41
- :closable="
42
- !selectorDisabled && !readonly && selected.length > min
43
- "
44
- type="info"
45
- disable-transitions
46
- @close="deleteTag($event, item, index)"
47
- >
48
- <span class="el-select__tags-text">{{ getLabel(item) }}</span>
49
- </el-tag>
50
-
51
- <el-tag
52
- v-if="
53
- selected.length > (collapseTags === true ? 1 : collapseTags)
54
- "
55
- :closable="false"
56
- type="info"
57
- disable-transitions
58
- class="es-tags-more"
59
- >
60
- <span class="el-select__tags-text"
61
- >+
62
- {{
63
- selected.length - (collapseTags === true ? 1 : collapseTags)
64
- }}</span
65
- >
66
- </el-tag>
67
- </div>
68
- <transition-group v-else @after-leave="resetInputHeight">
69
- <el-tag
70
- v-for="(item, index) in selected"
71
- :key="getValueKey(item)"
72
- :closable="
73
- !selectorDisabled && !readonly && selected.length > min
74
- "
75
- type="info"
76
- disable-transitions
77
- @close="deleteTag($event, item, index)"
78
- >
79
- <span class="el-select__tags-text">{{ getLabel(item) }}</span>
80
- </el-tag>
81
- </transition-group>
82
- </div>
83
- <div ref="reference" class="es-input__inner" v-if="readonly">
84
- <template v-if="!multiple">{{ selectedLabel }}</template>
85
- </div>
86
- <template v-else>
87
- <template v-if="multiple">
88
- <el-input
89
- type="text"
90
- ref="reference"
91
- autocomplete="off"
92
- v-model="words"
93
- :readonly="filterable ? false : true"
94
- :id="id"
95
- :placeholder="currentPlaceholder"
96
- :size="selectorSize"
97
- :disabled="selectorDisabled"
98
- :class="{
99
- 'is-focus': visible,
100
- 'es-plain': plain,
101
- 'es-pointer': !filterable,
102
- 'es-zindex-2': focus
103
- }"
104
- :tabindex="tabindex"
105
- v-popover:popover
106
- @dblclick.native="openDialog"
107
- @focus="handleFocus"
108
- @blur="handleBlur"
109
- >
110
- <template slot="append">
111
- <el-button
112
- ref="openDialog"
113
- v-if="filterable || showButton"
114
- @click.stop="openDialog"
115
- >
116
- <slot>
117
- <es-icon v-if="icon" :contents="icon"></es-icon>
118
- <template v-else>选择</template>
119
- </slot>
120
- </el-button>
121
- </template>
122
- </el-input>
123
- <el-input
124
- v-model="selectedLabel"
125
- readonly
126
- :name="name"
127
- type="text"
128
- v-show="false"
129
- ></el-input>
130
- </template>
131
- <el-input
132
- v-else
133
- v-model="selectedLabel"
134
- type="text"
135
- ref="reference"
136
- autocomplete="off"
137
- :clearable="clearable"
138
- showClearIcon
139
- :name="name"
140
- :readonly="filterable ? false : true"
141
- :active="actived"
142
- :id="id"
143
- :placeholder="currentPlaceholder"
144
- :size="selectorSize"
145
- :disabled="selectorDisabled"
146
- :class="{
147
- 'is-focus': visible,
148
- 'es-plain': this.plain,
149
- 'es-pointer': !filterable
150
- }"
151
- :tabindex="tabindex"
152
- @dblclick.native="openDialog"
153
- @clear="handleClear"
154
- >
155
- <template slot="append">
156
- <el-button
157
- ref="openDialog"
158
- v-if="filterable || showButton"
159
- @click.stop="openDialog"
160
- >
161
- <slot>
162
- <es-icon v-if="icon" :contents="icon"></es-icon>
163
- <template v-else>选择</template>
164
- </slot>
165
- </el-button>
166
- </template>
167
- </el-input>
168
- </template>
169
- </div>
170
- <el-popover
171
- v-model="show"
172
- placement="bottom-start"
173
- trigger="manual"
174
- popper-class="es-selector-popover"
175
- :width="minWidth"
176
- :queryParent="true"
177
- :reference="reference"
178
- :arrow-offset="20"
179
- >
180
- <el-scrollbar
181
- tag="ul"
182
- wrap-class="es-selector-dropdown__wrap"
183
- view-class="es-selector-dropdown__list"
184
- ref="scrollbar"
185
- v-show="options.length"
186
- maxHeight="228"
187
- >
188
- <li
189
- v-for="item in options"
190
- :key="item.id"
191
- @click="handleSelect(item)"
192
- class="es-selector-dropdown-item"
193
- :class="{ 'es-selected': item.selected }"
194
- >
195
- <span>
196
- {{ getDep(item) }}
197
- {{ item[labelKey] }}
198
- </span>
199
- </li>
200
- </el-scrollbar>
201
- <p v-if="options.length == 0" class="el-select-dropdown__empty">
202
- {{ noMatchText }}
203
- </p>
204
- </el-popover>
205
- </template>
206
- </template>
207
- <es-dialog
208
- v-if="!readonly"
209
- :title="title"
210
- :visible.sync="visible"
211
- :width="width"
212
- :height="height"
213
- :css="false"
214
- :append-to-body="true"
215
- :close-on-click-modal="false"
216
- class="es-selector-dialog"
217
- >
218
- <es-selector-panel
219
- v-if="isReset"
220
- v-model="selected"
221
- v-bind="$attrs"
222
- :multiple="multiple"
223
- width="100%"
224
- height="100%"
225
- :value-key="valueKey"
226
- :label-key="labelKey"
227
- :host="host"
228
- :type="types"
229
- :mix="mix"
230
- :isShowLevel3="isShowLevel3"
231
- @tabschage="tabschage"
232
- @click.capture="stopd"
233
- @confirm="handleConfirm"
234
- @cancel="handleCancel"
235
- ></es-selector-panel>
236
- </es-dialog>
237
- </div>
238
- </template>
239
- <script>
240
- import util from 'eoss-ui/src/utils/util.js';
241
- import { getSelectorOrgDetail, getSysParam } from 'eoss-ui/src/config/api.js';
242
- import Clickoutside from 'eoss-element/src/utils/clickoutside';
243
- export default {
244
- name: 'EsSelector',
245
- inheritAttrs: false,
246
- inject: {
247
- elForm: {
248
- default: ''
249
- },
250
- elFormItem: {
251
- default: ''
252
- }
253
- },
254
- directives: { Clickoutside },
255
- props: {
256
- form: {
257
- type: Boolean,
258
- default: true
259
- },
260
- isShowLevel3: {
261
- type: Boolean,
262
- default: true
263
- },
264
- value: [Array, Object],
265
- action: {
266
- type: String,
267
- default: getSelectorOrgDetail
268
- },
269
- host: {
270
- type: String,
271
- default: ''
272
- },
273
- title: {
274
- type: String,
275
- default: '公用选择器'
276
- },
277
- width: {
278
- type: String,
279
- default: '900px'
280
- },
281
- height: {
282
- type: String,
283
- default: '560px'
284
- },
285
- multiple: {
286
- type: Boolean,
287
- default: true
288
- },
289
- valueKey: {
290
- type: String,
291
- default: 'showid'
292
- },
293
- labelKey: {
294
- type: String,
295
- default: 'showname'
296
- },
297
- valueType: {
298
- type: String,
299
- default: 'object',
300
- validator: function (value) {
301
- return ['string', 'object'].includes(value);
302
- }
303
- },
304
- size: String,
305
- id: String,
306
- disabled: Boolean,
307
- clearable: {
308
- type: Boolean,
309
- default: true
310
- },
311
- placeholder: {
312
- type: String,
313
- default: '请选择'
314
- },
315
- autocomplete: {
316
- type: String,
317
- default: 'off'
318
- },
319
- name: String,
320
- readonly: Boolean,
321
- collapseTags: [Boolean, Number],
322
- plain: Boolean,
323
- types: {
324
- type: Array,
325
- default() {
326
- return ['enterprise', 'person'];
327
- }
328
- },
329
- tabindex: {
330
- type: [String, Number],
331
- default: -1
332
- },
333
- //是否显示搜索框
334
- filterable: Boolean,
335
- //搜索列表是否显示部门信息
336
- showFilterListDep: {
337
- type: Boolean,
338
- default: true
339
- },
340
- //是否根据搜索值创建新的数据
341
- createable: Boolean,
342
- showButton: Boolean,
343
- button: Object,
344
- icon: String,
345
- active: String,
346
- keywords: {
347
- type: String,
348
- default: 'namelike'
349
- },
350
- //输入框搜索参数
351
- where: {
352
- type: Object,
353
- default() {
354
- return {
355
- mid: '0-0-0-0-0'
356
- };
357
- }
358
- },
359
- //混选
360
- mix: Boolean,
361
- //混选时是否分类显示
362
- classify: {
363
- type: Boolean,
364
- default: true
365
- },
366
- noMatchText: {
367
- type: String,
368
- default: '无匹配数据'
369
- },
370
- emptySerach: Boolean,
371
- reset: Boolean,
372
- useCaseCode: String,
373
- businessData: [String, Array, Object],
374
- inputHeight: {
375
- type: Number,
376
- default: 40
377
- },
378
- min: {
379
- type: Number,
380
- default: 0
381
- },
382
- select: {
383
- type: Boolean,
384
- default: true
385
- }
386
- },
387
- data() {
388
- return {
389
- selected: [],
390
- visible: false,
391
- menuVisibleOnFocus: false,
392
- inputHovering: false,
393
- styles: {},
394
- words: '',
395
- minWidth: '',
396
- options: '',
397
- show: false,
398
- focus: false,
399
- reference: undefined,
400
- timer: null
401
- };
402
- },
403
- computed: {
404
- isRender() {
405
- let useCaseCodes = util.getStorage('useCaseCodes');
406
- if (useCaseCodes && this.useCaseCode) {
407
- return useCaseCodes.indexOf(this.useCaseCode) > -1;
408
- }
409
- return true;
410
- },
411
- isReset() {
412
- return this.reset ? this.visible : true;
413
- },
414
- _elFormItemSize() {
415
- return (this.elFormItem || {}).elFormItemSize;
416
- },
417
- actived() {
418
- if (this.active) {
419
- return this.active;
420
- }
421
- return this.types[0];
422
- },
423
- selectorSize() {
424
- return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
425
- },
426
- selectorDisabled() {
427
- return this.disabled || (this.elForm || {}).disabled;
428
- },
429
- selectedLabel: {
430
- get() {
431
- if (this.selected) {
432
- if (typeof this.selected === 'string') {
433
- return this.selected;
434
- } else if (util.isObject(this.selected)) {
435
- return this.selected[this.labelKey];
436
- } else if (Array.isArray(this.selected)) {
437
- return this.selected
438
- .map((item) => {
439
- return typeof item === 'string' ? item : item[this.labelKey];
440
- })
441
- .join(',');
442
- }
443
- }
444
- return '';
445
- },
446
- set(val) {
447
- this.selected = [val];
448
- this.words = val;
449
- return val;
450
- }
451
- },
452
- currentPlaceholder() {
453
- if (this.selected && this.selected.length) {
454
- return '';
455
- } else if (this.filterable) {
456
- return '输入关键字搜索';
457
- } else {
458
- return this.placeholder;
459
- }
460
- }
461
- },
462
- watch: {
463
- value: {
464
- immediate: true,
465
- deep: true,
466
- handler(val) {
467
- if (util.isExist(val)) {
468
- if (util.isObject(val)) {
469
- this.selected = [val];
470
- } else {
471
- this.selected = val;
472
- }
473
- } else {
474
- this.selected = [];
475
- }
476
- }
477
- },
478
- selected: {
479
- deep: true,
480
- handler(val) {
481
- this.$emit(
482
- 'change',
483
- Array.isArray(val) ? val : [val],
484
- this.businessData
485
- );
486
- if (this.multiple) {
487
- this.resetInputHeight();
488
- }
489
- }
490
- },
491
- words(val) {
492
- if (this.emptySerach || val !== '') {
493
- clearTimeout(this.timer);
494
- this.timer = setTimeout(this.handleSearch, 500);
495
- }
496
- },
497
- mix(val) {
498
- if (val) {
499
- this.getSysParam();
500
- }
501
- }
502
- },
503
- created() {
504
- this.reference = this.$refs.esSelector;
505
- this.mix && this.getSysParam();
506
- },
507
- mounted() {
508
- this.resetInputHeight();
509
- if (this.filterable) {
510
- this.$nextTick(() => {
511
- this.$refs.reference &&
512
- (this.minWidth = this.$refs.reference.$el.children[0].offsetWidth);
513
- });
514
- }
515
- if (this.$refs.openDialog) {
516
- this.$refs.openDialog.$el.parentNode.addEventListener('click', () => {
517
- this.openDialog();
518
- });
519
- }
520
- },
521
- methods: {
522
- getSysParam() {
523
- if (util.getStorage('sysorgname') && util.getStorage('sysdepname')) {
524
- return;
525
- }
526
- util
527
- .ajax({
528
- url: getSysParam,
529
- params: {
530
- paramCode: 'sysorgname,sysdepname'
531
- }
532
- })
533
- .then((res) => {
534
- if (res.rCode === 0) {
535
- let params = res.results.split(',');
536
- sessionStorage.setItem('sysorgname', params[0]);
537
- sessionStorage.setItem('sysdepname', params[1]);
538
- }
539
- });
540
- },
541
- getDep(res) {
542
- if (!this.showFilterListDep) {
543
- return '';
544
- }
545
- const attr = res.attr ? JSON.parse(res.attr) : null;
546
- return attr && attr.depShortName ? `[${attr.depShortName}]` : '';
547
- },
548
- getValueKey(obj) {
549
- return util.isObject(obj) ? obj[this.valueKey] : obj;
550
- },
551
- toggleMenu() {
552
- if (
553
- !this.selectorDisabled &&
554
- !this.readonly &&
555
- !this.filterable &&
556
- this.select
557
- ) {
558
- this.visible = true;
559
- }
560
- },
561
- openDialog() {
562
- if (!this.selectorDisabled && !this.readonly && this.select) {
563
- this.visible = true;
564
- }
565
- },
566
- handleSearch() {
567
- let options = [];
568
- if (this.createable) {
569
- options = [
570
- {
571
- [this.labelKey]: this.words,
572
- [this.valueKey]: this.words
573
- }
574
- ];
575
- }
576
- if (this.filterable) {
577
- let params = {
578
- type: this.actived
579
- };
580
- params[this.keywords] = this.words;
581
- params = util.extend({}, params, this.where);
582
- util
583
- .ajax({
584
- url: this.action,
585
- params: params
586
- })
587
- .then((res) => {
588
- if (res.rCode === 0) {
589
- this.options = [...options, ...res.results];
590
- if (this.selected.length && this.multiple) {
591
- this.selected.forEach((item) => {
592
- let i = util.indexOfObj(this.options, item, this.valueKey);
593
- if (i > -1) {
594
- this.options[i].selected = true;
595
- }
596
- });
597
- }
598
- this.show = true;
599
- }
600
- })
601
- .catch((err) => {
602
- if (err.message && err.message !== 'canceled') {
603
- this.$message.error(err.message);
604
- }
605
- });
606
- } else if (this.createable) {
607
- this.options = options;
608
- this.show = true;
609
- }
610
- },
611
- handleFocus() {
612
- if (this.filterable) {
613
- this.focus = true;
614
- }
615
- },
616
- handleBlur() {
617
- this.focus = false;
618
- },
619
- tabschage(trees, active) {
620
- this.$emit('tabs-change', trees, active);
621
- },
622
- handleClose(res) {
623
- if (!this.multiple && this.selected[0] === this.words) {
624
- this.selected = [];
625
- }
626
- this.show = false;
627
- },
628
- handleSelect(res) {
629
- this.words = '';
630
- if (!res.selected) {
631
- if (this.multiple) {
632
- if (this.selected.length) {
633
- if (!res.selected) {
634
- res.selected = true;
635
- this.selected.push(res);
636
- this.selected = util.arrUnique(this.selected, this.valueKey);
637
- }
638
- } else {
639
- res.selected = true;
640
- this.selected = [res];
641
- }
642
- } else {
643
- res.selected = true;
644
- if (Array.isArray(this.selected)) {
645
- if (
646
- this.selected[0] &&
647
- typeof this.selected[0] !== 'string' &&
648
- this.selected[0][this.valueKey] !== res[this.valueKey]
649
- ) {
650
- this.selected[0].selected = false;
651
- }
652
- this.selected = [res];
653
- } else {
654
- if (
655
- this.selected &&
656
- typeof this.selected !== 'string' &&
657
- this.selected[this.valueKey] !== res[this.valueKey]
658
- ) {
659
- this.selected.selected = false;
660
- }
661
- this.selected = [res];
662
- }
663
- }
664
- }
665
- this.$emit('input', this.selected);
666
- this.$emit('confirm', this.selected);
667
- },
668
- handleConfirm(res) {
669
- this.visible = false;
670
- let val = util.isObject(res) ? [res] : res;
671
- if (this.mix) {
672
- val.forEach((item, index) => {
673
- val[index]._typeName = util.getTypeName(item.stype);
674
- });
675
- }
676
- this.$emit('input', val);
677
- this.$emit('confirm', val, this.businessData);
678
- let inputChildNodes = this.$refs.reference
679
- ? this.$refs.reference.$el.childNodes
680
- : null;
681
- let input = inputChildNodes
682
- ? [].filter.call(inputChildNodes, (item) => item.tagName === 'INPUT')[0]
683
- : null;
684
- if (input) {
685
- input.focus();
686
- input.blur();
687
- }
688
- if (this.reset) {
689
- this.selected = [];
690
- }
691
- },
692
- handleClear() {
693
- this.$emit('input', []);
694
- this.$emit('clear');
695
- },
696
- handleCancel() {
697
- this.visible = false;
698
- this.$emit('cancel');
699
- },
700
- deleteTag(event, item, index) {
701
- event;
702
- item;
703
- index = index === undefined ? 0 : index;
704
- this.selected.length > this.min && this.selected.splice(index, 1);
705
- },
706
- resetInputHeight() {
707
- if (this.collapseTags) return;
708
- this.$nextTick(() => {
709
- if (!this.$refs.reference) return;
710
- const sizeInMap = this.inputHeight;
711
- let height = '';
712
- if (this.selected !== undefined && this.selected.length === 0) {
713
- height = sizeInMap + 'px';
714
- } else if (this.$refs.tags) {
715
- if (this.$refs.tags.clientHeight > sizeInMap) {
716
- height += this.$refs.tags.clientHeight + 2 + 'px';
717
- } else {
718
- height = sizeInMap + 'px';
719
- }
720
- }
721
- if (height) {
722
- if (this.readonly) {
723
- this.$refs.reference.style.height = height;
724
- } else {
725
- let inputChildNodes = this.$refs.reference.$el.childNodes;
726
- let input = [].filter.call(
727
- inputChildNodes,
728
- (item) => item.tagName === 'INPUT'
729
- )[0];
730
- input.style.height = height;
731
- }
732
- }
733
- });
734
- },
735
- getLabel(res) {
736
- let tag = '';
737
- if (this.mix) {
738
- tag = this.classify?util.getTypeName(res.stype) : '';
739
- } else if (this.showFilterListDep) {
740
- tag = this.getDep(res);
741
- }
742
- return (
743
- tag +
744
- (typeof res == 'string'
745
- ? res
746
- : res[this.labelKey]
747
- ? res[this.labelKey]
748
- : res.label || res[this.valueKey])
749
- );
750
- }
751
- },
752
- beforeDestroy() {
753
- this.$el.removeEventListener('keyup', this.doSearch);
754
- if (this.$refs.openDialog) {
755
- this.$refs.openDialog.$el.parentNode.removeEventListener('click', () => {
756
- this.openDialog();
757
- });
758
- }
759
- }
760
- };
761
- </script>
1
+ <template>
2
+ <div
3
+ v-if="isRender"
4
+ class="es-selector"
5
+ ref="esSelector"
6
+ :class="{ 'is-button': button && !readonly }"
7
+ >
8
+ <template v-if="form">
9
+ <el-button v-if="button && !readonly" v-bind="button" @click="openDialog">
10
+ <slot>
11
+ <es-icon v-if="icon" :contents="icon"></es-icon>
12
+ <template v-else>选择</template>
13
+ </slot>
14
+ </el-button>
15
+ <template v-else>
16
+ <el-autocomplete
17
+ v-if="!(multiple && readonly)"
18
+ v-model="selectedLabel"
19
+ value-key="showname"
20
+ :readonly="readonly"
21
+ :fetch-suggestions="search"
22
+ :placeholder="placeholder"
23
+ :trigger-on-focus="false"
24
+ :get-label="getLabel"
25
+ @select="handleSelect"
26
+ @change="handleChange"
27
+ >
28
+ <el-button
29
+ v-if="!readonly"
30
+ slot="suffix"
31
+ type="text"
32
+ class="es-selector-btn"
33
+ :icon="icon"
34
+ @click.stop="openDialog"
35
+ ></el-button>
36
+ </el-autocomplete>
37
+ <div
38
+ v-if="multiple"
39
+ ref="tags"
40
+ class="es-select__tags"
41
+ :class="{ 'is-edit': !readonly, 'is-show': selected.length }"
42
+ >
43
+ <el-tag
44
+ v-for="(item, index) in selected"
45
+ :key="getValueKey(item)"
46
+ :closable="!selectorDisabled && !readonly && selected.length > min"
47
+ type="info"
48
+ disable-transitions
49
+ @close="deleteTag($event, item, index)"
50
+ >
51
+ <span class="el-select__tags-text">{{ getLabel(item) }}</span>
52
+ </el-tag>
53
+ </div>
54
+ </template>
55
+ </template>
56
+ <es-dialog
57
+ v-if="!readonly"
58
+ :title="title"
59
+ :visible.sync="visible"
60
+ :width="width"
61
+ :height="height"
62
+ :css="false"
63
+ :append-to-body="true"
64
+ :close-on-click-modal="false"
65
+ :destroy-on-close="destroyOnClose"
66
+ class="es-selector-dialog"
67
+ >
68
+ <es-selector-panel
69
+ v-if="isReset"
70
+ v-model="selected"
71
+ v-bind="$attrs"
72
+ :multiple="multiple"
73
+ width="100%"
74
+ height="100%"
75
+ :value-key="valueKey"
76
+ :label-key="labelKey"
77
+ :host="host"
78
+ :type="types"
79
+ :mix="mix"
80
+ :isShowLevel3="isShowLevel3"
81
+ :tree-title="treeTitle"
82
+ :show-switch="showSwitch"
83
+ @tabschage="tabschage"
84
+ @click.capture="stopd"
85
+ @confirm="handleConfirm"
86
+ @cancel="handleCancel"
87
+ ></es-selector-panel>
88
+ </es-dialog>
89
+ </div>
90
+ </template>
91
+ <script>
92
+ import util from 'eoss-ui/src/utils/util.js';
93
+ import { getSelectorOrgDetail, getSysParam } from 'eoss-ui/src/config/api.js';
94
+ import Clickoutside from 'eoss-element/src/utils/clickoutside';
95
+ import { throttle } from 'throttle-debounce';
96
+ export default {
97
+ name: 'EsSelector',
98
+ inheritAttrs: false,
99
+ inject: {
100
+ elForm: {
101
+ default: ''
102
+ },
103
+ elFormItem: {
104
+ default: ''
105
+ }
106
+ },
107
+ directives: { Clickoutside },
108
+ props: {
109
+ form: {
110
+ type: Boolean,
111
+ default: true
112
+ },
113
+ isShowLevel3: {
114
+ type: Boolean,
115
+ default: true
116
+ },
117
+ value: [Array, Object],
118
+ action: {
119
+ type: String,
120
+ default: getSelectorOrgDetail
121
+ },
122
+ host: {
123
+ type: String,
124
+ default: ''
125
+ },
126
+ title: {
127
+ type: String,
128
+ default: '公用选择器'
129
+ },
130
+ width: {
131
+ type: String,
132
+ default: '900px'
133
+ },
134
+ height: {
135
+ type: String,
136
+ default: '560px'
137
+ },
138
+ multiple: {
139
+ type: Boolean,
140
+ default: true
141
+ },
142
+ valueKey: {
143
+ type: String,
144
+ default: 'showid'
145
+ },
146
+ labelKey: {
147
+ type: String,
148
+ default: 'showname'
149
+ },
150
+ valueType: {
151
+ type: String,
152
+ default: 'object',
153
+ validator: function (value) {
154
+ return ['string', 'object'].includes(value);
155
+ }
156
+ },
157
+ size: String,
158
+ id: String,
159
+ disabled: Boolean,
160
+ clearable: {
161
+ type: Boolean,
162
+ default: true
163
+ },
164
+ placeholder: {
165
+ type: String,
166
+ default: '请选择'
167
+ },
168
+ autocomplete: {
169
+ type: String,
170
+ default: 'off'
171
+ },
172
+ name: String,
173
+ readonly: Boolean,
174
+ collapseTags: [Boolean, Number],
175
+ plain: Boolean,
176
+ types: {
177
+ type: Array,
178
+ default() {
179
+ return ['enterprise', 'person'];
180
+ }
181
+ },
182
+ tabindex: {
183
+ type: [String, Number],
184
+ default: -1
185
+ },
186
+ //是否显示搜索框
187
+ filterable: {
188
+ type: Boolean,
189
+ default: true
190
+ },
191
+ //搜索列表是否显示部门信息
192
+ showFilterListDep: Boolean,
193
+ //是否根据搜索值创建新的数据
194
+ createable: Boolean,
195
+ showButton: Boolean,
196
+ button: Object,
197
+ icon: { type: String, default: 'es-icon-sousuorenyuan' },
198
+ active: String,
199
+ keywords: {
200
+ type: String,
201
+ default: 'namelike'
202
+ },
203
+ //输入框搜索参数
204
+ where: {
205
+ type: Object,
206
+ default() {
207
+ return {
208
+ mid: '0-0-0-0-0'
209
+ };
210
+ }
211
+ },
212
+ //混选
213
+ mix: Boolean,
214
+ //混选时是否分类显示
215
+ classify: {
216
+ type: Boolean,
217
+ default: true
218
+ },
219
+ noMatchText: {
220
+ type: String,
221
+ default: '无匹配数据'
222
+ },
223
+ emptySerach: Boolean,
224
+ reset: Boolean,
225
+ useCaseCode: String,
226
+ businessData: [String, Array, Object],
227
+ inputHeight: {
228
+ type: Number,
229
+ default: 40
230
+ },
231
+ min: {
232
+ type: Number,
233
+ default: 0
234
+ },
235
+ select: {
236
+ type: Boolean,
237
+ default: true
238
+ },
239
+ //弹窗关闭时是否销毁子组件
240
+ destroyOnClose: Boolean,
241
+ //树结构标题
242
+ treeTitle: String,
243
+ //是否显示切换按钮
244
+ showSwitch: {
245
+ type: Boolean,
246
+ default: true
247
+ },
248
+ selection: [Array, String]
249
+ },
250
+ data() {
251
+ return {
252
+ selectedLabel: '',
253
+ selected: [],
254
+ visible: false,
255
+ menuVisibleOnFocus: false,
256
+ inputHovering: false,
257
+ styles: {},
258
+ minWidth: '',
259
+ options: '',
260
+ show: false,
261
+ focus: false,
262
+ reference: undefined,
263
+ timer: null
264
+ };
265
+ },
266
+ computed: {
267
+ isRender() {
268
+ let useCaseCodes = util.getStorage('useCaseCodes');
269
+ if (useCaseCodes && this.useCaseCode) {
270
+ return useCaseCodes.indexOf(this.useCaseCode) > -1;
271
+ }
272
+ return true;
273
+ },
274
+ isReset() {
275
+ return this.reset ? this.visible : true;
276
+ },
277
+ _elFormItemSize() {
278
+ return (this.elFormItem || {}).elFormItemSize;
279
+ },
280
+ actived() {
281
+ if (this.active) {
282
+ return this.active;
283
+ }
284
+ return this.types[0];
285
+ },
286
+ selectorSize() {
287
+ return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
288
+ },
289
+ selectorDisabled() {
290
+ return this.disabled || (this.elForm || {}).disabled;
291
+ },
292
+ currentPlaceholder() {
293
+ if (this.selected && this.selected.length) {
294
+ return '';
295
+ } else if (this.filterable) {
296
+ return '输入关键字搜索';
297
+ } else {
298
+ return this.placeholder;
299
+ }
300
+ }
301
+ },
302
+ watch: {
303
+ value: {
304
+ immediate: true,
305
+ deep: true,
306
+ handler(val) {
307
+ if (util.isExist(val)) {
308
+ if (util.isObject(val)) {
309
+ this.selected = [val];
310
+ } else {
311
+ this.selected = val;
312
+ }
313
+ } else {
314
+ this.selected = [];
315
+ }
316
+ if (!this.multiple && val && val.length) {
317
+ this.selectedLabel = this.getLabel(val[0]);
318
+ }
319
+ }
320
+ },
321
+ selected: {
322
+ deep: true,
323
+ handler(val) {
324
+ this.$emit(
325
+ 'change',
326
+ Array.isArray(val) ? val : [val],
327
+ this.businessData
328
+ );
329
+ if (this.multiple) {
330
+ this.resetInputHeight();
331
+ }
332
+ }
333
+ },
334
+ mix(val) {
335
+ if (val) {
336
+ this.getSysParam();
337
+ }
338
+ }
339
+ },
340
+ created() {
341
+ this.search = throttle(500, (query, callback) => {
342
+ this.handleSearch(query, callback);
343
+ });
344
+ this.reference = this.$refs.esSelector;
345
+ this.mix && this.getSysParam();
346
+ },
347
+ mounted() {
348
+ this.resetInputHeight();
349
+ if (this.filterable) {
350
+ this.$nextTick(() => {
351
+ this.$refs.reference &&
352
+ (this.minWidth = this.$refs.reference.$el.children[0].offsetWidth);
353
+ });
354
+ }
355
+ if (this.$refs.openDialog) {
356
+ this.$refs.openDialog.$el.parentNode.addEventListener('click', () => {
357
+ this.openDialog();
358
+ });
359
+ }
360
+ },
361
+ methods: {
362
+ getSysParam() {
363
+ if (util.getStorage('sysorgname') && util.getStorage('sysdepname')) {
364
+ return;
365
+ }
366
+ util
367
+ .ajax({
368
+ url: getSysParam,
369
+ params: {
370
+ paramCode: 'sysorgname,sysdepname'
371
+ }
372
+ })
373
+ .then((res) => {
374
+ if (res.rCode === 0) {
375
+ let params = res.results.split(',');
376
+ sessionStorage.setItem('sysorgname', params[0]);
377
+ sessionStorage.setItem('sysdepname', params[1]);
378
+ }
379
+ });
380
+ },
381
+ getDep(res) {
382
+ if (!this.showFilterListDep) {
383
+ return '';
384
+ }
385
+ const attr = res.attr ? JSON.parse(res.attr) : null;
386
+ return attr && attr.depShortName ? `[${attr.depShortName}]` : '';
387
+ },
388
+ getValueKey(obj) {
389
+ return util.isObject(obj) ? obj[this.valueKey] : obj;
390
+ },
391
+ openDialog() {
392
+ if (!this.selectorDisabled && !this.readonly && this.select) {
393
+ this.visible = true;
394
+ }
395
+ },
396
+ handleSearch(query, callback) {
397
+ if (!query) return;
398
+
399
+ let options = this.createable
400
+ ? [
401
+ {
402
+ [this.labelKey]: query,
403
+ [this.valueKey]: query
404
+ }
405
+ ]
406
+ : [];
407
+ if (!this.tree && this.selection && Array.isArray(this.selection)) {
408
+ let selections = this.selection.filter((item) => {
409
+ return item[this.labelKey].indexOf(query) > -1;
410
+ });
411
+ // selections = selections.filter((item) => {
412
+ // return (
413
+ // this.selected.findIndex(
414
+ // (selected) => selected[this.valueKey] === item[this.valueKey]
415
+ // ) === -1
416
+ // );
417
+ // });
418
+ options = options.concat(selections);
419
+ }
420
+ if (this.filterable) {
421
+ let params = {
422
+ type: this.actived
423
+ };
424
+ const url =
425
+ !this.tree && this.selection && typeof this.selection === 'string'
426
+ ? this.selection
427
+ : this.action;
428
+ params[this.keywords] = query;
429
+ params = util.extend({}, params, this.where);
430
+ util
431
+ .ajax({
432
+ url: url,
433
+ params: params
434
+ })
435
+ .then((res) => {
436
+ if (res.rCode === 0) {
437
+ const results = (res.results || [])
438
+ // .filter((item) => {
439
+ // return (
440
+ // this.selected.findIndex(
441
+ // (selected) =>
442
+ // selected[this.valueKey] === item[this.valueKey]
443
+ // ) === -1
444
+ // );
445
+ // });
446
+ options = options.concat(results);
447
+ callback(options);
448
+ }
449
+ })
450
+ .catch((err) => {
451
+ if (err.message && err.message !== 'canceled') {
452
+ this.$message.error(err.message);
453
+ }
454
+ });
455
+ } else {
456
+ callback(options);
457
+ }
458
+ },
459
+ tabschage(trees, active) {
460
+ this.$emit('tabs-change', trees, active);
461
+ },
462
+ handleChange(val) {
463
+ if (!this.multiple) {
464
+ this.selected = [];
465
+
466
+ this.$emit('input', []);
467
+ this.$emit('confirm', [], this.businessData);
468
+ }
469
+ console.log('handleChange', val);
470
+ },
471
+ handleSelect(res) {
472
+ console.log('handleSelect', res);
473
+ if (!this.multiple) {
474
+ this.selectedLabel = this.getLabel(res);
475
+ } else {
476
+ this.selectedLabel = '';
477
+ }
478
+ if (!res.selected) {
479
+ if (this.multiple) {
480
+ if (this.selected.length) {
481
+ if (!res.selected) {
482
+ res.selected = true;
483
+ this.selected.push(res);
484
+ this.selected = util.arrUnique(this.selected, this.valueKey);
485
+ }
486
+ } else {
487
+ res.selected = true;
488
+ this.selected = [res];
489
+ }
490
+ } else {
491
+ res.selected = true;
492
+ if (Array.isArray(this.selected)) {
493
+ if (
494
+ this.selected[0] &&
495
+ typeof this.selected[0] !== 'string' &&
496
+ this.selected[0][this.valueKey] !== res[this.valueKey]
497
+ ) {
498
+ this.selected[0].selected = false;
499
+ }
500
+ this.selected = [res];
501
+ } else {
502
+ if (
503
+ this.selected &&
504
+ typeof this.selected !== 'string' &&
505
+ this.selected[this.valueKey] !== res[this.valueKey]
506
+ ) {
507
+ this.selected.selected = false;
508
+ }
509
+ this.selected = [res];
510
+ }
511
+ }
512
+ }
513
+ this.$emit('input', this.selected);
514
+ this.$emit('confirm', this.selected);
515
+ },
516
+ handleConfirm(res) {
517
+ console.log('handleConfirm', res);
518
+ let val = util.isObject(res) ? [res] : res;
519
+ this.visible = false;
520
+ if (!this.multiple) {
521
+ this.selectedLabel = val[0] ? this.getLabel(val) : '';
522
+ } else {
523
+ this.selectedLabel = '';
524
+ }
525
+ if (this.mix) {
526
+ val.forEach((item, index) => {
527
+ val[index]._typeName = util.getTypeName(item.stype);
528
+ });
529
+ }
530
+ this.$emit('input', val);
531
+ this.$emit('confirm', val, this.businessData);
532
+ let inputChildNodes = this.$refs.reference
533
+ ? this.$refs.reference.$el.childNodes
534
+ : null;
535
+ let input = inputChildNodes
536
+ ? [].filter.call(inputChildNodes, (item) => item.tagName === 'INPUT')[0]
537
+ : null;
538
+ if (input) {
539
+ input.focus();
540
+ input.blur();
541
+ }
542
+ if (this.reset) {
543
+ this.selected = [];
544
+ }
545
+ },
546
+ handleClear() {
547
+ this.$emit('input', []);
548
+ this.$emit('clear');
549
+ },
550
+ handleCancel() {
551
+ this.visible = false;
552
+ this.$emit('cancel');
553
+ },
554
+ deleteTag(event, item, index) {
555
+ event;
556
+ item;
557
+ index = index === undefined ? 0 : index;
558
+ this.selected.length > this.min && this.selected.splice(index, 1);
559
+ },
560
+ resetInputHeight() {
561
+ if (this.collapseTags) return;
562
+ this.$nextTick(() => {
563
+ if (!this.$refs.reference) return;
564
+ const sizeInMap = this.inputHeight;
565
+ let height = '';
566
+ if (this.selected !== undefined && this.selected.length === 0) {
567
+ height = sizeInMap + 'px';
568
+ } else if (this.$refs.tags) {
569
+ if (this.$refs.tags.clientHeight > sizeInMap) {
570
+ height += this.$refs.tags.clientHeight + 2 + 'px';
571
+ } else {
572
+ height = sizeInMap + 'px';
573
+ }
574
+ }
575
+ if (height) {
576
+ if (this.readonly) {
577
+ this.$refs.reference.style.height = height;
578
+ } else {
579
+ let inputChildNodes = this.$refs.reference.$el.childNodes;
580
+ let input = [].filter.call(
581
+ inputChildNodes,
582
+ (item) => item.tagName === 'INPUT'
583
+ )[0];
584
+ input.style.height = height;
585
+ }
586
+ }
587
+ });
588
+ },
589
+ getLabel(res) {
590
+ let tag = '';
591
+ if (this.mix) {
592
+ tag = this.classify ? util.getTypeName(res.stype) : '';
593
+ } else if (this.showFilterListDep) {
594
+ tag = this.getDep(res);
595
+ }
596
+ return (
597
+ tag +
598
+ (typeof res == 'string'
599
+ ? res
600
+ : res[this.labelKey]
601
+ ? res[this.labelKey]
602
+ : res.label || res[this.valueKey])
603
+ );
604
+ }
605
+ },
606
+ beforeDestroy() {
607
+ this.$el.removeEventListener('keyup', this.doSearch);
608
+ if (this.$refs.openDialog) {
609
+ this.$refs.openDialog.$el.parentNode.removeEventListener('click', () => {
610
+ this.openDialog();
611
+ });
612
+ }
613
+ }
614
+ };
615
+ </script>