RightPanel.vue 40.9 KB
Newer Older
sunhongwei's avatar
sunhongwei committed
1 2 3
<template>
  <div class="right-board">
    <el-tabs v-model="currentTab" class="center-tabs">
Marcus's avatar
Marcus committed
4 5
      <el-tab-pane :label="$t('组件属性')" name="field" />
      <el-tab-pane :label="$t('表单属性')" name="form" />
sunhongwei's avatar
sunhongwei committed
6 7
    </el-tabs>
    <div class="field-box">
Marcus's avatar
Marcus committed
8
      <a class="document-link" target="_blank" :href="documentLink" :title="$t('查看组件文档')">
sunhongwei's avatar
sunhongwei committed
9 10 11 12 13
        <i class="el-icon-link" />
      </a>
      <el-scrollbar class="right-scrollbar">
        <!-- 组件属性 -->
        <el-form v-show="currentTab==='field' && showField" size="small" label-width="90px">
Marcus's avatar
Marcus committed
14
          <el-form-item v-if="activeData.__config__.changeTag" :label="$t('组件类型')">
sunhongwei's avatar
sunhongwei committed
15 16
            <el-select
              v-model="activeData.__config__.tagIcon"
Marcus's avatar
Marcus committed
17
              :placeholder="$t('请选择组件类型')"
sunhongwei's avatar
sunhongwei committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
              :style="{width: '100%'}"
              @change="tagChange"
            >
              <el-option-group v-for="group in tagList" :key="group.label" :label="group.label">
                <el-option
                  v-for="item in group.options"
                  :key="item.__config__.label"
                  :label="item.__config__.label"
                  :value="item.__config__.tagIcon"
                >
                  <svg-icon class="node-icon" :icon-class="item.__config__.tagIcon" />
                  <span> {{ item.__config__.label }}</span>
                </el-option>
              </el-option-group>
            </el-select>
          </el-form-item>
Marcus's avatar
Marcus committed
34
          <el-form-item v-if="activeData.__vModel__!==undefined" :label="$t('字段名')">
sunhongwei's avatar
sunhongwei committed
35 36
            <el-input v-model="activeData.__vModel__" placeholder="请输入字段名(v-model)" />
          </el-form-item>
Marcus's avatar
Marcus committed
37
          <el-form-item v-if="activeData.__config__.componentName!==undefined" :label="$t('组件名')">
sunhongwei's avatar
sunhongwei committed
38 39
            {{ activeData.__config__.componentName }}
          </el-form-item>
Marcus's avatar
Marcus committed
40 41
          <el-form-item v-if="activeData.__config__.label!==undefined" :label="$t('标题')">
            <el-input v-model="activeData.__config__.label" :placeholder="$t('请输入标题')" @input="changeRenderKey" />
sunhongwei's avatar
sunhongwei committed
42
          </el-form-item>
Marcus's avatar
Marcus committed
43 44
          <el-form-item v-if="activeData.placeholder!==undefined" :label="$t('占位提示')">
            <el-input v-model="activeData.placeholder" :placeholder="$t('请输入占位提示')" @input="changeRenderKey" />
sunhongwei's avatar
sunhongwei committed
45
          </el-form-item>
Marcus's avatar
Marcus committed
46 47
          <el-form-item v-if="activeData['start-placeholder']!==undefined" :label="$t('开始占位')">
            <el-input v-model="activeData['start-placeholder']" :placeholder="$t('请输入占位提示')" />
sunhongwei's avatar
sunhongwei committed
48
          </el-form-item>
Marcus's avatar
Marcus committed
49 50
          <el-form-item v-if="activeData['end-placeholder']!==undefined" :label="$t('结束占位')">
            <el-input v-model="activeData['end-placeholder']" :placeholder="$t('请输入占位提示')" />
sunhongwei's avatar
sunhongwei committed
51
          </el-form-item>
Marcus's avatar
Marcus committed
52
          <el-form-item v-if="activeData.__config__.span!==undefined" :label="$t('表单栅格')">
sunhongwei's avatar
sunhongwei committed
53 54
            <el-slider v-model="activeData.__config__.span" :max="24" :min="1" :marks="{12:''}" @change="spanChange" />
          </el-form-item>
Marcus's avatar
Marcus committed
55 56
          <el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.gutter!==undefined" :label="$t('栅格间隔')">
            <el-input-number v-model="activeData.gutter" :min="0" :placeholder="$t('栅格间隔')" />
sunhongwei's avatar
sunhongwei committed
57
          </el-form-item>
Marcus's avatar
Marcus committed
58
          <el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.type!==undefined" :label="$t('布局模式')">
sunhongwei's avatar
sunhongwei committed
59 60 61 62 63
            <el-radio-group v-model="activeData.type">
              <el-radio-button label="default" />
              <el-radio-button label="flex" />
            </el-radio-group>
          </el-form-item>
Marcus's avatar
Marcus committed
64 65
          <el-form-item v-if="activeData.justify!==undefined&&activeData.type==='flex'" :label="$t('水平排列')">
            <el-select v-model="activeData.justify" :placeholder="$t('请选择水平排列')" :style="{width: '100%'}">
sunhongwei's avatar
sunhongwei committed
66 67 68 69 70 71 72 73
              <el-option
                v-for="(item, index) in justifyOptions"
                :key="index"
                :label="item.label"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
Marcus's avatar
Marcus committed
74
          <el-form-item v-if="activeData.align!==undefined&&activeData.type==='flex'" :label="$t('垂直排列')">
sunhongwei's avatar
sunhongwei committed
75 76 77 78 79 80
            <el-radio-group v-model="activeData.align">
              <el-radio-button label="top" />
              <el-radio-button label="middle" />
              <el-radio-button label="bottom" />
            </el-radio-group>
          </el-form-item>
Marcus's avatar
Marcus committed
81 82
          <el-form-item v-if="activeData.__config__.labelWidth!==undefined" :label="$t('标签宽度')">
            <el-input v-model.number="activeData.__config__.labelWidth" type="number" :placeholder="$t('请输入标签宽度')" />
sunhongwei's avatar
sunhongwei committed
83
          </el-form-item>
Marcus's avatar
Marcus committed
84 85
          <el-form-item v-if="activeData.style&&activeData.style.width!==undefined" :label="$t('组件宽度')">
            <el-input v-model="activeData.style.width" :placeholder="$t('请输入组件宽度')" clearable />
sunhongwei's avatar
sunhongwei committed
86
          </el-form-item>
Marcus's avatar
Marcus committed
87
          <el-form-item v-if="activeData.__vModel__!==undefined" :label="$t('默认值')">
sunhongwei's avatar
sunhongwei committed
88 89
            <el-input
              :value="setDefaultValue(activeData.__config__.defaultValue)"
Marcus's avatar
Marcus committed
90
              :placeholder="$t('请输入默认值')"
sunhongwei's avatar
sunhongwei committed
91 92 93
              @input="onDefaultValueInput"
            />
          </el-form-item>
Marcus's avatar
Marcus committed
94
          <el-form-item v-if="activeData.__config__.tag==='el-checkbox-group'" :label="$t('至少应选')">
sunhongwei's avatar
sunhongwei committed
95 96 97
            <el-input-number
              :value="activeData.min"
              :min="0"
Marcus's avatar
Marcus committed
98
              :placeholder="$t('至少应选')"
sunhongwei's avatar
sunhongwei committed
99 100 101
              @input="$set(activeData, 'min', $event?$event:undefined)"
            />
          </el-form-item>
Marcus's avatar
Marcus committed
102
          <el-form-item v-if="activeData.__config__.tag==='el-checkbox-group'" :label="$t('最多可选')">
sunhongwei's avatar
sunhongwei committed
103 104 105
            <el-input-number
              :value="activeData.max"
              :min="0"
Marcus's avatar
Marcus committed
106
              :placeholder="$t('最多可选')"
sunhongwei's avatar
sunhongwei committed
107 108 109
              @input="$set(activeData, 'max', $event?$event:undefined)"
            />
          </el-form-item>
Marcus's avatar
Marcus committed
110 111
          <el-form-item v-if="activeData.__slot__&&activeData.__slot__.prepend!==undefined" :label="$t('前缀')">
            <el-input v-model="activeData.__slot__.prepend" :placeholder="$t('请输入前缀')" />
sunhongwei's avatar
sunhongwei committed
112
          </el-form-item>
Marcus's avatar
Marcus committed
113 114
          <el-form-item v-if="activeData.__slot__&&activeData.__slot__.append!==undefined" :label="$t('后缀')">
            <el-input v-model="activeData.__slot__.append" :placeholder="$t('请输入后缀')" />
sunhongwei's avatar
sunhongwei committed
115
          </el-form-item>
Marcus's avatar
Marcus committed
116 117 118
          <el-form-item v-if="activeData['prefix-icon']!==undefined" :label="$t('前图标')">
            <el-input v-model="activeData['prefix-icon']" :placeholder="$t('请输入前图标名称')">
              <el-button slot="append" icon="el-icon-thumb" @click="openIconsDialog('prefix-icon')">{{ $t('选择') }}</el-button>
sunhongwei's avatar
sunhongwei committed
119 120
            </el-input>
          </el-form-item>
Marcus's avatar
Marcus committed
121 122 123
          <el-form-item v-if="activeData['suffix-icon'] !== undefined" :label="$t('后图标')">
            <el-input v-model="activeData['suffix-icon']" :placeholder="$t('请输入后图标名称')">
              <el-button slot="append" icon="el-icon-thumb" @click="openIconsDialog('suffix-icon')">{{ $t('选择') }}</el-button>
sunhongwei's avatar
sunhongwei committed
124 125 126 127
            </el-input>
          </el-form-item>
          <el-form-item
            v-if="activeData['icon']!==undefined && activeData.__config__.tag === 'el-button'"
Marcus's avatar
Marcus committed
128
            :label="$t('按钮图标')"
sunhongwei's avatar
sunhongwei committed
129
          >
Marcus's avatar
Marcus committed
130 131
            <el-input v-model="activeData['icon']" :placeholder="$t('请输入按钮图标名称')">
              <el-button slot="append" icon="el-icon-thumb" @click="openIconsDialog('icon')">{{ $t('选择') }}</el-button>
sunhongwei's avatar
sunhongwei committed
132 133
            </el-input>
          </el-form-item>
Marcus's avatar
Marcus committed
134 135
          <el-form-item v-if="activeData.__config__.tag === 'el-cascader'" :label="$t('选项分隔符')">
            <el-input v-model="activeData.separator" :placeholder="$t('请输入选项分隔符')" />
sunhongwei's avatar
sunhongwei committed
136
          </el-form-item>
Marcus's avatar
Marcus committed
137 138
          <el-form-item v-if="activeData.autosize !== undefined" :label="$t('最小行数')">
            <el-input-number v-model="activeData.autosize.minRows" :min="1" :placeholder="$t('最小行数')" />
sunhongwei's avatar
sunhongwei committed
139
          </el-form-item>
Marcus's avatar
Marcus committed
140 141
          <el-form-item v-if="activeData.autosize !== undefined" :label="$t('最大行数')">
            <el-input-number v-model="activeData.autosize.maxRows" :min="1" :placeholder="$t('最大行数')" />
sunhongwei's avatar
sunhongwei committed
142
          </el-form-item>
Marcus's avatar
Marcus committed
143 144
          <el-form-item v-if="isShowMin" :label="$t('最小值')">
            <el-input-number v-model="activeData.min" :placeholder="$t('最小值')" />
sunhongwei's avatar
sunhongwei committed
145
          </el-form-item>
Marcus's avatar
Marcus committed
146 147
          <el-form-item v-if="isShowMax" :label="$t('最大值')">
            <el-input-number v-model="activeData.max" :placeholder="$t('最大值')" />
sunhongwei's avatar
sunhongwei committed
148
          </el-form-item>
Marcus's avatar
Marcus committed
149 150
          <el-form-item v-if="activeData.height!==undefined" :label="$t('组件高度')">
            <el-input-number v-model="activeData.height" :placeholder="$t('高度')" @input="changeRenderKey" />
sunhongwei's avatar
sunhongwei committed
151
          </el-form-item>
Marcus's avatar
Marcus committed
152 153
          <el-form-item v-if="isShowStep" :label="$t('步长')">
            <el-input-number v-model="activeData.step" :placeholder="$t('步数')" />
sunhongwei's avatar
sunhongwei committed
154
          </el-form-item>
Marcus's avatar
Marcus committed
155 156
          <el-form-item v-if="activeData.__config__.tag === 'el-input-number'" :label="$t('精度')">
            <el-input-number v-model="activeData.precision" :min="0" :placeholder="$t('精度')" />
sunhongwei's avatar
sunhongwei committed
157
          </el-form-item>
Marcus's avatar
Marcus committed
158
          <el-form-item v-if="activeData.__config__.tag === 'el-input-number'" :label="$t('按钮位置')">
sunhongwei's avatar
sunhongwei committed
159
            <el-radio-group v-model="activeData['controls-position']">
Marcus's avatar
Marcus committed
160 161
              <el-radio-button label="">{{ $t('默认') }}</el-radio-button>
              <el-radio-button label="right">{{ $t('右侧') }}</el-radio-button>
sunhongwei's avatar
sunhongwei committed
162 163
            </el-radio-group>
          </el-form-item>
Marcus's avatar
Marcus committed
164 165 166
          <el-form-item v-if="activeData.maxlength !== undefined" :label="$t('最多输入')">
            <el-input v-model="activeData.maxlength" :placeholder="$t('请输入字符长度')">
              <template slot="append">{{ $t('个字符') }}</template>
sunhongwei's avatar
sunhongwei committed
167 168
            </el-input>
          </el-form-item>
Marcus's avatar
Marcus committed
169 170
          <el-form-item v-if="activeData['active-text'] !== undefined" :label="$t('开启提示')">
            <el-input v-model="activeData['active-text']" :placeholder="$t('请输入开启提示')" />
sunhongwei's avatar
sunhongwei committed
171
          </el-form-item>
Marcus's avatar
Marcus committed
172 173
          <el-form-item v-if="activeData['inactive-text'] !== undefined" :label="$t('关闭提示')">
            <el-input v-model="activeData['inactive-text']" :placeholder="$t('请输入关闭提示')" />
sunhongwei's avatar
sunhongwei committed
174
          </el-form-item>
Marcus's avatar
Marcus committed
175
          <el-form-item v-if="activeData['active-value'] !== undefined" :label="$t('开启值')">
sunhongwei's avatar
sunhongwei committed
176 177
            <el-input
              :value="setDefaultValue(activeData['active-value'])"
Marcus's avatar
Marcus committed
178
              :placeholder="$t('请输入开启值')"
sunhongwei's avatar
sunhongwei committed
179 180 181
              @input="onSwitchValueInput($event, 'active-value')"
            />
          </el-form-item>
Marcus's avatar
Marcus committed
182
          <el-form-item v-if="activeData['inactive-value'] !== undefined" :label="$t('关闭值')">
sunhongwei's avatar
sunhongwei committed
183 184
            <el-input
              :value="setDefaultValue(activeData['inactive-value'])"
Marcus's avatar
Marcus committed
185
              :placeholder="$t('请输入关闭值')"
sunhongwei's avatar
sunhongwei committed
186 187 188 189 190
              @input="onSwitchValueInput($event, 'inactive-value')"
            />
          </el-form-item>
          <el-form-item
            v-if="activeData.type !== undefined && 'el-date-picker' === activeData.__config__.tag"
Marcus's avatar
Marcus committed
191
            :label="$t('时间类型')"
sunhongwei's avatar
sunhongwei committed
192 193 194
          >
            <el-select
              v-model="activeData.type"
Marcus's avatar
Marcus committed
195
              :placeholder="$t('请选择时间类型')"
sunhongwei's avatar
sunhongwei committed
196 197 198 199 200 201 202 203 204 205 206
              :style="{ width: '100%' }"
              @change="dateTypeChange"
            >
              <el-option
                v-for="(item, index) in dateOptions"
                :key="index"
                :label="item.label"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
Marcus's avatar
Marcus committed
207 208
          <el-form-item v-if="activeData.name !== undefined" :label="$t('文件字段名')">
            <el-input v-model="activeData.name" :placeholder="$t('请输入上传文件字段名')" />
sunhongwei's avatar
sunhongwei committed
209
          </el-form-item>
Marcus's avatar
Marcus committed
210
          <el-form-item v-if="activeData.accept !== undefined" :label="$t('文件类型')">
sunhongwei's avatar
sunhongwei committed
211 212
            <el-select
              v-model="activeData.accept"
Marcus's avatar
Marcus committed
213
              :placeholder="$t('请选择文件类型')"
sunhongwei's avatar
sunhongwei committed
214 215 216
              :style="{ width: '100%' }"
              clearable
            >
Marcus's avatar
Marcus committed
217 218 219
              <el-option :label="$t('图片')" value="image/*" />
              <el-option :label="$t('视频')" value="video/*" />
              <el-option :label="$t('音频')" value="audio/*" />
sunhongwei's avatar
sunhongwei committed
220 221 222 223 224 225
              <el-option label="excel" value=".xls,.xlsx" />
              <el-option label="word" value=".doc,.docx" />
              <el-option label="pdf" value=".pdf" />
              <el-option label="txt" value=".txt" />
            </el-select>
          </el-form-item>
Marcus's avatar
Marcus committed
226 227
          <el-form-item v-if="activeData.__config__.fileSize !== undefined" :label="$t('文件大小')">
            <el-input v-model.number="activeData.__config__.fileSize" :placeholder="$t('请输入文件大小')">
sunhongwei's avatar
sunhongwei committed
228 229 230 231 232 233 234
              <el-select slot="append" v-model="activeData.__config__.sizeUnit" :style="{ width: '66px' }">
                <el-option label="KB" value="KB" />
                <el-option label="MB" value="MB" />
                <el-option label="GB" value="GB" />
              </el-select>
            </el-input>
          </el-form-item>
Marcus's avatar
Marcus committed
235 236
          <el-form-item v-if="activeData.action !== undefined" :label="$t('上传地址')">
            <el-input v-model="activeData.action" :placeholder="$t('请输入上传地址')" clearable />
sunhongwei's avatar
sunhongwei committed
237
          </el-form-item>
Marcus's avatar
Marcus committed
238
          <el-form-item v-if="activeData['list-type'] !== undefined" :label="$t('列表类型')">
sunhongwei's avatar
sunhongwei committed
239 240 241 242 243 244 245 246 247 248 249 250 251 252
            <el-radio-group v-model="activeData['list-type']" size="small">
              <el-radio-button label="text">
                text
              </el-radio-button>
              <el-radio-button label="picture">
                picture
              </el-radio-button>
              <el-radio-button label="picture-card">
                picture-card
              </el-radio-button>
            </el-radio-group>
          </el-form-item>
          <el-form-item
            v-if="activeData.type !== undefined && activeData.__config__.tag === 'el-button'"
Marcus's avatar
Marcus committed
253
            :label="$t('按钮类型')"
sunhongwei's avatar
sunhongwei committed
254 255 256 257 258 259 260 261 262 263 264 265 266
          >
            <el-select v-model="activeData.type" :style="{ width: '100%' }">
              <el-option label="primary" value="primary" />
              <el-option label="success" value="success" />
              <el-option label="warning" value="warning" />
              <el-option label="danger" value="danger" />
              <el-option label="info" value="info" />
              <el-option label="text" value="text" />
            </el-select>
          </el-form-item>
          <el-form-item
            v-if="activeData.__config__.buttonText !== undefined"
            v-show="'picture-card' !== activeData['list-type']"
Marcus's avatar
Marcus committed
267
            :label="$t('按钮文字')"
sunhongwei's avatar
sunhongwei committed
268
          >
Marcus's avatar
Marcus committed
269
            <el-input v-model="activeData.__config__.buttonText" :placeholder="$t('请输入按钮文字')" />
sunhongwei's avatar
sunhongwei committed
270 271 272
          </el-form-item>
          <el-form-item
            v-if="activeData.__config__.tag === 'el-button'"
Marcus's avatar
Marcus committed
273
            :label="$t('按钮文字')"
sunhongwei's avatar
sunhongwei committed
274
          >
Marcus's avatar
Marcus committed
275
            <el-input v-model="activeData.__slot__.default" :placeholder="$t('请输入按钮文字')" />
sunhongwei's avatar
sunhongwei committed
276
          </el-form-item>
Marcus's avatar
Marcus committed
277 278
          <el-form-item v-if="activeData['range-separator'] !== undefined" :label="$t('分隔符')">
            <el-input v-model="activeData['range-separator']" :placeholder="$t('请输入分隔符')" />
sunhongwei's avatar
sunhongwei committed
279
          </el-form-item>
Marcus's avatar
Marcus committed
280
          <el-form-item v-if="activeData['picker-options'] !== undefined" :label="$t('时间段')">
sunhongwei's avatar
sunhongwei committed
281 282
            <el-input
              v-model="activeData['picker-options'].selectableRange"
Marcus's avatar
Marcus committed
283
              :placeholder="$t('请输入时间段')"
sunhongwei's avatar
sunhongwei committed
284 285
            />
          </el-form-item>
Marcus's avatar
Marcus committed
286
          <el-form-item v-if="activeData.format !== undefined" :label="$t('时间格式')">
sunhongwei's avatar
sunhongwei committed
287 288
            <el-input
              :value="activeData.format"
Marcus's avatar
Marcus committed
289
              :placeholder="$t('请输入时间格式')"
sunhongwei's avatar
sunhongwei committed
290 291 292 293
              @input="setTimeValue($event)"
            />
          </el-form-item>
          <template v-if="['el-checkbox-group', 'el-radio-group', 'el-select'].indexOf(activeData.__config__.tag) > -1">
Marcus's avatar
Marcus committed
294
            <el-divider>{{ $t('选项') }}</el-divider>
sunhongwei's avatar
sunhongwei committed
295 296 297 298 299 300 301 302 303 304
            <draggable
              :list="activeData.__slot__.options"
              :animation="340"
              group="selectItem"
              handle=".option-drag"
            >
              <div v-for="(item, index) in activeData.__slot__.options" :key="index" class="select-item">
                <div class="select-line-icon option-drag">
                  <i class="el-icon-s-operation" />
                </div>
Marcus's avatar
Marcus committed
305
                <el-input v-model="item.label" :placeholder="$t('选项名')" size="small" />
sunhongwei's avatar
sunhongwei committed
306
                <el-input
Marcus's avatar
Marcus committed
307
                  :placeholder="$t('选项值')"
sunhongwei's avatar
sunhongwei committed
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
                  size="small"
                  :value="item.value"
                  @input="setOptionValue(item, $event)"
                />
                <div class="close-btn select-line-icon" @click="activeData.__slot__.options.splice(index, 1)">
                  <i class="el-icon-remove-outline" />
                </div>
              </div>
            </draggable>
            <div style="margin-left: 20px;">
              <el-button
                style="padding-bottom: 0"
                icon="el-icon-circle-plus-outline"
                type="text"
                @click="addSelectItem"
Marcus's avatar
Marcus committed
323
              >{{ $t('添加选项') }}</el-button>
sunhongwei's avatar
sunhongwei committed
324 325 326 327 328
            </div>
            <el-divider />
          </template>

          <template v-if="['el-cascader', 'el-table'].includes(activeData.__config__.tag)">
Marcus's avatar
Marcus committed
329 330
            <el-divider>{{ $t('选项') }}</el-divider>
            <el-form-item v-if="activeData.__config__.dataType" :label="$t('数据类型')">
sunhongwei's avatar
sunhongwei committed
331
              <el-radio-group v-model="activeData.__config__.dataType" size="small">
Marcus's avatar
Marcus committed
332 333
                <el-radio-button label="dynamic">{{ $t('动态数据') }}</el-radio-button>
                <el-radio-button label="static">{{ $t('静态数据') }}</el-radio-button>
sunhongwei's avatar
sunhongwei committed
334 335 336 337
              </el-radio-group>
            </el-form-item>

            <template v-if="activeData.__config__.dataType === 'dynamic'">
Marcus's avatar
Marcus committed
338
              <el-form-item :label="$t('接口地址')">
sunhongwei's avatar
sunhongwei committed
339 340 341
                <el-input
                  v-model="activeData.__config__.url"
                  :title="activeData.__config__.url"
Marcus's avatar
Marcus committed
342
                  :placeholder="$t('请输入接口地址')"
sunhongwei's avatar
sunhongwei committed
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
                  clearable
                  @blur="$emit('fetch-data', activeData)"
                >
                  <el-select
                    slot="prepend"
                    v-model="activeData.__config__.method"
                    :style="{width: '85px'}"
                    @change="$emit('fetch-data', activeData)"
                  >
                    <el-option label="get" value="get" />
                    <el-option label="post" value="post" />
                    <el-option label="put" value="put" />
                    <el-option label="delete" value="delete" />
                  </el-select>
                </el-input>
              </el-form-item>
Marcus's avatar
Marcus committed
359
              <el-form-item :label="$t('数据位置')">
sunhongwei's avatar
sunhongwei committed
360 361
                <el-input
                  v-model="activeData.__config__.dataPath"
Marcus's avatar
Marcus committed
362
                  :placeholder="$t('请输入数据位置')"
sunhongwei's avatar
sunhongwei committed
363 364 365 366 367
                  @blur="$emit('fetch-data', activeData)"
                />
              </el-form-item>

              <template v-if="activeData.props && activeData.props.props">
Marcus's avatar
Marcus committed
368 369
                <el-form-item :label="$t('标签键名')">
                  <el-input v-model="activeData.props.props.label" :placeholder="$t('请输入标签键名')" />
sunhongwei's avatar
sunhongwei committed
370
                </el-form-item>
Marcus's avatar
Marcus committed
371 372
                <el-form-item :label="$t('值键名')">
                  <el-input v-model="activeData.props.props.value" :placeholder="$t('请输入值键名')" />
sunhongwei's avatar
sunhongwei committed
373
                </el-form-item>
Marcus's avatar
Marcus committed
374 375
                <el-form-item :label="$t('子级键名')">
                  <el-input v-model="activeData.props.props.children" :placeholder="$t('请输入子级键名')" />
sunhongwei's avatar
sunhongwei committed
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
                </el-form-item>
              </template>
            </template>

            <!-- 级联选择静态树 -->
            <el-tree
              v-if="activeData.__config__.dataType === 'static'"
              draggable
              :data="activeData.options"
              node-key="id"
              :expand-on-click-node="false"
              :render-content="renderContent"
            />
            <div v-if="activeData.__config__.dataType === 'static'" style="margin-left: 20px">
              <el-button
                style="padding-bottom: 0"
                icon="el-icon-circle-plus-outline"
                type="text"
                @click="addTreeItem"
Marcus's avatar
Marcus committed
395
              >{{ $t('添加父级') }}</el-button>
sunhongwei's avatar
sunhongwei committed
396 397 398 399
            </div>
            <el-divider />
          </template>

Marcus's avatar
Marcus committed
400
          <el-form-item v-if="activeData.__config__.optionType !== undefined" :label="$t('选项样式')">
sunhongwei's avatar
sunhongwei committed
401
            <el-radio-group v-model="activeData.__config__.optionType">
Marcus's avatar
Marcus committed
402 403
              <el-radio-button label="default">{{ $t('默认') }}</el-radio-button>
              <el-radio-button label="button">{{ $t('按钮') }}</el-radio-button>
sunhongwei's avatar
sunhongwei committed
404 405
            </el-radio-group>
          </el-form-item>
Marcus's avatar
Marcus committed
406
          <el-form-item v-if="activeData['active-color'] !== undefined" :label="$t('开启颜色')">
sunhongwei's avatar
sunhongwei committed
407 408
            <el-color-picker v-model="activeData['active-color']" />
          </el-form-item>
Marcus's avatar
Marcus committed
409
          <el-form-item v-if="activeData['inactive-color'] !== undefined" :label="$t('关闭颜色')">
sunhongwei's avatar
sunhongwei committed
410 411 412 413
            <el-color-picker v-model="activeData['inactive-color']" />
          </el-form-item>

          <el-form-item v-if="activeData.__config__.showLabel !== undefined
Marcus's avatar
Marcus committed
414
            && activeData.__config__.labelWidth !== undefined" :label="$t('显示标签')"
sunhongwei's avatar
sunhongwei committed
415 416 417
          >
            <el-switch v-model="activeData.__config__.showLabel" />
          </el-form-item>
Marcus's avatar
Marcus committed
418
          <el-form-item v-if="activeData.branding !== undefined" :label="$t('品牌烙印')">
sunhongwei's avatar
sunhongwei committed
419 420
            <el-switch v-model="activeData.branding" @input="changeRenderKey" />
          </el-form-item>
Marcus's avatar
Marcus committed
421
          <el-form-item v-if="activeData['allow-half'] !== undefined" :label="$t('允许半选')">
sunhongwei's avatar
sunhongwei committed
422 423
            <el-switch v-model="activeData['allow-half']" />
          </el-form-item>
Marcus's avatar
Marcus committed
424
          <el-form-item v-if="activeData['show-text'] !== undefined" :label="$t('辅助文字')">
sunhongwei's avatar
sunhongwei committed
425 426
            <el-switch v-model="activeData['show-text']" @change="rateTextChange" />
          </el-form-item>
Marcus's avatar
Marcus committed
427
          <el-form-item v-if="activeData['show-score'] !== undefined" :label="$t('显示分数')">
sunhongwei's avatar
sunhongwei committed
428 429
            <el-switch v-model="activeData['show-score']" @change="rateScoreChange" />
          </el-form-item>
Marcus's avatar
Marcus committed
430
          <el-form-item v-if="activeData['show-stops'] !== undefined" :label="$t('显示间断点')">
sunhongwei's avatar
sunhongwei committed
431 432
            <el-switch v-model="activeData['show-stops']" />
          </el-form-item>
Marcus's avatar
Marcus committed
433
          <el-form-item v-if="activeData.range !== undefined" :label="$t('范围选择')">
sunhongwei's avatar
sunhongwei committed
434 435 436 437
            <el-switch v-model="activeData.range" @change="rangeChange" />
          </el-form-item>
          <el-form-item
            v-if="activeData.__config__.border !== undefined && activeData.__config__.optionType === 'default'"
Marcus's avatar
Marcus committed
438
            :label="$t('是否带边框')"
sunhongwei's avatar
sunhongwei committed
439 440 441
          >
            <el-switch v-model="activeData.__config__.border" />
          </el-form-item>
Marcus's avatar
Marcus committed
442
          <el-form-item v-if="activeData.__config__.tag === 'el-color-picker'" :label="$t('颜色格式')">
sunhongwei's avatar
sunhongwei committed
443 444
            <el-select
              v-model="activeData['color-format']"
Marcus's avatar
Marcus committed
445
              :placeholder="$t('请选择颜色格式')"
sunhongwei's avatar
sunhongwei committed
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
              :style="{ width: '100%' }"
              clearable
              @change="colorFormatChange"
            >
              <el-option
                v-for="(item, index) in colorFormatOptions"
                :key="index"
                :label="item.label"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
          <el-form-item
            v-if="activeData.size !== undefined &&
              (activeData.__config__.optionType === 'button' ||
                activeData.__config__.border ||
                activeData.__config__.tag === 'el-color-picker' ||
                activeData.__config__.tag === 'el-button')"
Marcus's avatar
Marcus committed
464
            :label="$t('组件尺寸')"
sunhongwei's avatar
sunhongwei committed
465 466
          >
            <el-radio-group v-model="activeData.size">
Marcus's avatar
Marcus committed
467 468 469
              <el-radio-button label="medium">{{ $t('中等') }}</el-radio-button>
              <el-radio-button label="small">{{ $t('较小') }}</el-radio-button>
              <el-radio-button label="mini">{{ $t('迷你') }}</el-radio-button>
sunhongwei's avatar
sunhongwei committed
470 471
            </el-radio-group>
          </el-form-item>
Marcus's avatar
Marcus committed
472
          <el-form-item v-if="activeData['show-word-limit'] !== undefined" :label="$t('输入统计')">
sunhongwei's avatar
sunhongwei committed
473 474
            <el-switch v-model="activeData['show-word-limit']" />
          </el-form-item>
Marcus's avatar
Marcus committed
475
          <el-form-item v-if="activeData.__config__.tag === 'el-input-number'" :label="$t('严格步数')">
sunhongwei's avatar
sunhongwei committed
476 477
            <el-switch v-model="activeData['step-strictly']" />
          </el-form-item>
Marcus's avatar
Marcus committed
478
          <el-form-item v-if="activeData.__config__.tag === 'el-cascader'" :label="$t('任选层级')">
sunhongwei's avatar
sunhongwei committed
479 480
            <el-switch v-model="activeData.props.props.checkStrictly" />
          </el-form-item>
Marcus's avatar
Marcus committed
481
          <el-form-item v-if="activeData.__config__.tag === 'el-cascader'" :label="$t('是否多选')">
sunhongwei's avatar
sunhongwei committed
482 483
            <el-switch v-model="activeData.props.props.multiple" />
          </el-form-item>
Marcus's avatar
Marcus committed
484
          <el-form-item v-if="activeData.__config__.tag === 'el-cascader'" :label="$t('展示全路径')">
sunhongwei's avatar
sunhongwei committed
485 486
            <el-switch v-model="activeData['show-all-levels']" />
          </el-form-item>
Marcus's avatar
Marcus committed
487
          <el-form-item v-if="activeData.__config__.tag === 'el-cascader'" :label="$t('可否筛选')">
sunhongwei's avatar
sunhongwei committed
488 489
            <el-switch v-model="activeData.filterable" />
          </el-form-item>
Marcus's avatar
Marcus committed
490
          <el-form-item v-if="activeData.clearable !== undefined" :label="$t('能否清空')">
sunhongwei's avatar
sunhongwei committed
491 492
            <el-switch v-model="activeData.clearable" />
          </el-form-item>
Marcus's avatar
Marcus committed
493
          <el-form-item v-if="activeData.__config__.showTip !== undefined" :label="$t('显示提示')">
sunhongwei's avatar
sunhongwei committed
494 495
            <el-switch v-model="activeData.__config__.showTip" />
          </el-form-item>
Marcus's avatar
Marcus committed
496
          <el-form-item v-if="activeData.__config__.tag === 'el-upload'" :label="$t('多选文件')">
sunhongwei's avatar
sunhongwei committed
497 498
            <el-switch v-model="activeData.multiple" />
          </el-form-item>
Marcus's avatar
Marcus committed
499
          <el-form-item v-if="activeData['auto-upload'] !== undefined" :label="$t('自动上传')">
sunhongwei's avatar
sunhongwei committed
500 501
            <el-switch v-model="activeData['auto-upload']" />
          </el-form-item>
Marcus's avatar
Marcus committed
502
          <el-form-item v-if="activeData.readonly !== undefined" :label="$t('是否只读')">
sunhongwei's avatar
sunhongwei committed
503 504
            <el-switch v-model="activeData.readonly" />
          </el-form-item>
Marcus's avatar
Marcus committed
505
          <el-form-item v-if="activeData.disabled !== undefined" :label="$t('是否禁用')">
sunhongwei's avatar
sunhongwei committed
506 507
            <el-switch v-model="activeData.disabled" />
          </el-form-item>
Marcus's avatar
Marcus committed
508
          <el-form-item v-if="activeData.__config__.tag === 'el-select'" :label="$t('能否搜索')">
sunhongwei's avatar
sunhongwei committed
509 510
            <el-switch v-model="activeData.filterable" />
          </el-form-item>
Marcus's avatar
Marcus committed
511
          <el-form-item v-if="activeData.__config__.tag === 'el-select'" :label="$t('是否多选')">
sunhongwei's avatar
sunhongwei committed
512 513
            <el-switch v-model="activeData.multiple" @change="multipleChange" />
          </el-form-item>
Marcus's avatar
Marcus committed
514
          <el-form-item v-if="activeData.__config__.required !== undefined" :label="$t('是否必填')">
sunhongwei's avatar
sunhongwei committed
515 516 517 518
            <el-switch v-model="activeData.__config__.required" />
          </el-form-item>

          <template v-if="activeData.__config__.layoutTree">
Marcus's avatar
Marcus committed
519
            <el-divider>{{ $t('布局结构树') }}</el-divider>
sunhongwei's avatar
sunhongwei committed
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
            <el-tree
              :data="[activeData.__config__]"
              :props="layoutTreeProps"
              node-key="renderKey"
              default-expand-all
              draggable
            >
              <span slot-scope="{ node, data }">
                <span class="node-label">
                  <svg-icon class="node-icon" :icon-class="data.__config__?data.__config__.tagIcon:data.tagIcon" />
                  {{ node.label }}
                </span>
              </span>
            </el-tree>
          </template>

          <template v-if="Array.isArray(activeData.__config__.regList)">
Marcus's avatar
Marcus committed
537
            <el-divider>{{ $t('正则校验') }}</el-divider>
sunhongwei's avatar
sunhongwei committed
538 539 540 541 542 543 544 545
            <div
              v-for="(item, index) in activeData.__config__.regList"
              :key="index"
              class="reg-item"
            >
              <span class="close-btn" @click="activeData.__config__.regList.splice(index, 1)">
                <i class="el-icon-close" />
              </span>
Marcus's avatar
Marcus committed
546 547
              <el-form-item :label="$t('表达式')">
                <el-input v-model="item.pattern" :placeholder="$t('请输入正则')" />
sunhongwei's avatar
sunhongwei committed
548
              </el-form-item>
Marcus's avatar
Marcus committed
549 550
              <el-form-item :label="$t('错误提示')" style="margin-bottom:0">
                <el-input v-model="item.message" :placeholder="$t('请输入错误提示')" />
sunhongwei's avatar
sunhongwei committed
551 552 553
              </el-form-item>
            </div>
            <div style="margin-left: 20px">
Marcus's avatar
Marcus committed
554
              <el-button icon="el-icon-circle-plus-outline" type="text" @click="addReg">{{ $t('添加规则') }}</el-button>
sunhongwei's avatar
sunhongwei committed
555 556 557 558 559
            </div>
          </template>
        </el-form>
        <!-- 表单属性 -->
        <el-form v-show="currentTab === 'form'" size="small" label-width="90px">
Marcus's avatar
Marcus committed
560
          <el-form-item :label="$t('表单名')">
sunhongwei's avatar
sunhongwei committed
561 562
            <el-input v-model="formConf.formRef" placeholder="请输入表单名(ref)" />
          </el-form-item>
Marcus's avatar
Marcus committed
563 564
          <el-form-item :label="$t('表单模型')">
            <el-input v-model="formConf.formModel" :placeholder="$t('请输入数据模型')" />
sunhongwei's avatar
sunhongwei committed
565
          </el-form-item>
Marcus's avatar
Marcus committed
566 567
          <el-form-item :label="$t('校验模型')">
            <el-input v-model="formConf.formRules" :placeholder="$t('请输入校验模型')" />
sunhongwei's avatar
sunhongwei committed
568
          </el-form-item>
Marcus's avatar
Marcus committed
569
          <el-form-item :label="$t('表单尺寸')">
sunhongwei's avatar
sunhongwei committed
570
            <el-radio-group v-model="formConf.size">
Marcus's avatar
Marcus committed
571 572 573
              <el-radio-button label="medium">{{ $t('中等') }}</el-radio-button>
              <el-radio-button label="small">{{ $t('较小') }}</el-radio-button>
              <el-radio-button label="mini">{{ $t('迷你') }}</el-radio-button>
sunhongwei's avatar
sunhongwei committed
574 575
            </el-radio-group>
          </el-form-item>
Marcus's avatar
Marcus committed
576
          <el-form-item :label="$t('标签对齐')">
sunhongwei's avatar
sunhongwei committed
577
            <el-radio-group v-model="formConf.labelPosition">
Marcus's avatar
Marcus committed
578 579 580
              <el-radio-button label="left">{{ $t('左对齐') }}</el-radio-button>
              <el-radio-button label="right">{{ $t('右对齐') }}</el-radio-button>
              <el-radio-button label="top">{{ $t('顶部对齐') }}</el-radio-button>
sunhongwei's avatar
sunhongwei committed
581 582
            </el-radio-group>
          </el-form-item>
Marcus's avatar
Marcus committed
583 584
          <el-form-item :label="$t('标签宽度')">
            <el-input v-model.number="formConf.labelWidth" type="number" :placeholder="$t('请输入标签宽度')" />
sunhongwei's avatar
sunhongwei committed
585
          </el-form-item>
Marcus's avatar
Marcus committed
586 587
          <el-form-item :label="$t('栅格间隔')">
            <el-input-number v-model="formConf.gutter" :min="0" :placeholder="$t('栅格间隔')" />
sunhongwei's avatar
sunhongwei committed
588
          </el-form-item>
Marcus's avatar
Marcus committed
589
          <el-form-item :label="$t('禁用表单')">
sunhongwei's avatar
sunhongwei committed
590 591
            <el-switch v-model="formConf.disabled" />
          </el-form-item>
Marcus's avatar
Marcus committed
592
          <el-form-item :label="$t('表单按钮')">
sunhongwei's avatar
sunhongwei committed
593 594
            <el-switch v-model="formConf.formBtns" />
          </el-form-item>
Marcus's avatar
Marcus committed
595
          <el-form-item :label="$t('显示未选中组件边框')">
sunhongwei's avatar
sunhongwei committed
596 597 598 599 600 601
            <el-switch v-model="formConf.unFocusedComponentBorder" />
          </el-form-item>
        </el-form>
      </el-scrollbar>
    </div>

Marcus's avatar
Marcus committed
602
    <treeNode-dialog :visible.sync="dialogVisible" :title="$t('添加选项')" @commit="addNode" />
sunhongwei's avatar
sunhongwei committed
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
    <icons-dialog :visible.sync="iconsVisible" :current="activeData[currentIconModel]" @select="setIcon" />
  </div>
</template>

<script>
import { isArray } from 'util'
import TreeNodeDialog from './TreeNodeDialog'
import { isNumberStr } from '@/utils/index'
import IconsDialog from './IconsDialog'
import {
  inputComponents, selectComponents, layoutComponents
} from '@/components/generator/config'
import { saveFormConf } from '@/utils/db'

const dateTimeFormat = {
  date: 'yyyy-MM-dd',
  week: 'yyyy 第 WW 周',
  month: 'yyyy-MM',
  year: 'yyyy',
  datetime: 'yyyy-MM-dd HH:mm:ss',
  daterange: 'yyyy-MM-dd',
  monthrange: 'yyyy-MM',
  datetimerange: 'yyyy-MM-dd HH:mm:ss'
}

// 使changeRenderKey在目标组件改变时可用
const needRerenderList = ['tinymce']

export default {
  components: {
    TreeNodeDialog,
    IconsDialog
  },
  props: ['showField', 'activeData', 'formConf'],
  data() {
    return {
      currentTab: 'field',
      currentNode: null,
      dialogVisible: false,
      iconsVisible: false,
      currentIconModel: null,
      dateTypeOptions: [
        {
          label: '日(date)',
          value: 'date'
        },
        {
          label: '周(week)',
          value: 'week'
        },
        {
          label: '月(month)',
          value: 'month'
        },
        {
          label: '年(year)',
          value: 'year'
        },
        {
          label: '日期时间(datetime)',
          value: 'datetime'
        }
      ],
      dateRangeTypeOptions: [
        {
          label: '日期范围(daterange)',
          value: 'daterange'
        },
        {
          label: '月范围(monthrange)',
          value: 'monthrange'
        },
        {
          label: '日期时间范围(datetimerange)',
          value: 'datetimerange'
        }
      ],
      colorFormatOptions: [
        {
          label: 'hex',
          value: 'hex'
        },
        {
          label: 'rgb',
          value: 'rgb'
        },
        {
          label: 'rgba',
          value: 'rgba'
        },
        {
          label: 'hsv',
          value: 'hsv'
        },
        {
          label: 'hsl',
          value: 'hsl'
        }
      ],
      justifyOptions: [
        {
          label: 'start',
          value: 'start'
        },
        {
          label: 'end',
          value: 'end'
        },
        {
          label: 'center',
          value: 'center'
        },
        {
          label: 'space-around',
          value: 'space-around'
        },
        {
          label: 'space-between',
          value: 'space-between'
        }
      ],
      layoutTreeProps: {
        label(data, node) {
          const config = data.__config__
          return data.componentName || `${config.label}: ${data.__vModel__}`
        }
      }
    }
  },
  computed: {
    documentLink() {
      return (
        this.activeData.__config__.document
        || 'https://element.eleme.cn/#/zh-CN/component/installation'
      )
    },
    dateOptions() {
      if (
        this.activeData.type !== undefined
        && this.activeData.__config__.tag === 'el-date-picker'
      ) {
        if (this.activeData['start-placeholder'] === undefined) {
          return this.dateTypeOptions
        }
        return this.dateRangeTypeOptions
      }
      return []
    },
    tagList() {
      return [
        {
Marcus's avatar
Marcus committed
754
          label: this.$t('输入型组件'),
sunhongwei's avatar
sunhongwei committed
755 756 757
          options: inputComponents
        },
        {
Marcus's avatar
Marcus committed
758
          label: this.$t('选择型组件'),
sunhongwei's avatar
sunhongwei committed
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
          options: selectComponents
        }
      ]
    },
    activeTag() {
      return this.activeData.__config__.tag
    },
    isShowMin() {
      return ['el-input-number', 'el-slider'].indexOf(this.activeTag) > -1
    },
    isShowMax() {
      return ['el-input-number', 'el-slider', 'el-rate'].indexOf(this.activeTag) > -1
    },
    isShowStep() {
      return ['el-input-number', 'el-slider'].indexOf(this.activeTag) > -1
    }
  },
  watch: {
    formConf: {
      handler(val) {
        saveFormConf(val)
      },
      deep: true
    }
  },
  methods: {
    addReg() {
      this.activeData.__config__.regList.push({
        pattern: '',
        message: ''
      })
    },
    addSelectItem() {
      this.activeData.__slot__.options.push({
        label: '',
        value: ''
      })
    },
    addTreeItem() {
      ++this.idGlobal
      this.dialogVisible = true
      this.currentNode = this.activeData.options
    },
    renderContent(h, { node, data, store }) {
      return (
        <div class="custom-tree-node">
          <span>{node.label}</span>
          <span class="node-operation">
            <i on-click={() => this.append(data)}
              class="el-icon-plus"
              title="添加"
            ></i>
            <i on-click={() => this.remove(node, data)}
              class="el-icon-delete"
              title="删除"
            ></i>
          </span>
        </div>
      )
    },
    append(data) {
      if (!data.children) {
        this.$set(data, 'children', [])
      }
      this.dialogVisible = true
      this.currentNode = data.children
    },
    remove(node, data) {
      this.activeData.__config__.defaultValue = [] // 避免删除时报错
      const { parent } = node
      const children = parent.data.children || parent.data
      const index = children.findIndex(d => d.id === data.id)
      children.splice(index, 1)
    },
    addNode(data) {
      this.currentNode.push(data)
    },
    setOptionValue(item, val) {
      item.value = isNumberStr(val) ? +val : val
    },
    setDefaultValue(val) {
      if (Array.isArray(val)) {
        return val.join(',')
      }
      // if (['string', 'number'].indexOf(typeof val) > -1) {
      //   return val
      // }
      if (typeof val === 'boolean') {
        return `${val}`
      }
      return val
    },
    onDefaultValueInput(str) {
      if (isArray(this.activeData.__config__.defaultValue)) {
        // 数组
        this.$set(
          this.activeData.__config__,
          'defaultValue',
          str.split(',').map(val => (isNumberStr(val) ? +val : val))
        )
      } else if (['true', 'false'].indexOf(str) > -1) {
        // 布尔
        this.$set(this.activeData.__config__, 'defaultValue', JSON.parse(str))
      } else {
        // 字符串和数字
        this.$set(
          this.activeData.__config__,
          'defaultValue',
          isNumberStr(str) ? +str : str
        )
      }
    },
    onSwitchValueInput(val, name) {
      if (['true', 'false'].indexOf(val) > -1) {
        this.$set(this.activeData, name, JSON.parse(val))
      } else {
        this.$set(this.activeData, name, isNumberStr(val) ? +val : val)
      }
    },
    setTimeValue(val, type) {
      const valueFormat = type === 'week' ? dateTimeFormat.date : val
      this.$set(this.activeData.__config__, 'defaultValue', null)
      this.$set(this.activeData, 'value-format', valueFormat)
      this.$set(this.activeData, 'format', val)
    },
    spanChange(val) {
      this.formConf.span = val
    },
    multipleChange(val) {
      this.$set(this.activeData.__config__, 'defaultValue', val ? [] : '')
    },
    dateTypeChange(val) {
      this.setTimeValue(dateTimeFormat[val], val)
    },
    rangeChange(val) {
      this.$set(
        this.activeData.__config__,
        'defaultValue',
        val ? [this.activeData.min, this.activeData.max] : this.activeData.min
      )
    },
    rateTextChange(val) {
      if (val) this.activeData['show-score'] = false
    },
    rateScoreChange(val) {
      if (val) this.activeData['show-text'] = false
    },
    colorFormatChange(val) {
      this.activeData.__config__.defaultValue = null
      this.activeData['show-alpha'] = val.indexOf('a') > -1
      this.activeData.__config__.renderKey = +new Date() // 更新renderKey,重新渲染该组件
    },
    openIconsDialog(model) {
      this.iconsVisible = true
      this.currentIconModel = model
    },
    setIcon(val) {
      this.activeData[this.currentIconModel] = val
    },
    tagChange(tagIcon) {
      let target = inputComponents.find(item => item.__config__.tagIcon === tagIcon)
      if (!target) target = selectComponents.find(item => item.__config__.tagIcon === tagIcon)
      this.$emit('tag-change', target)
    },
    changeRenderKey() {
      if (needRerenderList.includes(this.activeData.__config__.tag)) {
        this.activeData.__config__.renderKey = +new Date()
      }
    }
  }
}
</script>

<style lang="scss" scoped>
.right-board {
  width: 350px;
  position: absolute;
  right: 0;
  top: 0;
  padding-top: 3px;
  .field-box {
    position: relative;
    height: calc(100vh - 42px);
    box-sizing: border-box;
    overflow: hidden;
  }
  .el-scrollbar {
    height: 100%;
  }
}
.select-item {
  display: flex;
  border: 1px dashed #fff;
  box-sizing: border-box;
  & .close-btn {
    cursor: pointer;
    color: #f56c6c;
  }
  & .el-input + .el-input {
    margin-left: 4px;
  }
}
.select-item + .select-item {
  margin-top: 4px;
}
.select-item.sortable-chosen {
  border: 1px dashed #409eff;
}
.select-line-icon {
  line-height: 32px;
  font-size: 22px;
  padding: 0 4px;
  color: #777;
}
.option-drag {
  cursor: move;
}
.time-range {
  .el-date-editor {
    width: 227px;
  }
  ::v-deep .el-icon-time {
    display: none;
  }
}
.document-link {
  position: absolute;
  display: block;
  width: 26px;
  height: 26px;
  top: 0;
  left: 0;
  cursor: pointer;
  background: #409eff;
  z-index: 1;
  border-radius: 0 0 6px 0;
  text-align: center;
  line-height: 26px;
  color: #fff;
  font-size: 18px;
}
.node-label{
  font-size: 14px;
}
.node-icon{
  color: #bebfc3;
}
</style>