cnhis-design-vue 0.2.19-beta → 0.2.23-beta

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.
@@ -6,7 +6,37 @@
6
6
  </div>
7
7
  <div v-show="!allDisable" style="height: 100%;">
8
8
  <div class="label-wrap">
9
+ <!-- 表单内嵌打开标签组件的样式 -->
10
+ <div v-if="explicit" class="explicit-continer">
11
+ <a-tabs hideAdd :activeKey="labelAnchorKey" type="card" @change="labelAnchorTabsOnChange" tab-position="top">
12
+ <template v-for="(v, i) in labelConfig">
13
+ <a-tab-pane :key="v.curKey">
14
+ <span slot="tab">
15
+ {{ i }}
16
+ <span class="edit-label-type">({{ v.multipleChoice == 2 ? '单' : '多' }}选)</span>
17
+ </span>
18
+ <div class="explicit-label-wrap left-label-wrap">
19
+ <div class="edit-label-content">
20
+ <labelClassify
21
+ :classifyItem="v"
22
+ :handleLabelChange="handleLabelChange"
23
+ :handleLabelColor="handleLabelColor"
24
+ :handleDelLabel="handleDelLabel"
25
+ :hanldeBlur="hanldeBlur"
26
+ :handleAddLabel="handleAddLabel"
27
+ :clearaddVal="clearaddVal"
28
+ :isEdit="isEdit"
29
+ :sourceType="sourceType"
30
+ />
31
+ </div>
32
+ </div>
33
+ </a-tab-pane>
34
+ </template>
35
+ </a-tabs>
36
+ </div>
37
+ <!-- 普通标签样式 -->
9
38
  <div
39
+ v-else
10
40
  class="left-label-wrap"
11
41
  :class="{
12
42
  'total-left-label-wrap': isChangeWindow
@@ -22,7 +52,9 @@
22
52
  </template>
23
53
  </a-tabs>
24
54
  </div>
55
+
25
56
  <div
57
+ v-if="!explicit"
26
58
  class="right-label-wrap"
27
59
  :class="{
28
60
  'total-right-label-wrap': isChangeWindow
@@ -38,43 +70,17 @@
38
70
  {{ k }}
39
71
  <span class="edit-label-type">({{ v.multipleChoice == 2 ? '单' : '多' }}选)</span>
40
72
  </div>
41
- <div class="edit-content">
42
- <!-- disable -->
43
- <div v-if="!v.itemList" class="label-disable-wrap">
44
- <p class="label-disable-title">无可选标签</p>
45
- <p class="label-disable-desc">请联系管理员进行标签管理设置</p>
46
- </div>
47
- <!-- -->
48
- <div v-else class="label-content">
49
- <a-checkable-tag
50
- v-for="item in v.itemList"
51
- v-model="item.isSelect"
52
- @change="handleLabelChange($event, item, v)"
53
- :key="item.labelId"
54
- :style="handleLabelColor(item)"
55
- :class="{ 'sys-label-tag': item.isPublic && item.isPublic == 1 }"
56
- >
57
- <a-tooltip placement="topLeft">
58
- <template slot="title">
59
- <span>{{ item.labelName }}</span>
60
- </template>
61
- {{ item.labelName }}
62
- </a-tooltip>
63
-
64
- <template v-if="sourceType != 'guage'">
65
- <a-icon class="label-close" v-show="!(item.isPublic && item.isPublic == 1)" type="close" @click.native.stop="handleDelLabel(item, v)" />
66
- </template>
67
- </a-checkable-tag>
68
- <a-button v-if="isEdit && !v.isNoAdd && sourceType != 'guage'" type="dashed" class="label-add" v-show="!v.showAdd" @click="handleAddLabel($event, v)">
69
- <a-icon type="plus" />
70
- <!-- {{ $t("1.1.2") }} -->
71
- 标签
72
- </a-button>
73
- <a-input v-if="isEdit && !v.isNoAdd && sourceType != 'guage'" class="label-add add-input" v-model.trim="v.addVal" v-show="v.showAdd" @blur="hanldeBlur($event, v)">
74
- <a-icon slot="suffix" type="close" @click.native.stop="clearaddVal($event, v)" />
75
- </a-input>
76
- </div>
77
- </div>
73
+ <labelClassify
74
+ :classifyItem="v"
75
+ :handleLabelChange="handleLabelChange"
76
+ :handleLabelColor="handleLabelColor"
77
+ :handleDelLabel="handleDelLabel"
78
+ :hanldeBlur="hanldeBlur"
79
+ :handleAddLabel="handleAddLabel"
80
+ :clearaddVal="clearaddVal"
81
+ :isEdit="isEdit"
82
+ :sourceType="sourceType"
83
+ />
78
84
  </div>
79
85
  </div>
80
86
  </div>
@@ -113,6 +119,8 @@ import utils from '@/utils/utils-map';
113
119
  import { Tooltip, Icon, Button, Input, Tag, Tabs, Anchor } from 'ant-design-vue';
114
120
  import create from '@/core/create';
115
121
  import vexutils from '@/utils/vexutils';
122
+
123
+ import labelClassify from './label-classify.vue';
116
124
  export default create({
117
125
  name: 'label-form-content',
118
126
  components: {
@@ -125,7 +133,8 @@ export default create({
125
133
  [Tooltip.name]: Tooltip,
126
134
  [Button.name]: Button,
127
135
  [Tag.name]: Tag,
128
- [Tag.CheckableTag.name]: Tag.CheckableTag
136
+ [Tag.CheckableTag.name]: Tag.CheckableTag,
137
+ labelClassify
129
138
  },
130
139
  props: {
131
140
  item: {
@@ -156,7 +165,13 @@ export default create({
156
165
  labelOptions: {
157
166
  type: Object
158
167
  },
159
- sourceType: String
168
+ sourceType: String,
169
+
170
+ explicit: {
171
+ // 标签选择外显
172
+ type: Boolean,
173
+ default: false
174
+ }
160
175
  },
161
176
  inject: {},
162
177
  data() {
@@ -183,9 +198,9 @@ export default create({
183
198
  return !labelObj[key].itemList;
184
199
  });
185
200
  },
186
- SelectedList(){
201
+ SelectedList() {
187
202
  const { labelSelectedList = [], labelSelectedEdit = [] } = this;
188
- return labelSelectedList.concat(labelSelectedEdit)
203
+ return labelSelectedList.concat(labelSelectedEdit);
189
204
  },
190
205
  selectLabelId() {
191
206
  const list = this?.SelectedList || [];
@@ -196,12 +211,12 @@ export default create({
196
211
  }
197
212
  },
198
213
  watch: {
199
- labelOptions:{
200
- immediate:true,
214
+ labelOptions: {
215
+ immediate: true,
201
216
  deep: true,
202
- handler(val){
203
- if(!val) return;
204
- this.handleLabelInit()
217
+ handler(val) {
218
+ if (!val) return;
219
+ this.handleLabelInit();
205
220
  }
206
221
  }
207
222
  // labelVisible: {
@@ -226,16 +241,24 @@ export default create({
226
241
 
227
242
  handleLabelInit() {
228
243
  if (this.isLock) return;
229
- const copy = JSON.parse(JSON.stringify(this.labelOptions))
244
+ this.cacheLabelConfig = { ...this.labelConfig };
245
+ const copy = JSON.parse(JSON.stringify(this.labelOptions));
246
+
247
+ for (let key in copy) {
248
+ // let olbKey = this?.cacheLabelConfig[key]?.curKey
249
+ let typeId = copy[key]?.typeId || '';
250
+ Object.assign(copy[key], {
251
+ curKey: `${key}_${typeId}~${this.randomId()}`
252
+ });
253
+ }
230
254
  this.$set(this, 'labelConfig', copy);
231
255
  this.$nextTick(() => {
232
256
  this.hanldeBackfill();
233
- for (let key in this.labelConfig) {
234
- Object.assign(this.labelConfig[key], {
235
- curKey: this.randomId()
236
- });
257
+ let defKey = undefined;
258
+ if (this.explicit && this.inited) {
259
+ defKey = this.labelAnchorKey;
237
260
  }
238
- this.setLabelDeafultClick(this.labelConfig);
261
+ this.setLabelDeafultClick(this.labelConfig, defKey);
239
262
  this.inited = true;
240
263
  });
241
264
  },
@@ -249,91 +272,100 @@ export default create({
249
272
  let itemList = labelConfig[k]?.itemList || [];
250
273
  if (itemList.length) {
251
274
  itemList.forEach(v => {
252
- if(selectLabelId.includes(v.labelId)){
253
- this.$set(v,'isSelect', true)
275
+ if (selectLabelId.includes(v.labelId)) {
276
+ this.$set(v, 'isSelect', true);
254
277
  }
255
- })
278
+ });
256
279
  }
257
280
  });
258
281
  }
259
282
  },
260
283
 
261
284
  // 标签处理
262
- async handleEditLabel(v = {}, update = false) {
263
- try {
264
- if (this.isLock) return;
265
- if (v.labelList && !update) {
266
- this.handleLabelSelected(v.labelList, this.labelSelectedList, v.labelObj);
267
- this.inited = true;
268
- this.editLabelItem = v;
269
- this.setLabelDeafultClick(v.labelObj);
270
- } else {
271
- // TODO:
272
- const { rows, results } = await this.getLabelList(v);
273
- const labelList = rows || [];
274
- const labelObj = {};
275
- const cacheKey = `${v.val_key}_${v.name}`;
276
- // this.labelSelected[d.cacheKey]
277
- let isSelect = false;
278
- const selectList = update ? [...(this.labelSelectedEdit || [])] : [...(this.labelSelectedList || [])];
279
- labelList.forEach(n => {
280
- n.cacheKey = cacheKey;
281
- // 根据 labelId 处理默认选中
282
-
283
- /**
284
- * 回填的值可能不在数据中,但是不能丢失。
285
- */
286
- isSelect = selectList.findIndex(i => i.labelId == n.labelId) !== -1;
287
- n.isSelect = isSelect; // 是否已选
288
- /**
289
- * typeName 按照分类处理
290
- * 没有分类创建分类,有则添加
291
- */
292
- if (labelObj[n.typeName]) {
293
- labelObj[n.typeName].itemList.push({ ...n });
294
- } else {
295
- labelObj[n.typeName] = {
296
- itemList: [{ ...n }],
297
- showAdd: false,
298
- addVal: '',
299
- typeName: n.typeName,
300
- typeId: n.typeId
301
- };
302
- }
303
- });
304
- /**
305
- * labelObj 展示的分类值
306
- * labelList 原始数据结构
307
- * selectList 已选的数据
308
- */
309
- this.$set(v, 'labelObj', labelObj);
310
- this.$set(v, 'labelList', labelList);
311
- this.$set(this, 'labelSelectedEdit', selectList);
312
- // 缓存
313
- this.editLabelItem = v;
314
- this.setLabelTypeStatus(results);
315
- for (let key in labelObj) {
316
- Object.assign(labelObj[key], {
317
- curKey: this.randomId()
318
- });
319
- }
320
- this.setLabelDeafultClick(labelObj);
285
+ // async handleEditLabel(v = {}, update = false) {
286
+ // try {
287
+ // if (this.isLock) return;
288
+ // if (v.labelList && !update) {
289
+ // this.handleLabelSelected(v.labelList, this.labelSelectedList, v.labelObj);
290
+ // this.inited = true;
291
+ // this.editLabelItem = v;
292
+ // this.setLabelDeafultClick(v.labelObj);
293
+ // } else {
294
+ // // TODO:
295
+ // const { rows, results } = await this.getLabelList(v);
296
+ // const labelList = rows || [];
297
+ // const labelObj = {};
298
+ // const cacheKey = `${v.val_key}_${v.name}`;
299
+ // // this.labelSelected[d.cacheKey]
300
+ // let isSelect = false;
301
+ // const selectList = update ? [...(this.labelSelectedEdit || [])] : [...(this.labelSelectedList || [])];
302
+ // labelList.forEach(n => {
303
+ // n.cacheKey = cacheKey;
304
+ // // 根据 labelId 处理默认选中
321
305
 
322
- this.inited = true;
323
- }
324
- } catch (error) {
325
- this.$set(v, 'labelObj', {});
326
- this.$set(v, 'labelList', []);
327
- console.log(error);
328
- this.inited = true;
329
- }
330
- },
306
+ // /**
307
+ // * 回填的值可能不在数据中,但是不能丢失。
308
+ // */
309
+ // isSelect = selectList.findIndex(i => i.labelId == n.labelId) !== -1;
310
+ // n.isSelect = isSelect; // 是否已选
311
+ // this.$set(n, 'isSelect', isSelect);
312
+ // /**
313
+ // * typeName 按照分类处理
314
+ // * 没有分类创建分类,有则添加
315
+ // */
316
+ // if (labelObj[n.typeName]) {
317
+ // labelObj[n.typeName].itemList.push({ ...n });
318
+ // } else {
319
+ // labelObj[n.typeName] = {
320
+ // itemList: [{ ...n }],
321
+ // showAdd: false,
322
+ // addVal: '',
323
+ // typeName: n.typeName,
324
+ // typeId: n.typeId
325
+ // };
326
+ // }
327
+ // });
328
+ // /**
329
+ // * labelObj 展示的分类值
330
+ // * labelList 原始数据结构
331
+ // * selectList 已选的数据
332
+ // */
333
+ // this.$set(v, 'labelObj', labelObj);
334
+ // this.$set(v, 'labelList', labelList);
335
+ // this.$set(this, 'labelSelectedEdit', selectList);
336
+ // // 缓存
337
+ // this.editLabelItem = v;
338
+ // this.setLabelTypeStatus(results);
339
+ // for (let key in labelObj) {
340
+ // Object.assign(labelObj[key], {
341
+ // curKey: this.randomId()
342
+ // });
343
+ // }
344
+ // this.setLabelDeafultClick(labelObj);
345
+
346
+ // this.inited = true;
347
+ // }
348
+ // } catch (error) {
349
+ // this.$set(v, 'labelObj', {});
350
+ // this.$set(v, 'labelList', []);
351
+ // console.log(error);
352
+ // this.inited = true;
353
+ // }
354
+ // },
331
355
  // 默认选中第一个分类
332
- setLabelDeafultClick(labelObj) {
356
+ setLabelDeafultClick(labelObj, deafulteKey) {
333
357
  if (!labelObj) return;
334
358
  let objKeys = Object.keys(labelObj) || [];
335
359
  if (!objKeys.length) return;
336
360
  let curKey = labelObj[objKeys[0]].curKey;
361
+ // 找到默认选中的tab
362
+ if (deafulteKey && typeof deafulteKey === 'string') {
363
+ let [q] = deafulteKey.split('~');
364
+ let f = objKeys.find(k => labelObj[k] && labelObj[k].curKey && labelObj[k].curKey.includes(q));
365
+ if (f) {
366
+ curKey = labelObj[f].curKey;
367
+ }
368
+ }
337
369
  if (!curKey) return;
338
370
  this.labelAnchorTabsOnChange(curKey);
339
371
  },
@@ -454,6 +486,8 @@ export default create({
454
486
  let parentColor = '';
455
487
  if (v.itemList?.length) {
456
488
  parentColor = v.itemList[0].parentColor || v.parentColor || '';
489
+ } else {
490
+ parentColor = v?.parentColor || "";
457
491
  }
458
492
 
459
493
  const params = {
@@ -466,7 +500,7 @@ export default create({
466
500
  if (status) {
467
501
  this.$message.success('添加成功!');
468
502
  // this.handleEditLabel(this.editLabelItem, true);
469
- this.$emit('updateLabelData')
503
+ this.$emit('updateLabelData');
470
504
  v.showAdd = false;
471
505
  }
472
506
  },
@@ -476,8 +510,7 @@ export default create({
476
510
  const multipleChoice = labelGroup.multipleChoice;
477
511
  // let selectedList = this.labelSelectedEdit || [];
478
512
  // 修复 标签多选 点击modal取消按钮 回显也会被选中
479
- let selectedList =
480
- (this.labelSelectedEdit?.length && vexutils.clone(this.labelSelectedEdit, true)) || [];
513
+ let selectedList = (this.labelSelectedEdit?.length && vexutils.clone(this.labelSelectedEdit, true)) || [];
481
514
  if (v) {
482
515
  if (selectedList.some(n => n.labelId == d.labelId)) {
483
516
  return;
@@ -500,6 +533,12 @@ export default create({
500
533
  }
501
534
  }
502
535
  this.labelSelectedEdit = [...selectedList];
536
+ this.$forceUpdate();
537
+
538
+ // 外显实时改变通知
539
+ if (this.explicit) {
540
+ this.$emit('explicitOnChange', [...this.labelSelectedEdit]);
541
+ }
503
542
  },
504
543
 
505
544
  async handleDelLabel(v) {
@@ -520,7 +559,7 @@ export default create({
520
559
  this.$emit('valueOnChange', [...selectObj], this.item);
521
560
  this.$emit('onChange', [...selectObj]);
522
561
  }
523
- this.$emit('updateLabelData')
562
+ this.$emit('updateLabelData');
524
563
  // this.handleEditLabel(this.editLabelItem, true);
525
564
  } else {
526
565
  this.$message.warning('删除失败');
@@ -573,8 +612,38 @@ export default create({
573
612
  * 重置label选项
574
613
  */
575
614
  handleResetOptions() {
576
- this.$set(this.item, "labelObj", {});
577
- this.$set(this.item, "labelList", null);
615
+ this.$set(this.item, 'labelObj', {});
616
+ this.$set(this.item, 'labelList', null);
617
+ },
618
+
619
+ /**
620
+ * 设置标签单个状态
621
+ */
622
+ hanldeSetLabelItem(id, state) {
623
+ const { labelConfig } = this;
624
+ if (typeof labelConfig === 'object') {
625
+ let keys = Object.keys(labelConfig || {});
626
+ keys.forEach(k => {
627
+ let itemList = labelConfig[k]?.itemList || [];
628
+ if (itemList.length) {
629
+ itemList.forEach(v => {
630
+ if (id == v.labelId) {
631
+ this.$set(v, 'isSelect', state);
632
+ }
633
+ });
634
+ }
635
+ });
636
+ }
637
+ // 如果是删除
638
+ if (false === state) {
639
+ // 删除选中list
640
+ if (Array.isArray(this.labelSelectedEdit)) {
641
+ const fdIndex = this.labelSelectedEdit.findIndex(n => n.labelId == id);
642
+ if (fdIndex != -1) {
643
+ this.labelSelectedEdit.splice(fdIndex, 1);
644
+ }
645
+ }
646
+ }
578
647
  }
579
648
  }
580
649
  });
@@ -595,6 +664,12 @@ export default create({
595
664
  height: calc(100vh - 109px);
596
665
  max-height: calc(100vh - 109px);
597
666
  }
667
+ &.explicit-label-wrap {
668
+ width: 100%;
669
+ height: auto;
670
+ overflow: hidden;
671
+ overflow-y: auto;
672
+ }
598
673
  /deep/.ant-tabs {
599
674
  height: 100%;
600
675
  .ant-tabs-nav-container {
@@ -632,6 +707,64 @@ export default create({
632
707
  max-height: calc(100vh - 109px);
633
708
  }
634
709
  }
710
+ .explicit-continer {
711
+ width: 100%;
712
+ border: 1px solid #d5d5d5;
713
+ // background: #F9F9F9;
714
+ /deep/ .ant-tabs-card {
715
+ .ant-tabs-nav-container {
716
+ height: 30px;
717
+ line-height: 30px;
718
+ margin-top: 0px;
719
+ .ant-tabs-tab-prev {
720
+ border-bottom: 1px solid #e8e8e8;
721
+ border-right: 1px solid #e8e8e8;
722
+ }
723
+ .ant-tabs-tab-next {
724
+ border-bottom: 1px solid #e8e8e8;
725
+ border-left: 1px solid #e8e8e8;
726
+ }
727
+ }
728
+ > .ant-tabs-content {
729
+ // height: 120px;
730
+ margin-top: -16px;
731
+
732
+ > .ant-tabs-tabpane {
733
+ background: #fff;
734
+ padding: 16px;
735
+ }
736
+ }
737
+
738
+ // ant-tabs-tab
739
+
740
+ > .ant-tabs-bar {
741
+ border-color: #fff;
742
+ .ant-tabs-tab {
743
+ margin-right:0;
744
+ border-radius:0;
745
+ line-height: 30px;
746
+ height: 30px;
747
+
748
+ border-right: 1px solid #e8e8e8!important;
749
+ border-bottom: 1px solid #e8e8e8;
750
+ border-top: none;
751
+
752
+ // border-color: transparent;
753
+ background: #F9F9F9;
754
+ &:first-of-type{
755
+ border-left: 1px solid #e8e8e8;
756
+ }
757
+ &.ant-tabs-tab-active {
758
+ border-bottom-color: #fff;
759
+ background: #fff;
760
+ }
761
+ }
762
+
763
+ }
764
+
765
+ .ant-tabs-bar;
766
+ }
767
+ }
635
768
  }
636
769
  .edit-label-type {
637
770
  font-size: 12px;