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.
- 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/Pivot/index.vue +15 -10
- 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 +40 -7
- 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
- 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="
|
|
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
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<Dialog class="n20-pivot-dialog" width="
|
|
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
|
-
<
|
|
74
|
-
|
|
75
|
-
<
|
|
76
|
-
<
|
|
77
|
-
|
|
78
|
-
|
|
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 '
|
|
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
|
-
|
|
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-
|
|
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
|