WidgetConfig.vue 101 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996
  1. <template>
  2. <el-scrollbar>
  3. <div>
  4. <div v-if="show" :key="data.key">
  5. <el-form label-position="top" size="default" :model="data">
  6. <el-form-item :label="$t('fm.config.widget.widgetType')">
  7. <el-tag effect="plain">
  8. <template v-if="data.type === 'custom'">
  9. <i class="icon fm-iconfont icon-extend" style="font-size: 14px;"></i>&nbsp;
  10. {{$t(`fm.components.custom.title`)}}
  11. </template>
  12. <template v-else>
  13. <i :class="`fm-iconfont ${data.icon}`" style="font-size: 14px;"></i>&nbsp;
  14. {{$t(`fm.components.fields.${data.type}`)}}
  15. </template>
  16. </el-tag>
  17. </el-form-item>
  18. <el-collapse class="fm-widget-config-collapse" :model-value="['basic', 'options', 'expend', 'columns', 'operation', 'paging']">
  19. <el-collapse-item :title="$t('fm.config.widget.basicSetting')" name="basic">
  20. <el-form-item v-if="data.type != 'td' && data.type != 'th' && data.type != 'col'" :required="true" prop="model" for="">
  21. <template #label>
  22. {{$t('fm.config.widget.model')}}
  23. <i class="fm-iconfont icon-copy" :title="$t('fm.tooltip.copy')" @click="handleCopyField" style="cursor: pointer;font-size: 18px;padding:0 5px;color:var(--fm-color-primary);"></i>
  24. </template>
  25. <div v-if="getModelNode()" style="font-size: 13px; word-break: break-all; line-height: 1.2; color: #e6a23c; padding: 0 5px 5px 5px;">
  26. {{getModelNode()}}
  27. </div>
  28. <div style="display: flex;" class="clipboard-content">
  29. <template v-if="fieldModels?.length > 0">
  30. <el-select
  31. v-model="data.model"
  32. filterable
  33. allow-create
  34. default-first-option
  35. style="width: 100%;"
  36. >
  37. <el-option
  38. v-for="item in fieldModels"
  39. :key="item.fieldId"
  40. :label="item.fieldLabel??item.fieldId"
  41. :value="item.fieldId"
  42. />
  43. </el-select>
  44. </template>
  45. <template v-else>
  46. <el-input clearable v-model="data.model" ></el-input>
  47. </template>
  48. </div>
  49. </el-form-item>
  50. <el-form-item :label="$t('fm.config.widget.name')" v-if="data.type!='grid' && data.type != 'tabs' && data.type != 'collapse' && data.type != 'report' && data.type != 'inline' && data.type != 'td' && data.type != 'th' && data.type != 'col' && data.type != 'alert' && data.type != 'dialog' && data.type != 'card'">
  51. <el-input clearable v-model="data.name"></el-input>
  52. </el-form-item>
  53. <el-form-item :label="$t('fm.config.widget.buttonName')" v-if="Object.keys(data.options).indexOf('buttonName')>=0">
  54. <el-input clearable v-model="data.options.buttonName"></el-input>
  55. </el-form-item>
  56. <el-form-item :label="$t('fm.config.widget.linkName')" v-if="Object.keys(data.options).indexOf('linkName')>=0">
  57. <el-input clearable v-model="data.options.linkName"></el-input>
  58. </el-form-item>
  59. <el-form-item :label="$t('fm.config.widget.otitle')" v-if="Object.keys(data.options).indexOf('title') >= 0">
  60. <el-input clearable v-model="data.options.title" type="textarea" autosize></el-input>
  61. </el-form-item>
  62. <el-form-item :label="$t('fm.config.widget.description')" v-if="Object.keys(data.options).indexOf('description') >= 0">
  63. <el-input clearable v-model="data.options.description" type="textarea" autosize></el-input>
  64. </el-form-item>
  65. <el-form-item :label="$t('fm.config.widget.width')" v-if="Object.keys(data.options).indexOf('width')>=0 && data.type != 'td'">
  66. <el-input clearable v-model="data.options.width" :disabled="getVantMobile()"></el-input>
  67. </el-form-item>
  68. <el-form-item :label="$t('fm.config.widget.height')" v-if="Object.keys(data.options).indexOf('height')>=0">
  69. <el-input clearable v-model="data.options.height"></el-input>
  70. </el-form-item>
  71. <el-form-item :label="$t('fm.config.widget.size')" v-if="data.type == 'imgupload' && Object.keys(data.options).indexOf('size')>=0">
  72. {{$t('fm.config.widget.width')}} <el-input clearable style="width: 90px;" type="number" v-model.number="data.options.size.width"></el-input>
  73. {{$t('fm.config.widget.height')}} <el-input clearable style="width: 90px;" type="number" v-model.number="data.options.size.height"></el-input>
  74. </el-form-item>
  75. <el-form-item :label="$t('fm.config.widget.labelWidth')" v-if="Object.keys(data.options).indexOf('labelWidth')>=0 ">
  76. <el-checkbox v-model="data.options.isLabelWidth" style="margin-right: 5px;">{{$t('fm.config.widget.custom')}}</el-checkbox>
  77. <el-input-number v-model="data.options.labelWidth" :disabled="!data.options.isLabelWidth" :min="0" :max="99999" :step="10"></el-input-number>
  78. </el-form-item>
  79. <el-form-item :label="$t('fm.config.widget.labelWrap')" v-if="data.type !='grid' && data.type != 'tabs' && data.type != 'collapse' && data.type != 'report' && data.type != 'inline' && data.type != 'divider' && data.type != 'td' && data.type != 'th' && data.type != 'col' && data.type != 'alert' && data.type != 'dialog' && data.type != 'card'">
  80. <el-switch v-model="data.options.labelWrap"></el-switch>
  81. </el-form-item>
  82. <el-form-item :label="$t('fm.config.widget.hideLabel')" v-if="data.type !='grid' && data.type != 'tabs' && data.type != 'collapse' && data.type != 'report' && data.type != 'inline' && data.type != 'divider' && data.type != 'td' && data.type != 'th' && data.type != 'col' && data.type != 'alert' && data.type != 'dialog' && data.type != 'card'">
  83. <el-switch v-model="data.options.hideLabel"></el-switch>
  84. </el-form-item>
  85. <el-form-item :label="$t('fm.config.widget.placeholder')" v-if="Object.keys(data.options).indexOf('placeholder')>=0 && (data.type!='time' && data.type!='date')">
  86. <el-input v-model="data.options.placeholder" clearable></el-input>
  87. </el-form-item>
  88. <el-form-item :label="$t('fm.config.widget.tip')" v-if="Object.keys(data.options).indexOf('tip')>=0">
  89. <el-input type="textarea" autosize clearable v-model="data.options.tip" :disabled="getVantMobile()"></el-input>
  90. </el-form-item>
  91. <el-form-item :label="$t('fm.config.widget.layout')" v-if="Object.keys(data.options).indexOf('inline')>=0">
  92. <el-radio-group v-model="data.options.inline">
  93. <el-radio-button :label="false" :value="false">{{$t('fm.config.widget.block')}}</el-radio-button>
  94. <el-radio-button :label="true" :value="true">{{$t('fm.config.widget.inline')}}</el-radio-button>
  95. </el-radio-group>
  96. </el-form-item>
  97. <el-form-item :label="$t('fm.config.widget.effect')" v-if="Object.keys(data.options).indexOf('effect')>=0">
  98. <el-radio-group v-model="data.options.effect" :disabled="getVantMobile()">
  99. <el-radio-button label="light" value="light">light</el-radio-button>
  100. <el-radio-button label="dark" value="dark">dark</el-radio-button>
  101. </el-radio-group>
  102. </el-form-item>
  103. <el-form-item :label="$t('fm.config.widget.contentPosition')" v-if="Object.keys(data.options).indexOf('contentPosition') >= 0">
  104. <el-radio-group v-model="data.options.contentPosition">
  105. <el-radio-button label="left" value="left">{{$t('fm.config.widget.left')}}</el-radio-button>
  106. <el-radio-button label="center" value="center">{{$t('fm.config.widget.center')}}</el-radio-button>
  107. <el-radio-button label="right" value="right">{{$t('fm.config.widget.right')}}</el-radio-button>
  108. </el-radio-group>
  109. </el-form-item>
  110. <el-form-item :label="$t('fm.config.widget.showInput')" v-if="Object.keys(data.options).indexOf('showInput')>=0">
  111. <el-switch v-model="data.options.showInput" :disabled="getVantMobile()"></el-switch>
  112. </el-form-item>
  113. <el-form-item :label="$t('fm.config.widget.min')" v-if="Object.keys(data.options).indexOf('min')>=0">
  114. <el-input-number v-model="data.options.min" :step="1"></el-input-number>
  115. </el-form-item>
  116. <el-form-item :label="$t('fm.config.widget.max')" v-if="Object.keys(data.options).indexOf('max')>=0">
  117. <el-input-number v-model="data.options.max" :step="1"></el-input-number>
  118. </el-form-item>
  119. <el-form-item :label="$t('fm.config.widget.step')" v-if="Object.keys(data.options).indexOf('step')>=0">
  120. <el-input-number v-model="data.options.step" :min="-99999" :max="99999" :step="1"></el-input-number>
  121. </el-form-item>
  122. <el-form-item :label="$t('fm.config.widget.maxlength')" v-if="Object.keys(data.options).indexOf('maxlength')>=0">
  123. <el-input v-model="data.options.maxlength" type="number"></el-input>
  124. </el-form-item>
  125. <el-form-item :label="$t('fm.config.widget.rows')" v-if="Object.keys(data.options).indexOf('rows')>=0">
  126. <el-input-number v-model="data.options.rows"></el-input-number>
  127. </el-form-item>
  128. <el-form-item :label="$t('fm.config.widget.autosize')" v-if="Object.keys(data.options).indexOf('autosize')>=0">
  129. <el-switch v-model="data.options.autosize"></el-switch>
  130. </el-form-item>
  131. <el-form-item :label="$t('fm.config.widget.precision')" v-if="Object.keys(data.options).indexOf('precision')>=0">
  132. <el-input-number v-model="data.options.precision" :min="0" :max="99999" :step="1"></el-input-number>
  133. </el-form-item>
  134. <el-form-item :label="$t('fm.config.widget.controls')" v-if="Object.keys(data.options).indexOf('controls')>=0">
  135. <el-switch v-model="data.options.controls" :disabled="getVantMobile()"></el-switch>
  136. </el-form-item>
  137. <el-form-item :label="$t('fm.config.widget.controlsPosition')" v-if="Object.keys(data.options).indexOf('controlsPosition') >= 0 && data.options.controls">
  138. <el-radio-group v-model="data.options.controlsPosition" :disabled="getVantMobile()">
  139. <el-radio-button label="" value="">{{$t('fm.config.widget.default')}}</el-radio-button>
  140. <el-radio-button label="right" value="right">{{$t('fm.config.widget.right')}}</el-radio-button>
  141. </el-radio-group>
  142. </el-form-item>
  143. <el-form-item :label="$t('fm.config.widget.multiple')" v-if="data.type=='select' || data.type=='imgupload' || data.type == 'fileupload' || data.type == 'cascader' || data.type == 'treeselect'">
  144. <el-switch v-model="data.options.multiple" @change="handleSelectMuliple"></el-switch>
  145. </el-form-item>
  146. <el-form-item :label="$t('fm.config.widget.filterable')" v-if="data.type=='select' || data.type == 'cascader' || data.type=='transfer' || data.type == 'treeselect'">
  147. <el-switch v-model="data.options.filterable"></el-switch>
  148. </el-form-item>
  149. <el-form-item :label="$t('fm.config.widget.checkStrictly')" v-if="Object.keys(data.options).indexOf('checkStrictly')>=0">
  150. <el-switch v-model="data.options.checkStrictly"></el-switch>
  151. </el-form-item>
  152. <el-form-item :label="$t('fm.config.widget.allowHalf')" v-if="Object.keys(data.options).indexOf('allowHalf')>=0">
  153. <el-switch
  154. v-model="data.options.allowHalf"
  155. >
  156. </el-switch>
  157. </el-form-item>
  158. <el-form-item :label="$t('fm.config.widget.showAlpha')" v-if="Object.keys(data.options).indexOf('showAlpha')>=0">
  159. <el-switch
  160. v-model="data.options.showAlpha"
  161. >
  162. </el-switch>
  163. </el-form-item>
  164. <!-- flex布局配置 -->
  165. <template v-if="
  166. data.type == 'inline'
  167. ">
  168. <el-form-item :label="$t('fm.config.widget.flex')">
  169. <el-switch v-model="data.options.flex" :disabled="getVantMobile()"></el-switch>
  170. </el-form-item>
  171. <template v-if="data.type == 'inline'">
  172. <el-form-item :label="$t('fm.config.widget.justify')" v-if="data.options.flex">
  173. <el-radio-group v-model="data.options.flexJustify" size="small" :disabled="getVantMobile()">
  174. <el-radio-button value="flex-start">
  175. <i class="fm-iconfont icon-justify-content-flex-start-icon" ></i>
  176. </el-radio-button>
  177. <el-radio-button value="flex-end">
  178. <i class="fm-iconfont icon-justify-content-flex-end-icon"></i>
  179. </el-radio-button>
  180. <el-radio-button value="center">
  181. <i class="fm-iconfont icon-justify-content-center-icon"></i>
  182. </el-radio-button>
  183. <el-radio-button value="space-between">
  184. <i class="fm-iconfont icon-justify-content-space-between-icon"></i>
  185. </el-radio-button>
  186. <el-radio-button value="space-around">
  187. <i class="fm-iconfont icon-justify-content-space-around-icon"></i>
  188. </el-radio-button>
  189. <el-radio-button value="space-evenly">
  190. <i class="fm-iconfont icon-justify-content-space-evenly-icon"></i>
  191. </el-radio-button>
  192. </el-radio-group>
  193. </el-form-item>
  194. <el-form-item :label="$t('fm.config.widget.align')" v-if="data.options.flex">
  195. <el-radio-group v-model="data.options.flexAlign" size="small" :disabled="getVantMobile()">
  196. <el-radio-button value="flex-start">
  197. <i class="fm-iconfont icon-align-items-flex-start" ></i>
  198. </el-radio-button>
  199. <el-radio-button value="flex-end">
  200. <i class="fm-iconfont icon-align-items-flex-end"></i>
  201. </el-radio-button>
  202. <el-radio-button value="center">
  203. <i class="fm-iconfont icon-align-items-center"></i>
  204. </el-radio-button>
  205. <el-radio-button value="stretch">
  206. <i class="fm-iconfont icon-align-items-stretch"></i>
  207. </el-radio-button>
  208. </el-radio-group>
  209. </el-form-item>
  210. </template>
  211. </template>
  212. <!-- td -->
  213. <template v-if="data.type == 'td'">
  214. <el-form-item :label="$t('fm.config.widget.textAlign')" >
  215. <el-radio-group v-model="data.options.textAlign" size="small">
  216. <el-radio-button value="left">
  217. <i class="fm-iconfont icon-text-align-left" ></i>
  218. </el-radio-button>
  219. <el-radio-button value="center">
  220. <i class="fm-iconfont icon-text-align-center"></i>
  221. </el-radio-button>
  222. <el-radio-button value="right">
  223. <i class="fm-iconfont icon-text-align-right"></i>
  224. </el-radio-button>
  225. </el-radio-group>
  226. </el-form-item>
  227. <el-form-item :label="$t('fm.config.widget.verticalAlign')">
  228. <el-radio-group v-model="data.options.verticalAlign" size="small">
  229. <el-radio-button value="top">
  230. <i class="fm-iconfont icon-ic24-vertical-align-top" ></i>
  231. </el-radio-button>
  232. <el-radio-button value="middle">
  233. <i class="fm-iconfont icon-vertical-align-middle-outlined"></i>
  234. </el-radio-button>
  235. <el-radio-button value="bottom">
  236. <i class="fm-iconfont icon-ic24-vertical-align-bottom"></i>
  237. </el-radio-button>
  238. </el-radio-group>
  239. </el-form-item>
  240. </template>
  241. <!-- steps配置 -->
  242. <template v-if="Object.keys(data.options).indexOf('steps')>=0">
  243. <el-form-item :label="$t('fm.config.widget.space')">
  244. <el-input-number v-model="data.options.space" :min="0" :step="10" :disabled="getVantMobile()"></el-input-number>
  245. </el-form-item>
  246. <el-form-item :label="$t('fm.config.widget.direction')">
  247. <el-radio-group v-model="data.options.direction">
  248. <el-radio-button label="horizontal" value="horizontal">Horizontal</el-radio-button>
  249. <el-radio-button label="vertical" value="vertical">Vertical</el-radio-button>
  250. </el-radio-group>
  251. </el-form-item>
  252. <el-form-item :label="$t('fm.config.widget.processStatus')">
  253. <el-select v-model="data.options.processStatus" :disabled="getVantMobile()">
  254. <el-option value="wait" label="wait"></el-option>
  255. <el-option value="process" label="process"></el-option>
  256. <el-option value="finish" label="finish"></el-option>
  257. <el-option value="error" label="error"></el-option>
  258. <el-option value="success" label="success"></el-option>
  259. </el-select>
  260. </el-form-item>
  261. <el-form-item :label="$t('fm.config.widget.finishStatus')">
  262. <el-select v-model="data.options.finishStatus" :disabled="getVantMobile()">
  263. <el-option value="wait" label="wait"></el-option>
  264. <el-option value="process" label="process"></el-option>
  265. <el-option value="finish" label="finish"></el-option>
  266. <el-option value="error" label="error"></el-option>
  267. <el-option value="success" label="success"></el-option>
  268. </el-select>
  269. </el-form-item>
  270. <el-form-item :label="$t('fm.config.widget.alignCenter')">
  271. <el-switch
  272. v-model="data.options.alignCenter"
  273. :disabled="getVantMobile()"
  274. >
  275. </el-switch>
  276. </el-form-item>
  277. <el-form-item :label="$t('fm.config.widget.simple')">
  278. <el-switch
  279. v-model="data.options.simple"
  280. :disabled="getVantMobile()"
  281. >
  282. </el-switch>
  283. </el-form-item>
  284. </template>
  285. <!-- transfer 配置 -->
  286. <template v-if="data.type == 'transfer'">
  287. <el-form-item :label="$t('fm.config.widget.titles')">
  288. <el-input placeholder="List 1" v-model="data.options.titles[0]" style="width: 130px;"></el-input> -
  289. <el-input placeholder="List 2" v-model="data.options.titles[1]" style="width: 130px;"></el-input>
  290. </el-form-item>
  291. </template>
  292. <template v-if="data.type == 'alert'">
  293. <el-form-item :label="$t('fm.config.widget.type')">
  294. <el-select v-model="data.options.type">
  295. <el-option value="success"></el-option>
  296. <el-option value="warning"></el-option>
  297. <el-option value="info"></el-option>
  298. <el-option value="error"></el-option>
  299. </el-select>
  300. </el-form-item>
  301. <el-form-item :label="$t('fm.config.widget.closable')">
  302. <el-switch v-model="data.options.closable"></el-switch>
  303. </el-form-item>
  304. <el-form-item :label="$t('fm.config.widget.center')">
  305. <el-switch v-model="data.options.center" :disabled="getVantMobile()"></el-switch>
  306. </el-form-item>
  307. <el-form-item :label="$t('fm.config.widget.showIcon')">
  308. <el-switch v-model="data.options.showIcon"></el-switch>
  309. </el-form-item>
  310. </template>
  311. <template v-if="data.type == 'pagination'">
  312. <el-form-item :label="$t('fm.config.widget.pageSize')" v-if="Object.keys(data.options).indexOf('pageSize')>=0">
  313. <el-input-number
  314. v-model="data.options.pageSize"
  315. :step="5"
  316. :min="1"
  317. :max="100"
  318. ></el-input-number>
  319. </el-form-item>
  320. <el-form-item :label="$t('fm.config.widget.pagerCount')" v-if="Object.keys(data.options).indexOf('pagerCount')>=0">
  321. <el-input-number
  322. v-model="data.options.pagerCount"
  323. :step="1"
  324. :min="5"
  325. :max="21"
  326. ></el-input-number>
  327. </el-form-item>
  328. <el-form-item :label="$t('fm.config.widget.total')" v-if="Object.keys(data.options).indexOf('total')>=0">
  329. <el-input-number
  330. v-model="data.options.total"
  331. :step="1"
  332. :min="0"
  333. ></el-input-number>
  334. </el-form-item>
  335. <el-form-item :label="$t('fm.config.widget.background')" v-if="Object.keys(data.options).indexOf('background')>=0">
  336. <el-switch v-model="data.options.background"></el-switch>
  337. </el-form-item>
  338. </template>
  339. <el-form-item :label="$t('fm.config.widget.buttonSize')" v-if="Object.keys(data.options).indexOf('buttonSize')>=0">
  340. <el-radio-group v-model="data.options.buttonSize">
  341. <el-radio-button label="large" value="large">Large</el-radio-button>
  342. <el-radio-button label="default" value="default">Default</el-radio-button>
  343. <el-radio-button label="small" value="small">Small</el-radio-button>
  344. </el-radio-group>
  345. </el-form-item>
  346. <el-form-item :label="$t('fm.config.widget.buttonType')" v-if="Object.keys(data.options).indexOf('buttonType')>=0">
  347. <el-select v-model="data.options.buttonType" style="width: 100%;">
  348. <el-option value="" label="Default"></el-option>
  349. <el-option value="primary" label="Primary"></el-option>
  350. <el-option value="success" label="Success"></el-option>
  351. <el-option value="warning" label="Warning"></el-option>
  352. <el-option value="danger" label="Danger"></el-option>
  353. <el-option value="info" label="Info"></el-option>
  354. <el-option value="text" label="Text"></el-option>
  355. <el-option value="link" label="Link"></el-option>
  356. </el-select>
  357. </el-form-item>
  358. <el-form-item :label="$t('fm.config.widget.linkType')" v-if="Object.keys(data.options).indexOf('linkType')>=0">
  359. <el-select v-model="data.options.linkType" style="width: 100%;">
  360. <el-option value="default" label="Default"></el-option>
  361. <el-option value="primary" label="Primary"></el-option>
  362. <el-option value="success" label="Success"></el-option>
  363. <el-option value="warning" label="Warning"></el-option>
  364. <el-option value="danger" label="Danger"></el-option>
  365. <el-option value="info" label="Info"></el-option>
  366. </el-select>
  367. </el-form-item>
  368. <el-form-item :label="$t('fm.config.widget.buttonPlain')" v-if="Object.keys(data.options).indexOf('buttonPlain')>=0">
  369. <el-switch
  370. v-model="data.options.buttonPlain"
  371. >
  372. </el-switch>
  373. </el-form-item>
  374. <el-form-item :label="$t('fm.config.widget.buttonRound')" v-if="Object.keys(data.options).indexOf('buttonRound')>=0">
  375. <el-switch
  376. v-model="data.options.buttonRound"
  377. >
  378. </el-switch>
  379. </el-form-item>
  380. <el-form-item :label="'href'" v-if="Object.keys(data.options).indexOf('href')>=0">
  381. <el-input clearable v-model="data.options.href"></el-input>
  382. </el-form-item>
  383. <el-form-item :label="$t('fm.config.widget.underline')" v-if="Object.keys(data.options).indexOf('underline')>=0">
  384. <el-switch
  385. v-model="data.options.underline"
  386. >
  387. </el-switch>
  388. </el-form-item>
  389. <el-form-item :label="$t('fm.config.widget.isBlank')" v-if="Object.keys(data.options).indexOf('blank')>=0">
  390. <el-switch
  391. v-model="data.options.blank"
  392. >
  393. </el-switch>
  394. </el-form-item>
  395. <el-form-item :label="$t('fm.config.widget.paging')" v-if="Object.keys(data.options).indexOf('paging')>=0">
  396. <el-switch
  397. v-model="data.options.paging"
  398. >
  399. </el-switch>
  400. </el-form-item>
  401. <el-form-item :label="$t('fm.config.widget.pageSize')" v-if="data.options.paging && Object.keys(data.options).indexOf('pageSize')>=0">
  402. <el-input-number
  403. v-model="data.options.pageSize"
  404. :step="5"
  405. :min="1"
  406. ></el-input-number>
  407. </el-form-item>
  408. <el-form-item :label="$t('fm.config.widget.showControl')" v-if="Object.keys(data.options).indexOf('showControl')>=0">
  409. <el-switch
  410. v-model="data.options.showControl"
  411. >
  412. </el-switch>
  413. </el-form-item>
  414. <el-form-item :label="$t('fm.config.widget.virtualTable')" v-if="Object.keys(data.options).indexOf('virtualTable')>=0">
  415. <el-switch
  416. v-model="data.options.virtualTable"
  417. >
  418. </el-switch>
  419. </el-form-item>
  420. <el-form-item :label="$t('fm.config.widget.selection')" v-if="data.type == 'table'">
  421. <el-switch v-model="data.options.selection"></el-switch>
  422. </el-form-item>
  423. <el-form-item :label="$t('fm.config.widget.fixedColumn')" v-if="data.options.tableColumn">
  424. <el-switch
  425. v-model="data.options.fixedColumn"
  426. >
  427. </el-switch>
  428. <el-select v-if="data.options.fixedColumn" v-model="data.options.fixedColumnPosition" :placeholder="$t('fm.config.widget.fixedColumnSelect')" style="margin-left: 10px; width: 180px;">
  429. <el-option :label="$t('fm.config.widget.left')" value="left"></el-option>
  430. <el-option :label="$t('fm.config.widget.right')" value="right"></el-option>
  431. </el-select>
  432. </el-form-item>
  433. <template v-if="data.type == 'time' || data.type == 'date'">
  434. <el-form-item :label="$t('fm.config.widget.showType')" v-if="data.type == 'date'">
  435. <el-select v-model="data.options.type">
  436. <el-option value="year"></el-option>
  437. <el-option value="month"></el-option>
  438. <el-option value="date"></el-option>
  439. <el-option value="week"></el-option>
  440. <el-option value="dates"></el-option>
  441. <el-option value="datetime"></el-option>
  442. <el-option value="datetimerange"></el-option>
  443. <el-option value="daterange"></el-option>
  444. <el-option value="monthrange"></el-option>
  445. </el-select>
  446. </el-form-item>
  447. <el-form-item :label="$t('fm.config.widget.isRange')" v-if="data.type == 'time'">
  448. <el-switch
  449. v-model="data.options.isRange"
  450. :disabled="getVantMobile()"
  451. >
  452. </el-switch>
  453. </el-form-item>
  454. <el-form-item :label="$t('fm.config.widget.placeholder')" v-if="(!data.options.isRange && data.type == 'time') || (data.type != 'time' && data.options.type != 'datetimerange' && data.options.type != 'daterange')">
  455. <el-input clearable v-model="data.options.placeholder"></el-input>
  456. </el-form-item>
  457. <el-form-item :label="$t('fm.config.widget.startPlaceholder')" v-if="(data.options.isRange) || data.options.type=='datetimerange' || data.options.type=='daterange'">
  458. <el-input clearable v-model="data.options.startPlaceholder" :disabled="getVantMobile()"></el-input>
  459. </el-form-item>
  460. <el-form-item :label="$t('fm.config.widget.endPlaceholder')" v-if="data.options.isRange || data.options.type=='datetimerange' || data.options.type=='daterange'">
  461. <el-input clearable v-model="data.options.endPlaceholder" :disabled="getVantMobile()"></el-input>
  462. </el-form-item>
  463. <el-form-item :label="$t('fm.config.widget.format')">
  464. <el-input clearable v-model.lazy="data.options.format"></el-input>
  465. </el-form-item>
  466. <el-form-item :label="$t('fm.config.widget.isTimestamp')" v-if="data.type == 'date'">
  467. <el-switch v-model="data.options.timestamp"></el-switch>
  468. </el-form-item>
  469. <el-form-item :label="$t('fm.config.widget.defaultValue')" v-if="data.type=='time' && Object.keys(data.options).indexOf('isRange')>=0">
  470. <el-time-picker
  471. key="1"
  472. style="width: 100%;"
  473. v-if="!data.options.isRange"
  474. v-model="data.options.defaultValue"
  475. :arrowControl="data.options.arrowControl"
  476. :value-format="data.options.format"
  477. >
  478. </el-time-picker>
  479. <el-time-picker
  480. key="2"
  481. v-if="data.options.isRange"
  482. style="width: 100%;"
  483. v-model="data.options.defaultValue"
  484. is-range
  485. :arrowControl="data.options.arrowControl"
  486. :value-format="data.options.format"
  487. >
  488. </el-time-picker>
  489. </el-form-item>
  490. <el-form-item :label="$t('fm.config.widget.defaultValue')" v-if="data.type=='date'">
  491. <el-date-picker
  492. key="1"
  493. v-model="data.options.defaultValue"
  494. :type="data.options.type"
  495. :clearable="true"
  496. :value-format="data.options.timestamp ? 'x' : data.options.format"
  497. :format="data.options.format"
  498. style="width: 100%"
  499. v-if="data.options.timestamp"
  500. >
  501. </el-date-picker>
  502. <el-date-picker
  503. key="2"
  504. v-model="data.options.defaultValue"
  505. :type="data.options.type"
  506. :clearable="true"
  507. :value-format="data.options.timestamp ? 'x' : data.options.format"
  508. :format="data.options.format"
  509. style="width: 100%"
  510. v-else
  511. >
  512. </el-date-picker>
  513. </el-form-item>
  514. </template>
  515. <template v-if="data.type=='imgupload' || data.type=='fileupload'">
  516. <el-form-item :label="$t('fm.config.widget.accept')" v-if="data.type=='fileupload'">
  517. <el-input clearable v-model="data.options.accept" :placeholder="$t('fm.config.widget.acceptPlaceholder')"></el-input>
  518. </el-form-item>
  519. <el-form-item :label="$t('fm.config.widget.limit')">
  520. <el-input clearable type="number" v-model.number="data.options.limit"></el-input>
  521. </el-form-item>
  522. <el-form-item :label="$t('fm.config.widget.isQiniu')">
  523. <el-switch v-model="data.options.isQiniu"></el-switch>
  524. </el-form-item>
  525. <template v-if="data.options.isQiniu">
  526. <el-form-item label="Domain" :required="true" prop="options.domain">
  527. <el-input clearable v-model="data.options.domain"></el-input>
  528. </el-form-item>
  529. <el-form-item :label="$t('fm.config.widget.tokenFunc')" :required="true" >
  530. <el-radio-group v-model="data.options.tokenType">
  531. <el-radio label="datasource" value="datasource">{{$t('fm.datasource.name')}}</el-radio>
  532. <el-radio label="fx" value="fx">{{$t('fm.formula.input.fx')}}</el-radio>
  533. </el-radio-group>
  534. <formula-input size="default" v-if="data.options.tokenType == 'fx'" only v-model="data.options.tokenFx" style="margin-bottom: 5px;"></formula-input>
  535. <div v-if="data.options.tokenType == 'datasource'" style="display: flex; align-items: center; margin-bottom: 5px;">
  536. <el-select
  537. @change="handleDataSourceChange"
  538. v-model="data.options.tokenDataSource">
  539. <el-option
  540. v-for="item in datasources"
  541. :key="item.value"
  542. :label="item.label"
  543. :value="item.value">
  544. </el-option>
  545. </el-select>
  546. <el-tooltip :content="$t('fm.config.widget.settings')">
  547. <el-button link type="primary" style="margin: 5px;" @click="handleDatasourceManage(data.options.tokenDataSource)">
  548. <i class="fm-iconfont icon-pm"></i>
  549. </el-button>
  550. </el-tooltip>
  551. </div>
  552. <object-dynamic :key="data.options.tokenDataSource" :operable="false" v-if="data.options.tokenType == 'datasource' && data.options.remoteArgs" v-model="data.options.remoteArgs"></object-dynamic>
  553. </el-form-item>
  554. </template>
  555. <template v-else>
  556. <el-form-item :label="$t('fm.config.widget.action')" :required="true" prop="options.action" trigger="change">
  557. <el-input clearable v-model="data.options.action"></el-input>
  558. </el-form-item>
  559. <el-form-item :label="$t('fm.config.widget.headers')">
  560. <array-dynamic v-model="data.options.headers"></array-dynamic>
  561. </el-form-item>
  562. <el-form-item :label="$t('fm.config.widget.withCredentials')">
  563. <el-switch v-model="data.options.withCredentials"></el-switch>
  564. </el-form-item>
  565. </template>
  566. </template>
  567. <template v-if="data.type=='blank'">
  568. <el-form-item :label="$t('fm.config.widget.defaultType')">
  569. <el-select v-model="data.options.defaultType">
  570. <el-option value="String" :label="$t('fm.config.widget.string')"></el-option>
  571. <el-option value="Object" :label="$t('fm.config.widget.object')"></el-option>
  572. <el-option value="Array" :label="$t('fm.config.widget.array')"></el-option>
  573. </el-select>
  574. </el-form-item>
  575. </template>
  576. <template v-if="data.type == 'component'">
  577. <el-form-item :label="$t('fm.config.widget.customTemplates')">
  578. <el-button style="width: 100%;" @click="handleSetTemplate">{{$t('fm.config.widget.setting')}}</el-button>
  579. </el-form-item>
  580. </template>
  581. <template v-if="data.type == 'inline'">
  582. <el-form-item :label="$t('fm.config.widget.spaceSize')" >
  583. <el-input-number clearable :min="0" v-model="data.options.spaceSize" :disabled="getVantMobile()"></el-input-number>
  584. </el-form-item>
  585. </template>
  586. <template v-if="data.type == 'grid'">
  587. <el-form-item :label="$t('fm.config.widget.gutter')" key="gutter">
  588. <el-input clearable type="number" v-model.number="data.options.gutter"></el-input>
  589. </el-form-item>
  590. <el-form-item :label="$t('fm.config.widget.flex')" key="flex">
  591. <el-switch v-model="data.options.flex" disabled></el-switch>
  592. </el-form-item>
  593. <el-form-item :label="$t('fm.config.widget.justify')" v-if="data.options.flex" key="justify">
  594. <el-select v-model="data.options.justify">
  595. <el-option value="start" :label="$t('fm.config.widget.justifyStart')"></el-option>
  596. <el-option value="end" :label="$t('fm.config.widget.justifyEnd')"></el-option>
  597. <el-option value="center" :label="$t('fm.config.widget.justifyCenter')"></el-option>
  598. <el-option value="space-around" :label="$t('fm.config.widget.justifySpaceAround')"></el-option>
  599. <el-option value="space-between" :label="$t('fm.config.widget.justifySpaceBetween')"></el-option>
  600. </el-select>
  601. </el-form-item>
  602. <el-form-item :label="$t('fm.config.widget.align')" v-if="data.options.flex" key="align">
  603. <el-select v-model="data.options.align">
  604. <el-option value="top" :label="$t('fm.config.widget.alignTop')"></el-option>
  605. <el-option value="middle" :label="$t('fm.config.widget.alignMiddle')"></el-option>
  606. <el-option value="bottom" :label="$t('fm.config.widget.alignBottom')"></el-option>
  607. </el-select>
  608. </el-form-item>
  609. </template>
  610. <template v-if="data.type == 'col'">
  611. <el-form-item :label="$t('fm.config.widget.span')">
  612. <el-input-number v-model="data.options.md" :step="1" :min="1" :max="24" v-if="platform == 'pc'"></el-input-number>
  613. <el-input-number v-model="data.options.sm" :step="1" :min="1" :max="24" v-if="platform == 'pad'"></el-input-number>
  614. <el-input-number v-model="data.options.xs" :step="1" :min="1" :max="24" v-if="platform == 'mobile'"></el-input-number>
  615. </el-form-item>
  616. <el-form-item :label="$t('fm.config.widget.offset')">
  617. <el-input-number v-model="data.options.offset" :step="1" :min="0" :max="24"></el-input-number>
  618. </el-form-item>
  619. <el-form-item :label="$t('fm.config.widget.push')">
  620. <el-input-number v-model="data.options.push" :step="1" :min="0" :max="24"></el-input-number>
  621. </el-form-item>
  622. <el-form-item :label="$t('fm.config.widget.pull')">
  623. <el-input-number v-model="data.options.pull" :step="1" :min="0" :max="24"></el-input-number>
  624. </el-form-item>
  625. </template>
  626. <template v-if="data.type == 'tabs'">
  627. <el-form-item :label="$t('fm.config.widget.type')">
  628. <el-radio-group v-model="data.options.type">
  629. <el-radio-button label="" value="">{{$t('fm.config.widget.default')}}</el-radio-button>
  630. <el-radio-button label="card" value="card">{{$t('fm.config.widget.card')}}</el-radio-button>
  631. <el-radio-button label="border-card" value="border-card">{{$t('fm.config.widget.borderCard')}}</el-radio-button>
  632. </el-radio-group>
  633. </el-form-item>
  634. <el-form-item :label="$t('fm.config.widget.tabPosition')">
  635. <el-radio-group v-model="data.options.tabPosition" :disabled="getVantMobile()">
  636. <el-radio-button label="top" value="top">{{$t('fm.config.widget.top')}}</el-radio-button>
  637. <el-radio-button label="left" value="left">{{$t('fm.config.widget.left')}}</el-radio-button>
  638. <el-radio-button label="right" value="right">{{$t('fm.config.widget.right')}}</el-radio-button>
  639. <el-radio-button label="bottom" value="bottom">{{$t('fm.config.widget.bottom')}}</el-radio-button>
  640. </el-radio-group>
  641. </el-form-item>
  642. <el-form-item :label="$t('fm.config.widget.tabOption')">
  643. <draggable tag="ul" :list="data.tabs"
  644. v-bind="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}"
  645. handle=".drag-item"
  646. item-key="index"
  647. >
  648. <template #item="{element:item, index}">
  649. <li :key="index" >
  650. <i class="drag-item" style="font-size: 16px;margin: 0 5px;cursor: move;"><i class="fm-iconfont icon-icon_bars"></i></i>
  651. <el-input clearable :placeholder="$t('fm.config.widget.tabName')" style="width: 200px; margin-bottom: 5px;" v-model="item.label"></el-input>
  652. <i @click="handleOptionsRemove(index)" style="font-size: 16px;margin: 0 5px;cursor: pointer;"><i class="fm-iconfont icon-delete"></i></i>
  653. </li>
  654. </template>
  655. </draggable>
  656. <div style="margin-left: 22px;">
  657. <el-button link type="primary" @click="handleAddTab">{{$t('fm.actions.addTab')}}</el-button>
  658. </div>
  659. </el-form-item>
  660. </template>
  661. <template v-if="data.type == 'collapse'">
  662. <el-form-item :label="$t('fm.config.widget.collapseOptions')">
  663. <draggable tag="ul" :list="data.tabs"
  664. v-bind="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}"
  665. handle=".drag-item"
  666. item-key="index"
  667. >
  668. <template #item="{element:item, index}">
  669. <li :key="index" >
  670. <i class="drag-item" style="font-size: 16px;margin: 0 5px;cursor: move;"><i class="fm-iconfont icon-icon_bars"></i></i>
  671. <el-input clearable :placeholder="$t('fm.config.widget.collapseTitle')" style="width: 200px; margin-bottom: 5px;" v-model="item.title"></el-input>
  672. <i @click="handleOptionsRemove(index)" style="font-size: 16px;margin: 0 5px;cursor: pointer;"><i class="fm-iconfont icon-delete"></i></i>
  673. </li>
  674. </template>
  675. </draggable>
  676. <div style="margin-left: 22px;">
  677. <el-button link type="primary" @click="handleAddCollapse">{{$t('fm.actions.addCollapse')}}</el-button>
  678. </div>
  679. </el-form-item>
  680. <el-form-item :label="$t('fm.config.widget.accordion')">
  681. <el-switch v-model="data.options.accordion"></el-switch>
  682. </el-form-item>
  683. </template>
  684. <template v-if="data.type == 'report'">
  685. <el-form-item :label="$t('fm.config.widget.borderWidth')">
  686. <el-input-number v-model="data.options.borderWidth" :min="0" :step="1"></el-input-number>
  687. </el-form-item>
  688. <el-form-item :label="$t('fm.config.widget.borderColor')">
  689. <el-color-picker
  690. v-model="data.options.borderColor"
  691. ></el-color-picker>
  692. </el-form-item>
  693. </template>
  694. <template v-if="data.type == 'dialog'">
  695. <el-form-item :label="$t('fm.config.widget.showDialog')">
  696. <el-switch v-model="data.options.visible"></el-switch>
  697. </el-form-item>
  698. <el-form-item :label="$t('fm.config.widget.center')">
  699. <el-switch v-model="data.options.center"></el-switch>
  700. </el-form-item>
  701. <el-form-item :label="$t('fm.config.widget.showClose')">
  702. <el-switch v-model="data.options.showClose"></el-switch>
  703. </el-form-item>
  704. <el-form-item :label="$t('fm.config.widget.showCancel')">
  705. <el-switch v-model="data.options.showCancel"></el-switch>
  706. <el-input v-model="data.options.cancelText" v-if="data.options.showCancel">
  707. <template #prepend>{{$t('fm.config.widget.cancelText')}}</template>
  708. </el-input>
  709. </el-form-item>
  710. <el-form-item :label="$t('fm.config.widget.showOk')">
  711. <el-switch v-model="data.options.showOk"></el-switch>
  712. <el-checkbox v-model="data.options.confirmLoading" :label="$t('fm.config.widget.confirmLoading')" v-if="data.options.showOk" style="margin-left: 18px; vertical-align: middle;"></el-checkbox>
  713. <el-input v-model="data.options.okText" v-if="data.options.showOk">
  714. <template #prepend>{{$t('fm.config.widget.okText')}}</template>
  715. </el-input>
  716. </el-form-item>
  717. <el-form-item :label="$t('fm.config.widget.marginTop')">
  718. <el-input v-model="data.options.top"></el-input>
  719. </el-form-item>
  720. </template>
  721. <template v-if="data.type == 'card'">
  722. <el-form-item :label="$t('fm.config.widget.padding')">
  723. <el-input v-model="data.options.padding" clearable :disabled="getVantMobile()"></el-input>
  724. </el-form-item>
  725. <el-form-item :label="$t('fm.config.widget.showHeader')">
  726. <el-switch v-model="data.options.showHeader"></el-switch>
  727. </el-form-item>
  728. <el-form-item :label="$t('fm.config.widget.bordered')">
  729. <el-switch v-model="data.options.bordered"></el-switch>
  730. </el-form-item>
  731. <el-form-item :label="$t('fm.config.widget.shadow')">
  732. <el-radio-group v-model="data.options.shadow" :disabled="getVantMobile()">
  733. <el-radio-button label="always" value="always">always</el-radio-button>
  734. <el-radio-button label="hover" value="hover">hover</el-radio-button>
  735. <el-radio-button label="never" value="never">never</el-radio-button>
  736. </el-radio-group>
  737. </el-form-item>
  738. </template>
  739. <template v-if="data.type == 'list'">
  740. <el-form-item :label="$t('fm.config.widget.stripe')">
  741. <el-switch v-model="data.options.stripe"></el-switch>
  742. </el-form-item>
  743. <el-form-item :label="$t('fm.config.widget.bordered')">
  744. <el-switch v-model="data.options.border"></el-switch>
  745. </el-form-item>
  746. <el-form-item :label="$t('fm.config.widget.highlight')">
  747. <el-switch v-model="data.options.highlight"></el-switch>
  748. </el-form-item>
  749. <el-form-item :label="$t('fm.config.widget.selection')">
  750. <el-switch v-model="data.options.selection"></el-switch>
  751. </el-form-item>
  752. <el-form-item :label="$t('fm.config.widget.maxHeight')">
  753. <el-input clearable v-model.number="data.options.maxHeight">
  754. <template #suffix>px</template>
  755. </el-input>
  756. </el-form-item>
  757. </template>
  758. <el-form-item :label="$t('fm.config.widget.defaultValue')"
  759. v-if="Object.keys(data.options).indexOf('defaultValue')>=0 && data.type != 'custom'
  760. && data.type != 'imgupload'
  761. && data.type != 'fileupload'
  762. && data.type != 'radio'
  763. && data.type != 'checkbox'
  764. && data.type != 'select'
  765. && data.type != 'date'
  766. && data.type != 'time'
  767. && data.type != 'steps'
  768. && data.type != 'transfer'
  769. && data.type != 'dialog'
  770. && data.type != 'card'
  771. && data.type != 'group'"
  772. >
  773. <el-input clearable v-if="data.type=='textarea'" type="textarea"
  774. :rows="data.options.rows" :maxlength="data.options.maxlength"
  775. v-model="data.options.defaultValue">
  776. </el-input>
  777. <template v-if="data.type=='input' || data.type == 'text'">
  778. <template v-if="data.options.dataType == 'number' || data.options.dataType == 'integer' || data.options.dataType == 'float'">
  779. <el-input clearable type="number" v-model.number="data.options.defaultValue"></el-input>
  780. </template>
  781. <template v-else>
  782. <el-input clearable v-model="data.options.defaultValue"></el-input>
  783. </template>
  784. </template>
  785. <el-rate v-if="data.type == 'rate'" style="display:inline-block;vertical-align: middle;" :max="data.options.max" :allow-half="data.options.allowHalf" v-model="data.options.defaultValue"></el-rate>
  786. <el-button link type="primary" v-if="data.type == 'rate'" style="display:inline-block;vertical-align: middle;margin-left: 10px;" @click="data.options.defaultValue=0">{{$t('fm.actions.clear')}}</el-button>
  787. <el-color-picker
  788. v-if="data.type == 'color'"
  789. v-model="data.options.defaultValue"
  790. :show-alpha="data.options.showAlpha"
  791. ></el-color-picker>
  792. <el-switch v-if="data.type=='switch'" v-model="data.options.defaultValue"></el-switch>
  793. <el-input-number v-if="data.type=='number' || data.type == 'slider'"
  794. v-model="data.options.defaultValue"
  795. :step="data.options.step"
  796. :min="data.options.min"
  797. :max="data.options.max"
  798. ></el-input-number>
  799. <el-input-number v-if="data.type == 'pagination'"
  800. v-model="data.options.defaultValue"
  801. :step="1"
  802. :min="1"
  803. />
  804. <template v-if="data.type == 'html'">
  805. <el-popover placement="right" :width="500" trigger="click" :hide-after="0">
  806. <template #reference>
  807. <el-button style="width: 100%;">{{$t('fm.config.widget.setting')}}</el-button>
  808. </template>
  809. <code-editor :key="data.key" v-model="data.options.defaultValue" height="300px"></code-editor>
  810. </el-popover>
  811. </template>
  812. <template v-if="data.type == 'cascader'">
  813. <el-cascader
  814. v-model="data.options.defaultValue"
  815. clearable
  816. :options="data.options.remote ? [] : data.options.options"
  817. style="width: 100%"
  818. :props="{multiple: data.options.multiple, checkStrictly: data.options.checkStrictly}"
  819. :filterable="data.options.filterable"
  820. collapse-tags
  821. >
  822. </el-cascader>
  823. </template>
  824. <template v-if="data.type == 'treeselect'">
  825. <el-tree-select
  826. v-model="data.options.defaultValue"
  827. clearable
  828. :data="data.options.remote ? [] : data.options.options"
  829. style="width: 100%"
  830. :multiple="data.options.multiple"
  831. :check-strictly="data.options.checkStrictly"
  832. :filterable="data.options.filterable"
  833. >
  834. </el-tree-select>
  835. </template>
  836. <template v-if="data.type == 'editor'">
  837. <el-button style="width: 100%;" @click="handleSetEditorValue">{{$t('fm.config.widget.setting')}}</el-button>
  838. </template>
  839. <template v-if="data.type == 'table' || data.type == 'subform' || data.type == 'list'">
  840. <el-button style="width: 100%;" @click="handleSetDefaultValue">{{$t('fm.config.widget.setting')}}</el-button>
  841. </template>
  842. </el-form-item>
  843. </el-collapse-item>
  844. <el-collapse-item :title="$t('fm.config.widget.optionsSetting')" name="options"
  845. v-if="Object.keys(data.options).indexOf('options')>=0
  846. || Object.keys(data.options).indexOf('steps')>=0
  847. || data.type == 'transfer'"
  848. >
  849. <el-form-item :label="$t('fm.config.widget.option')" v-if="Object.keys(data.options).indexOf('options')>=0">
  850. <el-radio-group v-model="data.options.remote" style="margin-bottom:10px;">
  851. <el-radio-button :label="false" :value="false">{{$t('fm.config.widget.staticData')}}</el-radio-button>
  852. <el-radio-button :label="true" :value="true">{{$t('fm.config.widget.remoteData')}}</el-radio-button>
  853. </el-radio-group>
  854. <template v-if="data.options.remote">
  855. <div>
  856. <el-radio-group v-model="data.options.remoteType" style="margin-bottom: 8px;">
  857. <el-radio label="datasource" value="datasource">{{$t('fm.datasource.name')}}</el-radio>
  858. <el-radio label="fx" value="fx">{{$t('fm.formula.input.fx')}}</el-radio>
  859. </el-radio-group>
  860. <formula-input size="default" v-if="data.options.remoteType == 'fx'" only v-model="data.options.remoteFx" style="margin-bottom: 5px;"></formula-input>
  861. <div v-if="data.options.remoteType == 'datasource'" style="display: flex; align-items: center; margin-bottom: 5px;">
  862. <el-select
  863. @change="handleDataSourceChange"
  864. v-model="data.options.remoteDataSource">
  865. <el-option
  866. v-for="item in datasources"
  867. :key="item.value"
  868. :label="item.label"
  869. :value="item.value">
  870. </el-option>
  871. </el-select>
  872. <el-tooltip :content="$t('fm.config.widget.settings')">
  873. <el-button link type="primary" style="margin: 5px;" @click="handleDatasourceManage(data.options.remoteDataSource)">
  874. <i class="fm-iconfont icon-pm"></i>
  875. </el-button>
  876. </el-tooltip>
  877. </div>
  878. <object-dynamic :key="data.options.remoteDataSource" :operable="false" v-if="data.options.remoteType == 'datasource' && data.options.remoteArgs" v-model="data.options.remoteArgs"></object-dynamic>
  879. <el-input class="fm-options-item" clearable v-model="data.options.props.value">
  880. <template #prepend>{{$t('fm.config.widget.value')}}</template>
  881. </el-input>
  882. <el-input class="fm-options-item" clearable v-model="data.options.props.label">
  883. <template #prepend>{{$t('fm.config.widget.label')}}</template>
  884. </el-input>
  885. <el-input class="fm-options-item" clearable v-model="data.options.props.children">
  886. <template #prepend>{{$t('fm.config.widget.childrenOption')}}</template>
  887. </el-input>
  888. </div>
  889. </template>
  890. <template v-else>
  891. <div v-if="Object.keys(data.options).indexOf('showLabel')>=0">
  892. <el-checkbox v-model="data.options.showLabel">{{$t('fm.config.widget.showLabel')}}</el-checkbox>
  893. </div>
  894. <template v-if="data.type=='radio' || (data.type=='select'&&!data.options.multiple)">
  895. <el-radio-group v-model="data.options.defaultValue" >
  896. <draggable tag="ul" v-model="data.options.options"
  897. v-bind="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}"
  898. handle=".drag-item"
  899. item-key="index"
  900. >
  901. <template #item="{element:item, index}">
  902. <li :key="index" >
  903. <el-radio
  904. :label="item.value"
  905. :value="item.value"
  906. style="margin-right: 5px;"
  907. >
  908. <el-input clearable :style="{'width': data.options.showLabel? '90px': '180px' }" v-model="item.value"></el-input>
  909. <el-input clearable style="width:90px;" v-if="data.options.showLabel" v-model="item.label"></el-input>
  910. </el-radio>
  911. <i class="drag-item" style="font-size: 16px;margin: 0 5px;cursor: move;"><i class="fm-iconfont icon-icon_bars"></i></i>
  912. <i @click="handleOptionsRemove(index)" style="font-size: 16px;margin: 0 5px;cursor: pointer;"><i class="fm-iconfont icon-delete"></i></i>
  913. </li>
  914. </template>
  915. </draggable>
  916. </el-radio-group>
  917. </template>
  918. <template v-if="data.type=='checkbox' || (data.type=='select' && data.options.multiple)">
  919. <el-checkbox-group v-model="data.options.defaultValue">
  920. <draggable tag="ul" :list="data.options.options"
  921. v-bind="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}"
  922. handle=".drag-item"
  923. item-key="index"
  924. >
  925. <template #item="{element: item, index}">
  926. <li :key="index" >
  927. <el-checkbox
  928. :label="item.value"
  929. :value="item.value"
  930. style="margin-right: 5px; margin-bottom: 3px;"
  931. >
  932. <el-input clearable :style="{'width': data.options.showLabel? '90px': '180px' }" v-model="item.value"></el-input>
  933. <el-input clearable style="width:90px;" v-if="data.options.showLabel" v-model="item.label"></el-input>
  934. </el-checkbox>
  935. <i class="drag-item" style="font-size: 16px;margin: 0 5px;cursor: move;"><i class="fm-iconfont icon-icon_bars"></i></i>
  936. <i @click="handleOptionsRemove(index)" style="font-size: 16px;margin: 0 5px;cursor: pointer;"><i class="fm-iconfont icon-delete"></i></i>
  937. </li>
  938. </template>
  939. </draggable>
  940. </el-checkbox-group>
  941. </template>
  942. <div style="margin-left: 22px;" v-if="data.type != 'cascader' && data.type != 'treeselect'">
  943. <el-button link type="primary" @click="handleAddOption" >{{$t('fm.actions.addOption')}}</el-button>
  944. <el-button link type="primary" @click="handleClearSelect" >{{$t('fm.actions.clearSelect')}}</el-button>
  945. </div>
  946. <template v-if="data.type == 'cascader'">
  947. <el-button style="width: 100%;" @click="handleSetCascader">{{$t('fm.config.widget.setting')}}</el-button>
  948. </template>
  949. <template v-if="data.type == 'treeselect'">
  950. <el-button style="width: 100%;" @click="handleSetTree">{{$t('fm.config.widget.setting')}}</el-button>
  951. </template>
  952. </template>
  953. </el-form-item>
  954. <template v-if="Object.keys(data.options).indexOf('steps')>=0">
  955. <el-form-item :label="$t('fm.config.widget.steps')">
  956. <el-radio-group v-model="data.options.remote" style="margin-bottom: 10px;">
  957. <el-radio-button :label="false" :value="false">{{$t('fm.config.widget.staticData')}}</el-radio-button>
  958. <el-radio-button :label="true" :value="true">{{$t('fm.config.widget.remoteData')}}</el-radio-button>
  959. </el-radio-group>
  960. <template v-if="data.options.remote">
  961. <el-radio-group v-model="data.options.remoteType" style="margin-bottom: 8px;">
  962. <el-radio label="datasource" value="datasource">{{$t('fm.datasource.name')}}</el-radio>
  963. <el-radio label="fx" value="fx">{{$t('fm.formula.input.fx')}}</el-radio>
  964. </el-radio-group>
  965. <formula-input size="default" v-if="data.options.remoteType == 'fx'" only v-model="data.options.remoteFx" style="margin-bottom: 5px;"></formula-input>
  966. <div v-if="data.options.remoteType == 'datasource'" style="display: flex; align-items: center; margin-bottom: 5px;">
  967. <el-select
  968. @change="handleDataSourceChange"
  969. v-model="data.options.remoteDataSource">
  970. <el-option
  971. v-for="item in datasources"
  972. :key="item.value"
  973. :label="item.label"
  974. :value="item.value">
  975. </el-option>
  976. </el-select>
  977. <el-tooltip :content="$t('fm.config.widget.settings')">
  978. <el-button link type="primary" style="margin: 5px;" @click="handleDatasourceManage(data.options.remoteDataSource)">
  979. <i class="fm-iconfont icon-pm"></i>
  980. </el-button>
  981. </el-tooltip>
  982. </div>
  983. <object-dynamic :key="data.options.remoteDataSource" :operable="false" v-if="data.options.remoteType == 'datasource' && data.options.remoteArgs" v-model="data.options.remoteArgs"></object-dynamic>
  984. <el-input class="fm-options-item" clearable v-model="data.options.props.title">
  985. <template #prepend>Title</template>
  986. </el-input>
  987. <el-input class="fm-options-item" clearable v-model="data.options.props.description">
  988. <template #prepend>Description</template>
  989. </el-input>
  990. </template>
  991. <template v-else>
  992. <el-radio-group v-model="data.options.defaultValue">
  993. <draggable tag="ul" :list="data.options.steps"
  994. v-bind="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}"
  995. handle=".drag-item"
  996. item-key="index"
  997. >
  998. <template #item="{element: item, index}">
  999. <li :key="index" class="drag-item-bk" style="padding: 5px; margin-bottom: 5px; display: flex; align-items: center;">
  1000. <el-radio
  1001. :label="index"
  1002. :value="index"
  1003. style="margin-right: 5px; height: 100%;"
  1004. >
  1005. <div style="display: inline-block; vertical-align: middle;">
  1006. <el-input placeholder="Title" clearable v-model="item.title"></el-input> <br>
  1007. <el-input placeholder="Description" clearable v-model="item.description"></el-input>
  1008. </div>
  1009. </el-radio>
  1010. <i class="drag-item" style="font-size: 16px;margin: 0 5px;cursor: move;"><i class="fm-iconfont icon-icon_bars"></i></i>
  1011. <i @click="handleOptionsRemove(index)" style="font-size: 16px;margin: 0 5px;cursor: pointer;"><i class="fm-iconfont icon-delete"></i></i>
  1012. </li>
  1013. </template>
  1014. </draggable>
  1015. </el-radio-group>
  1016. <div style="margin-left: 5px;">
  1017. <el-button link type="primary" @click="handleAddStep">{{$t('fm.actions.addOption')}}</el-button>
  1018. </div>
  1019. </template>
  1020. </el-form-item>
  1021. </template>
  1022. <template v-if="data.type == 'transfer'">
  1023. <el-form-item :label="$t('fm.config.widget.option')">
  1024. <el-radio-group v-model="data.options.remote" style="margin-bottom: 10px;">
  1025. <el-radio-button :label="false" :value="false">{{$t('fm.config.widget.staticData')}}</el-radio-button>
  1026. <el-radio-button :label="true" :value="true">{{$t('fm.config.widget.remoteData')}}</el-radio-button>
  1027. </el-radio-group>
  1028. <template v-if="data.options.remote">
  1029. <el-radio-group v-model="data.options.remoteType" style="margin-bottom: 8px;">
  1030. <el-radio label="datasource" value="datasource">{{$t('fm.datasource.name')}}</el-radio>
  1031. <el-radio label="fx" value="fx">{{$t('fm.formula.input.fx')}}</el-radio>
  1032. </el-radio-group>
  1033. <formula-input size="default" v-if="data.options.remoteType == 'fx'" only v-model="data.options.remoteFx" style="margin-bottom: 5px;"></formula-input>
  1034. <div v-if="data.options.remoteType == 'datasource'" style="display: flex; align-items: center; margin-bottom: 5px;">
  1035. <el-select
  1036. @change="handleDataSourceChange"
  1037. v-model="data.options.remoteDataSource">
  1038. <el-option
  1039. v-for="item in datasources"
  1040. :key="item.value"
  1041. :label="item.label"
  1042. :value="item.value">
  1043. </el-option>
  1044. </el-select>
  1045. <el-tooltip :content="$t('fm.config.widget.settings')">
  1046. <el-button link type="primary" style="margin: 5px;" @click="handleDatasourceManage(data.options.remoteDataSource)">
  1047. <i class="fm-iconfont icon-pm"></i>
  1048. </el-button>
  1049. </el-tooltip>
  1050. </div>
  1051. <object-dynamic :key="data.options.remoteDataSource" :operable="false" v-if="data.options.remoteType == 'datasource' && data.options.remoteArgs" v-model="data.options.remoteArgs"></object-dynamic>
  1052. <el-input class="fm-options-item" clearable v-model="data.options.props.key">
  1053. <template #prepend>Key</template>
  1054. </el-input>
  1055. <el-input class="fm-options-item" clearable v-model="data.options.props.label">
  1056. <template #prepend>Label</template>
  1057. </el-input>
  1058. <el-input class="fm-options-item" clearable v-model="data.options.props.disabled">
  1059. <template #prepend>Disabled</template>
  1060. </el-input>
  1061. </template>
  1062. <template v-else>
  1063. <el-checkbox-group v-model="data.options.defaultValue">
  1064. <draggable tag="ul" :list="data.options.data"
  1065. v-bind="{group:{ name:'options'}, ghostClass: 'ghost',handle: '.drag-item'}"
  1066. handle=".drag-item"
  1067. item-key="index"
  1068. >
  1069. <template #item="{element: item, index}">
  1070. <li :key="item.key" class="drag-item-bk" style="padding: 5px; margin-bottom: 5px; display: flex; align-items: center;">
  1071. <el-checkbox
  1072. :label="item.label"
  1073. :value="item.key"
  1074. style="margin-right: 5px; height: 100%;"
  1075. >
  1076. <div style="display: inline-block; vertical-align: middle;">
  1077. <el-input placeholder="Key" clearable v-model="item.key" style="margin-bottom: 3px;"></el-input> <br>
  1078. <el-input placeholder="Label" clearable v-model="item.label"></el-input>
  1079. </div>
  1080. </el-checkbox>
  1081. <i class="drag-item" style="font-size: 16px;margin: 0 5px;cursor: move;"><i class="fm-iconfont icon-icon_bars"></i></i>
  1082. <i @click="handleOptionsRemove(index)" style="font-size: 16px;margin: 0 5px;cursor: pointer;"><i class="fm-iconfont icon-delete"></i></i>
  1083. </li>
  1084. </template>
  1085. </draggable>
  1086. </el-checkbox-group>
  1087. <div style="margin-left: 5px;">
  1088. <el-button link type="primary" @click="handleAddData">{{$t('fm.actions.addOption')}}</el-button>
  1089. <el-button link type="primary" @click="handleClearSelect">{{$t('fm.actions.clearSelect')}}</el-button>
  1090. </div>
  1091. </template>
  1092. </el-form-item>
  1093. </template>
  1094. </el-collapse-item>
  1095. <el-collapse-item :title="$t('fm.config.widget.columnSetting')" name="columns"
  1096. v-if="data.type == 'list'"
  1097. >
  1098. <el-form-item>
  1099. <columns-config v-model="data.options.columns"></columns-config>
  1100. </el-form-item>
  1101. </el-collapse-item>
  1102. <el-collapse-item :title="$t('fm.config.widget.operationSetting')" name="operation"
  1103. v-if="data.type == 'list'"
  1104. >
  1105. <el-form-item :label="$t('fm.config.widget.showOperation')">
  1106. <el-switch v-model="data.options.showOperation"></el-switch>
  1107. </el-form-item>
  1108. <operation-config
  1109. v-if="data.options.showOperation"
  1110. v-model="data.options.operations"
  1111. @on-add-buttonevent="handleButtonEventAdd"
  1112. @on-edit-buttonevent="handleButtonEventEdit"
  1113. ></operation-config>
  1114. </el-collapse-item>
  1115. <el-collapse-item :title="$t('fm.config.widget.pageSetting')" name="paging"
  1116. v-if="data.type == 'list'"
  1117. >
  1118. <el-form-item :label="$t('fm.config.widget.paging')">
  1119. <el-switch v-model="data.options.pagination.paging"></el-switch>
  1120. </el-form-item>
  1121. <el-form-item :label="$t('fm.config.widget.pageSizes')" v-if="data.options.pagination.paging">
  1122. <el-input v-model="data.options.pagination.pageSizes" :placeholder="$t('fm.config.widget.pageSizesPlaceholder')"></el-input>
  1123. </el-form-item>
  1124. <el-form-item :label="$t('fm.config.widget.pagerCount')" v-if="data.options.pagination.paging">
  1125. <el-input-number :step="2" :min="5" :max="21" v-model="data.options.pagination.pagerCount"></el-input-number>
  1126. </el-form-item>
  1127. <el-form-item :label="$t('fm.config.widget.background')" v-if="data.options.pagination.paging">
  1128. <el-switch v-model="data.options.pagination.background"></el-switch>
  1129. </el-form-item>
  1130. <el-form-item :label="$t('fm.config.widget.smallPage')" v-if="data.options.pagination.paging">
  1131. <el-switch v-model="data.options.pagination.small"></el-switch>
  1132. </el-form-item>
  1133. <el-form-item :label="$t('fm.config.widget.dataStruct')" v-if="data.options.pagination.paging">
  1134. <el-input class="fm-options-item" clearable v-model="data.options.pagination.props.list">
  1135. <template #prepend>{{$t('fm.config.widget.structList')}}</template>
  1136. </el-input>
  1137. <el-input class="fm-options-item" clearable v-model="data.options.pagination.props.total">
  1138. <template #prepend>{{$t('fm.config.widget.structTotal')}}</template>
  1139. </el-input>
  1140. <el-input class="fm-options-item" clearable v-model="data.options.pagination.props.size">
  1141. <template #prepend>{{$t('fm.config.widget.structSize')}}</template>
  1142. </el-input>
  1143. <el-input class="fm-options-item" clearable v-model="data.options.pagination.props.current">
  1144. <template #prepend>{{$t('fm.config.widget.structCurrent')}}</template>
  1145. </el-input>
  1146. </el-form-item>
  1147. </el-collapse-item>
  1148. <el-collapse-item :title="$t('fm.config.widget.expandSetting')" name="expend">
  1149. <!-- 动态值绑定 -->
  1150. <!--
  1151. "isDynamicValue": false
  1152. "dynamicValueType": "datasource",
  1153. "dynamicValueFx": "",
  1154. "dynamicValueDataSource": "",
  1155. "dynamicValueArgs": {},
  1156. "dynamicValueStruct": ""
  1157. -->
  1158. <el-form-item :label="$t('fm.config.widget.dynamicValue')" v-if="!['grid', 'col', 'report', 'th', 'td', 'tabs', 'collapse', 'inline', 'card', 'divider', 'alert'].includes(data.type)">
  1159. <div><el-switch v-model="data.options.isDynamicValue"></el-switch></div>
  1160. <template v-if="data.options.isDynamicValue">
  1161. <el-radio-group v-model="data.options.dynamicValueType" style="margin-bottom:10px;">
  1162. <el-radio label="datasource" value="datasource">{{$t('fm.datasource.name')}}</el-radio>
  1163. <el-radio label="fx" value="fx">{{$t('fm.formula.input.fx')}}</el-radio>
  1164. </el-radio-group>
  1165. <formula-input size="default" v-if="data.options.dynamicValueType == 'fx'" only v-model="data.options.dynamicValueFx" style="margin-bottom: 5px;"></formula-input>
  1166. <div v-if="data.options.dynamicValueType == 'datasource'" style="display: flex; align-items: center; margin-bottom: 5px;">
  1167. <el-select
  1168. @change="handleDynamicDataSourceChange"
  1169. v-model="data.options.dynamicValueDataSource">
  1170. <el-option
  1171. v-for="item in datasources"
  1172. :key="item.value"
  1173. :label="item.label"
  1174. :value="item.value">
  1175. </el-option>
  1176. </el-select>
  1177. <el-tooltip :content="$t('fm.config.widget.settings')">
  1178. <el-button link type="primary" style="margin: 5px;" @click="handleDatasourceManage(data.options.dynamicValueDataSource)">
  1179. <i class="fm-iconfont icon-pm"></i>
  1180. </el-button>
  1181. </el-tooltip>
  1182. </div>
  1183. <object-dynamic :key="data.options.dynamicValueDataSource" :operable="false" v-if="data.options.dynamicValueType == 'datasource' && data.options.dynamicValueArgs" v-model="data.options.dynamicValueArgs"></object-dynamic>
  1184. <el-input class="fm-options-item" :placeholder="$t('fm.config.widget.dynamicStructPlaceholder')" clearable v-model="data.options.dynamicValueStruct" v-if="data.options.dynamicValueType == 'datasource'">
  1185. <template #prepend>data.</template>
  1186. </el-input>
  1187. </template>
  1188. </el-form-item>
  1189. <!-- 状态 -->
  1190. <el-form-item :label="$t('fm.config.widget.state')" v-if="data.type != 'td' && data.type != 'th' && data.type != 'col' && data.type != 'dialog'">
  1191. <state-config v-model="data.options.hidden" :label="$t('fm.config.widget.hidden')" v-if="Object.keys(data.options).indexOf('hidden')>=0"></state-config>
  1192. <state-config v-model="data.options.disabled" :label="$t('fm.config.widget.disabled')" v-if="Object.keys(data.options).indexOf('disabled')>=0"></state-config>
  1193. </el-form-item>
  1194. <!-- 自定义样式 -->
  1195. <el-form-item :label="$t('fm.config.widget.customClass')" v-if="Object.keys(data.options).includes('customClass')">
  1196. <div style="display: flex; align-items: center;">
  1197. <el-select
  1198. v-model="customClassArray"
  1199. multiple
  1200. filterable
  1201. allow-create
  1202. default-first-option>
  1203. <el-option
  1204. v-for="item in sheets"
  1205. :key="item"
  1206. :label="item"
  1207. :value="item">
  1208. </el-option>
  1209. </el-select>
  1210. <el-tooltip :content="$t('fm.config.widget.settings')">
  1211. <el-button link type="primary" style="margin: 5px;" @click="handleSetClass">
  1212. <i class="fm-iconfont icon-pm"></i>
  1213. </el-button>
  1214. </el-tooltip>
  1215. </div>
  1216. </el-form-item>
  1217. <!-- 属性 -->
  1218. <el-form-item :label="$t('fm.config.widget.attribute')" key="attribute" v-if="data.type != 'td' && data.type != 'th' && data.type != 'col' && data.type != 'button' && data.type != 'link' && data.type != 'alert' && data.type != 'divider'">
  1219. <el-checkbox v-model="data.options.dataBind" v-if="Object.keys(data.options).indexOf('dataBind')>=0" >{{$t('fm.config.widget.dataBind')}} </el-checkbox>
  1220. <el-checkbox v-model="data.options.readonly" v-if="Object.keys(data.options).indexOf('readonly')>=0">{{$t('fm.config.widget.readonly')}} </el-checkbox>
  1221. <el-checkbox v-model="data.options.editable" v-if="Object.keys(data.options).indexOf('editable')>=0">{{$t('fm.config.widget.editable')}} </el-checkbox>
  1222. <el-checkbox v-model="data.options.clearable" v-if="Object.keys(data.options).indexOf('clearable')>=0">{{$t('fm.config.widget.clearable')}} </el-checkbox>
  1223. <el-checkbox v-model="data.options.arrowControl" v-if="Object.keys(data.options).indexOf('arrowControl')>=0">{{$t('fm.config.widget.arrowControl')}} </el-checkbox>
  1224. <el-checkbox v-model="data.options.isDelete" v-if="Object.keys(data.options).indexOf('isDelete')>=0">{{$t('fm.config.widget.isDelete')}} </el-checkbox>
  1225. <el-checkbox v-model="data.options.isEdit" v-if="Object.keys(data.options).indexOf('isEdit')>=0">{{$t('fm.config.widget.isEdit')}} </el-checkbox>
  1226. <el-checkbox v-model="data.options.isAdd" v-if="Object.keys(data.options).indexOf('isAdd')>=0">{{$t('fm.config.widget.isAdd')}} </el-checkbox>
  1227. <el-checkbox v-model="data.options.showPassword" v-if="Object.keys(data.options).indexOf('showPassword')>=0">{{$t('fm.config.widget.showPassword')}} </el-checkbox>
  1228. <el-checkbox v-model="data.options.showScore" v-if="Object.keys(data.options).indexOf('showScore')>=0">{{$t('fm.config.widget.showScore')}} </el-checkbox>
  1229. <el-checkbox v-model="data.options.showWordLimit" v-if="Object.keys(data.options).indexOf('showWordLimit')>=0">{{$t('fm.config.widget.showWordLimit')}} </el-checkbox>
  1230. </el-form-item>
  1231. <!-- 自定义属性插槽 -->
  1232. <slot name="widgetconfig" v-if="data.options.customProps" :type="data.type" :data="data" :customProps="data.options.customProps"></slot>
  1233. <!-- 自定义扩展属性 -->
  1234. <template v-if="Object.keys(data.options).includes('extendProps')">
  1235. <el-form-item :label="$t('fm.config.widget.extendPropsConfig')" v-if="Object.keys(data.options).includes('extendProps')">
  1236. <extend-prop-config v-model="data.options.extendProps"></extend-prop-config>
  1237. </el-form-item>
  1238. </template>
  1239. <!-- 数据校验 -->
  1240. <template v-if="data.type != 'grid'
  1241. && data.type != 'tabs'
  1242. && data.type != 'collapse'
  1243. && data.type != 'report'
  1244. && data.type != 'inline'
  1245. && data.type != 'divider'
  1246. && data.type != 'td'
  1247. && data.type != 'th'
  1248. && data.type != 'col'
  1249. && data.type != 'button'
  1250. && data.type != 'link'
  1251. && data.type != 'steps'
  1252. && data.type != 'alert'
  1253. && data.type != 'pagination'
  1254. && data.type != 'dialog'
  1255. && data.type != 'list'
  1256. && data.type != 'card'">
  1257. <el-form-item :label="$t('fm.config.widget.validate')">
  1258. <div class="validate-block" v-if="Object.keys(data.options).indexOf('required')>=0">
  1259. <el-checkbox v-model="data.options.required">{{$t('fm.config.widget.required')}}</el-checkbox>
  1260. <el-input class="message-input" clearable v-model="data.options.requiredMessage" v-if="data.options.required" :placeholder="$t('fm.message.errorTip')"></el-input>
  1261. </div>
  1262. <div class="validate-block" v-if="Object.keys(data.options).indexOf('dataType')>=0">
  1263. <el-checkbox v-model="data.options.dataTypeCheck" style="margin-right: 10px;"></el-checkbox>
  1264. <el-select :disabled="!data.options.dataTypeCheck" v-if="Object.keys(data.options).indexOf('dataType')>=0" v-model="data.options.dataType" style=" width: 239px;">
  1265. <el-option value="string" :label="$t('fm.config.widget.string')"></el-option>
  1266. <el-option value="url" :label="$t('fm.config.widget.url')"></el-option>
  1267. <el-option value="email" :label="$t('fm.config.widget.email')"></el-option>
  1268. <el-option value="hex" :label="$t('fm.config.widget.hex')"></el-option>
  1269. </el-select>
  1270. <el-input class="message-input" clearable v-model="data.options.dataTypeMessage" v-if="data.options.dataTypeCheck" :placeholder="$t('fm.message.errorTip')"></el-input>
  1271. </div>
  1272. <div class="validate-block" v-if="Object.keys(data.options).indexOf('pattern')>=0">
  1273. <el-checkbox v-model="data.options.patternCheck" style="margin-right: 10px;"></el-checkbox>
  1274. <el-input clearable :disabled="!data.options.patternCheck" v-model.lazy="data.options.pattern" style=" width: 239px;" :placeholder="$t('fm.config.widget.patternPlaceholder')"></el-input>
  1275. <el-input class="message-input" clearable v-model="data.options.patternMessage" v-if="data.options.patternCheck" :placeholder="$t('fm.message.errorTip')"></el-input>
  1276. </div>
  1277. <div class="validate-block" v-if="Object.keys(data.options).indexOf('validator')>=0">
  1278. <el-checkbox v-model="data.options.validatorCheck" style="margin-right: 10px;">{{$t('fm.config.widget.customValidation')}}</el-checkbox>
  1279. <div v-if="data.options.validatorCheck">
  1280. <el-popover placement="right" :width="500" trigger="click" :hide-after="0">
  1281. <template #reference>
  1282. <el-button class="message-input">{{$t('fm.config.widget.setting')}}</el-button>
  1283. </template>
  1284. <div>
  1285. <div style="font-size: 14px;font-weight: 500;" class="code-line">(rule, value, callback) => {</div>
  1286. <code-editor mode="javascript" :key="data.key" v-model="data.options.validator" height="300px"></code-editor>
  1287. <div style="font-size: 14px;font-weight: 500;" class="code-line">}</div>
  1288. </div>
  1289. </el-popover>
  1290. </div>
  1291. </div>
  1292. </el-form-item>
  1293. </template>
  1294. <!-- 事件 -->
  1295. <template v-if="data.events ">
  1296. <el-form-item :label="$t('fm.eventscript.config.title')">
  1297. <event-config :events="data.events" :eventscripts="eventscripts" @on-add="handleEventAdd" @on-edit="handleEventEdit" @on-remove="handleEventRemove"></event-config>
  1298. </el-form-item>
  1299. </template>
  1300. </el-collapse-item>
  1301. </el-collapse>
  1302. </el-form>
  1303. </div>
  1304. <div v-else class="empty">
  1305. {{$t('fm.description.configEmpty')}}
  1306. </div>
  1307. <code-dialog ref="codeDialog" mode="html" :title="$t('fm.config.widget.customTemplates')" help="https://form.making.link/docs/manual/component.html" @on-confirm="handleTemplateConfirm"></code-dialog>
  1308. <code-dialog ref="cascaderDialog" width="800px" code-height="400px" mode="javascript" :title="$t('fm.config.widget.option')" @on-confirm="handleCascaderConfirm"></code-dialog>
  1309. <code-dialog ref="treeDialog" width="800px" code-height="400px" mode="javascript" :title="$t('fm.config.widget.option')" @on-confirm="handleTreeConfirm"></code-dialog>
  1310. <code-dialog ref="extendPropsDialog" width="800px" code-height="400px" mode="javascript" :title="$t('fm.config.widget.extendPropsConfig')" @on-confirm="handlePropsConfirm"></code-dialog>
  1311. <code-dialog ref="defaultValueDialog" width="800px" code-height="400px" mode="javascript" :title="$t('fm.config.widget.defaultValue')" @on-confirm="handleDefaultValueConfirm"></code-dialog>
  1312. <cus-dialog
  1313. :visible="editorVisible"
  1314. @on-close="editorVisible = false"
  1315. :width="`calc(${data?.options?.width || '900px'} + 40px)`"
  1316. :title="$t('fm.config.widget.defaultValue')"
  1317. @on-submit="handleEditorValueConfirm"
  1318. >
  1319. <Editor
  1320. v-model="editorValue"
  1321. :custom-style="{width: data.options.width}"
  1322. :toolbar="data.options.customToolbar"
  1323. class="fm-editor"
  1324. ></Editor>
  1325. </cus-dialog>
  1326. </div>
  1327. </el-scrollbar>
  1328. </template>
  1329. <script>
  1330. import Draggable from 'vuedraggable/src/vuedraggable'
  1331. import CodeEditor from '../components/CodeEditor/index.vue'
  1332. import CodeDialog from './CodeDialog.vue'
  1333. import CusDialog from './CusDialog.vue'
  1334. import FmFormTable from './FormTable/index.vue'
  1335. import EventConfig from './EventPanel/config.vue'
  1336. import Editor from './Editor/index.vue'
  1337. import { EventBus } from '../util/event-bus.js'
  1338. import { ElMessage } from '../util/message.js'
  1339. import ObjectDynamic from './DataSource/objectDynamic.vue'
  1340. import FormulaInput from './FormulaPanel/input.vue'
  1341. import ArrayDynamic from './DataSource/arrayDynamic.vue'
  1342. import ColumnsConfig from './DataTable/ColumnsConfig.vue'
  1343. import OperationConfig from './DataTable/OperationConfig.vue'
  1344. import ExtendPropConfig from './ConfigComponent/ExtendProp.vue'
  1345. import StateConfig from './ConfigComponent/StateConfig.vue'
  1346. export default {
  1347. components: {
  1348. Draggable,
  1349. CodeEditor,
  1350. CodeDialog,
  1351. CusDialog,
  1352. FmFormTable,
  1353. EventConfig,
  1354. Editor,
  1355. ObjectDynamic,
  1356. FormulaInput,
  1357. ArrayDynamic,
  1358. ColumnsConfig,
  1359. OperationConfig,
  1360. ExtendPropConfig,
  1361. StateConfig
  1362. },
  1363. props: ['data', 'sheets', 'platform', 'datasources', 'eventscripts', 'formKey', 'fieldModels'],
  1364. emits: ['on-event-add', 'on-event-edit', 'on-event-remove', 'on-datasource-edit', 'on-class-edit'],
  1365. inject: ['getModelNode', 'getVantMobile'],
  1366. data () {
  1367. return {
  1368. validator: {
  1369. type: null,
  1370. required: null,
  1371. pattern: null,
  1372. range: null,
  1373. length: null,
  1374. validator: null
  1375. },
  1376. editorVisible: false,
  1377. editorValue: '',
  1378. tableVisible: false,
  1379. customClassArray: this.data && this.data.options && this.data.options.customClass ? this.data.options.customClass.split(' ').filter(item => item) : []
  1380. }
  1381. },
  1382. computed: {
  1383. show () {
  1384. if (this.data && Object.keys(this.data).length > 0 && this.data.key && this.data.options) {
  1385. return true
  1386. }
  1387. return false
  1388. }
  1389. },
  1390. mounted () {
  1391. this.validateRequired(this.data && this.data.options ? this.data.options.required : false)
  1392. this.validateDataType(this.data && this.data.options ? this.data.options.dataType : '')
  1393. this.valiatePattern(this.data && this.data.options ? this.data.options.pattern : '')
  1394. this.validateCustom(this.data && this.data.options ? this.data.options.validator: '')
  1395. },
  1396. methods: {
  1397. handleCopyField () {
  1398. const textarea = document.createElement('textarea');
  1399. textarea.value = this.getModelNode() + this.data.model;
  1400. document.getElementsByClassName('clipboard-content')[0].appendChild(textarea);
  1401. textarea.select();
  1402. document.execCommand('copy');
  1403. document.getElementsByClassName('clipboard-content')[0].removeChild(textarea);
  1404. ElMessage({
  1405. message: this.$t('fm.message.copySuccess'),
  1406. type: 'success'
  1407. }, this)
  1408. },
  1409. handleOptionsRemove (index) {
  1410. if (this.data.type === 'grid') {
  1411. this.data.columns.splice(index, 1)
  1412. } else if (this.data.type === 'tabs' || this.data.type === 'collapse') {
  1413. this.data.tabs.splice(index, 1)
  1414. } else if (this.data.type === 'imgupload' || this.data.type === 'fileupload') {
  1415. this.data.options.headers.splice(index, 1)
  1416. } else if (this.data.type === 'steps') {
  1417. this.data.options.steps.splice(index, 1)
  1418. } else if (this.data.type === 'transfer') {
  1419. this.data.options.data.splice(index, 1)
  1420. } else {
  1421. if (!this.data.options.remote && this.data.options.options[index].value) {
  1422. this.data.options.defaultValue = typeof this.data.options.defaultValue === 'string' ? '' : []
  1423. }
  1424. this.data.options.options.splice(index, 1)
  1425. }
  1426. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1427. },
  1428. handleClearSelect () {
  1429. if (this.data.type=='checkbox' || (this.data.type=='select' && this.data.options.multiple) || this.data.type == 'transfer') {
  1430. this.data.options.defaultValue = []
  1431. } else {
  1432. this.data.options.defaultValue = ''
  1433. }
  1434. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1435. },
  1436. handleAddData () {
  1437. this.data.options.data.push({
  1438. key: '',
  1439. label: ''
  1440. })
  1441. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1442. },
  1443. handleAddStep () {
  1444. this.data.options.steps.push({
  1445. title: 'New Step',
  1446. description: ''
  1447. })
  1448. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1449. },
  1450. handleAddOption () {
  1451. if (this.data.options.showLabel) {
  1452. this.data.options.options.push({
  1453. value: this.$t('fm.config.widget.newOption'),
  1454. label: this.$t('fm.config.widget.newOption')
  1455. })
  1456. } else {
  1457. this.data.options.options.push({
  1458. value: this.$t('fm.config.widget.newOption')
  1459. })
  1460. }
  1461. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1462. },
  1463. handleAddTab () {
  1464. let length = this.data.tabs.length
  1465. this.data.tabs.push({
  1466. label: this.$t('fm.config.widget.tab') + (length + 1),
  1467. name: 'tab_' + Math.random().toString(36).slice(-8),
  1468. list: []
  1469. })
  1470. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1471. },
  1472. handleAddCollapse () {
  1473. let length = this.data.tabs.length
  1474. this.data.tabs.push({
  1475. title: this.$t('fm.config.widget.collapse') + (length + 1),
  1476. name: 'collapse_' + Math.random().toString(36).slice(-8),
  1477. list: []
  1478. })
  1479. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1480. },
  1481. handleAddHeader () {
  1482. if ('headers' in this.data.options) {
  1483. this.data.options.headers.push({
  1484. key: '',
  1485. value: ''
  1486. })
  1487. } else {
  1488. this.data.options['headers'] = [{key: '', value: ''}]
  1489. }
  1490. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1491. },
  1492. generateRule () {
  1493. if (this.data) {
  1494. this.data.rules = []
  1495. Object.keys(this.validator).forEach(key => {
  1496. if (this.validator[key]) {
  1497. this.data.rules.push(this.validator[key])
  1498. }
  1499. })
  1500. }
  1501. },
  1502. handleSelectMuliple (value) {
  1503. if (this.data.type == 'select' || this.data.type == 'treeselect') {
  1504. if (value) {
  1505. if (this.data.options.defaultValue) {
  1506. this.data.options.defaultValue = [this.data.options.defaultValue]
  1507. } else {
  1508. this.data.options.defaultValue = []
  1509. }
  1510. } else {
  1511. if (this.data.options.defaultValue.length>0){
  1512. this.data.options.defaultValue = this.data.options.defaultValue[0]
  1513. } else {
  1514. this.data.options.defaultValue = ''
  1515. }
  1516. }
  1517. }
  1518. },
  1519. handleSetTemplate () {
  1520. this.$refs.codeDialog.open(this.data.options.template)
  1521. },
  1522. handleTemplateConfirm (value) {
  1523. try {
  1524. this.data.options.template = value
  1525. this.$refs.codeDialog.close()
  1526. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1527. } catch (e) {
  1528. this.$refs.codeDialog.end()
  1529. ElMessage({
  1530. message: e.message,
  1531. type: 'error'
  1532. })
  1533. }
  1534. },
  1535. handleSetEditorValue () {
  1536. this.editorVisible = true
  1537. this.editorValue = this.data.options.defaultValue
  1538. },
  1539. handleEditorValueConfirm (value) {
  1540. try {
  1541. this.data.options.defaultValue = this.editorValue
  1542. this.editorVisible = false
  1543. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1544. } catch (e) {
  1545. this.editorVisible = false
  1546. ElMessage({
  1547. message: e.message,
  1548. type: 'error'
  1549. })
  1550. }
  1551. },
  1552. handleSetDefaultValue () {
  1553. this.$refs.defaultValueDialog.open(this.data.options.defaultValue)
  1554. },
  1555. handleDefaultValueConfirm (value) {
  1556. try {
  1557. if (typeof value == 'string') {
  1558. this.data.options.defaultValue = Function('"use strict";return (' + value + ')')()
  1559. } else {
  1560. this.data.options.defaultValue = value
  1561. }
  1562. this.$refs.defaultValueDialog.close()
  1563. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1564. } catch (e) {
  1565. this.$refs.defaultValueDialog.end()
  1566. ElMessage({
  1567. message: e.message,
  1568. type: 'error'
  1569. })
  1570. }
  1571. },
  1572. handleSetCascader () {
  1573. this.$refs.cascaderDialog.open(this.data.options.options)
  1574. },
  1575. handleCascaderConfirm (value) {
  1576. try {
  1577. if (typeof value == 'string') {
  1578. this.data.options.options = Function('"use strict";return (' + value + ')')()
  1579. } else {
  1580. this.data.options.options = value
  1581. }
  1582. this.$refs.cascaderDialog.close()
  1583. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1584. } catch (e) {
  1585. this.$refs.cascaderDialog.end()
  1586. ElMessage({
  1587. message: e.message,
  1588. type: 'error'
  1589. })
  1590. }
  1591. },
  1592. handleSetTree () {
  1593. this.$refs.treeDialog.open(this.data.options.options)
  1594. },
  1595. handleTreeConfirm (value) {
  1596. try {
  1597. if (typeof value == 'string') {
  1598. this.data.options.options = Function('"use strict";return (' + value + ')')()
  1599. } else {
  1600. this.data.options.options = value
  1601. }
  1602. this.$refs.treeDialog.close()
  1603. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1604. } catch (e) {
  1605. this.$refs.treeDialog.end()
  1606. ElMessage({
  1607. message: e.message,
  1608. type: 'error'
  1609. })
  1610. }
  1611. },
  1612. handleSetProps () {
  1613. if (!this.data.options.extendProps) {
  1614. this.data.options.extendProps = {}
  1615. }
  1616. this.$refs.extendPropsDialog.open(this.data.options.extendProps)
  1617. },
  1618. handlePropsConfirm (value) {
  1619. try {
  1620. if (typeof value == 'string') {
  1621. this.data.options.extendProps = Function('"use strict";return (' + value + ')')()
  1622. } else {
  1623. this.data.options.extendProps = value
  1624. }
  1625. this.$refs.extendPropsDialog.close()
  1626. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1627. } catch (e) {
  1628. this.$refs.extendPropsDialog.end()
  1629. ElMessage({
  1630. message: e.message,
  1631. type: 'error'
  1632. })
  1633. }
  1634. },
  1635. validateRequired (val) {
  1636. if (val) {
  1637. this.validator.required = {required: true, message: this.data.options.requiredMessage ? this.data.options.requiredMessage : ``}
  1638. } else {
  1639. this.validator.required = null
  1640. }
  1641. this.$nextTick(() => {
  1642. this.generateRule()
  1643. })
  1644. },
  1645. validateDataType (val) {
  1646. if (!this.show) {
  1647. return false
  1648. }
  1649. if (val && (this.data.options.dataTypeCheck || !Object.keys(this.data.options).includes('dataTypeCheck'))) {
  1650. this.validator.type = {type: val, message: this.data.options.dataTypeMessage ? this.data.options.dataTypeMessage : ''}
  1651. } else {
  1652. this.validator.type = null
  1653. }
  1654. this.generateRule()
  1655. },
  1656. valiatePattern (val) {
  1657. if (!this.show) {
  1658. return false
  1659. }
  1660. if (val && (this.data.options.patternCheck || !Object.keys(this.data.options).includes('patternCheck'))) {
  1661. this.validator.pattern = {pattern: val, message: this.data.options.patternMessage ? this.data.options.patternMessage : ''}
  1662. } else {
  1663. this.validator.pattern = null
  1664. }
  1665. this.generateRule()
  1666. },
  1667. validateCustom (val) {
  1668. if (!this.show) {
  1669. return false
  1670. }
  1671. if (val && this.data.options.validatorCheck) {
  1672. this.validator.validator = {func: val}
  1673. } else {
  1674. this.validator.validator = null
  1675. }
  1676. this.generateRule()
  1677. },
  1678. handleSetClass () {
  1679. this.$emit('on-class-edit')
  1680. },
  1681. handleDatasourceManage (datasource) {
  1682. this.$emit('on-datasource-edit', datasource)
  1683. },
  1684. handleEventAdd (name) {
  1685. this.$emit('on-event-add', name)
  1686. },
  1687. handleEventEdit ({eventName, functionKey}) {
  1688. this.$emit('on-event-edit', {eventName, functionKey})
  1689. },
  1690. handleEventRemove (eventName) {
  1691. this.$emit('on-event-remove', eventName)
  1692. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1693. },
  1694. setEvent (eventObj) {
  1695. if (eventObj.type.includes('operate_') && this.data.type == 'list') {
  1696. const match = eventObj.type.match(/^operate_(\d+)$/)
  1697. if (match) {
  1698. const index = Number(match[1])
  1699. this.data.options.operations.buttons[index].event = eventObj.key
  1700. }
  1701. } else {
  1702. this.data.events[eventObj.type] = eventObj.key
  1703. }
  1704. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  1705. },
  1706. handleDataSourceChange (value) {
  1707. let args = this.datasources.find(item => item.value == value)?.args
  1708. if (args) {
  1709. this.data.options.remoteArgs = args
  1710. }
  1711. },
  1712. handleDynamicDataSourceChange (value) {
  1713. let args = this.datasources.find(item => item.value == value)?.args
  1714. if (args) {
  1715. this.data.options.dynamicValueArgs = args
  1716. }
  1717. },
  1718. handleButtonEventAdd (index) {
  1719. this.$emit('on-event-add', 'operate_' + index)
  1720. },
  1721. handleButtonEventEdit (index, key) {
  1722. this.$emit('on-event-edit', {
  1723. eventName: 'operate_' + index,
  1724. functionKey: key
  1725. })
  1726. }
  1727. },
  1728. watch: {
  1729. 'data.options.isRange': function(val) {
  1730. if (typeof val !== 'undefined') {
  1731. if (val) {
  1732. this.data.options.defaultValue = null
  1733. } else {
  1734. if (Object.keys(this.data.options).indexOf('defaultValue')>=0)
  1735. this.data.options.defaultValue = ''
  1736. }
  1737. }
  1738. },
  1739. 'data.options.type': function(val) {
  1740. if (this.data.type == 'date') {
  1741. if (val == 'daterange' || val == 'datetimerange' || val == 'dates' || val == 'monthrange') {
  1742. this.data.options.defaultValue = []
  1743. } else {
  1744. this.data.options.defaultValue = ''
  1745. }
  1746. }
  1747. },
  1748. 'data.options.required': function(val) {
  1749. this.validateRequired(val)
  1750. },
  1751. 'data.options.requiredMessage':function (val) {
  1752. this.validateRequired(this.data && this.data.options ? this.data.options.required : false)
  1753. },
  1754. 'data.options.dataType': function (val) {
  1755. this.validateDataType(val)
  1756. },
  1757. 'data.options.dataTypeCheck': function (val) {
  1758. this.validateDataType(this.data && this.data.options ? this.data.options.dataType : '')
  1759. },
  1760. 'data.options.dataTypeMessage': function (val) {
  1761. this.validateDataType(this.data && this.data.options ? this.data.options.dataType : '')
  1762. },
  1763. 'data.options.pattern': function (val) {
  1764. this.valiatePattern(val)
  1765. },
  1766. 'data.options.patternCheck': function (val) {
  1767. this.valiatePattern(this.data && this.data.options ? this.data.options.pattern : '')
  1768. },
  1769. 'data.options.patternMessage': function (val) {
  1770. this.valiatePattern(this.data && this.data.options ? this.data.options.pattern : '')
  1771. },
  1772. 'data.options.validator': function (val) {
  1773. this.validateCustom(val)
  1774. },
  1775. 'data.options.validatorCheck': function (val) {
  1776. this.validateCustom(this.data && this.data.options ? this.data.options.validator : '')
  1777. },
  1778. 'data.options.options': {
  1779. deep: true,
  1780. handler (val) {
  1781. if (this.data.options && typeof this.data.options.defaultValue == 'object' && Array.isArray(this.data.options.defaultValue)) {
  1782. this.data.options.defaultValue = this.data.options.defaultValue.filter(item => val.map(item => item.value).includes(item))
  1783. }
  1784. if (this.data.options && typeof this.data.options.defaultValue == 'string') {
  1785. if (typeof val == 'object' && !val.map(item => item.value).includes(this.data.options.defaultValue)) {
  1786. this.data.options.defaultValue = ''
  1787. }
  1788. }
  1789. }
  1790. },
  1791. 'data.options.customClass': function(val) {
  1792. this.customClassArray = this.data && this.data.options && this.data.options.customClass ? this.data.options.customClass.split(' ').filter(item => item) : []
  1793. },
  1794. 'data.options.format': function (val) {
  1795. this.data.options.defaultValue = ''
  1796. },
  1797. customClassArray (val) {
  1798. this.data.options.customClass = val.join(' ')
  1799. }
  1800. }
  1801. }
  1802. </script>