@tongfun/tf-widget 0.1.20 → 0.1.21

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 -46
  2. package/lib/tf-widget.common.js +460 -416
  3. package/lib/tf-widget.css +1 -1
  4. package/lib/tf-widget.umd.js +460 -416
  5. package/lib/tf-widget.umd.min.js +3 -3
  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 -382
  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 -120
  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 +160 -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,382 +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
- this.$emit('setCache', cacheArr)
116
- obj.cacheArr = cacheArr
117
- }
118
- if (obj.defaultRoute) {
119
- if (!this.checkMenu(obj.path)) this.tagList.unshift(obj)
120
- } else {
121
- if (!this.checkMenu(obj.path)) this.tagList.push(obj)
122
- }
123
- // todo: 增加页面缓存
124
- this.activePath = path
125
- }
126
- },
127
- deep: true,
128
- immediate: true
129
- }
130
- },
131
- created () {
132
- window.addEventListener('click', () => {
133
- this.showRightMenu = false
134
- }, false)
135
- },
136
- methods: {
137
- changeMenuState () {
138
- this.closeMenu = !this.closeMenu
139
- this.$emit('changeMenuState', this.closeMenu)
140
- },
141
- /**
142
- * @description tag右键点击事件
143
- */
144
- rightClick: function (tagItem, $event) {
145
- this.routeJump(tagItem)
146
- this.$nextTick(() => {
147
- this.rightMenuTop = $event.clientY
148
- this.rightMenuLeft = $event.clientX
149
- this.showRightMenu = true
150
- })
151
- },
152
-
153
- /**
154
- * @member
155
- * @description 右侧操作
156
- * @param params: 操作指令: closeLeft => 关闭左侧, closeRight => 关闭右侧, closeAll => 关闭全部,
157
- */
158
- dropdownCommand: function (params) {
159
- const activeNum = this.tagList.findIndex(
160
- (item) => item.path === this.activePath
161
- )
162
- const pathMap = new Map()
163
- const deleteArr = []
164
- const pathArr = this.tagList.map((item) => {
165
- pathMap.set(item.path, item)
166
- return item.path
167
- })
168
- switch (params) {
169
- case 'closeLeft':
170
- deleteArr.push(...pathArr.slice(0, activeNum))
171
- break
172
- case 'closeRight':
173
- deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
174
- break
175
- case 'closeOther':
176
- deleteArr.push(...pathArr.slice(0, activeNum))
177
- deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
178
- break
179
- default:
180
- deleteArr.push(...pathArr)
181
- break
182
- }
183
- const deleteCacheArr = []
184
- deleteArr.forEach((item) => {
185
- const tagItem = pathMap.get(item)
186
- if (tagItem && tagItem.cacheArr) deleteCacheArr.push(tagItem.cacheArr)
187
- if (tagItem && !tagItem.notCloseTag) {
188
- const num = this.tagList.indexOf(tagItem)
189
- this.tagList.splice(num, 1)
190
- }
191
- })
192
-
193
- this.$emit('deleteCache', deleteCacheArr)
194
- if (params === 'closeAll') this.routeJump(this.tagList[0])
195
- },
196
- /**
197
- * @description 左右滑动
198
- * @param direction: 滑动方向
199
- */
200
- handleScroll (direction) {
201
- let rollNum = 0
202
- rollNum = direction === 'right' ? rollNum + 50 : rollNum - 50
203
- const dom = this.$refs.labelMenu
204
- dom.scrollLeft += rollNum
205
- },
206
- /**
207
- * @description 点击tag标签
208
- * @param path: 每项Tag
209
- */
210
- checkMenu (path) {
211
- if (this.tagList.find((item) => item.path === path)) return true
212
- return false
213
- },
214
- /**
215
- * @description 路由跳转
216
- */
217
- routeJump: function (value) {
218
- if (value && value.path !== this.activePath) {
219
- const { path, query, params, replace } = value
220
- if (replace) {
221
- this.$router.replace({
222
- path,
223
- query,
224
- params
225
- })
226
- } else {
227
- this.$router.push({
228
- path,
229
- query,
230
- params
231
- })
232
- }
233
- }
234
- },
235
- /**
236
- * 关闭tag
237
- */
238
- closeTag: function (tagItem) {
239
- if (tagItem.cacheArr) this.$emit('deleteCache', [tagItem.cacheArr])
240
- const num = this.tagList.indexOf(tagItem)
241
- if (tagItem) {
242
- this.tagList.splice(num, 1)
243
- this.routeJump(this.tagList[num - 1])
244
- }
245
- }
246
- }
247
- }
248
- </script>
249
- <style lang="less" scoped>
250
- .tf-labelbar {
251
- width: 100%;
252
- height: 40px;
253
- position: relative;
254
- box-sizing: border-box;
255
- padding: 0 73px;
256
- .close-menu {
257
- cursor: pointer;
258
- position: absolute;
259
- left:0;
260
- height: 40px;
261
- width: 40px;
262
- display: flex;
263
- align-items: center;
264
- justify-content: center;
265
- box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
266
- .close-menu-icon {
267
- height: 15px;
268
- width: 15px;
269
- background: #99999a;
270
- 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==);
271
- &:hover {
272
- background: #07579a;
273
- }
274
- }
275
- .open-menu-icon {
276
- height: 15px;
277
- width: 15px;
278
- background: #99999a;
279
- 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=);
280
- &:hover {
281
- background: #07579a;
282
- }
283
- }
284
- }
285
-
286
- ul {
287
- height: 100%;
288
- width: 100%;
289
- padding: 0;
290
- margin: 0;
291
- display: flex;
292
- align-items: flex-end;
293
- justify-content: left;
294
- list-style: none;
295
- overflow-y: hidden;
296
- overflow-x: auto;
297
- &::-webkit-scrollbar {
298
- display: none;
299
- height:0;
300
- }
301
- li {
302
- padding: 0 30px;
303
- font-size: 14px;
304
- color: #515a6e;
305
- height: 35px;
306
- margin: 10px -19px 0 0;
307
- cursor: pointer;
308
- display: flex;
309
- white-space: nowrap;
310
- align-items: center;
311
- justify-content: center;
312
- box-sizing: content-box;
313
- mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAAAkBAMAAAAdqzmBAAAAMFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlTPQ5AAAAD3RSTlMAr3DvEM8wgCBA379gj5//tJBPAAAAnUlEQVRIx2NgAAM27fj/tAO/xBsYkIHyf9qCT8iWMf6nNQhAsk2f5rYheY7Dnua2/U+A28ZEe8v+F9Ax2v7/F4DbxkUH2wzgtvHTwbYPo7aN2jZq26hto7aN2jZq25Cy7Qvctnw62PYNbls9HWz7S8/G6//PsI6H4396gAUQy1je08W2jxDbpv6nD4gB2uWp+J9eYPsEhv/0BPS1DQBvoBLVZ3BppgAAAABJRU5ErkJggg==);
314
- mask-repeat: no-repeat;
315
- mask-size: 95% 100%;
316
- transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
317
- .close-icon {
318
- transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
319
- margin-left: 8px;
320
- width: 0;
321
- overflow: hidden;
322
- &:hover {
323
- border-radius: 50%;
324
- background: #666666;
325
- color: white;
326
- }
327
- }
328
- &:hover {
329
- background: #dee1e6;
330
- .close-icon {
331
- width: 14px;
332
- }
333
- }
334
- }
335
- .active-tag {
336
- padding: 0 20px !important;
337
- color: #0361A4 !important;
338
- background: #ECF5FF !important;
339
- .close-icon {
340
- min-width: 14px;
341
- }
342
- }
343
- }
344
- .scrollbar-icon {
345
- cursor: pointer;
346
- width: 13px;
347
- height: 13px;
348
- position: absolute;
349
- top: 50%;
350
- transform: translateY(-50%);
351
- &:hover {
352
- background: #07579a;
353
- }
354
- }
355
- .left {
356
- background: #99999a;
357
- left: 55px;
358
- 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);
359
- mask-size: 100% 100%;
360
- mask-repeat: no-repeat;
361
- }
362
- .right {
363
- background: #99999a;
364
- right: 55px;
365
- 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);
366
- mask-size: 100% 100%;
367
- mask-repeat: no-repeat;
368
- }
369
- .right-menu {
370
- box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
371
- justify-content: center;
372
- cursor: pointer;
373
- width: 40px;
374
- height: 100%;
375
- position: absolute;
376
- top: 0;
377
- right: 0px;
378
- display: flex;
379
- align-items: center;
380
- }
381
- }
382
- </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>