n20-common-lib 2.9.13 → 2.9.14

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 (130) hide show
  1. package/nstc-g6/components/NstcCharts/NstcCharts.vue +16 -8
  2. package/package.json +8 -5
  3. package/src/assets/css/approve-card.scss +1 -1
  4. package/src/assets/css/date-quarter.scss +8 -0
  5. package/src/assets/css/expandable-pane.scss +7 -0
  6. package/src/assets/css/file-upload-table.scss +2 -3
  7. package/src/assets/css/font-icon.scss +3 -1
  8. package/src/assets/css/message.scss +6 -6
  9. package/src/assets/css/normalize.scss +4 -1
  10. package/src/assets/css/table.scss +16 -11
  11. package/src/assets/iconFont/SIMSUN.ttf +0 -0
  12. package/src/assets/iconFont/font.css +4 -0
  13. package/src/components/AIButton/index.vue +101 -0
  14. package/src/components/AdvancedFilter/formItemRender.vue +7 -4
  15. package/src/components/AdvancedFilter/index.vue +6 -7
  16. package/src/components/Anchor/index.vue +1 -0
  17. package/src/components/ApprovalButtons/index.vue +404 -82
  18. package/src/components/ApprovalButtons/indexApp.vue +1102 -0
  19. package/src/components/ApprovalButtons/selectSpr.vue +128 -0
  20. package/src/components/ApprovalButtons/setCarboncopyProp.vue +1 -1
  21. package/src/components/ApprovalButtons/setRejectToProp.vue +45 -5
  22. package/src/components/ApprovalButtons/showAppOpi.vue +265 -8
  23. package/src/components/ApprovalButtons/showOtherAttrNew.vue +161 -0
  24. package/src/components/ApprovalCard/index.vue +190 -44
  25. package/src/components/ApprovalCard/indexApp.vue +592 -0
  26. package/src/components/ApprovalRecord/approvalImgPro/child.vue +1 -1
  27. package/src/components/ApprovalRecord/approvalImgPro/index.vue +42 -5
  28. package/src/components/ApprovalRecord/index.vue +23 -6
  29. package/src/components/ApprovalRecord/indexApp.vue +79 -0
  30. package/src/components/AttachmentPass/index.vue +286 -0
  31. package/src/components/Button/button-group.vue +3 -1
  32. package/src/components/CascaderArea/index.vue +5 -6
  33. package/src/components/DatePicker/por.vue +31 -1
  34. package/src/components/DateSelect/quarterDatePicker.vue +23 -1
  35. package/src/components/Descriptions/index.vue +7 -3
  36. package/src/components/Dialog/index.vue +4 -0
  37. package/src/components/Diff/index.vue +4 -2
  38. package/src/components/DynamicField/DynamicField.vue +29 -6
  39. package/src/components/DynamicField/DynamicFieldMixin.js +13 -5
  40. package/src/components/DynamicField/DynamicFieldOptions.vue +135 -62
  41. package/src/components/DynamicField/DynamicTable.vue +11 -1
  42. package/src/components/DynamicField/contentPop.vue +110 -0
  43. package/src/components/DynamicField/tableList.vue +5 -1
  44. package/src/components/DynamicField/tableView.vue +143 -0
  45. package/src/components/ECharts/index.vue +15 -9
  46. package/src/components/Expandable/main.vue +17 -2
  47. package/src/components/FileImport/index.vue +4 -5
  48. package/src/components/FileUploadTable/FileUploadTableV3.vue +937 -0
  49. package/src/components/FileUploadTable/aiCheckDialog.vue +139 -0
  50. package/src/components/FileUploadTable/index.vue +251 -33
  51. package/src/components/FileUploadTable/jytg.svg +6 -0
  52. package/src/components/FileUploadTable/wsc.svg +3 -0
  53. package/src/components/FileUploadTable/ysc.svg +3 -0
  54. package/src/components/HandlingAdvice/index.vue +191 -0
  55. package/src/components/InputAccount/index.vue +105 -0
  56. package/src/components/InputNumber/index.vue +16 -4
  57. package/src/components/InputNumber/numberRange.vue +14 -0
  58. package/src/components/InputSearch/index.vue +8 -0
  59. package/src/components/Layout/HeaderWrap/changePwd.vue +50 -23
  60. package/src/components/Layout/HeaderWrap/index.vue +2 -2
  61. package/src/components/Layout/HeaderWrap/indexN.vue +296 -119
  62. package/src/components/Layout/SubContent/index.vue +45 -14
  63. package/src/components/Layout/indexN.vue +26 -5
  64. package/src/components/LoginTemporary/form.vue +126 -34
  65. package/src/components/LoginTemporary/index.vue +14 -3
  66. package/src/components/LoginTemporary/indexN.vue +35 -13
  67. package/src/components/Preview/index.vue +199 -0
  68. package/src/components/SelectDatePickerPro/customDatePicker.vue +7 -0
  69. package/src/components/SelectDatePickerPro/halfYearPicker.vue +165 -0
  70. package/src/components/SelectDatePickerPro/index.vue +44 -4
  71. package/src/components/SelectDatePickerPro/quarterDatePicker.vue +32 -10
  72. package/src/components/SelectTree/index.vue +10 -4
  73. package/src/components/SelectTree/pro.vue +3 -0
  74. package/src/components/ShowColumn/index copy 2.vue +545 -0
  75. package/src/components/ShowColumn/index copy.vue +566 -0
  76. package/src/components/ShowColumn/index.vue +11 -7
  77. package/src/components/Statis/statisItem.vue +8 -7
  78. package/src/components/Table/filters.js +13 -0
  79. package/src/components/Table/index.vue +4 -4
  80. package/src/components/TablePro/filterContent.vue +18 -8
  81. package/src/components/TablePro/index.js +41 -1
  82. package/src/components/TablePro/index.vue +117 -6
  83. package/src/components/TableProOperateColumn/OperateBtns.vue +11 -53
  84. package/src/components/TableProOperateColumn/OperateBtns_copy.vue +141 -0
  85. package/src/components/TableProOperateColumn/childrenOperateBtn.vue +108 -0
  86. package/src/components/TableProOperateColumn/index.vue +3 -6
  87. package/src/components/TableSetSize/index.vue +1 -1
  88. package/src/components/Tree/index.vue +21 -5
  89. package/src/components/Upload/index.vue +25 -10
  90. package/src/components/Upload/uploadMsg.vue +30 -25
  91. package/src/components/operatingStatus/index.vue +3 -4
  92. package/src/directives/VTitle/index.js +15 -5
  93. package/src/directives/watermark/index.js +140 -56
  94. package/src/i18n.json +146 -18
  95. package/src/index.js +31 -3
  96. package/src/plugins/Sign/CaMap.js +47 -8
  97. package/src/plugins/Sign/Itrus/index.js +1 -1
  98. package/src/plugins/Sign/Itrus/sign_3720.js +2 -1
  99. package/src/plugins/Sign/NetSM3/index.js +20 -11
  100. package/src/plugins/Sign/NetV3/index.js +163 -22
  101. package/src/plugins/Sign/SkfSign/index.js +55 -52
  102. package/src/plugins/Sign/bjca/index.js +229 -9
  103. package/src/plugins/Sign/hnca/index.js +5064 -0
  104. package/src/plugins/Sign/index.js +155 -103
  105. package/src/plugins/Sign/kySign/base64.js +160 -0
  106. package/src/plugins/Sign/kySign/hex.js +92 -0
  107. package/src/plugins/Sign/kySign/index.js +186 -0
  108. package/src/plugins/Sign/kySign/skf.js +937 -0
  109. package/src/plugins/Sign/kySign/test.html +463 -0
  110. package/src/plugins/Sign/sdca/index.js +73 -0
  111. package/src/plugins/Sign/sign.js +72 -52
  112. package/src/plugins/Sign/signV3/InfosecNetSignCNGAgent.min.js +1 -0
  113. package/src/plugins/Sign/signV3/sign.js +187 -0
  114. package/src/plugins/Sign/sign_back.js +172 -0
  115. package/src/utils/accountFormat.js +7 -0
  116. package/src/utils/asyncGetRelaNos.js +79 -46
  117. package/src/utils/axios.js +3 -5
  118. package/src/utils/i18n/index.js +1 -1
  119. package/src/utils/importGlobal.js +23 -12
  120. package/style/fonts/SIMSUN.5e0c362c.ttf +0 -0
  121. package/style/index.css +2 -2
  122. package/theme/blue.css +2 -2
  123. package/theme/cctcRed.css +2 -2
  124. package/theme/fonts/SIMSUN.5e0c362c.ttf +0 -0
  125. package/theme/green.css +2 -2
  126. package/theme/lightBlue.css +2 -2
  127. package/theme/orange.css +2 -2
  128. package/theme/purple.css +2 -2
  129. package/theme/red.css +2 -2
  130. package/theme/yellow.css +2 -2
@@ -12,13 +12,13 @@
12
12
  >
13
13
  <template v-for="(item, i) in columns">
14
14
  <slot v-if="item.slotName" :name="item.slotName" :column="item"></slot>
15
- <el-table-column v-else-if="item.render" :key="'cl-table-' + i" v-bind="item">
15
+ <el-table-column v-else-if="item.render" :key="'cl-table-column-render' + i" v-bind="item">
16
16
  <columnRender slot-scope="{ row, $index }" :c-render="item.render" :row="row" :index="$index" />
17
17
  </el-table-column>
18
18
 
19
19
  <el-table-column
20
20
  v-else
21
- :key="'cl-table-' + i"
21
+ :key="'cl-table-column-' + i"
22
22
  :formatter="item.formatter | colfF(item.formatterMap)"
23
23
  :filters="item.filters | colftF(filtersMap)"
24
24
  v-bind="item"
@@ -29,7 +29,7 @@
29
29
  <ux-table
30
30
  v-else
31
31
  ref="ux-table"
32
- :key="colsKey"
32
+ :key="'ux-table-' + colsKey"
33
33
  :header-cell-style="{ 'text-align': 'center' }"
34
34
  :data="data"
35
35
  :height="height"
@@ -54,7 +54,7 @@
54
54
 
55
55
  <ux-table-column
56
56
  v-else
57
- :key="'cl-table-' + i"
57
+ :key="'cl-table-uxtable-' + i"
58
58
  :formatter="item.formatter | colf_BD_F(item.formatterMap)"
59
59
  :filters="item.filters | colft_BD_F(filtersMap)"
60
60
  :class-name="item | colKey"
@@ -4,7 +4,7 @@
4
4
  <div v-if="filterMultiple" class="my-fc-search-content">
5
5
  <template v-if="filters.length">
6
6
  <div class="my-fc-search-top">
7
- <el-input v-model="searchVal" placeholder="输入关键字进行过滤" />
7
+ <el-input v-model="searchVal" :placeholder="$lc('输入关键字进行过滤')" />
8
8
  </div>
9
9
  <div>
10
10
  <el-checkbox v-model="allCheck" :label="true" :indeterminate="indeterminate">{{
@@ -30,14 +30,23 @@
30
30
  type="primary"
31
31
  size="mini"
32
32
  @click="
33
- () => {
34
- filteredValue.length ? confirmFilterEvent() : resetFilterEvent()
33
+ (ev) => {
34
+ filteredValue.length ? confirmFilterEvent(ev) : resetFilterEvent(ev)
35
35
  }
36
36
  "
37
37
  >
38
38
  {{ '确认' | $lc }}
39
39
  </el-button>
40
- <el-button plain size="mini" @click="resetFilterEvent">{{ '清空' | $lc }}</el-button>
40
+ <el-button
41
+ plain
42
+ size="mini"
43
+ @click="
44
+ (ev) => {
45
+ resetFilterEvent(ev)
46
+ }
47
+ "
48
+ >{{ '清空' | $lc }}</el-button
49
+ >
41
50
  </div>
42
51
  </template>
43
52
  <template v-else>
@@ -216,7 +225,7 @@ export default {
216
225
  $panel.confirmFilter()
217
226
  },
218
227
  // 多选
219
- confirmFilterEvent() {
228
+ confirmFilterEvent(ev) {
220
229
  const { $panel, column } = this.params
221
230
  column.filters.map((item) => {
222
231
  item.data = { vals: this.filteredValue }
@@ -229,9 +238,10 @@ export default {
229
238
  }
230
239
  return item
231
240
  })
232
- $panel.confirmFilter()
241
+
242
+ $panel.confirmFilter(ev)
233
243
  },
234
- resetFilterEvent() {
244
+ resetFilterEvent(ev) {
235
245
  this.filteredValue = []
236
246
  const { $panel, column } = this.params
237
247
  column.filters.map((item) => {
@@ -245,7 +255,7 @@ export default {
245
255
  }
246
256
  return item
247
257
  })
248
- $panel.confirmFilter()
258
+ $panel.confirmFilter(ev)
249
259
  }
250
260
  }
251
261
  }
@@ -3,7 +3,41 @@ import 'vxe-table/lib/style.css'
3
3
  import filterContent from './filterContent.vue'
4
4
  import numerify from 'numerify'
5
5
  import dayjs from 'dayjs'
6
+ import { $lc } from '../../utils/i18n/index.js'
7
+ import zhCN from 'vxe-table/lib/locale/lang/zh-CN'
8
+ // 打平对象
9
+ function flattenObject(obj, prefix = '', result = {}) {
10
+ // 遍历对象的每个属性
11
+ for (const key in obj) {
12
+ if (obj.hasOwnProperty(key)) {
13
+ // 构建当前属性的完整键名
14
+ const fullKey = prefix ? `${prefix}.${key}` : key
6
15
 
16
+ // 如果属性值是对象且不是数组,则递归处理
17
+ if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
18
+ flattenObject(obj[key], fullKey, result)
19
+ } else {
20
+ // 否则直接添加到结果中
21
+ result[fullKey] = obj[key]
22
+ }
23
+ }
24
+ }
25
+ return result
26
+ }
27
+ vxeTable.setup({
28
+ size: 'small',
29
+ table: {
30
+ border: true,
31
+ align: 'center',
32
+ columnConfig: {
33
+ resizable: true
34
+ }
35
+ },
36
+ // 对组件内置的提示语进行国际化翻译
37
+ i18n: (key, args) => {
38
+ return $lc(flattenObject(zhCN) && flattenObject(zhCN)[key])
39
+ }
40
+ })
7
41
  // 创建一个简单的输入框筛选
8
42
  vxeTable.renderer.add('FilterInput', {
9
43
  // 筛选模板
@@ -59,7 +93,13 @@ vxeTable.formats.mixin({
59
93
  // 四舍五入金额,每隔3位逗号分隔,默认2位数
60
94
  formatAmount({ cellValue }) {
61
95
  if (cellValue || cellValue === 0) {
62
- return numerify(cellValue, '0,0.00')
96
+ // 判断是否为字符串类数字
97
+ if (/^-?\d+(\.\d+)?$/.test(cellValue)) {
98
+ return numerify(cellValue, '0,0.00')
99
+ } else {
100
+ return cellValue
101
+ }
102
+ // return numerify(cellValue, '0,0.00')
63
103
  } else {
64
104
  return '--'
65
105
  }
@@ -15,8 +15,18 @@
15
15
  }"
16
16
  show-header-overflow
17
17
  show-overflow
18
- :row-config="{ isHover: true, useKey: true, ...$attrs.rowConfig, ...$attrs['row-config'] }"
19
- :column-config="{ resizable: true, useKey: true, ...$attrs.columnConfig, ...$attrs['column-config'] }"
18
+ :row-config="{
19
+ isHover: true,
20
+ useKey: true,
21
+ ...$attrs.rowConfig,
22
+ ...$attrs['row-config']
23
+ }"
24
+ :column-config="{
25
+ resizable: true,
26
+ useKey: true,
27
+ ...$attrs.columnConfig,
28
+ ...$attrs['column-config']
29
+ }"
20
30
  :scroll-y="scrollY"
21
31
  :sort-config="{
22
32
  multiple: false,
@@ -27,15 +37,33 @@
27
37
  ...$attrs.sortConfig,
28
38
  ...$attrs['sort-config']
29
39
  }"
30
- :filter-config="{ remote: true, iconNone: 'n20-icon-xiala-moren', iconMatch: 'n20-icon-xiala-moren' }"
40
+ :filter-config="{
41
+ remote: true,
42
+ iconNone: 'n20-icon-xiala-moren',
43
+ iconMatch: 'n20-icon-xiala-moren'
44
+ }"
31
45
  v-bind="Object.assign({ size: size }, $attrs, sizeBind)"
32
46
  v-on="$listeners"
33
47
  @sort-change="(val) => customSortMethod(val)"
34
48
  @filter-change="filterChange"
35
49
  @checkbox-change="handleSelectionChange"
36
50
  >
37
- <template v-for="(item, i) in columns">
51
+ <template v-for="(item, i) in _columns">
38
52
  <slot v-if="item.slotName" :name="item.slotName" :column="item"></slot>
53
+ <vxe-column
54
+ v-else-if="item.render"
55
+ :key="'vxe-table__render_' + i"
56
+ v-bind="item"
57
+ :formatter="item.formatter ? item.formatter : 'formatName'"
58
+ :filters="item.filters"
59
+ :filter-render="item.filters && item.filters.length > 0 ? { name: 'FilterInput' } : null"
60
+ :title="item.label"
61
+ :field="item.prop"
62
+ >
63
+ <template slot-scope="scope">
64
+ <renderer :render-content="item.render" :scope="scope" />
65
+ </template>
66
+ </vxe-column>
39
67
  <vxe-column
40
68
  v-else-if="item.type === 'checkbox'"
41
69
  :key="'vxe-table-' + i"
@@ -84,7 +112,7 @@
84
112
  :class-name="`${item.wrap && `vxe-table-custom-wrap`} ${item.bold && `font-w600`}`"
85
113
  :formatter="item.formatter ? item.formatter : 'formatName'"
86
114
  :filters="item.filters"
87
- :filter-render="item.filterRender"
115
+ :filter-render="item.filters && item.filters.length > 0 ? { name: 'FilterInput' } : null"
88
116
  :title="item.label"
89
117
  :field="item.prop"
90
118
  v-bind="item"
@@ -103,11 +131,28 @@
103
131
  <script>
104
132
  import empty from '../Empty'
105
133
  import tableSetSize from '../TableSetSize/index.vue'
134
+ import { $lc } from '../../utils/i18n/index.js'
135
+ import XEUtils from 'xe-utils'
136
+ const renderer = {
137
+ name: 'renderer',
138
+ props: {
139
+ renderContent: {
140
+ type: Function
141
+ },
142
+ scope: {
143
+ type: Object
144
+ }
145
+ },
146
+ render(h) {
147
+ return this.renderContent(h, this.scope.row, this.scope)
148
+ }
149
+ }
106
150
  export default {
107
151
  name: 'TablePro',
108
152
  components: {
109
153
  tableSetSize,
110
- empty
154
+ empty,
155
+ renderer
111
156
  },
112
157
  props: {
113
158
  scrollY: {
@@ -171,6 +216,11 @@ export default {
171
216
  key: 0
172
217
  }
173
218
  },
219
+ computed: {
220
+ _columns() {
221
+ return this.calcColumnWidth(this.columns)
222
+ }
223
+ },
174
224
  watch: {
175
225
  columns() {
176
226
  this.colsKey = this.colsKey + 1
@@ -281,6 +331,67 @@ export default {
281
331
  },
282
332
  sizeSet(el) {
283
333
  this.sizeBind = el
334
+ },
335
+ // 计算列宽
336
+ calcColumnWidth(columns) {
337
+ columns = columns.map((item) => {
338
+ return {
339
+ ...item,
340
+ _width_: 0
341
+ }
342
+ })
343
+ const wrapperEl = document.querySelector('div#app')
344
+ if (!wrapperEl) {
345
+ return columns
346
+ }
347
+ const { width: windowWidth } = wrapperEl.getBoundingClientRect()
348
+
349
+ // 定义每个字符的平均宽度(像素)
350
+ const CHAR_WIDTH = 20 // 根据实际字体大小调整
351
+ const PADDING = 20 // 左右padding
352
+
353
+ function calc(columns) {
354
+ let columnsWidth = 0
355
+
356
+ // 先计算每列的基础宽度
357
+ columns.forEach((column) => {
358
+ if (column.static && column.label === $lc('操作') && !column.width && !column.minWidth) {
359
+ column.width = 80
360
+ }
361
+ if (column.type === 'checkbox') {
362
+ column.width = 80
363
+ }
364
+
365
+ // 如果没有设置宽度,根据字符数计算最小宽度
366
+ if (!column.width && !column.minWidth) {
367
+ const textLength = (column.label && column.label.length) || 10
368
+ column.minWidth = Math.ceil(textLength * CHAR_WIDTH + PADDING)
369
+ }
370
+
371
+ const width = column.minWidth || column.width
372
+ column['_width_'] = column['_width_'] || parseInt(width)
373
+ column['width'] = parseInt(width)
374
+ columnsWidth += column.width
375
+ })
376
+
377
+ // 如果总宽度超过容器宽度,直接返回
378
+ if (columnsWidth >= windowWidth) {
379
+ return columns
380
+ }
381
+
382
+ // 否则按比例分配剩余空间
383
+ return columns.map((column) => {
384
+ if (!column.type) {
385
+ const rate = column['_width_'] / columnsWidth
386
+ column['width'] = Math.floor(Math.max(windowWidth * rate, column.minWidth || column.width))
387
+
388
+ return column
389
+ }
390
+ return column
391
+ })
392
+ }
393
+
394
+ return calc(columns)
284
395
  }
285
396
  }
286
397
  }
@@ -1,60 +1,14 @@
1
1
  <template>
2
- <span>
3
- <template v-for="(item, i) in dfBtns" class="flex-box flex-v">
4
- <el-dropdown
5
- v-if="item.children && item.children.length"
6
- :key="item.label"
7
- class="m-l-b"
8
- @command="(c) => $emit('command', c)"
9
- >
10
- <div class="flex-box flex-v">
11
- <el-link
12
- :key="item.label"
13
- :class="i ? 'm-l-b' : ''"
14
- type="primary"
15
- :underline="false"
16
- :disabled="item.disabled | dbdBtn(row)"
17
- @click="$emit('command', item.command)"
18
- >
19
- <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
20
- <span v-else>{{ item.label }}</span>
21
- </el-link>
22
- <i class="el-icon-arrow-down color-primary" />
23
- </div>
24
- <el-dropdown-menu slot="dropdown" class="text-c">
25
- <el-dropdown-item
26
- v-for="item1 in item.children"
27
- :key="item1.label"
28
- :command="item1.command"
29
- :disabled="item1.disabled | dbdBtn(row)"
30
- >
31
- <el-link v-if="item1.type" :type="item1.type" :underline="false">{{ item1.label }}</el-link>
32
- <template v-else>{{ item1.label }}</template>
33
- </el-dropdown-item>
34
- </el-dropdown-menu>
35
- </el-dropdown>
36
- <el-link
37
- v-else
38
- :key="item.label"
39
- :class="i ? 'm-l-b' : ''"
40
- :type="item.type || 'primary'"
41
- :underline="false"
42
- :disabled="item.disabled | dbdBtn(row)"
43
- @click="$emit('command', item.command)"
44
- >
45
- <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
46
- <span v-else>{{ item.label }}</span>
47
- </el-link>
48
- </template>
49
-
2
+ <div class="flex-box flex-v flex-c">
3
+ <childrenOperateBtn :btn-list="dfBtns" :row="row" @command="(c) => $emit('command', c)" />
50
4
  <el-dropdown v-if="moreBtns.length" class="m-l-b" @command="(c) => $emit('command', c)">
51
- <el-button class="n20-icon-moren" type="text" size="mini" />
5
+ <el-button class="n20-icon-moren" size="mini" type="text" />
52
6
  <el-dropdown-menu slot="dropdown" class="text-c">
53
7
  <template v-for="(item, i) in moreBtns">
54
- <el-dropdown-item :key="i" v-if="item.children && item.children.length">
8
+ <el-dropdown-item v-if="item.children && item.children.length" :key="i">
55
9
  <template>{{ item.label }}</template>
56
10
  <el-dropdown class="m-l-b" @command="(c) => $emit('command', c)">
57
- <i class="el-icon-arrow-down" />
11
+ <i class="el-icon-arrow-down"></i>
58
12
  <el-dropdown-menu slot="dropdown" class="text-c">
59
13
  <el-dropdown-item
60
14
  v-for="item2 in item.children"
@@ -75,12 +29,16 @@
75
29
  </template>
76
30
  </el-dropdown-menu>
77
31
  </el-dropdown>
78
- </span>
32
+ </div>
79
33
  </template>
80
-
81
34
  <script>
35
+ import childrenOperateBtn from './childrenOperateBtn.vue'
36
+
82
37
  export default {
83
38
  name: 'TableOperate',
39
+ components: {
40
+ childrenOperateBtn
41
+ },
84
42
  filters: {
85
43
  dbdBtn(dbd, row) {
86
44
  if (dbd === undefined || dbd === null) {
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <div class="flex-box flex-v">
3
+ <template v-for="(item, i) in dfBtns" class="flex-box flex-v">
4
+ <el-dropdown
5
+ v-if="item.children && item.children.length"
6
+ :key="item.label"
7
+ class="m-l-b"
8
+ @command="(c) => $emit('command', c)"
9
+ >
10
+ <div class="flex-box flex-v">
11
+ <el-link
12
+ :key="item.label"
13
+ :class="i ? 'm-l-b' : ''"
14
+ type="primary"
15
+ :underline="false"
16
+ :disabled="item.disabled | dbdBtn(row)"
17
+ @click="$emit('command', item.command)"
18
+ >
19
+ <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
20
+ <span v-else>{{ item.label }}</span>
21
+ </el-link>
22
+ <i class="el-icon-arrow-down color-primary"></i>
23
+ </div>
24
+ <el-dropdown-menu slot="dropdown" class="text-c">
25
+ <el-dropdown-item
26
+ v-for="item1 in item.children"
27
+ :key="item1.label"
28
+ :command="item1.command"
29
+ :disabled="item1.disabled | dbdBtn(row)"
30
+ >
31
+ <el-link v-if="item1.type" :type="item1.type" :underline="false">{{ item1.label }}</el-link>
32
+ <template v-else>{{ item1.label }}</template>
33
+ </el-dropdown-item>
34
+ </el-dropdown-menu>
35
+ </el-dropdown>
36
+ <el-link
37
+ v-else
38
+ :key="item.label"
39
+ :class="i ? 'm-l-b' : ''"
40
+ :type="item.type || 'primary'"
41
+ :underline="false"
42
+ :disabled="item.disabled | dbdBtn(row)"
43
+ @click="$emit('command', item.command)"
44
+ >
45
+ <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
46
+ <span v-else>{{ item.label }}</span>
47
+ </el-link>
48
+ </template>
49
+
50
+ <el-dropdown v-if="moreBtns.length" class="m-l-b" @command="(c) => $emit('command', c)">
51
+ <el-button class="n20-icon-moren" type="text" size="mini" />
52
+ <el-dropdown-menu slot="dropdown" class="text-c">
53
+ <template v-for="(item, i) in moreBtns">
54
+ <el-dropdown-item v-if="item.children && item.children.length" :key="i">
55
+ <template>{{ item.label }}</template>
56
+ <el-dropdown class="m-l-b" @command="(c) => $emit('command', c)">
57
+ <i class="el-icon-arrow-down"></i>
58
+ <el-dropdown-menu slot="dropdown" class="text-c">
59
+ <el-dropdown-item
60
+ v-for="item2 in item.children"
61
+ :key="item2.label"
62
+ :command="item2.command"
63
+ :disabled="item2.disabled | dbdBtn(row)"
64
+ >
65
+ <el-link v-if="item2.type" :type="item2.type" :underline="false">{{ item2.label }}</el-link>
66
+ <template v-else>{{ item2.label }}</template>
67
+ </el-dropdown-item>
68
+ </el-dropdown-menu>
69
+ </el-dropdown>
70
+ </el-dropdown-item>
71
+ <el-dropdown-item v-else :key="item.label" :command="item.command" :disabled="item.disabled | dbdBtn(row)">
72
+ <el-link v-if="item.type" :type="item.type" :underline="false">{{ item.label }}</el-link>
73
+ <template v-else>{{ item.label }}</template>
74
+ </el-dropdown-item>
75
+ </template>
76
+ </el-dropdown-menu>
77
+ </el-dropdown>
78
+ </div>
79
+ </template>
80
+
81
+ <script>
82
+ export default {
83
+ name: 'TableOperate',
84
+ filters: {
85
+ dbdBtn(dbd, row) {
86
+ if (dbd === undefined || dbd === null) {
87
+ return false
88
+ } else if (typeof dbd === 'boolean') {
89
+ return dbd
90
+ } else if (typeof dbd === 'function') {
91
+ return dbd(row)
92
+ }
93
+ }
94
+ },
95
+ props: {
96
+ btnList: {
97
+ type: Array,
98
+ default: () => []
99
+ },
100
+ row: {
101
+ type: Object,
102
+ default: () => ({})
103
+ }
104
+ },
105
+ data() {
106
+ return {}
107
+ },
108
+ computed: {
109
+ hasBtns() {
110
+ return this.btnList.filter((btn) => this.hasBtn(btn.isHas, this.row))
111
+ },
112
+ dfBtns() {
113
+ if (this.hasBtns.length > 3) {
114
+ return this.hasBtns.slice(0, 2)
115
+ } else {
116
+ return this.hasBtns
117
+ }
118
+ },
119
+ moreBtns() {
120
+ if (this.hasBtns.length > 3) {
121
+ return this.hasBtns.slice(2)
122
+ } else {
123
+ return []
124
+ }
125
+ }
126
+ },
127
+ methods: {
128
+ hasBtn(isHas, row) {
129
+ if (isHas === undefined || isHas === null) {
130
+ return true
131
+ } else if (typeof isHas === 'boolean') {
132
+ return isHas
133
+ } else if (typeof isHas === 'string' || Array.isArray(isHas)) {
134
+ return this.$has(isHas)
135
+ } else if (typeof isHas === 'function') {
136
+ return isHas(row)
137
+ }
138
+ }
139
+ }
140
+ }
141
+ </script>
@@ -0,0 +1,108 @@
1
+ <template>
2
+ <div class="flex-box flex-v">
3
+ <template v-for="(item, i) in btnList">
4
+ <template v-if="shouldShowButton(item, row)">
5
+ <el-dropdown
6
+ v-if="shouldShowChildren(item.children, row)"
7
+ :key="item.label"
8
+ class="m-l-b"
9
+ @command="c => $emit('command', c)"
10
+ >
11
+ <div class="flex-box flex-v">
12
+ <el-link
13
+ :key="item.label"
14
+ :class="i ? 'm-l-b' : ''"
15
+ :disabled="item.disabled | dbdBtn(row)"
16
+ :underline="false"
17
+ type="primary"
18
+ @click="$emit('command', item.command)"
19
+ >
20
+ <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
21
+ <span v-else>{{ item.label }}</span>
22
+ </el-link>
23
+ <i class="el-icon-arrow-down color-primary" />
24
+ </div>
25
+ <el-dropdown-menu slot="dropdown" class="text-c">
26
+ <el-dropdown-item
27
+ v-for="childItem in item.children"
28
+ v-if="shouldShowButton(childItem, row)"
29
+ :key="childItem.label"
30
+ :command="childItem.command"
31
+ :disabled="childItem.disabled | dbdBtn(row)"
32
+ >
33
+ <el-link v-if="childItem.type" :type="childItem.type" :underline="false">{{ childItem.label }}</el-link>
34
+ <template v-else>{{ childItem.label }}</template>
35
+ </el-dropdown-item>
36
+ </el-dropdown-menu>
37
+ </el-dropdown>
38
+ <el-link
39
+ v-else
40
+ :key="item.label"
41
+ :class="i ? 'm-l-b' : ''"
42
+ :disabled="item.disabled | dbdBtn(row)"
43
+ :type="item.type || 'primary'"
44
+ :underline="false"
45
+ @click="$emit('command', item.command)"
46
+ >
47
+ <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
48
+ <span v-else>{{ item.label }}</span>
49
+ </el-link>
50
+ </template>
51
+ </template>
52
+ </div>
53
+ </template>
54
+
55
+ <script>
56
+ export default {
57
+ name: 'ChildrenOperateBtn',
58
+ props: {
59
+ btnList: {
60
+ type: Array,
61
+ default: () => []
62
+ },
63
+ row: {
64
+ type: Object,
65
+ default: () => ({})
66
+ }
67
+ },
68
+ filters: {
69
+ dbdBtn(dbd, row) {
70
+ if (dbd === undefined || dbd === null) {
71
+ return false
72
+ } else if (typeof dbd === 'boolean') {
73
+ return dbd
74
+ } else if (typeof dbd === 'function') {
75
+ return dbd(row)
76
+ }
77
+ }
78
+ },
79
+ methods: {
80
+ shouldShowButton(childItem, row) {
81
+ if (childItem.isHas === undefined) {
82
+ return true
83
+ }
84
+ switch (typeof childItem.isHas) {
85
+ case 'boolean':
86
+ return childItem.isHas
87
+ case 'function':
88
+ return childItem.isHas(row)
89
+ case 'string':
90
+ return this.$has(childItem.isHas)
91
+
92
+ default:
93
+ console.warn(`不支持的 isHas 类型: ${typeof childItem.isHas}`)
94
+ return false
95
+ }
96
+ },
97
+ shouldShowChildren(children, row) {
98
+ if (!children || children.length === 0) {
99
+ return false
100
+ }
101
+ return children.some(child => this.shouldShowButton(child, row))
102
+ }
103
+ }
104
+ }
105
+ </script>
106
+
107
+ <style lang="less" scoped></style>
108
+ > >
@@ -1,17 +1,14 @@
1
1
  <template>
2
2
  <vxe-column :field="$attrs.prop" :title="$attrs.label" v-bind="$attrs">
3
- <OperateBtns slot-scope="{ row, $index }" :btn-list="btnList" :row="row" @command="(c) => $emit(c, row, $index)" />
3
+ <OperateBtns slot-scope="{ row, $index }" :btn-list="btnList" :row="row" @command="c => $emit(c, row, $index)" />
4
4
  </vxe-column>
5
5
  </template>
6
-
7
6
  <script>
8
- // import { $lc } from '../../utils/i18n/index'
9
7
  import OperateBtns from './OperateBtns.vue'
8
+
10
9
  export default {
11
10
  name: 'TableProOperateColumn',
12
- components: {
13
- OperateBtns
14
- },
11
+ components: { OperateBtns },
15
12
  props: {
16
13
  btnList: {
17
14
  type: Array,