openatc-components 0.0.9 → 0.0.14

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 (38) hide show
  1. package/config/index.js +2 -2
  2. package/package/kisscomps/components/CommonKanban/CommonKanban.vue +15 -2
  3. package/package/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +10 -7
  4. package/package/kisscomps/components/IntersectionMap/crossDirection/utils.js +4 -3
  5. package/package/kisscomps/components/IntersectionMap/intersectionmap.vue +8 -3
  6. package/package/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +6 -1
  7. package/package/kisscomps/components/SchemeConfig/SchemeConfig.vue +23 -3
  8. package/package/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +4 -2
  9. package/package/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +4 -0
  10. package/package/kisscomps/components/SchemeConfig/manualControlModal/index.vue +11 -10
  11. package/package/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +5 -1
  12. package/package/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +11 -6
  13. package/package/kisscomps/index.js +10 -0
  14. package/package/kissui.min.js +1 -1
  15. package/package.json +3 -3
  16. package/src/kisscomps/components/CommonKanban/CommonKanban.vue +15 -2
  17. package/src/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +10 -7
  18. package/src/kisscomps/components/IntersectionMap/crossDirection/utils.js +4 -3
  19. package/src/kisscomps/components/IntersectionMap/intersectionmap.vue +8 -3
  20. package/src/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +6 -1
  21. package/src/kisscomps/components/SchemeConfig/SchemeConfig.vue +23 -3
  22. package/src/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +4 -2
  23. package/src/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +4 -0
  24. package/src/kisscomps/components/SchemeConfig/manualControlModal/index.vue +11 -10
  25. package/src/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +5 -1
  26. package/src/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +11 -6
  27. package/src/kisscomps/index.js +10 -0
  28. package/src/store/getters.js +2 -15
  29. package/src/store/index.js +2 -12
  30. package/src/store/modules/globalParam.js +13 -182
  31. package/src/views/intersection.vue +2 -1
  32. package/src/views/schemeconfig.vue +7 -1
  33. package/src/EdgeMgr/controller/globalParamsMgr.js +0 -75
  34. package/src/store/modules/app.js +0 -54
  35. package/src/store/modules/globalParamModel.js +0 -34
  36. package/src/store/modules/permissionRoutes.js +0 -50
  37. package/src/store/modules/saveAgent.js +0 -35
  38. package/src/store/modules/user.js +0 -133
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openatc-components",
3
- "version": "0.0.9",
3
+ "version": "0.0.14",
4
4
  "description": "A Vue.js project",
5
5
  "author": "openatc developer",
6
6
  "private": false,
@@ -94,6 +94,7 @@
94
94
  "shelljs": "^0.7.6",
95
95
  "style-loader": "^0.21.0",
96
96
  "stylus-loader": "^3.0.2",
97
+ "svg-sprite-loader": "3.5.2",
97
98
  "uglifyjs-webpack-plugin": "^1.1.1",
98
99
  "url-loader": "^0.5.8",
99
100
  "vue-jest": "^1.0.2",
@@ -103,8 +104,7 @@
103
104
  "webpack": "^3.6.0",
104
105
  "webpack-bundle-analyzer": "^2.9.0",
105
106
  "webpack-dev-server": "^2.9.1",
106
- "webpack-merge": "^4.1.0",
107
- "svg-sprite-loader": "3.5.2"
107
+ "webpack-merge": "^4.1.0"
108
108
  },
109
109
  "engines": {
110
110
  "node": ">= 6.0.0",
@@ -27,7 +27,12 @@
27
27
  <el-tooltip class="item" effect="dark" placement="left">
28
28
  <div slot="content">{{element.name}}</div>
29
29
  <div class="common-phase-description">
30
- <xdrdirselector Width="40px" Height="40px" :showlist="element.desc" :ISActiveMask="ISActiveMask" :MaskColor="MaskColor"></xdrdirselector>
30
+ <xdrdirselector Width="40px"
31
+ Height="40px"
32
+ :showlist="element.desc"
33
+ :ISActiveMask="ISActiveMask"
34
+ :MaskColor="MaskColor"
35
+ :roadDirection="roadDirection"></xdrdirselector>
31
36
  </div>
32
37
  </el-tooltip>
33
38
  </div>
@@ -46,7 +51,12 @@
46
51
  <div v-for="(side, index) in sidewalkPhaseData" :key="side.key + '-' + index">
47
52
  <PatternWalkSvg v-if="element.peddirection.includes(side.id)" :Data="side" Width="38" Height="40" />
48
53
  </div>
49
- <xdrdirselector Width="40px" Height="40px" :showlist="element.desc" :ISActiveMask="ISActiveMask" :MaskColor="MaskColor"></xdrdirselector>
54
+ <xdrdirselector Width="40px"
55
+ Height="40px"
56
+ :showlist="element.desc"
57
+ :ISActiveMask="ISActiveMask"
58
+ :MaskColor="MaskColor"
59
+ :roadDirection="roadDirection"></xdrdirselector>
50
60
  </div>
51
61
  </el-tooltip>
52
62
  </div>
@@ -94,6 +104,9 @@ export default {
94
104
  },
95
105
  sidewalkPhaseData: {
96
106
  type: Array
107
+ },
108
+ roadDirection: {
109
+ type: String
97
110
  }
98
111
  },
99
112
  methods: {
@@ -136,7 +136,7 @@ import RampSouthRoadsSvg from './baseImg/RampSouthSvg'
136
136
  import RampPhaseIconSvg from './phaseIcon/rampPhaseIconSvg'
137
137
  import PedSectionEWSvg from './baseImg/PedSectionEWSvg'
138
138
  import PedSectionSNSvg from './baseImg/PedSectionSNSvg'
139
- import { mapState } from 'vuex'
139
+ // import { mapState } from 'vuex'
140
140
  import LCrossRoadsSvg from './baseImg/leftroad/LCrossRoadsSvg'
141
141
  import LTShapeEastRoadsSvg from './baseImg/leftroad/LTShapeEastRoadsSvg'
142
142
  import LTShapeWestRoadsSvg from './baseImg/leftroad/LTShapeWestRoadsSvg.vue'
@@ -186,13 +186,16 @@ export default {
186
186
  isShowInterval: {
187
187
  type: Boolean,
188
188
  devault: true
189
+ },
190
+ roadDirection: {
191
+ type: String
189
192
  }
190
193
  },
191
- computed: {
192
- ...mapState({
193
- roadDirection: state => state.globalParam.roadDirection
194
- })
195
- },
194
+ // computed: {
195
+ // ...mapState({
196
+ // roadDirection: state => state.globalParam.roadDirection
197
+ // })
198
+ // },
196
199
  watch: {
197
200
  tempType: {
198
201
  handler: function (val) {
@@ -296,7 +299,7 @@ export default {
296
299
  init () {
297
300
  this.CrossDiagramMgr = new CrossDiagramMgr()
298
301
  this.getRoadDirection()
299
- this.PhaseDataModel = new PhaseDataModel()
302
+ this.PhaseDataModel = new PhaseDataModel(this.roadDirection)
300
303
  this.getIntersectionInfo() // 获取路口信息
301
304
  },
302
305
  comparePhaseStatus () {
@@ -10,15 +10,16 @@
10
10
  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11
11
  * See the Mulan PSL v2 for more details.
12
12
  **/
13
- import store from '../../../../store'
13
+ // import store from '../../../../store'
14
14
  export default class PhaseDataModel {
15
- constructor () {
15
+ constructor (roadDirection = 'right') {
16
16
  this.PhasePosMap = new Map()
17
17
  this.SidePosMap = new Map()
18
18
  this.RampMainPosMap = new Map() // 匝道主路坐标
19
19
  this.RampSidePosMap = new Map() // 匝道支路坐标
20
20
  this.BusMapMap = new Map() // 公交相位底图坐标
21
21
  this.BusPhaseMap = new Map() // 公交相位坐标
22
+ this.roadDirection = roadDirection
22
23
  this.Init()
23
24
  }
24
25
  Init () {
@@ -27,7 +28,7 @@ export default class PhaseDataModel {
27
28
  let rampJson = require('./posJson/rampPos.json')
28
29
  let busMapJson = require('./posJson/busPos.json').busMap
29
30
  let busPhaseJson = require('./posJson/busPos.json').busphases
30
- if (store.getters.roadDirection === 'left') {
31
+ if (this.roadDirection === 'left') {
31
32
  phaseJson = require('./posJson/phasePos.left.json').phaseList
32
33
  busMapJson = require('./posJson/busPos.left.json').busMap
33
34
  busPhaseJson = require('./posJson/busPos.left.json').busphases
@@ -11,7 +11,7 @@
11
11
  **/
12
12
  <template>
13
13
  <div class="intersection-map">
14
- <div class="crossDirection-display" :class="{
14
+ <div class="crossDirection-display openatc-intersection-base-map" :class="{
15
15
  'superlargeCrossImg': bodyDomWidth <= 1680 && bodyDomWidth > 1440,
16
16
  'largeCrossImg': bodyDomWidth <= 1440 && bodyDomWidth > 1280,
17
17
  'middleCrossImg': bodyDomWidth <= 1280 && bodyDomWidth > 960,
@@ -27,7 +27,8 @@
27
27
  :crossStatusData="crossStatusData"
28
28
  :agentId="agentId"
29
29
  :isShowInterval="isShowInterval"
30
- :devStatus="devStatus" />
30
+ :devStatus="devStatus"
31
+ :roadDirection="roadDirection" />
31
32
  </div>
32
33
  </div>
33
34
  </template>
@@ -36,7 +37,7 @@
36
37
  import CrossDiagram from './crossDirection/crossDiagram'
37
38
  import { setToken } from '../../../utils/auth.js'
38
39
  export default {
39
- name: 'intersection-map',
40
+ name: 'intersection-base-map',
40
41
  components: {
41
42
  CrossDiagram
42
43
  },
@@ -75,6 +76,10 @@ export default {
75
76
  handler: function (val) {
76
77
  this.setPropsToken(val)
77
78
  }
79
+ },
80
+ roadDirection: {
81
+ type: String,
82
+ default: 'right'
78
83
  }
79
84
  },
80
85
  watch: {
@@ -17,7 +17,8 @@
17
17
  :crossStatusData="crossStatusData"
18
18
  :devStatus="devStatus"
19
19
  :agentId="agentId"
20
- :graphicMode="true" />
20
+ :graphicMode="true"
21
+ :roadDirection="roadDirection" />
21
22
  </div>
22
23
  </template>
23
24
  <script>
@@ -51,6 +52,10 @@ export default {
51
52
  Token: {
52
53
  type: String,
53
54
  default: ''
55
+ },
56
+ roadDirection: {
57
+ type: String,
58
+ default: 'right'
54
59
  }
55
60
  },
56
61
  watch: {
@@ -10,7 +10,7 @@
10
10
  * See the Mulan PSL v2 for more details.
11
11
  **/
12
12
  <template>
13
- <div class="scheme-config" style="height: 100%;">
13
+ <div class="scheme-config openatc-scheme-config" style="height: 100%;">
14
14
  <fault-detail-modal ref="faultDetail" :agentId="agentId" @refreshFault="getFaultById"></fault-detail-modal>
15
15
  <div style="height: 100%;">
16
16
  <transition name="fade-right" mode="out-in"
@@ -27,6 +27,8 @@
27
27
  :currentStage="currentStage"
28
28
  :preselectStages="preselectStages"
29
29
  :realtimeStatusModalvisible="realtimeStatusModalvisible"
30
+ :funcSort="funcSort"
31
+ :roadDirection="roadDirection"
30
32
  @closeManualModal="closeManualModal"
31
33
  @selectModel="selectModel"
32
34
  @selectStages="selectStages"
@@ -44,6 +46,7 @@
44
46
  :closePhaseRings="phaseRings"
45
47
  :sidewalkPhaseData="sidewalkPhaseData"
46
48
  :realtimeStatusModalvisible="realtimeStatusModalvisible"
49
+ :roadDirection="roadDirection"
47
50
  @closePhaseBack="closePhaseBack"
48
51
  @closePhaseControl= "closePhaseControl" />
49
52
  <LockingPhaseControlModal
@@ -52,6 +55,7 @@
52
55
  :closePhaseRings="phaseRings"
53
56
  :sidewalkPhaseData="sidewalkPhaseData"
54
57
  :realtimeStatusModalvisible="realtimeStatusModalvisible"
58
+ :roadDirection="roadDirection"
55
59
  @closePhaseBack="closePhaseBack"
56
60
  @closePhaseControl= "closePhaseControl" />
57
61
  </div>
@@ -78,6 +82,7 @@
78
82
  :agentId="agentId"
79
83
  :stagesList="stagesList"
80
84
  :sidewalkPhaseData="sidewalkPhaseData"
85
+ :roadDirection="roadDirection"
81
86
  @changeStatus="changeStatus"
82
87
  @showFaultDetail="showFaultDetail"/>
83
88
  </div>
@@ -88,7 +93,7 @@
88
93
 
89
94
  <script>
90
95
  import { putTscControl } from '../../../api/control.js'
91
- import { uploadSingleTscParam } from '../../../api/param'
96
+ import { uploadSingleTscParam } from '../../../api/param.js'
92
97
  import RealtimeStatusModal from './realtimeStatusModal'
93
98
  import ManualControlModal from './manualControlModal'
94
99
  import ClosePhaseControlModal from './closePhaselControlModal'
@@ -141,6 +146,14 @@ export default {
141
146
  Token: {
142
147
  type: String,
143
148
  default: ''
149
+ },
150
+ funcSort: {
151
+ type: String,
152
+ default: 'allFunc'
153
+ },
154
+ roadDirection: {
155
+ type: String,
156
+ default: 'right'
144
157
  }
145
158
  },
146
159
  data () {
@@ -272,10 +285,17 @@ export default {
272
285
  handler: function (val) {
273
286
  this.setPropsToken(val)
274
287
  }
288
+ },
289
+ roadDirection: {
290
+ handler: function (val) {
291
+ if (val === 'left' || val === 'right') {
292
+ this.PhaseDataModel = new PhaseDataModel(val)
293
+ }
294
+ }
275
295
  }
276
296
  },
277
297
  created () {
278
- this.PhaseDataModel = new PhaseDataModel()
298
+ this.PhaseDataModel = new PhaseDataModel(this.roadDirection)
279
299
  this.CrossDiagramMgr = new CrossDiagramMgr()
280
300
  if (this.realtimeStatusModalvisible === false) {
281
301
  this.changeStatus()
@@ -42,6 +42,7 @@
42
42
  :header-text="$t('openatccomponents.pattern.ring') + ring.num"
43
43
  :Draggable="false"
44
44
  :sidewalkPhaseData="sidewalkPhaseData"
45
+ :roadDirection="roadDirection"
45
46
  @handleSort="handleSort">
46
47
  <template v-slot:kanbantitle>
47
48
  <div class="col-title" v-text="$t('openatccomponents.overview.closemode')"></div>
@@ -110,10 +111,11 @@ export default {
110
111
  },
111
112
  sidewalkPhaseData: {
112
113
  type: Array
114
+ },
115
+ roadDirection: {
116
+ type: String
113
117
  }
114
118
  },
115
- computed: {
116
- },
117
119
  data () {
118
120
  return {
119
121
  visible: this.Visible,
@@ -58,6 +58,7 @@
58
58
  :header-text="$t('openatccomponents.pattern.ring') + ring.num"
59
59
  :Draggable="false"
60
60
  :sidewalkPhaseData="sidewalkPhaseData"
61
+ :roadDirection="roadDirection"
61
62
  @handleSort="handleSort">
62
63
  <template v-slot:kanbantitle>
63
64
  <div class="col-title" v-text="$t('openatccomponents.overview.closemode')"></div>
@@ -126,6 +127,9 @@ export default {
126
127
  },
127
128
  sidewalkPhaseData: {
128
129
  type: Array
130
+ },
131
+ roadDirection: {
132
+ type: String
129
133
  }
130
134
  },
131
135
  data () {
@@ -44,7 +44,7 @@
44
44
  <div class="single-model"
45
45
  @click="selectModel(item.id)"
46
46
  :class="(preselectModel == item.id && preselectStages == -1)? 'single-model-select' : ''"
47
- v-if="FuncSort === 'allFunc' || (FuncSort === 'basicFunc'&& basicFuncControlId.indexOf(item.id) !== -1)">
47
+ v-if="funcSort === 'allFunc' || (funcSort === 'basicFunc'&& basicFuncControlId.indexOf(item.id) !== -1)">
48
48
  <svg-icon :icon-class="item.iconClass" className="model-icon"></svg-icon>
49
49
  <div class="single-model-name">{{$t('openatccomponents.overview.modelList' + item.id)}}</div>
50
50
  </div>
@@ -54,7 +54,7 @@
54
54
  <div style="width: 100%; height: auto;overflow: hidden;">
55
55
  <div class="control-model" v-for="(item, index) in stagesList" :key="index">
56
56
  <div class="single-model" @click="selectStages(index + 1)" :class="preselectStages == index + 1 ? 'single-model-select' : ''">
57
- <xdrdirselector Width="40px" Height="40px" :showlist="item"></xdrdirselector>
57
+ <xdrdirselector Width="40px" Height="40px" :showlist="item" :roadDirection="roadDirection"></xdrdirselector>
58
58
  <div style="display:flex;flex-direction:row;justify-content:center;align-items:center;">
59
59
  <div class="current-stage-num" style="width:20%;">{{index + 1}}</div>
60
60
  <div style="width:70%;">
@@ -67,8 +67,8 @@
67
67
  </div>
68
68
  </div>
69
69
  </div>
70
- <div class="stage-label" v-if="FuncSort === 'allFunc'">{{$t('openatccomponents.overview.specialcontrol')}}:</div>
71
- <div style="width: 100%; height: auto;overflow: hidden;" v-if="FuncSort === 'allFunc'">
70
+ <div class="stage-label" v-if="funcSort === 'allFunc'">{{$t('openatccomponents.overview.specialcontrol')}}:</div>
71
+ <div style="width: 100%; height: auto;overflow: hidden;" v-if="funcSort === 'allFunc'">
72
72
  <div class="control-model" v-for="(item, index) in specialcontrolList" :key="index">
73
73
  <div class="single-model" @click="selectSpecialStages(item.id)">
74
74
  <svg-icon :icon-class="item.iconClass" className="closephase-icon"></svg-icon>
@@ -89,7 +89,6 @@
89
89
 
90
90
  <script>
91
91
  import xdrdirselector from '../../XRDDirSelector/XRDDirSelector'
92
- import { mapState } from 'vuex'
93
92
  export default {
94
93
  name: 'manualControl',
95
94
  components: {
@@ -126,13 +125,15 @@ export default {
126
125
  realtimeStatusModalvisible: {
127
126
  type: Boolean,
128
127
  default: true
128
+ },
129
+ funcSort: {
130
+ type: String,
131
+ default: 'allFunc'
132
+ },
133
+ roadDirection: {
134
+ type: String
129
135
  }
130
136
  },
131
- computed: {
132
- ...mapState({
133
- FuncSort: state => state.globalParam.FuncSort
134
- })
135
- },
136
137
  data () {
137
138
  return {
138
139
  basicFuncControlId: [0, 1, 4, 5], // 基础功能包含的控制方式: 自主控制(手动下)、黄闪、步进、定周期
@@ -161,7 +161,7 @@
161
161
  :Width="'44'"
162
162
  :Height="'44'"
163
163
  />
164
- <xdrdirselector Width="40PX" Height="40PX" :showlist="item"></xdrdirselector>
164
+ <xdrdirselector Width="40PX" Height="40PX" :showlist="item" :roadDirection="roadDirection"></xdrdirselector>
165
165
  <div
166
166
  style="display:flex;flex-direction:row;justify-content:center;align-items:center;"
167
167
  >
@@ -274,7 +274,11 @@ export default {
274
274
  },
275
275
  untreatedFault: {
276
276
  type: Array
277
+ },
278
+ roadDirection: {
279
+ type: String
277
280
  }
281
+
278
282
  },
279
283
  data () {
280
284
  return {
@@ -306,7 +306,7 @@
306
306
  </svg>
307
307
  </template>
308
308
  <script>
309
- import { mapState } from 'vuex'
309
+ // import { mapState } from 'vuex'
310
310
  export default {
311
311
  name: 'xdr-dir-selector',
312
312
  props: {
@@ -344,13 +344,18 @@ export default {
344
344
  MaskColor: {
345
345
  type: String,
346
346
  default: '#0096ba'
347
+ },
348
+ roadDirection: {
349
+ type: String,
350
+ default: 'right'
347
351
  }
352
+
348
353
  },
349
- computed: {
350
- ...mapState({
351
- roadDirection: state => state.globalParam.roadDirection
352
- })
353
- },
354
+ // computed: {
355
+ // ...mapState({
356
+ // roadDirection: state => state.globalParam.roadDirection
357
+ // })
358
+ // },
354
359
  data () {
355
360
  return {
356
361
  maskmark: false,
@@ -25,6 +25,7 @@ const language = {
25
25
  zh
26
26
  }
27
27
 
28
+ const requireAll = requireContext => requireContext.keys().map(requireContext)
28
29
  const install = function (Vue) {
29
30
  if (install.installed) return
30
31
  Vue.use(VTooltip)
@@ -32,6 +33,15 @@ const install = function (Vue) {
32
33
  Object.keys(components).forEach(key => {
33
34
  Vue.component(components[key].name, components[key])
34
35
  })
36
+
37
+ const req = require.context('../icons/svg', false, /\.svg$/)
38
+ requireAll(req)
39
+
40
+ const urlMgr = require('../lib/publicjs/HttpurlMgr')
41
+ if (urlMgr.HttpUrlMgr.urlMap === undefined) {
42
+ let data = require('../../static/apiconfig.json')
43
+ urlMgr.HttpUrlMgr.init(data)
44
+ }
35
45
  }
36
46
 
37
47
  if (typeof window !== 'undefined' && window.Vue) {
@@ -10,20 +10,7 @@
10
10
  * See the Mulan PSL v2 for more details.
11
11
  **/
12
12
  const getters = {
13
- sidebar: state => state.app.sidebar,
14
- device: state => state.app.device,
15
- token: state => state.user.token,
16
- avatar: state => state.user.avatar,
17
- name: state => state.user.name,
18
- roles: state => state.user.roles,
19
- Agent: state => state.Agent.agentid,
20
- controlmode: state => state.Agent.controlmode,
21
- globalParam: state => state.globalParam,
22
- tscParam: state => state.globalParam.tscParam,
23
- curPath: state => state.globalParam.curPath,
24
- globalParamModel: state => state.globalParamModel.GlobalParamModeObject,
25
- devParams: state => state.globalParamModel.devParams,
26
- permissionRoutes: state => state.permissionRoutes.routers,
27
- roadDirection: state => state.globalParam.roadDirection
13
+ // globalParam: state => state.globalParam,
14
+ // roadDirection: state => state.globalParam.roadDirection
28
15
  }
29
16
  export default getters
@@ -11,24 +11,14 @@
11
11
  **/
12
12
  import Vue from 'vue'
13
13
  import Vuex from 'vuex'
14
- import app from './modules/app'
15
- import user from './modules/user'
16
14
  import getters from './getters'
17
- import agent from './modules/saveAgent'
18
- import globalParam from './modules/globalParam'
19
- import globalParamModel from './modules/globalParamModel'
20
- import permissionRoutes from './modules/permissionRoutes'
15
+ // import globalParam from './modules/globalParam'
21
16
 
22
17
  Vue.use(Vuex)
23
18
 
24
19
  const store = new Vuex.Store({
25
20
  modules: {
26
- app,
27
- user,
28
- agent,
29
- globalParam,
30
- globalParamModel,
31
- permissionRoutes
21
+ // globalParam
32
22
  },
33
23
  getters
34
24
  })