hbte-saas-ui 0.0.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 (137) hide show
  1. package/.browserslistrc +3 -0
  2. package/.editorconfig +7 -0
  3. package/.env.development +1 -0
  4. package/.env.lib +1 -0
  5. package/.eslintrc.js +14 -0
  6. package/.prettierrc +3 -0
  7. package/README.md +53 -0
  8. package/babel.config.js +3 -0
  9. package/docs/.vuepress/config.js +23 -0
  10. package/docs/.vuepress/styles/index.styl +4 -0
  11. package/docs/AdvQuery.md +26 -0
  12. package/docs/CustomQuery.md +21 -0
  13. package/docs/EditArea.md +16 -0
  14. package/docs/FilterDrop.md +29 -0
  15. package/docs/FullTable.md +68 -0
  16. package/docs/Pagination.md +22 -0
  17. package/docs/QueryForm.md +27 -0
  18. package/docs/README.md +17 -0
  19. package/docs/Table.md +58 -0
  20. package/docs/ToolGroup.md +32 -0
  21. package/examples/App.vue +97 -0
  22. package/examples/image/hb-image-viewer/3k.jpg +0 -0
  23. package/examples/image/hb-image-viewer/a.jpg +0 -0
  24. package/examples/image/hb-image-viewer/b.jpg +0 -0
  25. package/examples/main.js +39 -0
  26. package/examples/mock/authority.js +1108 -0
  27. package/examples/mock/dept.js +4001 -0
  28. package/examples/mock/fulltable.js +407 -0
  29. package/examples/mock/organizeData.js +18965 -0
  30. package/examples/router/index.js +111 -0
  31. package/examples/views/ElementCpTest.vue +299 -0
  32. package/examples/views/Fragment.vue +196 -0
  33. package/examples/views/HBAdvQuery.vue +150 -0
  34. package/examples/views/HBAuthority.vue +339 -0
  35. package/examples/views/HBDialog.vue +39 -0
  36. package/examples/views/HBEditarea.vue +350 -0
  37. package/examples/views/HBFilterDrop.vue +72 -0
  38. package/examples/views/HBFloatFooter.vue +42 -0
  39. package/examples/views/HBFullTable.vue +751 -0
  40. package/examples/views/HBImageViewer.vue +57 -0
  41. package/examples/views/HBNavMenu.vue +37 -0
  42. package/examples/views/HBOrganizeDialog.vue +133 -0
  43. package/examples/views/HBPagination.vue +80 -0
  44. package/examples/views/HBSelectVague.vue +57 -0
  45. package/examples/views/HBToolgroup.vue +29 -0
  46. package/examples/views/HBTopBar.vue +16 -0
  47. package/lib/demo.html +10 -0
  48. package/lib/fonts/iconfont.9e99af35.ttf +0 -0
  49. package/lib/hbte-ui.common.js +38291 -0
  50. package/lib/hbte-ui.css +1 -0
  51. package/lib/hbte-ui.umd.js +38301 -0
  52. package/lib/hbte-ui.umd.min.js +21 -0
  53. package/lib/img/nodata.f87d17c1.png +0 -0
  54. package/lib/img/user-logo--default.a53bd193.png +0 -0
  55. package/package.json +40 -0
  56. package/packages/adv-query/index.js +5 -0
  57. package/packages/adv-query/src/main.vue +294 -0
  58. package/packages/area-select/index.js +7 -0
  59. package/packages/area-select/src/main.vue +37 -0
  60. package/packages/authority/index.js +5 -0
  61. package/packages/authority/src/main.vue +606 -0
  62. package/packages/config.js +3 -0
  63. package/packages/custom-query/index.js +5 -0
  64. package/packages/custom-query/src/main.vue +80 -0
  65. package/packages/dialog/index.js +7 -0
  66. package/packages/dialog/src/main.vue +176 -0
  67. package/packages/edit-area/index.js +13 -0
  68. package/packages/edit-area/src/config.js +3 -0
  69. package/packages/edit-area/src/main.vue +304 -0
  70. package/packages/edit-area/src/simulateEvent.js +219 -0
  71. package/packages/filter-drop/index.js +6 -0
  72. package/packages/filter-drop/src/main.vue +107 -0
  73. package/packages/float-footer/index.js +7 -0
  74. package/packages/float-footer/src/main.vue +40 -0
  75. package/packages/fragment/index.js +7 -0
  76. package/packages/fragment/src/main.vue +74 -0
  77. package/packages/fragment/src/old.vue +144 -0
  78. package/packages/full-table/index.js +6 -0
  79. package/packages/full-table/src/config.js +14 -0
  80. package/packages/full-table/src/main.vue +141 -0
  81. package/packages/image-viewer/index.js +8 -0
  82. package/packages/image-viewer/src/main.js +14 -0
  83. package/packages/image-viewer/src/main.vue +138 -0
  84. package/packages/image-viewer/src/svg/cancel.svg +2 -0
  85. package/packages/image-viewer/src/svg/delete.svg +2 -0
  86. package/packages/image-viewer/src/svg/download.svg +2 -0
  87. package/packages/image-viewer/src/svg/rotate.svg +77 -0
  88. package/packages/image-viewer/src/svg/scaledown.svg +71 -0
  89. package/packages/image-viewer/src/svg/scaleup.svg +72 -0
  90. package/packages/index.js +43 -0
  91. package/packages/nav-menu/index.js +7 -0
  92. package/packages/nav-menu/src/main.vue +277 -0
  93. package/packages/organize-dialog/index.js +5 -0
  94. package/packages/organize-dialog/src/main.vue +427 -0
  95. package/packages/pagination/index.js +6 -0
  96. package/packages/pagination/src/main.vue +145 -0
  97. package/packages/query-form/index.js +5 -0
  98. package/packages/query-form/src/main.vue +142 -0
  99. package/packages/select-vague/index.js +5 -0
  100. package/packages/select-vague/src/main.vue +80 -0
  101. package/packages/table/index.js +5 -0
  102. package/packages/table/src/main.vue +265 -0
  103. package/packages/theme-chalk/adv-query.scss +107 -0
  104. package/packages/theme-chalk/authority.scss +103 -0
  105. package/packages/theme-chalk/common/elementCover.scss +722 -0
  106. package/packages/theme-chalk/common/flex.scss +66 -0
  107. package/packages/theme-chalk/common/global.scss +147 -0
  108. package/packages/theme-chalk/common/reset.scss +92 -0
  109. package/packages/theme-chalk/common/var.scss +46 -0
  110. package/packages/theme-chalk/custom-query.scss +10 -0
  111. package/packages/theme-chalk/dialog.scss +9 -0
  112. package/packages/theme-chalk/edit-area.scss +119 -0
  113. package/packages/theme-chalk/filter-drop.scss +81 -0
  114. package/packages/theme-chalk/float-footer.scss +14 -0
  115. package/packages/theme-chalk/fonts/iconfont.ttf +0 -0
  116. package/packages/theme-chalk/fragment.scss +51 -0
  117. package/packages/theme-chalk/full-table.scss +40 -0
  118. package/packages/theme-chalk/icon.scss +96 -0
  119. package/packages/theme-chalk/image-viewer.scss +94 -0
  120. package/packages/theme-chalk/images/company-logo--default.png +0 -0
  121. package/packages/theme-chalk/images/nodata.png +0 -0
  122. package/packages/theme-chalk/images/user-logo--default.png +0 -0
  123. package/packages/theme-chalk/index.scss +21 -0
  124. package/packages/theme-chalk/nav-menu.scss +205 -0
  125. package/packages/theme-chalk/organize-dialog.scss +170 -0
  126. package/packages/theme-chalk/pagination.scss +91 -0
  127. package/packages/theme-chalk/select.scss +8 -0
  128. package/packages/theme-chalk/table.scss +102 -0
  129. package/packages/theme-chalk/tool-group.scss +105 -0
  130. package/packages/theme-chalk/top-bar.scss +195 -0
  131. package/packages/tool-group/index.js +13 -0
  132. package/packages/tool-group/src/config.js +40 -0
  133. package/packages/tool-group/src/main.vue +93 -0
  134. package/packages/top-bar/index.js +7 -0
  135. package/packages/top-bar/src/main.vue +280 -0
  136. package/public/index.html +20 -0
  137. package/vue.config.js +6 -0
@@ -0,0 +1,150 @@
1
+ <template>
2
+ <div>
3
+ <hb-advquery
4
+ :qryFormProps="qryFormProps"
5
+ :qryFormData="qryFormData"
6
+ :customQueryData="customQueryData"
7
+ @AdvQuery="handleAdvSearch"
8
+ >
9
+ <div slot="h">
10
+ <span>asdasdasdasd</span>
11
+ </div>
12
+ </hb-advquery>
13
+ </div>
14
+ </template>
15
+
16
+ <script>
17
+ export default {
18
+ data() {
19
+ return {
20
+ customQueryData: [
21
+ {
22
+ label: "aaa123123123123",
23
+ value: "aaa",
24
+ },
25
+ {
26
+ label: "bbb",
27
+ value: "bbb",
28
+ },
29
+ ],
30
+ qryFormData: {
31
+ a: "",
32
+ b: false,
33
+ c: "",
34
+ d: "",
35
+ e: "",
36
+ f: "",
37
+ g: [],
38
+ h: "",
39
+ },
40
+ qryFormProps: [
41
+ {
42
+ type: "input",
43
+ label: "求助事项",
44
+ prop: "a",
45
+ placeholder: "请输入求助事项",
46
+ maxlength: "64",
47
+ },
48
+ {
49
+ type: "switch",
50
+ label: "负责部门",
51
+ prop: "b",
52
+ placeholder: "请输入负责部门",
53
+ },
54
+ {
55
+ type: "radio",
56
+ label: "事项分类",
57
+ prop: "c",
58
+ placeholder: "请输入作业名称",
59
+ optListProp: {
60
+ label: "name",
61
+ value: "val",
62
+ },
63
+ optList: [
64
+ {
65
+ name: "a",
66
+ val: "1",
67
+ },
68
+ {
69
+ name: "b",
70
+ val: "2",
71
+ },
72
+ ],
73
+ },
74
+ {
75
+ type: "select",
76
+ label: "重要程度",
77
+ prop: "d",
78
+ multiple: true,
79
+ placeholder: "请选择重要程度",
80
+ optListProp: {
81
+ label: "name",
82
+ value: "val",
83
+ },
84
+ optList: [
85
+ {
86
+ name: "a",
87
+ val: "1",
88
+ },
89
+ {
90
+ label: "b",
91
+ value: "2",
92
+ },
93
+ ],
94
+ },
95
+ // {
96
+ // type: "daterange",
97
+ // label: "日期",
98
+ // prop: "e",
99
+ // placeholder: "请选择日期",
100
+ // },
101
+ // {
102
+ // type: "date",
103
+ // label: "日期",
104
+ // prop: "f",
105
+ // placeholder: "请选择日期",
106
+ // },
107
+ // {
108
+ // type: "checkbox",
109
+ // label: "多选",
110
+ // prop: "g",
111
+ // placeholder: "多选",
112
+ // optList: [
113
+ // {
114
+ // label: "a",
115
+ // value: "1",
116
+ // },
117
+ // {
118
+ // label: "b",
119
+ // value: "2",
120
+ // },
121
+ // ],
122
+ // },
123
+ {
124
+ label: "插槽",
125
+ prop: "h",
126
+ slot: true,
127
+ },
128
+ {
129
+ type: "daterange",
130
+ label: "日期",
131
+ prop: "e",
132
+ placeholder: "请选择日期",
133
+ },
134
+ ],
135
+ };
136
+ },
137
+ methods: {
138
+ /**
139
+ * @function handleAdvSearch 高级查询搜索
140
+ * 高级查询使用prop传值,直接进行查询
141
+ */
142
+ handleAdvSearch() {
143
+ // 查询代码
144
+ },
145
+ },
146
+ mounted() {},
147
+ };
148
+ </script>
149
+
150
+ <style></style>
@@ -0,0 +1,339 @@
1
+ <template>
2
+ <div class="hb-authority-wrapper">
3
+ <hb-authority
4
+ :roleList="roleList"
5
+ :roleMembers="roleMembers"
6
+ :treeData="treeData"
7
+ :rules="rules"
8
+ @submitRole="submitRole"
9
+ @deleteRole="deleteRole"
10
+ @openOrganizeDialog="openOrganizeDialog"
11
+ @savePemissions="savePemissions"
12
+ @chooseOrganizeMembers="chooseOrganizeMembers"
13
+ @tabRole="tabRole"
14
+ @removeRoleMember="removeRoleMember"
15
+ />
16
+ </div>
17
+ </template>
18
+ <script>
19
+ import lodash from "lodash";
20
+ import { authorityId, authorityData } from "../mock/authority";
21
+ import { deptData } from "../mock/dept";
22
+ import organizeData from "../mock/organizeData";
23
+
24
+ export default {
25
+ data() {
26
+ return {
27
+ roleList: [
28
+ {
29
+ orgId: null,
30
+ orgName: null,
31
+ pOrgId: null,
32
+ pOrgName: null,
33
+ id: "1448213370004070468",
34
+ roleName: "角色0000",
35
+ code: null,
36
+ roleDesc: "12312312",
37
+ type: "2",
38
+ },
39
+ {
40
+ orgId: null,
41
+ orgName: null,
42
+ pOrgId: null,
43
+ pOrgName: null,
44
+ id: "1457955441385267249",
45
+ roleName: "测试1111111",
46
+ code: null,
47
+ roleDesc: "123",
48
+ type: "2",
49
+ },
50
+ {
51
+ orgId: null,
52
+ orgName: null,
53
+ pOrgId: null,
54
+ pOrgName: null,
55
+ id: "1447809394829975603",
56
+ roleName: "角色12312312",
57
+ code: "",
58
+ roleDesc: "12312312",
59
+ type: "2",
60
+ },
61
+ {
62
+ orgId: null,
63
+ orgName: null,
64
+ pOrgId: null,
65
+ pOrgName: null,
66
+ id: "1457599015289286737",
67
+ roleName: "ceshi",
68
+ code: null,
69
+ roleDesc: "11",
70
+ type: "2",
71
+ },
72
+ ],
73
+ roleMembers: [
74
+ {
75
+ id: "123321",
76
+ userId: "123321",
77
+ name: "何波2",
78
+ workNo: "123321",
79
+ logo: "https://static-legacy.dingtalk.com/media/lADOBH98H80EZc0EZQ_1125_1125.jpg",
80
+ },
81
+ {
82
+ id: "817441111088824320",
83
+ userId: "817441111088824320",
84
+ name: "范绍东",
85
+ workNo: "00017",
86
+ logo: "https://static-legacy.dingtalk.com/media/lADOBH98H80EZc0EZQ_1125_1125.jpg",
87
+ },
88
+ {
89
+ id: "1",
90
+ userId: "1",
91
+ name: "admin",
92
+ workNo: "-1",
93
+ logo: "noway#-1_1417408911061868633.png",
94
+ },
95
+ ],
96
+ // 新增修改角色校验
97
+ rules: {
98
+ roleName: [
99
+ {
100
+ required: true,
101
+ message: "请输入角色名称",
102
+ },
103
+ ],
104
+ roleDesc: [
105
+ {
106
+ required: true,
107
+ message: "请输入描述",
108
+ },
109
+ ],
110
+ },
111
+ //权限最终渲染数据
112
+ treeData: [],
113
+ deptData: deptData,
114
+ // formInlineRender: {}, //如果不需要选择范围不传此参数
115
+ //人员部门弹窗原始数据
116
+ data: organizeData,
117
+ //远程已选的人员和部门
118
+ checkedList: [
119
+ //要把当前登录账号传进去,如果后端没返的话
120
+ {
121
+ id: "1", //admin
122
+ isDept: "0",
123
+ name: "admin",
124
+ },
125
+ {
126
+ id: "373449754", //微测
127
+ isDept: "1",
128
+ name: "微测中心",
129
+ },
130
+ ],
131
+ checkedDeptList: [],
132
+ };
133
+ },
134
+ created() {
135
+ this.getData();
136
+ },
137
+ methods: {
138
+ //请求权限数据
139
+ getData() {
140
+ //权限总数据
141
+ let p1 = new Promise((resolve) => {
142
+ setTimeout(() => {
143
+ resolve(authorityData);
144
+ }, 1000);
145
+ });
146
+ //已有权限
147
+ let p2 = new Promise((resolve) => {
148
+ setTimeout(() => {
149
+ resolve(authorityId);
150
+ }, 1500);
151
+ });
152
+ Promise.all([p1, p2]).then((res) => {
153
+ //传参可能要处理掉外层无用字段
154
+ this.mergeAuthorityData(res[0], res[1]);
155
+ });
156
+ },
157
+ //合并权限数据(一二级菜单的下级全选则checked才为true,为了交互逻辑牺牲了数据逻辑,)
158
+ mergeAuthorityData(authorityData, authorityId) {
159
+ //--------------不需要范围功能,props里不传formInlineRender,此处代码忽略-------------
160
+ // this.formInlineRender.menuObj = authorityId.effectObject || "2";
161
+ // if (authorityId.effectObject != "1") {
162
+ // this.formInlineRender.menuOrg = "";
163
+ // } else {
164
+ // let scope = authorityId.menus.find((v) => v.dataScope);
165
+ // this.formInlineRender.menuOrg = scope?.dataScope;
166
+ // if (this.formInlineRender.menuOrg == "7") {
167
+ // this.formInlineRender.selectNode = scope.deptId;
168
+ // }
169
+ // }
170
+
171
+ authorityData.forEach((menu) => {
172
+ menu.level = 1;
173
+ menu.menuChecked = false;
174
+
175
+ //给对应层级添加dataScope以及deptId字段
176
+ menu.dataScope = "6";
177
+ menu.deptId = [];
178
+ authorityId.menus.forEach((v) => {
179
+ if (menu.id == v.menuId) {
180
+ menu.dataScope = v.dataScope;
181
+ menu.deptId = v.deptId;
182
+ }
183
+ });
184
+
185
+ //如果一级菜单既有权限又有二级菜单,那么数据有误
186
+ if (menu.subMenus.length > 0 && menu.permissions.length > 0) {
187
+ this.$message.error(
188
+ menu.menuName + "权限数据有误,同时存在按钮权限和下级菜单"
189
+ );
190
+ }
191
+
192
+ //添加一级菜单的按钮权限的选中状态
193
+ menu.permissions.forEach((permission) => {
194
+ permission.checked = authorityId.permissions.includes(
195
+ permission.perm
196
+ );
197
+ });
198
+ //添加二级菜单的权限选中状态
199
+ menu.subMenus.forEach((subMenu) => {
200
+ subMenu.level = 2;
201
+ subMenu.menuChecked = false;
202
+
203
+ //给对应层级添加dataScope以及deptId字段
204
+ subMenu.dataScope = "6";
205
+ subMenu.deptId = [];
206
+ authorityId.menus.forEach((v) => {
207
+ if (subMenu.id == v.menuId) {
208
+ subMenu.dataScope = v.dataScope;
209
+ subMenu.deptId = v.deptId;
210
+ }
211
+ });
212
+
213
+ //按钮权限
214
+ subMenu.permissions.forEach((permission) => {
215
+ permission.checked = authorityId.permissions.includes(
216
+ permission.perm
217
+ );
218
+ });
219
+ //判断二级菜单是否半选(permissions有false和true)
220
+ let permissions = subMenu.permissions;
221
+ subMenu.isIndeterminate =
222
+ permissions.some((i) => i.checked) &&
223
+ permissions.some((i) => !i.checked);
224
+
225
+ /**
226
+ * 二级菜单权限选中逻辑
227
+ * 1.有按钮权限
228
+ * 半选 checked:false
229
+ * 非半选 1)按钮权限全选 checked:true
230
+ * 2)按钮权限全不选 checked:false
231
+ * 注意数组为0,every返回true
232
+ * 2.没按钮权限,根据id匹配
233
+ */
234
+ if (permissions.length) {
235
+ subMenu.checked = permissions.every((i) => i.checked);
236
+ } else {
237
+ subMenu.checked = authorityId.menus
238
+ .map((m) => m.menuId)
239
+ .includes(subMenu.id);
240
+ }
241
+
242
+ //如果有三级菜单,则数据有误
243
+ if (subMenu.subMenus.length) {
244
+ this.$message.error(
245
+ subMenu.menuName + "权限数据有误,同时存在按钮权限和下级菜单"
246
+ );
247
+ }
248
+
249
+ subMenu.menuChecked = authorityId.menus
250
+ .map((m) => m.menuId)
251
+ .includes(subMenu.id);
252
+ });
253
+
254
+ /**
255
+ * 一级菜单半选逻辑
256
+ * 1)有子半选
257
+ * 2)子选和子不选同时存在(无子半选)
258
+ */
259
+ let childrenKey = menu.subMenus.length ? "subMenus" : "permissions";
260
+ let subNode = menu[childrenKey];
261
+ menu.isIndeterminate =
262
+ subNode.some((i) => i.isIndeterminate) ||
263
+ (subNode.some((i) => i.checked) && subNode.some((i) => !i.checked));
264
+
265
+ /**
266
+ * 一级菜单权限选中逻辑
267
+ * 无二级菜单同时无一级按钮,根据id匹配
268
+ * 有一级按钮:全部选中 =>true
269
+ * 有二级菜单:全部选中 =>true
270
+ * */
271
+ if (!menu.subMenus.length && !menu.permissions.length) {
272
+ menu.checked = authorityId.menus
273
+ .map((m) => m.menuId)
274
+ .includes(menu.id);
275
+ } else {
276
+ menu.checked = menu[childrenKey].every((i) => i.checked);
277
+ }
278
+ menu.menuChecked = authorityId.menus
279
+ .map((m) => m.menuId)
280
+ .includes(menu.id);
281
+ });
282
+ //建议深拷贝一份,如果源数据有多处使用的情况的话
283
+ this.treeData = lodash.cloneDeep(authorityData);
284
+ console.log(this.treeData);
285
+ },
286
+ //打开选择人员部门的弹窗并传入数据
287
+ openOrganizeDialog(dialog) {
288
+ dialog.open();
289
+ let p1 = new Promise((resolve) => {
290
+ setTimeout(() => {
291
+ resolve(this.data); //!!!!!data是obj不是array
292
+ }, 0);
293
+ });
294
+ let p2 = new Promise((resolve) => {
295
+ setTimeout(() => {
296
+ resolve(this.checkedList);
297
+ }, 0);
298
+ });
299
+ Promise.all([p1, p2])
300
+ .then((res) => {
301
+ dialog.init(res[0], res[1]);
302
+ })
303
+ .catch((err) => {
304
+ console.log(err);
305
+ });
306
+ },
307
+ //保存权限
308
+ savePemissions(data) {
309
+ console.log("已选择的权限数据:", data);
310
+ },
311
+ //提交选择的人员和部门
312
+ chooseOrganizeMembers(data) {
313
+ console.log("已选择的人员部门数据:", data);
314
+ },
315
+ submitRole(formData) {
316
+ console.log("有id是修改角色,反之新增:", formData);
317
+ },
318
+ deleteRole(id) {
319
+ console.log("删除角色:", id);
320
+ },
321
+ tabRole(id) {
322
+ console.log("切换角色:", id);
323
+ },
324
+ removeRoleMember(member, type) {
325
+ //type为1是成员,2是部门
326
+ console.log("移出角色成员", member, type);
327
+ },
328
+ },
329
+ };
330
+ </script>
331
+ <style lang="scss" scoped>
332
+ .hb-authority-wrapper {
333
+ height: calc(100vh - 90px);
334
+ width: calc(100vw - 500px);
335
+ padding-top: 80px;
336
+ padding-bottom: 10px;
337
+ margin-left: 200px;
338
+ }
339
+ </style>
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <div>
3
+ <el-button @click="open">打开弹窗</el-button>
4
+ <hb-dialog title="弹窗" ref="dialog">
5
+ <template v-slot:before>
6
+ <div>前置插槽 before</div>
7
+ </template>
8
+ <template v-slot:form>
9
+ <div>表单插槽 form</div>
10
+ </template>
11
+ <template v-slot:normal>
12
+ <div>普通插槽 normal</div>
13
+ </template>
14
+ <template v-slot:after>
15
+ <div>后置插槽 after</div>
16
+ </template>
17
+ <template v-slot:bottom>
18
+ <div>底部插槽 bottom</div>
19
+ </template>
20
+ </hb-dialog>
21
+ </div>
22
+ </template>
23
+ <script>
24
+ export default {
25
+ data() {
26
+ return {
27
+ activeName: "first",
28
+ };
29
+ },
30
+ methods: {
31
+ open() {
32
+ this.$refs.dialog.open();
33
+ },
34
+ },
35
+ };
36
+ </script>
37
+
38
+ <style>
39
+ </style>