GenerateElementItem.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. <template>
  2. <template v-if="widget.type == 'blank'">
  3. <van-field
  4. v-bind="publicProps"
  5. :disabled="elementDisabled"
  6. >
  7. <template #input>
  8. <slot :name="widget.model" :model="dataModels"></slot>
  9. </template>
  10. </van-field>
  11. </template>
  12. <template v-if="widget.type == 'component'">
  13. <van-field
  14. v-bind="publicProps"
  15. :disabled="elementDisabled"
  16. >
  17. <template #input>
  18. <component :style="{width: '100%'}" :is="`component-${widget.key}-${key}`" :key="key" v-model="dataModel" :ref="'fm-'+widget.model"></component>
  19. </template>
  20. </van-field>
  21. </template>
  22. <template v-if="widget.type == 'custom'">
  23. <component
  24. :is="widget.el"
  25. v-model="dataModel"
  26. :width="widget.options.width"
  27. :height="widget.options.height"
  28. :placeholder="widget.options.placeholder"
  29. :readonly="widget.options.readonly"
  30. :disabled="elementDisabled"
  31. :editable="widget.options.editable"
  32. :clearable="widget.options.clearable"
  33. :ref="'fm-'+widget.model"
  34. :print-read="printRead"
  35. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  36. v-on="dynamicEvents"
  37. ></component>
  38. </template>
  39. <template v-if="widget.type == 'input'">
  40. <van-field
  41. v-model="dataModel"
  42. :placeholder="widget.options.placeholder"
  43. :maxlength="Number(widget.options.maxlength || Infinity)"
  44. :show-word-limit="widget.options.showWordLimit"
  45. :disabled="elementDisabled"
  46. :clearable="widget.options.clearable"
  47. :type="widget.options.showPassword ? 'password' : 'text'"
  48. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  49. :readonly="printRead"
  50. :key="printRead"
  51. :ref="'fm-'+widget.model"
  52. >
  53. <template #input v-if="printRead">
  54. <span>{{ dataModel }}</span>
  55. </template>
  56. </van-field>
  57. </template>
  58. <template v-if="widget.type == 'textarea'">
  59. <van-field
  60. v-model="dataModel"
  61. :placeholder="widget.options.placeholder"
  62. :maxlength="Number(widget.options.maxlength || Infinity)"
  63. :show-word-limit="widget.options.showWordLimit"
  64. :autosize="widget.options.autosize"
  65. :rows="widget.options.rows"
  66. type="textarea"
  67. :clearable="widget.options.clearable"
  68. :disabled="elementDisabled"
  69. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  70. :readonly="printRead"
  71. :key="printRead"
  72. :ref="'fm-'+widget.model"
  73. >
  74. <template #input v-if="printRead">
  75. <pre>{{dataModel}}</pre>
  76. </template>
  77. </van-field>
  78. </template>
  79. <template v-if="widget.type == 'number'">
  80. <van-field
  81. v-bind="{...publicProps}"
  82. :disabled="elementDisabled"
  83. :readonly="printRead"
  84. >
  85. <template #input>
  86. <span v-if="printRead">{{dataModel.toFixed(widget.options.precision)}}</span>
  87. <van-stepper
  88. v-else
  89. v-model.number="dataModel"
  90. :disabled="elementDisabled"
  91. :min="widget.options.min"
  92. :max="widget.options.max"
  93. :step="widget.options.step"
  94. :decimal-length="widget.options.precision"
  95. :ref="'fm-'+widget.model"
  96. v-bind="{...widget.options.customProps, ...extendProps}"
  97. ></van-stepper>
  98. </template>
  99. </van-field>
  100. </template>
  101. <template v-if="widget.type == 'radio'">
  102. <van-field
  103. v-bind="{...publicProps}"
  104. :disabled="elementDisabled"
  105. :readonly="printRead"
  106. >
  107. <template #input>
  108. <template v-if="printRead">
  109. <template v-if="widget.options.remote">
  110. {{
  111. remoteOptions.find(item => item.value == dataModel)
  112. && remoteOptions.find(item => item.value == dataModel).label
  113. }}
  114. </template>
  115. <template v-else>
  116. {{
  117. widget.options.showLabel ?
  118. (remoteOptions.find(item => item.value == dataModel) && remoteOptions.find(item => item.value == dataModel).label) :
  119. dataModel
  120. }}
  121. </template>
  122. </template>
  123. <van-radio-group v-else v-model="dataModel"
  124. :direction="widget.options.inline ? 'horizontal' : 'vertical'"
  125. :disabled="elementDisabled"
  126. :ref="'fm-'+widget.model"
  127. v-bind="{...widget.options.customProps, ...extendProps}"
  128. >
  129. <van-radio
  130. v-for="(item, index) in widget.options.options" :key="item.value + index"
  131. :name="item.value"
  132. style="margin-bottom: 8px;"
  133. >
  134. {{widget.options.showLabel ? item.label : item.value}}
  135. </van-radio>
  136. </van-radio-group>
  137. </template>
  138. </van-field>
  139. </template>
  140. <template v-if="widget.type == 'checkbox'">
  141. <van-field
  142. v-bind="{...publicProps}"
  143. :disabled="elementDisabled"
  144. :readonly="printRead"
  145. >
  146. <template #input>
  147. <template v-if="printRead">
  148. <template v-if="widget.options.remote">
  149. {{
  150. dataModel?.map(dm =>
  151. remoteOptions.find(item => item.value == dm)
  152. && remoteOptions.find(item => item.value == dm).label
  153. ).join('、')
  154. }}
  155. </template>
  156. <template v-else>
  157. {{
  158. widget.options.showLabel ?
  159. dataModel?.map(dm => remoteOptions.find(item => item.value == dm) && remoteOptions.find(item => item.value == dm).label).join('、') :
  160. dataModel?.join('、')
  161. }}
  162. </template>
  163. </template>
  164. <van-checkbox-group
  165. v-else
  166. v-model="dataModel"
  167. :direction="widget.options.inline ? 'horizontal' : 'vertical'"
  168. :disabled="elementDisabled"
  169. shape="square"
  170. :ref="'fm-'+widget.model"
  171. v-bind="{...widget.options.customProps, ...extendProps}"
  172. >
  173. <van-checkbox
  174. style="margin-bottom: 8px;"
  175. :name="item.value"
  176. v-for="(item, index) in widget.options.options" :key="item.value + index">
  177. {{widget.options.showLabel ? item.label : item.value}}
  178. </van-checkbox>
  179. </van-checkbox-group>
  180. </template>
  181. </van-field>
  182. </template>
  183. <template v-if="widget.type == 'time'">
  184. <van-field
  185. v-model="dataModel"
  186. :placeholder="widget.options.placeholder"
  187. :disabled="elementDisabled"
  188. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  189. :is-link="!printRead"
  190. @click="onShowPicker('time')"
  191. :ref="'fm-'+widget.model"
  192. readonly
  193. ></van-field>
  194. <van-popup v-model:show="showPicker" round position="bottom" teleport="body" z-index="5000">
  195. <van-time-picker
  196. :model-value="pickerValue"
  197. :columns-type="timeColumnsType"
  198. v-bind="{...widget.options.customProps, ...extendProps}"
  199. @confirm="onPickerConfirm"
  200. @cancel="showPicker = false"
  201. ></van-time-picker>
  202. </van-popup>
  203. </template>
  204. <template v-if="widget.type == 'date'">
  205. <!-- {{12123123123}} -->
  206. <van-field
  207. :modelValue="dateLocalString"
  208. :placeholder="widget.options.placeholder"
  209. :disabled="elementDisabled"
  210. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  211. :is-link="!printRead"
  212. :ref="'fm-'+widget.model"
  213. @click="onShowPicker('date')"
  214. readonly
  215. ></van-field>
  216. <!-- {{12123123123}} -->
  217. <van-calendar
  218. :default-date="pickerValue"
  219. v-model:show="showPicker"
  220. switch-mode="year-month"
  221. :type="calendarType"
  222. v-bind="{...widget.options.customProps, ...extendProps}"
  223. @confirm="onCalendarConfirm"
  224. teleport="body" z-index="5000"
  225. >
  226. </van-calendar>
  227. </template>
  228. <template v-if="widget.type == 'rate'">
  229. <van-field
  230. v-bind="{...publicProps}"
  231. :disabled="elementDisabled"
  232. :readonly="printRead"
  233. >
  234. <template #input>
  235. <van-rate
  236. :readonly="printRead"
  237. v-model="dataModel"
  238. :count="widget.options.max"
  239. :allow-half="widget.options.allowHalf"
  240. :disabled="elementDisabled"
  241. :ref="'fm-'+widget.model"
  242. v-bind="{...widget.options.customProps, ...extendProps}"
  243. ></van-rate>
  244. </template>
  245. </van-field>
  246. </template>
  247. <template v-if="widget.type == 'select'">
  248. <fm-vant-select
  249. v-model="dataModel"
  250. :placeholder="widget.options.placeholder"
  251. :disabled="elementDisabled"
  252. :customProps="widget.options.customProps"
  253. :extendProps="extendProps"
  254. :publicProps="publicProps"
  255. :columns="remoteOptions"
  256. :multiple="widget.options.multiple"
  257. :print-read="printRead"
  258. :ref="'fm-'+widget.model"
  259. >
  260. </fm-vant-select>
  261. </template>
  262. <template v-if="widget.type == 'switch'">
  263. <van-field
  264. v-bind="{...publicProps}"
  265. :disabled="elementDisabled"
  266. :readonly="printRead"
  267. >
  268. <template #input>
  269. <van-switch
  270. v-model="dataModel"
  271. :disabled="elementDisabled || printRead"
  272. size="20"
  273. :ref="'fm-'+widget.model"
  274. v-bind="{...widget.options.customProps, ...extendProps}"
  275. ></van-switch>
  276. </template>
  277. </van-field>
  278. </template>
  279. <template v-if="widget.type == 'slider'">
  280. <van-field
  281. v-bind="{...publicProps}"
  282. :disabled="elementDisabled"
  283. :readonly="printRead"
  284. >
  285. <template #input>
  286. <template v-if="printRead">
  287. {{dataModel}}
  288. </template>
  289. <van-slider
  290. v-else
  291. v-model="dataModel"
  292. :disabled="elementDisabled"
  293. :min="widget.options.min"
  294. :max="widget.options.max"
  295. :step="widget.options.step"
  296. :range="widget.options.range"
  297. v-bind="{...widget.options.customProps, ...extendProps}"
  298. :ref="'fm-'+widget.model"
  299. ></van-slider>
  300. </template>
  301. </van-field>
  302. </template>
  303. <template v-if="widget.type == 'text'">
  304. <van-field
  305. v-bind="{...publicProps}"
  306. :disabled="elementDisabled"
  307. >
  308. <template #input>
  309. <span :ref="'fm-'+widget.model">{{dataModel}}</span>
  310. </template>
  311. </van-field>
  312. </template>
  313. <template v-if="widget.type == 'html'">
  314. <van-field
  315. v-bind="{...publicProps}"
  316. :disabled="elementDisabled"
  317. >
  318. <template #input>
  319. <span v-html="dataModel" :ref="'fm-'+widget.model"></span>
  320. </template>
  321. </van-field>
  322. </template>
  323. <template v-if="widget.type == 'button'">
  324. <van-field
  325. v-if="!printRead"
  326. v-bind="{...publicProps}"
  327. :disabled="elementDisabled">
  328. <template #input>
  329. <van-button
  330. block
  331. :type="widget.options.buttonType || 'default'"
  332. :size="widget.options.buttonSize == 'large' ? 'normal' :
  333. widget.options.buttonSize == 'default' ? 'small' :
  334. widget.options.buttonSize == 'small' ? 'mini' : 'small'"
  335. :plain="widget.options.buttonPlain"
  336. :round="widget.options.buttonRound"
  337. :disabled="elementDisabled"
  338. v-bind="{...widget.options.customProps, ...extendProps}"
  339. @click="handleOnClick"
  340. :ref="'fm-'+widget.model"
  341. >
  342. {{widget.options.buttonName}}
  343. </van-button>
  344. </template>
  345. </van-field>
  346. </template>
  347. <template v-if="widget.type == 'cascader'">
  348. <fm-vant-cascader
  349. v-model="dataModel"
  350. :placeholder="widget.options.placeholder"
  351. :disabled="elementDisabled"
  352. :customProps="widget.options.customProps"
  353. :extendProps="extendProps"
  354. :publicProps="publicProps"
  355. :options="remoteOptions"
  356. :title="widget.name"
  357. :is-path-value="true"
  358. :print-read="printRead"
  359. :ref="'fm-'+widget.model"
  360. ></fm-vant-cascader>
  361. </template>
  362. <template v-if="widget.type == 'treeselect'">
  363. <fm-vant-cascader
  364. v-model="dataModel"
  365. :placeholder="widget.options.placeholder"
  366. :disabled="elementDisabled"
  367. :customProps="widget.options.customProps"
  368. :extendProps="extendProps"
  369. :publicProps="publicProps"
  370. :options="remoteOptions"
  371. :title="widget.name"
  372. :is-path-value="false"
  373. :print-read="printRead"
  374. :ref="'fm-'+widget.model"
  375. ></fm-vant-cascader>
  376. </template>
  377. <template v-if="widget.type == 'deptCascader'">
  378. <fm-vant-dept-cascader
  379. v-model="dataModel"
  380. :placeholder="widget.options.placeholder"
  381. :disabled="elementDisabled"
  382. :customProps="widget.options.customProps"
  383. :extendProps="extendProps"
  384. :publicProps="publicProps"
  385. :options="remoteOptions"
  386. :title="widget.name"
  387. :is-path-value="true"
  388. :multiple="widget.options.multiple"
  389. :print-read="printRead"
  390. :ref="'fm-'+widget.model"
  391. ></fm-vant-dept-cascader>
  392. </template>
  393. <template v-if="widget.type == 'steps'">
  394. <van-field
  395. v-bind="{...publicProps}"
  396. :disabled="elementDisabled"
  397. >
  398. <template #input>
  399. <van-steps
  400. :active="dataModel"
  401. :direction="widget.options.direction"
  402. :active-color="widget.options.activeColor"
  403. :inactive-color="widget.options.inactiveColor"
  404. v-bind="{...widget.options.customProps, ...extendProps}"
  405. style="width: 100%;"
  406. :ref="'fm-'+widget.model"
  407. >
  408. <van-step v-for="(item, index) in remoteOptions" :key="index">
  409. <h3>{{item.title}}</h3>
  410. <p>{{item.description}}</p>
  411. </van-step>
  412. </van-steps>
  413. </template>
  414. </van-field>
  415. </template>
  416. <template v-if="widget.type == 'pagination'">
  417. <van-field
  418. v-bind="{...publicProps}"
  419. :disabled="elementDisabled"
  420. >
  421. <template #input>
  422. <van-pagination
  423. v-model="dataModel"
  424. :items-per-page ="widget.options.pageSize"
  425. :show-page-size="widget.options.pagerCount"
  426. :disabled="elementDisabled"
  427. :total-items="widget.options.total"
  428. v-bind="{...widget.options.customProps, ...extendProps}"
  429. force-ellipses
  430. :ref="'fm-'+widget.model"
  431. >
  432. <template #prev-text>
  433. <van-icon name="arrow-left" />
  434. </template>
  435. <template #next-text>
  436. <van-icon name="arrow" />
  437. </template>
  438. </van-pagination>
  439. </template>
  440. </van-field>
  441. </template>
  442. <template v-if="widget.type == 'imgupload'">
  443. <van-field
  444. v-bind="{...publicProps}"
  445. :disabled="elementDisabled"
  446. >
  447. <template #input>
  448. <fm-vant-uploader
  449. v-model="dataModel"
  450. :disabled="elementDisabled"
  451. :readonly="widget.options.readonly || printRead"
  452. :width="widget.options.size.width"
  453. :height="widget.options.size.height"
  454. :token="remoteToken"
  455. :domain="widget.options.domain"
  456. :multiple="widget.options.multiple"
  457. :limit="widget.options.limit"
  458. :is-qiniu="widget.options.isQiniu"
  459. :is-delete="widget.options.isDelete"
  460. :is-edit="widget.options.isEdit"
  461. :action="widget.options.action"
  462. :headers="widget.options.headers || []"
  463. :is-image="true"
  464. :ref="'fm-'+widget.model"
  465. @on-upload-success="handleOnUploadSuccess"
  466. @on-upload-error="handleOnUploadError"
  467. @on-upload-remove="handleOnUploadRemove"
  468. @on-upload-progress="handleOnUploadProgress"
  469. :on-select="handleOnUploadSelect"
  470. ></fm-vant-uploader>
  471. </template>
  472. </van-field>
  473. </template>
  474. <template v-if="widget.type == 'fileupload'">
  475. <van-field
  476. v-bind="{...publicProps}"
  477. :disabled="elementDisabled"
  478. >
  479. <template #input>
  480. <fm-vant-uploader
  481. v-model="dataModel"
  482. :disabled="elementDisabled"
  483. :readonly="widget.options.readonly || printRead"
  484. :token="remoteToken"
  485. :domain="widget.options.domain"
  486. :multiple="widget.options.multiple"
  487. :limit="widget.options.limit"
  488. :is-qiniu="widget.options.isQiniu"
  489. :is-delete="widget.options.isDelete"
  490. :is-edit="widget.options.isEdit"
  491. :action="widget.options.action"
  492. :headers="widget.options.headers || []"
  493. :ref="'fm-'+widget.model"
  494. :is-image="false"
  495. @on-upload-success="handleOnUploadSuccess"
  496. @on-upload-error="handleOnUploadError"
  497. @on-upload-remove="handleOnUploadRemove"
  498. @on-upload-progress="handleOnUploadProgress"
  499. @on-upload-local="handleOnUploadLocal"
  500. :on-select="handleOnUploadSelect"
  501. ></fm-vant-uploader>
  502. </template>
  503. </van-field>
  504. </template>
  505. <template v-if="widget.type == 'table'">
  506. <van-field
  507. :disabled="elementDisabled"
  508. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  509. >
  510. <template #input>
  511. <fm-vant-form-table
  512. v-model:value="dataModel"
  513. :columns="widget.tableColumns"
  514. :models="dataModels"
  515. :remote="remote"
  516. :blanks="blanks"
  517. :disableddata="elementDisabled || printRead"
  518. :rules="rules"
  519. :name="widget.model"
  520. :remote-option="remoteOption"
  521. :ref="'fm-'+widget.model"
  522. :preview="preview"
  523. :platform="platform"
  524. :data-source-value="dataSourceValue"
  525. :event-function="eventFunction"
  526. :widget="widget"
  527. :container-key="containerKey"
  528. :print-read="printRead"
  529. :paging="widget.options.paging"
  530. :page-size="widget.options.pageSize"
  531. :config="config"
  532. :is-add="widget.options.isAdd ?? true"
  533. :is-delete="widget.options.isDelete ?? true"
  534. :show-control="widget.options.showControl ?? true"
  535. :is-dialog="isDialog"
  536. :dialog-name="dialogName"
  537. :is-group="isGroup"
  538. :group="group"
  539. :field-node="fieldNode"
  540. >
  541. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  542. <slot :name="blank.name" :model="scope.model"></slot>
  543. </template>
  544. </fm-vant-form-table>
  545. </template>
  546. </van-field>
  547. </template>
  548. <template v-if="widget.type == 'subform'">
  549. <van-field
  550. :disabled="elementDisabled"
  551. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  552. >
  553. <template #input>
  554. <fm-vant-subform
  555. v-model:value="dataModel"
  556. :list="widget.list"
  557. :models="dataModels"
  558. :remote="remote"
  559. :blanks="blanks"
  560. :disableddata="elementDisabled || printRead"
  561. :rules="rules"
  562. :name="widget.model"
  563. :remote-option="remoteOption"
  564. :ref="'fm-'+widget.model"
  565. :preview="preview"
  566. :platform="platform"
  567. :data-source-value="dataSourceValue"
  568. :event-function="eventFunction"
  569. :widget="widget"
  570. :print-read="printRead"
  571. :paging="widget.options.paging"
  572. :page-size="widget.options.pageSize"
  573. :config="config"
  574. :container-key="containerKey"
  575. :show-control="widget.options.showControl"
  576. :is-delete="widget.options.isDelete ?? true"
  577. :is-add="widget.options.isAdd ?? true"
  578. :is-dialog="isDialog"
  579. :dialog-name="dialogName"
  580. :is-group="isGroup"
  581. :group="group"
  582. :field-node="fieldNode"
  583. >
  584. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  585. <slot :name="blank.name" :model="scope.model"></slot>
  586. </template>
  587. </fm-vant-subform>
  588. </template>
  589. </van-field>
  590. </template>
  591. <template v-if="widget.type == 'group'">
  592. <van-field
  593. :disabled="elementDisabled"
  594. v-bind="{...publicProps, ...widget.options.customProps, ...extendProps}"
  595. >
  596. <template #input>
  597. <fm-vant-group
  598. v-model:value="dataModel"
  599. :rules="rules"
  600. :element="widget"
  601. :remote="remote"
  602. :blanks="blanks"
  603. :edit="!elementDisabled"
  604. :remote-option="remoteOption"
  605. :platform="platform"
  606. :preview="preview"
  607. :container-key="containerKey"
  608. :data-source-value="dataSourceValue"
  609. :event-function="eventFunction"
  610. :print-read="printRead"
  611. :ref="'fm-'+widget.model"
  612. :is-group="isGroup"
  613. :group="group"
  614. :field-node="fieldNode"
  615. :config="config"
  616. >
  617. </fm-vant-group>
  618. </template>
  619. </van-field>
  620. </template>
  621. </template>
  622. <script>
  623. import {generateElementItemMixin} from '../../mixins/generateElementItem.js'
  624. import FmVantGroup from './GenerateGroup.vue'
  625. import FmVantSubform from './SubForm.vue'
  626. import { defineAsyncComponent, readonly } from 'vue'
  627. import { getTimeColumnsType, parseTimeToArray, formatTimeValue } from '../../util/time.js'
  628. import FmVantSelect from './components/Select.vue'
  629. import FmVantCascader from './components/Cascader.vue'
  630. import FmVantUploader from './components/Uploader.vue'
  631. import FmVantDeptCascader from './components/DeptCascader.vue'
  632. export default {
  633. components: {
  634. FmVantGroup,
  635. FmVantSubform,
  636. FmVantSelect,
  637. FmVantCascader,
  638. FmVantUploader,
  639. FmVantDeptCascader,
  640. FmVantFormTable: defineAsyncComponent(() => import('./FormTable.vue')),
  641. },
  642. mixins: [generateElementItemMixin],
  643. props: ['config', 'label', 'labelWidth'],
  644. data () {
  645. return {
  646. showPicker: false,
  647. pickerValue: [],
  648. pickerType: '',
  649. }
  650. },
  651. computed: {
  652. publicProps () {
  653. return {
  654. label: this.label,
  655. labelWidth: this.labelWidth,
  656. labelAlign: this.widget.options.labelWrap ? 'top' : this.config.labelPosition,
  657. required: this.widget.options.required,
  658. class: {
  659. [this.widget.options && this.widget.options.customClass]: this.widget.options.customClass ? true : false,
  660. },
  661. rules: this.rules[this.groupNode],
  662. name: this.fieldNode,
  663. }
  664. },
  665. timeColumnsType () {
  666. return getTimeColumnsType(this.widget.options.format || 'HH:mm:ss')
  667. },
  668. dateLocalString () {
  669. if (this.calendarType === 'range') {
  670. return this.dataModel.map(item => new Date(item).toLocaleDateString()).join(' ~ ')
  671. }
  672. if (Array.isArray(this.dataModel)) {
  673. return this.dataModel.map(item => new Date(item).toLocaleDateString()).join('、')
  674. }
  675. return this.dataModel ? new Date(this.dataModel).toLocaleDateString() : ''
  676. },
  677. calendarType () {
  678. if (this.widget.options.type === 'daterange' || this.widget.options.type === 'datetimerange' || this.widget.options.type === 'monthrange') {
  679. return 'range'
  680. }
  681. if (this.widget.options.type === 'dates') {
  682. return 'multiple'
  683. }
  684. return 'single'
  685. }
  686. },
  687. methods: {
  688. onPickerConfirm ({selectedValues : values}) {
  689. if (this.pickerType === 'time') {
  690. this.dataModel = formatTimeValue(values, this.widget.options.format || 'HH:mm:ss')
  691. }
  692. this.showPicker = false
  693. this.pickerType = ''
  694. },
  695. onCalendarConfirm (value) {
  696. if (Array.isArray(value)) {
  697. this.dataModel = value.map(item => this.widget.options.timestamp ? item.getTime() : item.toLocaleDateString())
  698. } else {
  699. this.dataModel = this.widget.options.timestamp ? value.getTime() : value.toLocaleDateString()
  700. }
  701. this.showPicker = false
  702. this.pickerType = ''
  703. },
  704. onShowPicker (type) {
  705. if (this.printRead) return ;
  706. this.pickerType = type
  707. if (type == 'time') {
  708. this.pickerValue = parseTimeToArray(this.dataModel, this.widget.options.format || 'HH:mm:ss')
  709. }
  710. if (type == 'date') {
  711. this.pickerValue = (() => {
  712. if (Array.isArray(this.dataModel)) {
  713. return this.dataModel.map(item => new Date(item))
  714. }
  715. return new Date(this.dataModel)
  716. })()
  717. }
  718. this.showPicker = true
  719. },
  720. loadOptions (data) {
  721. if (!Array.isArray(data)) return
  722. this.remoteOptions = data.map(item => {
  723. if (this.widget.type == 'cascader' || this.widget.type == 'treeselect' || this.widget.type == 'deptCascader') {
  724. if (this.widget.options.props.children && this.widget.options.props.children.length && Object.keys(item).includes(this.widget.options.props.children)) {
  725. return {
  726. value: item[this.widget.options.props.value],
  727. text: item[this.widget.options.props.label],
  728. children: this.processRemoteProps(item[this.widget.options.props.children], this.widget.options.props)
  729. }
  730. }
  731. return {
  732. value: item[this.widget.options.props.value],
  733. text: item[this.widget.options.props.label],
  734. }
  735. }
  736. if (this.widget.options.props.children && this.widget.options.props.children.length && Object.keys(item).includes(this.widget.options.props.children)) {
  737. return {
  738. value: item[this.widget.options.props.value],
  739. text: this.widget.options.showLabel ? item[this.widget.options.props.label] : item[this.widget.options.props.value],
  740. children: this.processRemoteProps(item[this.widget.options.props.children], this.widget.options.props)
  741. }
  742. } else {
  743. if (this.widget.type == 'steps') {
  744. return {
  745. title: item[this.widget.options.props.title],
  746. description: item[this.widget.options.props.description]
  747. }
  748. } else if (this.widget.type == 'transfer') {
  749. return {
  750. key: item[this.widget.options.props.key],
  751. title: item[this.widget.options.props.label],
  752. disabled: item[this.widget.options.props.disabled]
  753. }
  754. } else {
  755. return {
  756. value: item[this.widget.options.props.value],
  757. text: this.widget.options.showLabel ? item[this.widget.options.props.label] : item[this.widget.options.props.value]
  758. }
  759. }
  760. }
  761. })
  762. },
  763. processRemoteProps (children, props) {
  764. if (children && children.length) {
  765. return children.map(item => {
  766. if (this.processRemoteProps(item[props.children], props).length) {
  767. return {
  768. value: item[props.value],
  769. text: item[props.label],
  770. children: this.processRemoteProps(item[props.children], props)
  771. }
  772. } else{
  773. return {
  774. value: item[props.value],
  775. text: item[props.label],
  776. }
  777. }
  778. })
  779. } else {
  780. return []
  781. }
  782. },
  783. handleOnUploadLocal () {
  784. this.$emit('on-upload-local', this.widget.model)
  785. },
  786. }
  787. }
  788. </script>