vue2-client 1.2.0 → 1.2.1

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 (120) hide show
  1. package/README.md +65 -65
  2. package/babel.config.js +1 -0
  3. package/docs/notice.md +24 -0
  4. package/index.js +28 -28
  5. package/package.json +1 -1
  6. package/src/App.vue +93 -93
  7. package/src/base-client/all.js +57 -57
  8. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +1159 -1159
  9. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  10. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +540 -540
  11. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  12. package/src/base-client/components/common/CustomColumnsDrawer/index.md +46 -46
  13. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +150 -150
  14. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  15. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  16. package/src/base-client/components/common/XAddForm/XAddForm.vue +323 -323
  17. package/src/base-client/components/common/XAddForm/index.md +60 -60
  18. package/src/base-client/components/common/XBadge/index.md +39 -39
  19. package/src/base-client/components/common/XCard/index.md +43 -43
  20. package/src/base-client/components/common/XForm/XForm.vue +275 -275
  21. package/src/base-client/components/common/XForm/XFormItem.vue +217 -217
  22. package/src/base-client/components/common/XForm/index.md +196 -196
  23. package/src/base-client/components/common/XFormCol/index.md +35 -35
  24. package/src/base-client/components/common/XFormTable/XFormTable.vue +405 -405
  25. package/src/base-client/components/common/XFormTable/index.md +89 -89
  26. package/src/base-client/components/common/XTable/XTable.vue +262 -262
  27. package/src/base-client/components/common/XTable/index.md +255 -255
  28. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +105 -105
  29. package/src/base-client/components/iot/CustomerDetailsView/CustomerDetailsView.vue +226 -226
  30. package/src/base-client/components/iot/CustomerDetailsView/index.md +41 -41
  31. package/src/base-client/components/iot/DataAnalysisUser/DataAnalysisUser.vue +127 -127
  32. package/src/base-client/components/iot/DataAnalysisViewGD/DataAnalysisViewGD.vue +548 -548
  33. package/src/base-client/components/iot/DeviceBrandDetailsView/DeviceBrandDetailsView.vue +453 -453
  34. package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +231 -231
  35. package/src/base-client/components/iot/DeviceDetailsView/index.md +43 -43
  36. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsCount.vue +330 -330
  37. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +57 -57
  38. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstruct.vue +122 -122
  39. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstructOperate.vue +122 -122
  40. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsMain.vue +225 -225
  41. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +135 -135
  42. package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +277 -277
  43. package/src/base-client/components/iot/InstructDetailsView/InstructDetailsView.vue +472 -472
  44. package/src/base-client/components/iot/InstructDetailsView/index.md +45 -45
  45. package/src/base-client/components/iot/LogDetailsView/LogDetailsView.vue +380 -380
  46. package/src/base-client/components/iot/LogDetailsView/index.md +43 -43
  47. package/src/base-client/components/iot/MeterDetailsView/MeterDetailsView.vue +360 -360
  48. package/src/base-client/components/iot/MeterDetailsView/index.md +43 -43
  49. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsCount.vue +335 -335
  50. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsException.vue +185 -185
  51. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsHandPlan.vue +292 -292
  52. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsInstruct.vue +237 -237
  53. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsMain.vue +257 -257
  54. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsSellGas.vue +190 -190
  55. package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +723 -723
  56. package/src/base-client/components/iot/WebmeterAnalysisView/index.md +48 -48
  57. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  58. package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
  59. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +248 -248
  60. package/src/base-client/components/ticket/EmployeeDetailsView/EmployeeDetailsView.vue +406 -406
  61. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +486 -486
  62. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +184 -184
  63. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +303 -303
  64. package/src/base-client/plugins/AppData.js +69 -69
  65. package/src/base-client/plugins/GetLoginInfoService.js +221 -221
  66. package/src/base-client/plugins/index.js +21 -21
  67. package/src/bootstrap.js +27 -27
  68. package/src/components/Ellipsis/Ellipsis.vue +64 -64
  69. package/src/components/Ellipsis/index.md +38 -38
  70. package/src/components/NumberInfo/index.md +43 -43
  71. package/src/components/STable/README.md +341 -341
  72. package/src/components/Trend/index.md +45 -45
  73. package/src/components/cache/AKeepAlive.js +172 -172
  74. package/src/components/checkbox/index.js +7 -7
  75. package/src/components/index.js +36 -36
  76. package/src/components/menu/menu.js +273 -273
  77. package/src/components/setting/Setting.vue +237 -237
  78. package/src/components/table/advance/AdvanceTable.vue +275 -275
  79. package/src/components/transition/PageToggleTransition.vue +97 -97
  80. package/src/layouts/CommonLayout.vue +42 -42
  81. package/src/layouts/PageLayout.vue +151 -151
  82. package/src/layouts/SinglePageView.vue +74 -74
  83. package/src/layouts/header/AdminHeader.vue +109 -109
  84. package/src/layouts/header/HeaderAvatar.vue +60 -60
  85. package/src/layouts/header/HeaderNotice.vue +97 -97
  86. package/src/layouts/tabs/TabsHead.vue +190 -190
  87. package/src/layouts/tabs/TabsView.vue +355 -355
  88. package/src/main.js +20 -20
  89. package/src/mock/goods/index.js +108 -108
  90. package/src/mock/index.js +12 -12
  91. package/src/mock/project/index.js +17 -17
  92. package/src/mock/user/current.js +13 -13
  93. package/src/mock/user/login.js +39 -39
  94. package/src/mock/workplace/index.js +15 -15
  95. package/src/pages/exception/403.vue +25 -25
  96. package/src/pages/exception/404.vue +25 -25
  97. package/src/pages/exception/500.vue +25 -25
  98. package/src/pages/login/Login.vue +194 -194
  99. package/src/pages/report/ReportTableHome.vue +28 -28
  100. package/src/pages/resourceManage/resourceManageMain.vue +55 -55
  101. package/src/pages/system/applyInstallView/Core.vue +570 -570
  102. package/src/pages/system/applyInstallView/index.vue +34 -34
  103. package/src/pages/system/dictionary/index.vue +41 -41
  104. package/src/pages/system/queryParams/index.vue +41 -41
  105. package/src/router/async/config.async.js +25 -25
  106. package/src/router/async/router.map.js +59 -59
  107. package/src/router/guards.js +104 -104
  108. package/src/router/index.js +27 -27
  109. package/src/services/api/common.js +39 -39
  110. package/src/services/api/restTools.js +23 -23
  111. package/src/services/dataSource.js +12 -12
  112. package/src/services/user.js +34 -34
  113. package/src/store/modules/setting.js +114 -114
  114. package/src/utils/i18n.js +80 -80
  115. package/src/utils/indexedDB.js +146 -146
  116. package/src/utils/request.js +197 -197
  117. package/src/utils/routerUtil.js +15 -2
  118. package/tests/unit/ReportTable.spec.js +15 -15
  119. package/vue.config.js +153 -153
  120. package/webpack.config.js +12 -12
@@ -1,97 +1,97 @@
1
- <template>
2
- <a-dropdown :trigger="['click']" v-model="show">
3
- <div slot="overlay">
4
- <a-spin :spinning="loading">
5
- <a-tabs class="dropdown-tabs" :tabBarStyle="{textAlign: 'center'}" :style="{width: '297px'}">
6
- <a-tab-pane tab="通知" key="1">
7
- <a-list>
8
- <a-list-item :key="item.id" class="tab-pane" v-for=" item in exception">
9
- <a-list-item-meta :title="'设备号'+ item.e_f_device_id" :description="item.e_f_error_msg" @click="read(item)">
10
- <a-avatar style="background-color: white" slot="avatar" src="https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png"/>
11
- </a-list-item-meta>
12
- </a-list-item>
13
- </a-list>
14
- </a-tab-pane>
15
- <a-tab-pane tab="消息" key="2">
16
- <a-list class="tab-pane"></a-list>
17
- </a-tab-pane>
18
- <a-tab-pane tab="待办" key="3">
19
- <a-list class="tab-pane"></a-list>
20
- </a-tab-pane>
21
- </a-tabs>
22
- </a-spin>
23
- </div>
24
- <span @click="fetchNotice" class="header-notice">
25
- <a-badge class="notice-badge" :count=" exception.length">
26
- <a-icon :class="['header-notice-icon']" type="bell" />
27
- </a-badge>
28
- </span>
29
- </a-dropdown>
30
- </template>
31
-
32
- <script>
33
- import { post } from '@vue2-client/services/api/restTools'
34
- export default {
35
- name: 'HeaderNotice',
36
- data () {
37
- return {
38
- loading: false,
39
- show: false,
40
- exception: []
41
- }
42
- },
43
- computed: {
44
- },
45
- created () {
46
- this.refresh()
47
- },
48
- methods: {
49
- read (item) {
50
- post('/webmeterapi/saveSingleTable', { data: { tablename: 't_iot_device_exception', param: { id: item.e_id, f_is_read: 1 } } }).then(res => {
51
- this.refresh()
52
- })
53
- },
54
- refresh () {
55
- post('/webmeterapi/commonQuery', { queryParamsName: 'deviceExceptionQueryParams', conditionParams: { e_f_is_read: 0 }, pageNo: 1, pageSize: 999999 }).then(res => {
56
- this.exception = res.data
57
- })
58
- },
59
- fetchNotice () {
60
- if (this.loading) {
61
- this.loading = false
62
- return
63
- }
64
- this.loadding = true
65
- setTimeout(() => {
66
- this.loadding = false
67
- }, 1000)
68
- }
69
- }
70
- }
71
- </script>
72
-
73
- <style lang="less">
74
- .header-notice{
75
- display: inline-block;
76
- transition: all 0.3s;
77
- span {
78
- vertical-align: initial;
79
- }
80
- .notice-badge{
81
- color: inherit;
82
- .header-notice-icon{
83
- font-size: 16px;
84
- padding: 4px;
85
- }
86
- }
87
- }
88
- .dropdown-tabs{
89
- background-color: @base-bg-color;
90
- box-shadow: 0 2px 8px @shadow-color;
91
- border-radius: 4px;
92
- .tab-pane{
93
- padding: 0 24px 12px;
94
- min-height: 250px;
95
- }
96
- }
97
- </style>
1
+ <template>
2
+ <a-dropdown :trigger="['click']" v-model="show">
3
+ <div slot="overlay">
4
+ <a-spin :spinning="loading">
5
+ <a-tabs class="dropdown-tabs" :tabBarStyle="{textAlign: 'center'}" :style="{width: '297px'}">
6
+ <a-tab-pane tab="通知" key="1">
7
+ <a-list>
8
+ <a-list-item :key="item.id" class="tab-pane" v-for=" item in exception">
9
+ <a-list-item-meta :title="'设备号'+ item.e_f_device_id" :description="item.e_f_error_msg" @click="read(item)">
10
+ <a-avatar style="background-color: white" slot="avatar" src="https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png"/>
11
+ </a-list-item-meta>
12
+ </a-list-item>
13
+ </a-list>
14
+ </a-tab-pane>
15
+ <a-tab-pane tab="消息" key="2">
16
+ <a-list class="tab-pane"></a-list>
17
+ </a-tab-pane>
18
+ <a-tab-pane tab="待办" key="3">
19
+ <a-list class="tab-pane"></a-list>
20
+ </a-tab-pane>
21
+ </a-tabs>
22
+ </a-spin>
23
+ </div>
24
+ <span @click="fetchNotice" class="header-notice">
25
+ <a-badge class="notice-badge" :count=" exception.length">
26
+ <a-icon :class="['header-notice-icon']" type="bell" />
27
+ </a-badge>
28
+ </span>
29
+ </a-dropdown>
30
+ </template>
31
+
32
+ <script>
33
+ import { post } from '@vue2-client/services/api/restTools'
34
+ export default {
35
+ name: 'HeaderNotice',
36
+ data () {
37
+ return {
38
+ loading: false,
39
+ show: false,
40
+ exception: []
41
+ }
42
+ },
43
+ computed: {
44
+ },
45
+ created () {
46
+ this.refresh()
47
+ },
48
+ methods: {
49
+ read (item) {
50
+ post('/webmeterapi/saveSingleTable', { data: { tablename: 't_iot_device_exception', param: { id: item.e_id, f_is_read: 1 } } }).then(res => {
51
+ this.refresh()
52
+ })
53
+ },
54
+ refresh () {
55
+ post('/webmeterapi/commonQuery', { queryParamsName: 'deviceExceptionQueryParams', conditionParams: { e_f_is_read: 0 }, pageNo: 1, pageSize: 999999 }).then(res => {
56
+ this.exception = res.data
57
+ })
58
+ },
59
+ fetchNotice () {
60
+ if (this.loading) {
61
+ this.loading = false
62
+ return
63
+ }
64
+ this.loadding = true
65
+ setTimeout(() => {
66
+ this.loadding = false
67
+ }, 1000)
68
+ }
69
+ }
70
+ }
71
+ </script>
72
+
73
+ <style lang="less">
74
+ .header-notice{
75
+ display: inline-block;
76
+ transition: all 0.3s;
77
+ span {
78
+ vertical-align: initial;
79
+ }
80
+ .notice-badge{
81
+ color: inherit;
82
+ .header-notice-icon{
83
+ font-size: 16px;
84
+ padding: 4px;
85
+ }
86
+ }
87
+ }
88
+ .dropdown-tabs{
89
+ background-color: @base-bg-color;
90
+ box-shadow: 0 2px 8px @shadow-color;
91
+ border-radius: 4px;
92
+ .tab-pane{
93
+ padding: 0 24px 12px;
94
+ min-height: 250px;
95
+ }
96
+ }
97
+ </style>
@@ -1,190 +1,190 @@
1
- <template>
2
- <div :class="['tabs-head', layout, pageWidth]">
3
- <a-tabs
4
- type="editable-card"
5
- :class="['tabs-container', layout, pageWidth, {'affixed' : affixed, 'fixed-header' : fixedHeader, 'collapsed' : adminLayout.collapsed}]"
6
- :active-key="active"
7
- :hide-add="true"
8
- >
9
- <a-tooltip placement="left" :title="lockTitle" slot="tabBarExtraContent">
10
- <a-icon
11
- theme="filled"
12
- @click="onLockClick"
13
- class="header-lock"
14
- :type="fixedTabs ? 'lock' : 'unlock'"
15
- />
16
- </a-tooltip>
17
- <a-tab-pane v-for="page in pageList" :key="page.path">
18
- <div slot="tab" class="tab" @contextmenu="e => onContextmenu(page.path, e)">
19
- <a-icon @click="onRefresh(page)" :class="['icon-sync', {'hide': page.path !== active && !page.loading}]" :type="page.loading ? 'loading' : 'sync'" />
20
- <div class="title" @click="onTabClick(page.path)" >{{ pageName(page) }}</div>
21
- <a-icon v-if="!page.unclose" @click="onClose(page.path)" class="icon-close" type="close"/>
22
- </div>
23
- </a-tab-pane>
24
- </a-tabs>
25
- <div v-if="affixed" class="virtual-tabs"></div>
26
- </div>
27
- </template>
28
-
29
- <script>
30
- import { mapState, mapMutations } from 'vuex'
31
- import { getI18nKey } from '@vue2-client/utils/routerUtil'
32
-
33
- export default {
34
- name: 'TabsHead',
35
- i18n: {
36
- messages: {
37
- CN: {
38
- lock: '点击锁定页签头',
39
- unlock: '点击解除锁定'
40
- },
41
- HK: {
42
- lock: '點擊鎖定頁簽頭',
43
- unlock: '點擊解除鎖定'
44
- },
45
- US: {
46
- lock: 'click to lock the tabs head',
47
- unlock: 'click to unlock'
48
- }
49
- }
50
- },
51
- props: {
52
- // eslint-disable-next-line vue/require-default-prop
53
- pageList: Array,
54
- // eslint-disable-next-line vue/require-default-prop
55
- active: String,
56
- fixed: Boolean
57
- },
58
- data () {
59
- return {
60
- affixed: false
61
- }
62
- },
63
- inject: ['adminLayout'],
64
- created () {
65
- this.affixed = this.fixedTabs
66
- },
67
- computed: {
68
- ...mapState('setting', ['layout', 'pageWidth', 'fixedHeader', 'fixedTabs', 'customTitles']),
69
- lockTitle () {
70
- return this.$t(this.fixedTabs ? 'unlock' : 'lock')
71
- }
72
- },
73
- methods: {
74
- ...mapMutations('setting', ['setFixedTabs']),
75
- onLockClick () {
76
- this.setFixedTabs(!this.fixedTabs)
77
- if (this.fixedTabs) {
78
- setTimeout(() => {
79
- this.affixed = true
80
- }, 200)
81
- } else {
82
- this.affixed = false
83
- }
84
- },
85
- onTabClick (key) {
86
- if (this.active !== key) {
87
- this.$emit('change', key)
88
- }
89
- },
90
- onClose (key) {
91
- this.$emit('close', key)
92
- },
93
- onRefresh (page) {
94
- this.$emit('refresh', page.path, page)
95
- },
96
- onContextmenu (pageKey, e) {
97
- this.$emit('contextmenu', pageKey, e)
98
- },
99
- pageName (page) {
100
- const pagePath = page.fullPath.split('?')[0]
101
- const custom = this.customTitles.find(item => item.path === pagePath)
102
- return (custom && custom.title) || page.title || this.$t(getI18nKey(page.keyPath))
103
- }
104
- }
105
- }
106
- </script>
107
-
108
- <style scoped lang="less">
109
- .tab{
110
- margin: 0 -16px;
111
- padding: 0 16px;
112
- font-size: 14px;
113
- user-select: none;
114
- transition: all 0.2s;
115
- .title{
116
- display: inline-block;
117
- height: 100%;
118
- }
119
- .icon-close{
120
- font-size: 12px;
121
- margin-left: 6px;
122
- margin-right: -4px !important;
123
- color: @text-color-second;
124
- &:hover{
125
- color: @text-color;
126
- }
127
- }
128
- .icon-sync{
129
- margin-left: -4px;
130
- color: @primary-4;
131
- transition: all 0.3s ease-in-out;
132
- &:hover{
133
- color: @primary-color;
134
- }
135
- font-size: 14px;
136
- &.hide{
137
- font-size: 0;
138
- }
139
- }
140
- }
141
- .tabs-head{
142
- margin: 0 auto;
143
- &.head.fixed{
144
- width: 1400px;
145
- }
146
- }
147
- .tabs-container{
148
- margin: -16px auto 8px;
149
- transition: top,left 0.2s;
150
- .header-lock{
151
- font-size: 18px;
152
- cursor: pointer;
153
- color: @primary-3;
154
- &:hover{
155
- color: @primary-color;
156
- }
157
- }
158
- &.affixed{
159
- margin: 0 auto;
160
- top: 0px;
161
- padding: 8px 24px 0;
162
- position: fixed;
163
- height: 48px;
164
- z-index: 1;
165
- background-color: @layout-body-background;
166
- &.side,&.mix{
167
- right: 0;
168
- left: 256px;
169
- &.collapsed{
170
- left: 80px;
171
- }
172
- }
173
- &.head{
174
- width: inherit;
175
- padding: 8px 0 0;
176
- &.fluid{
177
- left: 0;
178
- right: 0;
179
- padding: 8px 24px 0;
180
- }
181
- }
182
- &.fixed-header{
183
- top: 64px;
184
- }
185
- }
186
- }
187
- .virtual-tabs{
188
- height: 48px;
189
- }
190
- </style>
1
+ <template>
2
+ <div :class="['tabs-head', layout, pageWidth]">
3
+ <a-tabs
4
+ type="editable-card"
5
+ :class="['tabs-container', layout, pageWidth, {'affixed' : affixed, 'fixed-header' : fixedHeader, 'collapsed' : adminLayout.collapsed}]"
6
+ :active-key="active"
7
+ :hide-add="true"
8
+ >
9
+ <a-tooltip placement="left" :title="lockTitle" slot="tabBarExtraContent">
10
+ <a-icon
11
+ theme="filled"
12
+ @click="onLockClick"
13
+ class="header-lock"
14
+ :type="fixedTabs ? 'lock' : 'unlock'"
15
+ />
16
+ </a-tooltip>
17
+ <a-tab-pane v-for="page in pageList" :key="page.path">
18
+ <div slot="tab" class="tab" @contextmenu="e => onContextmenu(page.path, e)">
19
+ <a-icon @click="onRefresh(page)" :class="['icon-sync', {'hide': page.path !== active && !page.loading}]" :type="page.loading ? 'loading' : 'sync'" />
20
+ <div class="title" @click="onTabClick(page.path)" >{{ pageName(page) }}</div>
21
+ <a-icon v-if="!page.unclose" @click="onClose(page.path)" class="icon-close" type="close"/>
22
+ </div>
23
+ </a-tab-pane>
24
+ </a-tabs>
25
+ <div v-if="affixed" class="virtual-tabs"></div>
26
+ </div>
27
+ </template>
28
+
29
+ <script>
30
+ import { mapState, mapMutations } from 'vuex'
31
+ import { getI18nKey } from '@vue2-client/utils/routerUtil'
32
+
33
+ export default {
34
+ name: 'TabsHead',
35
+ i18n: {
36
+ messages: {
37
+ CN: {
38
+ lock: '点击锁定页签头',
39
+ unlock: '点击解除锁定'
40
+ },
41
+ HK: {
42
+ lock: '點擊鎖定頁簽頭',
43
+ unlock: '點擊解除鎖定'
44
+ },
45
+ US: {
46
+ lock: 'click to lock the tabs head',
47
+ unlock: 'click to unlock'
48
+ }
49
+ }
50
+ },
51
+ props: {
52
+ // eslint-disable-next-line vue/require-default-prop
53
+ pageList: Array,
54
+ // eslint-disable-next-line vue/require-default-prop
55
+ active: String,
56
+ fixed: Boolean
57
+ },
58
+ data () {
59
+ return {
60
+ affixed: false
61
+ }
62
+ },
63
+ inject: ['adminLayout'],
64
+ created () {
65
+ this.affixed = this.fixedTabs
66
+ },
67
+ computed: {
68
+ ...mapState('setting', ['layout', 'pageWidth', 'fixedHeader', 'fixedTabs', 'customTitles']),
69
+ lockTitle () {
70
+ return this.$t(this.fixedTabs ? 'unlock' : 'lock')
71
+ }
72
+ },
73
+ methods: {
74
+ ...mapMutations('setting', ['setFixedTabs']),
75
+ onLockClick () {
76
+ this.setFixedTabs(!this.fixedTabs)
77
+ if (this.fixedTabs) {
78
+ setTimeout(() => {
79
+ this.affixed = true
80
+ }, 200)
81
+ } else {
82
+ this.affixed = false
83
+ }
84
+ },
85
+ onTabClick (key) {
86
+ if (this.active !== key) {
87
+ this.$emit('change', key)
88
+ }
89
+ },
90
+ onClose (key) {
91
+ this.$emit('close', key)
92
+ },
93
+ onRefresh (page) {
94
+ this.$emit('refresh', page.path, page)
95
+ },
96
+ onContextmenu (pageKey, e) {
97
+ this.$emit('contextmenu', pageKey, e)
98
+ },
99
+ pageName (page) {
100
+ const pagePath = page.fullPath.split('?')[0]
101
+ const custom = this.customTitles.find(item => item.path === pagePath)
102
+ return (custom && custom.title) || page.title || this.$t(getI18nKey(page.keyPath))
103
+ }
104
+ }
105
+ }
106
+ </script>
107
+
108
+ <style scoped lang="less">
109
+ .tab{
110
+ margin: 0 -16px;
111
+ padding: 0 16px;
112
+ font-size: 14px;
113
+ user-select: none;
114
+ transition: all 0.2s;
115
+ .title{
116
+ display: inline-block;
117
+ height: 100%;
118
+ }
119
+ .icon-close{
120
+ font-size: 12px;
121
+ margin-left: 6px;
122
+ margin-right: -4px !important;
123
+ color: @text-color-second;
124
+ &:hover{
125
+ color: @text-color;
126
+ }
127
+ }
128
+ .icon-sync{
129
+ margin-left: -4px;
130
+ color: @primary-4;
131
+ transition: all 0.3s ease-in-out;
132
+ &:hover{
133
+ color: @primary-color;
134
+ }
135
+ font-size: 14px;
136
+ &.hide{
137
+ font-size: 0;
138
+ }
139
+ }
140
+ }
141
+ .tabs-head{
142
+ margin: 0 auto;
143
+ &.head.fixed{
144
+ width: 1400px;
145
+ }
146
+ }
147
+ .tabs-container{
148
+ margin: -16px auto 8px;
149
+ transition: top,left 0.2s;
150
+ .header-lock{
151
+ font-size: 18px;
152
+ cursor: pointer;
153
+ color: @primary-3;
154
+ &:hover{
155
+ color: @primary-color;
156
+ }
157
+ }
158
+ &.affixed{
159
+ margin: 0 auto;
160
+ top: 0px;
161
+ padding: 8px 24px 0;
162
+ position: fixed;
163
+ height: 48px;
164
+ z-index: 1;
165
+ background-color: @layout-body-background;
166
+ &.side,&.mix{
167
+ right: 0;
168
+ left: 256px;
169
+ &.collapsed{
170
+ left: 80px;
171
+ }
172
+ }
173
+ &.head{
174
+ width: inherit;
175
+ padding: 8px 0 0;
176
+ &.fluid{
177
+ left: 0;
178
+ right: 0;
179
+ padding: 8px 24px 0;
180
+ }
181
+ }
182
+ &.fixed-header{
183
+ top: 64px;
184
+ }
185
+ }
186
+ }
187
+ .virtual-tabs{
188
+ height: 48px;
189
+ }
190
+ </style>