n20-common-lib 1.1.10

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 (85) hide show
  1. package/README.md +24 -0
  2. package/package.json +120 -0
  3. package/src/assets/css/_coreLib.scss +26 -0
  4. package/src/assets/css/cl-approve-card.scss +66 -0
  5. package/src/assets/css/cl-drag-list.scss +22 -0
  6. package/src/assets/css/cl-empty.scss +10 -0
  7. package/src/assets/css/cl-expandable.scss +31 -0
  8. package/src/assets/css/cl-file-upload-table.scss +11 -0
  9. package/src/assets/css/cl-filter.scss +20 -0
  10. package/src/assets/css/cl-foldedpanel.scss +35 -0
  11. package/src/assets/css/cl-footer-box.scss +8 -0
  12. package/src/assets/css/cl-form-item.scss +281 -0
  13. package/src/assets/css/cl-more-tab.scss +98 -0
  14. package/src/assets/css/cl-nav-menu.scss +5 -0
  15. package/src/assets/css/cl-pagination.scss +71 -0
  16. package/src/assets/css/cl-secondary-tab.scss +30 -0
  17. package/src/assets/css/cl-sifting.scss +51 -0
  18. package/src/assets/css/cl-statis.scss +14 -0
  19. package/src/assets/css/cl-step.scss +164 -0
  20. package/src/assets/css/cl-suspend.scss +25 -0
  21. package/src/assets/css/cl-tertiary-tab.scss +37 -0
  22. package/src/assets/css/cl-upload.scss +41 -0
  23. package/src/assets/css/cl-worn-pagination.scss +50 -0
  24. package/src/assets/css/element-variables.scss +1053 -0
  25. package/src/assets/css/element.dev.scss +5 -0
  26. package/src/assets/css/font-icon.scss +22 -0
  27. package/src/assets/css/index.dev.scss +3 -0
  28. package/src/assets/css/index.scss +8 -0
  29. package/src/assets/css/normalize.scss +243 -0
  30. package/src/assets/css/rootvar.scss +66 -0
  31. package/src/assets/css/title-pop.scss +4 -0
  32. package/src/assets/getJsonc.js +51 -0
  33. package/src/assets/postMessage.js +2 -0
  34. package/src/assets/postMessageC.js +37 -0
  35. package/src/components/ApproveCard/index.vue +83 -0
  36. package/src/components/DatePicker/index.vue +22 -0
  37. package/src/components/Dialog/index.vue +115 -0
  38. package/src/components/DragList/index.vue +64 -0
  39. package/src/components/Empty/img/404.png +0 -0
  40. package/src/components/Empty/img/abnormal.svg +109 -0
  41. package/src/components/Empty/img/dispose.svg +72 -0
  42. package/src/components/Empty/img/empty.svg +58 -0
  43. package/src/components/Empty/img/general.svg +59 -0
  44. package/src/components/Empty/img/lock.svg +58 -0
  45. package/src/components/Empty/img/network.svg +60 -0
  46. package/src/components/Empty/img/relevant.svg +69 -0
  47. package/src/components/Empty/img/search.svg +73 -0
  48. package/src/components/Empty/index.vue +92 -0
  49. package/src/components/Expandable/index.vue +47 -0
  50. package/src/components/FileUploadTable/index.vue +456 -0
  51. package/src/components/Filters/index.vue +77 -0
  52. package/src/components/FoldedPanel/index.vue +64 -0
  53. package/src/components/FooterBox/index.vue +18 -0
  54. package/src/components/InputNumber/index.vue +126 -0
  55. package/src/components/MoreTab/index.vue +232 -0
  56. package/src/components/NavMenu/index.vue +90 -0
  57. package/src/components/Pagination/index.vue +126 -0
  58. package/src/components/SecondaryTab/index.vue +75 -0
  59. package/src/components/Select/index.vue +51 -0
  60. package/src/components/Sifting/index.vue +97 -0
  61. package/src/components/Statis/index.vue +55 -0
  62. package/src/components/Step/index.vue +65 -0
  63. package/src/components/Suspend/index.vue +63 -0
  64. package/src/components/Suspend/suspensionBtn.png +0 -0
  65. package/src/components/TertiaryTab/index.vue +49 -0
  66. package/src/components/TimePicker/index.vue +22 -0
  67. package/src/components/Upload/index.vue +237 -0
  68. package/src/components/WornPagination/index.vue +202 -0
  69. package/src/directives/VMove/index.js +42 -0
  70. package/src/directives/VTitle/index.js +55 -0
  71. package/src/directives/VTitle/tooltip.vue +21 -0
  72. package/src/directives/vDrag/index.js +72 -0
  73. package/src/index.js +111 -0
  74. package/src/utils/auth.js +41 -0
  75. package/src/utils/axios.js +180 -0
  76. package/src/utils/print.js +156 -0
  77. package/src/utils/pushLink.js +5 -0
  78. package/style/css/normalize.scss +243 -0
  79. package/style/fonts/element-icons.535877f5.woff +0 -0
  80. package/style/fonts/element-icons.732389de.ttf +0 -0
  81. package/style/index.css +3 -0
  82. package/style/index.css.map +1 -0
  83. package/style/index.umd.min.js +2 -0
  84. package/style/index.umd.min.js.map +1 -0
  85. package/style/server-config.jsonc +212 -0
@@ -0,0 +1,126 @@
1
+ <template>
2
+ <div class="cl-num-w">
3
+ <el-input
4
+ v-if="showStr"
5
+ class="cl-stc"
6
+ :class="{ 'cl-num--rate': type === 'rate' }"
7
+ :value="valueStr"
8
+ :placeholder="$attrs.placeholder"
9
+ @focus="focusFn"
10
+ />
11
+ <el-input-number
12
+ v-else
13
+ ref="input-number"
14
+ class="cl-num"
15
+ :class="{ 'cl-num--rate': type === 'rate' }"
16
+ :controls="false"
17
+ v-bind="$attrs"
18
+ :value="valueNum"
19
+ v-on="listeners"
20
+ @blur="blurFn"
21
+ @change="changeFn"
22
+ />
23
+ <span v-if="type === 'rate'" class="el-input__suffix">
24
+ <span class="el-input__icon" style="display: inline-block">%</span>
25
+ </span>
26
+ </div>
27
+ </template>
28
+
29
+ <script>
30
+ import numerify from 'numerify'
31
+ export default {
32
+ name: 'InputNumber',
33
+ props: {
34
+ value: {
35
+ type: [Number, String],
36
+ default: undefined
37
+ },
38
+ type: {
39
+ type: String,
40
+ default: 'money',
41
+ validator(v) {
42
+ return ['money', 'rate'].includes(v)
43
+ }
44
+ }
45
+ },
46
+ data() {
47
+ this.listeners = Object.assign({}, this.$listeners, { input: () => {} })
48
+ return {
49
+ valueStr: '',
50
+ valueNum: undefined,
51
+ showStr: true
52
+ }
53
+ },
54
+ watch: {
55
+ value: {
56
+ handler(val) {
57
+ this.valueStr = this.num2str(val)
58
+ },
59
+ immediate: true
60
+ }
61
+ },
62
+ methods: {
63
+ num2str(val = '') {
64
+ if (val === '') {
65
+ return ''
66
+ }
67
+ switch (this.type) {
68
+ case 'rate':
69
+ return numerify(val, '0,0.00[00]')
70
+ case 'money':
71
+ default:
72
+ return numerify(val, '0,0.00')
73
+ }
74
+ },
75
+ focusFn() {
76
+ this.showStr = false
77
+ if (typeof this.value === 'string') {
78
+ this.valueNum = Number(this.value)
79
+ }else {
80
+ this.valueNum = this.value
81
+ }
82
+ this.$nextTick(() => {
83
+ this.$refs['input-number'].focus()
84
+ })
85
+ },
86
+ blurFn() {
87
+ this.showStr = true
88
+ },
89
+ changeFn(val) {
90
+ if (!val && val !== 0) {
91
+ return this.$emit('input', val)
92
+ }
93
+
94
+ switch (this.type) {
95
+ case 'rate':
96
+ {
97
+ let varStr = val.toString() + '.'
98
+ let varDLen = varStr.length - varStr.indexOf('.') - 1
99
+ let nVar = Number(val.toFixed(Math.min(varDLen, 4)))
100
+ if (this.valueNum === nVar) {
101
+ this.valueNum = 0
102
+ }
103
+ this.$nextTick(() => {
104
+ this.valueNum = nVar
105
+ this.$emit('input', nVar)
106
+ })
107
+ }
108
+ break
109
+ case 'money':
110
+ default:
111
+ {
112
+ let nVar = Number(val.toFixed(2))
113
+ if (this.valueNum === nVar) {
114
+ this.valueNum = 0
115
+ }
116
+ this.$nextTick(() => {
117
+ this.valueNum = nVar
118
+ this.$emit('input', nVar)
119
+ })
120
+ }
121
+ break
122
+ }
123
+ }
124
+ }
125
+ }
126
+ </script>
@@ -0,0 +1,232 @@
1
+ /**
2
+ * author: zhengwei
3
+ * tiem: 2021-8-31
4
+ */
5
+ <template>
6
+ <div class="__common-layout-pageTabs">
7
+ <el-scrollbar>
8
+ <div class="__tabs">
9
+ <div
10
+ v-for="item in openedPageRouters"
11
+ :key="item.fullPath"
12
+ class="__tab-item"
13
+ :class="{
14
+ '__is-active': item.fullPath == $route.fullPath
15
+ }"
16
+ @click="onClick(item)"
17
+ @contextmenu.prevent="showContextMenu($event, item)"
18
+ >
19
+ {{ item.meta.title }}
20
+ <span
21
+ class="el-icon-close"
22
+ :style="openedPageRouters.length <= 1 ? 'width:0;' : ''"
23
+ @click.stop="onClose(item)"
24
+ @contextmenu.prevent.stop
25
+ ></span>
26
+ </div>
27
+ </div>
28
+ </el-scrollbar>
29
+ <div v-show="contextMenuVisible">
30
+ <ul
31
+ :style="{ left: contextMenuLeft + 'px', top: contextMenuTop + 'px' }"
32
+ class="__contextmenu"
33
+ >
34
+ <li>
35
+ <el-button type="text" size="mini" @click="reload()"
36
+ >重新加载</el-button
37
+ >
38
+ </li>
39
+ <li>
40
+ <el-button
41
+ type="text"
42
+ :disabled="false"
43
+ size="mini"
44
+ @click="closeOtherLeft"
45
+ >关闭左边</el-button
46
+ >
47
+ </li>
48
+ <li>
49
+ <el-button
50
+ type="text"
51
+ :disabled="false"
52
+ size="mini"
53
+ @click="closeOtherRight"
54
+ >关闭右边</el-button
55
+ >
56
+ </li>
57
+ <li>
58
+ <el-button type="text" size="mini" @click="closeOther"
59
+ >关闭其他</el-button
60
+ >
61
+ </li>
62
+ </ul>
63
+ </div>
64
+ </div>
65
+ </template>
66
+ <script>
67
+ export default {
68
+ name: 'MoreTab',
69
+ props: {
70
+ keepAliveComponentInstance: {
71
+ type: Object,
72
+ default: () => ({})
73
+ }, //keep-alive控件实例对象
74
+ blankRouteName: {
75
+ type: String,
76
+ default: 'blank'
77
+ } //空白路由的name值
78
+ },
79
+ data() {
80
+ return {
81
+ contextMenuVisible: false, //右键菜单是否显示
82
+ contextMenuLeft: 0, //右键菜单显示位置
83
+ contextMenuTop: 0, //右键菜单显示位置
84
+ contextMenuTargetPageRoute: null, //右键所指向的菜单路由
85
+ openedPageRouters: [] //已打开的路由页面
86
+ }
87
+ },
88
+ watch: {
89
+ //当路由变更时,执行打开页面的方法
90
+ $route: {
91
+ handler(v) {
92
+ this.openPage(v)
93
+ },
94
+ immediate: true
95
+ }
96
+ },
97
+ mounted() {
98
+ //添加点击关闭右键菜单
99
+ window.addEventListener('click', this.closeContextMenu)
100
+ },
101
+ destroyed() {
102
+ window.removeEventListener('click', this.closeContextMenu)
103
+ },
104
+ methods: {
105
+ //打开页面
106
+ openPage(route) {
107
+ if (route.name === this.blankRouteName) {
108
+ return
109
+ }
110
+ let isExist = this.openedPageRouters.some(
111
+ (item) => item.fullPath === route.fullPath
112
+ )
113
+ if (!isExist) {
114
+ let openedPageRoute = this.openedPageRouters.find(
115
+ (item) => item.path === route.path
116
+ ) //判断页面是否支持不同参数多开页面功能,如果不支持且已存在path值一样的页面路由,那就替换它
117
+ if (!route.meta.canMultipleOpen && openedPageRoute != null) {
118
+ this.delRouteCache(openedPageRoute.fullPath)
119
+ this.openedPageRouters.splice(
120
+ this.openedPageRouters.indexOf(openedPageRoute),
121
+ 1,
122
+ route
123
+ )
124
+ } else {
125
+ this.openedPageRouters.push(route)
126
+ }
127
+ }
128
+ }, //点击页面标签卡时
129
+ onClick(route) {
130
+ if (route.fullPath !== this.$route.fullPath) {
131
+ this.$router.push(route.fullPath)
132
+ }
133
+ }, //关闭页面标签时
134
+ onClose(route) {
135
+ let index = this.openedPageRouters.indexOf(route)
136
+ this.delPageRoute(route)
137
+ if (route.fullPath === this.$route.fullPath) {
138
+ //删除页面后,跳转到上一页面
139
+ this.$router.replace(
140
+ this.openedPageRouters[index === 0 ? 0 : index - 1]
141
+ )
142
+ }
143
+ }, //右键显示菜单
144
+ showContextMenu(e, route) {
145
+ this.contextMenuTargetPageRoute = route
146
+ this.contextMenuLeft = e.layerX
147
+ this.contextMenuTop = e.layerY
148
+ this.contextMenuVisible = true
149
+ }, //隐藏右键菜单
150
+ closeContextMenu() {
151
+ this.contextMenuVisible = false
152
+ this.contextMenuTargetPageRoute = null
153
+ }, //重载页面
154
+ reload() {
155
+ this.delRouteCache(this.contextMenuTargetPageRoute.fullPath)
156
+ if (this.contextMenuTargetPageRoute.fullPath === this.$route.fullPath) {
157
+ this.$router.replace({ name: this.blankRouteName }).then(() => {
158
+ this.$router.replace(this.contextMenuTargetPageRoute)
159
+ })
160
+ }
161
+ }, //关闭其他页面
162
+ closeOther() {
163
+ for (let i = 0; i < this.openedPageRouters.length; i++) {
164
+ let r = this.openedPageRouters[i]
165
+ if (r !== this.contextMenuTargetPageRoute) {
166
+ this.delPageRoute(r)
167
+ i--
168
+ }
169
+ }
170
+ if (this.contextMenuTargetPageRoute.fullPath !== this.$route.fullPath) {
171
+ this.$router.replace(this.contextMenuTargetPageRoute)
172
+ }
173
+ }, //根据路径获取索引
174
+ getPageRouteIndex(fullPath) {
175
+ for (let i = 0; i < this.openedPageRouters.length; i++) {
176
+ if (this.openedPageRouters[i].fullPath === fullPath) {
177
+ return i
178
+ }
179
+ }
180
+ }, //关闭左边页面
181
+ closeOtherLeft() {
182
+ let index = this.openedPageRouters.indexOf(
183
+ this.contextMenuTargetPageRoute
184
+ )
185
+ let currentIndex = this.getPageRouteIndex(this.$route.fullPath)
186
+ if (index > currentIndex) {
187
+ this.$router.replace(this.contextMenuTargetPageRoute)
188
+ }
189
+ for (let i = 0; i < index; i++) {
190
+ let r = this.openedPageRouters[i]
191
+ this.delPageRoute(r)
192
+ i--
193
+ index--
194
+ }
195
+ }, //关闭右边页面
196
+ closeOtherRight() {
197
+ let index = this.openedPageRouters.indexOf(
198
+ this.contextMenuTargetPageRoute
199
+ )
200
+ let currentIndex = this.getPageRouteIndex(this.$route.fullPath)
201
+ for (let i = index + 1; i < this.openedPageRouters.length; i++) {
202
+ let r = this.openedPageRouters[i]
203
+ this.delPageRoute(r)
204
+ i--
205
+ }
206
+ if (index < currentIndex) {
207
+ this.$router.replace(this.contextMenuTargetPageRoute)
208
+ }
209
+ }, //删除页面
210
+ delPageRoute(route) {
211
+ let routeIndex = this.openedPageRouters.indexOf(route)
212
+ if (routeIndex >= 0) {
213
+ this.openedPageRouters.splice(routeIndex, 1)
214
+ }
215
+ this.delRouteCache(route.fullPath)
216
+ }, //删除页面缓存
217
+ delRouteCache(key) {
218
+ let cache = this.keepAliveComponentInstance.cache
219
+ let keys = this.keepAliveComponentInstance.keys
220
+ for (let i = 0; i < keys.length; i++) {
221
+ if (keys[i] === key) {
222
+ keys.splice(i, 1)
223
+ if (cache[key] != null) {
224
+ delete cache[key]
225
+ }
226
+ break
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ </script>
@@ -0,0 +1,90 @@
1
+ <template>
2
+ <el-menu :router="true">
3
+ <template v-for="omenus in menus">
4
+ <template v-for="item in omenus.menu">
5
+ <el-submenu v-if="item.children" :key="item.title" :index="item.title">
6
+ <template slot="title">
7
+ <i
8
+ v-if="item.iconUrl"
9
+ class="el-icon- icon-url"
10
+ :style="{ backgroundImage: `url(${item.iconUrl})` }"
11
+ ></i>
12
+ <i v-else :class="item.iconClass"></i>
13
+ <span>{{ item.title }}</span>
14
+ </template>
15
+ <template v-for="itemc in item.children">
16
+ <el-menu-item
17
+ :key="itemc.title"
18
+ :index="itemc.title"
19
+ :route="omenus.base + itemc.route"
20
+ >
21
+ <i
22
+ v-if="item.iconUrl"
23
+ class="el-icon- icon-url"
24
+ :style="{ backgroundImage: `url(${itemc.iconUrl})` }"
25
+ ></i>
26
+ <i v-else :class="itemc.iconClass"></i>
27
+ <span slot="title">{{ itemc.title }}</span>
28
+ </el-menu-item>
29
+ </template>
30
+ </el-submenu>
31
+ <el-menu-item
32
+ v-else
33
+ :key="item.title"
34
+ :index="item.title"
35
+ :route="omenus.base + item.route"
36
+ >
37
+ <i
38
+ v-if="item.iconUrl"
39
+ class="el-icon- icon-url"
40
+ :style="{ backgroundImage: `url(${item.iconUrl})` }"
41
+ ></i>
42
+ <i v-else :class="item.iconClass"></i>
43
+ <span slot="title">{{ item.title }}</span>
44
+ </el-menu-item>
45
+ </template>
46
+ </template>
47
+ </el-menu>
48
+ </template>
49
+
50
+ <script>
51
+ import getJsonc from '../../assets/getJsonc'
52
+ export default {
53
+ name: 'NavMenu',
54
+ data() {
55
+ return {
56
+ menus: []
57
+ }
58
+ },
59
+ created() {
60
+ this.setMenu()
61
+ },
62
+ methods: {
63
+ async setMenu() {
64
+ /* 获取主(当前)应用展示菜单 */
65
+ const { subApps = [], _menu = [] } = await getJsonc(
66
+ '/server-config.jsonc'
67
+ )
68
+ this.menus.push({
69
+ base: '',
70
+ menu: _menu
71
+ })
72
+
73
+ /* 顺序获取子应用展示菜单 */
74
+ const subConfigs = subApps.map((s) => {
75
+ let url = s.entry.replace('/index.html', '') + '/server-config.jsonc'
76
+ return getJsonc(url)
77
+ })
78
+ Promise.all(subConfigs).then((posts) => {
79
+ this.menus.push()
80
+ posts.forEach(({ _menu = [] }, i) => {
81
+ this.menus.push({
82
+ base: subApps[i]['activeRule'],
83
+ menu: _menu
84
+ })
85
+ })
86
+ })
87
+ }
88
+ }
89
+ }
90
+ </script>
@@ -0,0 +1,126 @@
1
+ /**
2
+ * author: zhengwei
3
+ * time: 2021-9-1
4
+ */
5
+ <template>
6
+ <div class="cl-pagination">
7
+ <i
8
+ class="el-icon-arrow-left block-box"
9
+ :class="{ disabled: isdisabled }"
10
+ @click="prev"
11
+ ></i>
12
+ <i
13
+ class="el-icon-arrow-right block-box"
14
+ :class="{ disabled: disabled }"
15
+ @click="next"
16
+ ></i>
17
+ <span class="cl-pagination-count">{{ current }}/{{ totalPage }}</span>
18
+ <el-select v-model="Size" @change="pageChange">
19
+ <el-option
20
+ v-for="item in pageSize"
21
+ :key="item"
22
+ :label="`${item}条/页`"
23
+ :value="item"
24
+ />
25
+ </el-select>
26
+ <div>
27
+ <span class="cl-pagination-arrive">至第</span>
28
+ <input
29
+ v-model.number="current"
30
+ class="cl-pagination-input"
31
+ @change="getChangearrive"
32
+ />
33
+
34
+ </div>
35
+ </div>
36
+ </template>
37
+
38
+ <script>
39
+ export default {
40
+ name: 'Pagination',
41
+ props: {
42
+ pageSize: {
43
+ type: Array,
44
+ default: () => [10, 15, 20, 25]
45
+ },
46
+ total: {
47
+ type: Number,
48
+ default: null
49
+ },
50
+ currentPage: {
51
+ type: Number,
52
+ default: 1
53
+ },
54
+ pageSizes: {
55
+ type: Number,
56
+ default: 10
57
+ }
58
+ },
59
+ data() {
60
+ return {
61
+ Size: this.pageSize[0],
62
+ current: 1,
63
+ totalPage: 1,
64
+ disabled: false,
65
+ isdisabled: false
66
+ }
67
+ },
68
+ computed: {
69
+ getNext() {
70
+ return this.totalPage - this.current > 0
71
+ }
72
+ },
73
+ mounted() {
74
+ this.current = this.currentPage
75
+ if (this.current > this.total) {
76
+ this.current = this.total
77
+ }
78
+ this.Size = this.pageSizes
79
+ this.getTotalData()
80
+ },
81
+ methods: {
82
+ getTotalData() {
83
+ if (this.total) {
84
+ let count = parseInt(this.total / this.Size)
85
+ this.totalPage = this.total % this.Size === 0 ? count : count + 1
86
+ }
87
+ },
88
+ pageChange(val) {
89
+ this.value = val
90
+ this.getTotalData()
91
+ if (this.totalPage !== this.current) {
92
+ this.disabled = false
93
+ }
94
+ this.$emit('page-size', val)
95
+ },
96
+ next() {
97
+ if (this.getNext) {
98
+ this.current++
99
+ this.$emit('current-change', this.current)
100
+ this.disabled = false
101
+ console.log(this.current)
102
+ } else {
103
+ this.disabled = true
104
+ this.isdisabled = false
105
+ }
106
+ },
107
+ prev() {
108
+ if (this.current > 1) {
109
+ this.current--
110
+ this.$emit('current-change', this.current)
111
+ this.isdisabled = false
112
+ } else {
113
+ this.isdisabled = true
114
+ this.disabled = false
115
+ }
116
+ },
117
+ getChangearrive(val) {
118
+ if (val.target.value > this.totalPage) {
119
+ val.target.value = this.totalPage
120
+ this.current = val.target.value
121
+ }
122
+ this.$emit('current-change', this.current)
123
+ }
124
+ }
125
+ }
126
+ </script>
@@ -0,0 +1,75 @@
1
+ /**
2
+ * author: zhengwei
3
+ * time: 2021-9-1
4
+ */
5
+ <template>
6
+ <div class="cl-secondary-tab">
7
+ <ul class="cl-secondary-tab-list">
8
+ <li
9
+ v-for="item in subMenuList"
10
+ :key="item.id"
11
+ class="cl-secondary-tab-item"
12
+ :class="{ action: current === item.name }"
13
+ @click="handleClick(item)"
14
+ >
15
+ {{ item.name }}
16
+ </li>
17
+ </ul>
18
+ </div>
19
+ </template>
20
+
21
+ <script>
22
+ export default {
23
+ name: 'SecondaryTab',
24
+ props: {
25
+ data: {
26
+ type: Array,
27
+ default: () => []
28
+ },
29
+ init: {
30
+ type: String,
31
+ default: ''
32
+ }
33
+ },
34
+ data() {
35
+ return {
36
+ current: ''
37
+ }
38
+ },
39
+ computed: {
40
+ subMenuList() {
41
+ if (!this.data) {
42
+ return []
43
+ }
44
+ let menuList = []
45
+ this.data.map((item) => {
46
+ if (typeof item === 'string') {
47
+ menuList.push({ name: item })
48
+ } else {
49
+ // 按钮权限
50
+ // if (isHas(item.relaNo)) menuList.push(item)
51
+ menuList.push(item)
52
+ }
53
+ return menuList
54
+ })
55
+ return menuList
56
+ }
57
+ },
58
+ watch: {
59
+ init() {
60
+ this.current = this.init
61
+ }
62
+ },
63
+ mounted() {
64
+ if (this.init) {
65
+ this.current = this.init
66
+ }
67
+ },
68
+ methods: {
69
+ handleClick(item) {
70
+ this.current = item.name
71
+ this.$emit('click', item)
72
+ }
73
+ }
74
+ }
75
+ </script>
@@ -0,0 +1,51 @@
1
+ <template>
2
+ <div class="cl-muls">
3
+ <el-select
4
+ ref="el-select"
5
+ v-bind="$attrs"
6
+ :value="value"
7
+ v-on="listeners"
8
+ @change="changeFn"
9
+ @visible-change="visibleChangeFn"
10
+ >
11
+ <slot></slot>
12
+ </el-select>
13
+ <span class="el-input__suffix">
14
+ <span
15
+ class="is-search el-input__icon el-icon-search"
16
+ @click.stop="searchFn"
17
+ ></span>
18
+ </span>
19
+ </div>
20
+ </template>
21
+
22
+ <script>
23
+ export default {
24
+ name: 'Select',
25
+ props: {
26
+ // eslint-disable-next-line vue/require-prop-types
27
+ value: {
28
+ default: undefined
29
+ }
30
+ },
31
+ data() {
32
+ this.listeners = Object.assign({}, this.$listeners, { input: () => {} })
33
+ return {}
34
+ },
35
+ methods: {
36
+ visibleChangeFn(val) {
37
+ if (val && !this.$refs['el-select']['multiple']) {
38
+ this.$refs['el-select']['selectedLabel'] =
39
+ this.$refs['el-select']['currentPlaceholder']
40
+ }
41
+ },
42
+ changeFn(val) {
43
+ this.$emit('input', val)
44
+ this.$emit('change', val)
45
+ },
46
+ searchFn() {
47
+ this.$emit('search', this.value)
48
+ }
49
+ }
50
+ }
51
+ </script>