@tongfun/tf-widget 0.1.21 → 0.1.22

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 (94) hide show
  1. package/README.md +49 -49
  2. package/lib/tf-widget.common.js +547 -503
  3. package/lib/tf-widget.css +1 -1
  4. package/lib/tf-widget.umd.js +547 -503
  5. package/lib/tf-widget.umd.min.js +4 -4
  6. package/package/svg-icon/index.js +8 -8
  7. package/package/svg-icon/src/SvgIcon.vue +59 -59
  8. package/package/t-data-list/index.js +6 -6
  9. package/package/t-data-list/main.vue +193 -193
  10. package/package/t-data-list/src/condition-input/basic.vue +31 -31
  11. package/package/t-data-list/src/condition-input/date.vue +106 -106
  12. package/package/t-data-list/src/condition-input/index.vue +100 -100
  13. package/package/t-data-list/src/condition-input/input.vue +31 -31
  14. package/package/t-data-list/src/condition-input/number.vue +115 -115
  15. package/package/t-data-list/src/condition-input/select.vue +86 -86
  16. package/package/t-data-list/src/js/fieldTypeEnum.js +10 -10
  17. package/package/t-data-list/src/js/operatorEnum.js +108 -108
  18. package/package/t-data-list/src/js/qureyParamsEnum.js +4 -4
  19. package/package/t-data-list/src/js/util.js +34 -34
  20. package/package/t-data-list/src/mixins/button-controll-mixin.js +93 -93
  21. package/package/t-data-list/src/pushdown/push-down.vue +158 -158
  22. package/package/t-data-list/src/t-list-search.vue +36 -36
  23. package/package/t-data-list/src/t-plan/condition-always-item.vue +143 -143
  24. package/package/t-data-list/src/t-plan/condition-mult-item.vue +222 -222
  25. package/package/t-data-list/src/t-plan/index.vue +195 -195
  26. package/package/t-data-list/src/t-plan/plan-content.vue +389 -389
  27. package/package/t-data-list/src/t-table/index.vue +129 -129
  28. package/package/t-data-list/src/t-table/table-group-item-edit.vue +238 -238
  29. package/package/t-data-list/src/t-table/table-group-item.vue +87 -87
  30. package/package/t-data-list/src/t-table/table-group.vue +180 -180
  31. package/package/t-data-list/src/t-table/table-records-header-popover.vue +246 -246
  32. package/package/t-data-list/src/t-table/table-records-selected.vue +159 -159
  33. package/package/t-data-list/src/t-table/table-records.vue +337 -337
  34. package/package/t-input/children/address.vue +101 -101
  35. package/package/t-input/children/basic-display.vue +41 -41
  36. package/package/t-input/children/basic.vue +253 -253
  37. package/package/t-input/children/date.vue +89 -89
  38. package/package/t-input/children/group-components/group-dialog.vue +344 -344
  39. package/package/t-input/children/group.vue +126 -126
  40. package/package/t-input/children/input.vue +72 -72
  41. package/package/t-input/children/number.vue +74 -74
  42. package/package/t-input/children/select.vue +89 -89
  43. package/package/t-input/children/tfile/fiile-enclosure.vue +233 -233
  44. package/package/t-input/index.js +7 -7
  45. package/package/t-input/index.vue +337 -337
  46. package/package/t-input/tInputCache.js +24 -24
  47. package/package/tf-icon-picker/README.md +7 -7
  48. package/package/tf-icon-picker/index.js +8 -8
  49. package/package/tf-icon-picker/src/tf-icon-picker.vue +266 -266
  50. package/package/tf-layout/README.md +115 -115
  51. package/package/tf-layout/index.js +8 -8
  52. package/package/tf-layout/src/components/tf-labelbar.vue +394 -394
  53. package/package/tf-layout/src/components/tf-menu.vue +180 -180
  54. package/package/tf-layout/src/components/tf-right-menu.vue +89 -89
  55. package/package/tf-layout/src/components/tf-rotate-box.vue +50 -50
  56. package/package/tf-layout/src/tf-layout.vue +140 -140
  57. package/package/tf-widget/index.js +8 -8
  58. package/package/tf-widget/src/assets/common-input.less +10 -10
  59. package/package/tf-widget/src/children/basic-data/basic-data.vue +361 -361
  60. package/package/tf-widget/src/children/basic-data/dependcy/basic-data-selector.vue +1087 -1087
  61. package/package/tf-widget/src/children/basic-data/dependcy/common-table.vue +750 -750
  62. package/package/tf-widget/src/children/basic-data/dependcy/condition-filter.vue +519 -519
  63. package/package/tf-widget/src/children/basic-data/dependcy/pagination.vue +93 -93
  64. package/package/tf-widget/src/children/basic-data/dependcy/table-control.vue +240 -240
  65. package/package/tf-widget/src/children/basic-data/dependcy/view-picture.vue +108 -108
  66. package/package/tf-widget/src/children/date-time.vue +103 -103
  67. package/package/tf-widget/src/children/date.vue +103 -103
  68. package/package/tf-widget/src/children/decimal.vue +115 -115
  69. package/package/tf-widget/src/children/integer.vue +104 -104
  70. package/package/tf-widget/src/children/property.vue +59 -59
  71. package/package/tf-widget/src/children/single-line-text.vue +82 -82
  72. package/package/tf-widget/src/children/small-pictures.vue +223 -223
  73. package/package/tf-widget/src/children/text-area.vue +74 -74
  74. package/package/tf-widget/src/children/tf-select.vue +113 -113
  75. package/package/tf-widget/src/tf-widget.vue +175 -175
  76. package/package.json +44 -44
  77. package/src/api/edit.js +97 -97
  78. package/src/api/file-enclosure.js +26 -26
  79. package/src/api/push-down.js +19 -19
  80. package/src/api/table.js +294 -294
  81. package/src/api/tableV3.js +166 -160
  82. package/src/assets/images/icons/index.js +9 -9
  83. package/src/assets/images/icons/svg/add.svg +5 -5
  84. package/src/assets/images/icons/svg/push-down.svg +1 -1
  85. package/src/assets/images/icons/svg/remove.svg +1 -1
  86. package/src/assets/styles/common-table.less +202 -202
  87. package/src/directives/debounce.js +24 -24
  88. package/src/index.js +31 -31
  89. package/src/mixins/t-data-query-mixin.js +290 -290
  90. package/src/utils/auth.js +22 -22
  91. package/src/utils/request.js +42 -42
  92. package/src/utils/stato-anormale.js +59 -59
  93. package/src/utils/utils.js +109 -109
  94. package/src/utils/validate.js +84 -84
@@ -1,394 +1,394 @@
1
- <template>
2
- <div class="tf-labelbar">
3
- <div class="close-menu">
4
- <div
5
- :class="closeMenu ? 'open-menu-icon': 'close-menu-icon'"
6
- src=""
7
- alt=""
8
- title="隐藏列表"
9
- @click="changeMenuState"
10
- />
11
- </div>
12
- <ul ref="labelMenu">
13
- <li
14
- v-for="tagItem in tagList"
15
- :key="tagItem.path"
16
- :class="activePath === tagItem.path ? 'active-tag' : ''"
17
- @click="routeJump(tagItem)"
18
- @contextmenu.prevent.stop="rightClick(tagItem, $event)"
19
- >
20
- <span>{{ tagItem.title }}</span>
21
- <i
22
- v-show="!tagItem.notCloseTag"
23
- class="el-icon-close close-icon"
24
- @click.stop="closeTag(tagItem)"
25
- />
26
- </li>
27
- </ul>
28
- <div
29
- class="scrollbar-icon left"
30
- @click="handleScroll('left')"
31
- />
32
- <el-dropdown
33
- class="right-menu"
34
- trigger="click"
35
- @command="dropdownCommand"
36
- >
37
- <span class="el-dropdown-link">
38
- <TfRotateBox />
39
- </span>
40
- <el-dropdown-menu slot="dropdown">
41
- <el-dropdown-item
42
- icon="el-icon-back"
43
- command="closeLeft"
44
- >关闭左侧</el-dropdown-item>
45
- <el-dropdown-item
46
- icon="el-icon-right"
47
- command="closeRight"
48
- >关闭右侧</el-dropdown-item>
49
- <el-dropdown-item
50
- icon="el-icon-circle-close"
51
- command="closeOther"
52
- >关闭其他</el-dropdown-item>
53
- <el-dropdown-item
54
- icon="el-icon-circle-close"
55
- command="closeAll"
56
- >关闭全部</el-dropdown-item>
57
- </el-dropdown-menu>
58
- </el-dropdown>
59
- <div
60
- class="scrollbar-icon right"
61
- @click="handleScroll('right')"
62
- />
63
- <TfRightMenu
64
- :left="rightMenuLeft"
65
- :top="rightMenuTop"
66
- :show-menu="showRightMenu"
67
- @rightMenuClick="dropdownCommand"
68
- />
69
- </div>
70
- </template>
71
-
72
- <script>
73
- import TfRotateBox from './tf-rotate-box.vue'
74
- import TfRightMenu from './tf-right-menu'
75
- export default {
76
- name: 'TfLaberBar',
77
- components: {
78
- TfRotateBox,
79
- TfRightMenu
80
- },
81
- props: {
82
- routeBase: {
83
- default: null,
84
- type: String
85
- }
86
- },
87
- data () {
88
- return {
89
- closeMenu: false,
90
- activePath: '/',
91
- tagList: [],
92
- rightMenuLeft: 0,
93
- rightMenuTop: 0,
94
- showRightMenu: false
95
- }
96
- },
97
- watch: {
98
- $route: {
99
- handler: function (newValue) {
100
- if (newValue && newValue.matched[0]?.meta.base === this.routeBase) {
101
- const { meta, path, name, params, query } = newValue
102
- if (!path) return
103
- const obj = {
104
- path,
105
- name,
106
- params,
107
- query,
108
- defaultRoute: meta.defaultRoute,
109
- notCloseTag: meta.defaultRoute,
110
- title: meta.title,
111
- replace: meta.replace
112
- }
113
- if (!meta.noCache) {
114
- const cacheArr = newValue.matched.map(item => item.name)
115
- const cacheObj = this.tagList.find(item => item.path === obj.path)
116
- if(!cacheObj) this.$emit('setCache', cacheArr)
117
- obj.cacheArr = cacheArr
118
- }
119
- if (obj.defaultRoute) {
120
- if (!this.checkMenu(obj.path)) this.tagList.unshift(obj)
121
- } else {
122
- if (!this.checkMenu(obj.path)) this.tagList.push(obj)
123
- }
124
- // todo: 增加页面缓存
125
- this.activePath = path
126
- }
127
- },
128
- deep: true,
129
- immediate: true
130
- }
131
- },
132
- created () {
133
- window.addEventListener('click', () => {
134
- this.showRightMenu = false
135
- }, false)
136
- },
137
- methods: {
138
- changeMenuState () {
139
- this.closeMenu = !this.closeMenu
140
- this.$emit('changeMenuState', this.closeMenu)
141
- },
142
- /**
143
- * @description tag右键点击事件
144
- */
145
- rightClick: function (tagItem, $event) {
146
- this.routeJump(tagItem)
147
- this.$nextTick(() => {
148
- this.rightMenuTop = $event.clientY
149
- this.rightMenuLeft = $event.clientX
150
- this.showRightMenu = true
151
- })
152
- },
153
-
154
- /**
155
- * @member
156
- * @description 右侧操作
157
- * @param params: 操作指令: closeLeft => 关闭左侧, closeRight => 关闭右侧, closeAll => 关闭全部,
158
- */
159
- dropdownCommand: function (params) {
160
- const activeNum = this.tagList.findIndex(
161
- (item) => item.path === this.activePath
162
- )
163
- const pathMap = new Map()
164
- const deleteArr = []
165
- const pathArr = this.tagList.map((item) => {
166
- pathMap.set(item.path, item)
167
- return item.path
168
- })
169
- switch (params) {
170
- case 'closeLeft':
171
- deleteArr.push(...pathArr.slice(0, activeNum))
172
- break
173
- case 'closeRight':
174
- deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
175
- break
176
- case 'closeOther':
177
- deleteArr.push(...pathArr.slice(0, activeNum))
178
- deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
179
- break
180
- default:
181
- deleteArr.push(...pathArr)
182
- break
183
- }
184
- const deleteCacheArr = []
185
- deleteArr.forEach((item) => {
186
- const tagItem = pathMap.get(item)
187
- if (tagItem && tagItem.cacheArr) deleteCacheArr.push(tagItem.cacheArr)
188
- if (tagItem && !tagItem.notCloseTag) {
189
- const num = this.tagList.indexOf(tagItem)
190
- this.tagList.splice(num, 1)
191
- }
192
- })
193
-
194
- this.$emit('deleteCache', deleteCacheArr)
195
- if (params === 'closeAll') this.routeJump(this.tagList[0])
196
- },
197
- /**
198
- * @description 左右滑动
199
- * @param direction: 滑动方向
200
- */
201
- handleScroll (direction) {
202
- let rollNum = 0
203
- rollNum = direction === 'right' ? rollNum + 50 : rollNum - 50
204
- const dom = this.$refs.labelMenu
205
- dom.scrollLeft += rollNum
206
- },
207
- /**
208
- * @description 点击tag标签
209
- * @param path: 每项Tag
210
- */
211
- checkMenu (path) {
212
- if (this.tagList.find((item) => item.path === path)) return true
213
- return false
214
- },
215
- /**
216
- * @description 路由跳转
217
- */
218
- routeJump: function (value) {
219
- if (value && value.path !== this.activePath) {
220
- const { path, query, params, replace } = value
221
- if (replace) {
222
- this.$router.replace({
223
- path,
224
- query,
225
- params
226
- })
227
- } else {
228
- this.$router.push({
229
- path,
230
- query,
231
- params
232
- })
233
- }
234
- }
235
- },
236
- /**
237
- * 关闭tag
238
- */
239
- closeTag: function (tagItem, deleteCacheArr = true) {
240
- if (tagItem.cacheArr && deleteCacheArr) this.$emit('deleteCache', [tagItem.cacheArr])
241
- const num = this.tagList.indexOf(tagItem)
242
- if (tagItem) {
243
- this.tagList.splice(num, 1)
244
- this.routeJump(this.tagList[num - 1])
245
- }
246
- },
247
- /**
248
- * 关闭当前标签页
249
- */
250
- closeDynamicRoutingTag () {
251
- const nameArr = this.tagList.map(d => d.name === this.$route.name)
252
- const tagItem = this.tagList.find(d => d.path === this.$route.path)
253
- if (tagItem) {
254
- // 如果tagList中存在两个及以上相同name路由,表明不能删除该缓存
255
- this.closeTag(tagItem, !(nameArr.length > 1))
256
- }
257
- }
258
- }
259
- }
260
- </script>
261
- <style lang="less" scoped>
262
- .tf-labelbar {
263
- width: 100%;
264
- height: 40px;
265
- position: relative;
266
- box-sizing: border-box;
267
- padding: 0 73px;
268
- .close-menu {
269
- cursor: pointer;
270
- position: absolute;
271
- left:0;
272
- height: 40px;
273
- width: 40px;
274
- display: flex;
275
- align-items: center;
276
- justify-content: center;
277
- box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
278
- .close-menu-icon {
279
- height: 15px;
280
- width: 15px;
281
- background: #99999a;
282
- mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAdpJREFUOE+Nkz1rFUEUht8zs0kstBArBUst9C8oEv/DvYg7V+9soZWVJhoxsCJ+YCspFLyzYecSkosgElNYqAg22hhFwUII4g+wEnFn58jG3Xh39wpOM5/nmcN73kNB395l0Ns8CUforEmMujnGx6SzsXuS2n4hosduEF5E/CJAPOt27su91Klmpt0+UfcQxwJx7Ks3JKJ0UzA9dUZdrQHO3Z/Cg/OZjIZ9MBuAo9z0TDNLEtp+EIx1l6iFHUAVrO1ZAAmAXm6Ubf5eZNEGFKfxrJPRMASzBdOZPAlTdNamMepkNX1agO1H3V9SWwUgBXAqN2q1GTS+b2QQC7l1qAviFSZc8j5bwnSwF1nmMLWLkf2k7eBq7YIffwDAhjPqMvTKQYn8K4CiEsW8v1w3k2AAAuB3LQ3E1rd5IrrJxPMSeMaQe8j7v6UtUUwsHOh7HVCqL6J0kZjmBPHxbNDb/H8NCsCBw1xUIdD2BgPXSNAJ9zB8hQsbM9j3JsPHI4Sjn7iaJ/ugdGCg7S0GFsjjmFtWr//lg/cCWG85sYL07W0mXCGik25w+iXi61SzchANP4P9E2d6c/VeYEJnJIrmCqL0jmfKvFGLLStLbR8x4bkfqKWJ3dhonqagvwFo3iEkt6LFjgAAAABJRU5ErkJggg==);
283
- &:hover {
284
- background: #07579a;
285
- }
286
- }
287
- .open-menu-icon {
288
- height: 15px;
289
- width: 15px;
290
- background: #99999a;
291
- mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAbRJREFUOE+dk7FP21AQxr/PzyZCsLQjXWFhQR0qVQyoLFXF2JIsicBxVHWooHSsOtRbxUAlRKWqgDDItiDAP8AEqBPs/RM6FykTxO9dFSd2lKSkUt/47u6n7+67I4Y+YTtMydOKxwonJW274QshdzsJnXAWrEbrAj7UQfk10r+iySH+uQ1/PlFeWIKw3gvwfQv+J7GX41mxcAFwfwCSAarRIoCjXkBLSArxjeOFM0Z4DWJX71Xe5kr8C5UqaAPqTAv6389pGyelO6d2+NgYfQViJ4c8+G1h+02zCxg+RRRq4WQivKYgTILKO/S2UCfceGpE6ULK0Va3JWVE4DhNJA0lmIXwgOSXpOF8aKnLFahq9AvAxD+E3AAyCrBgwTxtBktXyo2LoBwTSwePgMIYLN31OqNpZcMkDWuEC4R8F5gNM37zEVurt8oLX0F4OuhCnxTHjZ4Yyg8RfjP7lfdtN0q6Cxjigu2Gz4Q8B/hVB+WVtDhz4V4FnT2wa/GcGLkkuJkE5bWBPfgrICv2ouciOBsobt1EZqMbvwSlbwb5oUSfxcKY3qus3nsLuQv/e41ePC8i238Ap2nyLhWRefAAAAAASUVORK5CYII=);
292
- &:hover {
293
- background: #07579a;
294
- }
295
- }
296
- }
297
-
298
- ul {
299
- height: 100%;
300
- width: 100%;
301
- padding: 0;
302
- margin: 0;
303
- display: flex;
304
- align-items: flex-end;
305
- justify-content: left;
306
- list-style: none;
307
- overflow-y: hidden;
308
- overflow-x: auto;
309
- &::-webkit-scrollbar {
310
- display: none;
311
- height:0;
312
- }
313
- li {
314
- padding: 0 30px;
315
- font-size: 14px;
316
- color: #515a6e;
317
- height: 35px;
318
- margin: 10px -19px 0 0;
319
- cursor: pointer;
320
- display: flex;
321
- white-space: nowrap;
322
- align-items: center;
323
- justify-content: center;
324
- box-sizing: content-box;
325
- mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAAAkBAMAAAAdqzmBAAAAMFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlTPQ5AAAAD3RSTlMAr3DvEM8wgCBA379gj5//tJBPAAAAnUlEQVRIx2NgAAM27fj/tAO/xBsYkIHyf9qCT8iWMf6nNQhAsk2f5rYheY7Dnua2/U+A28ZEe8v+F9Ax2v7/F4DbxkUH2wzgtvHTwbYPo7aN2jZq26hto7aN2jZq25Cy7Qvctnw62PYNbls9HWz7S8/G6//PsI6H4396gAUQy1je08W2jxDbpv6nD4gB2uWp+J9eYPsEhv/0BPS1DQBvoBLVZ3BppgAAAABJRU5ErkJggg==);
326
- mask-repeat: no-repeat;
327
- mask-size: 95% 100%;
328
- transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
329
- .close-icon {
330
- transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
331
- margin-left: 8px;
332
- width: 0;
333
- overflow: hidden;
334
- &:hover {
335
- border-radius: 50%;
336
- background: #666666;
337
- color: white;
338
- }
339
- }
340
- &:hover {
341
- background: #dee1e6;
342
- .close-icon {
343
- width: 14px;
344
- }
345
- }
346
- }
347
- .active-tag {
348
- padding: 0 20px !important;
349
- color: #0361A4 !important;
350
- background: #ECF5FF !important;
351
- .close-icon {
352
- min-width: 14px;
353
- }
354
- }
355
- }
356
- .scrollbar-icon {
357
- cursor: pointer;
358
- width: 13px;
359
- height: 13px;
360
- position: absolute;
361
- top: 50%;
362
- transform: translateY(-50%);
363
- &:hover {
364
- background: #07579a;
365
- }
366
- }
367
- .left {
368
- background: #99999a;
369
- left: 55px;
370
- mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAcCAYAAAB2+A+pAAAAAXNSR0IArs4c6QAAA9RJREFUSEuVl0tvG2UUhp/zeRIXaMFiEaEsyq1NU0oJKVBaxEVtWqCoRVzELyB2HEXiByAkAgsuldhESmJHsiIlexawoC0qioAFFWUFCJVFEWJFEBtEAh6Pv4NOPBMcx5fxSN7NO8/3nffcLKR8VFUqlcr+KIqOOOe0Vqv9MDMz81tKOaYvlUp3ZzKZw977WyStsFKp7KvVauMi8hiw6Zxby+fzP/Wjr9frx1T1GJBNBZ6fn98bBMHDwCvA08BN7/3C9PT0Whpwk/5V4KRpeoKXl5f3hGH4AHABeBk4CnwnIm8XCoXPeoFb9AYeAWpdwSaqVquHgAkRMZGFaQ9wXVXfLBaLn3cDt9E/CgRA1BEcn/Sgqp4VkbPACSBnIFX9AninWCx+2QncRR8Cf7cFJycVkVOqekFExoE7AAfUgSvAe1NTU1+3A/fQ/wv8uQtsoiiKRur1+pmWm2qcExFg3l5sB06h3wR+3wFuOulpVT0f39TCa+9tg1X1koh8mICtRkVEU+p3gufm5rLZbHbEPAWeFZHHE09bwhmJyBUR+SCfz3+VQPvQ/wP8sXXjDp4kN2210UJt2bztcZ/6BnhhYeG+gYGBIe+9NYZTzdnbIWO3PLYb53K5a+vr67kgCEZE5KmU+ga4VCq97py7x3tvyTQaZ2+7bG/2+NNMJnPROfdjFEVjqvqCQXvok3s0wEtLS4vAqKo+GRd3p9JsBn+sqh9ls9lfwjA8JyJ54Dgw2KuTAQ1wuVyuiMghVbUeanWaGhwEwa/ee6vzvKo+AmT6Ab8B3Bv7cz+wt4O4uY4/sToeHBy8EYbhcRE5r6rm8YEu+p2hLpfLo977u5xzp4FnAOtS+7qcfDu5VPVb59ydURQd7kPfCLXV4erq6q2bm5sPicgZ4BzwYBf4rnJaWVm5rQ/9/3VstzPxxsaGbReWoROAzd92Yd9qIKr6vnWupIH0od8JNrgNbOfcWCaTmVDV54EjwO2tnatTy0ypt5bZ6FzNj604YRiaZ88BFvrE81RDIoV+95BIDmBhq1arR+MJZaFv9rwuIpeTULdLwh56C/XusdgM7+C53fyqc+5dGxKdsr+L51Xgr66rT+KZc84m1ovxvhWo6jfAW8Vi8Wq3htFGPxa/X+257MWeWam9ZL+4SVyLl73LvTpVi96Wxf3WNnuC7cPlctnWHpvPrwFPAD8Dc4VCYc0WgF7wFr19p/uWmXzQanVxcTHnnDPRSRHZcM5dmpyc/D4NuFkvIidUdTDVje0As7Ozbnh4+ID33oaBF5HrhULhZhpwoh8aGjoYBMG4/YX5D8BcMmEDOwIbAAAAAElFTkSuQmCC);
371
- mask-size: 100% 100%;
372
- mask-repeat: no-repeat;
373
- }
374
- .right {
375
- background: #99999a;
376
- right: 55px;
377
- mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAA25JREFUSEuVls9rXFUUx7/fO3mDojAhZGFwIYgbFXUj4kJqpQqtC5dxHUiYRDCL7NRSWsG/IS/PB6Vr20ijNNL0h0mlPzQNRVyIyZgWF1FrWhV1kpl59ytH3pNxmJk73uXjfu/nnXO+95zLOI7fdM7VW63WNzMzM9skhcBK0/Qx7/1z3nuWSqWvJycnb4d0jOP4KMm6pKsjIyM3x8fHGyFQkiRPSzpEskzyi0qlshHSGegagCbJz7IsO1Mqlb6vVqvNfrA4jg3yFoBHSH7aarUWQzouLCz8mh+6Lum09/7y6Ojodr8/TJLkiKQTAJ4iedV7vxjSGagOoAzgDwDXASw659YqlUqtFyxJklcBfCDpBQC/AbgR0hnINj4IIAJwj+QVScskL0va7pbGJElelvQ+gAN5NoI6A90H8FAOMsf9AuCapCXn3JXh4eHbnZEZCMBxSQcBFC7tqzPQLoCH8/SZiAB+NDdJWsmybLUotCSajfOIrEYGtNVXZxs6QYXZMgC7JM0gZ9thtqEjonaD9tT1AhXiXUlrAM63uyqO4wMkjwN4pcc1+I+uXC7fDYG8RQbgJoAl7/3y9PT0nTRNX/LeHwNg7uu2/tFJ2iD5MclaCFQcYnfNDHJqaGhopdlsPumcew/AkUAXMUevkdwcBFQU2lx1kmRKcsR7/w6AN/qACt2OpDv/B3Sf5ElJHwKoAHh3QNDPAH4YBGQ/bV3jKwCnoig612g0nnDOHZX0eiB1f+YtKpg6C9/qcwvAJwCWd3Z2tsbGxl4keUzSaz1A/+pIngUQNIN1Det/5wFcLJfLmxMTE3sD2LvQrQC44L3/qVfqzJ73LBIbA5Iu7e/vfzc7O7sfuLA9db1a0N3czhecc5eiKKpZJEULmp+fP+icswvb2YK66ooW1N5U7Ztd0C+tJpJWG41GzSIpIF0iKmzcVVfUsHNMWOGv27S13O7t7W0V6WovepcxEdS1D76/cgsvkfw8iqJvLV3dXNUx+H4vWlQ/XTGPSpJuOefOZFl2sV6v1+bm5mzydl1xHB92zp2Q9KylmeRiSGegdQCt3MIftburD+iQc+5tSY9KOkfydEhnIJv9dZumURTd6JWuAmqmSNP0Ge/9YZIPAFgdRGfPrQl7QALYmJqa2gw9BA2UJMnjkp4H4ACsV6vVrZDubzHWkATwr3pxAAAAAElFTkSuQmCC);
378
- mask-size: 100% 100%;
379
- mask-repeat: no-repeat;
380
- }
381
- .right-menu {
382
- box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
383
- justify-content: center;
384
- cursor: pointer;
385
- width: 40px;
386
- height: 100%;
387
- position: absolute;
388
- top: 0;
389
- right: 0px;
390
- display: flex;
391
- align-items: center;
392
- }
393
- }
394
- </style>
1
+ <template>
2
+ <div class="tf-labelbar">
3
+ <div class="close-menu">
4
+ <div
5
+ :class="closeMenu ? 'open-menu-icon': 'close-menu-icon'"
6
+ src=""
7
+ alt=""
8
+ title="隐藏列表"
9
+ @click="changeMenuState"
10
+ />
11
+ </div>
12
+ <ul ref="labelMenu">
13
+ <li
14
+ v-for="tagItem in tagList"
15
+ :key="tagItem.path"
16
+ :class="activePath === tagItem.path ? 'active-tag' : ''"
17
+ @click="routeJump(tagItem)"
18
+ @contextmenu.prevent.stop="rightClick(tagItem, $event)"
19
+ >
20
+ <span>{{ tagItem.title }}</span>
21
+ <i
22
+ v-show="!tagItem.notCloseTag"
23
+ class="el-icon-close close-icon"
24
+ @click.stop="closeTag(tagItem)"
25
+ />
26
+ </li>
27
+ </ul>
28
+ <div
29
+ class="scrollbar-icon left"
30
+ @click="handleScroll('left')"
31
+ />
32
+ <el-dropdown
33
+ class="right-menu"
34
+ trigger="click"
35
+ @command="dropdownCommand"
36
+ >
37
+ <span class="el-dropdown-link">
38
+ <TfRotateBox />
39
+ </span>
40
+ <el-dropdown-menu slot="dropdown">
41
+ <el-dropdown-item
42
+ icon="el-icon-back"
43
+ command="closeLeft"
44
+ >关闭左侧</el-dropdown-item>
45
+ <el-dropdown-item
46
+ icon="el-icon-right"
47
+ command="closeRight"
48
+ >关闭右侧</el-dropdown-item>
49
+ <el-dropdown-item
50
+ icon="el-icon-circle-close"
51
+ command="closeOther"
52
+ >关闭其他</el-dropdown-item>
53
+ <el-dropdown-item
54
+ icon="el-icon-circle-close"
55
+ command="closeAll"
56
+ >关闭全部</el-dropdown-item>
57
+ </el-dropdown-menu>
58
+ </el-dropdown>
59
+ <div
60
+ class="scrollbar-icon right"
61
+ @click="handleScroll('right')"
62
+ />
63
+ <TfRightMenu
64
+ :left="rightMenuLeft"
65
+ :top="rightMenuTop"
66
+ :show-menu="showRightMenu"
67
+ @rightMenuClick="dropdownCommand"
68
+ />
69
+ </div>
70
+ </template>
71
+
72
+ <script>
73
+ import TfRotateBox from './tf-rotate-box.vue'
74
+ import TfRightMenu from './tf-right-menu'
75
+ export default {
76
+ name: 'TfLaberBar',
77
+ components: {
78
+ TfRotateBox,
79
+ TfRightMenu
80
+ },
81
+ props: {
82
+ routeBase: {
83
+ default: null,
84
+ type: String
85
+ }
86
+ },
87
+ data () {
88
+ return {
89
+ closeMenu: false,
90
+ activePath: '/',
91
+ tagList: [],
92
+ rightMenuLeft: 0,
93
+ rightMenuTop: 0,
94
+ showRightMenu: false
95
+ }
96
+ },
97
+ watch: {
98
+ $route: {
99
+ handler: function (newValue) {
100
+ if (newValue && newValue.matched[0]?.meta.base === this.routeBase) {
101
+ const { meta, path, name, params, query } = newValue
102
+ if (!path) return
103
+ const obj = {
104
+ path,
105
+ name,
106
+ params,
107
+ query,
108
+ defaultRoute: meta.defaultRoute,
109
+ notCloseTag: meta.defaultRoute,
110
+ title: meta.title,
111
+ replace: meta.replace
112
+ }
113
+ if (!meta.noCache) {
114
+ const cacheArr = newValue.matched.map(item => item.name)
115
+ const cacheObj = this.tagList.find(item => item.path === obj.path)
116
+ if (!cacheObj) this.$emit('setCache', cacheArr)
117
+ obj.cacheArr = cacheArr
118
+ }
119
+ if (obj.defaultRoute) {
120
+ if (!this.checkMenu(obj.path)) this.tagList.unshift(obj)
121
+ } else {
122
+ if (!this.checkMenu(obj.path)) this.tagList.push(obj)
123
+ }
124
+ // todo: 增加页面缓存
125
+ this.activePath = path
126
+ }
127
+ },
128
+ deep: true,
129
+ immediate: true
130
+ }
131
+ },
132
+ created () {
133
+ window.addEventListener('click', () => {
134
+ this.showRightMenu = false
135
+ }, false)
136
+ },
137
+ methods: {
138
+ changeMenuState () {
139
+ this.closeMenu = !this.closeMenu
140
+ this.$emit('changeMenuState', this.closeMenu)
141
+ },
142
+ /**
143
+ * @description tag右键点击事件
144
+ */
145
+ rightClick: function (tagItem, $event) {
146
+ this.routeJump(tagItem)
147
+ this.$nextTick(() => {
148
+ this.rightMenuTop = $event.clientY
149
+ this.rightMenuLeft = $event.clientX
150
+ this.showRightMenu = true
151
+ })
152
+ },
153
+
154
+ /**
155
+ * @member
156
+ * @description 右侧操作
157
+ * @param params: 操作指令: closeLeft => 关闭左侧, closeRight => 关闭右侧, closeAll => 关闭全部,
158
+ */
159
+ dropdownCommand: function (params) {
160
+ const activeNum = this.tagList.findIndex(
161
+ (item) => item.path === this.activePath
162
+ )
163
+ const pathMap = new Map()
164
+ const deleteArr = []
165
+ const pathArr = this.tagList.map((item) => {
166
+ pathMap.set(item.path, item)
167
+ return item.path
168
+ })
169
+ switch (params) {
170
+ case 'closeLeft':
171
+ deleteArr.push(...pathArr.slice(0, activeNum))
172
+ break
173
+ case 'closeRight':
174
+ deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
175
+ break
176
+ case 'closeOther':
177
+ deleteArr.push(...pathArr.slice(0, activeNum))
178
+ deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
179
+ break
180
+ default:
181
+ deleteArr.push(...pathArr)
182
+ break
183
+ }
184
+ const deleteCacheArr = []
185
+ deleteArr.forEach((item) => {
186
+ const tagItem = pathMap.get(item)
187
+ if (tagItem && tagItem.cacheArr) deleteCacheArr.push(tagItem.cacheArr)
188
+ if (tagItem && !tagItem.notCloseTag) {
189
+ const num = this.tagList.indexOf(tagItem)
190
+ this.tagList.splice(num, 1)
191
+ }
192
+ })
193
+
194
+ this.$emit('deleteCache', deleteCacheArr)
195
+ if (params === 'closeAll') this.routeJump(this.tagList[0])
196
+ },
197
+ /**
198
+ * @description 左右滑动
199
+ * @param direction: 滑动方向
200
+ */
201
+ handleScroll (direction) {
202
+ let rollNum = 0
203
+ rollNum = direction === 'right' ? rollNum + 50 : rollNum - 50
204
+ const dom = this.$refs.labelMenu
205
+ dom.scrollLeft += rollNum
206
+ },
207
+ /**
208
+ * @description 点击tag标签
209
+ * @param path: 每项Tag
210
+ */
211
+ checkMenu (path) {
212
+ if (this.tagList.find((item) => item.path === path)) return true
213
+ return false
214
+ },
215
+ /**
216
+ * @description 路由跳转
217
+ */
218
+ routeJump: function (value) {
219
+ if (value && value.path !== this.activePath) {
220
+ const { path, query, params, replace } = value
221
+ if (replace) {
222
+ this.$router.replace({
223
+ path,
224
+ query,
225
+ params
226
+ })
227
+ } else {
228
+ this.$router.push({
229
+ path,
230
+ query,
231
+ params
232
+ })
233
+ }
234
+ }
235
+ },
236
+ /**
237
+ * 关闭tag
238
+ */
239
+ closeTag: function (tagItem, deleteCacheArr = true) {
240
+ if (tagItem.cacheArr && deleteCacheArr) this.$emit('deleteCache', [tagItem.cacheArr])
241
+ const num = this.tagList.indexOf(tagItem)
242
+ if (tagItem) {
243
+ this.tagList.splice(num, 1)
244
+ this.routeJump(this.tagList[num - 1])
245
+ }
246
+ },
247
+ /**
248
+ * 关闭当前标签页
249
+ */
250
+ closeDynamicRoutingTag () {
251
+ const nameArr = this.tagList.map(d => d.name === this.$route.name)
252
+ const tagItem = this.tagList.find(d => d.path === this.$route.path)
253
+ if (tagItem) {
254
+ // 如果tagList中存在两个及以上相同name路由,表明不能删除该缓存
255
+ this.closeTag(tagItem, !(nameArr.length > 1))
256
+ }
257
+ }
258
+ }
259
+ }
260
+ </script>
261
+ <style lang="less" scoped>
262
+ .tf-labelbar {
263
+ width: 100%;
264
+ height: 40px;
265
+ position: relative;
266
+ box-sizing: border-box;
267
+ padding: 0 73px;
268
+ .close-menu {
269
+ cursor: pointer;
270
+ position: absolute;
271
+ left:0;
272
+ height: 40px;
273
+ width: 40px;
274
+ display: flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
278
+ .close-menu-icon {
279
+ height: 15px;
280
+ width: 15px;
281
+ background: #99999a;
282
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAdpJREFUOE+Nkz1rFUEUht8zs0kstBArBUst9C8oEv/DvYg7V+9soZWVJhoxsCJ+YCspFLyzYecSkosgElNYqAg22hhFwUII4g+wEnFn58jG3Xh39wpOM5/nmcN73kNB395l0Ns8CUforEmMujnGx6SzsXuS2n4hosduEF5E/CJAPOt27su91Klmpt0+UfcQxwJx7Ks3JKJ0UzA9dUZdrQHO3Z/Cg/OZjIZ9MBuAo9z0TDNLEtp+EIx1l6iFHUAVrO1ZAAmAXm6Ubf5eZNEGFKfxrJPRMASzBdOZPAlTdNamMepkNX1agO1H3V9SWwUgBXAqN2q1GTS+b2QQC7l1qAviFSZc8j5bwnSwF1nmMLWLkf2k7eBq7YIffwDAhjPqMvTKQYn8K4CiEsW8v1w3k2AAAuB3LQ3E1rd5IrrJxPMSeMaQe8j7v6UtUUwsHOh7HVCqL6J0kZjmBPHxbNDb/H8NCsCBw1xUIdD2BgPXSNAJ9zB8hQsbM9j3JsPHI4Sjn7iaJ/ugdGCg7S0GFsjjmFtWr//lg/cCWG85sYL07W0mXCGik25w+iXi61SzchANP4P9E2d6c/VeYEJnJIrmCqL0jmfKvFGLLStLbR8x4bkfqKWJ3dhonqagvwFo3iEkt6LFjgAAAABJRU5ErkJggg==);
283
+ &:hover {
284
+ background: #07579a;
285
+ }
286
+ }
287
+ .open-menu-icon {
288
+ height: 15px;
289
+ width: 15px;
290
+ background: #99999a;
291
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAbRJREFUOE+dk7FP21AQxr/PzyZCsLQjXWFhQR0qVQyoLFXF2JIsicBxVHWooHSsOtRbxUAlRKWqgDDItiDAP8AEqBPs/RM6FykTxO9dFSd2lKSkUt/47u6n7+67I4Y+YTtMydOKxwonJW274QshdzsJnXAWrEbrAj7UQfk10r+iySH+uQ1/PlFeWIKw3gvwfQv+J7GX41mxcAFwfwCSAarRIoCjXkBLSArxjeOFM0Z4DWJX71Xe5kr8C5UqaAPqTAv6389pGyelO6d2+NgYfQViJ4c8+G1h+02zCxg+RRRq4WQivKYgTILKO/S2UCfceGpE6ULK0Va3JWVE4DhNJA0lmIXwgOSXpOF8aKnLFahq9AvAxD+E3AAyCrBgwTxtBktXyo2LoBwTSwePgMIYLN31OqNpZcMkDWuEC4R8F5gNM37zEVurt8oLX0F4OuhCnxTHjZ4Yyg8RfjP7lfdtN0q6Cxjigu2Gz4Q8B/hVB+WVtDhz4V4FnT2wa/GcGLkkuJkE5bWBPfgrICv2ouciOBsobt1EZqMbvwSlbwb5oUSfxcKY3qus3nsLuQv/e41ePC8i238Ap2nyLhWRefAAAAAASUVORK5CYII=);
292
+ &:hover {
293
+ background: #07579a;
294
+ }
295
+ }
296
+ }
297
+
298
+ ul {
299
+ height: 100%;
300
+ width: 100%;
301
+ padding: 0;
302
+ margin: 0;
303
+ display: flex;
304
+ align-items: flex-end;
305
+ justify-content: left;
306
+ list-style: none;
307
+ overflow-y: hidden;
308
+ overflow-x: auto;
309
+ &::-webkit-scrollbar {
310
+ display: none;
311
+ height:0;
312
+ }
313
+ li {
314
+ padding: 0 30px;
315
+ font-size: 14px;
316
+ color: #515a6e;
317
+ height: 35px;
318
+ margin: 10px -19px 0 0;
319
+ cursor: pointer;
320
+ display: flex;
321
+ white-space: nowrap;
322
+ align-items: center;
323
+ justify-content: center;
324
+ box-sizing: content-box;
325
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAAAkBAMAAAAdqzmBAAAAMFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlTPQ5AAAAD3RSTlMAr3DvEM8wgCBA379gj5//tJBPAAAAnUlEQVRIx2NgAAM27fj/tAO/xBsYkIHyf9qCT8iWMf6nNQhAsk2f5rYheY7Dnua2/U+A28ZEe8v+F9Ax2v7/F4DbxkUH2wzgtvHTwbYPo7aN2jZq26hto7aN2jZq25Cy7Qvctnw62PYNbls9HWz7S8/G6//PsI6H4396gAUQy1je08W2jxDbpv6nD4gB2uWp+J9eYPsEhv/0BPS1DQBvoBLVZ3BppgAAAABJRU5ErkJggg==);
326
+ mask-repeat: no-repeat;
327
+ mask-size: 95% 100%;
328
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
329
+ .close-icon {
330
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
331
+ margin-left: 8px;
332
+ width: 0;
333
+ overflow: hidden;
334
+ &:hover {
335
+ border-radius: 50%;
336
+ background: #666666;
337
+ color: white;
338
+ }
339
+ }
340
+ &:hover {
341
+ background: #dee1e6;
342
+ .close-icon {
343
+ width: 14px;
344
+ }
345
+ }
346
+ }
347
+ .active-tag {
348
+ padding: 0 20px !important;
349
+ color: #0361A4 !important;
350
+ background: #ECF5FF !important;
351
+ .close-icon {
352
+ min-width: 14px;
353
+ }
354
+ }
355
+ }
356
+ .scrollbar-icon {
357
+ cursor: pointer;
358
+ width: 13px;
359
+ height: 13px;
360
+ position: absolute;
361
+ top: 50%;
362
+ transform: translateY(-50%);
363
+ &:hover {
364
+ background: #07579a;
365
+ }
366
+ }
367
+ .left {
368
+ background: #99999a;
369
+ left: 55px;
370
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAcCAYAAAB2+A+pAAAAAXNSR0IArs4c6QAAA9RJREFUSEuVl0tvG2UUhp/zeRIXaMFiEaEsyq1NU0oJKVBaxEVtWqCoRVzELyB2HEXiByAkAgsuldhESmJHsiIlexawoC0qioAFFWUFCJVFEWJFEBtEAh6Pv4NOPBMcx5fxSN7NO8/3nffcLKR8VFUqlcr+KIqOOOe0Vqv9MDMz81tKOaYvlUp3ZzKZw977WyStsFKp7KvVauMi8hiw6Zxby+fzP/Wjr9frx1T1GJBNBZ6fn98bBMHDwCvA08BN7/3C9PT0Whpwk/5V4KRpeoKXl5f3hGH4AHABeBk4CnwnIm8XCoXPeoFb9AYeAWpdwSaqVquHgAkRMZGFaQ9wXVXfLBaLn3cDt9E/CgRA1BEcn/Sgqp4VkbPACSBnIFX9AninWCx+2QncRR8Cf7cFJycVkVOqekFExoE7AAfUgSvAe1NTU1+3A/fQ/wv8uQtsoiiKRur1+pmWm2qcExFg3l5sB06h3wR+3wFuOulpVT0f39TCa+9tg1X1koh8mICtRkVEU+p3gufm5rLZbHbEPAWeFZHHE09bwhmJyBUR+SCfz3+VQPvQ/wP8sXXjDp4kN2210UJt2bztcZ/6BnhhYeG+gYGBIe+9NYZTzdnbIWO3PLYb53K5a+vr67kgCEZE5KmU+ga4VCq97py7x3tvyTQaZ2+7bG/2+NNMJnPROfdjFEVjqvqCQXvok3s0wEtLS4vAqKo+GRd3p9JsBn+sqh9ls9lfwjA8JyJ54Dgw2KuTAQ1wuVyuiMghVbUeanWaGhwEwa/ee6vzvKo+AmT6Ab8B3Bv7cz+wt4O4uY4/sToeHBy8EYbhcRE5r6rm8YEu+p2hLpfLo977u5xzp4FnAOtS+7qcfDu5VPVb59ydURQd7kPfCLXV4erq6q2bm5sPicgZ4BzwYBf4rnJaWVm5rQ/9/3VstzPxxsaGbReWoROAzd92Yd9qIKr6vnWupIH0od8JNrgNbOfcWCaTmVDV54EjwO2tnatTy0ypt5bZ6FzNj604YRiaZ88BFvrE81RDIoV+95BIDmBhq1arR+MJZaFv9rwuIpeTULdLwh56C/XusdgM7+C53fyqc+5dGxKdsr+L51Xgr66rT+KZc84m1ovxvhWo6jfAW8Vi8Wq3htFGPxa/X+257MWeWam9ZL+4SVyLl73LvTpVi96Wxf3WNnuC7cPlctnWHpvPrwFPAD8Dc4VCYc0WgF7wFr19p/uWmXzQanVxcTHnnDPRSRHZcM5dmpyc/D4NuFkvIidUdTDVje0As7Ozbnh4+ID33oaBF5HrhULhZhpwoh8aGjoYBMG4/YX5D8BcMmEDOwIbAAAAAElFTkSuQmCC);
371
+ mask-size: 100% 100%;
372
+ mask-repeat: no-repeat;
373
+ }
374
+ .right {
375
+ background: #99999a;
376
+ right: 55px;
377
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAA25JREFUSEuVls9rXFUUx7/fO3mDojAhZGFwIYgbFXUj4kJqpQqtC5dxHUiYRDCL7NRSWsG/IS/PB6Vr20ijNNL0h0mlPzQNRVyIyZgWF1FrWhV1kpl59ytH3pNxmJk73uXjfu/nnXO+95zLOI7fdM7VW63WNzMzM9skhcBK0/Qx7/1z3nuWSqWvJycnb4d0jOP4KMm6pKsjIyM3x8fHGyFQkiRPSzpEskzyi0qlshHSGegagCbJz7IsO1Mqlb6vVqvNfrA4jg3yFoBHSH7aarUWQzouLCz8mh+6Lum09/7y6Ojodr8/TJLkiKQTAJ4iedV7vxjSGagOoAzgDwDXASw659YqlUqtFyxJklcBfCDpBQC/AbgR0hnINj4IIAJwj+QVScskL0va7pbGJElelvQ+gAN5NoI6A90H8FAOMsf9AuCapCXn3JXh4eHbnZEZCMBxSQcBFC7tqzPQLoCH8/SZiAB+NDdJWsmybLUotCSajfOIrEYGtNVXZxs6QYXZMgC7JM0gZ9thtqEjonaD9tT1AhXiXUlrAM63uyqO4wMkjwN4pcc1+I+uXC7fDYG8RQbgJoAl7/3y9PT0nTRNX/LeHwNg7uu2/tFJ2iD5MclaCFQcYnfNDHJqaGhopdlsPumcew/AkUAXMUevkdwcBFQU2lx1kmRKcsR7/w6AN/qACt2OpDv/B3Sf5ElJHwKoAHh3QNDPAH4YBGQ/bV3jKwCnoig612g0nnDOHZX0eiB1f+YtKpg6C9/qcwvAJwCWd3Z2tsbGxl4keUzSaz1A/+pIngUQNIN1Det/5wFcLJfLmxMTE3sD2LvQrQC44L3/qVfqzJ73LBIbA5Iu7e/vfzc7O7sfuLA9db1a0N3czhecc5eiKKpZJEULmp+fP+icswvb2YK66ooW1N5U7Ztd0C+tJpJWG41GzSIpIF0iKmzcVVfUsHNMWOGv27S13O7t7W0V6WovepcxEdS1D76/cgsvkfw8iqJvLV3dXNUx+H4vWlQ/XTGPSpJuOefOZFl2sV6v1+bm5mzydl1xHB92zp2Q9KylmeRiSGegdQCt3MIftburD+iQc+5tSY9KOkfydEhnIJv9dZumURTd6JWuAmqmSNP0Ge/9YZIPAFgdRGfPrQl7QALYmJqa2gw9BA2UJMnjkp4H4ACsV6vVrZDubzHWkATwr3pxAAAAAElFTkSuQmCC);
378
+ mask-size: 100% 100%;
379
+ mask-repeat: no-repeat;
380
+ }
381
+ .right-menu {
382
+ box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
383
+ justify-content: center;
384
+ cursor: pointer;
385
+ width: 40px;
386
+ height: 100%;
387
+ position: absolute;
388
+ top: 0;
389
+ right: 0px;
390
+ display: flex;
391
+ align-items: center;
392
+ }
393
+ }
394
+ </style>