Browse Source

add editor radio other

fix style
old
wangqing 5 years ago
parent
commit
17632466e8
  1. 7
      src/assets/styles/form/home.scss
  2. 61
      src/components/parser/Parser.vue
  3. 7
      src/components/render/render.js
  4. 10
      src/components/render/slots/el-checkbox-group.js
  5. 10
      src/components/render/slots/el-radio-group.js
  6. 3
      src/components/tinymce/index.vue
  7. 2
      src/router/modules/root.js
  8. 1
      src/utils/convert.js
  9. 44
      src/views/form/DraggableItem.vue
  10. 69
      src/views/form/RightPanel.vue
  11. 2
      src/views/form/editor.vue
  12. 7
      src/views/project/MyProject.vue
  13. 28
      src/views/test.vue

7
src/assets/styles/form/home.scss

@ -1,5 +1,5 @@
$selectedColor: #f5f8ff;
$lighterBlue: #4aa0fa;
$selectedColor: #fafafa;
$lighterBlue: #e4efff;
.form-edit-container {
position: relative;
width: 100%;
@ -55,7 +55,7 @@ $lighterBlue: #4aa0fa;
left: 40px;
top: 0;
height: 100vh;
//background-color: rgba(255, 255, 255, 100);
}
.el-menu.el-menu--horizontal {
border-bottom: none;
@ -65,6 +65,7 @@ $lighterBlue: #4aa0fa;
overflow: hidden;
margin: 5px;
border-radius: 7px;
background-color: rgba(255, 255, 255, 100);
//text-align: center;
box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 100);

61
src/components/parser/Parser.vue

@ -160,20 +160,45 @@ function setValue(event, config, scheme) {
setValueLabel.call(this, event, config, scheme)
}
/**
* radio checkbox 其他输入框值处理
*/
function setOtherValueLabel(event, config) {
let value = this[this.formConf.formModel][config.__vModel__]
this.$set(this[this.formConf.labelFormModel], `${config.__vModel__}other`, event)
setValueLabel.call(this, value, config.__config__, config)
}
/**
* 保存选项的label值
* @param event
* @param config
* @param scheme
*/
function setValueLabel(event, config, scheme) {
let tagOptionKey = processType[config.tag]
if (tagOptionKey) {
if (event instanceof Array) {
let labelStr = ''
let labelArr = new Array()
event.forEach(item => {
//
if (item === 0) {
labelArr.push(this[this.formConf.labelFormModel][`${scheme.__vModel__}other`])
}else{
let {label} = getObject(_.get(scheme, tagOptionKey), 'value', item)
labelStr += label + ','
labelArr.push(label)
}
})
this.$set(this[this.formConf.labelFormModel], scheme.__vModel__, labelStr)
this.$set(this[this.formConf.labelFormModel], scheme.__vModel__, labelArr.join(','))
} else {
//
if (event == 0) {
this.$set(this[this.formConf.labelFormModel], `${config.__vModel__}`, this[this.formConf.labelFormModel][`${config.__vModel__}other`])
} else {
let item = _.find(_.get(scheme, tagOptionKey), {'value': event})
this.$set(this[this.formConf.labelFormModel], scheme.__vModel__, item.label)
}
}
} else if (config.tag === 'el-upload') {
this.$set(this[this.formConf.labelFormModel], scheme.__vModel__, event)
} else {
@ -206,7 +231,7 @@ function buildListeners(scheme) {
listeners.input = event => setValue.call(this, event, config, scheme)
listeners.upload = (response, file, fileList) => setUpload.call(this, config, scheme, response, file, fileList)
listeners.deleteUpload = (file, fileList) => deleteUpload.call(this, config, scheme, file, fileList)
listeners.selectOtherChange = (event, config) => setOtherValueLabel.call(this, event, config)
return listeners
}
@ -328,3 +353,31 @@ export default {
}
}
</script>
<style scoped>
/deep/ .el-radio-group {
margin-left: 10px;
}
/deep/ .el-radio {
display: block;
height: 23px;
line-height: 23px;
}
/deep/ .el-checkbox-group {
margin-left: 10px;
}
/deep/ .el-checkbox {
display: block;
}
/deep/ .item-other-input {
margin-left: 20px;
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
}
/deep/ .item-other-input:focus {
outline: none;
}
</style>

7
src/components/render/render.js

@ -26,7 +26,7 @@ function vModel(dataObject, defaultValue) {
this.$emit('deleteUpload', file, fileList)
}
dataObject.attrs['on-exceed'] = (files, fileList) => {
this.$message.error(`最多上传${config.limit}个文件`);
this.$message.error(`最多上传${config.limit}个文件`)
},
dataObject.attrs['before-upload'] = (file) => {
let sizeUnitNum = 1
@ -44,10 +44,9 @@ function vModel(dataObject, defaultValue) {
}
let totalSize = config.fileSize * sizeUnitNum
if (file.size > totalSize) {
this.$message.error(`上传图片大小不能超过${config.fileSize}${config.sizeUnit}`);
this.$message.error(`上传图片大小不能超过${config.fileSize}${config.sizeUnit}`)
return false
}
console.log(dataObject)
}
} else {
dataObject.props.value = defaultValue
@ -65,7 +64,7 @@ function mountSlotFlies(h, confClone, children) {
Object.keys(childObjs).forEach(key => {
const childFunc = childObjs[key]
if (confClone.__slot__ && confClone.__slot__[key]) {
children.push(childFunc(h, confClone, key))
children.push(childFunc(h, confClone, key, this))
}
})
}

10
src/components/render/slots/el-checkbox-group.js

@ -1,12 +1,20 @@
export default {
options(h, conf, key) {
options(h, conf, key, that) {
const list = []
conf.__slot__.options.forEach(item => {
if (conf.__config__.optionType === 'button') {
list.push(<el-checkbox-button label={item.value}>{item.label}</el-checkbox-button>)
} else {
if (item.value == 0) {
list.push(<el-checkbox label={item.value}
border={conf.border}>{item.label}
<input class='item-other-input' onChange={event => {
that.$emit('selectOtherChange', event.target.value, conf)
}}/></el-checkbox>)
} else {
list.push(<el-checkbox label={item.value} border={conf.border}>{item.label}</el-checkbox>)
}
}
})
return list
}

10
src/components/render/slots/el-radio-group.js

@ -1,12 +1,20 @@
export default {
options(h, conf, key) {
options(h, conf, key, that) {
const list = []
conf.__slot__.options.forEach(item => {
if (conf.__config__.optionType === 'button') {
list.push(<el-radio-button label={item.value}>{item.label}</el-radio-button>)
} else {
if (item.value == 0) {
list.push(<el-radio label={item.value} border={conf.border} >
{item.label}<input class='item-other-input' onChange={event => {
that.$emit('selectOtherChange', event.target.value,conf)
}}/>
</el-radio>)
} else {
list.push(<el-radio label={item.value} border={conf.border}>{item.label}</el-radio>)
}
}
})
return list
}

3
src/components/tinymce/index.vue

@ -42,10 +42,11 @@ export default {
menubar: 'false',
skin_url: '/tinymce/skins/ui/tduck',
content_css : '/tinymce/skins/content/tduck' ,
toolbar_mode:'floating',
cache_suffix: '?v='+new Date(),
plugins,
toolbar,
toolbar_drawer:'sliding',
toolbar_mode:'sliding',
height: 200,
// fontsize_formats: "8pt 10pt 12pt 14pt 18pt 24pt 36pt",
branding: false,

2
src/router/modules/root.js

@ -2,7 +2,7 @@ export default [
{
path: '/test',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/components/tinymce/example/Index')
component: () => import(/* webpackChunkName: 'root' */ '@/views/test')
},
{
path: '/redirect/:type',

1
src/utils/convert.js

@ -54,6 +54,7 @@ export function dbDataConvertForItemJson(data) {
_.set(jsonItem, param[key], value)
})
}
jsonItem.sort = data.sort
jsonItem.typeId = data.type
jsonItem.__config__.formId = data.formItemId
jsonItem.__config__.label = data.label

44
src/views/form/DraggableItem.vue

@ -7,12 +7,14 @@ const components = {
const {copyItem, deleteItem} = this.$listeners
return [
<span class="drawing-item-copy" title="复制" onClick={event => {
copyItem(currentItem, list); event.stopPropagation()
copyItem(currentItem, list)
event.stopPropagation()
}}>
<i class="el-icon-copy-document"/>
</span>,
<span class="drawing-item-delete" title="删除" onClick={event => {
deleteItem(index, list); event.stopPropagation()
deleteItem(index, list)
event.stopPropagation()
}}>
<i class="el-icon-delete"/>
</span>
@ -30,7 +32,10 @@ const layouts = {
if (config.showLabel === false) labelWidth = '0'
return (
<el-col span={config.span} class={className}
nativeOnClick={event => { activeItem(currentItem); event.stopPropagation() }}>
nativeOnClick={event => {
activeItem(currentItem)
event.stopPropagation()
}}>
<el-form-item label-width={labelWidth}
label={config.showLabel ? config.label : ''} required={config.required}>
<render key={config.renderKey} conf={currentItem} onInput={event => {
@ -58,7 +63,10 @@ const layouts = {
return (
<el-col span={config.span}>
<el-row gutter={config.gutter} class={className}
nativeOnClick={event => { activeItem(currentItem); event.stopPropagation() }}>
nativeOnClick={event => {
activeItem(currentItem)
event.stopPropagation()
}}>
<span class="component-name">{config.componentName}</span>
<draggable list={config.children || []} animation={340}
group="componentsGroup" class="drag-wrapper">
@ -118,3 +126,31 @@ export default {
}
}
</script>
<style scoped>
/deep/ .el-radio-group {
margin-left: 10px;
}
/deep/ .el-radio {
display: block;
height: 23px;
line-height: 23px;
}
/deep/ .el-checkbox-group {
margin-left: 10px;
}
/deep/ .el-checkbox {
display: block;
}
/deep/ .item-other-input {
margin-left: 20px;
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
}
/deep/ .item-other-input:focus {
outline: none;
}
</style>

69
src/views/form/RightPanel.vue

@ -48,12 +48,15 @@
<el-input v-model="activeData['end-placeholder']" placeholder="请输入占位提示"/>
</el-form-item>
<el-form-item v-if="activeData.__config__.span!==undefined" label="表单栅格">
<el-slider v-model="activeData.__config__.span" :max="24" :min="1" :marks="{12:''}" @change="spanChange" />
<el-slider v-model="activeData.__config__.span" :max="24" :min="1" :marks="{12:''}"
@change="spanChange"/>
</el-form-item>
<el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.gutter!==undefined" label="栅格间隔">
<el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.gutter!==undefined"
label="栅格间隔">
<el-input-number v-model="activeData.gutter" :min="0" placeholder="栅格间隔"/>
</el-form-item>
<el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.type!==undefined" label="布局模式">
<el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.type!==undefined"
label="布局模式">
<el-radio-group v-model="activeData.type">
<el-radio-button label="default"/>
<el-radio-button label="flex"/>
@ -77,7 +80,8 @@
</el-radio-group>
</el-form-item>
<el-form-item v-if="activeData.__config__.labelWidth!==undefined" label="标签宽度">
<el-input v-model.number="activeData.__config__.labelWidth" type="number" placeholder="请输入标签宽度" />
<el-input v-model.number="activeData.__config__.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/>
@ -235,7 +239,8 @@
</el-form-item>
<el-form-item v-if="activeData.__config__.fileSize !== undefined" label="文件大小">
<el-input v-model.number="activeData.__config__.fileSize" placeholder="请输入文件大小">
<el-select slot="append" v-model="activeData.__config__.sizeUnit" :style="{ width: '66px' }">
<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"/>
@ -300,7 +305,8 @@
@input="setTimeValue($event)"
/>
</el-form-item>
<template v-if="['el-checkbox-group', 'el-radio-group', 'el-select'].indexOf(activeData.__config__.tag) > -1">
<template
v-if="['el-checkbox-group', 'el-radio-group', 'el-select'].indexOf(activeData.__config__.tag) > -1">
<el-divider>选项</el-divider>
<draggable
:list="activeData.__slot__.options"
@ -319,7 +325,8 @@
<!-- :value="item.value"-->
<!-- @input="setOptionValue(item, $event)"-->
<!-- />-->
<div class="close-btn select-line-icon" @click="activeData.__slot__.options.splice(index, 1)">
<div class="close-btn select-line-icon"
@click="activeData.__slot__.options.splice(index, 1)">
<i class="el-icon-remove-outline"/>
</div>
</div>
@ -333,6 +340,15 @@
>
添加选项
</el-button>
<el-button
v-if="['el-checkbox-group', 'el-radio-group'].indexOf(activeData.__config__.tag) > -1"
style="padding-bottom: 0"
icon="el-icon-circle-plus-outline"
type="text"
@click="addSelectOtherItem"
>
添加其他
</el-button>
</div>
<el-divider/>
</template>
@ -387,7 +403,7 @@
<!-- 级联选择静态树 -->
<el-tree
v-if="activeData.__config__.dataType === 'static'"
draggable
draggable="true"
:data="activeData.options"
node-key="id"
:expand-on-click-node="false"
@ -544,7 +560,7 @@
:props="layoutTreeProps"
node-key="renderKey"
default-expand-all
draggable
draggable="true"
>
<span slot-scope="{ node, data }">
<span class="node-label">
@ -647,8 +663,11 @@ import IconsDialog from './IconsDialog'
import {
inputComponents, selectComponents
} from '@/components/generator/config'
import DraggableItem from './DraggableItem'
import {saveFormConf} from '@/utils/db'
import {debounce} from "throttle-debounce"
import {debounce} from 'throttle-debounce'
import draggable from 'vuedraggable'
const dateTimeFormat = {
date: 'yyyy-MM-dd',
week: 'yyyy 第 WW 周',
@ -666,6 +685,7 @@ const needRerenderList = ['tinymce']
export default {
components: {
TreeNodeDialog,
draggable,
IconsDialog
},
props: ['showField', 'activeData', 'formConf'],
@ -819,7 +839,7 @@ export default {
}
},
deep: true
},
}
},
methods: {
addReg() {
@ -835,6 +855,19 @@ export default {
value: this.activeData.__slot__.options.length + 1
})
},
addSelectOtherItem() {
let item = this.activeData.__slot__.options.find((item) => {
return item.value == 0
})
console.log(item)
if (item) {
return
}
this.activeData.__slot__.options.push({
label: '其他',
value: 0
})
},
addTreeItem() {
++this.idGlobal
this.dialogVisible = true
@ -975,53 +1008,66 @@ export default {
<style lang="scss" scoped>
@import '@/assets/styles/form/index';
.right-board {
width: 350px;
position: absolute;
right: 17px;
top: 0;
padding-top: 3px;
background-color: #FFFFFF;
.field-box {
position: relative;
height: calc(100vh - 242px);
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;
}
@ -1030,6 +1076,7 @@ export default {
.node-label {
font-size: 14px;
}
.node-icon {
color: #bebfc3;
}

2
src/views/form/editor.vue

@ -280,9 +280,9 @@ export default {
this.activeData = tempActiveData
this.activeId = this.idGlobal
}
this.onItemEnd(obj)
},
onItemEnd(obj) {
console.log(obj)
let params = {'projectKey': this.projectKey}
if (this.drawingList[obj.newIndex - 1]) {
let sort1 = this.drawingList[obj.newIndex - 1].sort

7
src/views/project/MyProject.vue

@ -69,6 +69,7 @@
<div v-if="dataShowType=='gird'" class="project-grid-container">
<div
v-if="projectList.length"
v-loading="projectListLoading"
class="project-grid-view"
>
<div v-for="p in projectList" :key="p.id" class="project-grid-item-view pointer" :span="4">
@ -194,6 +195,7 @@
</template>
<script>
import DataEmpty from '@/components/DataEmpty'
let projectStatusList = [
{code: 1, name: '未发布', color: '#006EFF'},
{code: 2, name: '收集中', color: '#34C82A'},
@ -216,7 +218,8 @@ export default {
status: null
},
projectStatusList: projectStatusList,
projectList: []
projectList: [],
projectListLoading: true
}
},
computed: {
@ -241,6 +244,7 @@ export default {
this.$router.push({path: '/project/form', query: {key: key, active: type}})
},
queryProjectPage() {
this.$api.get('/user/project/page', {
params: this.queryParams
}).then(res => {
@ -248,6 +252,7 @@ export default {
this.projectList = records
this.total = total
this.queryParams.size = size
this.projectListLoading = false
})
}
}

28
src/views/test.vue

@ -1,23 +1,26 @@
<template>
<div>
<Verify
ref="verify"
:mode="'pop'"
:captcha-type="'blockPuzzle'"
:img-size="{ width: '330px', height: '155px' }"
@success="success"
/>
<button @click="useVerify">调用验证组件</button>
<el-radio-group v-model="radio">
<el-radio :label="3">备选项</el-radio>
<el-radio :label="6">备选项</el-radio>
<el-radio :label="9">备选项</el-radio>
<el-radio :label="0">其他<input/>
</el-radio>
</el-radio-group>
</div>
</template>
<script>
//
import Verify from '@/components/verifition/Verify'
// import Verify from '@/components/verifition/Verify'
export default {
name: 'App',
components: {
Verify
},
data() {
return {
radio: 3
}
},
created() {
},
@ -34,3 +37,8 @@ export default {
}
}
</script>
<style scoped>
.el-radio {
display: block;
}
</style>

Loading…
Cancel
Save