tianheng-ui 0.1.0 → 0.1.2

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 (254) hide show
  1. package/README.md +9 -18
  2. package/lib/039af9192b9bb277966ceb4e4ce29c41.js +16 -0
  3. package/lib/2d84c80112a372bc149cad3464e90fa3.js +1617 -0
  4. package/lib/5977b934a4c6b480790864ea01303173.js +10834 -0
  5. package/lib/7745f3e776488705a38e62f85adad54d.js +16 -0
  6. package/lib/de8dee841ffdaaede3a2254deef30376.js +15395 -0
  7. package/lib/e78eab250e7f8ccac3d918dfdb06ca10.js +8904 -0
  8. package/lib/theme-chalk/fonts/PingFang.ttf +0 -0
  9. package/lib/theme-chalk/fonts/bpmn.eot +0 -0
  10. package/lib/theme-chalk/fonts/bpmn.svg +224 -0
  11. package/lib/theme-chalk/fonts/bpmn.ttf +0 -0
  12. package/lib/theme-chalk/fonts/bpmn.woff +0 -0
  13. package/lib/theme-chalk/fonts/bpmn.woff2 +0 -0
  14. package/lib/theme-chalk/fonts/fontawesome-webfont.eot +0 -0
  15. package/lib/theme-chalk/fonts/fontawesome-webfont.svg +2671 -0
  16. package/lib/theme-chalk/fonts/fontawesome-webfont.ttf +0 -0
  17. package/lib/theme-chalk/fonts/fontawesome-webfont.woff +0 -0
  18. package/lib/theme-chalk/fonts/fontawesome-webfont.woff2 +0 -0
  19. package/lib/theme-chalk/fonts/iconfont.eot +0 -0
  20. package/lib/theme-chalk/fonts/iconfont.svg +155 -0
  21. package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
  22. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  23. package/lib/theme-chalk/fonts/iconfont.woff2 +0 -0
  24. package/lib/theme-chalk/images/notData.png +0 -0
  25. package/lib/theme-chalk/index.scss +31 -0
  26. package/lib/theme-chalk/js/Log.js +99 -0
  27. package/lib/theme-chalk/js/axios.js +86 -0
  28. package/lib/theme-chalk/js/store/getters.js +5 -0
  29. package/lib/theme-chalk/js/store/modules/makingForm.js +21 -0
  30. package/lib/theme-chalk/js/store/store.js +26 -0
  31. package/lib/theme-chalk/styles/button.scss +501 -0
  32. package/lib/theme-chalk/styles/card.scss +29 -0
  33. package/lib/theme-chalk/styles/cell.scss +54 -0
  34. package/lib/theme-chalk/styles/codeEditor.scss +9 -0
  35. package/lib/theme-chalk/styles/col.scss +151 -0
  36. package/lib/theme-chalk/styles/dialog.scss +56 -0
  37. package/lib/theme-chalk/styles/empty.scss +22 -0
  38. package/lib/theme-chalk/styles/feature.scss +46 -0
  39. package/lib/theme-chalk/styles/font.css +7 -0
  40. package/lib/theme-chalk/styles/grid.scss +41 -0
  41. package/lib/theme-chalk/styles/icon.css +1944 -0
  42. package/lib/theme-chalk/styles/imagePreview.scss +113 -0
  43. package/lib/theme-chalk/styles/img.scss +35 -0
  44. package/lib/theme-chalk/styles/reset.scss +17 -0
  45. package/lib/theme-chalk/styles/root.css +64 -0
  46. package/lib/theme-chalk/styles/row.scss +23 -0
  47. package/lib/theme-chalk/styles/upload.scss +744 -0
  48. package/lib/theme-chalk/styles/variable.scss +80 -0
  49. package/lib/tianheng-ui.js +116 -0
  50. package/package.json +86 -48
  51. package/packages/Button/index.js +8 -0
  52. package/packages/Button/index.vue +80 -0
  53. package/packages/Card/index.js +8 -0
  54. package/packages/Card/index.vue +37 -0
  55. package/packages/Cell/index.js +8 -0
  56. package/packages/Cell/index.vue +68 -0
  57. package/packages/CodeEditor/index.js +8 -0
  58. package/packages/CodeEditor/index.vue +177 -0
  59. package/packages/Col/index.js +8 -0
  60. package/packages/Col/index.vue +43 -0
  61. package/packages/Dialog/index.js +8 -0
  62. package/packages/Dialog/index.vue +129 -0
  63. package/packages/Empty/index.js +8 -0
  64. package/packages/Empty/index.vue +35 -0
  65. package/packages/FormMaking/FormConfig.vue +60 -0
  66. package/packages/FormMaking/GenerateForm.vue +308 -0
  67. package/packages/FormMaking/GenerateFormItem.vue +887 -0
  68. package/packages/FormMaking/GenerateFormItemH5.vue +825 -0
  69. package/packages/FormMaking/Upload/index.vue +572 -0
  70. package/packages/FormMaking/WidgetConfig.vue +472 -0
  71. package/packages/FormMaking/WidgetForm.vue +159 -0
  72. package/packages/FormMaking/WidgetFormItem.vue +187 -0
  73. package/packages/FormMaking/custom/config.js +762 -0
  74. package/packages/FormMaking/custom/configs/alliance.vue +0 -0
  75. package/packages/FormMaking/custom/configs/blank.vue +54 -0
  76. package/packages/FormMaking/custom/configs/button.vue +172 -0
  77. package/packages/FormMaking/custom/configs/cascader.vue +175 -0
  78. package/packages/FormMaking/custom/configs/cell.vue +81 -0
  79. package/packages/FormMaking/custom/configs/checkbox.vue +234 -0
  80. package/packages/FormMaking/custom/configs/color.vue +137 -0
  81. package/packages/FormMaking/custom/configs/date.vue +158 -0
  82. package/packages/FormMaking/custom/configs/divider.vue +61 -0
  83. package/packages/FormMaking/custom/configs/editor.vue +71 -0
  84. package/packages/FormMaking/custom/configs/filler.vue +57 -0
  85. package/packages/FormMaking/custom/configs/grid.vue +103 -0
  86. package/packages/FormMaking/custom/configs/image.vue +138 -0
  87. package/packages/FormMaking/custom/configs/input.vue +176 -0
  88. package/packages/FormMaking/custom/configs/number.vue +140 -0
  89. package/packages/FormMaking/custom/configs/radio.vue +211 -0
  90. package/packages/FormMaking/custom/configs/rate.vue +109 -0
  91. package/packages/FormMaking/custom/configs/select.vue +305 -0
  92. package/packages/FormMaking/custom/configs/slider.vue +142 -0
  93. package/packages/FormMaking/custom/configs/switch.vue +130 -0
  94. package/packages/FormMaking/custom/configs/table.vue +105 -0
  95. package/packages/FormMaking/custom/configs/table_h5.vue +102 -0
  96. package/packages/FormMaking/custom/configs/tabs.vue +175 -0
  97. package/packages/FormMaking/custom/configs/text.vue +71 -0
  98. package/packages/FormMaking/custom/configs/textarea.vue +167 -0
  99. package/packages/FormMaking/custom/configs/time.vue +153 -0
  100. package/packages/FormMaking/custom/configs/upload.vue +155 -0
  101. package/packages/FormMaking/custom/index.js +32 -0
  102. package/packages/FormMaking/custom/items/alliance.vue +132 -0
  103. package/packages/FormMaking/custom/items/blank.vue +16 -0
  104. package/packages/FormMaking/custom/items/button.vue +27 -0
  105. package/packages/FormMaking/custom/items/cascader.vue +29 -0
  106. package/packages/FormMaking/custom/items/cell.vue +18 -0
  107. package/packages/FormMaking/custom/items/checkbox.vue +46 -0
  108. package/packages/FormMaking/custom/items/color.vue +19 -0
  109. package/packages/FormMaking/custom/items/date.vue +29 -0
  110. package/packages/FormMaking/custom/items/divider.vue +14 -0
  111. package/packages/FormMaking/custom/items/editor.vue +22 -0
  112. package/packages/FormMaking/custom/items/filler.vue +17 -0
  113. package/packages/FormMaking/custom/items/grid.vue +130 -0
  114. package/packages/FormMaking/custom/items/image.vue +70 -0
  115. package/packages/FormMaking/custom/items/input.vue +33 -0
  116. package/packages/FormMaking/custom/items/login.vue +13 -0
  117. package/packages/FormMaking/custom/items/number.vue +24 -0
  118. package/packages/FormMaking/custom/items/radio.vue +44 -0
  119. package/packages/FormMaking/custom/items/rate.vue +20 -0
  120. package/packages/FormMaking/custom/items/select.vue +32 -0
  121. package/packages/FormMaking/custom/items/slider.vue +34 -0
  122. package/packages/FormMaking/custom/items/switch.vue +22 -0
  123. package/packages/FormMaking/custom/items/table.vue +106 -0
  124. package/packages/FormMaking/custom/items/table_h5.vue +126 -0
  125. package/packages/FormMaking/custom/items/tabs.vue +145 -0
  126. package/packages/FormMaking/custom/items/text.vue +18 -0
  127. package/packages/FormMaking/custom/items/textarea.vue +37 -0
  128. package/packages/FormMaking/custom/items/time.vue +32 -0
  129. package/packages/FormMaking/custom/items/upload.vue +102 -0
  130. package/packages/FormMaking/custom/mixins/index.js +61 -0
  131. package/packages/FormMaking/custom/register.js +18 -0
  132. package/packages/FormMaking/generate.js +5 -0
  133. package/packages/FormMaking/iconfont/demo.css +539 -0
  134. package/packages/FormMaking/iconfont/demo_index.html +1159 -0
  135. package/packages/FormMaking/iconfont/iconfont.css +189 -0
  136. package/packages/FormMaking/iconfont/iconfont.eot +0 -0
  137. package/packages/FormMaking/iconfont/iconfont.js +1 -0
  138. package/packages/FormMaking/iconfont/iconfont.svg +155 -0
  139. package/packages/FormMaking/iconfont/iconfont.ttf +0 -0
  140. package/packages/FormMaking/iconfont/iconfont.woff +0 -0
  141. package/packages/FormMaking/iconfont/iconfont.woff2 +0 -0
  142. package/packages/FormMaking/index.js +33 -0
  143. package/packages/FormMaking/index.vue +807 -0
  144. package/packages/FormMaking/lang/en-US.js +187 -0
  145. package/packages/FormMaking/lang/zh-CN.js +187 -0
  146. package/packages/FormMaking/making.js +9 -0
  147. package/packages/FormMaking/styles/cover.scss +41 -0
  148. package/packages/FormMaking/styles/index.scss +785 -0
  149. package/packages/FormMaking/util/generateCode.js +163 -0
  150. package/packages/FormMaking/util/index.js +33 -0
  151. package/packages/FormMaking/util/request.js +28 -0
  152. package/packages/Grid/index.js +8 -0
  153. package/packages/Grid/index.vue +21 -0
  154. package/packages/GridItem/index.js +8 -0
  155. package/packages/GridItem/index.vue +69 -0
  156. package/packages/Icons/index.js +8 -0
  157. package/packages/Icons/index.vue +377 -0
  158. package/packages/Image/index.js +8 -0
  159. package/packages/Image/index.vue +146 -0
  160. package/packages/ImagePreview/index.js +8 -0
  161. package/packages/ImagePreview/index.vue +386 -0
  162. package/packages/Row/index.js +8 -0
  163. package/packages/Row/index.vue +33 -0
  164. package/packages/Table/action.js +8 -0
  165. package/packages/Table/action.vue +168 -0
  166. package/packages/Table/column.vue +63 -0
  167. package/packages/Table/index.js +8 -0
  168. package/packages/Table/index.vue +327 -0
  169. package/packages/Table/search.js +8 -0
  170. package/packages/Table/search.vue +163 -0
  171. package/packages/Table/tools.js +8 -0
  172. package/packages/Table/tools.vue +49 -0
  173. package/packages/TableMaking/custom/configs/fieldSearch.vue +17 -0
  174. package/packages/TableMaking/custom/configs/fieldTable.vue +15 -0
  175. package/packages/TableMaking/custom/items/search/index.vue +158 -0
  176. package/packages/TableMaking/custom/items/tools/index.vue +49 -0
  177. package/packages/TableMaking/generate.js +5 -0
  178. package/packages/TableMaking/generateTable.vue +560 -0
  179. package/packages/TableMaking/index.vue +229 -0
  180. package/packages/TableMaking/making.js +5 -0
  181. package/packages/TableMaking/util/index.js +433 -0
  182. package/packages/TableMaking/widgetConfig.vue +390 -0
  183. package/packages/TableMaking/widgetTable.vue +305 -0
  184. package/packages/Upload/ajax.js +85 -0
  185. package/packages/Upload/index.js +8 -0
  186. package/packages/Upload/index.vue +325 -0
  187. package/packages/Upload/upload-dragger.vue +70 -0
  188. package/packages/Upload/upload-list.vue +121 -0
  189. package/packages/Upload/upload.vue +193 -0
  190. package/packages/VueEditor/index.js +8 -0
  191. package/packages/VueEditor/index.vue +38 -0
  192. package/packages/Workflow/Log.js +99 -0
  193. package/packages/Workflow/designer/ProcessDesigner.vue +628 -0
  194. package/packages/Workflow/designer/index.js +7 -0
  195. package/packages/Workflow/designer/plugins/content-pad/contentPadProvider.js +390 -0
  196. package/packages/Workflow/designer/plugins/content-pad/index.js +6 -0
  197. package/packages/Workflow/designer/plugins/defaultEmpty.js +24 -0
  198. package/packages/Workflow/designer/plugins/descriptor/activitiDescriptor.json +1071 -0
  199. package/packages/Workflow/designer/plugins/descriptor/camundaDescriptor.json +1087 -0
  200. package/packages/Workflow/designer/plugins/descriptor/flowableDescriptor.json +1215 -0
  201. package/packages/Workflow/designer/plugins/extension-moddle/activiti/activitiExtension.js +74 -0
  202. package/packages/Workflow/designer/plugins/extension-moddle/activiti/index.js +9 -0
  203. package/packages/Workflow/designer/plugins/extension-moddle/camunda/extension.js +148 -0
  204. package/packages/Workflow/designer/plugins/extension-moddle/camunda/index.js +6 -0
  205. package/packages/Workflow/designer/plugins/extension-moddle/flowable/flowableExtension.js +74 -0
  206. package/packages/Workflow/designer/plugins/extension-moddle/flowable/index.js +9 -0
  207. package/packages/Workflow/designer/plugins/palette/CustomPalette.js +156 -0
  208. package/packages/Workflow/designer/plugins/palette/index.js +6 -0
  209. package/packages/Workflow/designer/plugins/palette/paletteProvider.js +160 -0
  210. package/packages/Workflow/designer/plugins/translate/customTranslate.js +41 -0
  211. package/packages/Workflow/designer/plugins/translate/zh.js +238 -0
  212. package/packages/Workflow/highlight/index.js +5 -0
  213. package/packages/Workflow/index.js +34 -0
  214. package/packages/Workflow/index.vue +399 -0
  215. package/packages/Workflow/modules/auto-place/CustomAutoPlace.js +81 -0
  216. package/packages/Workflow/modules/auto-place/index.js +6 -0
  217. package/packages/Workflow/modules/custom-renderer/CustomRenderer.js +17 -0
  218. package/packages/Workflow/modules/custom-renderer/index.js +6 -0
  219. package/packages/Workflow/modules/rules/CustomRules.js +16 -0
  220. package/packages/Workflow/modules/rules/index.js +6 -0
  221. package/packages/Workflow/palette/ProcessPalette.vue +106 -0
  222. package/packages/Workflow/palette/index.js +7 -0
  223. package/packages/Workflow/penal/PropertiesPanel.vue +245 -0
  224. package/packages/Workflow/penal/base/ElementBaseInfo.vue +80 -0
  225. package/packages/Workflow/penal/flow-condition/FlowCondition.vue +142 -0
  226. package/packages/Workflow/penal/form/ElementForm.vue +367 -0
  227. package/packages/Workflow/penal/index.js +7 -0
  228. package/packages/Workflow/penal/listeners/ElementListeners.vue +299 -0
  229. package/packages/Workflow/penal/listeners/UserTaskListeners.vue +322 -0
  230. package/packages/Workflow/penal/listeners/template.js +178 -0
  231. package/packages/Workflow/penal/listeners/utilSelf.js +64 -0
  232. package/packages/Workflow/penal/multi-instance/ElementMultiInstance.vue +200 -0
  233. package/packages/Workflow/penal/other/ElementOtherConfig.vue +59 -0
  234. package/packages/Workflow/penal/properties/ElementProperties.vue +135 -0
  235. package/packages/Workflow/penal/signal-message/SignalAndMessage.vue +104 -0
  236. package/packages/Workflow/penal/task/ElementTask.vue +73 -0
  237. package/packages/Workflow/penal/task/task-components/ReceiveTask.vue +97 -0
  238. package/packages/Workflow/penal/task/task-components/ScriptTask.vue +85 -0
  239. package/packages/Workflow/penal/task/task-components/UserTask.vue +535 -0
  240. package/packages/Workflow/theme/element-variables.scss +70 -0
  241. package/packages/Workflow/theme/index.scss +2 -0
  242. package/packages/Workflow/theme/process-designer.scss +157 -0
  243. package/packages/Workflow/theme/process-panel.scss +107 -0
  244. package/packages/Workflow/translations.js +25 -0
  245. package/packages/Workflow/utils.js +71 -0
  246. package/packages/index.js +160 -0
  247. package/babel.config.js +0 -15
  248. package/index.js +0 -11
  249. package/public/favicon.ico +0 -0
  250. package/public/index.html +0 -17
  251. package/src/App.vue +0 -28
  252. package/src/assets/logo.png +0 -0
  253. package/src/components/HelloWorld.vue +0 -58
  254. package/src/main.js +0 -8
@@ -0,0 +1,887 @@
1
+ <template>
2
+ <el-form-item
3
+ v-show="!widget.options.hidden"
4
+ :class="{
5
+ [widget.model]: true,
6
+ [`widget-form-list-${widget.type}`]: true
7
+ }"
8
+ :label="widget.options.hideLabel ? '' : widget.name"
9
+ :label-width="labelWidth"
10
+ :prop="prop ? prop : widget.model"
11
+ :rules="widget.rules"
12
+ :ref="widget.model"
13
+ >
14
+ <template v-if="widget.type == 'input'">
15
+ <el-input
16
+ v-if="
17
+ widget.options.dataType == 'number' ||
18
+ widget.options.dataType == 'integer' ||
19
+ widget.options.dataType == 'float'
20
+ "
21
+ type="number"
22
+ v-model.number="dataModel"
23
+ :placeholder="widget.options.placeholder"
24
+ :style="{ width: widget.options.width }"
25
+ :disabled="widget.options.disabled"
26
+ :readonly="widget.options.readonly"
27
+ :clearable="widget.options.clearable"
28
+ :maxlength="widget.options.maxlength"
29
+ :show-word-limit="widget.options.showWordLimit"
30
+ :show-password="widget.options.showPassword"
31
+ @input="handleEventAction(widget.events.onChange)"
32
+ @focus="handleEventAction(widget.events.onFocus)"
33
+ @blur="handleEventAction(widget.events.onBlur)"
34
+ >
35
+ </el-input>
36
+ <el-input
37
+ v-else
38
+ type="text"
39
+ v-model="dataModel"
40
+ :placeholder="widget.options.placeholder"
41
+ :style="{ width: widget.options.width }"
42
+ :disabled="widget.options.disabled"
43
+ :readonly="widget.options.readonly"
44
+ :clearable="widget.options.clearable"
45
+ :maxlength="widget.options.maxlength"
46
+ :show-word-limit="widget.options.showWordLimit"
47
+ :show-password="widget.options.showPassword"
48
+ :suffix-icon="widget.options.suffixIcon"
49
+ :prefix-icon="widget.options.prefixIcon"
50
+ @input="handleEventAction(widget.events.onChange)"
51
+ @focus="handleEventAction(widget.events.onFocus)"
52
+ @blur="handleEventAction(widget.events.onBlur)"
53
+ >
54
+ <template v-if="widget.options.prepend" slot="prepend">{{
55
+ widget.options.prepend
56
+ }}</template>
57
+ <template v-if="widget.options.append" slot="append">{{
58
+ widget.options.append
59
+ }}</template>
60
+ </el-input>
61
+ </template>
62
+
63
+ <template v-if="widget.type == 'textarea'">
64
+ <el-input
65
+ type="textarea"
66
+ v-model="dataModel"
67
+ :disabled="widget.options.disabled"
68
+ :placeholder="widget.options.placeholder"
69
+ :style="{ width: widget.options.width }"
70
+ :maxlength="widget.options.maxlength"
71
+ :clearable="widget.options.clearable"
72
+ :show-word-limit="widget.options.showWordLimit"
73
+ :autosize="{
74
+ minRows: widget.options.minRows,
75
+ maxRows: widget.options.maxRows
76
+ }"
77
+ @input="handleEventAction(widget.events.onChange)"
78
+ @focus="handleEventAction(widget.events.onFocus)"
79
+ @blur="handleEventAction(widget.events.onBlur)"
80
+ ></el-input>
81
+ </template>
82
+
83
+ <template v-if="widget.type == 'cell'">
84
+ <th-cell
85
+ :title="widget.options.title"
86
+ :value="widget.options.value"
87
+ :label="widget.options.label"
88
+ ></th-cell>
89
+ </template>
90
+
91
+ <template v-if="widget.type == 'number'">
92
+ <el-input-number
93
+ v-model="dataModel"
94
+ :style="{ width: widget.options.width }"
95
+ :step="widget.options.step"
96
+ :controls-position="widget.options.controlsPosition ? 'right' : ''"
97
+ :disabled="widget.options.disabled"
98
+ :min="widget.options.min"
99
+ :max="widget.options.max"
100
+ :precision="widget.options.precision"
101
+ @change="handleEventAction(widget.events.onChange)"
102
+ @focus="handleEventAction(widget.events.onFocus)"
103
+ @blur="handleEventAction(widget.events.onBlur)"
104
+ ></el-input-number>
105
+ </template>
106
+
107
+ <template v-if="widget.type == 'text'">
108
+ <div
109
+ :style="{
110
+ height: widget.options.height,
111
+ textAlign: widget.options.textAlign
112
+ }"
113
+ v-html="dataModel"
114
+ ></div>
115
+ </template>
116
+
117
+ <template v-if="widget.type == 'radio'">
118
+ <el-radio-group
119
+ v-model="dataModel"
120
+ :style="{ width: widget.options.width }"
121
+ :disabled="widget.options.disabled"
122
+ @change="handleEventAction(widget.events.onChange)"
123
+ >
124
+ <template v-if="widget.options.buttonType">
125
+ <el-radio-button
126
+ :style="{
127
+ display: widget.options.inline ? 'inline-block' : 'block'
128
+ }"
129
+ v-for="(item, index) in widget.options.remote
130
+ ? widget.options.remoteOptions
131
+ : widget.options.options"
132
+ :key="index"
133
+ :label="item.value"
134
+ :border="widget.options.border"
135
+ >
136
+ <template v-if="widget.options.remote">{{ item.label }}</template>
137
+ <template v-else>{{
138
+ widget.options.showLabel ? item.label : item.value
139
+ }}</template>
140
+ </el-radio-button>
141
+ </template>
142
+ <template v-else>
143
+ <el-radio
144
+ :style="{
145
+ display: widget.options.inline ? 'inline-block' : 'block'
146
+ }"
147
+ :label="item.value"
148
+ :border="widget.options.border"
149
+ v-for="(item, index) in widget.options.remote
150
+ ? widget.options.remoteOptions
151
+ : widget.options.options"
152
+ :key="index"
153
+ >
154
+ <template v-if="widget.options.remote">{{ item.label }}</template>
155
+ <template v-else>{{
156
+ widget.options.showLabel ? item.label : item.value
157
+ }}</template>
158
+ </el-radio>
159
+ </template>
160
+ </el-radio-group>
161
+ </template>
162
+
163
+ <template v-if="widget.type == 'checkbox'">
164
+ <el-checkbox-group
165
+ v-model="dataModel"
166
+ :style="{ width: widget.options.width }"
167
+ :disabled="widget.options.disabled"
168
+ :min="widget.options.min"
169
+ :max="widget.options.max"
170
+ @change="handleEventAction(widget.events.onChange)"
171
+ >
172
+ <template v-if="widget.options.buttonType">
173
+ <el-checkbox-button
174
+ :style="{
175
+ display: widget.options.inline ? 'inline-block' : 'block'
176
+ }"
177
+ :label="item.value"
178
+ :border="widget.options.border"
179
+ v-for="(item, index) in widget.options.remote
180
+ ? widget.options.remoteOptions
181
+ : widget.options.options"
182
+ :key="index"
183
+ >
184
+ <template v-if="widget.options.remote">{{ item.label }}</template>
185
+ <template v-else>{{
186
+ widget.options.showLabel ? item.label : item.value
187
+ }}</template>
188
+ </el-checkbox-button>
189
+ </template>
190
+ <template v-else>
191
+ <el-checkbox
192
+ :style="{
193
+ display: widget.options.inline ? 'inline-block' : 'block'
194
+ }"
195
+ :label="item.value"
196
+ :border="widget.options.border"
197
+ v-for="(item, index) in widget.options.remote
198
+ ? widget.options.remoteOptions
199
+ : widget.options.options"
200
+ :key="index"
201
+ >
202
+ <template v-if="widget.options.remote">{{ item.label }}</template>
203
+ <template v-else>{{
204
+ widget.options.showLabel ? item.label : item.value
205
+ }}</template>
206
+ </el-checkbox>
207
+ </template>
208
+ </el-checkbox-group>
209
+ </template>
210
+
211
+ <template v-if="widget.type == 'time'">
212
+ <el-time-picker
213
+ v-model="dataModel"
214
+ :style="{ width: widget.options.width }"
215
+ :is-range="widget.options.isRange"
216
+ :placeholder="widget.options.placeholder"
217
+ :start-placeholder="widget.options.startPlaceholder"
218
+ :end-placeholder="widget.options.endPlaceholder"
219
+ :readonly="widget.options.readonly"
220
+ :disabled="widget.options.disabled"
221
+ :editable="widget.options.editable"
222
+ :clearable="widget.options.clearable"
223
+ :arrowControl="widget.options.arrowControl"
224
+ :value-format="widget.options.format"
225
+ :picker-options="{
226
+ selectableRange: `${widget.options.pickerOptions.selectableRange[0]} - ${widget.options.pickerOptions.selectableRange[1]}`
227
+ }"
228
+ @change="handleEventAction(widget.events.onChange)"
229
+ @focus="handleEventAction(widget.events.onFocus)"
230
+ @blur="handleEventAction(widget.events.onBlur)"
231
+ >
232
+ </el-time-picker>
233
+ </template>
234
+
235
+ <template v-if="widget.type == 'date'">
236
+ <el-date-picker
237
+ v-model="dataModel"
238
+ :style="{ width: widget.options.width }"
239
+ :type="widget.options.type"
240
+ :is-range="widget.options.isRange"
241
+ :placeholder="widget.options.placeholder"
242
+ :start-placeholder="widget.options.startPlaceholder"
243
+ :end-placeholder="widget.options.endPlaceholder"
244
+ :readonly="widget.options.readonly"
245
+ :disabled="widget.options.disabled"
246
+ :editable="widget.options.editable"
247
+ :clearable="widget.options.clearable"
248
+ :value-format="widget.options.format"
249
+ @change="handleEventAction(widget.events.onChange)"
250
+ @focus="handleEventAction(widget.events.onFocus)"
251
+ @blur="handleEventAction(widget.events.onBlur)"
252
+ >
253
+ </el-date-picker>
254
+ </template>
255
+
256
+ <template v-if="widget.type == 'select'">
257
+ <el-select
258
+ v-model="dataModel"
259
+ :style="{ width: widget.options.width }"
260
+ :disabled="widget.options.disabled"
261
+ :multiple="widget.options.multiple"
262
+ :clearable="widget.options.clearable"
263
+ :placeholder="widget.options.placeholder"
264
+ :collapseTags="widget.options.collapseTags"
265
+ :allowCreate="widget.options.allowCreate"
266
+ :filterable="
267
+ widget.options.allowCreate ? true : widget.options.filterable
268
+ "
269
+ @change="handleEventAction(widget.events.onChange)"
270
+ @focus="handleEventAction(widget.events.onFocus)"
271
+ @blur="handleEventAction(widget.events.onBlur)"
272
+ >
273
+ <el-option
274
+ v-for="item in widget.options.remote
275
+ ? widget.options.remoteOptions
276
+ : widget.options.options"
277
+ :key="item.value"
278
+ :value="item.value"
279
+ :label="
280
+ widget.options.showLabel || widget.options.remote
281
+ ? item.label
282
+ : item.value
283
+ "
284
+ ></el-option>
285
+ </el-select>
286
+ </template>
287
+
288
+ <template v-if="widget.type == 'color'">
289
+ <el-color-picker
290
+ v-model="dataModel"
291
+ :disabled="widget.options.disabled"
292
+ :show-alpha="widget.options.showAlpha"
293
+ @change="handleEventAction(widget.events.onChange)"
294
+ ></el-color-picker>
295
+ </template>
296
+
297
+ <template v-if="widget.type == 'switch'">
298
+ <el-switch
299
+ v-model="dataModel"
300
+ :width="widget.options.width - 20"
301
+ :disabled="widget.options.disabled"
302
+ :inactive-text="widget.options.switchInactiveText"
303
+ :active-text="widget.options.switchActiveText"
304
+ :inactive-color="widget.options.switchInactiveColor"
305
+ :active-color="widget.options.switchActiveColor"
306
+ @change="handleEventAction(widget.events.onChange)"
307
+ >
308
+ </el-switch>
309
+ </template>
310
+
311
+ <template v-if="widget.type == 'button'">
312
+ <el-button
313
+ :style="{
314
+ width: widget.options.width,
315
+ height: widget.options.height
316
+ }"
317
+ :size="widget.options.buttonSize"
318
+ :type="widget.options.buttonType"
319
+ :plain="widget.options.buttonPlain"
320
+ :round="widget.options.buttonRound"
321
+ :circle="widget.options.buttonCircle"
322
+ :loading="widget.options.loading"
323
+ :disabled="widget.options.disabled"
324
+ :icon="widget.options.buttonIcon"
325
+ @click="handleEventAction(widget.events.onClick)"
326
+ >{{ widget.options.defaultValue }}</el-button
327
+ >
328
+ </template>
329
+
330
+ <template v-if="widget.type == 'slider'">
331
+ <el-slider
332
+ v-model="dataModel"
333
+ :min="widget.options.min"
334
+ :max="widget.options.max"
335
+ :disabled="widget.options.disabled"
336
+ :step="widget.options.step"
337
+ :show-input="widget.options.showInput"
338
+ :range="widget.options.range"
339
+ :style="{
340
+ width: widget.options.width,
341
+ height: widget.options.height
342
+ }"
343
+ :show-tooltip="widget.options.showTooltip"
344
+ :format-tooltip="
345
+ val => formatTooltip(val, widget.options.formatTooltip)
346
+ "
347
+ :show-stops="widget.options.showStops"
348
+ :vertical="widget.options.vertical"
349
+ @change="handleEventAction(widget.events.onChange)"
350
+ ></el-slider>
351
+ </template>
352
+
353
+ <template v-if="widget.type == 'rate'">
354
+ <el-rate
355
+ v-model="dataModel"
356
+ :max="widget.options.max"
357
+ :disabled="widget.options.disabled"
358
+ :allow-half="widget.options.allowHalf"
359
+ :show-text="widget.options.showText"
360
+ :texts="widget.options.auxiliaryValue"
361
+ @change="handleEventAction(widget.events.onChange)"
362
+ ></el-rate>
363
+ </template>
364
+
365
+ <template v-if="widget.type == 'filler'">
366
+ <div
367
+ :style="{
368
+ width: widget.options.width,
369
+ height: widget.options.height
370
+ }"
371
+ ></div>
372
+ </template>
373
+
374
+ <template v-if="widget.type == 'image'">
375
+ <!-- <el-image
376
+ :style="{
377
+ width: widget.options.width,
378
+ height: widget.options.height
379
+ }"
380
+ :src="widget.options.defaultValue"
381
+ :fit="widget.options.fit"
382
+ :preview-src-list="[widget.options.defaultValue]"
383
+ :lazy="widget.options.isLazy"
384
+ ></el-image> -->
385
+ <el-image
386
+ v-for="(item, index) in widget.options.defaultValue"
387
+ :key="index"
388
+ :style="{
389
+ width: widget.options.width,
390
+ height: widget.options.height,
391
+ borderRadius: widget.options.borderRadius,
392
+ verticalAlign:'middle'
393
+ }"
394
+ :src="item.url"
395
+ :fit="widget.options.fit"
396
+ :preview-src-list="imagePreviewList"
397
+ :lazy="widget.options.isLazy"
398
+ ></el-image>
399
+ </template>
400
+
401
+ <template v-if="widget.type == 'upload'">
402
+ <el-upload
403
+ class="upload-demo"
404
+ :action="uploadUrl"
405
+ :headers="
406
+ widget.options.remote ? widget.options.remoteFunc.headers : {}
407
+ "
408
+ :data="widget.options.remote ? widget.options.remoteFunc.params : {}"
409
+ :multiple="widget.options.multiple"
410
+ :limit="widget.options.length"
411
+ :width="widget.options.size.width"
412
+ :height="widget.options.size.height"
413
+ :list-type="widget.options.listType"
414
+ :drag="widget.options.drag"
415
+ :disabled="widget.options.disabled"
416
+ :auto-upload="true"
417
+ :on-change="handleAvatar"
418
+ :on-error="handleAvatarError"
419
+ :on-preview="
420
+ file => handlePictureCardPreview(file, widget.options.listType)
421
+ "
422
+ :on-remove="handleRemove"
423
+ >
424
+ <el-button
425
+ size="small"
426
+ type="primary"
427
+ :disabled="widget.options.disabled"
428
+ v-if="
429
+ ['default', 'picture'].includes(widget.options.listType) &&
430
+ !widget.options.drag
431
+ "
432
+ >点击上传</el-button
433
+ >
434
+ <i
435
+ slot="default"
436
+ class="el-icon-plus"
437
+ v-if="
438
+ widget.options.listType === 'picture-card' && !widget.options.drag
439
+ "
440
+ ></i>
441
+ <i class="el-icon-upload" v-if="widget.options.drag"></i>
442
+ <div class="el-upload__text" v-if="widget.options.drag">
443
+ 将文件拖到此处,或<em>点击上传</em>
444
+ </div>
445
+ <div
446
+ slot="tip"
447
+ class="el-upload__tip"
448
+ v-html="widget.options.elUploadTip"
449
+ ></div>
450
+ </el-upload>
451
+ </template>
452
+
453
+ <template v-if="widget.type == 'editor'">
454
+ <vue-editor
455
+ v-model="dataModel"
456
+ :style="{ width: widget.options.width }"
457
+ :disabled="widget.options.disabled"
458
+ >
459
+ </vue-editor>
460
+ </template>
461
+
462
+ <template v-if="widget.type == 'cascader'">
463
+ <el-cascader
464
+ v-model="dataModel"
465
+ :disabled="widget.options.disabled"
466
+ :clearable="widget.options.clearable"
467
+ :placeholder="widget.options.placeholder"
468
+ :style="{
469
+ width: widget.options.width,
470
+ height: widget.options.height
471
+ }"
472
+ :options="widget.options.remoteOptions"
473
+ :props="widget.options.props"
474
+ :show-all-levels="widget.options.showAllLevels ? false : true"
475
+ :collapse-tags="widget.options.collapseTags"
476
+ :filterable="widget.options.filterable"
477
+ @change="handleEventAction(widget.events.onChange)"
478
+ >
479
+ <template slot-scope="{ data }">
480
+ <span v-html="widget.options.prepend"></span>
481
+ <span>{{ data.label }}</span>
482
+ <span v-html="widget.options.append"></span>
483
+ </template>
484
+ </el-cascader>
485
+ </template>
486
+
487
+ <template v-if="widget.type == 'blank'">
488
+ <slot :name="widget.model" />
489
+ </template>
490
+
491
+ <template v-if="widget.type == 'table'">
492
+ <el-table
493
+ style="width:100%"
494
+ :data="dataModel"
495
+ :stripe="widget.options.stripe"
496
+ :show-header="widget.options.showHeader"
497
+ :highlight-current-row="widget.options.highlightCurrentRow"
498
+ :border="widget.options.border"
499
+ >
500
+ <el-table-column
501
+ v-if="widget.options.isSerial"
502
+ label="序号"
503
+ type="index"
504
+ width="50"
505
+ align="center"
506
+ >
507
+ </el-table-column>
508
+ <el-table-column
509
+ v-for="element in widget.list"
510
+ :key="`table_${element.key}`"
511
+ :label="element.name"
512
+ :prop="element.model"
513
+ :width="element.options.width"
514
+ >
515
+ <template slot-scope="scope">
516
+ <genetate-form-item
517
+ :models.sync="dataModel[scope.$index]"
518
+ :widget="element"
519
+ :remote="remote"
520
+ :config="config"
521
+ :prop="`${prop}.${scope.$index}.${element.model}`"
522
+ :slotKeys="slotKeys"
523
+ :componentsData="componentsData"
524
+ >
525
+ <template v-for="name in slotKeys" :slot="name">
526
+ <slot :name="name" />
527
+ </template>
528
+ </genetate-form-item>
529
+ </template>
530
+ </el-table-column>
531
+ <el-table-column
532
+ v-if="widget.options.isDelete"
533
+ fixed="right"
534
+ label="操作"
535
+ width="60"
536
+ align="center"
537
+ >
538
+ <template slot-scope="scope">
539
+ <el-button
540
+ style="color:#F56C6C"
541
+ type="text"
542
+ @click.native.prevent="handleTableDelete(scope.$index)"
543
+ >
544
+ 移除
545
+ </el-button>
546
+ </template>
547
+ </el-table-column>
548
+ <template v-if="widget.options.isAdd" slot="append">
549
+ <div
550
+ style="text-align: center;"
551
+ :style="{
552
+ borderTop:
553
+ dataModel && dataModel.length != 0 ? '' : '1px solid #EBEEF5'
554
+ }"
555
+ >
556
+ <el-button
557
+ type="text"
558
+ :disabled="widget.options.disabled"
559
+ @click="handleTableAdd"
560
+ >新增</el-button
561
+ >
562
+ </div>
563
+ </template>
564
+ </el-table>
565
+ </template>
566
+
567
+ <template v-if="widget.type == 'table_h5'">
568
+ <div class="tableH5">
569
+ <div
570
+ v-for="(column, columnIndex) in dataModel"
571
+ class="tableH5-item"
572
+ :key="`table_h5_${columnIndex}`"
573
+ >
574
+ <div
575
+ v-for="(element, elementIndex) in widget.list"
576
+ :key="`table_h5_${columnIndex}_${element.key}`"
577
+ >
578
+ <genetate-form-item
579
+ style="flex:1;"
580
+ :models.sync="column"
581
+ :widget="element"
582
+ :remote="remote"
583
+ :config="config"
584
+ :prop="
585
+ element.type === 'grid'
586
+ ? `${prop}.${columnIndex}`
587
+ : `${prop}.${columnIndex}.${element.model}`
588
+ "
589
+ :slotKeys="slotKeys"
590
+ :componentsData="componentsData"
591
+ >
592
+ <template v-for="name in slotKeys" :slot="name">
593
+ <slot :name="name" />
594
+ </template>
595
+ </genetate-form-item>
596
+ <div
597
+ v-if="
598
+ widget.options.isDelete &&
599
+ elementIndex === 0 &&
600
+ columnIndex >= widget.options.deleteIndex
601
+ "
602
+ class="actions"
603
+ >
604
+ <el-button
605
+ type="danger"
606
+ @click.native.prevent="handleTableDelete(columnIndex)"
607
+ >{{ widget.options.deleteButtonText }}</el-button
608
+ >
609
+ </div>
610
+ </div>
611
+ </div>
612
+
613
+ <div v-if="widget.options.isAdd" style="text-align: center;">
614
+ <el-button
615
+ type="text"
616
+ :disabled="widget.options.disabled"
617
+ @click="handleTableAdd"
618
+ >{{ widget.options.addButtonText }}</el-button
619
+ >
620
+ </div>
621
+ </div>
622
+ </template>
623
+
624
+ <template v-if="widget.type == 'grid'">
625
+ <th-row
626
+ :gutter="widget.options.gutter ? widget.options.gutter : 0"
627
+ :justify="widget.options.justify"
628
+ :align="widget.options.align"
629
+ >
630
+ <th-col
631
+ v-for="(column, columnIndex) in widget.columns"
632
+ :key="columnIndex"
633
+ :span="column.span"
634
+ >
635
+ <genetate-form-item
636
+ v-for="element in column.list"
637
+ :key="element.key"
638
+ :widget="element"
639
+ :models="models"
640
+ :config="config"
641
+ :remote="remote"
642
+ :prop="prop ? `${prop}.${element.model}` : element.model"
643
+ :slotKeys="slotKeys"
644
+ :componentsData="componentsData"
645
+ >
646
+ <template v-for="name in slotKeys" :slot="name">
647
+ <slot :name="name" />
648
+ </template>
649
+ </genetate-form-item>
650
+ </th-col>
651
+ </th-row>
652
+ </template>
653
+
654
+ <template v-if="widget.type == 'tabs'">
655
+ <el-tabs v-model="widget.options.defaultValue">
656
+ <el-tab-pane
657
+ v-for="(column, columnIndex) in widget.tabs"
658
+ :key="`tabs_${columnIndex}`"
659
+ :label="column.label"
660
+ :name="column.value"
661
+ >
662
+ <genetate-form-item
663
+ v-for="element in column.list"
664
+ :key="`tabs_${columnIndex}_${element.key}`"
665
+ :widget="element"
666
+ :models.sync="dataModel[column.value]"
667
+ :config="config"
668
+ :remote="remote"
669
+ :prop="
670
+ element.type === 'grid'
671
+ ? `${prop}.${column.value}`
672
+ : `${prop}.${column.value}.${element.model}`
673
+ "
674
+ :slotKeys="slotKeys"
675
+ :componentsData="componentsData"
676
+ >
677
+ <template v-for="name in slotKeys" :slot="name">
678
+ <slot :name="name" />
679
+ </template>
680
+ </genetate-form-item>
681
+ </el-tab-pane>
682
+ </el-tabs>
683
+ </template>
684
+
685
+ <template v-if="widget.type == 'divider'">
686
+ <el-divider :content-position="widget.options.contentPosition">
687
+ {{ widget.options.defaultValue }}
688
+ </el-divider>
689
+ </template>
690
+
691
+ <el-dialog :visible.sync="dialogVisible" append-to-body>
692
+ <img width="100%" :src="dialogImageUrl" alt="" />
693
+ </el-dialog>
694
+ </el-form-item>
695
+ </template>
696
+
697
+ <script>
698
+ import FmUpload from "./Upload";
699
+ import { VueEditor } from "vue2-editor";
700
+ import ThCell from "ui/Cell/index.vue";
701
+ import ThImage from "ui/Image/index.vue";
702
+ import ThRow from "ui/Row/index.vue";
703
+ import ThCol from "ui/Col/index.vue";
704
+
705
+ export default {
706
+ name: "genetate-form-item",
707
+ props: [
708
+ "widget",
709
+ "models",
710
+ "remote",
711
+ "prop",
712
+ "slotKeys",
713
+ "config",
714
+ "componentsData"
715
+ ],
716
+ components: { FmUpload, VueEditor, ThCell, ThImage, ThRow, ThCol },
717
+ data() {
718
+ return {
719
+ dataModel: this.models[this.widget.model],
720
+ dialogVisible: false,
721
+ dialogImageUrl: ""
722
+ };
723
+ },
724
+ watch: {
725
+ dataModel: {
726
+ deep: true,
727
+ handler(val) {
728
+ this.models[this.widget.model] = val;
729
+ this.$emit("update:models", {
730
+ ...this.models,
731
+ [this.widget.model]: val
732
+ });
733
+ this.$emit("input-change", val, this.widget.model);
734
+ }
735
+ },
736
+ models: {
737
+ deep: true,
738
+ handler(val) {
739
+ this.dataModel = val[this.widget.model];
740
+ }
741
+ }
742
+ },
743
+ computed: {
744
+ labelWidth() {
745
+ if (this.widget.options.hideLabel) return "0";
746
+ if (this.widget.options.isLabelWidth)
747
+ return `${this.widget.options.labelWidth}px`;
748
+
749
+ return "";
750
+ },
751
+ uploadUrl() {
752
+ if (this.widget.options.remote) {
753
+ const info = sessionStorage.getItem("th_oauth_info");
754
+ let baseUrl = "";
755
+ if (info) baseUrl = JSON.parse(info).baseUrl;
756
+
757
+ return `${baseUrl}/${this.widget.options.remoteFunc.api}`;
758
+ } else {
759
+ return this.widget.options.action;
760
+ }
761
+ },
762
+ imagePreviewList() {
763
+ const list = [];
764
+ this.widget.options.defaultValue.forEach(item => {
765
+ list.push(item.url);
766
+ });
767
+ return list;
768
+ }
769
+ },
770
+ created() {},
771
+ mounted() {
772
+ this.$nextTick(() => {
773
+ this.componentsData[this.widget.model] = this.widget;
774
+ });
775
+ },
776
+ methods: {
777
+ handleTimePicker(vals) {
778
+ this.dataModel = [];
779
+ this.dataModel[0] = vals;
780
+ this.widget.options.endTimePickerOptions.minTime = vals;
781
+ },
782
+ formatTooltip(val, num) {
783
+ return val / num;
784
+ },
785
+ handlePictureCardPreview(file, listType) {
786
+ if (listType === "picture-card") {
787
+ this.dialogImageUrl = file.url;
788
+ this.dialogVisible = true;
789
+ }
790
+ },
791
+ handleRemove(file, fileList) {
792
+ this.dataModel = {
793
+ data: fileList,
794
+ remoteApi: this.widget.options.remoteApi
795
+ };
796
+ },
797
+ handleAvatar(res, file) {
798
+ this.dataModel = {
799
+ data: file,
800
+ remoteApi: this.widget.options.remoteApi
801
+ };
802
+ },
803
+ handleAvatarError() {
804
+ console.log("上传失败!");
805
+ },
806
+ handleTableAdd() {
807
+ let dic = {};
808
+ this.widget.list.forEach(item => {
809
+ if (item.type === "grid") {
810
+ for (let i = 0; i < item.columns.length; i++) {
811
+ const element = item.columns[i];
812
+ for (let j = 0; j < element.list.length; j++) {
813
+ const element2 = element.list[j];
814
+ dic[element2.model] = element2.options.defaultValue;
815
+ }
816
+ }
817
+ } else {
818
+ dic[item.model] = item.options.defaultValue;
819
+ }
820
+ });
821
+ this.dataModel.push(dic);
822
+ },
823
+ handleTableDelete(index) {
824
+ this.dataModel.splice(index, 1);
825
+ },
826
+
827
+ // 支撑 JavaScript 动态编译
828
+ handleEventAction(key) {
829
+ if (!key) return;
830
+
831
+ const eventScript = this.config.eventScript;
832
+ for (let i = 0; i < eventScript.length; i++) {
833
+ const element = eventScript[i];
834
+ if (element.key === key) {
835
+ const func = `(item,value)=>{${element.func}}`;
836
+ eval(func)(this.widget, this.dataModel);
837
+ }
838
+ }
839
+ },
840
+ // 显示组件
841
+ display(keys) {
842
+ if (!keys || keys.length === 0) return;
843
+ for (let i = 0; i < keys.length; i++) {
844
+ const key = keys[i];
845
+ if (this.componentsData[key]) {
846
+ // this.componentsData[key].options.hidden = false;
847
+ this.$set(this.componentsData[key].options, "hidden", false);
848
+ console.log("display =>", keys, this.componentsData);
849
+ }
850
+ }
851
+ },
852
+ // 隐藏组件
853
+ hide(keys) {
854
+ if (!keys || keys.length === 0) return;
855
+ for (let i = 0; i < keys.length; i++) {
856
+ const key = keys[i];
857
+ if (this.componentsData[key]) {
858
+ // this.componentsData[key].options.hidden = true;
859
+ this.$set(this.componentsData[key].options, "hidden", true);
860
+ console.log("hide =>", keys, this.componentsData);
861
+ }
862
+ }
863
+ },
864
+ // 设置数据,仅支持修改当前组件节点下的数据
865
+ setData(obj) {
866
+ const keys = Object.keys(obj);
867
+ for (let i = 0; i < keys.length; i++) {
868
+ const arr = keys[i].split(".");
869
+ if (arr.length === 1) {
870
+ const key = keys[i];
871
+ const value = obj[key];
872
+ this.$set(this.models, key, value);
873
+ } else {
874
+ const key = arr.pop();
875
+ const value = obj[keys[i]];
876
+ const path = arr.join(".");
877
+ this.$set(eval(`this.models.${path}`), key, value);
878
+ }
879
+ }
880
+ },
881
+ // 获取数据,仅支持获取当前组件节点下的数据
882
+ getData() {
883
+ return this.models;
884
+ }
885
+ }
886
+ };
887
+ </script>