GenerateElementItem.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. <template>
  2. <div :class="{'print-read-label': printRead}" style="width: 100%;">
  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. :placeholder="widget.options.placeholder"
  21. :readonly="widget.options.readonly"
  22. :disabled="elementDisabled"
  23. :editable="widget.options.editable"
  24. :clearable="widget.options.clearable"
  25. :ref="'fm-'+widget.model"
  26. :print-read="printRead"
  27. v-bind="{...widget.options.customProps, ...extendProps}"
  28. v-on="dynamicEvents"
  29. ></component>
  30. </div>
  31. </template>
  32. <template v-if="widget.type == 'input'" >
  33. <template v-if="printRead">
  34. <span>{{dataModel}}</span>
  35. </template>
  36. <template v-else>
  37. <el-input
  38. v-if="widget.options.dataTypeCheck && (widget.options.dataType == 'number' || widget.options.dataType == 'integer' || widget.options.dataType == 'float')"
  39. type="number"
  40. v-model.number="dataModel"
  41. :disabled="elementDisabled"
  42. :clearable="widget.options.clearable"
  43. :placeholder="widget.options.placeholder"
  44. :show-password="widget.options.showPassword"
  45. :style="{width: isTable ? '100%' : widget.options.width}"
  46. :ref="'fm-'+widget.model"
  47. v-bind="{...widget.options.customProps, ...extendProps}"
  48. @focus="handleOnFocus"
  49. @blur="handleOnBlur"
  50. ></el-input>
  51. <el-input
  52. v-else
  53. :type="widget.options.dataTypeCheck ? widget.options.dataType : 'text'"
  54. v-model="dataModel"
  55. :disabled="elementDisabled"
  56. :placeholder="widget.options.placeholder"
  57. :show-password="widget.options.showPassword"
  58. :style="{width: isTable ? '100%' : widget.options.width}"
  59. :clearable="widget.options.clearable"
  60. :ref="'fm-'+widget.model"
  61. :maxlength="widget.options.maxlength"
  62. :show-word-limit="widget.options.showWordLimit"
  63. v-bind="{...widget.options.customProps, ...extendProps}"
  64. @focus="handleOnFocus"
  65. @blur="handleOnBlur"
  66. ></el-input>
  67. </template>
  68. </template>
  69. <template v-if="widget.type == 'textarea'">
  70. <template v-if="printRead">
  71. <pre>{{dataModel}}</pre>
  72. </template>
  73. <template v-else>
  74. <el-input type="textarea" :rows="widget.options.rows"
  75. v-model="dataModel"
  76. :disabled="elementDisabled"
  77. :placeholder="widget.options.placeholder"
  78. :style="{width: isTable ? '100%' : widget.options.width}"
  79. :clearable="widget.options.clearable"
  80. :ref="'fm-'+widget.model"
  81. :maxlength="widget.options.maxlength"
  82. :show-word-limit="widget.options.showWordLimit"
  83. :autosize="widget.options.autosize"
  84. v-bind="{...widget.options.customProps, ...extendProps}"
  85. @focus="handleOnFocus"
  86. @blur="handleOnBlur"
  87. ></el-input>
  88. </template>
  89. </template>
  90. <template v-if="widget.type == 'number'">
  91. <template v-if="printRead">
  92. <span>{{typeof dataModel == 'number' ? dataModel.toFixed(widget.options.precision) : dataModel}}</span>
  93. </template>
  94. <template v-else>
  95. <el-input-number
  96. v-model="dataModel"
  97. :style="{width: isTable ? '100%' : widget.options.width}"
  98. :step="widget.options.step"
  99. :disabled="elementDisabled"
  100. :min="widget.options.min"
  101. :max="widget.options.max"
  102. :controls-position="widget.options.controlsPosition"
  103. :precision="widget.options.precision"
  104. :controls="widget.options.controls"
  105. :ref="'fm-'+widget.model"
  106. v-bind="{...widget.options.customProps, ...extendProps}"
  107. @focus="handleOnFocus"
  108. @blur="handleOnBlur"
  109. ></el-input-number>
  110. </template>
  111. </template>
  112. <template v-if="widget.type == 'radio'">
  113. <template v-if="printRead">
  114. <template v-if="widget.options.remote">
  115. {{
  116. remoteOptions.find(item => item.value == dataModel)
  117. && remoteOptions.find(item => item.value == dataModel).label
  118. }}
  119. </template>
  120. <template v-else>
  121. {{
  122. widget.options.showLabel ?
  123. (remoteOptions.find(item => item.value == dataModel) && remoteOptions.find(item => item.value == dataModel).label) :
  124. dataModel
  125. }}
  126. </template>
  127. </template>
  128. <template v-else>
  129. <el-radio-group v-model="dataModel"
  130. :style="{width: isTable ? '100%' : widget.options.width, display: 'block'}"
  131. :disabled="elementDisabled"
  132. :ref="'fm-'+widget.model"
  133. v-bind="{...widget.options.customProps, ...extendProps}"
  134. >
  135. <el-radio
  136. :style="{display: widget.options.inline ? 'inline-block' : 'block'}"
  137. :value="item.value" :label="item.value" v-for="(item, index) in remoteOptions" :key="index"
  138. >
  139. <template v-if="widget.options.remote">{{item.label}}</template>
  140. <template v-else>{{widget.options.showLabel ? item.label : item.value}}</template>
  141. </el-radio>
  142. </el-radio-group>
  143. </template>
  144. </template>
  145. <template v-if="widget.type == 'checkbox'">
  146. <template v-if="printRead">
  147. <template v-if="widget.options.remote">
  148. {{
  149. dataModel?.map(dm =>
  150. remoteOptions.find(item => item.value == dm)
  151. && remoteOptions.find(item => item.value == dm).label
  152. ).join('、')
  153. }}
  154. </template>
  155. <template v-else>
  156. {{
  157. widget.options.showLabel ?
  158. dataModel?.map(dm => remoteOptions.find(item => item.value == dm) && remoteOptions.find(item => item.value == dm).label).join('、') :
  159. dataModel?.join('、')
  160. }}
  161. </template>
  162. </template>
  163. <template v-else>
  164. <el-checkbox-group v-model="dataModel"
  165. :style="{width: isTable ? '100%' : widget.options.width}"
  166. :disabled="elementDisabled"
  167. :ref="'fm-'+widget.model"
  168. v-bind="{...widget.options.customProps, ...extendProps}"
  169. >
  170. <el-checkbox
  171. :style="{display: widget.options.inline ? 'inline-block' : 'block'}"
  172. :label="item.value" :value="item.value" v-for="(item, index) in remoteOptions" :key="index"
  173. >
  174. <template v-if="widget.options.remote">{{item.label}}</template>
  175. <template v-else>{{widget.options.showLabel ? item.label : item.value}}</template>
  176. </el-checkbox>
  177. </el-checkbox-group>
  178. </template>
  179. </template>
  180. <template v-if="widget.type == 'time'">
  181. <template v-if="printRead">
  182. {{dataModel}}
  183. </template>
  184. <template v-else>
  185. <el-time-picker
  186. v-model="dataModel"
  187. :is-range="widget.options.isRange"
  188. :placeholder="widget.options.placeholder"
  189. :start-placeholder="widget.options.startPlaceholder"
  190. :end-placeholder="widget.options.endPlaceholder"
  191. :readonly="widget.options.readonly"
  192. :disabled="elementDisabled"
  193. :editable="widget.options.editable"
  194. :clearable="widget.options.clearable"
  195. :arrowControl="widget.options.arrowControl"
  196. :value-format="widget.options.format"
  197. :style="{width: isTable ? '100%' : widget.options.width}"
  198. :ref="'fm-'+widget.model"
  199. v-bind="{...widget.options.customProps, ...extendProps}"
  200. @focus="handleOnFocus"
  201. @blur="handleOnBlur"
  202. >
  203. </el-time-picker>
  204. </template>
  205. </template>
  206. <template v-if="widget.type=='date'">
  207. <template v-if="printRead">
  208. {{
  209. widget.options.type == 'dates' ?
  210. dataModel?.join('、') :
  211. typeof dataModel == 'object' ? dataModel.join(' ~ ') : dataModel
  212. }}
  213. </template>
  214. <template v-else>
  215. <el-date-picker
  216. v-model="dataModel"
  217. :type="widget.options.type"
  218. :placeholder="widget.options.placeholder"
  219. :start-placeholder="widget.options.startPlaceholder"
  220. :end-placeholder="widget.options.endPlaceholder"
  221. :readonly="widget.options.readonly"
  222. :disabled="elementDisabled"
  223. :editable="widget.options.editable"
  224. :clearable="widget.options.clearable"
  225. :value-format="widget.options.timestamp ? 'x' : widget.options.format"
  226. :format="widget.options.format"
  227. :style="{width: isTable ? '100%' : widget.options.width}"
  228. :ref="'fm-'+widget.model"
  229. v-bind="{...widget.options.customProps, ...extendProps}"
  230. @focus="handleOnFocus"
  231. @blur="handleOnBlur"
  232. >
  233. </el-date-picker>
  234. </template>
  235. </template>
  236. <template v-if="widget.type =='rate'">
  237. <template v-if="printRead">
  238. {{dataModel}}
  239. </template>
  240. <template v-else>
  241. <el-rate v-model="dataModel"
  242. :max="widget.options.max"
  243. :disabled="elementDisabled"
  244. :allow-half="widget.options.allowHalf"
  245. :show-score="widget.options.showScore"
  246. :ref="'fm-'+widget.model"
  247. :style="{width: isTable ? '100%' : widget.options.width, display: 'inline-block'}"
  248. v-bind="{...widget.options.customProps, ...extendProps}"
  249. ></el-rate>
  250. </template>
  251. </template>
  252. <template v-if="widget.type == 'color'">
  253. <template v-if="printRead">
  254. {{dataModel}}
  255. </template>
  256. <template v-else>
  257. <el-color-picker
  258. v-model="dataModel"
  259. :disabled="elementDisabled"
  260. :show-alpha="widget.options.showAlpha"
  261. :ref="'fm-'+widget.model"
  262. :style="{width: isTable ? '100%' : widget.options.width}"
  263. v-bind="{...widget.options.customProps, ...extendProps}"
  264. ></el-color-picker>
  265. </template>
  266. </template>
  267. <template v-if="widget.type == 'select'">
  268. <template v-if="printRead">
  269. <template v-if="widget.options.remote">
  270. {{
  271. typeof dataModel == 'object' ?
  272. (dataModel?.map(dm => remoteOptions.find(item => item.value == dm)
  273. && remoteOptions.find(item => item.value == dm).label).join('、'))
  274. : (remoteOptions.find(item => item.value == dataModel)
  275. && remoteOptions.find(item => item.value == dataModel).label)
  276. }}
  277. </template>
  278. <template v-else>
  279. {{
  280. widget.options.showLabel ?
  281. (
  282. typeof dataModel == 'object' ?
  283. dataModel?.map(dm => remoteOptions.find(item => item.value == dm) && remoteOptions.find(item => item.value == dm).label).join('、')
  284. : (remoteOptions.find(item => item.value == dataModel) && remoteOptions.find(item => item.value == dataModel).label)
  285. ) :
  286. typeof dataModel == 'object' ? dataModel.join('、') : dataModel
  287. }}
  288. </template>
  289. </template>
  290. <template v-else>
  291. <el-select
  292. v-model="dataModel"
  293. :disabled="elementDisabled"
  294. :multiple="widget.options.multiple"
  295. :clearable="widget.options.clearable"
  296. :placeholder="widget.options.placeholder"
  297. :style="{width: isTable ? '100%' : widget.options.width}"
  298. :filterable="widget.options.filterable"
  299. :ref="'fm-'+widget.model"
  300. v-bind="{...widget.options.customProps, ...extendProps}"
  301. @focus="handleOnFocus"
  302. @blur="handleOnBlur"
  303. >
  304. <el-option v-for="item in remoteOptions" :key="item.value" :value="item.value" :label="widget.options.showLabel || widget.options.remote?item.label:item.value"></el-option>
  305. </el-select>
  306. </template>
  307. </template>
  308. <template v-if="widget.type=='switch'">
  309. <template v-if="printRead">
  310. {{dataModel}}
  311. </template>
  312. <template v-else>
  313. <el-switch
  314. v-model="dataModel"
  315. :disabled="elementDisabled"
  316. :ref="'fm-'+widget.model"
  317. :style="{width: isTable ? '100%' : widget.options.width}"
  318. v-bind="{...widget.options.customProps, ...extendProps}"
  319. >
  320. </el-switch>
  321. </template>
  322. </template>
  323. <template v-if="widget.type=='slider'">
  324. <template v-if="printRead">
  325. {{dataModel}}
  326. </template>
  327. <template v-else>
  328. <el-slider
  329. v-model="dataModel"
  330. :min="widget.options.min"
  331. :max="widget.options.max"
  332. :disabled="elementDisabled"
  333. :step="widget.options.step"
  334. :show-input="widget.options.showInput"
  335. :range="widget.options.range"
  336. :style="{width: isTable ? '100%' : widget.options.width}"
  337. :ref="'fm-'+widget.model"
  338. v-bind="{...widget.options.customProps, ...extendProps}"
  339. ></el-slider>
  340. </template>
  341. </template>
  342. <template v-if="widget.type=='imgupload'">
  343. <fm-upload
  344. v-model="dataModel"
  345. :disabled="elementDisabled"
  346. :readonly="widget.options.readonly || printRead"
  347. :style="{'width': isTable ? '100%' : widget.options.width}"
  348. :width="widget.options.size.width"
  349. :height="widget.options.size.height"
  350. :token="remoteToken"
  351. :domain="widget.options.domain"
  352. :multiple="widget.options.multiple"
  353. :limit="widget.options.limit"
  354. :is-qiniu="widget.options.isQiniu"
  355. :is-delete="widget.options.isDelete"
  356. :min="widget.options.min"
  357. :is-edit="widget.options.isEdit"
  358. :action="widget.options.action"
  359. :headers="widget.options.headers || []"
  360. :ref="'fm-'+widget.model"
  361. :withCredentials="widget.options.withCredentials"
  362. :print-read="printRead"
  363. @on-upload-success="handleOnUploadSuccess"
  364. @on-upload-error="handleOnUploadError"
  365. @on-upload-remove="handleOnUploadRemove"
  366. @on-upload-progress="handleOnUploadProgress"
  367. :on-select="handleOnUploadSelect"
  368. >
  369. </fm-upload>
  370. </template>
  371. <template v-if="widget.type == 'editor'">
  372. <template v-if="printRead">
  373. <div v-html="dataModel" class="ql-editor"></div>
  374. </template>
  375. <template v-else>
  376. <Editor
  377. v-model="dataModel"
  378. :custom-style="{width: isTable ? '100%' : widget.options.width, cursor: (elementDisabled) ? 'no-drop' : '', backgroundColor: (elementDisabled) ? '#F5F7FA' : ''}"
  379. :toolbar="widget.options.customToolbar"
  380. :disabled="elementDisabled"
  381. :ref="'fm-'+widget.model"
  382. ></Editor>
  383. </template>
  384. </template>
  385. <template v-if="widget.type == 'cascader'">
  386. <template v-if="printRead">
  387. <template v-if="widget.options.remote">
  388. {{
  389. widget.options.multiple ?
  390. dataModel?.map(dm => getCascaderText([...dm], remoteOptions).join(' / ')).join('、')
  391. : getCascaderText([...dataModel], remoteOptions).join(' / ')
  392. }}
  393. </template>
  394. <template v-else>
  395. {{
  396. widget.options.multiple ?
  397. dataModel?.map(dm => getCascaderText([...dm], remoteOptions).join(' / ')).join('、')
  398. : getCascaderText([...dataModel], remoteOptions).join(' / ')
  399. }}
  400. </template>
  401. </template>
  402. <template v-else>
  403. <el-cascader
  404. v-model="dataModel"
  405. :disabled="elementDisabled"
  406. :clearable="widget.options.clearable"
  407. :placeholder="widget.options.placeholder"
  408. :style="{width: isTable ? '100%' : widget.options.width}"
  409. :options="remoteOptions"
  410. @change="onCascaderChange"
  411. :ref="'fm-'+widget.model"
  412. @focus="handleOnFocus"
  413. @blur="handleOnBlur"
  414. :props="propsModel"
  415. collapse-tags
  416. :filterable="widget.options.filterable"
  417. v-bind="{...widget.options.customProps, ...extendProps}"
  418. >
  419. </el-cascader>
  420. </template>
  421. </template>
  422. <template v-if="widget.type == 'treeselect'">
  423. <template v-if="printRead">
  424. <template v-if="widget.options.remote">
  425. {{
  426. typeof dataModel == 'object' ?
  427. dataModel?.map(dm => getTreeText(dm, remoteOptions)).join('、')
  428. : getTreeText(dataModel, remoteOptions)
  429. }}
  430. </template>
  431. <template v-else>
  432. {{
  433. typeof dataModel == 'object' ?
  434. dataModel?.map(dm => getTreeText(dm, remoteOptions)).join('、')
  435. : getTreeText(dataModel, remoteOptions)
  436. }}
  437. </template>
  438. </template>
  439. <template v-else>
  440. <el-tree-select
  441. v-model="dataModel"
  442. :disabled="elementDisabled"
  443. :clearable="widget.options.clearable"
  444. :placeholder="widget.options.placeholder"
  445. :style="{width: isTable ? '100%' : widget.options.width}"
  446. :data="remoteOptions"
  447. :ref="'fm-'+widget.model"
  448. @focus="handleOnFocus"
  449. @blur="handleOnBlur"
  450. :multiple="widget.options.multiple"
  451. :check-strictly="widget.options.checkStrictly"
  452. :filterable="widget.options.filterable"
  453. v-bind="{...widget.options.customProps, ...extendProps}"
  454. >
  455. </el-tree-select>
  456. </template>
  457. </template>
  458. <template v-if="widget.type == 'text'">
  459. <span :ref="'fm-'+widget.model" :style="{width: isTable ? '100%' : (widget.options.width || '100%'), display: 'inline-block'}">{{dataModel}}</span>
  460. </template>
  461. <template v-if="widget.type == 'html'">
  462. <span v-html="dataModel" :ref="'fm-'+widget.model" :style="{width: isTable ? '100%' : (widget.options.width || '100%'), display: 'inline-block'}"></span>
  463. </template>
  464. <template v-if="widget.type == 'table'">
  465. <fm-form-table
  466. v-model:value="dataModel"
  467. :columns="widget.tableColumns"
  468. :models="dataModels"
  469. :remote="remote"
  470. :blanks="blanks"
  471. :disableddata="elementDisabled || printRead"
  472. :rules="rules"
  473. :name="widget.model"
  474. :remote-option="remoteOption"
  475. :ref="'fm-'+widget.model"
  476. :preview="preview"
  477. :platform="platform"
  478. :data-source-value="dataSourceValue"
  479. :event-function="eventFunction"
  480. :widget="widget"
  481. :print-read="printRead"
  482. :paging="widget.options.paging"
  483. :page-size="widget.options.pageSize"
  484. :is-delete="widget.options.isDelete ?? true"
  485. :is-add="widget.options.isAdd ?? true"
  486. :show-control="widget.options.showControl ?? true"
  487. :is-dialog="isDialog"
  488. :dialog-name="dialogName"
  489. :is-group="isGroup"
  490. :group="group"
  491. :field-node="fieldNode"
  492. :container-key="containerKey"
  493. >
  494. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  495. <slot :name="blank.name" :model="scope.model"></slot>
  496. </template>
  497. </fm-form-table>
  498. </template>
  499. <template v-if="widget.type == 'subform'">
  500. <fm-sub-form
  501. v-model:value="dataModel"
  502. :list="widget.list"
  503. :models="dataModels"
  504. :remote="remote"
  505. :blanks="blanks"
  506. :disableddata="elementDisabled || printRead"
  507. :rules="rules"
  508. :name="widget.model"
  509. :remote-option="remoteOption"
  510. :ref="'fm-'+widget.model"
  511. :preview="preview"
  512. :platform="platform"
  513. :data-source-value="dataSourceValue"
  514. :event-function="eventFunction"
  515. :widget="widget"
  516. :print-read="printRead"
  517. :paging="widget.options.paging"
  518. :page-size="widget.options.pageSize"
  519. :show-control="widget.options.showControl"
  520. :is-delete="widget.options.isDelete ?? true"
  521. :is-add="widget.options.isAdd ?? true"
  522. :is-dialog="isDialog"
  523. :dialog-name="dialogName"
  524. :is-group="isGroup"
  525. :group="group"
  526. :field-node="fieldNode"
  527. :container-key="containerKey"
  528. >
  529. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  530. <slot :name="blank.name" :model="scope.model"></slot>
  531. </template>
  532. </fm-sub-form>
  533. </template>
  534. <template v-if="widget.type == 'group'">
  535. <fm-group
  536. v-model:value="dataModel"
  537. :rules="rules"
  538. :element="widget"
  539. :remote="remote"
  540. :blanks="blanks"
  541. :edit="!elementDisabled"
  542. :remote-option="remoteOption"
  543. :platform="platform"
  544. :preview="preview"
  545. :container-key="containerKey"
  546. :data-source-value="dataSourceValue"
  547. :event-function="eventFunction"
  548. :print-read="printRead"
  549. :ref="'fm-'+widget.model"
  550. :is-group="isGroup"
  551. :group="group"
  552. :field-node="fieldNode"
  553. >
  554. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  555. <slot :name="blank.name" :model="scope.model"></slot>
  556. </template>
  557. </fm-group>
  558. </template>
  559. <template v-if="widget.type == 'fileupload'">
  560. <fm-file-upload
  561. v-model="dataModel"
  562. :disabled="elementDisabled"
  563. :style="{'width': isTable ? '100%' : widget.options.width}"
  564. :token="remoteToken"
  565. :domain="widget.options.domain"
  566. :multiple="widget.options.multiple"
  567. :limit="widget.options.limit"
  568. :is-qiniu="widget.options.isQiniu"
  569. :min="widget.options.min"
  570. :action="widget.options.action"
  571. :headers="widget.options.headers || []"
  572. :ref="'fm-'+widget.model"
  573. :withCredentials="widget.options.withCredentials"
  574. :print-read="printRead"
  575. :accept="widget.options.accept"
  576. @on-upload-success="handleOnUploadSuccess"
  577. @on-upload-error="handleOnUploadError"
  578. @on-upload-remove="handleOnUploadRemove"
  579. @on-upload-progress="handleOnUploadProgress"
  580. :on-select="handleOnUploadSelect"
  581. >
  582. </fm-file-upload>
  583. </template>
  584. <template v-if="widget.type == 'button'">
  585. <el-button
  586. :disabled="elementDisabled"
  587. :size="widget.options.buttonSize"
  588. :type="widget.options.buttonType == 'text' || widget.options.buttonType == 'link' ? 'primary' : widget.options.buttonType"
  589. :text="widget.options.buttonType == 'text'"
  590. :link="widget.options.buttonType == 'link'"
  591. :plain="widget.options.buttonPlain"
  592. :round="widget.options.buttonRound"
  593. :circle="widget.options.buttonCircle"
  594. :style="{width: widget.options.width}"
  595. :ref="'fm-'+widget.model"
  596. v-bind="{...widget.options.customProps, ...extendProps}"
  597. @click="handleOnClick"
  598. >{{widget.options.buttonName}}
  599. </el-button>
  600. </template>
  601. <template v-if="widget.type == 'link'">
  602. <el-link
  603. :disabled="elementDisabled"
  604. :type="widget.options.linkType"
  605. :underline="widget.options.underline"
  606. :href="widget.options.href"
  607. :target="widget.options.blank ? '_blank' : '_self'"
  608. :ref="'fm-'+widget.model"
  609. @click="handleOnClick"
  610. :style="{width: isTable ? '100%' : widget.options.width}"
  611. v-bind="{...widget.options.customProps, ...extendProps}"
  612. >
  613. {{widget.options.linkName}}
  614. </el-link>
  615. </template>
  616. <template v-if="widget.type == 'steps'">
  617. <el-steps :active="dataModel"
  618. :ref="'fm-'+widget.model"
  619. :space="widget.options.space"
  620. :direction="widget.options.direction"
  621. :process-status="widget.options.processStatus"
  622. :finish-status="widget.options.finishStatus"
  623. :align-center="widget.options.alignCenter"
  624. :simple="widget.options.simple"
  625. :style="{'line-height': 'normal'}"
  626. v-if="remoteOptions && remoteOptions.length > 0"
  627. v-bind="{...widget.options.customProps, ...extendProps}"
  628. >
  629. <el-step
  630. :title="item.title"
  631. :description="item.description"
  632. v-for="(item, index) in remoteOptions" :key="index"></el-step>
  633. </el-steps>
  634. </template>
  635. <template v-if="widget.type == 'pagination'">
  636. <template v-if="printRead">
  637. Page {{dataModel}}
  638. </template>
  639. <template v-else>
  640. <el-pagination
  641. v-model:currentPage="dataModel"
  642. :page-size="widget.options.pageSize"
  643. :pager-count="widget.options.pagerCount"
  644. :disabled="widget.options.disabled"
  645. :background="widget.options.background"
  646. layout="total, prev, pager, next"
  647. :total="widget.options.total"
  648. :ref="'fm-'+widget.model"
  649. v-bind="{...widget.options.customProps, ...extendProps}"
  650. />
  651. </template>
  652. </template>
  653. <template v-if="widget.type == 'transfer'">
  654. <template v-if="printRead">
  655. <template v-if="widget.options.remote">
  656. {{
  657. dataModel?.map(dm => remoteOptions.find(item =>
  658. item[widget.options.props.key] == dm)?.[widget.options.props.label]).join('、')
  659. }}
  660. </template>
  661. <template v-else>
  662. {{
  663. dataModel?.map(dm => remoteOptions.find(item =>
  664. item[propsTransfer.key] == dm)?.[propsTransfer.label]).join('、')
  665. }}
  666. </template>
  667. </template>
  668. <template v-else>
  669. <el-transfer
  670. :model-value="dataModel"
  671. :disabled="elementDisabled"
  672. :data="remoteOptions"
  673. :filterable="widget.options.filterable"
  674. :props="widget.options.remote ? widget.options.props : propsTransfer"
  675. :titles="widget.options.titles"
  676. :style="{width: isTable ? '100%' : widget.options.width}"
  677. :ref="'fm-'+widget.model"
  678. @change="handleTransferChange"
  679. v-bind="{...widget.options.customProps, ...extendProps}"
  680. ></el-transfer>
  681. </template>
  682. </template>
  683. <template v-if="widget.type == 'list'">
  684. <fm-data-table
  685. :ref="'fm-'+widget.model"
  686. v-model="dataModel"
  687. :columns="widget.options.columns"
  688. :showOperation="widget.options.showOperation"
  689. :operations="widget.options.operations"
  690. :pagination="widget.options.pagination"
  691. :style="{'width': isTable ? '100%' : widget.options.width}"
  692. :max-height="widget.options.maxHeight"
  693. :stripe="widget.options.stripe"
  694. :border="widget.options.border"
  695. :highlight="widget.options.highlight"
  696. :selection="widget.options.selection"
  697. :print-read="printRead"
  698. @on-page-change="handlePageChange"
  699. @on-current-row="handleCurrentRow"
  700. @on-operate="handleOperate"
  701. @on-selection-change="handleSelectionChange"
  702. ></fm-data-table>
  703. </template>
  704. </div>
  705. </template>
  706. <script>
  707. import FmUpload from './Upload/index.vue'
  708. import FmFormTable from './FormTable/index.vue'
  709. import FmFileUpload from './Upload/file.vue'
  710. import FmSubForm from './SubForm/index.vue'
  711. import FmGroup from './GenerateGroup.vue'
  712. import Editor from './Editor/index.vue'
  713. import FmDataTable from './DataTable/index.vue'
  714. import { generateElementItemMixin } from '../mixins/generateElementItem'
  715. export default {
  716. name: 'generate-element-item',
  717. components: {
  718. FmUpload,
  719. FmFormTable,
  720. FmFileUpload,
  721. FmSubForm,
  722. FmGroup,
  723. Editor,
  724. FmDataTable
  725. },
  726. mixins: [generateElementItemMixin],
  727. data () {
  728. return {
  729. propsModel: {multiple: this.widget.options.multiple || false, checkStrictly: this.widget.options.checkStrictly || false},
  730. propsTransfer: {key: 'key', label: 'label'},
  731. }
  732. },
  733. methods: {
  734. onCascaderChange (value) {
  735. if (value) {
  736. this.$nextTick(() => {
  737. setTimeout(() => {
  738. this.$parent && this.$parent.clearValidate()
  739. this.$parent && this.$parent.$parent && this.$parent.$parent.$refs.generateFormItem && this.$parent.$parent.$refs.generateFormItem.clearValidate()
  740. })
  741. })
  742. }
  743. },
  744. handleTransferChange (value) {
  745. this.dataModel = value
  746. }
  747. },
  748. }
  749. </script>