GenerateElementItem.vue 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201
  1. <template>
  2. <span :class="{'print-read-label': printRead}">
  3. <template v-if="widget.type == 'blank'">
  4. <div :style="{width: isTable ? '100%' : widget.options.width}">
  5. <slot :name="widget.model" :model="dataModels"></slot>
  6. </div>
  7. </template>
  8. <template v-if="widget.type == 'component'">
  9. <div :style="{width: isTable ? '100%' : widget.options.width}">
  10. <component :is="`component-${widget.key}-${key}`" :key="key" v-model="dataModel" :ref="'fm-'+widget.model"></component>
  11. </div>
  12. </template>
  13. <template v-if="widget.type == 'custom'">
  14. <div :style="{width: isTable ? '100%' : widget.options.width}">
  15. <component
  16. :is="widget.el"
  17. v-model="dataModel"
  18. :width="widget.options.width"
  19. :height="widget.options.height"
  20. :size="config.size"
  21. :placeholder="widget.options.placeholder"
  22. :readonly="widget.options.readonly"
  23. :disabled="elementDisabled"
  24. :editable="widget.options.editable"
  25. :clearable="widget.options.clearable"
  26. :ref="'fm-'+widget.model"
  27. :print-read="printRead"
  28. v-bind="{...widget.options.customProps, ...extendProps}"
  29. v-on="dynamicEvents"
  30. ></component>
  31. </div>
  32. </template>
  33. <template v-if="widget.type == 'input'" >
  34. <template v-if="printRead">
  35. <span>{{dataModel}}</span>
  36. </template>
  37. <template v-else>
  38. <template v-if="widget.options.showPassword" >
  39. <a-input-password
  40. :type="widget.options.dataTypeCheck ? widget.options.dataType : 'text'"
  41. v-model="dataModel"
  42. :disabled="elementDisabled"
  43. :placeholder="widget.options.placeholder"
  44. :style="{width: isTable ? '100%' : widget.options.width}"
  45. :ref="'fm-'+widget.model"
  46. :size="config.size"
  47. :allow-clear="widget.options.clearable"
  48. @focus="handleOnFocus"
  49. @blur="handleOnBlur"
  50. autocomplete="off"
  51. v-bind="{...widget.options.customProps, ...extendProps}"
  52. />
  53. </template>
  54. <template v-else>
  55. <a-input
  56. :type="widget.options.dataTypeCheck ? widget.options.dataType : 'text'"
  57. v-model="dataModel"
  58. :disabled="elementDisabled"
  59. :placeholder="widget.options.placeholder"
  60. :show-password="widget.options.showPassword"
  61. :size="config.size"
  62. :allow-clear="widget.options.clearable"
  63. :style="{width: isTable ? '100%' : widget.options.width}"
  64. :ref="'fm-'+widget.model"
  65. :maxLength="widget.options.maxlength ? Number(widget.options.maxlength) : null"
  66. :show-count="widget.options.showWordLimit"
  67. @focus="handleOnFocus"
  68. @blur="handleOnBlur"
  69. v-bind="{...widget.options.customProps, ...extendProps}"
  70. ></a-input>
  71. </template>
  72. </template>
  73. </template>
  74. <template v-if="widget.type == 'textarea'">
  75. <template v-if="printRead">
  76. <pre>{{dataModel}}</pre>
  77. </template>
  78. <template v-else>
  79. <a-input type="textarea" :rows="widget.options.rows"
  80. v-model="dataModel"
  81. :disabled="elementDisabled"
  82. :placeholder="widget.options.placeholder"
  83. :style="{width: isTable ? '100%' : widget.options.width}"
  84. :ref="'fm-'+widget.model"
  85. :allow-clear="widget.options.clearable"
  86. :size="config.size"
  87. :maxLength="widget.options.maxlength ? Number(widget.options.maxlength) : null"
  88. :show-count="widget.options.showWordLimit"
  89. :autoSize="widget.options.autosize"
  90. @focus="handleOnFocus"
  91. @blur="handleOnBlur"
  92. v-bind="{...widget.options.customProps, ...extendProps}"
  93. ></a-input>
  94. </template>
  95. </template>
  96. <template v-if="widget.type == 'number'">
  97. <template v-if="printRead">
  98. <span>{{dataModel.toFixed(widget.options.precision)}}</span>
  99. </template>
  100. <template v-else>
  101. <a-input-number
  102. v-model="dataModel"
  103. :style="{width: isTable ? '100%' : widget.options.width}"
  104. :step="widget.options.step"
  105. :disabled="elementDisabled"
  106. :min="widget.options.min"
  107. :max="widget.options.max"
  108. :controls-position="widget.options.controlsPosition"
  109. :precision="widget.options.precision"
  110. :controls="widget.options.controls"
  111. :ref="'fm-'+widget.model"
  112. :size="config.size"
  113. @focus="handleOnFocus"
  114. @blur="handleOnBlur"
  115. v-bind="{...widget.options.customProps, ...extendProps}"
  116. ></a-input-number>
  117. </template>
  118. </template>
  119. <template v-if="widget.type == 'radio'">
  120. <template v-if="printRead">
  121. <template v-if="widget.options.remote">
  122. {{
  123. remoteOptions.find(item => item.value == dataModel)
  124. && remoteOptions.find(item => item.value == dataModel).label
  125. }}
  126. </template>
  127. <template v-else>
  128. {{
  129. widget.options.showLabel ?
  130. (remoteOptions.find(item => item.value == dataModel) && remoteOptions.find(item => item.value == dataModel).label) :
  131. dataModel
  132. }}
  133. </template>
  134. </template>
  135. <template v-else>
  136. <a-radio-group v-model="dataModel"
  137. :style="{width: isTable ? '100%' : widget.options.width}"
  138. :disabled="elementDisabled"
  139. :ref="'fm-'+widget.model"
  140. :size="config.size"
  141. v-bind="{...widget.options.customProps, ...extendProps}"
  142. >
  143. <a-radio
  144. style="line-height: 30px;"
  145. :style="{display: widget.options.inline ? 'inline-block' : 'block'}"
  146. :value="item.value" v-for="(item, index) in remoteOptions" :key="index"
  147. >
  148. <template v-if="widget.options.remote">{{item.label}}</template>
  149. <template v-else>{{widget.options.showLabel ? item.label : item.value}}</template>
  150. </a-radio>
  151. </a-radio-group>
  152. </template>
  153. </template>
  154. <template v-if="widget.type == 'checkbox'">
  155. <template v-if="printRead">
  156. <template v-if="widget.options.remote">
  157. {{
  158. dataModel.map(dm =>
  159. remoteOptions.find(item => item.value == dm)
  160. && remoteOptions.find(item => item.value == dm).label
  161. ).join('、')
  162. }}
  163. </template>
  164. <template v-else>
  165. {{
  166. widget.options.showLabel ?
  167. dataModel.map(dm => remoteOptions.find(item => item.value == dm) && remoteOptions.find(item => item.value == dm).label).join('、') :
  168. dataModel.join('、')
  169. }}
  170. </template>
  171. </template>
  172. <template v-else>
  173. <a-checkbox-group v-model="dataModel"
  174. :style="{width: isTable ? '100%' : widget.options.width}"
  175. :disabled="elementDisabled"
  176. :ref="'fm-'+widget.model"
  177. :size="config.size"
  178. v-bind="{...widget.options.customProps, ...extendProps}"
  179. >
  180. <a-checkbox
  181. :style="{display: widget.options.inline ? 'inline-block' : 'block'}"
  182. :value="item.value" v-for="(item, index) in remoteOptions" :key="index"
  183. >
  184. <template v-if="widget.options.remote">{{item.label}}</template>
  185. <template v-else>{{widget.options.showLabel ? item.label : item.value}}</template>
  186. </a-checkbox>
  187. </a-checkbox-group>
  188. </template>
  189. </template>
  190. <template v-if="widget.type == 'time'">
  191. <template v-if="printRead">
  192. {{dataModel}}
  193. </template>
  194. <template v-else>
  195. <a-time-picker
  196. v-model="dataModel"
  197. :is-range="widget.options.isRange"
  198. :placeholder="widget.options.placeholder"
  199. :start-placeholder="widget.options.startPlaceholder"
  200. :end-placeholder="widget.options.endPlaceholder"
  201. :readonly="widget.options.readonly"
  202. :disabled="elementDisabled"
  203. :inputReadOnly="!widget.options.editable"
  204. :clearable="widget.options.clearable"
  205. :arrowControl="widget.options.arrowControl"
  206. :value-format="widget.options.format"
  207. :format="widget.options.format"
  208. :style="{width: isTable ? '100%' : widget.options.width}"
  209. :ref="'fm-'+widget.model"
  210. :size="config.size"
  211. @focus="handleOnFocus"
  212. @blur="handleOnBlur"
  213. popupClassName="fm-popup-index"
  214. v-bind="{...widget.options.customProps, ...extendProps}"
  215. >
  216. </a-time-picker>
  217. </template>
  218. </template>
  219. <template v-if="widget.type=='date'">
  220. <template v-if="printRead">
  221. {{
  222. widget.options.type == 'dates' ?
  223. dataModel.join('、') :
  224. typeof dataModel == 'object' ? dataModel.join(' ~ ') : dataModel
  225. }}
  226. </template>
  227. <template v-else>
  228. <a-date-picker
  229. v-model="dataModel"
  230. :type="widget.options.type"
  231. :placeholder="widget.options.placeholder"
  232. :start-placeholder="widget.options.startPlaceholder"
  233. :end-placeholder="widget.options.endPlaceholder"
  234. :readonly="widget.options.readonly"
  235. :disabled="elementDisabled"
  236. :inputReadOnly="!widget.options.editable"
  237. :clearable="widget.options.clearable"
  238. :value-format="widget.options.timestamp ? 'timestamp' : widget.options.format"
  239. :format="widget.options.format"
  240. :style="{width: isTable ? '100%' : widget.options.width}"
  241. :ref="'fm-'+widget.model"
  242. :size="config.size"
  243. @focus="handleOnFocus"
  244. @blur="handleOnBlur"
  245. :show-time="widget.options.type == 'datetime' ? {format: widget.options.format} : false"
  246. v-if="widget.options.type == 'date' || widget.options.type == 'datetime'"
  247. dropdownClassName="fm-popup-index"
  248. v-bind="{...widget.options.customProps, ...extendProps}"
  249. >
  250. </a-date-picker>
  251. <a-month-picker
  252. v-model="dataModel"
  253. :type="widget.options.type"
  254. :mode="widget.options.type"
  255. :placeholder="widget.options.placeholder"
  256. :start-placeholder="widget.options.startPlaceholder"
  257. :end-placeholder="widget.options.endPlaceholder"
  258. :readonly="widget.options.readonly"
  259. :disabled="elementDisabled"
  260. :inputReadOnly="!widget.options.editable"
  261. :clearable="widget.options.clearable"
  262. :value-format="widget.options.timestamp ? 'timestamp' : widget.options.format"
  263. :format="widget.options.format"
  264. :style="{width: isTable ? '100%' : widget.options.width}"
  265. :ref="'fm-'+widget.model"
  266. :size="config.size"
  267. @focus="handleOnFocus"
  268. @blur="handleOnBlur"
  269. v-if="widget.options.type == 'month'"
  270. dropdownClassName="fm-popup-index"
  271. v-bind="{...widget.options.customProps, ...extendProps}"
  272. >
  273. </a-month-picker>
  274. <a-week-picker
  275. v-model="dataModel"
  276. :type="widget.options.type"
  277. :mode="widget.options.type"
  278. :placeholder="widget.options.placeholder"
  279. :start-placeholder="widget.options.startPlaceholder"
  280. :end-placeholder="widget.options.endPlaceholder"
  281. :readonly="widget.options.readonly"
  282. :disabled="elementDisabled"
  283. :inputReadOnly="!widget.options.editable"
  284. :clearable="widget.options.clearable"
  285. :value-format="widget.options.timestamp ? 'timestamp' : widget.options.format"
  286. :format="widget.options.format"
  287. :style="{width: isTable ? '100%' : widget.options.width}"
  288. :ref="'fm-'+widget.model"
  289. :size="config.size"
  290. @focus="handleOnFocus"
  291. @blur="handleOnBlur"
  292. v-if="widget.options.type == 'week'"
  293. dropdownClassName="fm-popup-index"
  294. v-bind="{...widget.options.customProps, ...extendProps}"
  295. >
  296. </a-week-picker>
  297. <a-range-picker
  298. v-model="dataModel"
  299. :placeholder="[widget.options.startPlaceholder, widget.options.endPlaceholder]"
  300. :readonly="widget.options.readonly"
  301. :disabled="elementDisabled"
  302. :inputReadOnly="!widget.options.editable"
  303. :clearable="widget.options.clearable"
  304. :value-format="widget.options.timestamp ? 'timestamp' : widget.options.format"
  305. :format="widget.options.format"
  306. :style="{width: isTable ? '100%' : widget.options.width}"
  307. :ref="'fm-'+widget.model"
  308. :size="config.size"
  309. @focus="handleOnFocus"
  310. @blur="handleOnBlur"
  311. :show-time="widget.options.type == 'datetimerange' ? {format: widget.options.format} : false"
  312. v-if="widget.options.type == 'daterange' || widget.options.type == 'datetimerange'"
  313. dropdownClassName="fm-popup-index"
  314. v-bind="{...widget.options.customProps, ...extendProps}"
  315. >
  316. </a-range-picker>
  317. </template>
  318. </template>
  319. <template v-if="widget.type =='rate'">
  320. <template v-if="printRead">
  321. {{dataModel}}
  322. </template>
  323. <template v-else>
  324. <a-rate v-model="dataModel"
  325. :max="widget.options.max"
  326. :count="widget.options.max"
  327. :disabled="elementDisabled"
  328. :allow-half="widget.options.allowHalf"
  329. :show-score="widget.options.showScore"
  330. :ref="'fm-'+widget.model"
  331. :size="config.size"
  332. :style="{width: isTable ? '100%' : widget.options.width}"
  333. v-bind="{...widget.options.customProps, ...extendProps}"
  334. ></a-rate>
  335. </template>
  336. </template>
  337. <template v-if="widget.type == 'color'">
  338. <div :style="{width: isTable ? '100%' : widget.options.width, color: '#999'}">
  339. Not currently supported.
  340. </div>
  341. </template>
  342. <template v-if="widget.type == 'select'||widget.type == 'userSelect'||widget.type == 'deptSelect'">
  343. <template v-if="printRead">
  344. <template v-if="widget.options.remote">
  345. {{
  346. typeof dataModel == 'object' ?
  347. (dataModel.map(dm => remoteOptions.find(item => item.value == dm)
  348. && remoteOptions.find(item => item.value == dm).label).join('、'))
  349. : (remoteOptions.find(item => item.value == dataModel)
  350. && remoteOptions.find(item => item.value == dataModel).label)
  351. }}
  352. </template>
  353. <template v-else>
  354. {{
  355. widget.options.showLabel ?
  356. (
  357. typeof dataModel == 'object' ?
  358. dataModel.map(dm => remoteOptions.find(item => item.value == dm) && remoteOptions.find(item => item.value == dm).label).join('、')
  359. : (remoteOptions.find(item => item.value == dataModel) && remoteOptions.find(item => item.value == dataModel).label)
  360. ) :
  361. typeof dataModel == 'object' ? dataModel.join('、') : dataModel
  362. }}
  363. </template>
  364. </template>
  365. <template v-else>
  366. <a-select
  367. v-model="dataModel"
  368. :disabled="elementDisabled"
  369. :mode="widget.options.multiple ? 'multiple' : 'default'"
  370. :allow-clear="widget.options.clearable"
  371. :placeholder="widget.options.placeholder"
  372. :style="{width: isTable ? '100%' : widget.options.width}"
  373. :show-search="widget.options.filterable"
  374. option-filter-prop="children"
  375. :ref="'fm-'+widget.model"
  376. :size="config.size"
  377. @focus="handleOnFocus"
  378. @blur="handleOnBlur"
  379. dropdownClassName="fm-select-dropdown"
  380. v-bind="{...widget.options.customProps, ...extendProps}"
  381. >
  382. <a-select-option v-for="item in remoteOptions" :key="item.value" :value="item.value">
  383. {{widget.options.showLabel || widget.options.remote?item.label:item.value}}
  384. </a-select-option>
  385. </a-select>
  386. </template>
  387. </template>
  388. <template v-if="widget.type=='switch'">
  389. <template v-if="printRead">
  390. {{dataModel}}
  391. </template>
  392. <template v-else>
  393. <a-switch
  394. v-model="dataModel"
  395. :default-checked="dataModel"
  396. :disabled="elementDisabled"
  397. :ref="'fm-'+widget.model"
  398. :size="config.size"
  399. v-bind="{...widget.options.customProps, ...extendProps}"
  400. >
  401. </a-switch>
  402. </template>
  403. </template>
  404. <template v-if="widget.type=='slider'">
  405. <template v-if="printRead">
  406. {{dataModel}}
  407. </template>
  408. <template v-else>
  409. <a-slider
  410. v-model="dataModel"
  411. :min="widget.options.min"
  412. :max="widget.options.max"
  413. :disabled="elementDisabled"
  414. :step="widget.options.step"
  415. :show-input="widget.options.showInput"
  416. :range="widget.options.range"
  417. :style="{width: isTable ? '100%' : widget.options.width}"
  418. :ref="'fm-'+widget.model"
  419. :size="config.size"
  420. v-bind="{...widget.options.customProps, ...extendProps}"
  421. ></a-slider>
  422. </template>
  423. </template>
  424. <template v-if="widget.type=='imgupload'">
  425. <fm-upload
  426. v-model="dataModel"
  427. :disabled="elementDisabled"
  428. :readonly="widget.options.readonly || printRead"
  429. :style="{'width': isTable ? '100%' : widget.options.width}"
  430. :width="widget.options.size.width"
  431. :height="widget.options.size.height"
  432. :token="remoteToken"
  433. :domain="widget.options.domain"
  434. :multiple="widget.options.multiple"
  435. :limit="widget.options.limit"
  436. :is-qiniu="widget.options.isQiniu"
  437. :is-delete="widget.options.isDelete"
  438. :min="widget.options.min"
  439. :is-edit="widget.options.isEdit"
  440. :action="widget.options.action"
  441. ui="antd"
  442. :headers="widget.options.headers || []"
  443. :ref="'fm-'+widget.model"
  444. :withCredentials="widget.options.withCredentials"
  445. @on-upload-success="handleOnUploadSuccess"
  446. @on-upload-error="handleOnUploadError"
  447. @on-upload-remove="handleOnUploadRemove"
  448. @on-upload-progress="handleOnUploadProgress"
  449. :print-read="printRead"
  450. :on-select="handleOnUploadSelect"
  451. :size="config.size"
  452. >
  453. </fm-upload>
  454. </template>
  455. <template v-if="widget.type == 'editor'">
  456. <template v-if="printRead">
  457. <div v-html="dataModel" class="ql-editor"></div>
  458. </template>
  459. <template v-else>
  460. <fm-editor
  461. v-model="dataModel"
  462. :sty="{width: isTable ? '100%' : widget.options.width, cursor: (elementDisabled) ? 'no-drop' : '', backgroundColor: (elementDisabled) ? '#F5F7FA' : ''}"
  463. :toolbar="widget.options.customToolbar"
  464. :disabled="elementDisabled"
  465. ui="antd"
  466. :ref="'fm-'+widget.model"
  467. :size="config.size"
  468. >
  469. </fm-editor>
  470. </template>
  471. </template>
  472. <template v-if="widget.type == 'cascader'||widget.type=='deptAndUserCascader' || widget.type=='deptCascader'">
  473. <template v-if="printRead">
  474. <template v-if="widget.options.remote">
  475. {{
  476. getCascaderText([...dataModel], remoteOptions).join(' / ')
  477. }}
  478. </template>
  479. <template v-else>
  480. {{
  481. getCascaderText([...dataModel], remoteOptions).join(' / ')
  482. }}
  483. </template>
  484. </template>
  485. <template v-else>
  486. <a-cascader
  487. v-model="dataModel"
  488. :disabled="elementDisabled"
  489. :allow-clear="widget.options.clearable"
  490. :placeholder="widget.options.placeholder"
  491. :style="{width: isTable ? '100%' : widget.options.width}"
  492. :options="remoteOptions"
  493. :ref="'fm-'+widget.model"
  494. @focus="handleOnFocus"
  495. @blur="handleOnBlur"
  496. :showSearch="widget.options.filterable"
  497. :change-on-select="widget.options.checkStrictly"
  498. :size="config.size"
  499. dropdownClassName="fm-popup-index"
  500. v-bind="{...widget.options.customProps, ...extendProps}"
  501. >
  502. </a-cascader>
  503. </template>
  504. </template>
  505. <template v-if="widget.type == 'text'">
  506. <span :ref="'fm-'+widget.model" :style="{width: isTable ? '100%' : (widget.options.width || '100%'), display: 'inline-block'}">{{dataModel}}</span>
  507. </template>
  508. <template v-if="widget.type == 'html'">
  509. <span v-html="dataModel" :ref="'fm-'+widget.model" :style="{width: isTable ? '100%' : (widget.options.width || '100%'), display: 'inline-block'}"></span>
  510. </template>
  511. <template v-if="widget.type == 'table'">
  512. <fm-form-table
  513. v-model="dataModel"
  514. :columns="widget.tableColumns"
  515. :models="dataModels"
  516. :remote="remote"
  517. :blanks="blanks"
  518. :disableddata="elementDisabled || printRead"
  519. :rules="rules"
  520. :name="widget.model"
  521. :remote-option="remoteOption"
  522. :ref="'fm-'+widget.model"
  523. :preview="preview"
  524. :platform="platform"
  525. :data-source-value="dataSourceValue"
  526. :event-function="eventFunction"
  527. :widget="widget"
  528. :container-key="containerKey"
  529. :print-read="printRead"
  530. :paging="widget.options.paging"
  531. :page-size="widget.options.pageSize"
  532. :config="config"
  533. :is-add="widget.options.isAdd ?? true"
  534. :is-delete="widget.options.isDelete ?? true"
  535. :show-control="widget.options.showControl ?? true"
  536. :is-dialog="isDialog"
  537. :dialog-name="dialogName"
  538. :is-group="isGroup"
  539. :group="group"
  540. :field-node="fieldNode"
  541. >
  542. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  543. <slot :name="blank.name" :model="scope.model"></slot>
  544. </template>
  545. </fm-form-table>
  546. </template>
  547. <template v-if="widget.type == 'subform'">
  548. <fm-sub-form
  549. v-model="dataModel"
  550. :list="widget.list"
  551. :models="dataModels"
  552. :remote="remote"
  553. :blanks="blanks"
  554. :disableddata="elementDisabled || printRead"
  555. :rules="rules"
  556. :name="widget.model"
  557. :remote-option="remoteOption"
  558. :ref="'fm-'+widget.model"
  559. :preview="preview"
  560. :platform="platform"
  561. :data-source-value="dataSourceValue"
  562. :event-function="eventFunction"
  563. :widget="widget"
  564. :print-read="printRead"
  565. :paging="widget.options.paging"
  566. :page-size="widget.options.pageSize"
  567. :config="config"
  568. :container-key="containerKey"
  569. :show-control="widget.options.showControl"
  570. :is-delete="widget.options.isDelete ?? true"
  571. :is-add="widget.options.isAdd ?? true"
  572. :is-dialog="isDialog"
  573. :dialog-name="dialogName"
  574. :is-group="isGroup"
  575. :group="group"
  576. :field-node="fieldNode"
  577. >
  578. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  579. <slot :name="blank.name" :model="scope.model"></slot>
  580. </template>
  581. </fm-sub-form>
  582. </template>
  583. <template v-if="widget.type == 'group'">
  584. <fm-group
  585. v-model="dataModel"
  586. :rules="rules"
  587. :element="widget"
  588. :remote="remote"
  589. :blanks="blanks"
  590. :edit="!elementDisabled"
  591. :remote-option="remoteOption"
  592. :platform="platform"
  593. :preview="preview"
  594. :container-key="containerKey"
  595. :data-source-value="dataSourceValue"
  596. :event-function="eventFunction"
  597. :print-read="printRead"
  598. :ref="'fm-'+widget.model"
  599. :is-group="isGroup"
  600. :group="group"
  601. :field-node="fieldNode"
  602. :config="config"
  603. >
  604. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  605. <slot :name="blank.name" :model="scope.model"></slot>
  606. </template>
  607. </fm-group>
  608. </template>
  609. <template v-if="widget.type == 'fileupload'">
  610. <fm-file-upload
  611. v-model="dataModel"
  612. :disabled="elementDisabled"
  613. :style="{'width': isTable ? '100%' : widget.options.width}"
  614. :token="remoteToken"
  615. :domain="widget.options.domain"
  616. :multiple="widget.options.multiple"
  617. :limit="widget.options.limit"
  618. :is-qiniu="widget.options.isQiniu"
  619. :min="widget.options.min"
  620. :action="widget.options.action"
  621. ui="antd"
  622. :headers="widget.options.headers || []"
  623. :ref="'fm-'+widget.model"
  624. :withCredentials="widget.options.withCredentials"
  625. :print-read="printRead"
  626. @on-upload-success="handleOnUploadSuccess"
  627. @on-upload-error="handleOnUploadError"
  628. @on-upload-remove="handleOnUploadRemove"
  629. @on-upload-progress="handleOnUploadProgress"
  630. :on-select="handleOnUploadSelect"
  631. :size="config.size"
  632. :accept="widget.options.accept"
  633. >
  634. </fm-file-upload>
  635. </template>
  636. <template v-if="widget.type == 'button'">
  637. <a-button
  638. :disabled="elementDisabled"
  639. :size="config.size"
  640. :type="widget.options.buttonType == 'text' ? 'link' : widget.options.buttonType"
  641. :shape="widget.options.buttonCircle ? 'circle' : (widget.options.buttonRound ? 'round' : null)"
  642. :ghost="widget.options.buttonPlain"
  643. :style="{width: widget.options.width}"
  644. :ref="'fm-'+widget.model"
  645. @click="handleOnClick"
  646. v-bind="{...widget.options.customProps, ...extendProps}"
  647. >{{widget.options.buttonName}}
  648. </a-button>
  649. </template>
  650. <template v-if="widget.type == 'link'">
  651. <div :style="{width: isTable ? '100%' : widget.options.width, color: '#999'}">
  652. Not currently supported.
  653. </div>
  654. </template>
  655. <template v-if="widget.type == 'steps'">
  656. <a-steps :current="dataModel"
  657. :ref="'fm-'+widget.model"
  658. :space="widget.options.space"
  659. :direction="widget.options.direction"
  660. :status="widget.options.processStatus"
  661. :style="{'line-height': 'normal'}"
  662. v-bind="{...widget.options.customProps, ...extendProps}"
  663. >
  664. <a-step
  665. :title="item.title"
  666. :description="item.description"
  667. v-for="(item, index) in remoteOptions" :key="index"></a-step>
  668. </a-steps>
  669. </template>
  670. <template v-if="widget.type == 'pagination'">
  671. <template v-if="printRead">
  672. Page {{dataModel}}
  673. </template>
  674. <template v-else>
  675. <a-pagination
  676. v-model="dataModel"
  677. :page-size="widget.options.pageSize"
  678. :pager-count="widget.options.pagerCount"
  679. :disabled="widget.options.disabled"
  680. :background="widget.options.background"
  681. :total="widget.options.total"
  682. :show-total="total => `${$t('fm.config.widget.total')} ${total}`"
  683. show-less-items
  684. :show-size-changer="false"
  685. :size="widget.options.background ? '' : 'small'"
  686. :ref="'fm-'+widget.model"
  687. v-bind="{...widget.options.customProps, ...extendProps}"
  688. />
  689. </template>
  690. </template>
  691. <template v-if="widget.type == 'transfer'">
  692. <template v-if="printRead">
  693. <template v-if="widget.options.remote">
  694. {{
  695. dataModel.map(dm => widget.options.remoteOptions.find(item =>
  696. item.key == dm)?.title).join('、')
  697. }}
  698. </template>
  699. <template v-else>
  700. {{
  701. dataModel.map(dm => remoteOptions.find(item =>
  702. item.key == dm)?.label).join('、')
  703. }}
  704. </template>
  705. </template>
  706. <template v-else>
  707. <a-transfer
  708. :targetKeys="dataModel"
  709. :disabled="elementDisabled"
  710. :dataSource="widget.options.remote ? remoteOptions : dataOnly"
  711. :render="item => `${item.title}`"
  712. :showSearch="widget.options.filterable"
  713. :titles="widget.options.titles"
  714. :style="{width: isTable ? '100%' : widget.options.width}"
  715. :ref="'fm-'+widget.model"
  716. @change="handleTransferChange"
  717. v-bind="{...widget.options.customProps, ...extendProps}"
  718. ></a-transfer>
  719. </template>
  720. </template>
  721. </span>
  722. </template>
  723. <script>
  724. import FmUpload from '../Upload'
  725. import FmFormTable from './FormTable'
  726. import FmFileUpload from '../Upload/file'
  727. import FmEditor from '../Editor'
  728. import FmSubForm from './SubForm.vue'
  729. import Vue from 'vue'
  730. import { EventBus } from '../../util/event-bus'
  731. import FmGroup from './GenerateGroup.vue'
  732. import {executeExpression, isExpression, extractExpression} from '../../util/expression'
  733. import _ from 'lodash'
  734. export default {
  735. name: 'generate-element-item',
  736. components: {
  737. FmUpload,
  738. FmFormTable,
  739. FmFileUpload,
  740. FmEditor,
  741. FmSubForm,
  742. FmGroup
  743. },
  744. props: ['config', 'widget', 'value', 'models', 'remote', 'isTable', 'blanks', 'disabled', 'edit', 'remoteOption', 'rules', 'platform', 'preview', 'dataSourceValue', 'eventFunction', 'rowIndex', 'tableName', 'containerKey', 'printRead', 'isMobile', 'isSubform', 'subName', 'isDialog', 'dialogName', 'group', 'fieldNode', 'isGroup', 'formItemComponent'],
  745. data () {
  746. return {
  747. dataModel: this.value,
  748. dataModels: this.models,
  749. key: new Date().getTime(),
  750. modelName: this.widget.model,
  751. remoteOptions: [],
  752. dynamicEvents: this.handleOnDynamicEvent(),
  753. dataOnly : this.widget.options?.data?.map(item => ({...item, title: item.label})),
  754. generateDisabled: undefined,
  755. remoteToken: ''
  756. }
  757. },
  758. computed: {
  759. elementDisabled () {
  760. let currentDisabled = this.widget.options.disabled
  761. if (isExpression(this.widget.options.disabled)) {
  762. currentDisabled = executeExpression(extractExpression(this.widget.options.disabled), this.currentOptions, this.formContext)
  763. }
  764. if (typeof this.generateDisabled === 'boolean') {
  765. return !this.edit || this.generateDisabled
  766. } else {
  767. return !this.edit || Boolean(currentDisabled)
  768. }
  769. },
  770. currentOptions () {
  771. if (this.isTable || this.isSubform) {
  772. return {
  773. value: this.dataModel,
  774. fieldNode: this.fieldNode,
  775. currentRef: this.$refs['fm-'+this.widget.model],
  776. rowIndex: this.rowIndex,
  777. row: _.cloneDeep(this.models),
  778. field: this.widget.model,
  779. group: this.group
  780. }
  781. } else {
  782. return {
  783. value: this.dataModel,
  784. fieldNode: this.fieldNode,
  785. currentRef: this.$refs['fm-'+this.widget.model],
  786. field: this.widget.model,
  787. group: this.group
  788. }
  789. }
  790. },
  791. extendProps () {
  792. let obj = {}
  793. this.widget.options.extendProps && Object.keys(this.widget.options.extendProps).forEach(key => {
  794. let value = this.widget.options.extendProps[key]
  795. if (!isExpression(value)) {
  796. obj[key] = value
  797. } else {
  798. obj[key] = executeExpression(extractExpression(value), this.currentOptions, this.formContext)
  799. }
  800. })
  801. return obj
  802. },
  803. groupNode () {
  804. return this.group ? this.group + '.' + this.widget.model : this.widget.model
  805. }
  806. },
  807. inject: ['generateComponentInstance', 'deleteComponentInstance', 'eventScriptConfig', 'dynamicValueData', 'formContext', 'sendRequest'],
  808. created () {
  809. if (!this.widget.options.remote) {
  810. if (this.widget.type == 'steps') {
  811. this.loadOptions(this.widget.options.steps)
  812. } else if (this.widget.type == 'transfer') {
  813. this.loadOptions(this.widget.options.data)
  814. } else {
  815. this.loadOptions(this.widget.options.options)
  816. }
  817. }
  818. if (this.widget.options.remote
  819. && (Object.keys(this.widget.options).indexOf('remoteType') >= 0 ? this.widget.options.remoteType == 'func' : true)
  820. && this.remote[this.widget.options.remoteFunc]) {
  821. this.remote[this.widget.options.remoteFunc]((data) => {
  822. this.loadOptions(data)
  823. })
  824. }
  825. if (this.widget.options.remote
  826. && this.widget.options.remoteType == 'option'
  827. && this.remoteOption[this.widget.options.remoteOption]) {
  828. this.loadOptions(this.remoteOption[this.widget.options.remoteOption])
  829. }
  830. if (this.widget.options.remote
  831. && this.widget.options.remoteType == 'datasource'
  832. && this.dataSourceValue) {
  833. let options = this.getDataSourceOptions()
  834. options && options.value && this.loadOptions(options.value)
  835. }
  836. if ((this.widget.type === 'imgupload' || this.widget.type === 'fileupload') && this.widget.options.isQiniu) {
  837. this.loadUploadConfig()
  838. }
  839. if (this.widget.options.remote && this.widget.options.remoteType == 'fx' ) {
  840. let options = executeExpression(this.widget.options.remoteFx, {}, this.formContext)
  841. options && this.loadOptions(options)
  842. }
  843. if (this.widget.type == 'component') {
  844. const _pthis = this
  845. Vue.component(`component-${this.widget.key}-${this.key}`, {
  846. template: `${this.widget.options.template}`,
  847. props: ['value'],
  848. data: () => ({
  849. dataModel: this.value,
  850. formState: this.formContext
  851. }),
  852. watch: {
  853. dataModel (val) {
  854. if (this.ui == 'antd') {
  855. EventBus.$emit('on-field-change', this.$attrs.id, val)
  856. } else {
  857. this.$emit('input', val)
  858. }
  859. },
  860. value (val) {
  861. this.dataModel = val
  862. }
  863. },
  864. methods: {
  865. triggerEvent (eventName, arg) {
  866. if (_pthis.eventScriptConfig()) {
  867. let currentEventScript = _pthis.eventScriptConfig().find(item => item.name == eventName)
  868. if (currentEventScript) {
  869. _pthis.eventFunction[currentEventScript.key]({
  870. ..._pthis.currentOptions,
  871. $eventArgs: arg})
  872. }
  873. }
  874. }
  875. }
  876. })
  877. }
  878. },
  879. mounted () {
  880. this.generateComponentInstance && this.generateComponentInstance(
  881. this.fieldNode,
  882. this.$refs['fm-'+this.widget.model]
  883. )
  884. this.handleOnMounted()
  885. },
  886. beforeDestroy () {
  887. this.deleteComponentInstance && this.deleteComponentInstance(this.fieldNode)
  888. },
  889. methods: {
  890. handleOnDynamicEvent () {
  891. let currentEvents = {}
  892. for (let i in this.widget.events) {
  893. console.log('i', i)
  894. let funcKey = this.widget.events[i]
  895. funcKey && (
  896. currentEvents[i] = this.callbackDynamicFunc(funcKey)
  897. )
  898. }
  899. return currentEvents
  900. },
  901. callbackDynamicFunc (funcKey) {
  902. let callback = (...arg) => {
  903. this.eventFunction[funcKey]({
  904. ...this.currentOptions,
  905. $eventArgs: arg})
  906. }
  907. return callback
  908. },
  909. refreshOptionData (args) {
  910. return new Promise((resolve, reject) => {
  911. if (this.widget.options.remote && this.widget.options.remoteType === 'fx' && this.widget.options.remoteFx) {
  912. let value = executeExpression(this.widget.options.remoteFx, this.currentOptions, this.formContext)
  913. if (value !== null) {
  914. this.loadOptions(value)
  915. }
  916. resolve(value)
  917. }
  918. if (this.widget.options.remote && this.widget.options.remoteType === 'datasource' && this.widget.options.remoteDataSource) {
  919. let curArgs = typeof this.widget.options.remoteArgs === 'string' ? {} : {...this.widget.options.remoteArgs}
  920. for (let key in curArgs) {
  921. if (isExpression(curArgs[key])) {
  922. curArgs[key] = executeExpression(extractExpression(curArgs[key]), this.currentOptions, this.formContext)
  923. }
  924. }
  925. if (args && typeof args === 'object') {
  926. curArgs = {...curArgs, ...args}
  927. }
  928. let key = this.group ? this.group + '.' + this.widget.model + '.' + this.widget.options.remoteDataSource
  929. : this.widget.model + '.' + this.widget.options.remoteDataSource
  930. let sourceValue = this.dataSourceValue.find(item => item.key === key && _.isEqual(item.args, curArgs))
  931. if (sourceValue) {
  932. this.loadOptions(sourceValue.value)
  933. resolve(sourceValue.value)
  934. } else {
  935. this.sendRequest(this.widget.options.remoteDataSource, curArgs).then(resData => {
  936. this.loadOptions(resData)
  937. resolve(resData)
  938. }).catch(e => {
  939. reject(e)
  940. })
  941. }
  942. }
  943. })
  944. },
  945. loadOptions (data) {
  946. console.log(data,'======');
  947. if (!Array.isArray(data)) return
  948. this.remoteOptions = data.map(item => {
  949. if (this.widget.options.props.children && this.widget.options.props.children.length && Object.keys(item).includes(this.widget.options.props.children)) {
  950. return {
  951. value: item[this.widget.options.props.value],
  952. label: item[this.widget.options.props.label],
  953. children: this.processRemoteProps(item[this.widget.options.props.children], this.widget.options.props)
  954. }
  955. } else {
  956. if (this.widget.type == 'steps') {
  957. return {
  958. title: item[this.widget.options.props.title],
  959. description: item[this.widget.options.props.description]
  960. }
  961. } else if (this.widget.type == 'transfer') {
  962. return {
  963. key: item[this.widget.options.props.key] + '',
  964. title: item[this.widget.options.props.label],
  965. disabled: item[this.widget.options.props.disabled]
  966. }
  967. } else {
  968. return {
  969. value: item[this.widget.options.props.value],
  970. label: item[this.widget.options.props.label]
  971. }
  972. }
  973. }
  974. })
  975. },
  976. getOptions () {
  977. console.log(11111);
  978. return JSON.parse(JSON.stringify(this.remoteOptions))
  979. },
  980. processRemoteProps (children, props) {
  981. if (children && children.length) {
  982. return children.map(item => {
  983. if (this.processRemoteProps(item[props.children], props).length) {
  984. return {
  985. value: item[props.value],
  986. label: item[props.label],
  987. children: this.processRemoteProps(item[props.children], props)
  988. }
  989. } else{
  990. return {
  991. value: item[props.value],
  992. label: item[props.label],
  993. }
  994. }
  995. })
  996. } else {
  997. return []
  998. }
  999. },
  1000. loadUploadConfig () {
  1001. if (this.widget.options.tokenType === 'func') {
  1002. !this.widget.options.token && this.remote[this.widget.options.tokenFunc]((data) => {
  1003. this.remoteToken = data
  1004. })
  1005. } else if (this.widget.options.tokenType === 'fx') {
  1006. let token = executeExpression(this.widget.options.tokenFx, this.currentOptions, this.formContext)
  1007. token && (this.remoteToken = token)
  1008. } else {
  1009. if (this.dataSourceValue) {
  1010. let token = this.getDataSourceOptions('tokenDataSource')
  1011. token && token.value && (this.remoteToken= token.value)
  1012. }
  1013. }
  1014. },
  1015. handleOnMounted () {
  1016. this.execFunction('onMounted', {})
  1017. },
  1018. handleOnClick () {
  1019. this.execFunction('onClick', {})
  1020. },
  1021. handleOnFocus () {
  1022. this.execFunction('onFocus', {})
  1023. },
  1024. handleOnBlur () {
  1025. EventBus.$emit('on-validate-' + this.containerKey, this.fieldNode, this.containerKey)
  1026. this.execFunction('onBlur', {})
  1027. },
  1028. handleOnUploadSelect (file) {
  1029. return this.execFunction('onSelect', {file: file})
  1030. },
  1031. handleOnUploadSuccess (file) {
  1032. this.execFunction('onUploadSuccess', {file: file})
  1033. },
  1034. handleOnUploadError (file) {
  1035. this.execFunction('onUploadError', {file: file})
  1036. },
  1037. handleOnUploadProgress (file) {
  1038. this.execFunction('onUploadProgress', {file: file})
  1039. },
  1040. handleOnUploadRemove (file) {
  1041. this.execFunction('onRemove', {file: file})
  1042. },
  1043. execFunction (method, arg) {
  1044. console.log(method, arg,'=======method, arg');
  1045. if (this.widget.events && this.widget.events[method]) {
  1046. let funcKey = this.widget.events[method]
  1047. return this.eventFunction[funcKey]({
  1048. ...this.currentOptions,
  1049. ...arg,
  1050. })
  1051. }
  1052. },
  1053. getCascaderText (value, options, texts = []) {
  1054. if (value.length >= 1) {
  1055. let currentOpt = options?.find(opt => opt.value == value[0])
  1056. if (currentOpt) {
  1057. texts.push(currentOpt.label)
  1058. }
  1059. value.splice(0, 1)
  1060. return this.getCascaderText(value, currentOpt?.children, texts)
  1061. } else if (value.length == 0) {
  1062. return texts
  1063. }
  1064. },
  1065. getDataSourceOptions (remoteName = 'remoteDataSource') {
  1066. let key = this.group ? this.group + '.' + this.widget.model + '.' + this.widget.options[remoteName]
  1067. : this.widget.model + '.' + this.widget.options[remoteName]
  1068. return this.dataSourceValue.find(item => item.key === key)
  1069. },
  1070. handleTransferChange (nextTargetKeys) {
  1071. console.log(nextTargetKeys)
  1072. this.dataModel = nextTargetKeys
  1073. },
  1074. disabledElement (disabled) {
  1075. this.generateDisabled = disabled
  1076. }
  1077. },
  1078. watch: {
  1079. value (val) {
  1080. this.dataModel = val
  1081. },
  1082. dataModel (val, oldValue) {
  1083. if (JSON.stringify(val) != JSON.stringify(oldValue)) {
  1084. this.$emit('input', val)
  1085. setTimeout(() => {
  1086. this.formItemComponent && this.formItemComponent.onFieldChange()
  1087. })
  1088. }
  1089. },
  1090. 'remoteOption': {
  1091. deep: true,
  1092. handler: function (val) {
  1093. if (Object.keys(this.remoteOption).indexOf(this.widget.options.remoteOption) >= 0
  1094. && this.widget.options.remote
  1095. && this.widget.options.remoteType == 'option'
  1096. ) {
  1097. this.loadOptions(this.remoteOption[this.widget.options.remoteOption])
  1098. }
  1099. }
  1100. },
  1101. 'dataSourceValue': {
  1102. deep: true,
  1103. handler: function(val) {
  1104. if (this.dataSourceValue) {
  1105. let options = this.getDataSourceOptions()
  1106. options && options.value && this.loadOptions(options.value)
  1107. }
  1108. if ((this.widget.type === 'imgupload' || this.widget.type === 'fileupload') && this.widget.options.isQiniu) {
  1109. this.loadUploadConfig()
  1110. }
  1111. }
  1112. }
  1113. }
  1114. }
  1115. </script>