n20-common-lib 3.0.86 → 3.0.88

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 (36) hide show
  1. package/package.json +1 -1
  2. package/src/assets/css/table.scss +11 -0
  3. package/src/assets/css/v3/table.scss +19 -0
  4. package/src/components/ApprovalButtons/index.vue +42 -23
  5. package/src/components/ApprovalButtons/selectSpr.vue +15 -0
  6. package/src/components/ApprovalButtons/showAppOpi.vue +5 -1
  7. package/src/components/ApprovalButtons/showOtherAttrNew.vue +40 -41
  8. package/src/components/ApprovalCard/index.vue +21 -5
  9. package/src/components/ApprovalRecord/approvalImgPro/index.vue +23 -3
  10. package/src/components/ApprovalRecord/index.vue +7 -2
  11. package/src/components/FileUploadTable/index.vue +4 -3
  12. package/src/components/HandlingAdvice/index.vue +97 -70
  13. package/src/components/InputNumber/README.md +112 -0
  14. package/src/components/Pivot/index.vue +15 -10
  15. package/src/components/TablePro/index.vue +12 -1
  16. package/src/components/TableProOperateColumn/OperateBtns.vue +25 -5
  17. package/src/components/TableProOperateColumn/childrenOperateBtn.vue +83 -25
  18. package/src/components/Tabs/index.vue +3 -3
  19. package/src/components/TertiaryTab/index.vue +2 -2
  20. package/src/components/Upload/uploadMsg.vue +2 -0
  21. package/src/components/v3/SecondaryTab/index.vue +3 -3
  22. package/src/components/v3/TablePro/index.vue +40 -7
  23. package/src/index.js +3 -0
  24. package/src/plugins/Sign/signV3/InfosecNetSignCNGAgent.min.js +4112 -1
  25. package/src/plugins/Sign/signV3/sign.js +23 -11
  26. package/style/index.css +1 -1
  27. package/theme/blue.css +1 -1
  28. package/theme/cctcRed.css +1 -1
  29. package/theme/green.css +1 -1
  30. package/theme/lightBlue.css +1 -1
  31. package/theme/orange.css +1 -1
  32. package/theme/purple.css +1 -1
  33. package/theme/red.css +1 -1
  34. package/theme/yellow.css +1 -1
  35. package/src/assets/css/table copy.scss +0 -234
  36. package/src/components/Pivot/ViewToggle.vue +0 -132
@@ -33,9 +33,9 @@
33
33
  </el-form-item>
34
34
  </el-form>
35
35
  <ExpandablePane v-if="otherAttDataA.length > 0" title="自定义项" :default-expand="true">
36
- <el-form ref="approveBtnGroup" label-position="right" :label-width="labelWidth">
36
+ <el-form ref="approveBtnGroup" label-position="top">
37
37
  <div
38
- class="p-b-lg p-t-lg p-r-lg"
38
+ class="p-b-s p-t-s"
39
39
  style="max-height: 350px; overflow-y: auto; border: 1px dashed var(--border-color-base); border-radius: 5px"
40
40
  >
41
41
  <show-other-att-new
@@ -44,7 +44,6 @@
44
44
  :other-att-data-a="otherAttDataA"
45
45
  :proc-inst-id="procInstId || this.$route.query.processInstanceId"
46
46
  :required="true"
47
- :label-width="labelWidth"
48
47
  />
49
48
  </div>
50
49
  </el-form>
@@ -70,10 +69,7 @@ export default {
70
69
  type: String,
71
70
  default: '85%'
72
71
  },
73
- labelWidth: {
74
- type: String,
75
- default: '12em'
76
- },
72
+
77
73
  afterGetConf: {
78
74
  type: Function,
79
75
  default: undefined
@@ -112,77 +108,108 @@ export default {
112
108
  },
113
109
  methods: {
114
110
  /**
115
- *
116
- * @param typeCode {String} 业务类型编码
111
+ * 获取办理意见配置
112
+ * @param {String} typeCode - 业务类型编码
113
+ * @param {String} procInstId - 流程实例ID,用于回显历史数据
117
114
  */
118
115
  async getHandlingAdvice(typeCode, procInstId) {
119
116
  try {
120
- const { code, data } = await axios.post(
121
- `/bems/activiti/admin/todo/isFlowStartWithOptions`,
122
- { typeCode },
123
- {
124
- noMsg: true
125
- }
126
- )
127
- // data.whether = true
128
- // data.optionsRequired = true
129
-
130
- if (code === 200) {
131
- this.otherAttDataA = data.customizationList || []
132
- this.whether = data.whether
133
- this.optionsRequired = data.optionsRequired
134
- if (data.optionsRequired) {
135
- this.placeholder = '请选择或输入意见(必填)'
136
- } else {
137
- this.placeholder = '请选择或输入意见(选填)'
138
- }
139
- this.visible = data.whether === true || this.otherAttDataA.length > 0
140
- this.flowOptions = data?.opinions?.map((d) => {
141
- return {
142
- label: d,
143
- value: d
144
- }
145
- })
146
- if (!data.whether && this.afterGetConf && this.otherAttDataA.length === 0) {
147
- this.afterGetConf()
148
- }
149
- }
150
- // 回显操作
117
+ // 1. 获取办理意见配置
118
+ await this.fetchHandlingAdviceConfig(typeCode)
119
+
120
+ // 2. 回显历史数据(编辑场景)
151
121
  if (procInstId) {
152
- const { data: data1 } = await axios.get(
153
- `/bems/activiti/sample/getStartEventFlowHistory/${procInstId}`,
154
- {},
155
- {
156
- noMsg: true
157
- }
158
- )
159
- this.reason = data1?.suggestion || ''
160
- this.reasonSelect = data1?.suggestion || ''
161
- if (data1 && data1.flowHistoryCfgs && data1.flowHistoryCfgs.length > 0) {
162
- this.otherAttDataA = this.otherAttDataA.map((item) => {
163
- const bcData = data1.flowHistoryCfgs.find((item2) => {
164
- return item2.cfgKey === item.cfgKey
165
- })
166
- return {
167
- ...item,
168
- cfgVal: ['31'].includes(item.cfgType) ? bcData.cfgVal.split(',') : bcData.cfgVal,
169
- cfgText: ['31'].includes(item.cfgType) ? bcData.cfgText && bcData.cfgText.split(',') : bcData.cfgText,
170
- selectList: ['31'].includes(item.cfgType) ? bcData.cfgVal.split(',') : undefined,
171
- checkList: ['32'].includes(item.cfgType) ? bcData.cfgVal.split(',') : undefined,
172
- cfgHasRemark: bcData.cfgHasRemark,
173
- cfgRemark: bcData.cfgRemark
174
- }
175
- })
176
- }
122
+ await this.loadFlowHistory(procInstId)
177
123
  }
178
- // 重新执行一次 使数据更新
179
- this.$refs.showOtherAttNew && this.$refs.showOtherAttNew.getData(this.otherAttDataA)
124
+
125
+ // 3. 更新子组件数据
126
+ this.updateOtherAttData()
180
127
  } catch (error) {
181
- if (this.afterGetConf) {
182
- this.afterGetConf()
183
- }
128
+ // 异常时执行回调
129
+ this.afterGetConf?.()
130
+ }
131
+ },
132
+
133
+ /** 获取办理意见配置接口 */
134
+ async fetchHandlingAdviceConfig(typeCode) {
135
+ const { code, data } = await axios.post(
136
+ `/bems/activiti/admin/todo/isFlowStartWithOptions`,
137
+ { typeCode },
138
+ { noMsg: true }
139
+ )
140
+
141
+ if (code !== 200) return
142
+
143
+ // 设置自定义项列表
144
+ this.otherAttDataA = data.customizationList || []
145
+ // 是否显示意见输入
146
+ this.whether = data.whether
147
+ // 意见是否必填
148
+ this.optionsRequired = data.optionsRequired
149
+
150
+ // 设置占位提示
151
+ this.placeholder = data.optionsRequired ? '请选择或输入意见(必填)' : '请选择或输入意见(选填)'
152
+ // 显示弹窗条件:需要输入意见 或 存在自定义项
153
+ this.visible = data.whether === true || this.otherAttDataA.length > 0
154
+ // 转换意见选项为下拉格式
155
+ this.flowOptions = data?.opinions?.map((d) => ({ label: d, value: d })) || []
156
+
157
+ // 无需弹窗时直接执行回调
158
+ if (!data.whether && this.afterGetConf && this.otherAttDataA.length === 0) {
159
+ this.afterGetConf()
184
160
  }
185
161
  },
162
+
163
+ /** 加载流程历史数据用于回显 */
164
+ async loadFlowHistory(procInstId) {
165
+ const { data: historyData } = await axios.get(
166
+ `/bems/activiti/sample/getStartEventFlowHistory/${procInstId}`,
167
+ {},
168
+ { noMsg: true }
169
+ )
170
+
171
+ // 回显意见内容
172
+ this.reason = historyData?.suggestion || ''
173
+ this.reasonSelect = historyData?.suggestion || ''
174
+
175
+ // 回显自定义项数据
176
+ if (historyData?.flowHistoryCfgs?.length > 0) {
177
+ this.otherAttDataA = this.mergeHistoryToCustomization(historyData.flowHistoryCfgs)
178
+ }
179
+ },
180
+
181
+ /** 将历史数据合并到自定义项配置 */
182
+ mergeHistoryToCustomization(flowHistoryCfgs) {
183
+ const CFG_TYPE = {
184
+ MULTI_SELECT: '31', // 多选下拉
185
+ CHECKBOX: '32' // 复选框
186
+ }
187
+
188
+ return this.otherAttDataA.map((item) => {
189
+ const historyItem = flowHistoryCfgs.find((h) => h.cfgKey === item.cfgKey)
190
+ if (!historyItem) return item
191
+
192
+ const isMultiSelect = item.cfgType === CFG_TYPE.MULTI_SELECT
193
+ const isCheckbox = item.cfgType === CFG_TYPE.CHECKBOX
194
+ const cfgValArray = historyItem.cfgVal?.split(',') || []
195
+ const cfgTextArray = historyItem.cfgText?.split(',') || []
196
+
197
+ return {
198
+ ...item,
199
+ cfgVal: isMultiSelect ? cfgValArray : historyItem.cfgVal,
200
+ cfgText: isMultiSelect ? cfgTextArray : historyItem.cfgText,
201
+ selectList: isMultiSelect ? cfgValArray : undefined,
202
+ checkList: isCheckbox ? cfgValArray : undefined,
203
+ cfgHasRemark: historyItem.cfgHasRemark,
204
+ cfgRemark: historyItem.cfgRemark
205
+ }
206
+ })
207
+ },
208
+
209
+ /** 更新子组件数据 */
210
+ updateOtherAttData() {
211
+ this.$refs.showOtherAttNew?.getData(this.otherAttDataA)
212
+ },
186
213
  changeReasonSelect(val) {
187
214
  this.reason = val
188
215
  },
@@ -0,0 +1,112 @@
1
+ # InputNumber 数字输入框组件
2
+
3
+ 数字输入框组件,支持金额、比率、纯数字三种类型,提供千分位格式化、小数位控制等功能。
4
+
5
+ ## 基础用法
6
+
7
+ ```vue
8
+ <template>
9
+ <!-- 金额类型(默认) -->
10
+ <InputNumber v-model="money" type="money" />
11
+
12
+ <!-- 比率类型 -->
13
+ <InputNumber v-model="rate" type="rate" />
14
+
15
+ <!-- 纯数字类型 -->
16
+ <InputNumber v-model="num" type="number" />
17
+ </template>
18
+ ```
19
+
20
+ ## 属性说明
21
+
22
+ | 属性名 | 类型 | 默认值 | 说明 |
23
+ | ------------ | ------------- | ----------------- | --------------------------------- |
24
+ | value | Number/String | undefined | 绑定值 |
25
+ | type | String | 'money' | 输入框类型,可选值:'money'、'rate'、'number' |
26
+ | maxlength | Number | 16 | 最大输入长度 |
27
+ | min | Number | -9999999999999.99 | 最小值限制 |
28
+ | max | Number | 9999999999999.99 | 最大值限制 |
29
+ | step | Number | 1 | 步进值,按上下箭头时的增减幅度 |
30
+ | stepStrictly | Boolean | false | 是否严格按步进值递增/递减 |
31
+ | disabled | Boolean | undefined | 是否禁用 |
32
+ | isClearable | Boolean | false | 是否可清空 |
33
+ | placeholder | String | '请输入' | 占位提示文本 |
34
+ | dNum | Number | undefined | 小数位数,优先级低于format |
35
+ | format | String | undefined | 格式化字符串,如'0.00'表示保留2位小数 |
36
+ | suffix | String | '%' | 后缀文本,仅在type='rate'时有效 |
37
+ | rangeAuto | Boolean | false | 是否自动处理范围值 |
38
+
39
+ ## 类型说明
40
+
41
+ ### money(金额类型)
42
+
43
+ - **默认值**:保留2位小数
44
+ - **千分位格式化**:启用(如:1,234.56)
45
+ - **适用场景**:金额、价格等需要千分位展示的数值
46
+
47
+ ### rate(比率类型)
48
+
49
+ - **默认值**:保留4位小数
50
+ - **千分位格式化**:启用
51
+ - **后缀**:默认显示%符号
52
+ - **适用场景**:利率、比率等百分比数值
53
+
54
+ ### number(纯数字类型)
55
+
56
+ - **默认值**:保留2位小数(可通过dNum或format属性自定义)
57
+ - **千分位格式化**:禁用
58
+ - **适用场景**:普通数值输入,如数量、计数等不需要千分位格式化的场景
59
+ - **特点**:与money类型相比,唯一的区别是不显示千分位逗号分隔符
60
+
61
+ ## 事件
62
+
63
+ | 事件名 | 说明 | 回调参数 |
64
+ | ------ | ----------- | ---- |
65
+ | input | 值改变时触发 | 当前值 |
66
+ | change | 值改变且失去焦点时触发 | 当前值 |
67
+ | blur | 失去焦点时触发 | - |
68
+ | clear | 清空时触发 | - |
69
+
70
+ ## 方法
71
+
72
+ | 方法名 | 说明 |
73
+ | ----- | -------- |
74
+ | focus | 使输入框获得焦点 |
75
+
76
+ ## 使用示例
77
+
78
+ ### 金额输入
79
+
80
+ ```vue
81
+ <InputNumber v-model="amount" type="money" :min="0" :max="1000000" />
82
+ ```
83
+
84
+ ### 比率输入
85
+
86
+ ```vue
87
+ <InputNumber v-model="interestRate" type="rate" suffix="%" />
88
+ ```
89
+
90
+ ### 纯数字输入(无千分位)
91
+
92
+ ```vue
93
+ <InputNumber v-model="quantity" type="number" :step="1" :min="0" />
94
+ ```
95
+
96
+ ### 自定义小数位
97
+
98
+ ```vue
99
+ <!-- 使用dNum属性 -->
100
+ <InputNumber v-model="value" type="money" :dNum="4" />
101
+
102
+ <!-- 使用format属性(优先级更高) -->
103
+ <InputNumber v-model="value" type="money" format="0.0000" />
104
+ ```
105
+
106
+ ### 步进控制
107
+
108
+ ```vue
109
+ <!-- 启用步进严格模式 -->
110
+ <InputNumber v-model="value" type="number" :step="0.5" :stepStrictly="true" />
111
+ ```
112
+
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <Dialog class="n20-pivot-dialog" width="90%" max-dialog :visible.sync="visibleC" title="数据透视分析中心">
2
+ <Dialog class="n20-pivot-dialog" width="95%" max-dialog :visible.sync="visibleC" title="数据透视分析中心">
3
3
  <div class="n20-pivot-container">
4
4
  <!-- 左侧报表清单 -->
5
5
  <div class="pivot-sidebar-left" :class="{ collapsed: isLeftSidebarCollapsed }">
@@ -70,12 +70,14 @@
70
70
  <!-- 内容头部工具栏 -->
71
71
  <div class="main-toolbar">
72
72
  <div class="toolbar-left">
73
- <h2 class="report-title">{{ currentReport.name }}</h2>
74
- <div class="add-to-home-btn" @click="handleAddToHome">
75
- <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
76
- <path d="M7 1V13M1 7H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
77
- </svg>
78
- <span>添加到首页</span>
73
+ <div >
74
+ <h2 class="report-title">{{ currentReport.name }}</h2>
75
+ <div class="add-to-home-btn" @click="handleAddToHome">
76
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
77
+ <path d="M7 1V13M1 7H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
78
+ </svg>
79
+ <span>添加到首页</span>
80
+ </div>
79
81
  </div>
80
82
  <div class="report-stats">
81
83
  <span class="stat-item">计算耗时:{{ calculateTime }} ms</span>
@@ -404,7 +406,7 @@
404
406
 
405
407
  <script>
406
408
  import Dialog from '../Dialog/index.vue'
407
- import ViewToggle from './ViewToggle.vue'
409
+ import ViewToggle from '../ViewToggle/index.vue'
408
410
  import XEUtils from 'xe-utils'
409
411
  import importG from '../../utils/importGlobal.js'
410
412
 
@@ -1373,10 +1375,13 @@ export default {
1373
1375
  }
1374
1376
 
1375
1377
  .report-title {
1378
+ color: var(--text-1, #1d2129);
1379
+ /* 18/CN-Medium */
1380
+ font-family: 'PingFang SC';
1376
1381
  font-size: 18px;
1382
+ font-style: normal;
1377
1383
  font-weight: 500;
1378
- color: #1d2129;
1379
- margin: 0;
1384
+ line-height: 26px; /* 144.444% */
1380
1385
  }
1381
1386
 
1382
1387
  .add-to-home-btn {
@@ -243,12 +243,23 @@ export default {
243
243
  this.$refs.vxeTable.clearCheckboxRow()
244
244
  this.$emit('selection-change-method', [])
245
245
  }
246
+ // 数据更新后重新设置合并单元格
247
+ this.$nextTick(() => {
248
+ if (this.mergeCells && this.mergeCells.length > 0 && this.$refs.vxeTable) {
249
+ this.$refs.vxeTable.setMergeCells(this.mergeCells)
250
+ }
251
+ })
246
252
  }
247
253
  },
248
254
  activated() {
249
255
  this.$refs.vxeTable.loadData(this.data)
256
+ // 数据更新后重新设置合并单元格
257
+ this.$nextTick(() => {
258
+ if (this.mergeCells && this.mergeCells.length > 0 && this.$refs.vxeTable) {
259
+ this.$refs.vxeTable.setMergeCells(this.mergeCells)
260
+ }
261
+ })
250
262
  },
251
- mounted() {},
252
263
  methods: {
253
264
  // 全选
254
265
  toggleAllSelection() {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="flex-box flex-v flex-c">
2
+ <div class="flex-box flex-v flex-c table-operate-btns__wrapper">
3
3
  <childrenOperateBtn :btn-list="dfBtns" :row="row" @command="(c) => $emit('command', c)" />
4
4
  <el-dropdown v-if="moreBtns.length" class="m-l-b" @command="(c) => $emit('command', c)">
5
5
  <el-button class="n20-icon-moren" size="mini" type="text" />
@@ -16,15 +16,27 @@
16
16
  :command="item2.command"
17
17
  :disabled="item2.disabled | dbdBtn(row)"
18
18
  >
19
- <el-link v-if="item2.type" :type="item2.type" :underline="false">{{ item2.label }}</el-link>
20
- <template v-else>{{ item2.label }}</template>
19
+ <el-badge v-if="resolveBadge(item2)" :value="resolveBadge(item2)" :max="item2.badgeMax || 99">
20
+ <el-link v-if="item2.type" :type="item2.type" :underline="false">{{ item2.label }}</el-link>
21
+ <template v-else>{{ item2.label }}</template>
22
+ </el-badge>
23
+ <template v-else>
24
+ <el-link v-if="item2.type" :type="item2.type" :underline="false">{{ item2.label }}</el-link>
25
+ <template v-else>{{ item2.label }}</template>
26
+ </template>
21
27
  </el-dropdown-item>
22
28
  </el-dropdown-menu>
23
29
  </el-dropdown>
24
30
  </el-dropdown-item>
25
31
  <el-dropdown-item v-else :key="item.label" :command="item.command" :disabled="item.disabled | dbdBtn(row)">
26
- <el-link v-if="item.type" :type="item.type" :underline="false">{{ item.label }}</el-link>
27
- <template v-else>{{ item.label }}</template>
32
+ <el-badge v-if="resolveBadge(item)" :value="resolveBadge(item)" :max="item.badgeMax || 99">
33
+ <el-link v-if="item.type" :type="item.type" :underline="false">{{ item.label }}</el-link>
34
+ <template v-else>{{ item.label }}</template>
35
+ </el-badge>
36
+ <template v-else>
37
+ <el-link v-if="item.type" :type="item.type" :underline="false">{{ item.label }}</el-link>
38
+ <template v-else>{{ item.label }}</template>
39
+ </template>
28
40
  </el-dropdown-item>
29
41
  </template>
30
42
  </el-dropdown-menu>
@@ -83,6 +95,14 @@ export default {
83
95
  }
84
96
  },
85
97
  methods: {
98
+ resolveBadge(item) {
99
+ if (!item.badge) return null
100
+ if (typeof item.badge === 'function') {
101
+ const val = item.badge(this.row)
102
+ return val || val === 0 ? val : null
103
+ }
104
+ return item.badge
105
+ },
86
106
  hasBtn(isHas, row) {
87
107
  if (isHas === undefined || isHas === null) {
88
108
  return true
@@ -6,35 +6,88 @@
6
6
  v-if="shouldShowChildren(item.children, row)"
7
7
  :key="item.label"
8
8
  class="m-l-b"
9
- @command="c => $emit('command', c)"
9
+ @command="(c) => $emit('command', c)"
10
10
  >
11
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)"
12
+ <el-badge
13
+ v-if="resolveBadge(item)"
14
+ :value="resolveBadge(item)"
15
+ :max="item.badgeMax || 99"
16
+ class="operate-btn-badge"
19
17
  >
20
- <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
21
- <span v-else>{{ item.label }}</span>
22
- </el-link>
18
+ <el-link
19
+ :key="item.label"
20
+ :class="i ? 'm-l-b' : ''"
21
+ :disabled="item.disabled | dbdBtn(row)"
22
+ :underline="false"
23
+ type="primary"
24
+ @click="$emit('command', item.command)"
25
+ >
26
+ <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
27
+ <span v-else>{{ item.label }}</span>
28
+ </el-link>
29
+ </el-badge>
30
+ <template v-else>
31
+ <el-link
32
+ :key="item.label"
33
+ :class="i ? 'm-l-b' : ''"
34
+ :disabled="item.disabled | dbdBtn(row)"
35
+ :underline="false"
36
+ type="primary"
37
+ @click="$emit('command', item.command)"
38
+ >
39
+ <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
40
+ <span v-else>{{ item.label }}</span>
41
+ </el-link>
42
+ </template>
23
43
  <i class="el-icon-arrow-down color-primary" />
24
44
  </div>
25
45
  <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>
46
+ <template v-for="childItem in item.children">
47
+ <el-dropdown-item
48
+ v-if="shouldShowButton(childItem, row)"
49
+ :key="childItem.label"
50
+ :command="childItem.command"
51
+ :disabled="childItem.disabled | dbdBtn(row)"
52
+ >
53
+ <el-badge
54
+ v-if="resolveBadge(childItem)"
55
+ :value="resolveBadge(childItem)"
56
+ :max="childItem.badgeMax || 99"
57
+ >
58
+ <el-link v-if="childItem.type" :type="childItem.type" :underline="false">{{
59
+ childItem.label
60
+ }}</el-link>
61
+ <template v-else>{{ childItem.label }}</template>
62
+ </el-badge>
63
+ <template v-else>
64
+ <el-link v-if="childItem.type" :type="childItem.type" :underline="false">{{
65
+ childItem.label
66
+ }}</el-link>
67
+ <template v-else>{{ childItem.label }}</template>
68
+ </template>
69
+ </el-dropdown-item>
70
+ </template>
36
71
  </el-dropdown-menu>
37
72
  </el-dropdown>
73
+ <el-badge
74
+ v-else-if="resolveBadge(item)"
75
+ :value="resolveBadge(item)"
76
+ :max="item.badgeMax || 99"
77
+ class="operate-btn-badge"
78
+ >
79
+ <el-link
80
+ :key="item.label"
81
+ :class="i ? 'm-l-b' : ''"
82
+ :disabled="item.disabled | dbdBtn(row)"
83
+ :type="item.type || 'primary'"
84
+ :underline="false"
85
+ @click="$emit('command', item.command)"
86
+ >
87
+ <span v-if="item.tip" v-title="`${item.tip}`">{{ item.label }}</span>
88
+ <span v-else>{{ item.label }}</span>
89
+ </el-link>
90
+ </el-badge>
38
91
  <el-link
39
92
  v-else
40
93
  :key="item.label"
@@ -77,6 +130,14 @@ export default {
77
130
  }
78
131
  },
79
132
  methods: {
133
+ resolveBadge(item) {
134
+ if (!item.badge) return null
135
+ if (typeof item.badge === 'function') {
136
+ const val = item.badge(this.row)
137
+ return val || val === 0 ? val : null
138
+ }
139
+ return item.badge
140
+ },
80
141
  shouldShowButton(childItem, row) {
81
142
  if (childItem.isHas === undefined) {
82
143
  return true
@@ -98,11 +159,8 @@ export default {
98
159
  if (!children || children.length === 0) {
99
160
  return false
100
161
  }
101
- return children.some(child => this.shouldShowButton(child, row))
162
+ return children.some((child) => this.shouldShowButton(child, row))
102
163
  }
103
164
  }
104
165
  }
105
166
  </script>
106
-
107
- <style lang="less" scoped></style>
108
- > >
@@ -11,9 +11,9 @@
11
11
  >
12
12
  <template slot="label">
13
13
  <span v-if="item.icon" :class="item.icon"></span>
14
- <sup v-if="item.badge && typeof item.badge === 'boolean'" class="el-tabs__item-badge"></sup>
14
+ <sup v-if="item.badge === true" class="el-tabs__item-badge"></sup>
15
15
  <el-tooltip
16
- v-else-if="item.badge && item.tooltip"
16
+ v-else-if="item.badge > 0 && item.tooltip"
17
17
  :content="getTooltipContent(item.tooltip)"
18
18
  placement="top"
19
19
  :popper-class="'n20-tabs-tooltip'"
@@ -21,7 +21,7 @@
21
21
  >
22
22
  <span class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
23
23
  </el-tooltip>
24
- <span v-else-if="item.badge" class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
24
+ <span v-else-if="item.badge > 0" class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
25
25
  <span v-if="item.content" v-title="`${item.content}`"> {{ item.name }}</span>
26
26
  <span v-else>{{ item.name }}</span>
27
27
  </template>
@@ -12,7 +12,7 @@
12
12
  <span v-if="item.icon" :class="item.icon"></span>
13
13
  <sup v-if="item.badge && typeof item.badge === 'boolean'" class="el-tabs__item-badge"></sup>
14
14
  <el-tooltip
15
- v-else-if="item.badge && item.tooltip"
15
+ v-else-if="item.badge > 0 && item.tooltip"
16
16
  :content="getTooltipContent(item.tooltip)"
17
17
  placement="top"
18
18
  :popper-class="'n20-tertiary-tab-tooltip'"
@@ -20,7 +20,7 @@
20
20
  >
21
21
  <span class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
22
22
  </el-tooltip>
23
- <span v-else-if="item.badge" class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
23
+ <span v-else-if="item.badge > 0" class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
24
24
  <span v-if="item.content" v-title="`${item.content}`"> {{ item.name }}</span>
25
25
  <span v-else>{{ item.name }}</span>
26
26
  </template>
@@ -258,6 +258,8 @@ export default {
258
258
  handleClose() {
259
259
  this.progressV = false
260
260
  this.$emit('clearFiles')
261
+ this.page.current = 1
262
+ this.page.pageSize = 20
261
263
  },
262
264
  getList() {
263
265
  const startIndex = (this.page.current - 1) * this.page.pageSize
@@ -40,7 +40,7 @@
40
40
  <span v-if="item.icon" :class="item.icon"></span>
41
41
  <sup v-if="item.badge && typeof item.badge === 'boolean'" class="el-tabs__item-badge"></sup>
42
42
  <el-tooltip
43
- v-else-if="item.badge && item.tooltip"
43
+ v-else-if="item.badge > 0 && item.tooltip"
44
44
  :content="getTooltipContent(item.tooltip)"
45
45
  placement="top"
46
46
  :popper-class="'n20-secondary-tab-tooltip'"
@@ -48,7 +48,7 @@
48
48
  >
49
49
  <span class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
50
50
  </el-tooltip>
51
- <span v-else-if="item.badge" class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
51
+ <span v-else-if="item.badge > 0" class="el-tabs__item-badge-count">{{ badgeText(item.badge) }}</span>
52
52
  <span v-if="item.content" v-title="`${item.content}`"> {{ item.name }}</span>
53
53
  <span v-else>{{ item.name }}</span>
54
54
  </template>
@@ -92,7 +92,7 @@ export default {
92
92
  },
93
93
  methods: {
94
94
  badgeText(badge) {
95
- if (typeof badge === 'number') {
95
+ if (badge && typeof badge === 'number') {
96
96
  return badge > 99 ? '99+' : badge
97
97
  }
98
98
  return badge