cnhis-design-vue 2.0.2 → 2.0.5

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 (105) hide show
  1. package/CHANGELOG.md +25 -4
  2. package/es/affix/index.js +8 -8
  3. package/es/age/index.js +10 -10
  4. package/es/alert/index.js +8 -8
  5. package/es/anchor/index.js +8 -8
  6. package/es/auto-complete/index.js +8 -8
  7. package/es/avatar/index.js +8 -8
  8. package/es/back-top/index.js +8 -8
  9. package/es/badge/index.js +8 -8
  10. package/es/base/index.js +8 -8
  11. package/es/big-table/index.js +311 -283
  12. package/es/big-table/style.css +1 -1
  13. package/es/breadcrumb/index.js +8 -8
  14. package/es/button/index.js +28 -28
  15. package/es/calendar/index.js +8 -8
  16. package/es/captcha/index.js +3 -3
  17. package/es/card/index.js +8 -8
  18. package/es/carousel/index.js +8 -8
  19. package/es/cascader/index.js +8 -8
  20. package/es/checkbox/index.js +9 -9
  21. package/es/col/index.js +8 -8
  22. package/es/collapse/index.js +8 -8
  23. package/es/color-picker/index.js +1 -1
  24. package/es/comment/index.js +8 -8
  25. package/es/config-provider/index.js +8 -8
  26. package/es/date-picker/index.js +8 -8
  27. package/es/descriptions/index.js +8 -8
  28. package/es/divider/index.js +8 -8
  29. package/es/drag-layout/index.js +3 -3
  30. package/es/drawer/index.js +8 -8
  31. package/es/dropdown/index.js +8 -8
  32. package/es/editor/index.js +51 -24
  33. package/es/editor/style.css +1 -1
  34. package/es/empty/index.js +8 -8
  35. package/es/fabric-chart/index.js +9 -9
  36. package/es/form/index.js +8 -8
  37. package/es/form-model/index.js +8 -8
  38. package/es/form-table/index.js +62 -62
  39. package/es/index/index.js +939 -863
  40. package/es/index/style.css +1 -1
  41. package/es/input/index.js +9 -9
  42. package/es/input-number/index.js +8 -8
  43. package/es/layout/index.js +8 -8
  44. package/es/list/index.js +8 -8
  45. package/es/locale-provider/index.js +8 -8
  46. package/es/map/index.js +9 -9
  47. package/es/mentions/index.js +8 -8
  48. package/es/menu/index.js +8 -8
  49. package/es/message/index.js +8 -8
  50. package/es/multi-chat/index.js +141 -125
  51. package/es/multi-chat/style.css +1 -1
  52. package/es/multi-chat-client/index.js +108 -92
  53. package/es/multi-chat-client/style.css +1 -1
  54. package/es/multi-chat-history/index.js +27 -27
  55. package/es/multi-chat-history/style.css +1 -1
  56. package/es/multi-chat-record/index.js +37 -37
  57. package/es/multi-chat-record/style.css +1 -1
  58. package/es/multi-chat-setting/index.js +61 -45
  59. package/es/multi-chat-setting/style.css +1 -1
  60. package/es/multi-chat-sip/index.js +1 -1
  61. package/es/notification/index.js +8 -8
  62. package/es/page-header/index.js +8 -8
  63. package/es/pagination/index.js +8 -8
  64. package/es/popconfirm/index.js +8 -8
  65. package/es/popover/index.js +8 -8
  66. package/es/progress/index.js +8 -8
  67. package/es/radio/index.js +9 -9
  68. package/es/rate/index.js +8 -8
  69. package/es/result/index.js +8 -8
  70. package/es/row/index.js +8 -8
  71. package/es/scale-view/index.js +24 -24
  72. package/es/select/index.js +11 -11
  73. package/es/select-label/index.js +11 -11
  74. package/es/select-person/index.js +169 -143
  75. package/es/select-person/style.css +1 -1
  76. package/es/skeleton/index.js +8 -8
  77. package/es/slider/index.js +8 -8
  78. package/es/space/index.js +8 -8
  79. package/es/spin/index.js +8 -8
  80. package/es/statistic/index.js +8 -8
  81. package/es/steps/index.js +8 -8
  82. package/es/switch/index.js +8 -8
  83. package/es/table-filter/index.js +53 -53
  84. package/es/tabs/index.js +8 -8
  85. package/es/tag/index.js +9 -9
  86. package/es/time-picker/index.js +8 -8
  87. package/es/timeline/index.js +8 -8
  88. package/es/tooltip/index.js +8 -8
  89. package/es/transfer/index.js +8 -8
  90. package/es/tree/index.js +8 -8
  91. package/es/tree-select/index.js +8 -8
  92. package/es/upload/index.js +8 -8
  93. package/es/verification-code/index.js +2 -2
  94. package/lib/cui.common.js +4825 -7064
  95. package/lib/cui.umd.js +4825 -7064
  96. package/lib/cui.umd.min.js +85 -85
  97. package/package.json +4 -2
  98. package/packages/big-table/src/BigTable.vue +13 -1
  99. package/packages/editor/src/Editor.vue +6 -1
  100. package/packages/multi-chat/chat/chatHistory.vue +1 -1
  101. package/packages/multi-chat/chat/chatMain.vue +1 -1
  102. package/packages/multi-chat/chat/messageRecord.vue +1 -1
  103. package/packages/multi-chat/chat/mixins/base.js +5 -0
  104. package/packages/multi-chat/setting/sessionList/messageRecord.vue +1 -1
  105. package/packages/select-person/select-person.vue +73 -56
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cnhis-design-vue",
3
- "version": "2.0.2",
3
+ "version": "2.0.5",
4
4
  "description": "前端业务UI库",
5
5
  "keyword": "cnhis-design-vue vue cnhis",
6
6
  "homepage": "http://dv.cnhis.com/",
@@ -52,6 +52,7 @@
52
52
  "vue-infinite-scroll": "^2.0.2",
53
53
  "vue-resize-directive": "^1.2.0",
54
54
  "vue-simple-uploader": "^0.7.6",
55
+ "vue-xss": "^1.0.4",
55
56
  "vuedraggable": "^2.24.3",
56
57
  "vxe-table": "^3.4.1",
57
58
  "vxe-table-plugin-antd": "^1.11.3",
@@ -85,7 +86,8 @@
85
86
  "vue": "^2.6.14",
86
87
  "vue-router": "^3.5.1",
87
88
  "vue-template-compiler": "^2.6.14",
88
- "webpack-node-externals": "^3.0.0"
89
+ "webpack-node-externals": "^3.0.0",
90
+ "webpack-ssh-deploy": "^1.2.3"
89
91
  },
90
92
  "browserslist": [
91
93
  "> 1%",
@@ -147,6 +147,7 @@
147
147
 
148
148
  <script>
149
149
  import Vue from 'vue';
150
+ import VueXss from "vue-xss";
150
151
  import TextOverTooltip from './components/TextOverTooltip.vue';
151
152
  import { Icon, Tooltip, Progress, Switch, Popover, Button, Dropdown, Menu, Checkbox, Input, Popconfirm } from 'ant-design-vue';
152
153
  import format from './utils/format';
@@ -197,6 +198,7 @@ export default create({
197
198
  .use(Checkbox)
198
199
  .use(Input)
199
200
  .use(DomPortal);
201
+ !this.$xss && Vue.use(VueXss);
200
202
  },
201
203
  mounted() {
202
204
  this.bindDocumentClick();
@@ -375,7 +377,17 @@ export default create({
375
377
  this.loadColumn(config);
376
378
  },
377
379
  data(value) {
378
- this.loadData(value);
380
+ const list = value.map(v => {
381
+ const newV = {};
382
+ for (let i in v) {
383
+ newV[i] = JSON.parse(JSON.stringify(v[i] || ""));
384
+ if (newV[i] && typeof v[i] === "string") {
385
+ newV[i] = this.$xss(v[i]);
386
+ }
387
+ }
388
+ return newV;
389
+ });
390
+ this.loadData(list);
379
391
  },
380
392
  quickSearchConfig: {
381
393
  handler: function() {
@@ -10,6 +10,8 @@
10
10
  */
11
11
  import create from '@/core/create';
12
12
  import E from 'wangeditor';
13
+ import Vue from 'vue';
14
+ import VueXss from "vue-xss";
13
15
 
14
16
  const colors = ['#ff0000'];
15
17
  export default create({
@@ -41,6 +43,9 @@ export default create({
41
43
  newHtml: ''
42
44
  };
43
45
  },
46
+ beforeCreate() {
47
+ !this.$xss && Vue.use(VueXss);
48
+ },
44
49
  mounted() {
45
50
  // 每次实例都生成唯一的id
46
51
  this.editorWrapId = this.randomId();
@@ -126,7 +131,7 @@ export default create({
126
131
  this.$emit('input', res);
127
132
  },
128
133
  setContent(content) {
129
- this.editor.txt.html(content);
134
+ this.editor.txt.html((content && this.$xss(content)) || '');
130
135
  },
131
136
  appendContent(content) {
132
137
  this.editor.txt.append(content);
@@ -21,7 +21,7 @@
21
21
  <span class="right-time">
22
22
  {{ formatDate(item.createdTime || item.sendTime, true) }}
23
23
  </span>
24
- <p class="content" v-html="item.content.content"></p>
24
+ <p class="content" v-html="$xss(item.content.content)"></p>
25
25
  </div>
26
26
  <div v-else-if="item.content.type === 1" style="margin-bottom: 20px;" class="upload-image content-wrap">
27
27
  <span class="right-time">
@@ -93,7 +93,7 @@
93
93
  'has-intention': item.intentionList && item.intentionList.length
94
94
  }"
95
95
  >
96
- <p v-html="item.content.content"></p>
96
+ <p v-html="$xss(item.content.content)"></p>
97
97
  <template v-if="item.content.attachments && item.content.attachments.length > 0">
98
98
  <div v-for="(v, index) in item.content.attachments" :key="index" class="robot-item">
99
99
  <a v-if="v.type == 1" :href="v.url" target="_blank"> {{ v.desc }}(超链) </a>
@@ -26,7 +26,7 @@
26
26
  <span class="name">{{ getName(item) }}</span>
27
27
  <span class="time">{{ formatDate(item.sendTime || item.createdTime, true) }}</span>
28
28
  </div>
29
- <div class="content" v-if="item.content.type === 0" v-html="item.content.content"></div>
29
+ <div class="content" v-if="item.content.type === 0" v-html="$xss(item.content.content)"></div>
30
30
  <MsgPicture v-if="item.content.type === 1" :image="item.content.content" style="width:160px;" @click="show(item.content.content)" />
31
31
  <template v-else-if="item.content.type === 4">
32
32
  <div v-if="isSystemMsg(item)" class="system-msg">
@@ -1,5 +1,7 @@
1
1
  import ChatStore from '../../store';
2
2
  import { mapMutations } from '../../store/helper';
3
+ import VueXss from "vue-xss";
4
+ import Vue from 'vue'
3
5
 
4
6
  export default {
5
7
  provide() {
@@ -12,6 +14,9 @@ export default {
12
14
  i18nText: this.i18nText
13
15
  };
14
16
  },
17
+ beforeCreate() {
18
+ !this.$xss && Vue.use(VueXss);
19
+ },
15
20
  props: {
16
21
  getI18nText: {
17
22
  type: Function
@@ -17,7 +17,7 @@
17
17
  {{ formatDate(item.sendTime || item.createdTime, true) }}
18
18
  </span>
19
19
  </div>
20
- <div class="content" v-if="item.content.type === 0" v-html="item.content.content"></div>
20
+ <div class="content" v-if="item.content.type === 0" v-html="$xss(item.content.content)"></div>
21
21
  <MsgPicture v-if="item.content.type === 1" :image="item.content.content" style="width:160px;" @click="show(item.content.content)" />
22
22
  <p class="content" v-else-if="item.content.type === 2">
23
23
  <img style="width:16px;" src="../../img/video_consult.png" />
@@ -44,7 +44,7 @@
44
44
  checkable
45
45
  :expandedKeys="expandedKeys"
46
46
  :autoExpandParent="autoExpandParent"
47
- :checkStrictly="true"
47
+ :checkStrictly="false"
48
48
  :selectable="false"
49
49
  :treeData="treeData.temp"
50
50
  :load-data="getLoadChildData"
@@ -326,17 +326,12 @@ export default create({
326
326
  return checked && item.type == 2;
327
327
  });
328
328
  let deptItems = this.dataList.dept.filter(item => {
329
- let { isLeaf, key } = item;
330
- let parentId = this.getParentId(item);
329
+ let { key } = item;
331
330
  let showKeys = [...this.checkedKeys.dept, ...otherItems];
332
331
  let checked = showKeys.includes(key);
333
- // 父级全选,子级不展示
334
- /** String(parentId) 类型不相等 */
335
- if (isLeaf && parentId && this.checkedKeys.dept.some(v => v == parentId)) {
336
- checked = false;
337
- }
332
+ // 只展示最后一级的科室
338
333
  item.itemType = 'dept';
339
- return checked && item.type == 1;
334
+ return checked && item.type == 1 && (!item.children || (item.children && !item.children.length));
340
335
  });
341
336
  let roleItems = this.dataList.role.filter(item => {
342
337
  let showKeys = [...this.checkedKeys.role, ...otherItems];
@@ -347,12 +342,12 @@ export default create({
347
342
  if (this.selectType === 'multiple') {
348
343
  deptItems.forEach(item => {
349
344
  if (item.title) {
350
- item.title = item.title.includes('科室') ? item.title : `${item.title}(科室)`;
345
+ item.title = item.title.includes('(科室)') ? item.title : `${item.title}(科室)`;
351
346
  }
352
347
  });
353
348
  roleItems.map(item => {
354
349
  if (item.title) {
355
- item.title = item.title.includes('角色') ? item.title : `${item.title}(角色)`;
350
+ item.title = item.title.includes('(角色)') ? item.title : `${item.title}(角色)`;
356
351
  }
357
352
  return item;
358
353
  });
@@ -381,13 +376,13 @@ export default create({
381
376
  }
382
377
  },
383
378
  watch: {
384
- defaultList: {
385
- immediate: true,
386
- handler(val) {
387
- if (!val) return;
388
- this.initDefault();
389
- }
390
- },
379
+ // defaultList: {
380
+ // immediate: true,
381
+ // handler(val) {
382
+ // if (!val) return;
383
+ // this.initDefault();
384
+ // }
385
+ // },
391
386
  selectType: {
392
387
  immediate: true,
393
388
  handler(val) {
@@ -400,9 +395,7 @@ export default create({
400
395
  immediate: true,
401
396
  handler() {
402
397
  this.staticDataInit();
403
- if (['dept'].includes(this.selectType)) {
404
- this.staticDeptAndRoleDataInit();
405
- }
398
+ this.staticDeptAndRoleDataInit();
406
399
  const key = { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
407
400
  this.treeData.temp = this.treeData[key];
408
401
  }
@@ -410,20 +403,16 @@ export default create({
410
403
  roleData: {
411
404
  immediate: true,
412
405
  handler() {
413
- if (['multiple', 'role'].includes(this.selectType)) {
414
- this.staticDeptAndRoleDataInit();
415
- const key = { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
416
- this.treeData.temp = this.treeData[key];
417
- }
406
+ this.staticDeptAndRoleDataInit();
407
+ const key = { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
408
+ this.treeData.temp = this.treeData[key];
418
409
  }
419
- },
420
- checkedTreeItem(val) {
421
- this.$emit('check', [...val, ...this.defaultShowList]);
422
410
  }
423
411
  },
424
412
  created() {},
425
413
  mounted() {
426
414
  this.getUsers();
415
+ this.initDefault();
427
416
  },
428
417
  methods: {
429
418
  initDefault() {
@@ -431,7 +420,14 @@ export default create({
431
420
  this.getDefaultList();
432
421
  } else {
433
422
  this.$nextTick(() => {
434
- this.checkedKeys.main = [...this.defaultList];
423
+ const userIds = this.defaultList.filter(item => item.itemType === 'person').map(item => item.id);
424
+ const deptIds = this.defaultList.filter(item => item.itemType === 'dept').map(item => item.id);
425
+ const roleIds = this.defaultList.filter(item => item.itemType === 'role').map(item => item.id);
426
+ const key = ['main', 'dept', 'role'][this.typeActiveIndex];
427
+ this.checkedKeys.main = userIds;
428
+ this.checkedKeys.dept = deptIds;
429
+ this.checkedKeys.role = roleIds;
430
+ this.checkedKeys.temp = this.checkedKeys[key];
435
431
  });
436
432
  }
437
433
  },
@@ -844,13 +840,13 @@ export default create({
844
840
  this.searchChecked = checked;
845
841
  }
846
842
  this.checkAll(checked ? 1 : 2);
843
+ this.handleOk();
847
844
  },
848
845
  // type 1 全选 2 反选(清空)
849
846
  checkAll(type) {
850
847
  if (this.checkAllSearchTree(type)) return false;
851
848
  const key = ['main', 'dept', 'role'][this.typeActiveIndex];
852
849
  if (type == 1) {
853
- console.log(key, this[`dataList${key.slice(0, 1).toUpperCase()}${key.slice(1)}Keys`], 'dqee2');
854
850
  this.expandedKeys = [];
855
851
  this.checkedKeys[key] = this[`dataList${key.slice(0, 1).toUpperCase()}${key.slice(1)}Keys`]; // dataListMainKeys dataListDeptKeys dataListRoleKeys;
856
852
  this.checkedKeys.temp = this.checkedKeys[key];
@@ -1036,8 +1032,12 @@ export default create({
1036
1032
  this.removedCheckedkeysDept(removedTag);
1037
1033
  this.removedCheckedkeysRole(removedTag);
1038
1034
  this.removedCheckedkeysOther(removedTag);
1039
-
1035
+ const propStr = ['person', 'dept', 'role'][this.typeActiveIndex];
1036
+ const checkedKeys = this.checkedTreeItem.filter(item => item.itemType === propStr).map(item => item.key);
1037
+ this.checkedKeys.temp = checkedKeys;
1038
+ this.handleEmitValue();
1040
1039
  this.refreshSearchTree();
1040
+ this.isAllCheck(checkedKeys);
1041
1041
  },
1042
1042
 
1043
1043
  removeCheckedkeysIncludeChildren(parentKey) {
@@ -1068,12 +1068,27 @@ export default create({
1068
1068
  }
1069
1069
  }
1070
1070
  },
1071
+ removeCheckedkeysIncludeChildrenDept(parentKey) {
1072
+ let needRemoveChildKeys = this.dataList.dept
1073
+ .filter(i => {
1074
+ let parentId = this.getParentId(i);
1075
+ return parentId == parentKey || i.key == parentKey;
1076
+ })
1077
+ .map(i => {
1078
+ return i.key;
1079
+ });
1080
+ const checkedKeys = this.checkedKeys.dept.filter(i => {
1081
+ return !needRemoveChildKeys.includes(i);
1082
+ });
1083
+ this.checkedKeys.dept = checkedKeys;
1084
+ },
1071
1085
  removedCheckedkeysDept(tag) {
1072
1086
  let checkedKeys = this.checkedKeys.dept;
1073
1087
  let parentId = this.getParentId(tag);
1074
1088
  for (let i = 0; i < checkedKeys.length; i++) {
1089
+ console.log(tag, checkedKeys[i], parentId, 'forfor');
1075
1090
  if (tag.key == checkedKeys[i] && tag.key == parentId) {
1076
- this.removeCheckedkeysIncludeChildren(tag.key);
1091
+ this.removeCheckedkeysIncludeChildrenDept(tag.key);
1077
1092
  return false;
1078
1093
  } else if (tag.key == checkedKeys[i]) {
1079
1094
  checkedKeys.splice(i, 1);
@@ -1171,6 +1186,7 @@ export default create({
1171
1186
  // let subList = [...submitData, ...this.defaultShowList];
1172
1187
 
1173
1188
  this.$emit('pubCheckedTreeItem', [...this.checkedTreeItem, ...this.defaultShowList]);
1189
+ this.$emit('check', [...this.checkedTreeItem, ...this.defaultShowList]);
1174
1190
  this.$emit('handleOk', this.checkedLeafKeys);
1175
1191
  this.$emit('change', this.checkedLeafKeys, [...submitData, ...this.defaultShowList]);
1176
1192
  this.$emit('submitData', [...submitData, ...this.defaultShowList]);
@@ -1293,33 +1309,34 @@ export default create({
1293
1309
  // 处理全选框
1294
1310
  this.isAllCheck(checkedKeys);
1295
1311
  },
1296
- onTreeCheck({ checked: checkedKeys }, { checked, node }) {
1297
- // 断掉了父子关系 要不然当存在一二级科室的时候 搜索二级科室 再选中会把一级也选中
1312
+ onTreeCheck(checkedKeys, { checked, node }) {
1313
+ // 断掉了父子关系 要不然当存在一二级科室的时候 搜索二级科室 再选中会把一级也选中 ; 后续与产品沟通 不需要断 只取最后一级科室
1298
1314
  const propStr = ['main', 'dept', 'role'][this.typeActiveIndex];
1299
1315
  let totalCheckedKeys = [];
1300
1316
  const childKeys = [];
1301
1317
  // const keyData = this.dataList[propStr].find(item => item.key === node.eventKey);
1302
- let keyData = {};
1303
- vexutils.searchTree(this.treeData[propStr], item => {
1304
- if (item.key === node.eventKey) {
1305
- keyData = item;
1306
- }
1307
- });
1308
- vexutils.searchTree(keyData.children, item => {
1309
- childKeys.push(item.key);
1310
- });
1311
- if (checked) {
1312
- const singleCheckedKeys = this.getSingleCheckedKeys(propStr, this.treeData[propStr], keyData);
1313
- totalCheckedKeys = this.isSingleCheck ? singleCheckedKeys : [...new Set(checkedKeys.concat(childKeys))];
1314
- } else {
1315
- // totalCheckedKeys = checkedKeys;
1316
- totalCheckedKeys = this.isSingleCheck ? [] : checkedKeys.filter(key => !childKeys.includes(key));
1317
- }
1318
- this.checkedKeys.temp = totalCheckedKeys;
1319
- this.checkedKeys[propStr] = totalCheckedKeys;
1320
- this.isAllCheck(totalCheckedKeys);
1321
- this.isSearchAllCheck(totalCheckedKeys);
1322
- this.handleEmitValue();
1318
+ // let keyData = {};
1319
+ // vexutils.searchTree(this.treeData[propStr], item => {
1320
+ // if (item.key === node.eventKey) {
1321
+ // keyData = item;
1322
+ // }
1323
+ // });
1324
+ // vexutils.searchTree(keyData.children, item => {
1325
+ // childKeys.push(item.key);
1326
+ // });
1327
+ // if (checked) {
1328
+ // const singleCheckedKeys = this.getSingleCheckedKeys(propStr, this.treeData[propStr], keyData);
1329
+ // totalCheckedKeys = this.isSingleCheck ? singleCheckedKeys : [...new Set(checkedKeys.concat(childKeys))];
1330
+ // } else {
1331
+ // // totalCheckedKeys = checkedKeys;
1332
+ // totalCheckedKeys = this.isSingleCheck ? [] : checkedKeys.filter(key => !childKeys.includes(key));
1333
+ // }
1334
+ this.checkedKeys.temp = checkedKeys;
1335
+ this.checkedKeys[propStr] = checkedKeys;
1336
+ this.isAllCheck(checkedKeys);
1337
+ this.isSearchAllCheck(checkedKeys);
1338
+ this.$emit('pubCheckedTreeItem', [...this.checkedTreeItem, ...this.defaultShowList]);
1339
+ this.$emit('check', [...this.checkedTreeItem, ...this.defaultShowList]);
1323
1340
  },
1324
1341
  getSingleCheckedKeys(propStr, treeData, keyData) {
1325
1342
  const firstTreeData = deepTraversalFirst(keyData) || [];