Răsfoiți Sursa

Merge branches 'master' and 'master' of http://119.23.210.103:3000/wy/mj_firm_former

zhangjingyuan 3 ani în urmă
părinte
comite
0b9064b8cd

+ 4 - 0
src/business/platform/form/formbuilder/constants/helpTip.js

@@ -159,6 +159,10 @@ export default {
     title: '关于多选',
     content: '此属性用于限制填写可以选择多个值,还是只能选中一个值。'
   },
+  allowCreate: {
+    title: '关于可添加',
+    content: '此属性用于限制是否支持搜索和允许用户添加新选项,仅数据来源为静态数据时生效'
+  },
   datasource: {
     title: '关于选项数据值来源',
     content: `此属性用于设置选项数据值来源是自定义固定的选项值/标签【静态数据】,还是通过【数据模版】的【值来源】类型。`

+ 412 - 339
src/business/platform/form/formbuilder/right-aside/editors/editor-options.vue

@@ -1,359 +1,432 @@
 <template>
-  <div class="panel panel-default">
-    <div class="panel-heading">选项配置</div>
+    <div class="panel panel-default">
+        <div class="panel-heading">选项配置</div>
+        <div class="panel-body">
+            <el-form-item v-if="fieldType === 'select'">
+                <template slot="label">是否多选<help-tip prop="multiple" /></template>
+                <el-switch v-model="fieldOptions.multiple" @change="setSelectDefaultValue" />
+            </el-form-item>
+            <el-radio-group
+                v-model="fieldOptions.datasource"
+                size="mini"
+                style="margin-bottom: 10px;"
+            >
+                <el-radio-button
+                    v-for="item in datasourceOptions"
+                    :key="item.value"
+                    :label="item.value"
+                >{{ item.label }}</el-radio-button>
+            </el-radio-group>
+            <help-tip prop="datasource" />
+            <!---=================自定义=============---->
+            <div v-if="datasource === 'custom' || !datasource">
+                <!-- 下拉框静态数据新增是否可创建 -->
+                <el-form-item v-if="fieldType === 'select'" class="label">
+                    <template slot="label">是否可添加<help-tip prop="allowCreate" /></template>
+                    <el-switch v-model="fieldOptions.allowCreate"/>
+                </el-form-item>
+                <vue-draggable
+                    v-model="itemOptions"
+                    v-bind="draggableOptions"
+                    class="list-group"
+                    @start="isDragging = true"
+                    @end="() => { isDragging = false }"
+                >
+                    <div
+                        v-for="(opt, i) in itemOptions"
+                        :key="i"
+                        class="list-group-item"
+                    >
+                        <div class="actions-left">
+                            <el-tooltip content="设为默认值">
+                                <el-checkbox v-if="fieldType === 'checkbox' || (fieldType === 'select' && fieldOptions.multiple)" v-model="opt.checked"/>
+                                <el-radio
+                                    v-else
+                                    v-model="defaultValue"
+                                    :label="i"
+                                    @click.native.prevent="handleDefaultValue(i)"
+                                ><span>&nbsp;&nbsp;</span></el-radio>
+                            </el-tooltip>
+                            <el-input
+                                v-model="opt.val"
+                                size="mini"
+                                placeholder="选项值"
+                            />
+                            <el-input
+                                v-model="opt.label"
+                                size="mini"
+                                placeholder="选项标签"
+                            />
+                        </div>
+                        <el-button-group class="actions">
+                            <el-button
+                                size="small"
+                                type="text"
+                                title="添加"
+                                icon="ibps-icon-add"
+                                @click="addOption(i)"
+                            />
+                            <el-button
+                                size="small"
+                                type="text"
+                                title="删除"
+                                icon="el-icon-delete"
+                                @click="removeOption(i)"
+                            />
+                            <el-button
+                                class="draggable"
+                                title="拖动排序"
+                                data-role="sort_choice"
+                                size="small"
+                                type="text"
+                                icon="ibps-icon-arrows"
+                            />
+                        </el-button-group>
+                    </div>
+                </vue-draggable>
+                <div class="more-actions">
+                    <div class="el-button el-button--text" @click="addOption">添加选项</div>
+                    <el-divider direction="vertical" />
+                    <div class="el-button el-button--text" @click="editOption">编辑选项</div>
+                    <el-divider direction="vertical" />
+                    <div class="el-button el-button--text" @click="optionTemplate">选项模版</div>
+                </div>
 
-    <div class="panel-body">
-      <el-form-item v-if="fieldType==='select'">
-        <template slot="label">是否多选<help-tip prop="multiple" /></template>
-        <el-switch
-          v-model="fieldOptions.multiple"
-          @change="setSelectDefaultValue"
-        />
-      </el-form-item>
-      <el-radio-group v-model="fieldOptions.datasource" size="mini" style="margin-bottom:10px;">
-        <el-radio-button
-          v-for="item in datasourceOptions"
-          :key="item.value"
-          :label="item.value"
-        >{{ item.label }}</el-radio-button>
-      </el-radio-group>
-      <help-tip prop="datasource" />
-      <!---=================自定义=============---->
-      <div v-if="datasource === 'custom' || !datasource ">
-        <vue-draggable
-          v-model="itemOptions"
-          v-bind="draggableOptions"
-          class="list-group"
-          @start="isDragging = true"
-          @end="()=>{isDragging= false}"
-        >
-          <div v-for="(opt,i) in itemOptions" :key="i" class="list-group-item">
-            <div class="actions-left">
-              <el-tooltip content="设为默认值">
-                <el-checkbox v-if="(fieldType==='checkbox' || (fieldType==='select' && fieldOptions.multiple))" v-model="opt.checked" />
-                <el-radio v-else v-model="defaultValue" :label="i" @click.native.prevent="handleDefaultValue(i)"><span>&nbsp;&nbsp;</span></el-radio>
-              </el-tooltip>
-              <el-input v-model="opt.val" size="mini" placeholder="选项值" />
-              <el-input v-model="opt.label" size="mini" placeholder="选项标签" />
+                <option-template
+                    :visible="optionTemplateVisible"
+                    :title="title"
+                    :options="choices"
+                    :is-template="isTemplate"
+                    @close="visible => optionTemplateVisible = visible"
+                    @callback="handleOptions"
+                />
             </div>
-            <el-button-group class="actions">
-              <el-button size="small" type="text" title="添加" icon="ibps-icon-add" @click="addOption(i)" />
-              <el-button size="small" type="text" title="删除" icon="el-icon-delete" @click="removeOption(i)" />
-              <el-button class="draggable" title="拖动排序" data-role="sort_choice" size="small" type="text" icon="ibps-icon-arrows" />
-            </el-button-group>
-          </div>
-        </vue-draggable>
-        <div class="more-actions">
-          <div class="el-button el-button--text" @click="addOption">添加选项 </div>
-          <el-divider direction="vertical" />
-          <div class="el-button el-button--text" @click="editOption">编辑选项 </div>
-          <el-divider direction="vertical" />
-          <div class="el-button el-button--text" @click="optionTemplate">选项模版 </div>
-        </div>
-
-        <option-template
-          :visible="optionTemplateVisible"
-          :title="title"
-          :options="choices"
-          :is-template="isTemplate"
-          @close="visible => optionTemplateVisible = visible"
-          @callback="handleOptions"
-        />
-      </div>
-      <!---=================值来源=============---->
-      <template v-else-if="datasource === 'valuesource'">
-        <el-form-item>
-          <template slot="label">值来源<help-tip prop="valueSource" /></template>
-          <ibps-data-template-selector2
-            v-model="fieldOptions.value_source"
-            placeholder="请选择值来源"
-            style="width:100%;"
-            @change="changeDataTemplateSelector"
-          />
-        </el-form-item>
-        <el-form-item>
-          <div slot="label">关联配置<help-tip prop="linkConfig" /></div>
-          <div class="el-form-item__content">
-            <el-button :disabled="disabledResultColumns" style="width:100%;" type="primary" size="mini" plain @click="settingDataTemplateConfig('value_source')">设置关联配置</el-button>
-          </div>
-        </el-form-item>
-        <el-form-item v-if="$utils.isNotEmpty(dynamicConditions)">
-          <div slot="label">动态参数<help-tip prop="dynamicCondition" /></div>
-          <div class="el-form-item__content">
-            <el-button :disabled="disabledDynamicConditions" style="width:100%;" type="primary" size="mini" plain @click="settingDataTemplateCondition('value_source')">设置动态参数</el-button>
-          </div>
-        </el-form-item>
-        <template v-if="fieldType !== 'checkbox' && $utils.isNotEmpty(resultColumns)">
-          <el-form-item>
-            <div slot="label">联动数据<help-tip prop="linkData" /></div>
-            <div class="el-form-item__content">
-              <el-button :disabled="disabledResultColumns" style="width:100%;" type="primary" size="mini" plain @click="settingDataTemplateLinkData('value_source')">设置联动数据</el-button>
-            </div>
-          </el-form-item>
-          <el-form-item>
-            <div slot="label">关联属性<help-tip prop="linkAttr" /></div>
-            <div class="el-form-item__content">
-              <el-button :disabled="disabledResultColumns" style="width:100%;" type="primary" size="mini" plain @click="settingDataTemplateLinkAttr('value_source')">设置关联属性</el-button>
-            </div>
-          </el-form-item>
-        </template>
+            <!---=================值来源=============---->
+            <template v-else-if="datasource === 'valuesource'">
+                <el-form-item>
+                    <template slot="label">值来源<help-tip prop="valueSource" /></template>
+                    <ibps-data-template-selector2
+                        v-model="fieldOptions.value_source"
+                        placeholder="请选择值来源"
+                        style="width: 100%;"
+                        @change="changeDataTemplateSelector"
+                    />
+                </el-form-item>
+                <el-form-item>
+                    <div slot="label">关联配置<help-tip prop="linkConfig" /></div>
+                    <div class="el-form-item__content">
+                        <el-button
+                            :disabled="disabledResultColumns"
+                            style="width: 100%;"
+                            type="primary"
+                            size="mini"
+                            plain
+                            @click="settingDataTemplateConfig('value_source')"
+                        >设置关联配置</el-button>
+                    </div>
+                </el-form-item>
+                <el-form-item v-if="$utils.isNotEmpty(dynamicConditions)">
+                    <div slot="label">动态参数<help-tip prop="dynamicCondition" /></div>
+                    <div class="el-form-item__content">
+                        <el-button
+                            :disabled="disabledDynamicConditions"
+                            style="width: 100%;"
+                            type="primary"
+                            size="mini"
+                            plain
+                            @click="settingDataTemplateCondition('value_source')"
+                        >设置动态参数</el-button>
+                    </div>
+                </el-form-item>
+                <template v-if="fieldType !== 'checkbox' && $utils.isNotEmpty(resultColumns)">
+                    <el-form-item>
+                        <div slot="label">联动数据<help-tip prop="linkData" /></div>
+                        <div class="el-form-item__content">
+                            <el-button
+                                :disabled="disabledResultColumns"
+                                style="width: 100%;"
+                                type="primary"
+                                size="mini"
+                                plain
+                                @click="settingDataTemplateLinkData('value_source')"
+                            >设置联动数据</el-button>
+                        </div>
+                    </el-form-item>
+                    <el-form-item>
+                        <div slot="label">关联属性<help-tip prop="linkAttr" /></div>
+                        <div class="el-form-item__content">
+                            <el-button
+                                :disabled="disabledResultColumns"
+                                style="width: 100%;"
+                                type="primary"
+                                size="mini"
+                                plain
+                                @click="settingDataTemplateLinkAttr('value_source')"
+                            >设置关联属性</el-button>
+                        </div>
+                    </el-form-item>
+                </template>
 
-        <!--数据模版-参数配置-->
-        <data-template-config
-          :visible="dataTemplateConfigVisible"
-          :columns="resultColumns"
-          :data="fieldItem.field_options.link_config"
-          @callback="setDataTemplateConfig"
-          @close="visible => dataTemplateConfigVisible = visible"
-        />
+                <!--数据模版-参数配置-->
+                <data-template-config
+                    :visible="dataTemplateConfigVisible"
+                    :columns="resultColumns"
+                    :data="fieldItem.field_options.link_config"
+                    @callback="setDataTemplateConfig"
+                    @close="visible => dataTemplateConfigVisible = visible"
+                />
 
-        <!--数据模版-动态参数配置-->
-        <data-template-condition
-          :visible="dataTemplateConditionVisible"
-          :conditions="dynamicConditions"
-          :data="fieldItem.field_options.link_condition"
-          :fields="formFields"
-          @callback="setDataTemplateCondition"
-          @close="visible => dataTemplateConditionVisible = visible"
-        />
+                <!--数据模版-动态参数配置-->
+                <data-template-condition
+                    :visible="dataTemplateConditionVisible"
+                    :conditions="dynamicConditions"
+                    :data="fieldItem.field_options.link_condition"
+                    :fields="formFields"
+                    @callback="setDataTemplateCondition"
+                    @close="visible => dataTemplateConditionVisible = visible"
+                />
 
-        <!--数据模版-联动数据配置-->
-        <data-template-linkdata
-          :visible="dataTemplateLinkDataVisible"
-          :columns="resultColumns"
-          :data="fieldItem.field_options.link_linkage"
-          :fields="formFields"
-          @callback="setDataTemplateLinkData"
-          @close="visible => dataTemplateLinkDataVisible = visible"
-        />
-        <!--数据模版-联动属性配置-->
-        <data-template-linkdata
-          :visible="dataTemplateLinkAttrVisible"
-          :columns="resultColumns"
-          :data="fieldItem.field_options.link_attr"
-          :fields="formLabelFields"
-          @callback="setDataTemplateLinkAttr"
-          @close="visible => dataTemplateLinkAttrVisible = visible"
-        />
-      </template>
+                <!--数据模版-联动数据配置-->
+                <data-template-linkdata
+                    :visible="dataTemplateLinkDataVisible"
+                    :columns="resultColumns"
+                    :data="fieldItem.field_options.link_linkage"
+                    :fields="formFields"
+                    @callback="setDataTemplateLinkData"
+                    @close="visible => dataTemplateLinkDataVisible = visible"
+                />
+                <!--数据模版-联动属性配置-->
+                <data-template-linkdata
+                    :visible="dataTemplateLinkAttrVisible"
+                    :columns="resultColumns"
+                    :data="fieldItem.field_options.link_attr"
+                    :fields="formLabelFields"
+                    @callback="setDataTemplateLinkAttr"
+                    @close="visible => dataTemplateLinkAttrVisible = visible"
+                />
+            </template>
 
-      <!---=================动态数据=============---->
-      <template v-else-if="datasource === 'dynamic'">
-        <el-form-item label-width="0">
-          <el-radio-group v-model="fieldOptions.remoteType">
-            <el-radio :label="variable">赋值变量</el-radio>
-            <el-radio :label="func">动态方法</el-radio>
-          </el-radio-group>
-          <el-input v-model="fieldOptions.remoteValue" :placeholder="fieldOptions.remoteType?'赋值变量key':'动态方法名'" />
-        </el-form-item>
-        <el-form-item label-width="0">
-          <el-input v-model="fieldOptions.remoteValueKey" placeholder="请输入值">
-            <div slot="prepend" style="width:30px;">值</div>
-          </el-input>
-        </el-form-item>
-        <el-form-item label-width="0">
-          <el-input v-model="fieldOptions.remoteLabelKey" placeholder="请输入标签">
-            <div slot="prepend" style="width:30px;">标签</div>
-          </el-input>
-        </el-form-item>
-      </template>
+            <!---=================动态数据=============---->
+            <template v-else-if="datasource === 'dynamic'">
+                <el-form-item label-width="0">
+                    <el-radio-group v-model="fieldOptions.remoteType">
+                        <el-radio :label="variable">赋值变量</el-radio>
+                        <el-radio :label="func">动态方法</el-radio>
+                    </el-radio-group>
+                    <el-input v-model="fieldOptions.remoteValue" :placeholder="fieldOptions.remoteType ? '赋值变量key' : '动态方法名'"/>
+                </el-form-item>
+                <el-form-item label-width="0">
+                    <el-input v-model="fieldOptions.remoteValueKey" placeholder="请输入值">
+                        <div slot="prepend" style="width: 30px;">值</div>
+                    </el-input>
+                </el-form-item>
+                <el-form-item label-width="0">
+                    <el-input v-model="fieldOptions.remoteLabelKey" placeholder="请输入标签">
+                        <div slot="prepend" style="width: 30px;">标签</div>
+                    </el-input>
+                </el-form-item>
+            </template>
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
-import VueDraggable from 'vuedraggable'
-import OptionTemplate from '../components/option-template'
-import EditorMixin from '../mixins/editor'
-import DataTemplateMixin from '../mixins/data-template'
+    import VueDraggable from 'vuedraggable'
+    import OptionTemplate from '../components/option-template'
+    import EditorMixin from '../mixins/editor'
+    import DataTemplateMixin from '../mixins/data-template'
 
-import IbpsDataTemplateSelector2 from '@/business/platform/data/dataTemplate/selector2'
-import DataTemplateConfig from '../components/data-template-config'
-import DataTemplateCondition from '../components/data-template-condition'
-import DataTemplateLinkdata from '../components/data-template-linkdata'
+    import IbpsDataTemplateSelector2 from '@/business/platform/data/dataTemplate/selector2'
+    import DataTemplateConfig from '../components/data-template-config'
+    import DataTemplateCondition from '../components/data-template-condition'
+    import DataTemplateLinkdata from '../components/data-template-linkdata'
 
-export default {
-  components: {
-    VueDraggable,
-    OptionTemplate,
-    IbpsDataTemplateSelector2,
-    DataTemplateConfig,
-    DataTemplateCondition,
-    DataTemplateLinkdata
-  },
-  mixins: [EditorMixin, DataTemplateMixin],
-  data() {
-    return {
-      title: '选项模版',
-      choices: [],
-      isTemplate: false,
-      optionTemplateVisible: false,
-      isDragging: false,
-      datasourceOptions: [{
-        value: 'custom',
-        label: '静态数据'
-      }, {
-        value: 'valuesource',
-        label: '值来源'
-      }
-      // {
-      //   value: 'dynamic',
-      //   label: '动态数据'
-      // }
-      //  {
-      //   key: 'dictionary',
-      //   value: '数据字典'
-      // }
-      ],
-      draggableOptions: {
-        handle: '.draggable',
-        ghostClass: 'sortable-ghost',
-        distance: 1,
-        disabled: false,
-        animation: 200,
-        axis: 'y'
-      },
-      loading: false,
-      dataSourceOptions: []
-    }
-  },
-  computed: {
-    itemOptions: {
-      get() {
-        return this.fieldOptions.options || []
-      },
-      set(val) {
-        this.fieldOptions.options = val
-      }
-    },
-    datasource() {
-      return this.fieldOptions.datasource || 'custom'
-    },
-    defaultValue: {
-      get() {
-        const defaultOption = this.fieldOptions.options.findIndex((option) => option.checked === true)
-        return defaultOption !== -1 ? defaultOption : void 0
-      },
-      set(value) {
-        this.fieldOptions.options.forEach((option, i) => {
-          option.checked = i === value
-        })
-        this.handleOptions(JSON.parse(JSON.stringify(this.fieldOptions.options)))
-      }
+    export default {
+        components: {
+            VueDraggable,
+            OptionTemplate,
+            IbpsDataTemplateSelector2,
+            DataTemplateConfig,
+            DataTemplateCondition,
+            DataTemplateLinkdata
+        },
+        mixins: [EditorMixin, DataTemplateMixin],
+        data() {
+            return {
+                title: '选项模版',
+                choices: [],
+                isTemplate: false,
+                optionTemplateVisible: false,
+                isDragging: false,
+                datasourceOptions: [
+                    {
+                        value: 'custom',
+                        label: '静态数据'
+                    },
+                    {
+                        value: 'valuesource',
+                        label: '值来源'
+                    }
+                    // {
+                    //     value: 'dynamic',
+                    //     label: '动态数据'
+                    // },
+                    // {
+                    //     key: 'dictionary',
+                    //     value: '数据字典'
+                    // }
+                ],
+                draggableOptions: {
+                    handle: '.draggable',
+                    ghostClass: 'sortable-ghost',
+                    distance: 1,
+                    disabled: false,
+                    animation: 200,
+                    axis: 'y'
+                },
+                loading: false,
+                dataSourceOptions: []
+            }
+        },
+        computed: {
+            itemOptions: {
+                get() {
+                    return this.fieldOptions.options || []
+                },
+                set(val) {
+                    this.fieldOptions.options = val
+                }
+            },
+            datasource() {
+                return this.fieldOptions.datasource || 'custom'
+            },
+            defaultValue: {
+                get() {
+                    const defaultOption = this.fieldOptions.options.findIndex(option => option.checked === true)
+                    return defaultOption !== -1 ? defaultOption : void 0
+                },
+                set(value) {
+                    this.fieldOptions.options.forEach((option, i) => {
+                        option.checked = i === value
+                    })
+                    this.handleOptions(JSON.parse(JSON.stringify(this.fieldOptions.options)))
+                }
+            }
+        },
+        methods: {
+            addOption(i = -1, type) {
+                const newOption = {
+                    val: '',
+                    label: '选项',
+                    disabled: false
+                }
+                if (i > -1) {
+                    this.itemOptions.splice(i + 1, 0, newOption)
+                } else {
+                    this.itemOptions.push(newOption)
+                }
+            },
+            removeOption(i) {
+                this.itemOptions.splice(i, 1)
+            },
+            editOption() {
+                this.title = '编辑选项'
+                this.choices = JSON.parse(JSON.stringify(this.itemOptions))
+                this.isTemplate = false
+                this.optionTemplateVisible = true
+            },
+            optionTemplate(i) {
+                this.title = '选项模版'
+                this.choices = []
+                this.isTemplate = true
+                this.optionTemplateVisible = true
+            },
+            handleOptions(data) {
+                this.itemOptions = data
+            },
+            setSelectDefaultValue() {
+                this.itemOptions.forEach(option => {
+                    option.checked = false
+                })
+                this.setDefaultValue()
+            },
+            handleDefaultValue(value) {
+                const defaultOption = this.itemOptions.findIndex(option => option.checked === true)
+                this.defaultValue = defaultOption !== value ? value : void 0
+            },
+            changeDataTemplateSelector(data, val, oldVal) {
+                if (data && val !== oldVal) {
+                    this.setDefaultValue()
+                    this.setDataTemplateDefaultValue()
+                }
+                this.changeDataSource(val, 'value_source')
+            }
+        }
     }
-  },
-  methods: {
-    addOption(i = -1, type) {
-      const newOption = {
-        val: '',
-        label: '选项',
-        disabled: false
-      }
-      if (i > -1) {
-        this.itemOptions.splice(i + 1, 0, newOption)
-      } else {
-        this.itemOptions.push(newOption)
-      }
-    },
-    removeOption(i) {
-      this.itemOptions.splice(i, 1)
-    },
-    editOption() {
-      this.title = '编辑选项'
-      this.choices = JSON.parse(JSON.stringify(this.itemOptions))
-      this.isTemplate = false
-      this.optionTemplateVisible = true
-    },
-    optionTemplate(i) {
-      this.title = '选项模版'
-      this.choices = []
-      this.isTemplate = true
-      this.optionTemplateVisible = true
-    },
-    handleOptions(data) {
-      this.itemOptions = data
-    },
-    setSelectDefaultValue() {
-      this.itemOptions.forEach((option) => {
-        option.checked = false
-      })
-      this.setDefaultValue()
-    },
-    handleDefaultValue(value) {
-      const defaultOption = this.itemOptions.findIndex((option) => option.checked === true)
-      this.defaultValue = defaultOption !== value ? value : void 0
-    },
-    changeDataTemplateSelector(data, val, oldVal) {
-      if (data && val !== oldVal) {
-        this.setDefaultValue()
-        this.setDataTemplateDefaultValue()
-      }
-      this.changeDataSource(val, 'value_source')
-    }
-  }
-}
 </script>
 <style lang="scss" scoped>
-  .list-group {
-    display: flex;
-    flex-direction: column;
-    padding-left: 0;
-    margin-bottom: 0;
-  .list-group-item {
-    position: relative;
-    display: block;
-    padding: 5px;
-    margin-bottom: -1px;
-    .actions-left{
-      height: 24px;
-      line-height: 24px;
-      .el-input {
-        display: inline-block;
-        width: 34%;
-        vertical-align: middle;
-        padding-right: 10px;
-      }
-      .el-checkbox{
-        margin-right: 10px;
-      }
-      .el-radio{
-        margin-right: 0px;
-      }
+    .list-group {
+        display: flex;
+        flex-direction: column;
+        padding-left: 0;
+        margin-bottom: 0;
+        .list-group-item {
+            position: relative;
+            display: block;
+            padding: 5px;
+            margin-bottom: -1px;
+            .actions-left {
+                height: 24px;
+                line-height: 24px;
+                .el-input {
+                    display: inline-block;
+                    width: 34%;
+                    vertical-align: middle;
+                    padding-right: 10px;
+                }
+                .el-checkbox {
+                    margin-right: 10px;
+                }
+                .el-radio {
+                    margin-right: 0px;
+                }
+            }
+            .actions {
+                position: absolute;
+                width: 60px;
+                top: 2px;
+                right: 0;
+                line-height: 20px;
+                padding-left: 1px;
+                .el-button {
+                    padding-right: 4px;
+                    margin-right: 2px;
+                }
+                [data-role='sort_choice'] {
+                    cursor: move;
+                }
+            }
+        }
+        .no-move {
+            transition: transform 0s;
+        }
+        .sortable-ghost {
+            opacity: 0.5;
+            background: #c8ebfb;
+        }
     }
-
-    .actions {
-      position: absolute;
-      width: 60px;
-      top: 2px;
-      right: 0;
-      line-height: 20px;
-      padding-left: 1px;
-      .el-button {
-        padding-right: 4px;
-        margin-right: 2px;
-      }
-      [data-role="sort_choice"]{
-          cursor: move
-      }
+    .more-actions {
+        text-align: right;
+        margin-top: 5px;
+        margin-right: 10px;
+        .el-button {
+            padding-right: 0;
+            margin-right: 0;
+        }
     }
-  }
-
-  .no-move {
-    transition: transform 0s;
-  }
-  .sortable-ghost {
-    opacity: 0.5;
-    background: #c8ebfb;
-  }
-}
-  .more-actions {
-    text-align: right;
-    margin-top: 5px;
-    margin-right:10px;
-    .el-button {
-      padding-right: 0;
-      margin-right: 0;
+    .label {
+        ::v-deep .el-form-item__label {
+            width: 100px !important;
+        }
     }
-  }
-
 </style>

+ 76 - 121
src/business/platform/form/formrender/dynamic-form/dynamic-form-field.vue

@@ -3,9 +3,7 @@
         <!-- 单行文本、 多行文本、数字-->
         <template v-if="fieldType === 'text' || fieldType === 'textarea' || fieldType === 'number'">
             <template v-if="readonlyText">
-                <div :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
-                    {{ dataModel || '/' }}
-                </div>
+                <div :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">{{ dataModel || '/' }}</div>
             </template>
 
             <el-dropdown
@@ -16,13 +14,15 @@
                 trigger="click"
                 @command="handleCommand"
             >
-                <!-- <el-dropdown
-                    v-else-if="fieldType==='text'||fieldType==='textarea'"  :style="{width:width}" size="mini"
-                    placement="top-start"
-                    trigger="click"
-                    @click.native="reqPhrase($store.getters.userInfo.employee.groupID,field)"
-                    @command="handleCommand"
-                > -->
+            <!-- <el-dropdown
+                v-else-if="fieldType==='text'||fieldType==='textarea'"
+                :style="{width:width}"
+                size="mini"
+                @click.native="reqPhrase($store.getters.userInfo.employee.groupID,field)"
+                placement="top-start"
+                trigger="click"
+                @command="handleCommand"
+            > -->
                 <el-input
                     v-model="dataModel"
                     :placeholder="placeholder"
@@ -99,9 +99,7 @@
         <!-- 单项选择 -->
         <template v-else-if="fieldType === 'radio'">
             <template v-if="readonlyText">
-                <div
-                    v-if="$utils.isNotEmpty(dataModel)"
-                    :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
+                <div v-if="$utils.isNotEmpty(dataModel)" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
                     {{ dataModel | optionsFilter(dataOptions, 'label', 'val') }}
                 </div>
                 <div v-else :class="isTable ? '' : 'ibps-field-text-no'">/</div>
@@ -132,35 +130,28 @@
             <template v-if="readonlyText">
                 <template v-if="checkboxDataModel && checkboxDataModel.length > 0">
                     <div :class="isTable ? '' : readonlyText ? 'ibps-field-text' : ''">
-                        <span
-                            v-for="(v, i) in checkboxDataModel"
-                            :key="i"
-                            class="ibps-mr-5"
-                        >
+                        <span v-for="(v, i) in checkboxDataModel" :key="i" class="ibps-mr-5">
                             {{ v | optionsFilter(dataOptions, 'label', 'val') }}
                         </span>
                     </div>
                 </template>
             </template>
-            <el-checkbox-group
-                v-else
-                v-model="checkboxDataModel"
-                v-on="$listeners"
-            >
+            <el-checkbox-group v-else v-model="checkboxDataModel" v-on="$listeners">
                 <component
                     :is="fieldOptions.button ? 'el-checkbox-button' : 'el-checkbox'"
                     v-for="o in dataOptions"
                     :key="o.val"
                     :label="o.val"
                     :border="fieldOptions.border"
-                    :style="{display: fieldOptions.arrangement === 'vertical' ? 'block' : null}">
+                    :style="{ display: fieldOptions.arrangement === 'vertical' ? 'block' : null }"
+                >
                     {{ o.label }}
                 </component>
             </el-checkbox-group>
         </template>
 
         <!-- <div v-else-if="fieldType === 'customDialog' && readonlyText && !dataModel"  :class="isTable ? '' :'ibps-field-text-no'">/</div>
-        <ibps-custom-dialog v-else-if="fieldType === 'customDialog'" :class="isTable ? '' : readonlyText ? 'ibps-field-text' :''" -->
+        <ibps-custom-dialog v-else-if="fieldType === 'customDialog'" :class="isTable ? '' : readonlyText ? 'ibps-field-text' :''"></ibps-custom-dialog> -->
 
         <!-- 下拉框 -->
         <div v-else-if="fieldType === 'select' && readonlyText && !dataModel" :class="isTable ? '' : 'ibps-field-text-no'">/</div>
@@ -169,11 +160,7 @@
                 <template v-if="multipleSelect">
                     <template v-if="selectDataModel && selectDataModel.length > 0">
                         <div :class="isTable ? '' : readonlyText ? 'ibps-field-text' : ''">
-                            <span
-                                v-for="(v, i) in selectDataModel"
-                                :key="i"
-                                class="ibps-mr-5"
-                            >
+                            <span v-for="(v, i) in selectDataModel" :key="i" class="ibps-mr-5">
                                 {{ v | optionsFilter(dataOptions, 'label', 'val') }}
                             </span>
                         </div>
@@ -196,20 +183,17 @@
                 :style="{ width: width }"
                 :multiple="multipleSelect"
                 :clearable="clearable"
+                :filterable="allowCreate"
+                :allow-create="allowCreate"
                 v-on="$listeners"
             >
-                <el-option
-                    v-for="o in dataOptions"
-                    :key="o.val"
-                    :label="o.label"
-                    :value="o.val"
-                />
+                <el-option v-for="o in dataOptions" :key="o.val" :label="o.label" :value="o.val" />
             </el-select>
         </template>
         <!-- 开关 -->
         <template v-else-if="fieldType === 'switch'">
             <template v-if="readonlyText">
-                <el-tag v-if="$utils.isNotEmpty(dataModel)" :class=" isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
+                <el-tag v-if="$utils.isNotEmpty(dataModel)" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
                     {{ dataModel | optionsFilter(switchOptions, 'label', 'val') }}
                 </el-tag>
             </template>
@@ -260,9 +244,7 @@
         <!-- 评分 -->
         <template v-else-if="fieldType === 'rate'">
             <template v-if="readonlyText">
-                <div :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
-                    {{ dataModel || '/' }}
-                </div>
+                <div :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">{{ dataModel || '/' }}</div>
             </template>
             <el-rate
                 v-else
@@ -276,12 +258,12 @@
                 v-on="$listeners"
             />
         </template>
+
         <!-- <div v-else-if="fieldType === 'customDialog' && readonlyText && !dataModel"  :class="isTable ? '' :'ibps-field-text-no'">/</div>
         <ibps-custom-dialog v-else-if="fieldType === 'customDialog'" :class="isTable ? '' : readonlyText ? 'ibps-field-text' :''"></ibps-custom-dialog> -->
 
         <!-- 日期控件 -->
-        <template
-            v-else-if="fieldType === 'datePicker' || fieldType === 'currentTime' || fieldType === 'currentDate'">
+        <template v-else-if="fieldType === 'datePicker' || fieldType === 'currentTime' || fieldType === 'currentDate'">
             <div v-if="readonlyText" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
                 {{ dataModel | dateFormat(datefmt, datefmt) || '/' }}
             </div>
@@ -319,7 +301,11 @@
         <!-- =======================增强字段==============================-->
         <!--富文本框-->
         <template v-else-if="fieldType === 'editor'">
-            <div v-if="readonlyText" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'" v-html="$utils.formatText(dataModel)"/>
+            <div
+                v-if="readonlyText"
+                :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'"
+                v-html="$utils.formatText(dataModel)"
+            ></div>
             <ibps-ueditor
                 v-else
                 v-model="dataModel"
@@ -359,9 +345,7 @@
                 :readonly-text="readonlyText"
                 v-on="$listeners"
             />
-            <div v-if="readonlyText" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
-                {{ dataModel || '/' }}
-            </div>
+            <div v-if="readonlyText" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">{{ dataModel || '/' }}</div>
         </template>
 
         <!-- 上传附件-->
@@ -464,9 +448,7 @@
                 :style="{ width: width }"
                 v-on="$listeners"
             />
-            <div v-if="fieldOptions.is_street && readonlyText" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
-                {{ streetValue || '/' }}
-            </div>
+            <div v-if="fieldOptions.is_street && readonlyText" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">{{ streetValue || '/' }}</div>
             <template v-else>
                 <p></p>
                 <el-input
@@ -578,7 +560,7 @@
         </Dictionaryitem>
         <!-- =======================其它字段==============================-->
         <!-- 文本-->
-        <span v-else-if="fieldType === 'label'" :class=" isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
+        <span v-else-if="fieldType === 'label'" :class="isTable ? '' : dataModel ? 'ibps-field-text' : 'ibps-field-text-no'">
             <template v-if="value">{{ value || '/' }}</template>
             <template v-else>{{ placeholder || '/' }}</template>
         </span>
@@ -629,7 +611,7 @@
             Dictionaryitem: Dictionaryitem
         },
         filters: {
-            //定义过滤器
+            // 定义过滤器
             ellipsis(value) {
                 if (!value) return ''
                 if (value.length > 40) {
@@ -646,7 +628,8 @@
                 type: Boolean,
                 default: false
             },
-            formData: [Object, Array], // 所有字段数据,(包含主主子表)
+            // 所有字段数据,(包含主主子表)
+            formData: [Object, Array],
             field: {
                 type: Object,
                 required: true
@@ -659,8 +642,10 @@
                 type: String,
                 default: 'text'
             },
-            code: String, // 表名
-            row: [String, Number], // 子表行数
+            // 表名
+            code: String,
+            // 子表行数
+            row: [String, Number],
             params: {
                 type: Object
             }
@@ -796,9 +781,7 @@
                     return (this.fieldOptions['datefmt'] || FormOptions.t.DATE_FORMATS['date'])
                 }
             },
-            /**
-             * 日期格式处理
-             */
+            // 日期格式处理
             dateDealFmt() {
                 return DateFormatUtil.dealFmt(this.datefmt)
             },
@@ -811,45 +794,35 @@
                 // 根据自定义日期格式的配置
                 return this.dateDealFmt.dateType || 'datetime'
             },
-            /**
-             * 单选、多选、下拉等选项
-             */
+            // 单选、多选、下拉等选项
             dataOptions() {
                 return this.field.field_options['options'] || this.ajaxOptions
             },
-            /**
-             * switch选项
-             */
+            // switch选项
             switchOptions() {
                 return FormUtils.getSwitchOptions(this.field.field_options)
             },
-            /**
-             *  占位符
-             */
+            // 占位符
             placeholder() {
                 return !this.readonly ? this.fieldOptions['placeholder'] : ''
             },
-            /**
-             * 下拉占位符
-             */
+            // 下拉占位符
             dropdownPlaceholder() {
                 return this.$utils.isNotEmpty(this.placeholder) ? this.fieldOptions['include_blank_value'] || this.placeholder : ''
             },
-            /**
-             * 选择类型占位符
-             */
+            // 选择类型占位符
             selectPlaceholder() {
                 return this.$utils.isNotEmpty(this.placeholder) ? this.placeholder : '请选择'
             },
-            /**
-             * 可清空
-             */
+            // 可清空
             clearable() {
                 return this.$utils.toBoolean(this.fieldOptions['clearable'], true)
             },
-            /**
-             * 编辑器按钮
-             */
+            // 下拉是否允许创建,仅数据来源为静态数据时生效
+            allowCreate() {
+                return this.fieldOptions['allowCreate'] && this.fieldOptions['datasource'] === 'custom'
+            },
+            // 编辑器按钮
             ueditorConfig() {
                 const config = {
                     initialContent: this.placeholder,
@@ -862,18 +835,13 @@
                 }
                 return config
             },
-            /**
-             * 最大文件上传
-             */
+            // 最大文件上传
             maxFileSize() {
                 return this.$utils.isNotEmpty(this.fieldOptions.max_file_size) ? this.fieldOptions.max_file_size * 1024 * 1024 : null
             },
-            /**
-             * 最大文件个数
-             */
+            // 最大文件个数
             fileQuantity() {
-                if (this.$utils.isNotEmpty(this.fieldOptions.max_file_quantity) && (this.fieldOptions.max_file_quantity !== '-1' || this.fieldOptions.max_file_quantity !== -1)
-                ) {
+                if (this.$utils.isNotEmpty(this.fieldOptions.max_file_quantity) && (this.fieldOptions.max_file_quantity !== '-1' || this.fieldOptions.max_file_quantity !== -1)) {
                     return parseInt(this.fieldOptions.max_file_quantity, 10)
                 } else {
                     return null
@@ -904,7 +872,7 @@
                 }
                 const x = FILE_TYPES[mediaType]
                 if (x) {
-                    return x.map((v) => {
+                    return x.map(v => {
                         return '.' + v
                     })
                 } else {
@@ -914,21 +882,15 @@
             bindId() {
                 return this.fieldOptions['bind_id'] || ''
             },
-            /**
-             * 是否多选[字符串]
-             */
+            // 是否多选[字符串]
             multipleString() {
                 return this.$utils.toBoolean(this.fieldOptions['multiple'] === 'Y', true)
             },
-            /**
-             * 是否多选
-             */
+            // 是否多选
             multiple() {
                 return this.$utils.toBoolean(this.fieldOptions['multiple'], true)
             },
-            /**
-             * 是否多选
-             */
+            // 是否多选
             multipleSelect() {
                 return this.$utils.toBoolean(this.fieldOptions['multiple'], false)
             },
@@ -1020,7 +982,7 @@
             }
         },
         methods: {
-            /* 日期格式调整*/
+            // 日期格式调整
             selectTime(val) {
                 let date = new Date(new Date())
                 let year = date.getFullYear()
@@ -1037,7 +999,7 @@
                     this.dataModel = val + '-01-01'
                 }
             },
-            /* 获取当前时间*/
+            // 获取当前时间
             trans(val) {
                 return val < 10 ? '0' + val : val
             },
@@ -1057,10 +1019,10 @@
                     return
                 }
                 const template = this.dataTemplate.templates[0]
-                queryDataTable(this.getValuesourceParams(template, this.dataTemplate)).then((resp) => {
+                queryDataTable(this.getValuesourceParams(template, this.dataTemplate)).then(resp => {
                     const data = resp.data || {}
                     const dataResult = data.dataResult || []
-                    const options = dataResult.map((item) => {
+                    const options = dataResult.map(item => {
                         return {
                             val: item[this.valueKey],
                             label: item[this.labelKey]
@@ -1086,7 +1048,9 @@
                 const fieldObj = field ? field.split('.') : [] // 改变的字段
                 const selectorData = JSON.parse(JSON.stringify(data))
                 const targetValues = []
-                selectorData.forEach((s) => {targetValues.push(s[bind])})
+                selectorData.forEach(s => {
+                    targetValues.push(s[bind])
+                })
                 const targetString = targetValues.join(',')
                 if (this.$utils.isNotEmpty(fieldObj)) {
                     const fieldName = fieldObj.length > 1 ? fieldObj[1] : fieldObj[0]
@@ -1095,9 +1059,7 @@
                     }
                 }
             },
-            /**
-             * 联动数据
-             */
+            // 联动数据
             handleLinkageData(value, data) {
                 if (this.multipleString) {
                     return
@@ -1118,9 +1080,7 @@
                     }
                 }
             },
-            /**
-             *  联动属性
-             */
+            // 联动属性
             handleLinkageAttr(value, data) {
                 if (this.multipleString) {
                     return
@@ -1141,9 +1101,7 @@
                     }
                 }
             },
-            /**
-             * 选择器绑定id
-             */
+            // 选择器绑定id
             selectorBindCallback(value) {
                 const bindId = this.bindId
                 if (this.$utils.isEmpty(bindId)) {
@@ -1152,13 +1110,11 @@
                 }
                 this.changeFormData(bindId, value || '')
             },
-            /**
-             * 更新字段值(主表或其他子表)
-             */
+            // 更新字段值(主表或其他子表)
             changeFormData(name, value) {
                 this.$emit('change-data', name, value)
             },
-            /* 请求记忆数据库 */
+            // 请求记忆数据库
             reqPhrase(orderId, field) {
                 if (!this.watchKey || this.inputKey != field.name + field.field_text) {
                     this.watchKey = true
@@ -1170,11 +1126,11 @@
                             attrName: this.inputKey,
                             orderId: orderId
                         })
-                    }).then((response) => {
+                    }).then(response => {
                         if (response.state === 200) {
                             this.selectModel = response.variables.page
                         }
-                    }).catch((error) => {
+                    }).catch(error => {
                         this.$message.error('系统忙、或数据错误,请稍后再试')
                     })
                 }
@@ -1200,7 +1156,7 @@
                         url: BPMN_URL() + '/sys/SysDataContext/deleteDataContext',
                         method: 'post',
                         data: JSON.stringify({ uuId: id })
-                    }).then((response) => {
+                    }).then(response => {
                         this.menuHide = true
                         if (response.state === 200) {
                             this.$message({
@@ -1213,7 +1169,7 @@
                                 }
                             })
                         }
-                    }).catch((error) => {
+                    }).catch(error => {
                         this.$message.error('系统忙、或数据错误,请稍后再试')
                     })
                 }).catch(() => {})
@@ -1228,7 +1184,8 @@
             },
             //回调进行再次点击开关
             proceedCont() {
-                this.watchKey = false //防止恶意查询 。 为空表示可以点击了
+                //防止恶意查询 。 为空表示可以点击了
+                this.watchKey = false
             }
         }
     }
@@ -1260,7 +1217,6 @@
         box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 0px 0 rgba(0, 0, 0, 0.1);
         padding-left: 5px;
         min-height: 32px;
-        min-line-height: 32px;
     }
     .ibps-field-text-img {
         color: #000000;
@@ -1274,7 +1230,6 @@
         padding-left: 15px;
         min-height: 32px;
         margin-top: 5px;
-        min-line-height: 32px;
         font-size: 20px;
     }
 </style>

BIN
src/layout/header-aside/components/header-architecture/assets/systemArchitecture.png


+ 33 - 0
src/layout/header-aside/components/header-architecture/index.vue

@@ -0,0 +1,33 @@
+<template>
+  <div class="ibps-layout-header-user">
+    <el-button type="text" @click="open" style="color:#000">系统架构图</el-button>
+  </div>
+</template>
+
+<script>
+import imgSrc from '../header-architecture/assets/systemArchitecture.png'
+export default {
+ 
+  data() {
+    return{
+
+    }
+  },
+
+  methods: {
+    open() {
+      this.$alert('<img src="'+imgSrc+'" alt="" srcset="" style = "width:100%">', '系统架构图', {
+        dangerouslyUseHTMLString: true,
+        center: true,
+        showConfirmButton: false,
+        customClass: 'headerArchitectureMessageCss'
+      }).catch(()=>{}) ;
+    }
+  }
+}
+</script>
+<style>
+.headerArchitectureMessageCss{
+  width: 88%;
+}
+</style>

+ 5 - 0
src/layout/header-aside/layout.vue

@@ -96,6 +96,8 @@
 
                     <span style="font-size: 12px; cursor: pointer;" @click="goToMain()">首页</span>
                     <span style="margin: 0 10px;">|</span>
+                    <ibps-header-architecture />
+                    <span style="margin: 0 10px;">|</span>
                     <ibps-header-message />
                     <!-- 消息中心 -->
                     <span style="margin: 0 10px;">|</span>
@@ -179,6 +181,8 @@
     import IbpsHeaderSearch from './components/header-search'
     import FloatBall from './components/components/float-ball'
     import IbpsHeaderFullscreen from './components/header-fullscreen'
+    import IbpsHeaderArchitecture from './components/header-architecture'
+
     // import IbpsHeaderLocking from './components/header-locking'
     // import IbpsHeaderLanguage from './components/header-language'
     // import IbpsHeaderSize from './components/header-size'
@@ -210,6 +214,7 @@
             FloatBall,
             panle,
             IbpsHeaderFullscreen,
+            IbpsHeaderArchitecture,
             // IbpsHeaderLocking,
             // IbpsHeaderLanguage,
             // IbpsHeaderSize,

+ 1 - 1
src/views/system/dashboard/components/new-home.vue

@@ -76,7 +76,7 @@
                                         </el-tooltip>
                                     </template>
                                     <template slot-scope="scope">
-                                        <el-tag :type="stateOption[scope.row.state].type">{{ stateOption[scope.row.state].label }}</el-tag>
+                                        <el-tag :type="scope.row.state ? stateOption[scope.row.state].type : ''">{{ scope.row.state ? stateOption[scope.row.state].label : '待办理' }}</el-tag>
                                     </template>
                                 </el-table-column>
                                 <el-table-column