eoss-ui 0.8.39 → 0.8.41

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 (42) hide show
  1. package/lib/eoss-ui.common.js +771 -1097
  2. package/lib/flow-list.js +86 -24
  3. package/lib/flow.js +199 -120
  4. package/lib/index.js +1 -1
  5. package/lib/selector-panel.js +189 -110
  6. package/lib/selector.js +164 -700
  7. package/lib/theme-chalk/flow-list.css +1 -1
  8. package/lib/theme-chalk/flow.css +1 -1
  9. package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
  10. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  11. package/lib/theme-chalk/form.css +1 -1
  12. package/lib/theme-chalk/index.css +1 -1
  13. package/lib/theme-chalk/selector-panel.css +1 -1
  14. package/lib/theme-chalk/selector.css +1 -1
  15. package/lib/theme-chalk/tree.css +1 -1
  16. package/package.json +2 -2
  17. package/packages/flow/src/flow.vue +40 -13
  18. package/packages/flow/src/main.vue +13 -5
  19. package/packages/flow/src/selectUser.vue +1 -0
  20. package/packages/flow/src/startTaskRead.vue +3 -0
  21. package/packages/flow-list/src/main.vue +75 -16
  22. package/packages/selector/src/main.vue +120 -269
  23. package/packages/selector-panel/src/main.vue +1071 -1036
  24. package/packages/selector-panel/src/tree.vue +24 -18
  25. package/packages/theme-chalk/lib/flow-list.css +1 -1
  26. package/packages/theme-chalk/lib/flow.css +1 -1
  27. package/packages/theme-chalk/lib/fonts/iconfont.ttf +0 -0
  28. package/packages/theme-chalk/lib/fonts/iconfont.woff +0 -0
  29. package/packages/theme-chalk/lib/form.css +1 -1
  30. package/packages/theme-chalk/lib/index.css +1 -1
  31. package/packages/theme-chalk/lib/selector-panel.css +1 -1
  32. package/packages/theme-chalk/lib/selector.css +1 -1
  33. package/packages/theme-chalk/lib/tree.css +1 -1
  34. package/packages/theme-chalk/src/flow-list.scss +61 -55
  35. package/packages/theme-chalk/src/flow.scss +16 -2
  36. package/packages/theme-chalk/src/fonts/iconfont.ttf +0 -0
  37. package/packages/theme-chalk/src/fonts/iconfont.woff +0 -0
  38. package/packages/theme-chalk/src/form.scss +5 -1
  39. package/packages/theme-chalk/src/selector-panel.scss +36 -6
  40. package/packages/theme-chalk/src/selector.scss +66 -115
  41. package/packages/theme-chalk/src/tree.scss +1 -1
  42. package/src/index.js +1 -1
@@ -3,205 +3,54 @@
3
3
  v-if="isRender"
4
4
  class="es-selector"
5
5
  ref="esSelector"
6
- :class="{ 'es-pointer': !readonly && !filterable }"
7
- v-clickoutside="handleClose"
6
+ :class="{ 'is-button': button && !readonly }"
8
7
  >
9
8
  <template v-if="form">
10
- <el-button v-if="button" v-bind="button" @click="openDialog">
9
+ <el-button v-if="button && !readonly" v-bind="button" @click="openDialog">
11
10
  <slot>
12
11
  <es-icon v-if="icon" :contents="icon"></es-icon>
13
12
  <template v-else>选择</template>
14
13
  </slot>
15
14
  </el-button>
16
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>
17
37
  <div
18
- :class="[
19
- selectorSize ? 'el-select--' + selectorSize : 'es-selector-box',
20
- { 'es-selector-search': filterable }
21
- ]"
22
- @click.stop="toggleMenu"
38
+ v-if="multiple"
39
+ ref="tags"
40
+ class="es-select__tags"
41
+ :class="{ 'is-edit': !readonly, 'is-show': selected.length }"
23
42
  >
24
- <div
25
- v-if="multiple"
26
- ref="tags"
27
- class="el-select__tags"
28
- :class="{ 'es-selector-edit': !readonly }"
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)"
29
50
  >
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>
51
+ <span class="el-select__tags-text">{{ getLabel(item) }}</span>
52
+ </el-tag>
169
53
  </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
54
  </template>
206
55
  </template>
207
56
  <es-dialog
@@ -229,6 +78,8 @@
229
78
  :type="types"
230
79
  :mix="mix"
231
80
  :isShowLevel3="isShowLevel3"
81
+ :tree-title="treeTitle"
82
+ :show-switch="showSwitch"
232
83
  @tabschage="tabschage"
233
84
  @click.capture="stopd"
234
85
  @confirm="handleConfirm"
@@ -241,6 +92,7 @@
241
92
  import util from 'eoss-ui/src/utils/util.js';
242
93
  import { getSelectorOrgDetail, getSysParam } from 'eoss-ui/src/config/api.js';
243
94
  import Clickoutside from 'eoss-element/src/utils/clickoutside';
95
+ import { throttle } from 'throttle-debounce';
244
96
  export default {
245
97
  name: 'EsSelector',
246
98
  inheritAttrs: false,
@@ -332,17 +184,17 @@ export default {
332
184
  default: -1
333
185
  },
334
186
  //是否显示搜索框
335
- filterable: Boolean,
336
- //搜索列表是否显示部门信息
337
- showFilterListDep: {
187
+ filterable: {
338
188
  type: Boolean,
339
189
  default: true
340
190
  },
191
+ //搜索列表是否显示部门信息
192
+ showFilterListDep: Boolean,
341
193
  //是否根据搜索值创建新的数据
342
194
  createable: Boolean,
343
195
  showButton: Boolean,
344
196
  button: Object,
345
- icon: String,
197
+ icon: { type: String, default: 'es-icon-sousuorenyuan' },
346
198
  active: String,
347
199
  keywords: {
348
200
  type: String,
@@ -385,16 +237,24 @@ export default {
385
237
  default: true
386
238
  },
387
239
  //弹窗关闭时是否销毁子组件
388
- destroyOnClose: Boolean
240
+ destroyOnClose: Boolean,
241
+ //树结构标题
242
+ treeTitle: String,
243
+ //是否显示切换按钮
244
+ showSwitch: {
245
+ type: Boolean,
246
+ default: true
247
+ },
248
+ selection: [Array, String]
389
249
  },
390
250
  data() {
391
251
  return {
252
+ selectedLabel: '',
392
253
  selected: [],
393
254
  visible: false,
394
255
  menuVisibleOnFocus: false,
395
256
  inputHovering: false,
396
257
  styles: {},
397
- words: '',
398
258
  minWidth: '',
399
259
  options: '',
400
260
  show: false,
@@ -429,29 +289,6 @@ export default {
429
289
  selectorDisabled() {
430
290
  return this.disabled || (this.elForm || {}).disabled;
431
291
  },
432
- selectedLabel: {
433
- get() {
434
- if (this.selected) {
435
- if (typeof this.selected === 'string') {
436
- return this.selected;
437
- } else if (util.isObject(this.selected)) {
438
- return this.selected[this.labelKey];
439
- } else if (Array.isArray(this.selected)) {
440
- return this.selected
441
- .map((item) => {
442
- return typeof item === 'string' ? item : item[this.labelKey];
443
- })
444
- .join(',');
445
- }
446
- }
447
- return '';
448
- },
449
- set(val) {
450
- this.selected = [val];
451
- this.words = val;
452
- return val;
453
- }
454
- },
455
292
  currentPlaceholder() {
456
293
  if (this.selected && this.selected.length) {
457
294
  return '';
@@ -476,6 +313,9 @@ export default {
476
313
  } else {
477
314
  this.selected = [];
478
315
  }
316
+ if (!this.multiple && val && val.length) {
317
+ this.selectedLabel = this.getLabel(val[0]);
318
+ }
479
319
  }
480
320
  },
481
321
  selected: {
@@ -491,12 +331,6 @@ export default {
491
331
  }
492
332
  }
493
333
  },
494
- words(val) {
495
- if (this.emptySerach || val !== '') {
496
- clearTimeout(this.timer);
497
- this.timer = setTimeout(this.handleSearch, 500);
498
- }
499
- },
500
334
  mix(val) {
501
335
  if (val) {
502
336
  this.getSysParam();
@@ -504,6 +338,9 @@ export default {
504
338
  }
505
339
  },
506
340
  created() {
341
+ this.search = throttle(500, (query, callback) => {
342
+ this.handleSearch(query, callback);
343
+ });
507
344
  this.reference = this.$refs.esSelector;
508
345
  this.mix && this.getSysParam();
509
346
  },
@@ -551,54 +388,63 @@ export default {
551
388
  getValueKey(obj) {
552
389
  return util.isObject(obj) ? obj[this.valueKey] : obj;
553
390
  },
554
- toggleMenu() {
555
- if (
556
- !this.selectorDisabled &&
557
- !this.readonly &&
558
- !this.filterable &&
559
- this.select
560
- ) {
561
- this.visible = true;
562
- }
563
- },
564
391
  openDialog() {
565
392
  if (!this.selectorDisabled && !this.readonly && this.select) {
566
393
  this.visible = true;
567
394
  }
568
395
  },
569
- handleSearch() {
570
- let options = [];
571
- if (this.createable) {
572
- options = [
573
- {
574
- [this.labelKey]: this.words,
575
- [this.valueKey]: this.words
576
- }
577
- ];
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);
578
419
  }
579
420
  if (this.filterable) {
580
421
  let params = {
581
422
  type: this.actived
582
423
  };
583
- params[this.keywords] = this.words;
424
+ const url =
425
+ !this.tree && this.selection && typeof this.selection === 'string'
426
+ ? this.selection
427
+ : this.action;
428
+ params[this.keywords] = query;
584
429
  params = util.extend({}, params, this.where);
585
430
  util
586
431
  .ajax({
587
- url: this.action,
432
+ url: url,
588
433
  params: params
589
434
  })
590
435
  .then((res) => {
591
436
  if (res.rCode === 0) {
592
- this.options = [...options, ...res.results];
593
- if (this.selected.length && this.multiple) {
594
- this.selected.forEach((item) => {
595
- let i = util.indexOfObj(this.options, item, this.valueKey);
596
- if (i > -1) {
597
- this.options[i].selected = true;
598
- }
599
- });
600
- }
601
- this.show = true;
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);
602
448
  }
603
449
  })
604
450
  .catch((err) => {
@@ -606,30 +452,29 @@ export default {
606
452
  this.$message.error(err.message);
607
453
  }
608
454
  });
609
- } else if (this.createable) {
610
- this.options = options;
611
- this.show = true;
612
- }
613
- },
614
- handleFocus() {
615
- if (this.filterable) {
616
- this.focus = true;
455
+ } else {
456
+ callback(options);
617
457
  }
618
458
  },
619
- handleBlur() {
620
- this.focus = false;
621
- },
622
459
  tabschage(trees, active) {
623
460
  this.$emit('tabs-change', trees, active);
624
461
  },
625
- handleClose(res) {
626
- if (!this.multiple && this.selected[0] === this.words) {
462
+ handleChange(val) {
463
+ if (!this.multiple) {
627
464
  this.selected = [];
465
+
466
+ this.$emit('input', []);
467
+ this.$emit('confirm', [], this.businessData);
628
468
  }
629
- this.show = false;
469
+ console.log('handleChange', val);
630
470
  },
631
471
  handleSelect(res) {
632
- this.words = '';
472
+ console.log('handleSelect', res);
473
+ if (!this.multiple) {
474
+ this.selectedLabel = this.getLabel(res);
475
+ } else {
476
+ this.selectedLabel = '';
477
+ }
633
478
  if (!res.selected) {
634
479
  if (this.multiple) {
635
480
  if (this.selected.length) {
@@ -669,8 +514,14 @@ export default {
669
514
  this.$emit('confirm', this.selected);
670
515
  },
671
516
  handleConfirm(res) {
672
- this.visible = false;
517
+ console.log('handleConfirm', res);
673
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
+ }
674
525
  if (this.mix) {
675
526
  val.forEach((item, index) => {
676
527
  val[index]._typeName = util.getTypeName(item.stype);