n20-common-lib 3.0.86 → 3.0.87
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.
- package/package.json +1 -1
- package/src/assets/css/table.scss +11 -0
- package/src/assets/css/v3/table.scss +19 -0
- package/src/components/ApprovalButtons/index.vue +42 -23
- package/src/components/ApprovalButtons/selectSpr.vue +15 -0
- package/src/components/ApprovalButtons/showAppOpi.vue +5 -1
- package/src/components/ApprovalButtons/showOtherAttrNew.vue +40 -41
- package/src/components/ApprovalCard/index.vue +21 -5
- package/src/components/ApprovalRecord/approvalImgPro/index.vue +23 -3
- package/src/components/ApprovalRecord/index.vue +7 -2
- package/src/components/FileUploadTable/index.vue +4 -3
- package/src/components/HandlingAdvice/index.vue +97 -70
- package/src/components/InputNumber/README.md +112 -0
- package/src/components/TablePro/index.vue +12 -1
- package/src/components/TableProOperateColumn/OperateBtns.vue +25 -5
- package/src/components/TableProOperateColumn/childrenOperateBtn.vue +83 -25
- package/src/components/Tabs/index.vue +3 -3
- package/src/components/TertiaryTab/index.vue +2 -2
- package/src/components/Upload/uploadMsg.vue +2 -0
- package/src/components/v3/SecondaryTab/index.vue +3 -3
- package/src/components/v3/TablePro/index.vue +39 -6
- package/src/index.js +3 -0
- package/src/plugins/Sign/signV3/InfosecNetSignCNGAgent.min.js +4112 -1
- package/src/plugins/Sign/signV3/sign.js +23 -11
- package/style/index.css +1 -1
- package/theme/blue.css +1 -1
- package/theme/cctcRed.css +1 -1
- package/theme/green.css +1 -1
- package/theme/lightBlue.css +1 -1
- package/theme/orange.css +1 -1
- package/theme/purple.css +1 -1
- package/theme/red.css +1 -1
- package/theme/yellow.css +1 -1
- package/src/assets/css/table copy.scss +0 -234
|
@@ -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="
|
|
36
|
+
<el-form ref="approveBtnGroup" label-position="top">
|
|
37
37
|
<div
|
|
38
|
-
class="p-b-
|
|
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
|
-
|
|
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
|
|
111
|
+
* 获取办理意见配置
|
|
112
|
+
* @param {String} typeCode - 业务类型编码
|
|
113
|
+
* @param {String} procInstId - 流程实例ID,用于回显历史数据
|
|
117
114
|
*/
|
|
118
115
|
async getHandlingAdvice(typeCode, procInstId) {
|
|
119
116
|
try {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
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
|
-
|
|
124
|
+
|
|
125
|
+
// 3. 更新子组件数据
|
|
126
|
+
this.updateOtherAttData()
|
|
180
127
|
} catch (error) {
|
|
181
|
-
|
|
182
|
-
|
|
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
|
+
|
|
@@ -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-
|
|
20
|
-
|
|
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-
|
|
27
|
-
|
|
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-
|
|
13
|
-
|
|
14
|
-
:
|
|
15
|
-
:
|
|
16
|
-
|
|
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
|
-
<
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
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>
|
|
@@ -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
|