| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="right-board"> |
| | | <el-tabs v-model="currentTab" stretch class="center-tabs"> |
| | | <el-tab-pane label="ç»ä»¶å±æ§" name="field" /> |
| | | <el-tab-pane label="表å屿§" name="form" /> |
| | | </el-tabs> |
| | | <div class="field-box"> |
| | | <a class="document-link" target="_blank" :href="documentLink" title="æ¥çç»ä»¶ææ¡£"> |
| | | <el-icon> |
| | | <Link /> |
| | | </el-icon> |
| | | </a> |
| | | <el-scrollbar class="right-scrollbar"> |
| | | <!-- ç»ä»¶å±æ§ --> |
| | | <el-form v-show="currentTab === 'field' && showField" size="default" label-width="90px" label-position="top" |
| | | style=""> |
| | | <el-form-item v-if="activeData.changeTag" label="ç»ä»¶ç±»å"> |
| | | <el-select v-model="activeData.tagIcon" placeholder="è¯·éæ©ç»ä»¶ç±»å" :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.label" :label="item.label" :value="item.tagIcon"> |
| | | <svg-icon class="node-icon" :icon-class="item.tagIcon" style="margin-right: 10px;" /> |
| | | <span> {{ item.label }}</span> |
| | | </el-option> |
| | | </el-option-group> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.vModel !== undefined" label="åæ®µå"> |
| | | <el-input v-model="activeData.vModel" placeholder="请è¾å
¥å段åï¼v-modelï¼" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.componentName !== undefined" label="ç»ä»¶å"> |
| | | {{ activeData.componentName }} |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.label !== undefined" label="æ é¢"> |
| | | <el-input v-model="activeData.label" placeholder="请è¾å
¥æ é¢" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.placeholder !== undefined" label="å ä½æç¤º"> |
| | | <el-input v-model="activeData.placeholder" placeholder="请è¾å
¥å ä½æç¤º" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['start-placeholder'] !== undefined" label="å¼å§å ä½"> |
| | | <el-input v-model="activeData['start-placeholder']" placeholder="请è¾å
¥å ä½æç¤º" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['end-placeholder'] !== undefined" label="ç»æå ä½"> |
| | | <el-input v-model="activeData['end-placeholder']" placeholder="请è¾å
¥å ä½æç¤º" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.span !== undefined" label="表åæ
æ ¼"> |
| | | <el-slider v-model="activeData.span" :max="24" :min="1" :marks="{ 12: '' }" @change="spanChange" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.layout === 'rowFormItem'" label="æ
æ ¼é´é"> |
| | | <el-input-number v-model="activeData.gutter" :min="0" placeholder="æ
æ ¼é´é" /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item v-if="activeData.justify !== undefined" label="æ°´å¹³æå"> |
| | | <el-select v-model="activeData.justify" placeholder="è¯·éæ©æ°´å¹³æå" :style="{ width: '100%' }"> |
| | | <el-option v-for="(item, index) in justifyOptions" :key="index" :label="item.label" :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.align !== undefined" label="åç´æå"> |
| | | <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> |
| | | <el-form-item v-if="activeData.labelWidth !== undefined" label="æ ç¾å®½åº¦"> |
| | | <el-input v-model.number="activeData.labelWidth" type="number" placeholder="请è¾å
¥æ ç¾å®½åº¦" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.style && activeData.style.width !== undefined" label="ç»ä»¶å®½åº¦"> |
| | | <el-input v-model="activeData.style.width" placeholder="请è¾å
¥ç»ä»¶å®½åº¦" clearable /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.vModel !== undefined" label="é»è®¤å¼"> |
| | | <el-input :value="setDefaultValue(activeData.defaultValue)" placeholder="请è¾å
¥é»è®¤å¼" |
| | | @input="onDefaultValueInput" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-checkbox-group'" label="è³å°åºé"> |
| | | <el-input-number :value="activeData.min" :min="0" placeholder="è³å°åºé" |
| | | @input="$set(activeData, 'min', $event ? $event : undefined)" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-checkbox-group'" label="æå¤å¯é"> |
| | | <el-input-number :value="activeData.max" :min="0" placeholder="æå¤å¯é" |
| | | @input="$set(activeData, 'max', $event ? $event : undefined)" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.prepend !== undefined" label="åç¼"> |
| | | <el-input v-model="activeData.prepend" placeholder="请è¾å
¥åç¼" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.append !== undefined" label="åç¼"> |
| | | <el-input v-model="activeData.append" placeholder="请è¾å
¥åç¼" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['prefix-icon'] !== undefined" label="å徿 "> |
| | | <el-input v-model="activeData['prefix-icon']" placeholder="请è¾å
¥å徿 åç§°"> |
| | | <template #append> |
| | | <el-button icon="Pointer" @click="openIconsDialog('prefix-icon')"> |
| | | éæ© |
| | | </el-button> |
| | | </template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['suffix-icon'] !== undefined" label="å徿 "> |
| | | <el-input v-model="activeData['suffix-icon']" placeholder="请è¾å
¥å徿 åç§°"> |
| | | <template #append> |
| | | <el-button icon="Pointer" @click="openIconsDialog('suffix-icon')"> |
| | | éæ© |
| | | </el-button> |
| | | </template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-cascader'" label="é项åé符"> |
| | | <el-input v-model="activeData.separator" placeholder="请è¾å
¥é项åé符" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.autosize !== undefined" label="æå°è¡æ°"> |
| | | <el-input-number v-model="activeData.autosize.minRows" :min="1" placeholder="æå°è¡æ°" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.autosize !== undefined" label="æå¤§è¡æ°"> |
| | | <el-input-number v-model="activeData.autosize.maxRows" :min="1" placeholder="æå¤§è¡æ°" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.min !== undefined" label="æå°å¼"> |
| | | <el-input-number v-model="activeData.min" placeholder="æå°å¼" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.max !== undefined" label="æå¤§å¼"> |
| | | <el-input-number v-model="activeData.max" placeholder="æå¤§å¼" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.step !== undefined" label="æ¥é¿"> |
| | | <el-input-number v-model="activeData.step" placeholder="æ¥æ°" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-input-number'" label="精度"> |
| | | <el-input-number v-model="activeData.precision" :min="0" placeholder="精度" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-input-number'" label="æé®ä½ç½®"> |
| | | <el-radio-group v-model="activeData['controls-position']"> |
| | | <el-radio-button label=""> |
| | | é»è®¤ |
| | | </el-radio-button> |
| | | <el-radio-button label="right"> |
| | | å³ä¾§ |
| | | </el-radio-button> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.maxlength !== undefined" label="æå¤è¾å
¥"> |
| | | <el-input v-model="activeData.maxlength" placeholder="请è¾å
¥å符é¿åº¦"> |
| | | <template slot="append"> |
| | | 个å符 |
| | | </template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['active-text'] !== undefined" label="å¼å¯æç¤º"> |
| | | <el-input v-model="activeData['active-text']" placeholder="请è¾å
¥å¼å¯æç¤º" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['inactive-text'] !== undefined" label="å
³éæç¤º"> |
| | | <el-input v-model="activeData['inactive-text']" placeholder="请è¾å
¥å
³éæç¤º" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['active-value'] !== undefined" label="å¼å¯å¼"> |
| | | <el-input :value="setDefaultValue(activeData['active-value'])" placeholder="请è¾å
¥å¼å¯å¼" |
| | | @input="onSwitchValueInput($event, 'active-value')" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['inactive-value'] !== undefined" label="å
³éå¼"> |
| | | <el-input :value="setDefaultValue(activeData['inactive-value'])" placeholder="请è¾å
¥å
³éå¼" |
| | | @input="onSwitchValueInput($event, 'inactive-value')" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.type !== undefined && 'el-date-picker' === activeData.tag" label="æ¶é´ç±»å"> |
| | | <el-select v-model="activeData.type" placeholder="è¯·éæ©æ¶é´ç±»å" :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> |
| | | <el-form-item v-if="activeData.name !== undefined" label="æä»¶å段å"> |
| | | <el-input v-model="activeData.name" placeholder="请è¾å
¥ä¸ä¼ æä»¶å段å" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.accept !== undefined" label="æä»¶ç±»å"> |
| | | <el-select v-model="activeData.accept" placeholder="è¯·éæ©æä»¶ç±»å" :style="{ width: '100%' }" clearable> |
| | | <el-option label="å¾ç" value="image/*" /> |
| | | <el-option label="è§é¢" value="video/*" /> |
| | | <el-option label="é³é¢" value="audio/*" /> |
| | | <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> |
| | | <el-form-item v-if="activeData.fileSize !== undefined" label="æä»¶å¤§å°"> |
| | | <el-input v-model.number="activeData.fileSize" placeholder="请è¾å
¥æä»¶å¤§å°"> |
| | | <el-select slot="append" v-model="activeData.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> |
| | | <el-form-item v-if="activeData.action !== undefined" label="ä¸ä¼ å°å"> |
| | | <el-input v-model="activeData.action" placeholder="请è¾å
¥ä¸ä¼ å°å" clearable /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['list-type'] !== undefined" label="å表类å"> |
| | | <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.buttonText !== undefined" v-show="'picture-card' !== activeData['list-type']" |
| | | label="æé®æå"> |
| | | <el-input v-model="activeData.buttonText" placeholder="请è¾å
¥æé®æå" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['range-separator'] !== undefined" label="åé符"> |
| | | <el-input v-model="activeData['range-separator']" placeholder="请è¾å
¥åé符" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['picker-options'] !== undefined" label="æ¶é´æ®µ"> |
| | | <el-input v-model="activeData['picker-options'].selectableRange" placeholder="请è¾å
¥æ¶é´æ®µ" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.format !== undefined" label="æ¶é´æ ¼å¼"> |
| | | <el-input :value="activeData.format" placeholder="请è¾å
¥æ¶é´æ ¼å¼" @input="setTimeValue($event)" /> |
| | | </el-form-item> |
| | | <template v-if="['el-checkbox-group', 'el-radio-group', 'el-select'].indexOf(activeData.tag) > -1"> |
| | | <el-divider>é项</el-divider> |
| | | <draggable :list="activeData.options" :animation="340" group="selectItem" handle=".option-drag" |
| | | item-key="label"> |
| | | <template #item="{ element, index }"> |
| | | <div :key="index" class="select-item"> |
| | | <div class="select-line-icon option-drag"> |
| | | <i class="el-icon-s-operation" /> |
| | | </div> |
| | | <el-input v-model="element.label" placeholder="é项å" size="small" /> |
| | | <el-input placeholder="é项å¼" size="small" :value="element.value" |
| | | @input="setOptionValue(element, $event)" /> |
| | | <div class="close-btn select-line-icon" @click="activeData.options.splice(index, 1)"> |
| | | <el-icon> |
| | | <Remove /> |
| | | </el-icon> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </draggable> |
| | | <div> |
| | | <el-button icon="CirclePlus" style="margin-left: 8px; margin-top: 10px;" text bg type="primary" |
| | | @click="addSelectItem"> |
| | | æ·»å é项 |
| | | </el-button> |
| | | </div> |
| | | <el-divider /> |
| | | </template> |
| | | |
| | | <template v-if="['el-cascader'].indexOf(activeData.tag) > -1"> |
| | | <el-divider>é项</el-divider> |
| | | <el-form-item label="æ°æ®ç±»å"> |
| | | <el-radio-group v-model="activeData.dataType" size="small"> |
| | | <el-radio-button label="dynamic"> |
| | | å¨ææ°æ® |
| | | </el-radio-button> |
| | | <el-radio-button label="static"> |
| | | éææ°æ® |
| | | </el-radio-button> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | |
| | | <template v-if="activeData.dataType === 'dynamic'"> |
| | | <el-form-item label="æ ç¾é®å"> |
| | | <el-input v-model="activeData.labelKey" placeholder="请è¾å
¥æ ç¾é®å" /> |
| | | </el-form-item> |
| | | <el-form-item label="å¼é®å"> |
| | | <el-input v-model="activeData.valueKey" placeholder="请è¾å
¥å¼é®å" /> |
| | | </el-form-item> |
| | | <el-form-item label="å级é®å"> |
| | | <el-input v-model="activeData.childrenKey" placeholder="请è¾å
¥å级é®å" /> |
| | | </el-form-item> |
| | | </template> |
| | | |
| | | <el-tree v-if="activeData.dataType === 'static'" draggable :data="activeData.options" node-key="id" |
| | | :expand-on-click-node="false" :render-content="renderContent" /> |
| | | <div v-if="activeData.dataType === 'static'"> |
| | | <el-button icon="CirclePlus" style="margin-left: 0; margin-top: 10px;" type="primary" text bg |
| | | @click="addTreeItem"> |
| | | æ·»å ç¶çº§ |
| | | </el-button> |
| | | </div> |
| | | <el-divider /> |
| | | </template> |
| | | |
| | | <el-form-item v-if="activeData.optionType !== undefined" label="éé¡¹æ ·å¼"> |
| | | <el-radio-group v-model="activeData.optionType"> |
| | | <el-radio-button label="default"> |
| | | é»è®¤ |
| | | </el-radio-button> |
| | | <el-radio-button label="button"> |
| | | æé® |
| | | </el-radio-button> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['active-color'] !== undefined" label="å¼å¯é¢è²"> |
| | | <el-color-picker v-model="activeData['active-color']" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['inactive-color'] !== undefined" label="å
³éé¢è²"> |
| | | <el-color-picker v-model="activeData['inactive-color']" /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item v-if="activeData['allow-half'] !== undefined" label="å
许åé"> |
| | | <el-switch v-model="activeData['allow-half']" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['show-text'] !== undefined" label="è¾
婿å"> |
| | | <el-switch v-model="activeData['show-text']" @change="rateTextChange" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['show-score'] !== undefined" label="æ¾ç¤ºåæ°"> |
| | | <el-switch v-model="activeData['show-score']" @change="rateScoreChange" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['show-stops'] !== undefined" label="æ¾ç¤ºé´æç¹"> |
| | | <el-switch v-model="activeData['show-stops']" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.range !== undefined" label="èå´éæ©"> |
| | | <el-switch v-model="activeData.range" @change="rangeChange" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.border !== undefined && activeData.optionType === 'default'" label="æ¯å¦å¸¦è¾¹æ¡"> |
| | | <el-switch v-model="activeData.border" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-color-picker'" label="é¢è²æ ¼å¼"> |
| | | <el-select v-model="activeData['color-format']" placeholder="è¯·éæ©é¢è²æ ¼å¼" :style="{ width: '100%' }" |
| | | @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.optionType === 'button' || |
| | | activeData.border || |
| | | activeData.tag === 'el-color-picker')" label="é项尺寸"> |
| | | <el-radio-group v-model="activeData.size"> |
| | | <el-radio-button label="large"> |
| | | è¾å¤§ |
| | | </el-radio-button> |
| | | <el-radio-button label="default"> |
| | | é»è®¤ |
| | | </el-radio-button> |
| | | <el-radio-button label="small"> |
| | | è¾å° |
| | | </el-radio-button> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['show-word-limit'] !== undefined" label="è¾å
¥ç»è®¡"> |
| | | <el-switch v-model="activeData['show-word-limit']" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-input-number'" label="ä¸¥æ ¼æ¥æ°"> |
| | | <el-switch v-model="activeData['step-strictly']" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-cascader'" label="æ¯å¦å¤é"> |
| | | <el-switch v-model="activeData.props.props.multiple" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-cascader'" label="å±ç¤ºå
¨è·¯å¾"> |
| | | <el-switch v-model="activeData['show-all-levels']" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-cascader'" label="å¯å¦çé"> |
| | | <el-switch v-model="activeData.filterable" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.clearable !== undefined" label="è½å¦æ¸
空"> |
| | | <el-switch v-model="activeData.clearable" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.showTip !== undefined" label="æ¾ç¤ºæç¤º"> |
| | | <el-switch v-model="activeData.showTip" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.multiple !== undefined" label="å¤éæä»¶"> |
| | | <el-switch v-model="activeData.multiple" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData['auto-upload'] !== undefined" label="èªå¨ä¸ä¼ "> |
| | | <el-switch v-model="activeData['auto-upload']" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.readonly !== undefined" label="æ¯å¦åªè¯»"> |
| | | <el-switch v-model="activeData.readonly" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.disabled !== undefined" label="æ¯å¦ç¦ç¨"> |
| | | <el-switch v-model="activeData.disabled" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-select'" label="æ¯å¦å¯æç´¢"> |
| | | <el-switch v-model="activeData.filterable" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.tag === 'el-select'" label="æ¯å¦å¤é"> |
| | | <el-switch v-model="activeData.multiple" @change="multipleChange" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="activeData.required !== undefined" label="æ¯å¦å¿
å¡«"> |
| | | <el-switch v-model="activeData.required" /> |
| | | </el-form-item> |
| | | |
| | | <template v-if="activeData.layoutTree"> |
| | | <el-divider>å¸å±ç»ææ </el-divider> |
| | | <el-tree :data="[activeData]" :props="layoutTreeProps" node-key="renderKey" default-expand-all draggable> |
| | | <template #default="{ node, data }"> |
| | | <span class="node-label"> |
| | | <svg-icon class="node-icon" :icon-class="data.tagIcon" style="margin-right: 5px;" /> |
| | | {{ node.label }} |
| | | </span> |
| | | </template> |
| | | </el-tree> |
| | | </template> |
| | | |
| | | <template v-if="activeData.layout === 'colFormItem'"> |
| | | <el-divider>æ£åæ ¡éª</el-divider> |
| | | <div v-for="(item, index) in activeData.regList" :key="index" class="reg-item"> |
| | | <span class="close-btn" @click="activeData.regList.splice(index, 1)"> |
| | | <el-icon> |
| | | <Close /> |
| | | </el-icon> |
| | | </span> |
| | | <el-form-item label="表达å¼"> |
| | | <el-input v-model="item.pattern" placeholder="请è¾å
¥æ£å" /> |
| | | </el-form-item> |
| | | <el-form-item label="é误æç¤º" style="margin-bottom:0"> |
| | | <el-input v-model="item.message" placeholder="请è¾å
¥é误æç¤º" /> |
| | | </el-form-item> |
| | | </div> |
| | | <div> |
| | | <el-button icon="CirclePlus" style="margin-left: 0; margin-top: 10px;" type="primary" text bg |
| | | @click="addReg"> |
| | | æ·»å è§å |
| | | </el-button> |
| | | </div> |
| | | </template> |
| | | </el-form> |
| | | <!-- 表å屿§ --> |
| | | <el-form v-show="currentTab === 'form'" label-width="90px" label-position="top"> |
| | | <el-form-item label="表åå"> |
| | | <el-input v-model="formConf.formRef" placeholder="请è¾å
¥è¡¨ååï¼refï¼" /> |
| | | </el-form-item> |
| | | <el-form-item label="è¡¨åæ¨¡å"> |
| | | <el-input v-model="formConf.formModel" placeholder="请è¾å
¥æ°æ®æ¨¡å" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ ¡éªæ¨¡å"> |
| | | <el-input v-model="formConf.formRules" placeholder="请è¾å
¥æ ¡éªæ¨¡å" /> |
| | | </el-form-item> |
| | | <el-form-item label="表å尺寸"> |
| | | <el-radio-group v-model="formConf.size"> |
| | | <el-radio-button label="large" value="è¾å¤§" /> |
| | | <el-radio-button label="default" value="é»è®¤" /> |
| | | <el-radio-button label="small" value="è¾å°" /> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="æ ç¾å¯¹é½"> |
| | | <el-radio-group v-model="formConf.labelPosition"> |
| | | <el-radio-button label="left" value="左对é½" /> |
| | | <el-radio-button label="right" value="å³å¯¹é½" /> |
| | | <el-radio-button label="top" value="é¡¶é¨å¯¹é½" /> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="æ ç¾å®½åº¦"> |
| | | <el-input-number v-model="formConf.labelWidth" placeholder="æ ç¾å®½åº¦" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ
æ ¼é´é"> |
| | | <el-input-number v-model="formConf.gutter" :min="0" placeholder="æ
æ ¼é´é" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¦ç¨è¡¨å"> |
| | | <el-switch v-model="formConf.disabled" /> |
| | | </el-form-item> |
| | | <el-form-item label="表åæé®"> |
| | | <el-switch v-model="formConf.formBtns" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¾ç¤ºæªéä¸ç»ä»¶è¾¹æ¡"> |
| | | <el-switch v-model="formConf.unFocusedComponentBorder" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-scrollbar> |
| | | </div> |
| | | <icons-dialog v-model="iconsVisible" :current="activeData[currentIconModel]" @select="setIcon" /> |
| | | <treeNode-dialog v-model="dialogVisible" @commit="addNode" /> |
| | | |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import draggable from "vuedraggable/dist/vuedraggable.common" |
| | | import { isNumberStr } from '@/utils/index' |
| | | import IconsDialog from './IconsDialog' |
| | | import TreeNodeDialog from './TreeNodeDialog' |
| | | import { inputComponents, selectComponents } from '@/utils/generator/config' |
| | | |
| | | const { proxy } = getCurrentInstance() |
| | | 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' |
| | | } |
| | | const props = defineProps({ |
| | | showField: Boolean, |
| | | activeData: Object, |
| | | formConf: Object |
| | | }) |
| | | |
| | | const data = reactive({ |
| | | 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) { |
| | | return data.componentName || `${data.label}: ${data.vModel}` |
| | | } |
| | | } |
| | | }) |
| | | |
| | | const { currentTab, currentNode, dialogVisible, iconsVisible, currentIconModel, dateTypeOptions, dateRangeTypeOptions, colorFormatOptions, justifyOptions, layoutTreeProps } = toRefs(data) |
| | | |
| | | const documentLink = computed(() => props.activeData.document || 'https://element-plus.org/zh-CN/guide/installation') |
| | | |
| | | const dateOptions = computed(() => { |
| | | if (props.activeData.type !== undefined && props.activeData.tag === 'el-date-picker') { |
| | | if (props.activeData['start-placeholder'] === undefined) { |
| | | return dateTypeOptions.value |
| | | } |
| | | return dateRangeTypeOptions.value |
| | | } |
| | | return [] |
| | | }) |
| | | |
| | | const tagList = ref([ |
| | | { |
| | | label: 'è¾å
¥åç»ä»¶', |
| | | options: inputComponents |
| | | }, |
| | | { |
| | | label: 'éæ©åç»ä»¶', |
| | | options: selectComponents |
| | | } |
| | | ]) |
| | | |
| | | const emit = defineEmits(['tag-change']) |
| | | |
| | | function addReg() { |
| | | props.activeData.regList.push({ |
| | | pattern: '', |
| | | message: '' |
| | | }) |
| | | } |
| | | function addSelectItem() { |
| | | props.activeData.options.push({ |
| | | label: '', |
| | | value: '' |
| | | }) |
| | | } |
| | | |
| | | function addTreeItem() { |
| | | ++proxy.idGlobal |
| | | dialogVisible.value = true |
| | | currentNode.value = props.activeData.options |
| | | } |
| | | |
| | | function renderContent(h, { node, data, store }) { |
| | | return h('div', { |
| | | class: "custom-tree-node" |
| | | }, [ |
| | | h('span', node.label), |
| | | h('span', { |
| | | class: "node-operation" |
| | | }, [ |
| | | h(resolveComponent('el-link'), { |
| | | type: "primary", |
| | | icon: "Plus", |
| | | underline: false, |
| | | onClick: () => { |
| | | append(data) |
| | | |
| | | } |
| | | }), |
| | | h(resolveComponent('el-link'), { |
| | | type: "danger", |
| | | icon: "Delete", |
| | | underline: false, |
| | | style: "margin-left: 5px;", |
| | | onClick: () => { |
| | | remove(node, data) |
| | | } |
| | | }) |
| | | ]) |
| | | ]) |
| | | } |
| | | function append(data) { |
| | | if (!data.children) { |
| | | data.children = [] |
| | | } |
| | | dialogVisible.value = true |
| | | currentNode.value = data.children |
| | | } |
| | | function remove(node, data) { |
| | | const { parent } = node |
| | | const children = parent.data.children || parent.data |
| | | const index = children.findIndex(d => d.id === data.id) |
| | | children.splice(index, 1) |
| | | } |
| | | function addNode(data) { |
| | | currentNode.value.push(data) |
| | | } |
| | | |
| | | function setOptionValue(item, val) { |
| | | item.value = isNumberStr(val) ? +val : val |
| | | } |
| | | function setDefaultValue(val) { |
| | | if (Array.isArray(val)) { |
| | | return val.join(',') |
| | | } |
| | | if (['string', 'number'].indexOf(val) > -1) { |
| | | return val |
| | | } |
| | | if (typeof val === 'boolean') { |
| | | return `${val}` |
| | | } |
| | | return val |
| | | } |
| | | |
| | | function onDefaultValueInput(str) { |
| | | if (Array.isArray(props.activeData.defaultValue)) { |
| | | // æ°ç» |
| | | props.activeData.defaultValue = str.split(',').map(val => (isNumberStr(val) ? +val : val)) |
| | | } else if (['true', 'false'].indexOf(str) > -1) { |
| | | // å¸å° |
| | | props.activeData.defaultValue = JSON.parse(str) |
| | | } else { |
| | | // åç¬¦ä¸²åæ°å |
| | | props.activeData.defaultValue = isNumberStr(str) ? +str : str |
| | | } |
| | | } |
| | | |
| | | function onSwitchValueInput(val, name) { |
| | | if (['true', 'false'].indexOf(val) > -1) { |
| | | props.activeData[name] = JSON.parse(val) |
| | | } else { |
| | | props.activeData[name] = isNumberStr(val) ? +val : val |
| | | } |
| | | } |
| | | |
| | | function setTimeValue(val, type) { |
| | | const valueFormat = type === 'week' ? dateTimeFormat.date : val |
| | | props.activeData.defaultValue = null |
| | | props.activeData['value-format'] = valueFormat |
| | | props.activeData.format = val |
| | | } |
| | | |
| | | function spanChange(val) { |
| | | props.formConf.span = val |
| | | } |
| | | |
| | | function multipleChange(val) { |
| | | props.activeData.defaultValue = val ? [] : '' |
| | | } |
| | | |
| | | function dateTypeChange(val) { |
| | | setTimeValue(dateTimeFormat[val], val) |
| | | } |
| | | |
| | | function rangeChange(val) { |
| | | props.activeData.defaultValue = val ? [props.activeData.min, props.activeData.max] : props.activeData.min |
| | | } |
| | | |
| | | function rateTextChange(val) { |
| | | if (val) props.activeData['show-score'] = false |
| | | } |
| | | |
| | | function rateScoreChange(val) { |
| | | if (val) props.activeData['show-text'] = false |
| | | } |
| | | |
| | | function colorFormatChange(val) { |
| | | props.activeData.defaultValue = null |
| | | props.activeData['show-alpha'] = val.indexOf('a') > -1 |
| | | props.activeData.renderKey = +new Date() // æ´æ°renderKey,éæ°æ¸²æè¯¥ç»ä»¶ |
| | | } |
| | | |
| | | function openIconsDialog(model) { |
| | | iconsVisible.value = true |
| | | currentIconModel.value = model |
| | | } |
| | | |
| | | function setIcon(val) { |
| | | props.activeData[currentIconModel.value] = val |
| | | } |
| | | |
| | | function tagChange(tagIcon) { |
| | | let target = inputComponents.find(item => item.tagIcon === tagIcon) |
| | | if (!target) target = selectComponents.find(item => item.tagIcon === tagIcon) |
| | | emit('tag-change', target) |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .right-board { |
| | | width: 350px; |
| | | position: absolute; |
| | | right: 0; |
| | | top: 0; |
| | | padding-top: 3px; |
| | | |
| | | &:deep() { |
| | | .el-tabs__header { |
| | | margin: 0; |
| | | } |
| | | |
| | | .el-input-group__append .el-button { |
| | | display: inline-flex; |
| | | } |
| | | } |
| | | |
| | | .field-box { |
| | | position: relative; |
| | | height: calc(100vh - 50px - 40px - 42px); |
| | | box-sizing: border-box; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .el-scrollbar { |
| | | height: 100%; |
| | | |
| | | &:deep() { |
| | | .el-scrollbar__view { |
| | | padding: 30px 20px; |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .reg-item { |
| | | padding: 12px 6px; |
| | | background: var(--el-border-color-extra-light); |
| | | position: relative; |
| | | border-radius: 4px; |
| | | |
| | | .close-btn { |
| | | position: absolute; |
| | | right: -6px; |
| | | top: -6px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | width: 16px; |
| | | height: 16px; |
| | | line-height: 16px; |
| | | background: rgba(0, 0, 0, .2); |
| | | border-radius: 50%; |
| | | color: #fff; |
| | | z-index: 1; |
| | | cursor: pointer; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | |
| | | .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; |
| | | } |
| | | |
| | | :deep() { |
| | | .el-icon-time { |
| | | display: none; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .document-link { |
| | | position: absolute; |
| | | display: flex; |
| | | width: 26px; |
| | | height: 26px; |
| | | top: 0; |
| | | left: 0; |
| | | cursor: pointer; |
| | | background: #409eff; |
| | | z-index: 1; |
| | | border-radius: 0 0 6px 0; |
| | | justify-content: center; |
| | | align-items: center; |
| | | color: #fff; |
| | | font-size: 18px; |
| | | } |
| | | |
| | | .node-label { |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .node-icon { |
| | | color: #bebfc3; |
| | | } |
| | | |
| | | .custom-tree-node { |
| | | flex: 1; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | font-size: 14px; |
| | | padding-right: 8px; |
| | | } |
| | | </style> |