vue2-client 1.18.46 → 1.18.47

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/.eslintrc.js +84 -84
  2. package/Components.md +60 -60
  3. package/assets/c__Users_QXLL_AppData_Roaming_Cursor_User_workspaceStorage_4fb3d7e3441d32bc6f2c7358b4188b48_images_e8c132e6dde513250d7f9721712df1f8-f1522a08-1aa0-4866-b4e5-b34cf2e21109.png +0 -0
  4. package/docs/HChart/351/205/215/347/275/256/346/226/207/346/241/243.md +960 -0
  5. package/docs/index.md +30 -30
  6. package/index.js +31 -31
  7. package/jest-transform-stub.js +8 -8
  8. package/jest.setup.js +7 -7
  9. package/package.json +1 -1
  10. package/src/assets/img/querySlotDemo.svg +15 -15
  11. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  12. package/src/base-client/components/common/CitySelect/index.js +3 -3
  13. package/src/base-client/components/common/CitySelect/index.md +109 -109
  14. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  15. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  16. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  17. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  18. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  19. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  20. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  21. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  22. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  23. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  24. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  25. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  26. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  27. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  28. package/src/base-client/components/common/Tree/index.js +2 -2
  29. package/src/base-client/components/common/Upload/index.js +3 -3
  30. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  31. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  32. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  33. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  34. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  35. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  36. package/src/base-client/components/common/XDescriptions/index.md +322 -322
  37. package/src/base-client/components/common/XForm/index.md +178 -178
  38. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  39. package/src/base-client/components/common/XStepView/index.js +3 -3
  40. package/src/base-client/components/common/XStepView/index.md +31 -31
  41. package/src/base-client/components/common/XTab/XTab.vue +31 -0
  42. package/src/base-client/components/common/XTable/XTable.vue +1715 -1715
  43. package/src/base-client/components/common/XTable/XTableWrapper.vue +786 -786
  44. package/src/base-client/components/common/XTable/index.md +255 -255
  45. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +2 -1
  46. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  47. package/src/base-client/plugins/Config.js +19 -19
  48. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  49. package/src/components/Charts/Bar.vue +62 -62
  50. package/src/components/Charts/ChartCard.vue +134 -134
  51. package/src/components/Charts/Liquid.vue +67 -67
  52. package/src/components/Charts/MiniArea.vue +39 -39
  53. package/src/components/Charts/MiniBar.vue +39 -39
  54. package/src/components/Charts/MiniProgress.vue +75 -75
  55. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  56. package/src/components/Charts/Radar.vue +68 -68
  57. package/src/components/Charts/RankList.vue +77 -77
  58. package/src/components/Charts/TagCloud.vue +113 -113
  59. package/src/components/Charts/TransferBar.vue +64 -64
  60. package/src/components/Charts/Trend.vue +82 -82
  61. package/src/components/Charts/chart.less +12 -12
  62. package/src/components/Charts/smooth.area.less +13 -13
  63. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  64. package/src/components/NumberInfo/index.js +3 -3
  65. package/src/components/NumberInfo/index.less +54 -54
  66. package/src/components/NumberInfo/index.md +43 -43
  67. package/src/components/card/ChartCard.vue +79 -79
  68. package/src/components/chart/Bar.vue +60 -60
  69. package/src/components/chart/MiniArea.vue +67 -67
  70. package/src/components/chart/MiniBar.vue +59 -59
  71. package/src/components/chart/MiniProgress.vue +57 -57
  72. package/src/components/chart/Radar.vue +80 -80
  73. package/src/components/chart/RankingList.vue +60 -60
  74. package/src/components/chart/Trend.vue +79 -79
  75. package/src/components/chart/index.less +9 -9
  76. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  77. package/src/components/input/IInput.vue +66 -66
  78. package/src/components/menu/SideMenu.vue +75 -75
  79. package/src/components/menu/menu.js +273 -273
  80. package/src/components/tool/AStepItem.vue +60 -60
  81. package/src/layouts/CommonLayout.vue +56 -56
  82. package/src/layouts/header/HeaderNotice.vue +177 -177
  83. package/src/lib.js +1 -1
  84. package/src/mock/extend/index.js +84 -84
  85. package/src/mock/goods/index.js +108 -108
  86. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  87. package/src/pages/system/dictionary/index.vue +44 -44
  88. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  89. package/src/pages/system/monitor/operLog/index.vue +37 -37
  90. package/src/services/api/cas.js +79 -79
  91. package/src/store/modules/setting.js +119 -119
  92. package/src/utils/authority-utils.js +85 -85
  93. package/src/utils/errorCode.js +6 -6
  94. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,232 +1,232 @@
1
- <template>
2
- <a-drawer
3
- title="字典详情"
4
- placement="right"
5
- :width="isMobile ? screenWidth : screenWidth * 0.85"
6
- :visible="visible"
7
- @close="onClose"
8
- >
9
- <a-spin :spinning="loadDetails">
10
- <a-page-header
11
- :title="'字典名称:' + details.f_name"
12
- >
13
- <div class="row">
14
- <div class="content">
15
- <a-descriptions size="small" :column="isMobile ? 1 : 2">
16
- <a-descriptions-item label="字典编号">{{ details.id }}</a-descriptions-item>
17
- <a-descriptions-item label="字典键">{{ details.f_key }}</a-descriptions-item>
18
- <a-descriptions-item label="备注">{{ details.f_remark }}</a-descriptions-item>
19
- <a-descriptions-item label="创建时间">{{ format(details.f_input_date) }}</a-descriptions-item>
20
- </a-descriptions>
21
- </div>
22
- <div class="extra">
23
- <a-row class="status-list">
24
- <a-col :xs="12" :sm="24">
25
- </a-col>
26
- </a-row>
27
- </div>
28
- </div>
29
- <!-- actions -->
30
- <template #extra>
31
- <a-button-group style="margin-right: 4px;">
32
- <a-button type="dashed" @click="initView" :loading="loadDetails">刷新</a-button>
33
- </a-button-group>
34
- </template>
35
- <template slot="footer">
36
- <a-tabs :default-active-key="tabActiveKey" :activeKey="tabActiveKey" @change="handleTabChange" style="margin-bottom: 23px;">
37
- <template v-for="value in tabList">
38
- <a-tab-pane :key="value.key" :tab="value.tab"/>
39
- </template>
40
- </a-tabs>
41
- <div v-if="!loadDetails">
42
- <template v-if="tabActiveKey === '1'">
43
- <x-form-table
44
- title="字典数据配置"
45
- :fixed-add-form="fixedAddForm"
46
- :fixed-query-form="fixedQueryForm"
47
- serviceName="af-system"
48
- queryParamsName="crud_dictionary_value_manage"
49
- @afterSubmit="afterSubmit"
50
- >
51
- </x-form-table>
52
- </template>
53
- </div>
54
- </template>
55
- </a-page-header>
56
- </a-spin>
57
- </a-drawer>
58
- </template>
59
-
60
- <script>
61
- import { DictionaryDetailsViewApi, post } from '@vue2-client/services/api'
62
- import { mapState } from 'vuex'
63
- import { formatDate } from '@vue2-client/utils/util'
64
- import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
65
-
66
- export default {
67
- name: 'DictionaryDetailsView',
68
- components: {
69
- XFormTable
70
- },
71
- data () {
72
- return {
73
- // 页面宽度
74
- screenWidth: document.documentElement.clientWidth,
75
- // Tab页签
76
- tabActiveKey: '1',
77
- // 字典详情
78
- details: {
79
- id: 0,
80
- f_name: '',
81
- f_key: '',
82
- f_remark: '',
83
- f_input_date: '',
84
- f_state: 0
85
- },
86
- tabList: [
87
- { key: '1', tab: '字典数据' }
88
- ],
89
- // 固定新增数据
90
- fixedAddForm: {},
91
- // 固定查询数据
92
- fixedQueryForm: {},
93
- // 详情加载
94
- loadDetails: true
95
- }
96
- },
97
- mounted () {
98
- this.initView()
99
- },
100
- computed: {
101
- ...mapState('account', { currUser: 'user' }),
102
- ...mapState('setting', ['isMobile'])
103
- },
104
- props: {
105
- id: {
106
- type: String,
107
- required: true
108
- },
109
- visible: {
110
- type: Boolean,
111
- default: false
112
- }
113
- },
114
- methods: {
115
- // 初始化组件
116
- initView () {
117
- this.tabActiveKey = '1'
118
- this.fixedQueryForm.v_f_dictionary_id = this.id
119
- this.fixedAddForm.v_f_dictionary_id = this.id
120
- this.getDetails(this.id)
121
- },
122
- onClose () {
123
- this.$emit('update:visible', false)
124
- },
125
- // 获取详情信息
126
- getDetails (userId) {
127
- this.loadDetails = true
128
- return post(DictionaryDetailsViewApi.getDictionaryDetails, {
129
- id: userId
130
- })
131
- .then(res => {
132
- this.details = res
133
- this.loadDetails = false
134
- }, err => {
135
- this.loadDetails = false
136
- console.error(err)
137
- })
138
- },
139
- // Tab切换
140
- handleTabChange (key) {
141
- this.tabActiveKey = key
142
- },
143
- // 日期格式化
144
- format (date, format) {
145
- return formatDate(date, format)
146
- },
147
- afterSubmit () {
148
- this.$appdata.load()
149
- }
150
- },
151
- watch: {
152
- 'visible' (val) {
153
- if (val) {
154
- this.initView()
155
- }
156
- }
157
- }
158
- }
159
- </script>
160
-
161
- <style lang="less" scoped>
162
- .business {
163
- color: #ffffff;
164
- }
165
- .business:enabled:hover {
166
- background-color: #85CE61 !important;
167
- border-color: #85CE61 !important;
168
- }
169
- .business:enabled {
170
- background-color: #67c23a;
171
- border-color: #67c23a;
172
- }
173
- .business:disabled {
174
- color: rgba(0, 0, 0, 0.25);
175
- }
176
- .detail-layout {
177
- margin-left: 44px;
178
- }
179
- .text {
180
- color: rgba(0, 0, 0, .45);
181
- }
182
-
183
- .heading {
184
- color: rgba(0, 0, 0, .85);
185
- font-size: 20px;
186
- }
187
-
188
- .no-data {
189
- color: rgba(0, 0, 0, .25);
190
- text-align: center;
191
- line-height: 64px;
192
- font-size: 16px;
193
-
194
- i {
195
- font-size: 24px;
196
- margin-right: 16px;
197
- position: relative;
198
- top: 3px;
199
- }
200
- }
201
-
202
- .mobile {
203
- .detail-layout {
204
- margin-left: unset;
205
- }
206
- .text {
207
-
208
- }
209
- .status-list {
210
- text-align: left;
211
- }
212
- }
213
-
214
- .row {
215
- display: flex;
216
-
217
- .content {
218
- -webkit-box-flex: 1;
219
- flex: auto;
220
- -ms-flex: auto;
221
- }
222
-
223
- .extra {
224
- flex: 0 1 auto;
225
- -webkit-box-flex: 0;
226
- -ms-flex: 0 1 auto;
227
- min-width: 242px;
228
- margin-left: 88px;
229
- text-align: right;
230
- }
231
- }
232
- </style>
1
+ <template>
2
+ <a-drawer
3
+ title="字典详情"
4
+ placement="right"
5
+ :width="isMobile ? screenWidth : screenWidth * 0.85"
6
+ :visible="visible"
7
+ @close="onClose"
8
+ >
9
+ <a-spin :spinning="loadDetails">
10
+ <a-page-header
11
+ :title="'字典名称:' + details.f_name"
12
+ >
13
+ <div class="row">
14
+ <div class="content">
15
+ <a-descriptions size="small" :column="isMobile ? 1 : 2">
16
+ <a-descriptions-item label="字典编号">{{ details.id }}</a-descriptions-item>
17
+ <a-descriptions-item label="字典键">{{ details.f_key }}</a-descriptions-item>
18
+ <a-descriptions-item label="备注">{{ details.f_remark }}</a-descriptions-item>
19
+ <a-descriptions-item label="创建时间">{{ format(details.f_input_date) }}</a-descriptions-item>
20
+ </a-descriptions>
21
+ </div>
22
+ <div class="extra">
23
+ <a-row class="status-list">
24
+ <a-col :xs="12" :sm="24">
25
+ </a-col>
26
+ </a-row>
27
+ </div>
28
+ </div>
29
+ <!-- actions -->
30
+ <template #extra>
31
+ <a-button-group style="margin-right: 4px;">
32
+ <a-button type="dashed" @click="initView" :loading="loadDetails">刷新</a-button>
33
+ </a-button-group>
34
+ </template>
35
+ <template slot="footer">
36
+ <a-tabs :default-active-key="tabActiveKey" :activeKey="tabActiveKey" @change="handleTabChange" style="margin-bottom: 23px;">
37
+ <template v-for="value in tabList">
38
+ <a-tab-pane :key="value.key" :tab="value.tab"/>
39
+ </template>
40
+ </a-tabs>
41
+ <div v-if="!loadDetails">
42
+ <template v-if="tabActiveKey === '1'">
43
+ <x-form-table
44
+ title="字典数据配置"
45
+ :fixed-add-form="fixedAddForm"
46
+ :fixed-query-form="fixedQueryForm"
47
+ serviceName="af-system"
48
+ queryParamsName="crud_dictionary_value_manage"
49
+ @afterSubmit="afterSubmit"
50
+ >
51
+ </x-form-table>
52
+ </template>
53
+ </div>
54
+ </template>
55
+ </a-page-header>
56
+ </a-spin>
57
+ </a-drawer>
58
+ </template>
59
+
60
+ <script>
61
+ import { DictionaryDetailsViewApi, post } from '@vue2-client/services/api'
62
+ import { mapState } from 'vuex'
63
+ import { formatDate } from '@vue2-client/utils/util'
64
+ import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
65
+
66
+ export default {
67
+ name: 'DictionaryDetailsView',
68
+ components: {
69
+ XFormTable
70
+ },
71
+ data () {
72
+ return {
73
+ // 页面宽度
74
+ screenWidth: document.documentElement.clientWidth,
75
+ // Tab页签
76
+ tabActiveKey: '1',
77
+ // 字典详情
78
+ details: {
79
+ id: 0,
80
+ f_name: '',
81
+ f_key: '',
82
+ f_remark: '',
83
+ f_input_date: '',
84
+ f_state: 0
85
+ },
86
+ tabList: [
87
+ { key: '1', tab: '字典数据' }
88
+ ],
89
+ // 固定新增数据
90
+ fixedAddForm: {},
91
+ // 固定查询数据
92
+ fixedQueryForm: {},
93
+ // 详情加载
94
+ loadDetails: true
95
+ }
96
+ },
97
+ mounted () {
98
+ this.initView()
99
+ },
100
+ computed: {
101
+ ...mapState('account', { currUser: 'user' }),
102
+ ...mapState('setting', ['isMobile'])
103
+ },
104
+ props: {
105
+ id: {
106
+ type: String,
107
+ required: true
108
+ },
109
+ visible: {
110
+ type: Boolean,
111
+ default: false
112
+ }
113
+ },
114
+ methods: {
115
+ // 初始化组件
116
+ initView () {
117
+ this.tabActiveKey = '1'
118
+ this.fixedQueryForm.v_f_dictionary_id = this.id
119
+ this.fixedAddForm.v_f_dictionary_id = this.id
120
+ this.getDetails(this.id)
121
+ },
122
+ onClose () {
123
+ this.$emit('update:visible', false)
124
+ },
125
+ // 获取详情信息
126
+ getDetails (userId) {
127
+ this.loadDetails = true
128
+ return post(DictionaryDetailsViewApi.getDictionaryDetails, {
129
+ id: userId
130
+ })
131
+ .then(res => {
132
+ this.details = res
133
+ this.loadDetails = false
134
+ }, err => {
135
+ this.loadDetails = false
136
+ console.error(err)
137
+ })
138
+ },
139
+ // Tab切换
140
+ handleTabChange (key) {
141
+ this.tabActiveKey = key
142
+ },
143
+ // 日期格式化
144
+ format (date, format) {
145
+ return formatDate(date, format)
146
+ },
147
+ afterSubmit () {
148
+ this.$appdata.load()
149
+ }
150
+ },
151
+ watch: {
152
+ 'visible' (val) {
153
+ if (val) {
154
+ this.initView()
155
+ }
156
+ }
157
+ }
158
+ }
159
+ </script>
160
+
161
+ <style lang="less" scoped>
162
+ .business {
163
+ color: #ffffff;
164
+ }
165
+ .business:enabled:hover {
166
+ background-color: #85CE61 !important;
167
+ border-color: #85CE61 !important;
168
+ }
169
+ .business:enabled {
170
+ background-color: #67c23a;
171
+ border-color: #67c23a;
172
+ }
173
+ .business:disabled {
174
+ color: rgba(0, 0, 0, 0.25);
175
+ }
176
+ .detail-layout {
177
+ margin-left: 44px;
178
+ }
179
+ .text {
180
+ color: rgba(0, 0, 0, .45);
181
+ }
182
+
183
+ .heading {
184
+ color: rgba(0, 0, 0, .85);
185
+ font-size: 20px;
186
+ }
187
+
188
+ .no-data {
189
+ color: rgba(0, 0, 0, .25);
190
+ text-align: center;
191
+ line-height: 64px;
192
+ font-size: 16px;
193
+
194
+ i {
195
+ font-size: 24px;
196
+ margin-right: 16px;
197
+ position: relative;
198
+ top: 3px;
199
+ }
200
+ }
201
+
202
+ .mobile {
203
+ .detail-layout {
204
+ margin-left: unset;
205
+ }
206
+ .text {
207
+
208
+ }
209
+ .status-list {
210
+ text-align: left;
211
+ }
212
+ }
213
+
214
+ .row {
215
+ display: flex;
216
+
217
+ .content {
218
+ -webkit-box-flex: 1;
219
+ flex: auto;
220
+ -ms-flex: auto;
221
+ }
222
+
223
+ .extra {
224
+ flex: 0 1 auto;
225
+ -webkit-box-flex: 0;
226
+ -ms-flex: 0 1 auto;
227
+ min-width: 242px;
228
+ margin-left: 88px;
229
+ text-align: right;
230
+ }
231
+ }
232
+ </style>
@@ -1,19 +1,19 @@
1
- const asyncReady = async function (vm, name) {
2
- // 获取配置信息
3
- try {
4
- const res = await vm.$resetget('/rs/vue/' + name + '.json', { resolveMsg: null, rejectMsg: null })
5
- Object.assign(vm.config, res)
6
- } catch (error) {
7
- // 忽略704,文件找不到异常
8
- if (error.status !== 704) {
9
- throw error
10
- }
11
- }
12
- }
13
- export default {
14
- install (Vue) {
15
- Vue.getConfig = Vue.prototype.$getConfig = function (vm, name) {
16
- return asyncReady(vm, name)
17
- }
18
- }
19
- }
1
+ const asyncReady = async function (vm, name) {
2
+ // 获取配置信息
3
+ try {
4
+ const res = await vm.$resetget('/rs/vue/' + name + '.json', { resolveMsg: null, rejectMsg: null })
5
+ Object.assign(vm.config, res)
6
+ } catch (error) {
7
+ // 忽略704,文件找不到异常
8
+ if (error.status !== 704) {
9
+ throw error
10
+ }
11
+ }
12
+ }
13
+ export default {
14
+ install (Vue) {
15
+ Vue.getConfig = Vue.prototype.$getConfig = function (vm, name) {
16
+ return asyncReady(vm, name)
17
+ }
18
+ }
19
+ }
@@ -1,39 +1,39 @@
1
- const TabsPagePlugin = {
2
- install (Vue) {
3
- Vue.mixin({
4
- methods: {
5
- $closePage (closeRoute, nextRoute) {
6
- const event = new CustomEvent('page:close', { detail: { closeRoute, nextRoute } })
7
- window.dispatchEvent(event)
8
- },
9
- $refreshPage (route) {
10
- const path = typeof route === 'object' ? route.path : route
11
- const event = new CustomEvent('page:refresh', { detail: { pageKey: path } })
12
- window.dispatchEvent(event)
13
- },
14
- $openPage (route, title) {
15
- this.$setPageTitle(route, title)
16
- this.$router.push(route)
17
- },
18
- $setPageTitle (route, title) {
19
- if (title) {
20
- // let path = typeof route === 'object' ? route.path : route
21
- // path = path && path.split('?')[0]
22
- const path = typeof route === 'object' ? this.$router.resolve(route).route.fullPath : route
23
- this.$store.commit('setting/setCustomTitle', { path, title })
24
- }
25
- }
26
- },
27
- computed: {
28
- customTitle () {
29
- const customTitles = this.$store.state.setting.customTitles
30
- // const path = this.$route.path.split('?')[0]
31
- const custom = customTitles.find(item => item.path === this.$route.fullPath)
32
- return custom && custom.title
33
- }
34
- }
35
- })
36
- }
37
- }
38
-
39
- export default TabsPagePlugin
1
+ const TabsPagePlugin = {
2
+ install (Vue) {
3
+ Vue.mixin({
4
+ methods: {
5
+ $closePage (closeRoute, nextRoute) {
6
+ const event = new CustomEvent('page:close', { detail: { closeRoute, nextRoute } })
7
+ window.dispatchEvent(event)
8
+ },
9
+ $refreshPage (route) {
10
+ const path = typeof route === 'object' ? route.path : route
11
+ const event = new CustomEvent('page:refresh', { detail: { pageKey: path } })
12
+ window.dispatchEvent(event)
13
+ },
14
+ $openPage (route, title) {
15
+ this.$setPageTitle(route, title)
16
+ this.$router.push(route)
17
+ },
18
+ $setPageTitle (route, title) {
19
+ if (title) {
20
+ // let path = typeof route === 'object' ? route.path : route
21
+ // path = path && path.split('?')[0]
22
+ const path = typeof route === 'object' ? this.$router.resolve(route).route.fullPath : route
23
+ this.$store.commit('setting/setCustomTitle', { path, title })
24
+ }
25
+ }
26
+ },
27
+ computed: {
28
+ customTitle () {
29
+ const customTitles = this.$store.state.setting.customTitles
30
+ // const path = this.$route.path.split('?')[0]
31
+ const custom = customTitles.find(item => item.path === this.$route.fullPath)
32
+ return custom && custom.title
33
+ }
34
+ }
35
+ })
36
+ }
37
+ }
38
+
39
+ export default TabsPagePlugin