WidgetElementItem.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. <template>
  2. <template v-if="element.type == 'input'">
  3. <el-input
  4. v-model="element.options.defaultValue"
  5. :style="{width: isTable ? '100%' : element.options.width}"
  6. :placeholder="element.options.placeholder"
  7. :disabled="elementDisabled"
  8. :show-password="element.options.showPassword"
  9. :maxlength="element.options.maxlength"
  10. :show-word-limit="element.options.showWordLimit"
  11. v-bind="{...element.options.customProps, ...extendProps}"
  12. ></el-input>
  13. </template>
  14. <template v-if="element.type == 'textarea'">
  15. <el-input type="textarea" :rows="element.options.rows"
  16. v-model="element.options.defaultValue"
  17. :style="{width: isTable ? '100%' : element.options.width}"
  18. :disabled="elementDisabled"
  19. :placeholder="element.options.placeholder"
  20. :maxlength="element.options.maxlength"
  21. :show-word-limit="element.options.showWordLimit"
  22. :autosize="element.options.autosize"
  23. v-bind="{...element.options.customProps, ...extendProps}"
  24. ></el-input>
  25. </template>
  26. <template v-if="element.type == 'number'">
  27. <el-input-number
  28. v-model="element.options.defaultValue"
  29. :disabled="elementDisabled"
  30. :controls-position="element.options.controlsPosition"
  31. :precision="element.options.precision"
  32. :controls="element.options.controls"
  33. :style="{width: isTable ? '100%' : element.options.width}"
  34. v-bind="{...element.options.customProps, ...extendProps}"
  35. ></el-input-number>
  36. </template>
  37. <template v-if="element.type == 'radio'">
  38. <el-radio-group v-model="element.options.defaultValue"
  39. :style="{width: isTable ? '100%' : element.options.width, display: 'block'}"
  40. :disabled="elementDisabled"
  41. v-bind="{...element.options.customProps, ...extendProps}"
  42. >
  43. <el-radio
  44. :style="{display: element.options.inline ? 'inline-block' : 'block'}"
  45. :label="item.value" :value="item.value" v-for="(item, index) in element.options.options" :key="item.value + index"
  46. >
  47. {{element.options.showLabel ? item.label : item.value}}
  48. </el-radio>
  49. </el-radio-group>
  50. </template>
  51. <template v-if="element.type == 'checkbox'">
  52. <el-checkbox-group v-model="element.options.defaultValue"
  53. :style="{width: isTable ? '100%' : element.options.width}"
  54. :disabled="elementDisabled"
  55. v-bind="{...element.options.customProps, ...extendProps}"
  56. >
  57. <el-checkbox
  58. :style="{display: element.options.inline ? 'inline-block' : 'block'}"
  59. :label="item.value" :value="item.value" v-for="(item, index) in element.options.options" :key="item.value + index"
  60. >
  61. {{element.options.showLabel ? item.label : item.value}}
  62. </el-checkbox>
  63. </el-checkbox-group>
  64. </template>
  65. <template v-if="element.type == 'time'">
  66. <el-time-picker
  67. :key="elementKey"
  68. v-model="element.options.defaultValue"
  69. :is-range="element.options.isRange"
  70. :placeholder="element.options.placeholder"
  71. :start-placeholder="element.options.startPlaceholder"
  72. :end-placeholder="element.options.endPlaceholder"
  73. :readonly="element.options.readonly"
  74. :disabled="elementDisabled"
  75. :editable="element.options.editable"
  76. :clearable="element.options.clearable"
  77. :style="{width: isTable ? '100%' : element.options.width}"
  78. :value-format="element.options.format"
  79. v-bind="{...element.options.customProps, ...extendProps}"
  80. >
  81. </el-time-picker>
  82. </template>
  83. <template v-if="element.type == 'date'">
  84. <el-date-picker
  85. :key="elementKey"
  86. v-model="element.options.defaultValue"
  87. :type="element.options.type"
  88. :is-range="element.options.isRange"
  89. :placeholder="element.options.placeholder"
  90. :start-placeholder="element.options.startPlaceholder"
  91. :end-placeholder="element.options.endPlaceholder"
  92. :readonly="element.options.readonly"
  93. :disabled="elementDisabled"
  94. :editable="element.options.editable"
  95. :clearable="element.options.clearable"
  96. :value-format="element.options.timestamp ? 'x' : element.options.format"
  97. :format="element.options.format"
  98. :style="{width: isTable ? '100%' : element.options.width}"
  99. v-bind="{...element.options.customProps, ...extendProps}"
  100. >
  101. </el-date-picker>
  102. </template>
  103. <template v-if="element.type == 'rate'">
  104. <el-rate v-model="element.options.defaultValue"
  105. :max="element.options.max"
  106. :disabled="elementDisabled"
  107. :allow-half="element.options.allowHalf"
  108. :show-score="element.options.showScore"
  109. :style="{width: isTable ? '100%' : element.options.width, display: 'inline-block'}"
  110. v-bind="{...element.options.customProps, ...extendProps}"
  111. ></el-rate>
  112. </template>
  113. <template v-if="element.type == 'color'">
  114. <el-color-picker
  115. v-model="element.options.defaultValue"
  116. :disabled="elementDisabled"
  117. :show-alpha="element.options.showAlpha"
  118. v-bind="{...element.options.customProps, ...extendProps}"
  119. ></el-color-picker>
  120. </template>
  121. <template v-if="element.type == 'select'">
  122. <el-select
  123. v-model="element.options.defaultValue"
  124. :disabled="elementDisabled"
  125. :multiple="element.options.multiple"
  126. :clearable="element.options.clearable"
  127. :placeholder="element.options.placeholder"
  128. :style="{width: isTable ? '100%' : element.options.width}"
  129. v-bind="{...element.options.customProps, ...extendProps}"
  130. >
  131. <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>
  132. </el-select>
  133. </template>
  134. <template v-if="element.type=='switch'">
  135. <el-switch
  136. v-model="element.options.defaultValue"
  137. :disabled="elementDisabled"
  138. :style="{width: isTable ? '100%' : element.options.width}"
  139. v-bind="{...element.options.customProps, ...extendProps}"
  140. >
  141. </el-switch>
  142. </template>
  143. <template v-if="element.type=='slider'">
  144. <el-slider
  145. v-model="element.options.defaultValue"
  146. :min="element.options.min"
  147. :max="element.options.max"
  148. :disabled="elementDisabled"
  149. :step="element.options.step"
  150. :show-input="element.options.showInput"
  151. :range="element.options.range"
  152. :style="{width: isTable ? '100%' : element.options.width}"
  153. v-bind="{...element.options.customProps, ...extendProps}"
  154. ></el-slider>
  155. </template>
  156. <template v-if="element.type=='imgupload'">
  157. <fm-upload
  158. v-model="element.options.defaultValue"
  159. :disabled="elementDisabled"
  160. :style="{'width': isTable ? '100%' : element.options.width}"
  161. :width="element.options.size.width"
  162. :height="element.options.size.height"
  163. token="xxx"
  164. domain="xxx"
  165. >
  166. </fm-upload>
  167. </template>
  168. <template v-if="element.type == 'cascader'">
  169. <el-cascader
  170. v-model="element.options.defaultValue"
  171. :disabled="elementDisabled"
  172. :clearable="element.options.clearable"
  173. :placeholder="element.options.placeholder"
  174. :style="{width: isTable ? '100%' : element.options.width}"
  175. :options="element.options.remote ? [] : element.options.options"
  176. :props="{multiple: element.options.multiple, checkStrictly: element.options.checkStrictly}"
  177. v-bind="{...element.options.customProps, ...extendProps}"
  178. >
  179. </el-cascader>
  180. </template>
  181. <template v-if="element.type == 'treeselect'">
  182. <el-tree-select
  183. :key="element.options.defaultValue"
  184. v-model="element.options.defaultValue"
  185. :disabled="elementDisabled"
  186. :clearable="element.options.clearable"
  187. :placeholder="element.options.placeholder"
  188. :style="{width: isTable ? '100%' : element.options.width}"
  189. :data="element.options.remote ? [] : element.options.options"
  190. :multiple="element.options.multiple"
  191. v-bind="{...element.options.customProps, ...extendProps}"
  192. ></el-tree-select>
  193. </template>
  194. <template v-if="element.type == 'editor'">
  195. <Editor
  196. :modelValue="element.options.defaultValue"
  197. :custom-style="{width: isTable ? '100%' : element.options.width, cursor: elementDisabled ? 'no-drop' : '', backgroundColor: elementDisabled ? '#F5F7FA' : ''}"
  198. :toolbar="element.options.customToolbar"
  199. class="fm-editor"
  200. :disabled="elementDisabled"
  201. :key="elementKey"
  202. ></Editor>
  203. </template>
  204. <template v-if="element.type=='blank'">
  205. <div style="height: 50px;color: #999;line-height:50px;text-align:center;width: 100%;">{{element.model}}</div>
  206. </template>
  207. <template v-if="element.type == 'component'">
  208. <component :style="{width: isTable ? '100%' : element.options.width}" :is="`component-${element.key}`" :key="key" v-model="element.options.defaultValue"></component>
  209. </template>
  210. <template v-if="element.type == 'custom'">
  211. <component
  212. :is="element.el"
  213. v-model="element.options.defaultValue"
  214. :width="element.options.width"
  215. :height="element.options.height"
  216. :placeholder="element.options.placeholder"
  217. :readonly="element.options.readonly"
  218. :disabled="elementDisabled"
  219. :editable="element.options.editable"
  220. :clearable="element.options.clearable"
  221. v-bind="{...element.options.customProps, ...extendProps}"
  222. ></component>
  223. </template>
  224. <template v-if="element.type == 'text'">
  225. <span :style="{'width': isTable ? '100%' : (element.options.width || '100%'), display: 'inline-block'}">{{element.options.defaultValue}}</span>
  226. </template>
  227. <template v-if="element.type == 'html'">
  228. <span :style="{'width': isTable ? '100%' : (element.options.width || '100%'), display: 'inline-block'}" v-html="element.options.defaultValue"></span>
  229. </template>
  230. <template v-if="element.type == 'fileupload'">
  231. <el-upload
  232. action="https://jsonplaceholder.typicode.com/posts/"
  233. :style="{width: isTable ? '100%' : element.options.width}"
  234. :disabled="elementDisabled"
  235. :limit="element.options.limit"
  236. >
  237. <el-button size="default" type="primary">{{$t('fm.actions.upload')}}</el-button>
  238. </el-upload>
  239. </template>
  240. <template v-if="element.type == 'button'">
  241. <el-button
  242. :disabled="elementDisabled"
  243. :size="element.options.buttonSize"
  244. :type="element.options.buttonType == 'text' || element.options.buttonType == 'link' ? 'primary' : element.options.buttonType"
  245. :text="element.options.buttonType == 'text'"
  246. :link="element.options.buttonType == 'link'"
  247. :plain="element.options.buttonPlain"
  248. :round="element.options.buttonRound"
  249. :circle="element.options.buttonCircle"
  250. :style="{width: element.options.width}"
  251. v-bind="{...element.options.customProps, ...extendProps}"
  252. >
  253. {{element.options.buttonName}}
  254. </el-button>
  255. </template>
  256. <template v-if="element.type == 'link'">
  257. <el-link
  258. :disabled="elementDisabled"
  259. :type="element.options.linkType"
  260. :underline="element.options.underline"
  261. v-bind="{...element.options.customProps, ...extendProps}"
  262. >
  263. {{element.options.linkName}}
  264. </el-link>
  265. </template>
  266. <template v-if="element.type == 'steps'">
  267. <el-steps
  268. :active="element.options.defaultValue"
  269. :space="element.options.space"
  270. :direction="element.options.direction"
  271. :process-status="element.options.processStatus"
  272. :finish-status="element.options.finishStatus"
  273. :align-center="element.options.alignCenter"
  274. :simple="element.options.simple"
  275. :style="{'line-height': 'normal'}"
  276. v-bind="{...element.options.customProps, ...extendProps}"
  277. >
  278. <el-step :title="item.title" :description="item.description" v-for="(item, index) in element.options.steps" :key="index"></el-step>
  279. </el-steps>
  280. </template>
  281. <template v-if="element.type == 'transfer'">
  282. <el-transfer
  283. :model-value="element.options.defaultValue"
  284. :data="element.options.data"
  285. :filterable="element.options.filterable"
  286. :titles="element.options.titles"
  287. :style="{'width': isTable ? '100%' : element.options.width}"
  288. v-bind="{...element.options.customProps, ...extendProps}"
  289. ></el-transfer>
  290. </template>
  291. <template v-if="element.type == 'pagination'">
  292. <el-pagination
  293. v-model:currentPage="element.options.defaultValue"
  294. :page-size="element.options.pageSize"
  295. :pager-count="element.options.pagerCount"
  296. :disabled="elementDisabled"
  297. :background="element.options.background"
  298. layout="total, prev, pager, next"
  299. :total="element.options.total"
  300. v-bind="{...element.options.customProps, ...extendProps}"
  301. />
  302. </template>
  303. <template v-if="element.type == 'list'">
  304. <data-table
  305. v-model="element.options.defaultValue"
  306. is-design
  307. :columns="element.options.columns"
  308. :showOperation="element.options.showOperation"
  309. :operations="element.options.operations"
  310. :pagination="element.options.pagination"
  311. :style="{'width': isTable ? '100%' : element.options.width}"
  312. :max-height="element.options.maxHeight"
  313. :stripe="element.options.stripe"
  314. :border="element.options.border"
  315. :selection="element.options.selection"
  316. ></data-table>
  317. </template>
  318. </template>
  319. <script>
  320. import FmUpload from './Upload/index.vue'
  321. import Editor from './Editor/index.vue'
  322. import DataTable from './DataTable/index.vue'
  323. import { widgetElementItemMixin } from '../mixins/widgetElementItem.js'
  324. export default {
  325. name: 'WidgetElementItem',
  326. components: {
  327. FmUpload,
  328. Editor,
  329. DataTable
  330. },
  331. mixins: [widgetElementItemMixin]
  332. }
  333. </script>