1898 lines
69 KiB
Vue
1898 lines
69 KiB
Vue
<template>
|
||
<Layout class="panel-container">
|
||
<Tabs :active-name="activeTab" style="height: 100%; overflow: hidden">
|
||
<TabPane :label="i18nt('designer.hint.widgetSetting')" name="1">
|
||
<Scroll class="setting-scrollbar" :height="scrollerHeight">
|
||
<template v-if="!!designer.selectedWidget && !designer.selectedWidget.category">
|
||
<Form :model="optionModel" size="mini" label-position="left" :labelWidth="120"
|
||
class="setting-form">
|
||
<Collapse v-model="widgetActiveCollapseNames" class="setting-collapse">
|
||
<Panel name="1">
|
||
{{i18nt('designer.setting.commonSetting')}}
|
||
<div slot="content">
|
||
<FormItem :label="i18nt('designer.setting.fieldName')" v-if="hasConfig('name')" :rules="nameRequiredRule">
|
||
<Input type="text" v-model="optionModel.name" @change="updateWidgetNameAndRef" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.label')"
|
||
v-if="hasConfig('label') && !noLabelSetting">
|
||
<Input type="text" v-model="optionModel.label" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelAlign')"
|
||
v-if="hasConfig('label') && !noLabelSetting && (selectedWidget.type !== 'button')">
|
||
<RadioGroup v-model="optionModel.labelAlign" class="radio-group-custom">
|
||
<Radio label="label-left-align">
|
||
{{i18nt('designer.setting.leftAlign')}}
|
||
</Radio>
|
||
<Radio label="label-center-align">
|
||
{{i18nt('designer.setting.centerAlign')}}
|
||
</Radio>
|
||
<Radio label="label-right-align">
|
||
{{i18nt('designer.setting.rightAlign')}}
|
||
</Radio>
|
||
</RadioGroup>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.displayType')"
|
||
v-if="hasConfig('type')">
|
||
<Select v-if="(selectedWidget.type === 'input')" v-model="optionModel.type">
|
||
<Option label="text" value="text"></Option>
|
||
<!-- 当input的type设置为number时,如果输入非数字字符,则v-model拿到的值为空字符串,无法实现输入校验!故屏蔽之!! -->
|
||
<Option label="number" value="number"></Option>
|
||
<Option label="password" value="password"></Option>
|
||
<Option label="url" value="url"></Option>
|
||
<Option label="email" value="email"></Option>
|
||
<Option label="date" value="date"></Option>
|
||
<Option label="tel" value="tel"></Option>
|
||
</Select>
|
||
<Select v-if="(selectedWidget.type === 'date')" v-model="optionModel.type">
|
||
<Option label="datetime" value="datetime"></Option>
|
||
<Option label="date" value="date"></Option>
|
||
<!-- <Option label="dates" value="dates"></Option> -->
|
||
<Option label="year" value="year"></Option>
|
||
<Option label="month" value="month"></Option>
|
||
<!-- <Option label="week" value="week"></Option> -->
|
||
</Select>
|
||
<Select v-else-if="(selectedWidget.type === 'date-range')"
|
||
v-model="optionModel.type">
|
||
<Option label="daterange" value="daterange"></Option>
|
||
<Option label="datetimerange" value="datetimerange"></Option>
|
||
<!-- <Option label="monthrange" value="monthrange"></Option> -->
|
||
</Select>
|
||
<Select v-else-if="(selectedWidget.type === 'button')"
|
||
v-model="optionModel.type">
|
||
<Option :label="item.label" :value="item.value" v-for="(item,index) in buttonDisplayTypes" :key="index"></Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.defaultValue')"
|
||
v-if="hasConfig('defaultValue') && !hasConfig('optionItems')">
|
||
<TimePicker v-if="(selectedWidget.type === 'time')"
|
||
v-model="optionModel.defaultValue" @change="emitDefaultValueChange"
|
||
:format="optionModel.format" value-format="HH:mm:ss"
|
||
style="width: 100%">
|
||
</TimePicker>
|
||
<TimePicker v-else-if="(selectedWidget.type === 'time-range')"
|
||
v-model="optionModel.defaultValue" is-range
|
||
@change="emitDefaultValueChange" :format="optionModel.format"
|
||
value-format="HH:mm:ss" style="width: 100%">
|
||
</TimePicker>
|
||
<DatePicker
|
||
v-else-if="(selectedWidget.type === 'date') || (selectedWidget.type === 'date-range')"
|
||
:type="optionModel.type" v-model="optionModel.defaultValue"
|
||
@change="emitDefaultValueChange" :format="optionModel.format"
|
||
:value-format="optionModel.valueFormat" style="width: 100%">
|
||
</DatePicker>
|
||
<iSwitch v-else-if="(selectedWidget.type === 'switch')"
|
||
v-model="optionModel.defaultValue" @change="emitDefaultValueChange"
|
||
active-text="true" inactive-text="false" />
|
||
<Input type="number" v-else-if="(selectedWidget.type === 'rate')"
|
||
v-model="optionModel.defaultValue" :min="0" :max="optionModel.max"
|
||
style="width: 100%" @change="emitDefaultValueChange" />
|
||
<ColorPicker v-else-if="(selectedWidget.type === 'color')"
|
||
v-model="optionModel.defaultValue" @change="emitDefaultValueChange" />
|
||
<Input v-else type="text" v-model="optionModel.defaultValue"
|
||
@change="emitDefaultValueChange" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.placeholder')"
|
||
v-if="hasConfig('placeholder')">
|
||
<Input type="text" v-model="optionModel.placeholder" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.startPlaceholder')"
|
||
v-if="hasConfig('startPlaceholder')">
|
||
<Input type="text" v-model="optionModel.startPlaceholder" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.endPlaceholder')"
|
||
v-if="hasConfig('endPlaceholder')">
|
||
<Input type="text" v-model="optionModel.endPlaceholder" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.widgetColumnWidth')"
|
||
v-if="hasConfig('columnWidth') && !!subFormChildWidgetFlag">
|
||
<Input type="text" v-model="optionModel.columnWidth" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.widgetSize')"
|
||
v-if="hasConfig('size')">
|
||
<Select v-model="optionModel.size">
|
||
<Option v-for="item in widgetSizes" :key="item.value"
|
||
:label="item.label" :value="item.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.displayStyle')"
|
||
v-if="hasConfig('displayStyle')">
|
||
<RadioGroup v-model="optionModel.displayStyle">
|
||
<Radio label="inline">{{i18nt('designer.setting.inlineLayout')}}
|
||
</Radio>
|
||
<Radio label="block">{{i18nt('designer.setting.blockLayout')}}</Radio>
|
||
</RadioGroup>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelWidth')"
|
||
v-if="hasConfig('labelWidth')">
|
||
<Input type="number" v-model="optionModel.labelWidth"
|
||
@input.native="inputNumberHandler" min="0" class="hide-spin-button" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.rows')" v-if="hasConfig('rows')">
|
||
<Input type="number" v-model="optionModel.rows" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelHidden')"
|
||
v-if="hasConfig('labelHidden')">
|
||
<Checkbox v-model="optionModel.labelHidden"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.required')"
|
||
v-if="hasConfig('required')">
|
||
<Checkbox v-model="optionModel.required"></Checkbox>
|
||
</FormItem>
|
||
<FormItem v-if="hasConfig('validation')">
|
||
<span slot="label">{{i18nt('designer.setting.validation')}}
|
||
<Tooltip effect="light"
|
||
:content="i18nt('designer.setting.validationHelp')">
|
||
<i class="ivu-icon ivu-icon-md-information-circle"></i>
|
||
</Tooltip>
|
||
</span>
|
||
<Select v-model="optionModel.validation" filterable allow-create
|
||
default-first-option>
|
||
<Option v-for="(fv, fvIdx) in fieldValidators" :key="fvIdx"
|
||
:label="fv.label" :value="fv.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.validationHint')"
|
||
v-if="hasConfig('validationHint')">
|
||
<Input type="text" v-model="optionModel.validationHint" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.readonly')"
|
||
v-if="hasConfig('readonly')">
|
||
<Checkbox v-model="optionModel.readonly"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.disabled')"
|
||
v-if="hasConfig('disabled')">
|
||
<Checkbox v-model="optionModel.disabled"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.hidden')" v-if="hasConfig('hidden')">
|
||
<Checkbox v-model="optionModel.hidden"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.textContent')"
|
||
v-if="hasConfig('textContent')">
|
||
<Input v-model="optionModel.textContent" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.htmlContent')"
|
||
v-if="hasConfig('htmlContent')">
|
||
<Input v-model="optionModel.htmlContent" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.clearable')"
|
||
v-if="hasConfig('clearable')">
|
||
<Checkbox v-model="optionModel.clearable"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.editable')"
|
||
v-if="hasConfig('editable')">
|
||
<Checkbox v-model="optionModel.editable"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.format')" v-if="hasConfig('format')">
|
||
<Select
|
||
v-if="(selectedWidget.type === 'time') || (selectedWidget.type === 'time-range')"
|
||
v-model="optionModel.format" filterable allow-create>
|
||
<Option label="HH:mm" value="HH:mm"></Option>
|
||
<Option label="HH:mm:ss" value="HH:mm:ss"></Option>
|
||
<Option label="HH时mm分ss秒" value="HH时mm分ss秒"></Option>
|
||
<Option label="hh:mm:ss" value="hh:mm:ss"></Option>
|
||
</Select>
|
||
<Select
|
||
v-if="(selectedWidget.type === 'date') || (selectedWidget.type === 'date-range')"
|
||
v-model="optionModel.format" filterable allow-create>
|
||
<Option label="yyyy" value="yyyy"></Option>
|
||
<Option label="yyyy/MM" value="yyyy/MM"></Option>
|
||
<Option label="yyyy/MM/dd" value="yyyy/MM/dd"></Option>
|
||
<Option label="yyyy-MM" value="yyyy-MM"></Option>
|
||
<Option label="yyyy-MM-dd" value="yyyy-MM-dd"></Option>
|
||
<Option label="MM" value="MM"></Option>
|
||
<Option label="yyyy年" value="yyyy年"></Option>
|
||
<Option label="yyyy年MM月" value="yyyy年MM月"></Option>
|
||
<Option label="MM月" value="MM月"></Option>
|
||
<Option label="yyyy年MM月dd日" value="yyyy年MM月dd日"></Option>
|
||
<Option label="yyyy年MM月dd日 HH时mm分" value="yyyy年MM月dd日 HH时mm分"></Option>
|
||
<Option label="yyyy年MM月dd日 HH时mm分ss秒" value="yyyy年MM月dd日 HH时mm分ss秒"></Option>
|
||
<Option label="yyyy-MM-dd HH:mm" value="yyyy-MM-dd HH:mm"></Option>
|
||
<Option label="yyyy-MM-dd HH:mm" value="yyyy-MM-dd HH:mm"></Option>
|
||
<Option label="yyyy-MM-dd hh:mm:ss" value="yyyy-MM-dd hh:mm:ss"></Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.valueFormat')"
|
||
v-if="hasConfig('valueFormat')">
|
||
<Select
|
||
v-if="(selectedWidget.type === 'date') || (selectedWidget.type === 'date-range')"
|
||
v-model="optionModel.valueFormat" filterable allow-create>
|
||
<Option label="yyyy-MM-dd" value="yyyy-MM-dd"></Option>
|
||
<Option label="yyyy-MM-dd HH:mm:ss" value="yyyy-MM-dd HH:mm:ss">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showPassword')"
|
||
v-if="hasConfig('showPassword') && (optionModel.type === 'password')">
|
||
<Checkbox v-model="optionModel.showPassword"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.filterable')"
|
||
v-if="hasConfig('filterable')">
|
||
<Checkbox v-model="optionModel.filterable"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.allowCreate')"
|
||
v-if="hasConfig('allowCreate')">
|
||
<Checkbox v-model="optionModel.allowCreate"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.remote')" v-if="hasConfig('remote')">
|
||
<Checkbox v-model="optionModel.remote" @change="onRemoteChange">
|
||
</Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.automaticDropdown')"
|
||
v-if="hasConfig('automaticDropdown')">
|
||
<Checkbox v-model="optionModel.automaticDropdown"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.multiple')"
|
||
v-if="hasConfig('multiple')">
|
||
<Checkbox v-model="optionModel.multiple" @change="onMultipleSelected">
|
||
</Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.multipleLimit')"
|
||
v-if="hasConfig('multipleLimit')">
|
||
<Input type="number" v-model="optionModel.multipleLimit" :min="0"
|
||
class="hide-spin-button" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.contentPosition')"
|
||
v-if="hasConfig('contentPosition')">
|
||
<Select v-model="optionModel.contentPosition">
|
||
<Option label="center" value="center"></Option>
|
||
<Option label="left" value="left"></Option>
|
||
<Option label="right" value="right"></Option>
|
||
</Select>
|
||
</FormItem>
|
||
|
||
<FormItem :label-width="0" v-if="hasConfig('optionItems')">
|
||
<Divider size="small" class="custom-divider-margin-top">
|
||
{{i18nt('designer.setting.optionsSetting')}}
|
||
</Divider>
|
||
<option-items-setting :designer="designer"
|
||
:selected-widget="designer.selectedWidget"></option-items-setting>
|
||
</FormItem>
|
||
|
||
<FormItem :label-width="0" v-if="hasConfig('uploadURL')">
|
||
<Divider size="small" class="custom-divider">{{i18nt('designer.setting.uploadSetting')}}
|
||
</Divider>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.uploadURL')"
|
||
v-if="hasConfig('uploadURL')">
|
||
<Input type="text" v-model="optionModel.uploadURL" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.uploadTip')"
|
||
v-if="hasConfig('uploadTip')">
|
||
<Input type="text" v-model="optionModel.uploadTip" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.withCredentials')"
|
||
v-if="hasConfig('withCredentials')">
|
||
<Checkbox v-model="optionModel.withCredentials"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.multipleSelect')"
|
||
v-if="hasConfig('multipleSelect')">
|
||
<Checkbox v-model="optionModel.multipleSelect"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showFileList')"
|
||
v-if="hasConfig('showFileList')">
|
||
<Checkbox v-model="optionModel.showFileList"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.limit')" v-if="hasConfig('limit')">
|
||
<Input type="number" v-model="optionModel.limit" :min="1"
|
||
class="hide-spin-button" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.fileMaxSize')"
|
||
v-if="hasConfig('fileMaxSize')">
|
||
<Input type="number" v-model="optionModel.fileMaxSize" :min="1"
|
||
class="hide-spin-button" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem
|
||
v-if="hasConfig('fileAccept') && (selectedWidget.type === 'picture-upload')">
|
||
<span slot="label">{{i18nt('designer.setting.fileAccept')}}
|
||
<Tooltip
|
||
:content="i18nt('designer.setting.fileTypesHelp')">
|
||
<i class="ivu-icon ivu-icon-md-information-circle"></i>
|
||
</Tooltip>
|
||
</span>
|
||
<Select multiple allow-create filterable default-first-option
|
||
v-model="optionModel.fileAccept" style="width: 100%">
|
||
<Option v-for="(ft, ftIdx) in uploadPictureAccept" :key="ftIdx"
|
||
:label="ft.label" :value="ft.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem
|
||
v-if="hasConfig('fileTypes') && (selectedWidget.type === 'picture-upload')">
|
||
<span slot="label">{{i18nt('designer.setting.fileTypes')}}
|
||
<Tooltip
|
||
:content="i18nt('designer.setting.fileTypesHelp')">
|
||
<i class="ivu-icon ivu-icon-md-information-circle"></i>
|
||
</Tooltip>
|
||
</span>
|
||
<Select multiple allow-create filterable default-first-option
|
||
v-model="optionModel.fileTypes" style="width: 100%">
|
||
<Option v-for="(ft, ftIdx) in uploadPictureTypes" :key="ftIdx"
|
||
:label="ft.label" :value="ft.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem
|
||
v-if="hasConfig('fileAccept') && (selectedWidget.type === 'file-upload')">
|
||
<span slot="label">{{i18nt('designer.setting.fileAccept')}}
|
||
<Tooltip
|
||
:content="i18nt('designer.setting.fileTypesHelp')">
|
||
<i class="ivu-icon ivu-icon-md-information-circle"></i>
|
||
</Tooltip>
|
||
</span>
|
||
<Select multiple allow-create filterable default-first-option
|
||
v-model="optionModel.fileAccept" style="width: 100%">
|
||
<Option v-for="(ft, ftIdx) in uploadFileAccept" :key="ftIdx"
|
||
:label="ft.label" :value="ft.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem
|
||
v-if="hasConfig('fileTypes') && (selectedWidget.type === 'file-upload')">
|
||
<span slot="label">{{i18nt('designer.setting.fileTypes')}}
|
||
<Tooltip
|
||
:content="i18nt('designer.setting.fileTypesHelp')">
|
||
<i class="ivu-icon ivu-icon-md-information-circle"></i>
|
||
</Tooltip>
|
||
</span>
|
||
<Select multiple allow-create filterable default-first-option
|
||
v-model="optionModel.fileTypes" style="width: 100%">
|
||
<Option v-for="(ft, ftIdx) in uploadFileTypes" :key="ftIdx"
|
||
:label="ft.label" :value="ft.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
</div>
|
||
</Panel>
|
||
|
||
<Panel name="2">
|
||
{{i18nt('designer.setting.advancedSetting')}}
|
||
<div slot="content">
|
||
<FormItem :label="i18nt('designer.setting.minValue')" v-if="hasConfig('min')">
|
||
<Input type="number" v-model="minValue" class="hide-spin-button"
|
||
style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.maxValue')"
|
||
v-if="hasConfig('max') && (selectedWidget.type !== 'rate')">
|
||
<Input type="number" v-model="maxValue" class="hide-spin-button"
|
||
style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.precision')"
|
||
v-if="hasConfig('precision')">
|
||
<Input type="number" v-model="optionModel.precision" :min="0"
|
||
class="hide-spin-button" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.formatter')"
|
||
v-if="hasConfig('formatter')">
|
||
<Input type="text" v-model="optionModel.formatter"
|
||
class="hide-spin-button" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.step')" v-if="hasConfig('step')">
|
||
<Input type="number" v-model="optionModel.step" class="hide-spin-button"
|
||
style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.controlsPosition')"
|
||
v-if="hasConfig('controlsPosition')">
|
||
<Select v-model="optionModel.controlsPosition">
|
||
<Option label="default" value="default"></Option>
|
||
<Option label="right" value="right"></Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.minLength')"
|
||
v-if="hasConfig('minLength')">
|
||
<Input type="number" @input.native="inputNumberHandler"
|
||
class="hide-spin-button" min="0" v-model="minLength"
|
||
style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.maxLength')"
|
||
v-if="hasConfig('maxLength')">
|
||
<Input type="number" @input.native="inputNumberHandler"
|
||
class="hide-spin-button" min="1" v-model="maxLength"
|
||
style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showWordLimit')"
|
||
v-if="hasConfig('showWordLimit')">
|
||
<Checkbox v-model="optionModel.showWordLimit"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.prefixIcon')"
|
||
v-if="hasConfig('prefixIcon')">
|
||
<Input type="text" v-model="optionModel.prefixIcon" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.suffixIcon')"
|
||
v-if="hasConfig('suffixIcon')">
|
||
<Input type="text" v-model="optionModel.suffixIcon" />
|
||
</FormItem>
|
||
|
||
|
||
<FormItem :label="i18nt('designer.setting.activeText')"
|
||
v-if="hasConfig('activeText')">
|
||
<Input type="text" v-model="optionModel.activeText" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.inactiveText')"
|
||
v-if="hasConfig('inactiveText')">
|
||
<Input type="text" v-model="optionModel.inactiveText" />
|
||
</FormItem>
|
||
|
||
|
||
|
||
<FormItem :label="i18nt('designer.setting.activeText')"
|
||
v-if="hasConfig('activeText')">
|
||
<Input type="text" v-model="optionModel.activeText" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.inactiveText')"
|
||
v-if="hasConfig('inactiveText')">
|
||
<Input type="text" v-model="optionModel.inactiveText" />
|
||
</FormItem>
|
||
|
||
|
||
|
||
<FormItem :label="i18nt('designer.setting.activeColor')"
|
||
v-if="hasConfig('activeColor')">
|
||
<ColorPicker v-model="optionModel.activeColor"></ColorPicker >
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.inactiveColor')"
|
||
v-if="hasConfig('inactiveColor')">
|
||
<ColorPicker v-model="optionModel.inactiveColor"></ColorPicker >
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.maxStars')"
|
||
v-if="hasConfig('max') && (selectedWidget.type === 'rate')">
|
||
<Input type="number" v-model="optionModel.max" :min="1" :max="10"
|
||
class="hide-spin-button" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.lowThreshold')"
|
||
v-if="hasConfig('lowThreshold')">
|
||
<Input type="number" v-model="optionModel.lowThreshold" :min="1"
|
||
:max="optionModel.highThreshold" class="hide-spin-button"
|
||
style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.highThreshold')"
|
||
v-if="hasConfig('highThreshold')">
|
||
<Input type="number" v-model="optionModel.highThreshold"
|
||
:min="optionModel.lowThreshold" :max="optionModel.max"
|
||
class="hide-spin-button" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.allowHalf')"
|
||
v-if="hasConfig('allowHalf')">
|
||
<Checkbox v-model="optionModel.allowHalf"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showText')"
|
||
v-if="hasConfig('showText')">
|
||
<Checkbox v-model="optionModel.showText"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showScore')"
|
||
v-if="hasConfig('showScore')">
|
||
<Checkbox v-model="optionModel.showScore"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showScore')"
|
||
v-if="hasConfig('showScore')">
|
||
<Checkbox v-model="optionModel.showScore"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showScore')"
|
||
v-if="hasConfig('showScore')">
|
||
<Checkbox v-model="optionModel.showScore"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.range')" v-if="hasConfig('range')">
|
||
<Checkbox v-model="optionModel.range"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.direction')"
|
||
v-if="hasConfig('direction')">
|
||
<Checkbox v-model="optionModel.direction" true-value="horizontal" false-value="vertical"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.plain')" v-if="hasConfig('plain')">
|
||
<Checkbox v-model="optionModel.plain"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.round')" v-if="hasConfig('round')">
|
||
<Checkbox v-model="optionModel.round"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.circle')" v-if="hasConfig('circle')">
|
||
<Checkbox v-model="optionModel.circle"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.buttonIcon')"
|
||
v-if="hasConfig('icon')">
|
||
<Input type="text" v-model="optionModel.icon" />
|
||
</FormItem>
|
||
|
||
<FormItem :label="i18nt('designer.setting.customClass')"
|
||
v-if="!!selectedWidget.options">
|
||
<Select v-model="optionModel.customClass" multiple filterable allow-create
|
||
default-first-option>
|
||
<Option v-for="(item, idx) in cssClassList" :key="idx" :label="item"
|
||
:value="item"></Option>
|
||
</Select>
|
||
</FormItem>
|
||
|
||
<FormItem :label-width="0" v-if="hasConfig('labelIconClass')">
|
||
<Divider size="small" class="custom-divider">
|
||
{{i18nt('designer.setting.customLabelIcon')}}
|
||
</Divider>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelIconClass')"
|
||
v-if="hasConfig('labelIconClass')">
|
||
<Input type="text" v-model="optionModel.labelIconClass" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelIconPosition')"
|
||
v-if="hasConfig('labelIconPosition')">
|
||
<Select v-model="optionModel.labelIconPosition">
|
||
<Option v-for="item in labelIconPosition" :key="item.value"
|
||
:label="item.label" :value="item.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelTooltip')"
|
||
v-if="hasConfig('labelTooltip')">
|
||
<Input type="text" v-model="optionModel.labelTooltip" />
|
||
</FormItem>
|
||
|
||
<!-- 复合输入框 -->
|
||
<FormItem :label-width="0" v-if="hasConfig('appendControl')">
|
||
<Divider size="small" class="custom-divider">{{i18nt('designer.setting.inputControl')}}
|
||
</Divider>
|
||
<div style="font-size:12px;line-height:15px;color:#AAAAAA">提示:受iview组件限制,切换前置/后置组件可能无法及时生效,请刷新页面</div>
|
||
</FormItem>
|
||
<!-- 添加前置按钮 -->
|
||
<FormItem :label="i18nt('designer.setting.prependControl')" v-if="hasConfig('prependControl')">
|
||
<Checkbox v-model="optionModel.prependControl" @on-change="updateFormView"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.prependControlDisabled')" v-if="hasConfig('prependControlDisabled')">
|
||
<Checkbox v-model="optionModel.prependControlDisabled"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.prependControlIcon')" v-if="hasConfig('prependControlIcon')">
|
||
<Input type="text" v-model="optionModel.prependControlIcon" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.prependControlType')" v-if="hasConfig('prependControlType')">
|
||
<Select v-model="optionModel.prependControlType">
|
||
<Option v-for="item in inputControlType" :key="item.value"
|
||
:label="item.label" :value="item.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.prependControlText')" v-if="hasConfig('prependControlText')">
|
||
<Input type="text" v-model="optionModel.prependControlText" />
|
||
</FormItem>
|
||
<!-- 添加后置按钮 -->
|
||
<FormItem :label="i18nt('designer.setting.appendControl')" v-if="hasConfig('appendControl')">
|
||
<Checkbox v-model="optionModel.appendControl" @on-change="updateFormView"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.appendControlDisabled')" v-if="hasConfig('appendControlDisabled')">
|
||
<Checkbox v-model="optionModel.appendControlDisabled"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.appendControlIcon')" v-if="hasConfig('appendControlIcon')">
|
||
<Input type="text" v-model="optionModel.appendControlIcon" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.appendControlType')" v-if="hasConfig('appendControlType')">
|
||
<Select v-model="optionModel.appendControlType">
|
||
<Option v-for="item in inputControlType" :key="item.value"
|
||
:label="item.label" :value="item.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
|
||
<FormItem :label="i18nt('designer.setting.appendControlText')" v-if="hasConfig('appendControlText')">
|
||
<Input type="text" v-model="optionModel.appendControlText" />
|
||
</FormItem>
|
||
|
||
<FormItem :label="i18nt('designer.setting.appendButtonText')"
|
||
v-if="hasConfig('appendButtonText')">
|
||
<Input type="text" v-model="optionModel.appendButtonText" />
|
||
</FormItem>
|
||
|
||
<!-- 按钮跳转模式 -->
|
||
<FormItem :label="i18nt('designer.setting.to')" v-if="hasConfig('to')">
|
||
<Input type="text" v-model="optionModel.to" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.target')" v-if="hasConfig('target')">
|
||
<Input type="text" v-model="optionModel.target" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.replace')" v-if="hasConfig('replace')">
|
||
<Checkbox v-model="optionModel.replace"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.append')" v-if="hasConfig('append')">
|
||
<Checkbox v-model="optionModel.append"></Checkbox>
|
||
</FormItem>
|
||
</div>
|
||
</Panel>
|
||
|
||
<Panel name="3">
|
||
{{i18nt('designer.setting.eventSetting')}}
|
||
<div slot="content">
|
||
<FormItem label="onCreated" :labelWidth="180" v-if="hasConfig('onCreated')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onCreated')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onMounted" :labelWidth="180" v-if="hasConfig('onMounted')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onMounted')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onClick" :labelWidth="180" v-if="hasConfig('onClick')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onClick')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onRemoteQuery" :labelWidth="180" v-if="hasConfig('onRemoteQuery')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onRemoteQuery')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onInput" :labelWidth="180" v-if="hasConfig('onInput')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onInput')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onChange" :labelWidth="180" v-if="hasConfig('onChange')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onChange')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onFocus" :labelWidth="180" v-if="hasConfig('onFocus')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onFocus')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onBlur" :labelWidth="180" v-if="hasConfig('onBlur')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onBlur')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onBeforeUpload" :labelWidth="180" v-if="hasConfig('onBeforeUpload')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onBeforeUpload')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onUploadSuccess" :labelWidth="180" v-if="hasConfig('onUploadSuccess')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onUploadSuccess')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onUploadError" :labelWidth="180" v-if="hasConfig('onUploadError')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onUploadError')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onUploadPreview" :labelWidth="180" v-if="hasConfig('onUploadPreview')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onUploadPreview')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onUploadProgress" :labelWidth="180" v-if="hasConfig('onUploadProgress')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onUploadProgress')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onValidate" :labelWidth="180" v-if="hasConfig('onValidate')">
|
||
<Button type="info" icon="md-create" plain round
|
||
@click="editEventHandler('onValidate')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
</div>
|
||
</Panel>
|
||
|
||
</Collapse>
|
||
</Form>
|
||
</template>
|
||
|
||
<template v-if="(!!designer.selectedWidget && !!designer.selectedWidget.category)">
|
||
|
||
<Collapse v-model="widgetActiveCollapseNames" class="setting-collapse">
|
||
<Panel name="1">
|
||
{{i18nt('designer.setting.commonSetting')}}
|
||
<div slot="content">
|
||
<Form :model="optionModel" size="mini" label-position="left" :labelWidth="120"
|
||
class="setting-form">
|
||
<FormItem :label="i18nt('designer.setting.widgetName')"
|
||
v-if="hasConfig('name')">
|
||
<Input type="text" v-model="optionModel.name" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelAlign')"
|
||
v-if="hasConfig('labelAlign')">
|
||
<RadioGroup v-model="optionModel.labelAlign" class="radio-group-custom">
|
||
<Radio label="label-left-align">
|
||
{{i18nt('designer.setting.leftAlign')}}
|
||
</Radio>
|
||
<Radio label="label-center-align">
|
||
{{i18nt('designer.setting.centerAlign')}}
|
||
</Radio>
|
||
<Radio label="label-right-align">
|
||
{{i18nt('designer.setting.rightAlign')}}
|
||
</Radio>
|
||
</RadioGroup>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showBlankRow')"
|
||
v-if="hasConfig('showBlankRow')">
|
||
<Checkbox v-model="optionModel.showBlankRow"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.showRowNumber')"
|
||
v-if="hasConfig('showRowNumber')">
|
||
<Checkbox v-model="optionModel.showRowNumber"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.hidden')" v-if="hasConfig('hidden')">
|
||
<Checkbox v-model="optionModel.hidden"></Checkbox>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.cellWidth')"
|
||
v-if="hasConfig('cellWidth')">
|
||
<Input type="text" v-model="optionModel.cellWidth" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.cellHeight')"
|
||
v-if="hasConfig('cellHeight')">
|
||
<Input type="text" v-model="optionModel.cellHeight" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.customClass')"
|
||
v-if="!!selectedWidget.options">
|
||
<Select v-model="optionModel.customClass" multiple filterable allow-create
|
||
default-first-option>
|
||
<Option v-for="(item, idx) in cssClassList" :key="idx" :label="item"
|
||
:value="item"></Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label-width="0" v-if="hasConfig('gutter')">
|
||
<Divider size="small" class="custom-divider">{{i18nt('designer.setting.columnSetting')}}
|
||
</Divider>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.gutter')" v-if="hasConfig('gutter')">
|
||
<Input type="number" v-model="optionModel.gutter" style="width: 100%" />
|
||
</FormItem>
|
||
</Form>
|
||
|
||
<Form :model="optionModel" size="mini" v-if="selectedWidget.type === 'grid'"
|
||
label-position="top" class="setting-form">
|
||
<FormItem :label="i18nt('designer.setting.colsOfGrid')">
|
||
<li v-for="(colItem, colIdx) in selectedWidget.cols" :key="colIdx"
|
||
class="col-item">
|
||
<span
|
||
class="col-span-title">{{i18nt('designer.setting.colSpanTitle')}}{{colIdx + 1}}</span>
|
||
<Input type="number" v-model.number="colItem.options.span" :min="1"
|
||
:max="24"
|
||
@change="(newValue, oldValue) => spanChanged(selectedWidget, colItem, colIdx, newValue, oldValue)"
|
||
class="cell-span-input" />
|
||
<Button shape="circle" type="warning"
|
||
@click="deleteCol(selectedWidget, colIdx)" icon="md-close"
|
||
class="col-delete-button"></Button>
|
||
</li>
|
||
<div>
|
||
<Button type="default" @click="addNewCol(selectedWidget)">
|
||
{{i18nt('designer.setting.addColumn')}}
|
||
</Button>
|
||
</div>
|
||
</FormItem>
|
||
</Form>
|
||
|
||
<Form :model="optionModel" size="small" v-if="selectedWidget.type === 'grid-col'"
|
||
label-position="left" :labelWidth="120" class="setting-form">
|
||
<FormItem :label="i18nt('designer.setting.colSpanTitle')">
|
||
<Input type="number" v-model.number="optionModel.span" :min="1" :max="24"
|
||
style="width: 100%" />
|
||
</FormItem>
|
||
</Form>
|
||
<Form :model="optionModel" size="small" v-if="selectedWidget.type === 'tab'"
|
||
label-position="left" :labelWidth="120"
|
||
class="setting-form panes-setting">
|
||
<FormItem :label="i18nt('designer.setting.tabPaneType')" v-if="hasConfig('displayType')">
|
||
<Select v-model="optionModel.displayType">
|
||
<Option v-for="item in tabPaneType" :key="item.value"
|
||
:label="item.label" :value="item.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.widgetSize')" v-if="hasConfig('size')&&optionModel.displayType=='line'">
|
||
<Select v-model="optionModel.size">
|
||
<Option v-for="item in widgetSizes2" :key="item.value"
|
||
:label="item.label" :value="item.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label-width="0">
|
||
<Divider size="small" class="custom-divider-margin-top">
|
||
{{i18nt('designer.setting.tabPaneSetting')}}
|
||
</Divider>
|
||
</FormItem>
|
||
<FormItem :label-width="0">
|
||
<draggable tag="ul" :list="selectedWidget.tabs"
|
||
v-bind="{group:'panesGroup', ghostClass: 'ghost', handle: '.drag-option'}">
|
||
<li v-for="(tpItem, tpIdx) in selectedWidget.tabs" :key="tpIdx"
|
||
class="col-item">
|
||
<!-- <span style="margin-right: 12px">{{tpIdx + 1}}</span> -->
|
||
<Checkbox v-model="tpItem.options.disabled"
|
||
@change="(evt) => onTabPaneActiveChange(evt, tpItem)"
|
||
style="margin-right: 8px">
|
||
{{i18nt('designer.setting.paneDisabled')}}
|
||
</Checkbox>
|
||
<Input type="text" v-model="tpItem.options.label" style="width: 155px" />
|
||
<i class="iconfont icon-drag drag-option"></i>
|
||
<Button shape='circle' size="small" type="warning"
|
||
@click="deleteTabPane(selectedWidget, tpIdx)"
|
||
icon="md-remove" class="col-delete-button"></Button>
|
||
</li>
|
||
<div>
|
||
<Button type="text" @click="addTabPane(selectedWidget)" icon="md-add">
|
||
{{i18nt('designer.setting.addTabPane')}}
|
||
</Button>
|
||
</div>
|
||
</draggable>
|
||
</FormItem>
|
||
</Form>
|
||
</div>
|
||
</Panel>
|
||
|
||
<Panel name="3">
|
||
{{i18nt('designer.setting.eventSetting')}}
|
||
<div slot="content">
|
||
<Form :model="optionModel" size="mini" label-position="left" :labelWidth="150"
|
||
class="setting-form">
|
||
<FormItem label="onSubFormRowAdd" :labelWidth="180" v-if="hasConfig('onSubFormRowAdd')">
|
||
<Button type="info" icon="el-icon-edit" plain round
|
||
@click="editEventHandler('onSubFormRowAdd')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onSubFormRowInsert" :labelWidth="180" v-if="hasConfig('onSubFormRowInsert')">
|
||
<Button type="info" icon="el-icon-edit" plain round
|
||
@click="editEventHandler('onSubFormRowInsert')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onSubFormRowDelete" :labelWidth="180" v-if="hasConfig('onSubFormRowDelete')">
|
||
<Button type="info" icon="el-icon-edit" plain round
|
||
@click="editEventHandler('onSubFormRowDelete')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onSubFormRowChange" :labelWidth="180" v-if="hasConfig('onSubFormRowChange')">
|
||
<Button type="info" icon="el-icon-edit" plain round
|
||
@click="editEventHandler('onSubFormRowChange')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
</Form>
|
||
</div>
|
||
</Panel>
|
||
</Collapse>
|
||
|
||
</template>
|
||
|
||
</Scroll>
|
||
</TabPane>
|
||
|
||
<TabPane v-if="!!designer" :label="i18nt('designer.hint.formSetting')" name="2">
|
||
<Form :model="formConfig" size="mini" label-position="left" :labelWidth="120" class="setting-form">
|
||
<Collapse v-model="formActiveCollapseNames" class="setting-collapse">
|
||
<Panel name="1">
|
||
{{i18nt('designer.setting.basicSetting')}}
|
||
<div slot="content">
|
||
<FormItem :label="i18nt('designer.setting.formSize')">
|
||
<Select v-model="formConfig.size">
|
||
<Option v-for="item in formSizes" :key="item.value" :label="item.label"
|
||
:value="item.value">
|
||
</Option>
|
||
</Select>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelPosition')">
|
||
<RadioGroup v-model="formConfig.labelPosition" class="radio-group-custom">
|
||
<Radio label="left">{{i18nt('designer.setting.leftPosition')}}
|
||
</Radio>
|
||
<Radio label="top">{{i18nt('designer.setting.topPosition')}}
|
||
</Radio>
|
||
</RadioGroup>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelAlign')">
|
||
<RadioGroup v-model="formConfig.labelAlign" class="radio-group-custom">
|
||
<Radio label="label-left-align">{{i18nt('designer.setting.leftAlign')}}
|
||
</Radio>
|
||
<Radio label="label-center-align">
|
||
{{i18nt('designer.setting.centerAlign')}}
|
||
</Radio>
|
||
<Radio label="label-right-align">{{i18nt('designer.setting.rightAlign')}}
|
||
</Radio>
|
||
</RadioGroup>
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.labelWidth')">
|
||
<Input type="number" v-model="formConfig.labelWidth" :min="0" style="width: 100%" />
|
||
</FormItem>
|
||
<FormItem :label="i18nt('designer.setting.formCss')" :labelWidth="180">
|
||
<Button type="info" icon="md-create" @click="editFormCss">
|
||
{{i18nt('designer.setting.addCss')}}
|
||
</Button>
|
||
</FormItem>
|
||
<!-- -->
|
||
<FormItem :label="i18nt('designer.setting.customClass')">
|
||
<Select v-model="formConfig.customClass" multiple filterable allow-create
|
||
default-first-option>
|
||
<Option v-for="(item, idx) in cssClassList" :key="idx" :label="item"
|
||
:value="item"></Option>
|
||
</Select>
|
||
</FormItem>
|
||
<!-- -->
|
||
<FormItem :label="i18nt('designer.setting.globalFunctions')" :labelWidth="180">
|
||
<Button type="info" icon="md-create" @click="editGlobalFunctions">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
</div>
|
||
</Panel>
|
||
|
||
<Panel name="2" :title="i18nt('designer.setting.eventSetting')">
|
||
{{i18nt('designer.setting.eventSetting')}}
|
||
<div slot="content">
|
||
<FormItem label="onFormCreated" :labelWidth="180">
|
||
<Button type="info" icon="md-create"
|
||
@click="editFormEventHandler('onFormCreated')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<FormItem label="onFormMounted" :labelWidth="180">
|
||
<Button type="info" icon="md-create"
|
||
@click="editFormEventHandler('onFormMounted')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<!-- -->
|
||
<FormItem label="onFormDataChange" :labelWidth="180">
|
||
<Button type="info" icon="md-create"
|
||
@click="editFormEventHandler('onFormDataChange')">
|
||
{{i18nt('designer.setting.addEventHandler')}}
|
||
</Button>
|
||
</FormItem>
|
||
<!-- -->
|
||
<!--
|
||
<FormItem label="onFormValidate">
|
||
<Button type="info" icon="el-icon-edit" plain round @click="editFormEventHandler('onFormValidate')">
|
||
{{i18nt('designer.setting.addEventHandler')}}</Button>
|
||
</FormItem>
|
||
-->
|
||
</div>
|
||
</Panel>
|
||
</Collapse>
|
||
</Form>
|
||
</TabPane>
|
||
</Tabs>
|
||
|
||
<Modal :title="i18nt('designer.setting.editWidgetEventHandler')" v-model="showWidgetEventDialogFlag" :closable="true" class="small-padding-dialog" draggable :mask-closable="false">
|
||
<!-- <Alert :closable="false">{{(optionModel?optionModel.name:'') + '.' + eventParamsMap[curEventName]}}</Alert> -->
|
||
<div class="codeEditTip">{{(optionModel?optionModel.name:'') + '.' + eventParamsMap[curEventName]}}</div>
|
||
<code-editor v-if="showWidgetEventDialogFlag" :mode="'javascript'" :readonly="false" v-model="eventHandlerCode"></code-editor>
|
||
<div class="codeEditTip">}</div>
|
||
<div slot="footer" class="dialog-footer">
|
||
<Button size="default" @click="showWidgetEventDialogFlag = false">
|
||
{{i18nt('designer.hint.cancel')}}
|
||
</Button>
|
||
<Button size="default" type="primary" @click="saveEventHandler">
|
||
{{i18nt('designer.hint.confirm')}}
|
||
</Button>
|
||
</div>
|
||
</Modal>
|
||
|
||
<Modal :title="i18nt('designer.setting.editFormEventHandler')"
|
||
v-model="showFormEventDialogFlag" :closable="true" class="small-padding-dialog" draggable
|
||
:mask-closable="false">
|
||
<div class="codeEditTip">{{'form.' + eventParamsMap[curEventName]}}</div>
|
||
<code-editor v-if="showFormEventDialogFlag" :mode="'javascript'" :readonly="false" v-model="formEventHandlerCode"></code-editor>
|
||
<div class="codeEditTip">}</div>
|
||
<div slot="footer" class="dialog-footer">
|
||
<Button size="default" @click="showFormEventDialogFlag = false">
|
||
{{i18nt('designer.hint.cancel')}}
|
||
</Button>
|
||
<Button size="default" type="primary" @click="saveFormEventHandler">
|
||
{{i18nt('designer.hint.confirm')}}
|
||
</Button>
|
||
</div>
|
||
</Modal>
|
||
|
||
<Modal :title="i18nt('designer.setting.formCss')"
|
||
v-model="showEditFormCssDialogFlag" :closable="true" class="small-padding-dialog" draggable
|
||
:mask-closable="false">
|
||
<code-editor v-if="showEditFormCssDialogFlag" :mode="'css'" :readonly="false" v-model="formCssCode"></code-editor>
|
||
<div slot="footer" class="dialog-footer">
|
||
<Button size="default" @click="showEditFormCssDialogFlag = false">
|
||
{{i18nt('designer.hint.cancel')}}
|
||
</Button>
|
||
<Button size="default" type="primary" @click="saveFormCss">
|
||
{{i18nt('designer.hint.confirm')}}
|
||
</Button>
|
||
</div>
|
||
</Modal>
|
||
|
||
<Modal :title="i18nt('designer.setting.globalFunctions')"
|
||
v-model="showEditFunctionsDialogFlag" :closable="true" class="small-padding-dialog" draggable
|
||
:mask-closable="false">
|
||
<code-editor v-if="showEditFunctionsDialogFlag" :mode="'javascript'" :readonly="false" v-model="functionsCode"></code-editor>
|
||
<div slot="footer" class="dialog-footer">
|
||
<Button size="default" @click="showEditFunctionsDialogFlag = false">
|
||
{{i18nt('designer.hint.cancel')}}
|
||
</Button>
|
||
<Button size="default" type="primary" @click="saveGlobalFunctions">
|
||
{{i18nt('designer.hint.confirm')}}
|
||
</Button>
|
||
</div>
|
||
</Modal>
|
||
</Layout>
|
||
</template>
|
||
|
||
<script>
|
||
import Draggable from 'vuedraggable'
|
||
import CodeEditor from '../../code-editor/index'
|
||
import OptionItemsSetting from "../setting-panel/option-items-setting";
|
||
import {
|
||
addWindowResizeHandler,
|
||
deepClone,
|
||
insertCustomCssToHead,
|
||
insertGlobalFunctionsToHtml,
|
||
isEmptyStr
|
||
} from "@/utils/util";
|
||
import i18n from "../../utils/i18n.js";
|
||
|
||
export default {
|
||
name: "SettingPanel",
|
||
componentName: "SettingPanel",
|
||
mixins: [i18n],
|
||
components: {
|
||
Draggable,
|
||
OptionItemsSetting,
|
||
//CodeEditor: () => import('@/components/code-editor/index'),
|
||
CodeEditor,
|
||
},
|
||
props: {
|
||
designer: Object,
|
||
selectedWidget: Object,
|
||
formConfig: Object,
|
||
},
|
||
data() {
|
||
return {
|
||
scrollerHeight: 0,
|
||
|
||
nameRequiredRule: [{
|
||
required: true,
|
||
message: 'name required'
|
||
}],
|
||
|
||
activeTab: "2",
|
||
widgetActiveCollapseNames: ['1', '3'], //['1', '2', '3'],
|
||
formActiveCollapseNames: ['1', '2'],
|
||
displayTypes: [{
|
||
label: 'text',
|
||
value: 'text'
|
||
},
|
||
{
|
||
label: 'number',
|
||
value: 'number'
|
||
},
|
||
{
|
||
label: 'password',
|
||
value: 'password'
|
||
},
|
||
{
|
||
label: 'url',
|
||
value: 'url'
|
||
},
|
||
{
|
||
label: 'email',
|
||
value: 'email'
|
||
},
|
||
{
|
||
label: 'date',
|
||
value: 'date'
|
||
},
|
||
{
|
||
label: 'tel',
|
||
value: 'tel'
|
||
}
|
||
],
|
||
widgetSizes: [{
|
||
label: 'default',
|
||
value: '',
|
||
},
|
||
{
|
||
label: 'large',
|
||
value: 'large'
|
||
},
|
||
{
|
||
label: 'small',
|
||
value: 'small'
|
||
}
|
||
],
|
||
widgetSizes2: [{
|
||
label: 'default',
|
||
value: 'default',
|
||
},
|
||
{
|
||
label: 'small',
|
||
value: 'small'
|
||
}
|
||
],
|
||
tabPaneType:[{
|
||
label: 'card',
|
||
value: 'card',
|
||
},
|
||
{
|
||
label: 'line',
|
||
value: 'line'
|
||
}
|
||
],
|
||
formSizes: [{
|
||
label: 'default',
|
||
value: ''
|
||
},
|
||
{
|
||
label: 'large',
|
||
value: 'large'
|
||
},
|
||
{
|
||
label: 'small',
|
||
value: 'small'
|
||
}
|
||
],
|
||
inputControlType:[
|
||
{
|
||
label:'按钮',
|
||
value:'button'
|
||
},
|
||
// {
|
||
// label:'下拉框',
|
||
// value:'select'
|
||
// },
|
||
{
|
||
label:'文本',
|
||
value:'div'
|
||
},
|
||
],
|
||
buttonDisplayTypes:[{
|
||
label:'primary',
|
||
value:'primary'
|
||
},{
|
||
label:'default',
|
||
value:'default'
|
||
},{
|
||
label:'success',
|
||
value:'success'
|
||
},{
|
||
label:'warning',
|
||
value:'warning'
|
||
},{
|
||
label:'error',
|
||
value:'error'
|
||
},{
|
||
label:'dashed',
|
||
value:'dashed'
|
||
},{
|
||
label:'info',
|
||
value:'info'
|
||
},{
|
||
label:'text',
|
||
value:'text'
|
||
}],
|
||
labelIconPosition: [{
|
||
label: 'front',
|
||
value: 'front'
|
||
},
|
||
{
|
||
label: 'rear',
|
||
value: 'rear'
|
||
},
|
||
],
|
||
|
||
uploadPictureAccept: [
|
||
{
|
||
label: 'JPG',
|
||
value: 'image/jpg,image/jpeg'
|
||
},
|
||
{
|
||
label: 'PNG',
|
||
value: 'image/png'
|
||
},
|
||
{
|
||
label: 'GIF',
|
||
value: 'image/gif'
|
||
},
|
||
{
|
||
label: 'BMP',
|
||
value: 'image/bmp'
|
||
},
|
||
{
|
||
label: 'WEBP',
|
||
value: 'image/webp'
|
||
},
|
||
],
|
||
uploadPictureTypes: [
|
||
{
|
||
value: 'jpeg',
|
||
label: 'JPG'
|
||
},
|
||
{
|
||
value: 'png',
|
||
label: 'PNG'
|
||
},
|
||
{
|
||
value: 'gif',
|
||
label: 'GIF'
|
||
},
|
||
{
|
||
value: 'bmp',
|
||
label: 'BMP'
|
||
},
|
||
{
|
||
value: 'webp',
|
||
label: 'WEBP'
|
||
},
|
||
],
|
||
uploadFileAccept: [
|
||
{
|
||
label: '图片文件',
|
||
value: '.jpg,.jpeg,.png,.gif,image/bmp,image/webp'
|
||
},
|
||
{
|
||
label: '压缩文件',
|
||
value: '.zip,.rar,.7z,.gz,.tar'
|
||
},
|
||
{
|
||
label: 'WORD文档',
|
||
value: '.doc,.docx'
|
||
},
|
||
{
|
||
label: 'EXCEL文档',
|
||
value: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel'
|
||
},
|
||
{
|
||
label: 'PPT文档',
|
||
value: '.ppt,.pptx'
|
||
}
|
||
],
|
||
uploadFileTypes: [
|
||
{
|
||
value: 'jpeg',
|
||
label: 'JPG'
|
||
},
|
||
{
|
||
value: 'png',
|
||
label: 'PNG'
|
||
},
|
||
{
|
||
value: 'gif',
|
||
label: 'GIF'
|
||
},
|
||
{
|
||
value: 'bmp',
|
||
label: 'BMP'
|
||
},
|
||
{
|
||
value: 'webp',
|
||
label: 'WEBP'
|
||
},
|
||
{
|
||
value: 'doc',
|
||
label: 'doc'
|
||
},
|
||
{
|
||
value: 'xls',
|
||
label: 'xls'
|
||
},
|
||
{
|
||
value: 'docx',
|
||
label: 'docx'
|
||
},
|
||
{
|
||
value: 'xlsx',
|
||
label: 'xlsx'
|
||
},
|
||
{
|
||
value: 'ppt',
|
||
label: 'ppt'
|
||
},
|
||
{
|
||
value: 'pptx',
|
||
label: 'pptx'
|
||
},
|
||
{
|
||
value: 'zip',
|
||
label: 'zip'
|
||
},
|
||
{
|
||
value: 'rar',
|
||
label: 'rar'
|
||
},
|
||
{
|
||
value: '7z',
|
||
label: '7z'
|
||
},
|
||
{
|
||
value: 'gz',
|
||
label: 'gz'
|
||
},
|
||
{
|
||
value: 'tar',
|
||
label: 'tar'
|
||
},
|
||
],
|
||
|
||
fieldValidators: [{
|
||
value: 'number',
|
||
label: this.i18nt('designer.hint.numberValidator')
|
||
},
|
||
{
|
||
value: 'letter',
|
||
label: this.i18nt('designer.hint.letterValidator')
|
||
},
|
||
{
|
||
value: 'letterAndNumber',
|
||
label: this.i18nt('designer.hint.letterAndNumberValidator')
|
||
},
|
||
{
|
||
value: 'mobilePhone',
|
||
label: this.i18nt('designer.hint.mobilePhoneValidator')
|
||
},
|
||
{
|
||
value: 'email',
|
||
label: this.i18nt('designer.hint.emailValidator')
|
||
},
|
||
{
|
||
value: 'url',
|
||
label: this.i18nt('designer.hint.urlValidator')
|
||
},
|
||
{
|
||
value: 'noChinese',
|
||
label: this.i18nt('designer.hint.noChineseValidator')
|
||
},
|
||
{
|
||
value: 'chinese',
|
||
label: this.i18nt('designer.hint.chineseValidator')
|
||
},
|
||
],
|
||
|
||
showEditFormCssDialogFlag: false,
|
||
formCssCode: '',
|
||
cssClassList: [],
|
||
|
||
showEditFunctionsDialogFlag: false,
|
||
functionsCode: '',
|
||
|
||
showWidgetEventDialogFlag: false,
|
||
showFormEventDialogFlag: false,
|
||
eventParamsMap: {
|
||
'onCreated': 'onCreated() {',
|
||
'onMounted': 'onMounted() {',
|
||
'onClick': 'onClick() {',
|
||
'onInput': 'onInput(value) {',
|
||
'onChange': 'onChange(value, oldValue, subFormData, rowId) {',
|
||
'onFocus': 'onFocus(event)',
|
||
'onBlur': 'onBlur(event)',
|
||
'onRemoteQuery': 'onRemoteQuery(keyword) {',
|
||
'onBeforeUpload': 'onBeforeUpload(file) {',
|
||
'onUploadSuccess': 'onUploadSuccess(result, file, fileList) {',
|
||
'onUploadError': 'onUploadError(error, file, fileList) {',
|
||
'onUploadPreview': 'onUploadPreview(error, file, fileList) {',
|
||
'onUploadProgress': 'onUploadProgress(error, file, fileList) {',
|
||
'onValidate': 'onValidate(rule, value, callback)',
|
||
|
||
|
||
|
||
'onFormCreated': 'onFormCreated() {',
|
||
'onFormMounted': 'onFormMounted() {',
|
||
'onFormDataChange': 'onFormDataChange(fieldName, newValue, oldValue, formModel, subFormName, subFormRowIndex) {',
|
||
//'onFormValidate': 'onFormValidate() {',
|
||
|
||
'onSubFormRowAdd': 'onSubFormRowAdd(subFormData, newRowIndex) {',
|
||
'onSubFormRowInsert': 'onSubFormRowInsert(subFormData, newRowIndex) {',
|
||
'onSubFormRowDelete': 'onSubFormRowDelete(subFormData, deletedDataRow) {',
|
||
'onSubFormRowChange': 'onSubFormRowChange(subFormData) {',
|
||
},
|
||
eventHandlerCode: '',
|
||
formEventHandlerCode: '',
|
||
curEventName: '',
|
||
|
||
subFormChildWidgetFlag: false,
|
||
}
|
||
},
|
||
computed: {
|
||
optionModel: {
|
||
get() {
|
||
if(this.selectedWidget)
|
||
return this.selectedWidget.options
|
||
else
|
||
return null;
|
||
},
|
||
|
||
set(newValue) {
|
||
this.selectedWidget.options = newValue
|
||
}
|
||
},
|
||
|
||
minValue: {
|
||
get() {
|
||
return this.optionModel['min']
|
||
},
|
||
|
||
set(newValue) {
|
||
//if ((!newValue && (newValue !== 0)) || isNaN(newValue)) {
|
||
if ((newValue === undefined) || (newValue === null) || isNaN(newValue)) {
|
||
this.optionModel.min = null
|
||
} else {
|
||
this.optionModel.min = Number(newValue)
|
||
}
|
||
}
|
||
},
|
||
|
||
maxValue: {
|
||
get() {
|
||
return this.optionModel['max']
|
||
},
|
||
|
||
set(newValue) {
|
||
if (!newValue || isNaN(newValue)) {
|
||
this.optionModel.max = null
|
||
} else {
|
||
this.optionModel.max = Number(newValue)
|
||
}
|
||
}
|
||
},
|
||
|
||
minLength: {
|
||
get() {
|
||
return this.optionModel['minLength']
|
||
},
|
||
|
||
set(newValue) {
|
||
if (!newValue || isNaN(newValue)) {
|
||
this.optionModel.minLength = null
|
||
} else {
|
||
this.optionModel.minLength = Number(newValue)
|
||
}
|
||
}
|
||
},
|
||
|
||
maxLength: {
|
||
get() {
|
||
return this.optionModel['maxLength']
|
||
},
|
||
|
||
set(newValue) {
|
||
if (!newValue || isNaN(newValue)) {
|
||
this.optionModel.maxLength = null
|
||
} else {
|
||
this.optionModel.maxLength = Number(newValue)
|
||
}
|
||
}
|
||
},
|
||
|
||
noLabelSetting() {
|
||
return (this.selectedWidget.type === 'static-text') || (this.selectedWidget.type === 'html-text')
|
||
//|| (this.selectedWidget.type === 'divider')
|
||
},
|
||
|
||
},
|
||
watch: {
|
||
'designer.selectedWidget': {
|
||
handler(val) {
|
||
if (!!val) {
|
||
this.activeTab = "1"
|
||
}
|
||
}
|
||
},
|
||
|
||
'selectedWidget.options': { //组件属性变动后,立即保存表单JSON!!
|
||
deep: true,
|
||
handler(val) {
|
||
this.designer.saveCurrentHistoryStep()
|
||
}
|
||
},
|
||
|
||
formConfig: {
|
||
deep: true,
|
||
handler(val) {
|
||
this.designer.saveCurrentHistoryStep()
|
||
}
|
||
},
|
||
|
||
},
|
||
mounted() {
|
||
if (!this.designer.selectedWidget) {
|
||
this.activeTab = "2"
|
||
} else {
|
||
this.activeTab = "1"
|
||
}
|
||
|
||
this.scrollerHeight = window.innerHeight - 56 - 48 // + 'px'
|
||
addWindowResizeHandler(() => {
|
||
this.$nextTick(() => {
|
||
this.scrollerHeight = window.innerHeight - 56 - 48 // + 'px'
|
||
//console.log(this.scrollerHeight)
|
||
})
|
||
})
|
||
|
||
this.designer.handleEvent('field-selected', (parentWidget) => {
|
||
this.subFormChildWidgetFlag = !!parentWidget && (parentWidget.type === 'sub-form');
|
||
})
|
||
|
||
//console.log('mounted--', this.formConfig.cssCode)
|
||
/*
|
||
this.formCssCode = this.formConfig.cssCode
|
||
insertCustomCssToHead(this.formCssCode)
|
||
this.extractCssClass()
|
||
*/
|
||
/* SettingPanel和FormWidget为兄弟组件, 在FormWidget加载formConfig时,
|
||
此处SettingPanel可能无法获取到formConfig.cssCode, 故加个延时函数! */
|
||
setTimeout(() => {
|
||
this.formCssCode = this.formConfig.cssCode
|
||
insertCustomCssToHead(this.formCssCode)
|
||
this.extractCssClass()
|
||
}, 1200)
|
||
},
|
||
methods: {
|
||
updateWidgetNameAndRef(newName) {
|
||
let oldName = this.designer.selectedWidgetName
|
||
if (isEmptyStr(newName)) {
|
||
this.selectedWidget.options.name = oldName
|
||
this.$message.info(this.i18nt('designer.hint.nameRequired'))
|
||
return
|
||
}
|
||
|
||
if (!!this.designer.formWidget) {
|
||
//检查newName是否已存在!!
|
||
let foundRef = this.designer.formWidget.getWidgetRef(newName)
|
||
if (!!foundRef) {
|
||
this.selectedWidget.options.name = oldName
|
||
this.$message.info(this.i18nt('designer.hint.duplicateName') + newName)
|
||
return
|
||
}
|
||
|
||
let fieldWidget = this.designer.formWidget.getWidgetRef(oldName)
|
||
if (!!fieldWidget && !!fieldWidget.registerToRefList) {
|
||
fieldWidget.registerToRefList(oldName)
|
||
this.designer.updateSelectedWidgetNameAndRef(this.selectedWidget, newName)
|
||
}
|
||
}
|
||
},
|
||
|
||
spanChanged(curGrid, col, colIdx, newValue, oldValue) {
|
||
let spanSum = 0
|
||
curGrid.cols.forEach((colItem, idx) => {
|
||
spanSum += colItem.options.span
|
||
})
|
||
if (spanSum > 24) {
|
||
//this.$message.info('列栅格之和超出24')
|
||
console.log('列栅格之和超出24')
|
||
//TODO: 语言字符串资源化
|
||
}
|
||
|
||
this.updateCurrentHistoryStep()
|
||
},
|
||
|
||
updateCurrentHistoryStep() {
|
||
this.designer.saveCurrentHistoryStep()
|
||
},
|
||
|
||
deleteCol(curGrid, colIdx) {
|
||
this.designer.deleteColOfGrid(curGrid, colIdx)
|
||
this.designer.emitHistoryChange()
|
||
},
|
||
|
||
addNewCol(curGrid) {
|
||
this.designer.addNewColOfGrid(curGrid)
|
||
this.designer.emitHistoryChange()
|
||
},
|
||
|
||
hasConfig(configName) {
|
||
if (!this.designer || !this.designer.selectedWidget) {
|
||
return false
|
||
}
|
||
|
||
return this.designer.hasConfig(this.selectedWidget, configName)
|
||
},
|
||
|
||
inputNumberHandler({})
|
||
{
|
||
target.value = target.value.replace(/[^0-9]/gi, '')
|
||
// if (target.value === '') {
|
||
// target.value = null
|
||
// } else {
|
||
// target.value = Number(target.value) //TODO: 为什么还是转化为字符串??
|
||
// }
|
||
},
|
||
|
||
emitDefaultValueChange() {
|
||
if (!!this.designer) {
|
||
if (!!this.designer.formWidget) {
|
||
let fieldWidget = this.designer.formWidget.getWidgetRef(this.designer.selectedWidget.options.name)
|
||
if (!!fieldWidget && !!fieldWidget.refreshDefaultValue) {
|
||
fieldWidget.refreshDefaultValue()
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
addTabPane(curTabs) {
|
||
this.designer.addTabPaneOfTabs(curTabs)
|
||
this.designer.emitHistoryChange()
|
||
},
|
||
|
||
deleteTabPane(curTabs, tpIdx) {
|
||
if (curTabs.tabs.length === 1) {
|
||
this.$message.info(this.i18nt('designer.hint.lastPaneCannotBeDeleted'))
|
||
return
|
||
}
|
||
|
||
this.designer.deleteTabPaneOfTabs(curTabs, tpIdx)
|
||
this.designer.emitHistoryChange()
|
||
},
|
||
|
||
onTabPaneActiveChange(evt, tpItem) {
|
||
//TODO: !!!
|
||
},
|
||
|
||
onMultipleSelected(val) {
|
||
if (val) {
|
||
this.optionModel.defaultValue = [] //清空原默认值!!
|
||
} else {
|
||
if (!!this.optionModel.defaultValue && (this.optionModel.defaultValue.length > 0)) {
|
||
this.optionModel.defaultValue = this.optionModel.defaultValue[0]
|
||
} else {
|
||
this.optionModel.defaultValue = ''
|
||
}
|
||
}
|
||
},
|
||
|
||
onRemoteChange(val) {
|
||
if (!!val) {
|
||
this.optionModel.filterable = true
|
||
this.optionModel.allowCreate = false
|
||
}
|
||
},
|
||
|
||
editFormCss() {
|
||
this.formCssCode = this.designer.formConfig.cssCode
|
||
this.showEditFormCssDialogFlag = true
|
||
},
|
||
|
||
extractCssClass() {
|
||
let regExp = /\..*{/g
|
||
let result = this.formCssCode.match(regExp)
|
||
//this.cssClassList.length = 0
|
||
this.cssClassList.splice(0, this.cssClassList.length) //清除数组必须用splice,length=0不会响应式更新!!
|
||
if (!!result && result.length > 0) {
|
||
result.forEach((rItem, rIdx) => {
|
||
let classArray = rItem.split(',') //切分逗号分割的多个class
|
||
if (classArray.length > 0) {
|
||
classArray.forEach((cItem, cIdx) => {
|
||
let caItem = cItem.trim()
|
||
if (caItem.indexOf('.', 1) !== -1) { //查找第二个.位置
|
||
let newClass = caItem.substring(caItem.indexOf('.') + 1, caItem
|
||
.indexOf('.', 1)) //仅截取第一、二个.号之间的class
|
||
if (!!newClass) {
|
||
this.cssClassList.push(newClass.trim())
|
||
}
|
||
} else if (caItem.indexOf(' ') !== -1) { //查找第一个空格位置
|
||
let newClass = caItem.substring(caItem.indexOf('.') + 1, caItem
|
||
.indexOf(' ')) //仅截取第一、二个.号之间的class
|
||
if (!!newClass) {
|
||
this.cssClassList.push(newClass.trim())
|
||
}
|
||
} else {
|
||
if (caItem.indexOf('{') !== -1) { //查找第一个{位置
|
||
let newClass = caItem.substring(caItem.indexOf('.') + 1, caItem
|
||
.indexOf('{'))
|
||
this.cssClassList.push(newClass.trim())
|
||
} else {
|
||
let newClass = caItem.substring(caItem.indexOf('.') + 1)
|
||
this.cssClassList.push(newClass.trim())
|
||
}
|
||
}
|
||
})
|
||
}
|
||
})
|
||
}
|
||
},
|
||
|
||
saveFormCss() {
|
||
this.extractCssClass()
|
||
this.designer.formConfig.cssCode = this.formCssCode
|
||
insertCustomCssToHead(this.formCssCode)
|
||
this.showEditFormCssDialogFlag = false
|
||
},
|
||
|
||
editGlobalFunctions() {
|
||
this.functionsCode = this.designer.formConfig.functions
|
||
this.showEditFunctionsDialogFlag = true
|
||
},
|
||
|
||
saveGlobalFunctions() {
|
||
this.designer.formConfig.functions = this.functionsCode
|
||
insertGlobalFunctionsToHtml(this.functionsCode)
|
||
this.showEditFunctionsDialogFlag = false
|
||
},
|
||
|
||
editEventHandler(eventName) {
|
||
this.curEventName = eventName
|
||
this.eventHandlerCode = this.selectedWidget.options[eventName] || ''
|
||
|
||
// 设置字段校验函数示例代码
|
||
if ((eventName === 'onValidate') && (!this.optionModel['onValidate'])) {
|
||
this.eventHandlerCode =
|
||
" /* sample code */\n /*\n if ((value > 100) || (value < 0)) {\n callback(new Error('error message')) //fail\n } else {\n callback(); //pass\n }\n */"
|
||
}
|
||
|
||
this.showWidgetEventDialogFlag = true
|
||
},
|
||
|
||
saveEventHandler() {
|
||
this.selectedWidget.options[this.curEventName] = this.eventHandlerCode
|
||
this.showWidgetEventDialogFlag = false
|
||
},
|
||
|
||
editFormEventHandler(eventName) {
|
||
this.curEventName = eventName
|
||
this.formEventHandlerCode = this.formConfig[eventName]
|
||
this.showFormEventDialogFlag = true
|
||
},
|
||
|
||
saveFormEventHandler() {
|
||
this.formConfig[this.curEventName] = this.formEventHandlerCode
|
||
this.showFormEventDialogFlag = false
|
||
},
|
||
updateFormView(){
|
||
console.log("Upload Form View");
|
||
let $this=this;
|
||
this.$nextTick(() => {
|
||
$this.$forceUpdate();
|
||
})
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.panel-container {
|
||
padding: 0 8px;
|
||
|
||
}
|
||
::v-deep .ivu-tabs-bar{
|
||
margin-bottom: 7px;
|
||
}
|
||
::v-deep .ivu-scroll-loader{
|
||
display:none;
|
||
}
|
||
|
||
.setting-scrollbar {
|
||
::v-deep .el-scrollbar__wrap {
|
||
overflow-x: hidden;
|
||
/* IE浏览器隐藏水平滚动条箭头!! */
|
||
}
|
||
}
|
||
|
||
.setting-collapse {
|
||
::v-deep .el-collapse-item__content {
|
||
padding-bottom: 6px;
|
||
}
|
||
|
||
::v-deep .el-collapse-item__header {
|
||
font-style: italic;
|
||
font-weight: bold;
|
||
}
|
||
}
|
||
|
||
.setting-form {
|
||
::v-deep .FormItem__label {
|
||
font-size: 13px;
|
||
//text-overflow: ellipsis;
|
||
overflow: hidden;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
::v-deep .FormItem--mini.FormItem {
|
||
margin-bottom: 6px;
|
||
}
|
||
|
||
.radio-group-custom {
|
||
::v-deep .Radio__inner {
|
||
padding-left: 12px;
|
||
padding-right: 12px;
|
||
}
|
||
}
|
||
|
||
/deep/ .ivu-form-item{
|
||
margin-bottom: 5px;
|
||
}
|
||
}
|
||
|
||
li.col-item {
|
||
list-style: none;
|
||
display: flex;
|
||
align-items: center;
|
||
|
||
span.col-span-title {
|
||
display: inline-block;
|
||
font-size: 13px;
|
||
width: 120px;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.col-delete-button {
|
||
margin-left: 6px;
|
||
padding-top:1px;
|
||
flex-shrink: 0;
|
||
}
|
||
}
|
||
.codeEditTip{
|
||
color:#909399;
|
||
background-color: #f4f4f5;
|
||
padding-left:20px;
|
||
line-height:30px;
|
||
font-size: 14px;
|
||
}
|
||
|
||
|
||
/* 隐藏Chrome浏览器中el-input数字输入框右侧的上下调整小箭头 */
|
||
::v-deep .hide-spin-button input::-webkit-outer-spin-button,
|
||
::v-deep .hide-spin-button input::-webkit-inner-spin-button {
|
||
-webkit-appearance: none !important;
|
||
}
|
||
|
||
/* 隐藏Firefox浏览器中el-input数字输入框右侧的上下调整小箭头 */
|
||
::v-deep .hide-spin-button input[type="number"] {
|
||
-moz-appearance: textfield;
|
||
}
|
||
|
||
.custom-divider.el-divider--horizontal {
|
||
margin: 10px 0;
|
||
}
|
||
|
||
.custom-divider-margin-top.el-divider--horizontal {
|
||
margin: 20px 0;
|
||
}
|
||
|
||
.small-padding-dialog {
|
||
::v-deep .el-dialog__body {
|
||
padding: 6px 15px 12px 15px;
|
||
}
|
||
}
|
||
|
||
.panes-setting {
|
||
ul {
|
||
padding-inline-start: 0;
|
||
padding-left: 0;
|
||
/* 重置IE11默认样式 */
|
||
margin: 0;
|
||
}
|
||
|
||
.drag-option {
|
||
cursor: move;
|
||
}
|
||
|
||
li.ghost {
|
||
background: #fff;
|
||
border: 2px dotted $--color-primary;
|
||
}
|
||
}
|
||
</style>
|