WidgetElementItem.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. <template>
  2. <span>
  3. <template v-if="element.type == 'input'">
  4. <el-input
  5. v-model="element.options.defaultValue"
  6. :style="{width: isTable ? '100%' : element.options.width}"
  7. :placeholder="element.options.placeholder"
  8. :disabled="elementDisabled"
  9. :show-password="element.options.showPassword"
  10. :maxlength="element.options.maxlength"
  11. :show-word-limit="element.options.showWordLimit"
  12. v-bind="{...element.options.customProps, ...extendProps}"
  13. ></el-input>
  14. </template>
  15. <template v-if="element.type == 'textarea'">
  16. <el-input type="textarea" :rows="element.options.rows"
  17. v-model="element.options.defaultValue"
  18. :style="{width: isTable ? '100%' : element.options.width}"
  19. :disabled="elementDisabled"
  20. :placeholder="element.options.placeholder"
  21. :maxlength="element.options.maxlength"
  22. :show-word-limit="element.options.showWordLimit"
  23. :autosize="element.options.autosize"
  24. v-bind="{...element.options.customProps, ...extendProps}"
  25. ></el-input>
  26. </template>
  27. <template v-if="element.type == 'number'">
  28. <el-input-number
  29. v-model="element.options.defaultValue"
  30. :disabled="elementDisabled"
  31. :controls-position="element.options.controlsPosition"
  32. :precision="element.options.precision"
  33. :controls="element.options.controls"
  34. :style="{width: isTable ? '100%' : element.options.width}"
  35. v-bind="{...element.options.customProps, ...extendProps}"
  36. ></el-input-number>
  37. </template>
  38. <template v-if="element.type == 'radio'">
  39. <el-radio-group v-model="element.options.defaultValue"
  40. :style="{width: isTable ? '100%' : element.options.width}"
  41. :disabled="elementDisabled"
  42. v-bind="{...element.options.customProps, ...extendProps}"
  43. >
  44. <el-radio
  45. :style="{display: element.options.inline ? 'inline-block' : 'block'}"
  46. :label="item.value" v-for="(item, index) in element.options.options" :key="item.value + index"
  47. >
  48. {{element.options.showLabel ? item.label : item.value}}
  49. </el-radio>
  50. </el-radio-group>
  51. </template>
  52. <template v-if="element.type == 'checkbox'">
  53. <el-checkbox-group v-model="element.options.defaultValue"
  54. :style="{width: isTable ? '100%' : element.options.width}"
  55. :disabled="elementDisabled"
  56. v-bind="{...element.options.customProps, ...extendProps}"
  57. >
  58. <el-checkbox
  59. :style="{display: element.options.inline ? 'inline-block' : 'block'}"
  60. :label="item.value" v-for="(item, index) in element.options.options" :key="item.value + index"
  61. >
  62. {{element.options.showLabel ? item.label : item.value}}
  63. </el-checkbox>
  64. </el-checkbox-group>
  65. </template>
  66. <template v-if="element.type == 'time'">
  67. <el-time-picker
  68. :key="elementKey"
  69. :default-value="element.options.defaultValue"
  70. v-model="element.options.defaultValue"
  71. :is-range="element.options.isRange"
  72. :placeholder="element.options.placeholder"
  73. :start-placeholder="element.options.startPlaceholder"
  74. :end-placeholder="element.options.endPlaceholder"
  75. :readonly="element.options.readonly"
  76. :disabled="elementDisabled"
  77. :editable="element.options.editable"
  78. :clearable="element.options.clearable"
  79. :style="{width: isTable ? '100%' : element.options.width}"
  80. :value-format="element.options.format"
  81. v-bind="{...element.options.customProps, ...extendProps}"
  82. >
  83. </el-time-picker>
  84. </template>
  85. <template v-if="element.type == 'date'">
  86. <el-date-picker
  87. :key="elementKey"
  88. v-model="element.options.defaultValue"
  89. :type="element.options.type"
  90. :is-range="element.options.isRange"
  91. :placeholder="element.options.placeholder"
  92. :start-placeholder="element.options.startPlaceholder"
  93. :end-placeholder="element.options.endPlaceholder"
  94. :readonly="element.options.readonly"
  95. :disabled="elementDisabled"
  96. :editable="element.options.editable"
  97. :clearable="element.options.clearable"
  98. :value-format="element.options.timestamp ? 'timestamp' : element.options.format"
  99. :format="element.options.format"
  100. :style="{width: isTable ? '100%' : element.options.width}"
  101. v-bind="{...element.options.customProps, ...extendProps}"
  102. >
  103. </el-date-picker>
  104. </template>
  105. <!-- <template v-if="element.type == 'takeLeaveDate'">-->
  106. <!-- <el-date-picker-->
  107. <!-- :key="elementKey"-->
  108. <!-- v-model="element['components'][0].options.defaultValue"-->
  109. <!-- :type="element['components'][0].options.type"-->
  110. <!-- :is-range="element['components'][0].options.isRange"-->
  111. <!-- :placeholder="element['components'][0].options.placeholder"-->
  112. <!-- :start-placeholder="element['components'][0].options.startPlaceholder"-->
  113. <!-- :end-placeholder="element['components'][0].options.endPlaceholder"-->
  114. <!-- :readonly="element['components'][0].options.readonly"-->
  115. <!-- :disabled="elementDisabled"-->
  116. <!-- :editable="element['components'][0].options.editable"-->
  117. <!-- :clearable="element['components'][0].options.clearable"-->
  118. <!-- :value-format="element['components'][0].options.timestamp ? 'timestamp' : element['components'][0].options.format"-->
  119. <!-- :format="element['components'][0].options.format"-->
  120. <!-- :style="{width: isTable ? '100%' : element['components'][0].options.width}"-->
  121. <!-- v-bind="{...element['components'][0].options.customProps, ...extendProps}"-->
  122. <!-- >-->
  123. <!-- </el-date-picker>-->
  124. <!-- <el-date-picker-->
  125. <!-- :key="elementKey"-->
  126. <!-- v-model="element.options.defaultValue"-->
  127. <!-- :type="element.options.type"-->
  128. <!-- :is-range="element.options.isRange"-->
  129. <!-- :placeholder="element.options.placeholder"-->
  130. <!-- :start-placeholder="element.options.startPlaceholder"-->
  131. <!-- :end-placeholder="element.options.endPlaceholder"-->
  132. <!-- :readonly="element.options.readonly"-->
  133. <!-- :disabled="elementDisabled"-->
  134. <!-- :editable="element.options.editable"-->
  135. <!-- :clearable="element.options.clearable"-->
  136. <!-- :value-format="element.options.timestamp ? 'timestamp' : element.options.format"-->
  137. <!-- :format="element.options.format"-->
  138. <!-- :style="{width: isTable ? '100%' : element.options.width}"-->
  139. <!-- v-bind="{...element.options.customProps, ...extendProps}"-->
  140. <!-- >-->
  141. <!-- </el-date-picker>-->
  142. <!-- <el-input type="textarea" :rows="element.options.rows"-->
  143. <!-- v-model="element.options.defaultValue"-->
  144. <!-- :style="{width: isTable ? '100%' : element.options.width}"-->
  145. <!-- :disabled="elementDisabled"-->
  146. <!-- :placeholder="element.options.placeholder"-->
  147. <!-- :maxlength="element.options.maxlength"-->
  148. <!-- :show-word-limit="element.options.showWordLimit"-->
  149. <!-- :autosize="element.options.autosize"-->
  150. <!-- v-bind="{...element.options.customProps, ...extendProps}"-->
  151. <!-- ></el-input>-->
  152. <!-- </template>-->
  153. <template v-if="element.type == 'rate'">
  154. <el-rate v-model="element.options.defaultValue"
  155. :max="element.options.max"
  156. :disabled="elementDisabled"
  157. :allow-half="element.options.allowHalf"
  158. :show-score="element.options.showScore"
  159. :style="{width: isTable ? '100%' : element.options.width, display: 'inline-block'}"
  160. v-bind="{...element.options.customProps, ...extendProps}"
  161. ></el-rate>
  162. </template>
  163. <template v-if="element.type == 'color'">
  164. <el-color-picker
  165. v-model="element.options.defaultValue"
  166. :disabled="elementDisabled"
  167. :show-alpha="element.options.showAlpha"
  168. v-bind="{...element.options.customProps, ...extendProps}"
  169. ></el-color-picker>
  170. </template>
  171. <template v-if="element.type == 'select'">
  172. <el-select
  173. v-model="element.options.defaultValue"
  174. :disabled="elementDisabled"
  175. :multiple="element.options.multiple"
  176. :clearable="element.options.clearable"
  177. :placeholder="element.options.placeholder"
  178. :style="{width: isTable ? '100%' : element.options.width}"
  179. v-bind="{...element.options.customProps, ...extendProps}"
  180. >
  181. <el-option v-for="item in element.options.options" :key="item.value" :value="item.value" :label="element.options.showLabel?item.label:item.value"></el-option>
  182. </el-select>
  183. </template>
  184. <template v-if="element.type == 'deptSelect'">
  185. <el-select
  186. v-model="element.options.defaultValue"
  187. :disabled="elementDisabled"
  188. :multiple="element.options.multiple"
  189. :clearable="element.options.clearable"
  190. :placeholder="element.options.placeholder"
  191. :style="{width: isTable ? '100%' : element.options.width}"
  192. v-bind="{...element.options.customProps, ...extendProps}"
  193. >
  194. <el-option v-for="item in element.options.options" :key="item.value" :value="item.value" :label="element.options.showLabel?item.label:item.value"></el-option>
  195. </el-select>
  196. </template>
  197. <template v-if="element.type == 'userSelect'">
  198. <el-select
  199. v-model="element.options.defaultValue"
  200. :disabled="elementDisabled"
  201. :multiple="element.options.multiple"
  202. :clearable="element.options.clearable"
  203. :placeholder="element.options.placeholder"
  204. :style="{width: isTable ? '100%' : element.options.width}"
  205. v-bind="{...element.options.customProps, ...extendProps}"
  206. >
  207. <el-option v-for="item in element.options.options" :key="item.value" :value="item.value" :label="element.options.showLabel?item.label:item.value"></el-option>
  208. </el-select>
  209. </template>
  210. <template v-if="element.type=='switch'">
  211. <el-switch
  212. v-model="element.options.defaultValue"
  213. :disabled="elementDisabled"
  214. :style="{width: isTable ? '100%' : element.options.width}"
  215. v-bind="{...element.options.customProps, ...extendProps}"
  216. >
  217. </el-switch>
  218. </template>
  219. <template v-if="element.type=='slider'">
  220. <el-slider
  221. v-model="element.options.defaultValue"
  222. :min="element.options.min"
  223. :max="element.options.max"
  224. :disabled="elementDisabled"
  225. :step="element.options.step"
  226. :show-input="element.options.showInput"
  227. :range="element.options.range"
  228. :style="{width: isTable ? '100%' : element.options.width}"
  229. v-bind="{...element.options.customProps, ...extendProps}"
  230. ></el-slider>
  231. </template>
  232. <template v-if="element.type=='imgupload'">
  233. <fm-upload
  234. v-model="element.options.defaultValue"
  235. :disabled="elementDisabled"
  236. :style="{'width': isTable ? '100%' : element.options.width}"
  237. :width="element.options.size.width"
  238. :height="element.options.size.height"
  239. token="xxx"
  240. domain="xxx"
  241. >
  242. </fm-upload>
  243. </template>
  244. <template v-if="element.type == 'cascader'">
  245. <el-cascader
  246. v-model="element.options.defaultValue"
  247. :disabled="elementDisabled"
  248. :clearable="element.options.clearable"
  249. :placeholder="element.options.placeholder"
  250. :style="{width: isTable ? '100%' : element.options.width}"
  251. :options="element.options.remote ? [] : element.options.options"
  252. :props="{multiple: element.options.multiple, checkStrictly: element.options.checkStrictly}"
  253. v-bind="{...element.options.customProps, ...extendProps}"
  254. >
  255. </el-cascader>
  256. </template>
  257. <template v-if="element.type == 'deptAndUserCascader'">
  258. <el-cascader
  259. v-model="element.options.defaultValue"
  260. :disabled="elementDisabled"
  261. :clearable="element.options.clearable"
  262. :placeholder="element.options.placeholder"
  263. :style="{width: isTable ? '100%' : element.options.width}"
  264. :options="element.options.remote ? [] : element.options.options"
  265. :props="{multiple: element.options.multiple, checkStrictly: element.options.checkStrictly}"
  266. v-bind="{...element.options.customProps, ...extendProps}"
  267. >
  268. </el-cascader>
  269. </template>
  270. <template v-if="element.type == 'deptCascader'">
  271. <el-cascader
  272. v-model="element.options.defaultValue"
  273. :disabled="elementDisabled"
  274. :clearable="element.options.clearable"
  275. :placeholder="element.options.placeholder"
  276. :style="{width: isTable ? '100%' : element.options.width}"
  277. :options="element.options.remote ? [] : element.options.options"
  278. :props="{multiple: element.options.multiple, checkStrictly: element.options.checkStrictly}"
  279. v-bind="{...element.options.customProps, ...extendProps}"
  280. >
  281. </el-cascader>
  282. </template>
  283. <template v-if="element.type == 'editor'">
  284. <vue-editor
  285. v-model="element.options.defaultValue"
  286. :style="{width: isTable ? '100%' : element.options.width, cursor: elementDisabled ? 'no-drop' : '', backgroundColor: elementDisabled ? '#F5F7FA' : ''}"
  287. :editor-toolbar="element.options.customToolbar"
  288. class="fm-editor"
  289. :disabled="elementDisabled"
  290. >
  291. </vue-editor>
  292. </template>
  293. <template v-if="element.type=='blank'">
  294. <div style="height: 50px;color: #999;background: #eee;line-height:50px;text-align:center;">{{element.model}}</div>
  295. </template>
  296. <template v-if="element.type == 'component'">
  297. <component :style="{width: isTable ? '100%' : element.options.width}" :is="`component-${element.key}`" :key="key" v-model="element.options.defaultValue"></component>
  298. </template>
  299. <template v-if="element.type == 'custom'">
  300. <component
  301. :is="element.el"
  302. v-model="element.options.defaultValue"
  303. :width="element.options.width"
  304. :height="element.options.height"
  305. :placeholder="element.options.placeholder"
  306. :readonly="element.options.readonly"
  307. :disabled="elementDisabled"
  308. :editable="element.options.editable"
  309. :clearable="element.options.clearable"
  310. v-bind="{...element.options.customProps, ...extendProps}"
  311. ></component>
  312. </template>
  313. <template v-if="element.type == 'text'">
  314. <span :style="{'width': isTable ? '100%' : (element.options.width || '100%'), display: 'inline-block'}">{{element.options.defaultValue}}</span>
  315. </template>
  316. <template v-if="element.type == 'html'">
  317. <span :style="{'width': isTable ? '100%' : (element.options.width || '100%'), display: 'inline-block'}" v-html="element.options.defaultValue"></span>
  318. </template>
  319. <template v-if="element.type == 'fileupload'">
  320. <el-upload
  321. action="https://jsonplaceholder.typicode.com/posts/"
  322. :style="{width: isTable ? '100%' : element.options.width}"
  323. :disabled="elementDisabled"
  324. :limit="element.options.limit"
  325. >
  326. <el-button size="small" type="primary">{{$t('fm.actions.upload')}}</el-button>
  327. </el-upload>
  328. </template>
  329. <template v-if="element.type == 'button'">
  330. <el-button
  331. :disabled="elementDisabled"
  332. :type="element.options.buttonType"
  333. :plain="element.options.buttonPlain"
  334. :round="element.options.buttonRound"
  335. :circle="element.options.buttonCircle"
  336. :style="{width: element.options.width}"
  337. v-bind="{...element.options.customProps, ...extendProps}"
  338. >
  339. {{element.options.buttonName}}
  340. </el-button>
  341. </template>
  342. <template v-if="element.type == 'link'">
  343. <el-link
  344. :disabled="elementDisabled"
  345. :type="element.options.linkType"
  346. :underline="element.options.underline"
  347. v-bind="{...element.options.customProps, ...extendProps}"
  348. >
  349. {{element.options.linkName}}
  350. </el-link>
  351. </template>
  352. <template v-if="element.type == 'steps'">
  353. <el-steps
  354. :active="element.options.defaultValue"
  355. :space="element.options.space"
  356. :direction="element.options.direction"
  357. :process-status="element.options.processStatus"
  358. :finish-status="element.options.finishStatus"
  359. :align-center="element.options.alignCenter"
  360. :simple="element.options.simple"
  361. :style="{'line-height': 'normal'}"
  362. v-bind="{...element.options.customProps, ...extendProps}"
  363. >
  364. <el-step :title="item.title" :description="item.description" v-for="(item, index) in element.options.steps" :key="index"></el-step>
  365. </el-steps>
  366. </template>
  367. <template v-if="element.type == 'pagination'">
  368. <el-pagination
  369. :current-page.sync="element.options.defaultValue"
  370. :page-size="element.options.pageSize"
  371. :pager-count="element.options.pagerCount"
  372. :disabled="elementDisabled"
  373. :background="element.options.background"
  374. layout="total, prev, pager, next"
  375. :total="element.options.total"
  376. v-bind="{...element.options.customProps, ...extendProps}"
  377. />
  378. </template>
  379. <template v-if="element.type == 'transfer'">
  380. <el-transfer
  381. :value="element.options.defaultValue"
  382. :data="element.options.data"
  383. :filterable="element.options.filterable"
  384. :titles="element.options.titles"
  385. :style="{'width': isTable ? '100%' : element.options.width}"
  386. v-bind="{...element.options.customProps, ...extendProps}"
  387. ></el-transfer>
  388. </template>
  389. </span>
  390. </template>
  391. <script>
  392. import FmUpload from './Upload'
  393. import Vue from 'vue'
  394. import {executeExpression, isExpression, extractExpression} from '../util/expression'
  395. export default {
  396. components: {
  397. FmUpload
  398. },
  399. props: ['element', 'isTable'],
  400. data () {
  401. return {
  402. key: Math.random().toString(36).slice(-8),
  403. elementKey: Math.random().toString(36).slice(-8)
  404. }
  405. },
  406. computed: {
  407. elementDisabled () {
  408. if (isExpression(this.element.options.disabled)) {
  409. return true
  410. }
  411. return this.element.options.disabled
  412. },
  413. extendProps () {
  414. let obj = {}
  415. this.element.options.extendProps && Object.keys(this.element.options.extendProps).forEach(key => {
  416. let value = this.element.options.extendProps[key]
  417. if (!isExpression(value)) {
  418. obj[key] = value
  419. } else {
  420. obj[key] = executeExpression(extractExpression(value), this.currentOptions, this.formContext)
  421. }
  422. })
  423. return obj
  424. },
  425. },
  426. created () {
  427. console.log('---***', this.element)
  428. if (this.element.type == 'component') {
  429. Vue.component(`component-${this.element.key}`, {
  430. template: `<span>${this.element.options.template}</span>`,
  431. props: ['dataModel', 'formState']
  432. })
  433. }
  434. },
  435. watch: {
  436. 'element.options.template': function (val) {
  437. Vue.component(`component-${this.element.key}`, {
  438. template: `<span>${val}</span>`,
  439. props: ['dataModel', 'formState']
  440. })
  441. this.key = Math.random().toString(36).slice(-8)
  442. },
  443. 'element.options.defaultValue': function (val) {
  444. console.log(val)
  445. this.elementKey = Math.random().toString(36).slice(-8)
  446. }
  447. }
  448. }
  449. </script>