bxs-tools-ui 3.3.2 → 3.4.0

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 (63) hide show
  1. package/es/add-and-take/index.js +1 -7969
  2. package/es/adjust-baoe/index.js +196 -8195
  3. package/es/index.css +1 -1
  4. package/es/index.js +8788 -43744
  5. package/es/insure-calculate/index.css +1 -1
  6. package/es/insure-calculate/index.js +1046 -36665
  7. package/es/person-info/index.css +1 -1
  8. package/es/person-info/index.js +83 -8042
  9. package/es/product-info/index.css +1 -1
  10. package/es/product-info/index.js +3005 -10614
  11. package/es/share-sheet/index.js +69 -8040
  12. package/es/utils/index.js +1250 -9334
  13. package/lib/add-and-take/index.js +4 -7973
  14. package/lib/adjust-baoe/index.js +195 -8195
  15. package/lib/index.css +1 -1
  16. package/lib/index.js +8717 -43678
  17. package/lib/insure-calculate/index.css +1 -1
  18. package/lib/insure-calculate/index.js +1034 -36662
  19. package/lib/person-info/index.css +1 -1
  20. package/lib/person-info/index.js +86 -8046
  21. package/lib/product-info/index.css +1 -1
  22. package/lib/product-info/index.js +2807 -10417
  23. package/lib/share-sheet/index.js +72 -8044
  24. package/lib/utils/index.js +1252 -9337
  25. package/package.json +5 -3
  26. package/packages/add-and-take/demo/index.vue +3 -6
  27. package/packages/adjust-baoe/index.vue +21 -34
  28. package/packages/adjust-baoe/readme.md +0 -1
  29. package/packages/bxs-utils/planbook/common.ts +5 -0
  30. package/packages/bxs-utils/planbook/insurance.ts +19 -0
  31. package/packages/bxs-utils/planbook/person.ts +3 -2
  32. package/packages/bxs-utils/planbook/product.ts +57 -164
  33. package/packages/bxs-utils/readme.md +3 -1
  34. package/packages/index.ts +1 -1
  35. package/packages/insure-calculate/demo/index.vue +1 -1
  36. package/packages/insure-calculate/index.vue +18 -17
  37. package/packages/person-info/demo/index.vue +2 -4
  38. package/packages/planbook-input/components/product-table.vue +3 -14
  39. package/packages/planbook-input/helper.js +16 -53
  40. package/packages/planbook-input/index.vue +20 -28
  41. package/packages/planbook-input/readme.md +3 -3
  42. package/packages/product-info/components/product-insurance-form.md +46 -0
  43. package/packages/product-info/components/product-insurance-form.vue +360 -0
  44. package/packages/product-info/demo/index.vue +4 -5
  45. package/packages/product-info/handler.js +307 -0
  46. package/packages/product-info/handler.md +26 -0
  47. package/packages/product-info/index.less +33 -0
  48. package/packages/product-info/index.vue +306 -534
  49. package/packages/product-info/readme.md +7 -2
  50. package/packages/share-sheet/constant.js +1 -2
  51. package/src/api/adjust-baoe.js +2 -2
  52. package/src/api/planbook.js +4 -20
  53. package/src/api/trade.js +31 -0
  54. package/src/components/common/common-group-title.less +54 -0
  55. package/src/components/common/common-group-title.md +34 -0
  56. package/src/components/common/common-group-title.vue +72 -0
  57. package/src/components/common/common-title.less +4 -0
  58. package/src/components/common/common-title.vue +8 -2
  59. package/src/components/profession-list/README.md +114 -0
  60. package/src/components/profession-list/constant.js +4 -0
  61. package/src/components/profession-list/handler.js +155 -0
  62. package/src/components/profession-list/index.less +182 -0
  63. package/src/components/profession-list/index.vue +443 -0
@@ -0,0 +1,182 @@
1
+ .bxt-profession {
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ height: 100%;
6
+ background: #fff;
7
+ overflow: hidden;
8
+
9
+ &-head {
10
+ flex-shrink: 0;
11
+ }
12
+
13
+ &-title {
14
+ position: relative;
15
+ box-sizing: border-box;
16
+ height: 45px;
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ padding: 0 15px;
21
+ border-bottom: 1px solid var(--bxt-line-split);
22
+
23
+ &-center {
24
+ font-size: 14px;
25
+ color: var(--bxt-text-primary);
26
+ letter-spacing: 0;
27
+ }
28
+ }
29
+
30
+ &-selected {
31
+ background-color: var(--bxt-bg-minor);
32
+ padding: 15px;
33
+
34
+ &-sel {
35
+ font-size: 13px;
36
+ color: var(--bxt-text-primary);
37
+ line-height: 16px;
38
+ }
39
+
40
+ &-text {
41
+ box-sizing: border-box;
42
+ font-size: 13px;
43
+ color: var(--bxt-text-primary);
44
+ line-height: 18px;
45
+ margin-top: 6px;
46
+ }
47
+ }
48
+
49
+ &-err {
50
+ font-size: 13px;
51
+ color: var(--bxt-type-danger);
52
+ line-height: 15px;
53
+ margin-top: 6px;
54
+ }
55
+
56
+ &-right {
57
+ font-size: 13px;
58
+ color: var(--bxt-type-primary);
59
+ line-height: 15px;
60
+ margin-top: 6px;
61
+ }
62
+
63
+ &-menu {
64
+ box-sizing: border-box;
65
+ position: relative;
66
+ width: 100%;
67
+ height: 45px;
68
+ padding: 0 15px;
69
+ margin: 0;
70
+ display: block;
71
+ overflow: hidden;
72
+ border-bottom: 1px solid var(--bxt-line-split);
73
+
74
+ &-item {
75
+ box-sizing: border-box;
76
+ float: left;
77
+ height: 45px;
78
+ min-width: 60px;
79
+ max-width: 33%;
80
+ line-height: 45px;
81
+ display: block;
82
+ padding: 0 7.5px;
83
+ color: var(--bxt-text-primary);
84
+ font-size: 14px;
85
+ text-align: center;
86
+ overflow: hidden;
87
+ text-overflow: ellipsis;
88
+ white-space: nowrap;
89
+
90
+ &.active {
91
+ position: relative;
92
+ color: var(--bxt-type-primary);
93
+
94
+ &::after {
95
+ content: '';
96
+ position: absolute;
97
+ bottom: 1px;
98
+ left: 50%;
99
+ transform: translateX(-50%);
100
+ width: 20px;
101
+ height: 4px;
102
+ background: var(--bxt-type-primary);
103
+ border-radius: 2px;
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ &-list {
110
+ flex: 1;
111
+ overflow-x: hidden;
112
+ overflow-y: auto;
113
+ -webkit-overflow-scrolling: touch;
114
+
115
+ &-li {
116
+ box-sizing: border-box;
117
+ position: relative;
118
+ display: flex;
119
+ justify-content: space-between;
120
+ align-items: center;
121
+ min-height: 45px;
122
+ padding: 14.5px 10px 13.5px 0;
123
+ margin-left: 15px;
124
+ font-size: 14px;
125
+ color: var(--bxt-text-primary);
126
+ line-height: 17px;
127
+ border-bottom: 1px solid var(--bxt-line-split);
128
+ }
129
+ }
130
+
131
+ &-highlight {
132
+ color: var(--bxt-type-primary);
133
+ }
134
+ }
135
+
136
+ .bxt-profession-search {
137
+ width: 100%;
138
+ height: 100%;
139
+ background: #fff;
140
+
141
+ &-bar {
142
+ position: relative;
143
+ z-index: 1;
144
+ }
145
+
146
+ &-content {
147
+ overflow-y: auto;
148
+ -webkit-overflow-scrolling: touch;
149
+ }
150
+
151
+ &-result {
152
+ height: 100%;
153
+ overflow-y: auto;
154
+ overflow-x: hidden;
155
+ -webkit-overflow-scrolling: touch;
156
+ }
157
+
158
+ &-item {
159
+ position: relative;
160
+ padding: 10px 15px;
161
+ background: #fff;
162
+ box-sizing: border-box;
163
+ border-bottom: 1px solid var(--bxt-line-split);
164
+ }
165
+
166
+ &-name {
167
+ font-size: 14px;
168
+ line-height: 20px;
169
+ color: var(--bxt-text-primary);
170
+ }
171
+
172
+ &-job-type {
173
+ margin-top: 6px;
174
+ font-size: 12px;
175
+ line-height: 12px;
176
+ color: var(--bxt-type-default);
177
+ }
178
+ }
179
+
180
+ .bxt-text-warn {
181
+ color: var(--bxt-type-warning);
182
+ }
@@ -0,0 +1,443 @@
1
+ <template>
2
+ <van-popup
3
+ v-model="visible"
4
+ position="right"
5
+ :style="{ width: '80%', height: '100%' }"
6
+ get-container="body"
7
+ :lock-scroll="true"
8
+ @opened="onOpened"
9
+ @closed="onClosed"
10
+ >
11
+ <div class="bxt-profession">
12
+ <div ref="professionHead" class="bxt-profession-head">
13
+ <div class="bxt-profession-title">
14
+ <van-icon name="arrow-left" size="24px" color="#ccc" @click="back" />
15
+ <span class="bxt-profession-title-center">职业类别</span>
16
+ <van-icon name="cross" size="24px" color="#ccc" @click="closeMe" />
17
+ </div>
18
+ <div @click="searchShow">
19
+ <van-search placeholder="请输入关键字" disabled background="#f2f2f2" />
20
+ </div>
21
+ <div class="bxt-profession-selected">
22
+ <div class="bxt-profession-selected-sel">已选:</div>
23
+ <div v-if="selected && selected.length" class="bxt-profession-selected-text">
24
+ {{ selectedStr }}
25
+ </div>
26
+ <div v-if="isLeafLevel && isComplaint" class="bxt-profession-right">类别:{{ professionType }}类(符合投保条件)</div>
27
+ <div v-if="isLeafLevel && !isComplaint" class="bxt-profession-err">类别:拒保{{ professionType }}类(不符合投保条件)</div>
28
+ </div>
29
+ <ul class="bxt-profession-menu">
30
+ <li
31
+ v-for="(menu, index) in menuList"
32
+ :key="'menu' + index"
33
+ class="bxt-profession-menu-item"
34
+ :class="{ active: index + 1 === menuList.length }"
35
+ @click="onClickMenu(index)"
36
+ >
37
+ {{ menu.des }}
38
+ </li>
39
+ </ul>
40
+ </div>
41
+
42
+ <div class="bxt-profession-list" :style="listStyle">
43
+ <ul v-if="professionObj && professionObj.length > 0">
44
+ <li
45
+ v-for="(item, index) in professionObj"
46
+ :key="item.id || item.code || index"
47
+ class="bxt-profession-list-li"
48
+ :class="{
49
+ 'bxt-profession-highlight':
50
+ selected && selected.length && selected[selected.length - 1].des !== undefined && selected[selected.length - 1].des === item.des
51
+ }"
52
+ @click="professionChoose(item)"
53
+ >
54
+ <span>{{ item.des }}</span>
55
+ <van-icon v-if="!item.code" name="arrow" size="18px" color="#ccc" />
56
+ </li>
57
+ </ul>
58
+ </div>
59
+
60
+ <van-popup
61
+ v-model="isShowSearch"
62
+ position="right"
63
+ :style="{ width: '100%', height: '100%' }"
64
+ get-container="body"
65
+ :lock-scroll="true"
66
+ @opened="enterSearchPage"
67
+ >
68
+ <div class="bxt-profession-search">
69
+ <div ref="professionSearchBar" class="bxt-profession-search-bar">
70
+ <van-search v-model="searchValue" placeholder="请输入关键字" show-action @search="search" @cancel="searchCancel" @clear="searchClear" />
71
+ </div>
72
+ <div class="bxt-profession-search-content" :style="searchListStyle">
73
+ <div v-if="searchs.length > 0" class="bxt-profession-search-result">
74
+ <div v-for="(item, index) in searchs" :key="item.code || index" class="bxt-profession-search-item" @click="searchAndChooseItem(item)">
75
+ <div class="bxt-profession-search-name">{{ item.name }}</div>
76
+ <div class="bxt-profession-search-job-type" :class="{ 'bxt-text-warn': !item.flag }">
77
+ {{ item.val }}类
78
+ {{ item.flag ? '(符合投保条件)' : '(不符合投保条件)' }}
79
+ </div>
80
+ </div>
81
+ </div>
82
+ <van-empty v-else description="暂无数据" />
83
+ </div>
84
+ </div>
85
+ </van-popup>
86
+ </div>
87
+ </van-popup>
88
+ </template>
89
+
90
+ <script>
91
+ import { Popup, Search, Icon, Empty, Toast } from 'vant'
92
+ import { getProfession } from '../../api'
93
+ import { PROFESSION_LEVEL_DIGIT, DEFAULT_MENU_LIST } from './constant'
94
+ import {
95
+ asyncColumnsParamsValidator,
96
+ formatColumn,
97
+ getAllNames,
98
+ treeTranArray,
99
+ findProfessionByCode,
100
+ buildSelectedStr,
101
+ buildMenuFromSelected,
102
+ hasProfessionCategory
103
+ } from './handler'
104
+ import './index.less'
105
+
106
+ export default {
107
+ name: 'BxtProfessionList',
108
+ components: {
109
+ [Popup.name]: Popup,
110
+ [Search.name]: Search,
111
+ [Icon.name]: Icon,
112
+ [Empty.name]: Empty
113
+ },
114
+ props: {
115
+ value: {
116
+ type: Boolean,
117
+ default: false
118
+ },
119
+ asyncColumnsParams: {
120
+ type: Object,
121
+ validator: asyncColumnsParamsValidator
122
+ },
123
+ childrenKeyName: {
124
+ type: String,
125
+ default: 'children'
126
+ },
127
+ columns: {
128
+ type: Array,
129
+ default: () => []
130
+ },
131
+ initialSelection: {
132
+ type: Object,
133
+ default: () => null
134
+ },
135
+ verifyProfess: {
136
+ type: Function,
137
+ default: () => true
138
+ },
139
+ readonly: {
140
+ type: Boolean,
141
+ default: false
142
+ }
143
+ },
144
+ data() {
145
+ return {
146
+ totalLevels: 1,
147
+ isLeafLevel: false,
148
+ isComplaint: false,
149
+ selected: [],
150
+ currSelect: {},
151
+ professionType: '',
152
+ professionObj: null,
153
+ isShowSearch: false,
154
+ searchValue: '',
155
+ searchs: [],
156
+ menuList: DEFAULT_MENU_LIST.slice(),
157
+ listStyle: null,
158
+ searchListStyle: null,
159
+ parentId: '',
160
+ professionList: []
161
+ }
162
+ },
163
+ computed: {
164
+ visible: {
165
+ get() {
166
+ return this.value
167
+ },
168
+ set(val) {
169
+ this.$emit('input', val)
170
+ }
171
+ },
172
+ selectedStr() {
173
+ return buildSelectedStr(this.selected, this.asyncColumns)
174
+ },
175
+ asyncColumns() {
176
+ return !!this.asyncColumnsParams
177
+ }
178
+ },
179
+ methods: {
180
+ getIsDev() {
181
+ if (this.asyncColumnsParams && (this.asyncColumnsParams.isDev === true || this.asyncColumnsParams.isDev === false)) {
182
+ return this.asyncColumnsParams.isDev
183
+ }
184
+ return undefined
185
+ },
186
+ fetchProfession() {
187
+ if (!asyncColumnsParamsValidator(this.asyncColumnsParams)) {
188
+ Toast('职业类别参数缺失')
189
+ return Promise.resolve([])
190
+ }
191
+ const urlParams = { ...this.asyncColumnsParams.urlParams }
192
+ const params = JSON.parse(JSON.stringify(this.asyncColumnsParams.postParams))
193
+ if (this.parentId && !this.searchValue) {
194
+ params.parentId = this.parentId
195
+ }
196
+ if (this.searchValue) {
197
+ params.searchKey = this.searchValue
198
+ }
199
+ return getProfession(urlParams, params, this.getIsDev())
200
+ .then(response => formatColumn((response && response.data) || []))
201
+ .catch(error => {
202
+ Toast('职业类别数据获取失败')
203
+ console.log('职业类别请求API报错:', error)
204
+ return []
205
+ })
206
+ },
207
+ calculateListStyle() {
208
+ this.$nextTick(() => {
209
+ if (this.$refs.professionHead) {
210
+ this.listStyle = {
211
+ height: `${window.innerHeight - this.$refs.professionHead.offsetHeight}px`
212
+ }
213
+ }
214
+ })
215
+ },
216
+ onClickMenu(idx) {
217
+ if (this.selected.length > idx) {
218
+ this.isLeafLevel = false
219
+ this.isComplaint = false
220
+ if (this.selected.length !== this.menuList.length) {
221
+ this.selected = this.selected.slice(0, idx + 1 - this.totalLevels)
222
+ } else {
223
+ this.selected = this.selected.slice(0, idx - this.totalLevels)
224
+ }
225
+ this.professionObj = this.selected.length > 0 ? this.selected[this.selected.length - 1][this.childrenKeyName] : this.professionList
226
+ }
227
+ },
228
+ professionChoose(val) {
229
+ this.currSelect = val
230
+ this.professionAddSelected(val)
231
+ if (!val.code) {
232
+ if (this.asyncColumns) {
233
+ this.parentId = val.id
234
+ this.fetchProfession().then(res => {
235
+ const children = res || []
236
+ this.$set(this.currSelect, this.childrenKeyName, children)
237
+ this.professionObj = children
238
+ })
239
+ } else {
240
+ this.professionObj = val[this.childrenKeyName]
241
+ }
242
+ } else if (this.verifyProfess(this.currSelect)) {
243
+ this.isLeafLevel = true
244
+ this.isComplaint = true
245
+ this.professionType = this.asyncColumns ? val.category : val.val
246
+ if (!this.readonly) {
247
+ this.$emit('select', this.selected[this.selected.length - 1])
248
+ this.closeMe()
249
+ }
250
+ } else {
251
+ this.isLeafLevel = true
252
+ this.isComplaint = false
253
+ this.professionType = this.asyncColumns ? val.category : val.val
254
+ }
255
+ },
256
+ professionAddSelected(val) {
257
+ if (this.asyncColumns) {
258
+ if (!this.selected.length) {
259
+ this.selected.push(val)
260
+ } else {
261
+ const lastItem = this.selected[this.selected.length - 1]
262
+ if (hasProfessionCategory(lastItem)) {
263
+ this.selected.pop()
264
+ this.selected.push(val)
265
+ } else {
266
+ this.selected.push(val)
267
+ }
268
+ }
269
+ return
270
+ }
271
+ if (
272
+ !this.selected.length ||
273
+ (this.selected.length < this.totalLevels &&
274
+ this.selected[this.selected.length - 1][this.childrenKeyName] &&
275
+ this.selected[this.selected.length - 1][this.childrenKeyName].some(item => item.des === val.des))
276
+ ) {
277
+ this.selected.push(val)
278
+ } else {
279
+ this.selected.pop()
280
+ this.selected.push(val)
281
+ }
282
+ },
283
+ back() {
284
+ this.isLeafLevel = false
285
+ if (this.selected && this.selected.length > 0) {
286
+ this.selected.pop()
287
+ this.professionObj = this.selected.length > 0 ? this.selected[this.selected.length - 1][this.childrenKeyName] : this.professionList
288
+ } else {
289
+ this.closeMe()
290
+ }
291
+ },
292
+ closeMe() {
293
+ this.visible = false
294
+ },
295
+ onOpened() {
296
+ if (this.asyncColumns) {
297
+ this.fetchProfession().then(res => {
298
+ this.professionList = res || []
299
+ this.totalLevels = 1
300
+ this.professionObj = this.professionList
301
+ })
302
+ } else {
303
+ this.professionList = this.columns || []
304
+ this.totalLevels = 1
305
+ let targetObj = this.professionList
306
+ while (targetObj[0] && targetObj[0][this.childrenKeyName] && typeof targetObj[0][this.childrenKeyName] === 'object') {
307
+ this.totalLevels += 1
308
+ if (targetObj[0] && targetObj[0][this.childrenKeyName]) {
309
+ targetObj = targetObj[0][this.childrenKeyName]
310
+ }
311
+ }
312
+ if (this.initialSelection && this.initPreProfession(this.initialSelection)) {
313
+ this.professionObj = this.selected[this.selected.length - 2][this.childrenKeyName]
314
+ } else {
315
+ this.professionObj = this.professionList
316
+ }
317
+ }
318
+ this.calculateListStyle()
319
+ },
320
+ onClosed() {
321
+ this.isLeafLevel = false
322
+ this.isComplaint = false
323
+ this.selected = []
324
+ this.professionType = ''
325
+ this.isShowSearch = false
326
+ this.searchClear()
327
+ this.menuList = DEFAULT_MENU_LIST.slice()
328
+ this.totalLevels = 1
329
+ this.professionObj = null
330
+ this.professionList = []
331
+ if (this.asyncColumns) {
332
+ this.parentId = ''
333
+ }
334
+ },
335
+ enterSearchPage() {
336
+ this.$nextTick(() => {
337
+ if (!this.searchListStyle && this.$refs.professionSearchBar) {
338
+ this.searchListStyle = {
339
+ height: `${window.innerHeight - this.$refs.professionSearchBar.offsetHeight}px`
340
+ }
341
+ }
342
+ })
343
+ },
344
+ searchShow() {
345
+ this.isShowSearch = true
346
+ },
347
+ search() {
348
+ if (this.asyncColumns) {
349
+ this.fetchProfession().then(res => {
350
+ this.searchs = []
351
+ const professionList = res || []
352
+ professionList.forEach(item => {
353
+ const temp = {
354
+ des: item.name,
355
+ code: item.code,
356
+ val: item.category,
357
+ category: item.category,
358
+ name: getAllNames(item, [])
359
+ .map(it => it.name)
360
+ .join('-'),
361
+ flag: this.verifyProfess({
362
+ des: item.name,
363
+ code: item.code,
364
+ val: item.category,
365
+ category: item.category
366
+ })
367
+ ? 1
368
+ : 0
369
+ }
370
+ this.searchs.push(temp)
371
+ })
372
+ })
373
+ } else {
374
+ this.searchs = []
375
+ const result = treeTranArray(this.professionList, '', [], this.childrenKeyName)
376
+ result.forEach(item => {
377
+ if (item.des.indexOf(this.searchValue) !== -1) {
378
+ const desArr = item.des.split('-')
379
+ const temp = {
380
+ des: desArr[desArr.length - 1],
381
+ code: item.code,
382
+ val: item.val,
383
+ name: item.des,
384
+ flag: this.verifyProfess({
385
+ des: desArr[desArr.length - 1],
386
+ code: item.code,
387
+ val: item.val
388
+ })
389
+ ? 1
390
+ : 0
391
+ }
392
+ this.searchs.push(temp)
393
+ }
394
+ })
395
+ }
396
+ },
397
+ searchCancel() {
398
+ this.isShowSearch = false
399
+ this.searchClear()
400
+ },
401
+ searchClear() {
402
+ this.searchs = []
403
+ this.searchValue = ''
404
+ },
405
+ searchAndChooseItem(params) {
406
+ const temp = { ...params }
407
+ if (params.flag) {
408
+ temp.val = parseFloat(params.val)
409
+ this.$emit('select', temp)
410
+ if (!this.readonly) {
411
+ this.closeMe()
412
+ this.searchCancel()
413
+ } else {
414
+ Toast('符合投保条件')
415
+ }
416
+ } else {
417
+ Toast('该职业不符合投保条件')
418
+ }
419
+ },
420
+ initPreProfession(profess) {
421
+ const result = findProfessionByCode(this.professionList, profess.code, profess.des, profess.val, this.childrenKeyName)
422
+ this.selected = result ? result.nodes : []
423
+ if (!this.selected.length) {
424
+ Toast('暂无该职业或职业类别有误')
425
+ return false
426
+ }
427
+ this.currSelect = this.selected[this.selected.length - 1]
428
+ this.isLeafLevel = true
429
+ this.professionType = this.currSelect.val
430
+ this.isComplaint = !!this.verifyProfess(this.currSelect)
431
+ return true
432
+ }
433
+ },
434
+ watch: {
435
+ selected(val) {
436
+ const { menuList, totalLevels } = buildMenuFromSelected(val, this.asyncColumns, this.totalLevels, PROFESSION_LEVEL_DIGIT)
437
+ this.menuList = menuList
438
+ this.totalLevels = totalLevels
439
+ this.calculateListStyle()
440
+ }
441
+ }
442
+ }
443
+ </script>