增加二次开发组件示例。
							parent
							
								
									1439eb53d4
								
							
						
					
					
						commit
						9a7a2573ce
					
				| 
						 | 
				
			
			@ -7,8 +7,8 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
import {deepClone, generateId, overwriteObj} from "@/utils/util"
 | 
			
		||||
import {advancedFields, basicFields, containers} from "@/components/form-designer/widget-panel/widgetsConfig.js";
 | 
			
		||||
import {VARIANT_FORM_VERSION} from "@/utils/config";
 | 
			
		||||
import {containers, advancedFields, basicFields, customFields} from "@/components/form-designer/widget-panel/widgetsConfig.js"
 | 
			
		||||
import {VARIANT_FORM_VERSION} from "@/utils/config"
 | 
			
		||||
 | 
			
		||||
export function createDesigner(vueInstance) {
 | 
			
		||||
  let defaultFormConfig = {
 | 
			
		||||
| 
						 | 
				
			
			@ -443,9 +443,10 @@ export function createDesigner(vueInstance) {
 | 
			
		|||
    },
 | 
			
		||||
 | 
			
		||||
    getContainerByType(typeName) {
 | 
			
		||||
      let allWidgets = [...containers, ...basicFields, ...advancedFields, ...customFields]
 | 
			
		||||
      let foundCon = null
 | 
			
		||||
      containers.forEach(con => {
 | 
			
		||||
        if (!!con.type && (con.type === typeName)) {
 | 
			
		||||
      allWidgets.forEach(con => {
 | 
			
		||||
        if (!!con.category && !!con.type && (con.type === typeName)) {
 | 
			
		||||
          foundCon = con
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
| 
						 | 
				
			
			@ -454,20 +455,11 @@ export function createDesigner(vueInstance) {
 | 
			
		|||
    },
 | 
			
		||||
 | 
			
		||||
    getFieldWidgetByType(typeName) {
 | 
			
		||||
      let allWidgets = [...containers, ...basicFields, ...advancedFields, ...customFields]
 | 
			
		||||
      let foundWidget = null
 | 
			
		||||
      basicFields.forEach(bf => {
 | 
			
		||||
        if (!!bf.type && (bf.type === typeName)) {
 | 
			
		||||
          foundWidget = bf
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      if (!!foundWidget) {
 | 
			
		||||
        return foundWidget
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      advancedFields.forEach(af => {
 | 
			
		||||
        if (!!af.type && (af.type === typeName)) {
 | 
			
		||||
          foundWidget = af
 | 
			
		||||
      allWidgets.forEach(widget => {
 | 
			
		||||
        if (!!!widget.category && !!widget.type && (widget.type === typeName)) {
 | 
			
		||||
          foundWidget = widget
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,8 @@
 | 
			
		|||
 | 
			
		||||
    <div class="drag-handler" v-if="designer.selectedId === widget.id && !widget.internal">
 | 
			
		||||
      <i class="el-icon-rank" :title="i18nt('designer.hint.dragHandler')"></i>
 | 
			
		||||
      <i>{{i18nt('designer.widgetLabel.' + widget.type)}}</i>
 | 
			
		||||
      <i>{{i18n2t(`designer.widgetLabel.${widget.type}`, `extension.widgetLabel.${widget.type}`)}}</i>
 | 
			
		||||
      <i v-if="widget.options.hidden === true" class="iconfont icon-hide"></i>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +80,7 @@
 | 
			
		|||
      position: absolute;
 | 
			
		||||
      top: -2px;
 | 
			
		||||
      //bottom: -24px;  /* 拖拽手柄位于组件下方,有时无法正常拖动,原因未明?? */
 | 
			
		||||
      left: -6px;
 | 
			
		||||
      left: -2px;
 | 
			
		||||
      height: 22px;
 | 
			
		||||
      line-height: 22px;
 | 
			
		||||
      background: $--color-primary;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-col v-else-if="widget.type === 'grid-col'" class="grid-cell" :span="widget.options.span || 12"
 | 
			
		||||
          :offset="widget.options.offset || 0" :push="widget.options.push || 0" :pull="widget.options.pull || 0"
 | 
			
		||||
          :class="[selected ? 'selected' : '', customClass]"
 | 
			
		||||
          :key="widget.id" @click.native.stop="selectWidget(widget)">
 | 
			
		||||
    <draggable :list="widget.widgetList" v-bind="{group:'dragGroup', ghostClass: 'ghost',animation: 200}"
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +41,6 @@
 | 
			
		|||
<script>
 | 
			
		||||
  import Draggable from 'vuedraggable'
 | 
			
		||||
  import i18n from "@/utils/i18n";
 | 
			
		||||
  import ContainerComponents from '@/components/form-designer/form-widget/container-widget/index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,6 @@
 | 
			
		|||
    mixins: [i18n],
 | 
			
		||||
    components: {
 | 
			
		||||
      Draggable,
 | 
			
		||||
      ...ContainerComponents,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			@ -150,11 +149,8 @@
 | 
			
		|||
<style lang="scss" scoped>
 | 
			
		||||
  .grid-cell {
 | 
			
		||||
    min-height: 38px;
 | 
			
		||||
    //line-height: 36px;
 | 
			
		||||
    margin: 6px 0;
 | 
			
		||||
    //margin: 6px 0;  /* 设置了margin,栅格列的offset、push、pull会失效!! */
 | 
			
		||||
    padding: 3px;
 | 
			
		||||
    //min-height: 300px;
 | 
			
		||||
    //border-right: 1px dotted #cccccc;
 | 
			
		||||
    outline: 1px dashed #336699;
 | 
			
		||||
    position: relative;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +160,6 @@
 | 
			
		|||
 | 
			
		||||
    .grid-col-action{
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      //bottom: -30px;
 | 
			
		||||
      bottom: 0;
 | 
			
		||||
      right: -2px;
 | 
			
		||||
      height: 28px;
 | 
			
		||||
| 
						 | 
				
			
			@ -183,7 +178,6 @@
 | 
			
		|||
    .grid-col-handler {
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      top: -2px;
 | 
			
		||||
      //bottom: -24px;  /* 拖拽手柄位于组件下方,有时无法正常拖动,原因未明?? */
 | 
			
		||||
      left: -2px;
 | 
			
		||||
      height: 22px;
 | 
			
		||||
      line-height: 22px;
 | 
			
		||||
| 
						 | 
				
			
			@ -195,7 +189,7 @@
 | 
			
		|||
        font-style: normal;
 | 
			
		||||
        color: #fff;
 | 
			
		||||
        margin: 4px;
 | 
			
		||||
        cursor: default;  //cursor: move;
 | 
			
		||||
        cursor: default;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,11 @@
 | 
			
		|||
import Vue from 'vue'
 | 
			
		||||
 | 
			
		||||
const requireComponent = require.context('./', false, /\w+\.vue$/)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 容器组件时递归组件,且内部可以嵌套其他容器,局部注册会找不到组件,必须注册为全局组件,原因不明?!
 | 
			
		||||
 * begin
 | 
			
		||||
 *
 | 
			
		||||
let comps = {}
 | 
			
		||||
 | 
			
		||||
requireComponent.keys().map(fileName => {
 | 
			
		||||
| 
						 | 
				
			
			@ -8,3 +14,11 @@ requireComponent.keys().map(fileName => {
 | 
			
		|||
})
 | 
			
		||||
 | 
			
		||||
export default comps;
 | 
			
		||||
 | 
			
		||||
end */
 | 
			
		||||
 | 
			
		||||
/* 全局注册!! */
 | 
			
		||||
requireComponent.keys().map(fileName => {
 | 
			
		||||
  let comp = requireComponent(fileName).default;
 | 
			
		||||
  Vue.component(comp.name, comp)
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,7 +48,6 @@
 | 
			
		|||
  import i18n from "@/utils/i18n"
 | 
			
		||||
  import containerMixin from "@/components/form-designer/form-widget/container-widget/containerMixin"
 | 
			
		||||
  import ContainerWrapper from "@/components/form-designer/form-widget/container-widget/container-wrapper"
 | 
			
		||||
  import ContainerComponents from '@/components/form-designer/form-widget/container-widget/index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +58,6 @@
 | 
			
		|||
      ContainerWrapper,
 | 
			
		||||
      Draggable,
 | 
			
		||||
 | 
			
		||||
      ...ContainerComponents,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,6 @@
 | 
			
		|||
<script>
 | 
			
		||||
  import Draggable from 'vuedraggable'
 | 
			
		||||
  import i18n from "@/utils/i18n"
 | 
			
		||||
  import ContainerComponents from '@/components/form-designer/form-widget/container-widget/index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +62,6 @@
 | 
			
		|||
    mixins: [i18n],
 | 
			
		||||
    components: {
 | 
			
		||||
      Draggable,
 | 
			
		||||
      ...ContainerComponents,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import {deepClone} from "@/utils/util";
 | 
			
		||||
import {deepClone} from "@/utils/util"
 | 
			
		||||
import FormValidators from '@/utils/validators'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,7 +48,7 @@
 | 
			
		|||
 | 
			
		||||
      <div class="drag-handler background-opacity" v-if="designer.selectedId === field.id">
 | 
			
		||||
        <i class="el-icon-rank" :title="i18nt('designer.hint.dragHandler')"></i>
 | 
			
		||||
        <i>{{i18nt('designer.widgetLabel.' + field.type)}}</i>
 | 
			
		||||
        <i>{{i18n2t(`designer.widgetLabel.${field.type}`, `extension.widgetLabel.${field.type}`)}}</i>
 | 
			
		||||
        <i v-if="field.options.hidden === true" class="iconfont icon-hide"></i>
 | 
			
		||||
      </div>
 | 
			
		||||
    </template>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <div class="field-wrapper" :class="{'design-time-bottom-margin': !!this.designer}">
 | 
			
		||||
    <div class="static-content-item" v-show="!field.options.hidden || (designState === true)"
 | 
			
		||||
         :class="{'selected': selected}" @click.stop="selectField(field)">
 | 
			
		||||
         :class="[selected ? 'selected' : '', customClass]" @click.stop="selectField(field)">
 | 
			
		||||
      <slot></slot>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -17,7 +17,7 @@
 | 
			
		|||
 | 
			
		||||
      <div class="drag-handler background-opacity" v-if="designer.selectedId === field.id">
 | 
			
		||||
        <i class="el-icon-rank" :title="i18nt('designer.hint.dragHandler')"></i>
 | 
			
		||||
        <i>{{i18nt('designer.widgetLabel.' + field.type)}}</i>
 | 
			
		||||
        <i>{{i18n2t(`designer.widgetLabel.${field.type}`, `extension.widgetLabel.${field.type}`)}}</i>
 | 
			
		||||
        <i v-if="field.options.hidden === true" class="iconfont icon-hide"></i>
 | 
			
		||||
      </div>
 | 
			
		||||
    </template>
 | 
			
		||||
| 
						 | 
				
			
			@ -60,6 +60,10 @@
 | 
			
		|||
        return !!this.designer && this.field.id === this.designer.selectedId
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      customClass() {
 | 
			
		||||
        return !!this.field.options.customClass ? this.field.options.customClass.join(' ') : ''
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@
 | 
			
		|||
 | 
			
		||||
<script>
 | 
			
		||||
  import Draggable from 'vuedraggable'
 | 
			
		||||
  import ContainerComponents from '@/components/form-designer/form-widget/container-widget/index'
 | 
			
		||||
  import '@/components/form-designer/form-widget/container-widget/index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
  import i18n from "@/utils/i18n"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +40,6 @@
 | 
			
		|||
    components: {
 | 
			
		||||
      Draggable,
 | 
			
		||||
 | 
			
		||||
      ...ContainerComponents,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@
 | 
			
		|||
-->
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <el-container class="full-height">
 | 
			
		||||
  <el-container class="main-container full-height">
 | 
			
		||||
    <el-header class="main-header">
 | 
			
		||||
      <div class="float-left main-title">
 | 
			
		||||
        <img src="../../assets/vform-logo.png" @click="openHome">
 | 
			
		||||
| 
						 | 
				
			
			@ -267,9 +267,10 @@
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  .el-header.toolbar-header {
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    border-bottom: 1px dotted #CCCCCC;
 | 
			
		||||
    height: 42px !important;
 | 
			
		||||
    line-height: 42px !important;
 | 
			
		||||
    //line-height: 42px !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .el-aside.side-panel {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,173 @@
 | 
			
		|||
import {translate} from "@/utils/i18n"
 | 
			
		||||
import emitter from 'element-ui/lib/mixins/emitter'
 | 
			
		||||
 | 
			
		||||
export const createInputTextEditor = function (propName, propLabelKey) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
        <el-form-item label={translate(propLabelKey)}>
 | 
			
		||||
          <el-input type="text" v-model={this.optionModel[propName]} />
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const createInputNumberEditor = function (propName, propLabelKey) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      updateValue(newValue) {
 | 
			
		||||
        if ((newValue === undefined) || (newValue === null) || isNaN(newValue)) {
 | 
			
		||||
          this.optionModel[propName] = null
 | 
			
		||||
        } else {
 | 
			
		||||
          this.optionModel[propName] = Number(newValue)
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
          <el-form-item label={translate(propLabelKey)}>
 | 
			
		||||
            <el-input-number type="text" v-model={this.optionModel[propName]}
 | 
			
		||||
                             onChange={this.updateValue} style="width: 100%" />
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const createBooleanEditor = function (propName, propLabelKey) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
        <el-form-item label={translate(propLabelKey)}>
 | 
			
		||||
          <el-checkbox v-model={this.optionModel[propName]} />
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const createCheckboxGroupEditor = function (propName, propLabelKey, configs) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
        <el-form-item label={translate(propLabelKey)}>
 | 
			
		||||
          <el-checkbox-group v-model={this.optionModel[propName]}>
 | 
			
		||||
            {
 | 
			
		||||
              configs.optionItems.map(item => {
 | 
			
		||||
                return <el-checkbox label={item.value}>{item.label}</el-checkbox>
 | 
			
		||||
              })
 | 
			
		||||
            }
 | 
			
		||||
          </el-checkbox-group>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const createRadioGroupEditor = function (propName, propLabelKey, configs) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
        <el-form-item label={translate(propLabelKey)}>
 | 
			
		||||
          <el-radio-group v-model={this.optionModel[propName]}>
 | 
			
		||||
            {
 | 
			
		||||
              configs.optionItems.map(item => {
 | 
			
		||||
                return <el-radio label={item.value}>{item.label}</el-radio>
 | 
			
		||||
              })
 | 
			
		||||
            }
 | 
			
		||||
          </el-radio-group>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const createRadioButtonGroupEditor = function (propName, propLabelKey, configs) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
          <el-form-item label={translate(propLabelKey)}>
 | 
			
		||||
            <el-radio-group v-model={this.optionModel[propName]}>
 | 
			
		||||
              {
 | 
			
		||||
                configs.optionItems.map(item => {
 | 
			
		||||
                  return <el-radio-button label={item.value}>{item.label}</el-radio-button>
 | 
			
		||||
                })
 | 
			
		||||
              }
 | 
			
		||||
            </el-radio-group>
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const createSelectEditor = function (propName, propLabelKey, configs) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
        <el-form-item label={translate(propLabelKey)}>
 | 
			
		||||
          <el-select v-model={this.optionModel[propName]}>
 | 
			
		||||
            {
 | 
			
		||||
              configs.optionItems.map(item => {
 | 
			
		||||
                return <el-option label={item.label} value={item.value} />
 | 
			
		||||
              })
 | 
			
		||||
            }
 | 
			
		||||
          </el-select>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const createEventHandlerEditor = function (eventPropName, eventParams) {
 | 
			
		||||
  return {
 | 
			
		||||
    props: {
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
    mixins: [emitter],
 | 
			
		||||
    methods: {
 | 
			
		||||
      editEventHandler() {
 | 
			
		||||
        this.dispatch('SettingPanel', 'editEventHandler', [eventPropName, [...eventParams]])
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    render(h) {
 | 
			
		||||
      return (
 | 
			
		||||
        <el-form-item label={eventPropName} label-width="150px">
 | 
			
		||||
            <el-button type="info" icon="el-icon-edit" plain round onClick={this.editEventHandler}>
 | 
			
		||||
            {translate('designer.setting.addEventHandler')}</el-button>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const createEmptyEditor = function () {
 | 
			
		||||
  return {
 | 
			
		||||
    render() {
 | 
			
		||||
      return <div style="display: none" />
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.colOffsetTitle')">
 | 
			
		||||
    <el-input-number v-model.number="optionModel.offset" :min="0" :max="24"
 | 
			
		||||
                     style="width: 100%"></el-input-number>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import i18n from "@/utils/i18n";
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "grid-col-offset-editor",
 | 
			
		||||
    mixins: [i18n],
 | 
			
		||||
    props: {
 | 
			
		||||
      designer: Object,
 | 
			
		||||
      selectedWidget: Object,
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.colPullTitle')">
 | 
			
		||||
    <el-input-number v-model.number="optionModel.pull" :min="0" :max="24"
 | 
			
		||||
                     style="width: 100%"></el-input-number>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import i18n from "@/utils/i18n";
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "grid-col-pull-editor",
 | 
			
		||||
    mixins: [i18n],
 | 
			
		||||
    props: {
 | 
			
		||||
      designer: Object,
 | 
			
		||||
      selectedWidget: Object,
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.colPushTitle')">
 | 
			
		||||
    <el-input-number v-model.number="optionModel.push" :min="0" :max="24"
 | 
			
		||||
                     style="width: 100%"></el-input-number>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import i18n from "@/utils/i18n";
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "grid-col-push-editor",
 | 
			
		||||
    mixins: [i18n],
 | 
			
		||||
    props: {
 | 
			
		||||
      designer: Object,
 | 
			
		||||
      selectedWidget: Object,
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -2,18 +2,11 @@ import emitter from 'element-ui/lib/mixins/emitter'
 | 
			
		|||
 | 
			
		||||
export default {
 | 
			
		||||
  mixins: [emitter],
 | 
			
		||||
  created() {
 | 
			
		||||
    // this.$on('saveEventHandler', function (params) {
 | 
			
		||||
    //   //this.optionModel[eventName] = handlerCodes
 | 
			
		||||
    //   this.optionModel[params[0]] = params[1]
 | 
			
		||||
    // })
 | 
			
		||||
 | 
			
		||||
  },
 | 
			
		||||
  created() {},
 | 
			
		||||
  methods: {
 | 
			
		||||
    editEventHandler(eventName, eventParams) {
 | 
			
		||||
      this.dispatch('SettingPanel', 'editEventHandler', [eventName, [...eventParams]])
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.activeColor')">
 | 
			
		||||
    <el-color-picker v-model="optionModel.activeColor"></el-color-picker>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import i18n from "@/utils/i18n"
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "activeColor-editor",
 | 
			
		||||
    mixins: [i18n],
 | 
			
		||||
    props: {
 | 
			
		||||
      designer: Object,
 | 
			
		||||
      selectedWidget: Object,
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.activeColor')">
 | 
			
		||||
    <el-color-picker v-model="optionModel.activeColor"></el-color-picker>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.activeText')">
 | 
			
		||||
    <el-input v-model="optionModel.activeText"></el-input>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.inactiveText')">
 | 
			
		||||
    <el-input v-model="optionModel.inactiveText"></el-input>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import i18n from "@/utils/i18n"
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "inactiveText-editor",
 | 
			
		||||
    mixins: [i18n],
 | 
			
		||||
    props: {
 | 
			
		||||
      designer: Object,
 | 
			
		||||
      selectedWidget: Object,
 | 
			
		||||
      optionModel: Object,
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-switch v-model="optionModel.defaultValue" @change="emitDefaultValueChange"
 | 
			
		||||
             active-text="true" inactive-text="false"></el-switch>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.defaultValue')">
 | 
			
		||||
    <el-switch v-model="optionModel.defaultValue" @change="emitDefaultValueChange"
 | 
			
		||||
               active-text="true" inactive-text="false"></el-switch>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.fieldName')" :rules="nameRequiredRule">
 | 
			
		||||
  <el-form-item :label="i18nt('designer.setting.uniqueName')" :rules="nameRequiredRule">
 | 
			
		||||
    <el-input type="text" v-model="optionModel.name" @change="updateWidgetNameAndRef"></el-input>
 | 
			
		||||
  </el-form-item>
 | 
			
		||||
</template>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,9 @@
 | 
			
		|||
import Vue from 'vue'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 格式说明:属性名称==对应属性编辑器的组件名称
 | 
			
		||||
 */
 | 
			
		||||
let COMMON_PROPERTIES = {
 | 
			
		||||
const COMMON_PROPERTIES = {
 | 
			
		||||
  //字段
 | 
			
		||||
  'name'              :            'name-editor',
 | 
			
		||||
  'label'             :            'label-editor',
 | 
			
		||||
| 
						 | 
				
			
			@ -56,10 +58,13 @@ let COMMON_PROPERTIES = {
 | 
			
		|||
  'cellHeight'         :            'cellHeight-editor',
 | 
			
		||||
  'gutter'             :            'gutter-editor',
 | 
			
		||||
  'span'               :            'span-editor',
 | 
			
		||||
  'offset'             :            'offset-editor',
 | 
			
		||||
  'push'               :            'push-editor',
 | 
			
		||||
  'pull'               :            'pull-editor',
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let ADVANCED_PROPERTIES = {
 | 
			
		||||
const ADVANCED_PROPERTIES = {
 | 
			
		||||
  'min'               :            'min-editor',
 | 
			
		||||
  'max'               :            'max-editor',
 | 
			
		||||
  'precision'         :            'precision-editor',
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +100,7 @@ let ADVANCED_PROPERTIES = {
 | 
			
		|||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let EVENT_PROPERTIES = {
 | 
			
		||||
const EVENT_PROPERTIES = {
 | 
			
		||||
  //字段
 | 
			
		||||
  'onCreated'         :            'onCreated-editor',
 | 
			
		||||
  'onMounted'         :            'onMounted-editor',
 | 
			
		||||
| 
						 | 
				
			
			@ -135,6 +140,21 @@ export function registerEventProperty(propName, propEditorName) {
 | 
			
		|||
  EVENT_PROPERTIES[propName] = propEditorName
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function registerCPEditor(propName, propEditorName, editorComponent) {
 | 
			
		||||
  Vue.component(propEditorName, editorComponent)
 | 
			
		||||
  registerCommonProperty(propName, propEditorName)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function registerAPEditor(propName, propEditorName, editorComponent) {
 | 
			
		||||
  Vue.component(propEditorName, editorComponent)
 | 
			
		||||
  registerAdvancedProperty(propName, propEditorName)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function registerEPEditor(propName, propEditorName, editorComponent) {
 | 
			
		||||
  Vue.component(propEditorName, editorComponent)
 | 
			
		||||
  registerEventProperty(propName, propEditorName)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  COMMON_PROPERTIES,
 | 
			
		||||
  ADVANCED_PROPERTIES,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@
 | 
			
		|||
    <el-dialog :title="i18nt('designer.toolbar.importJson')" :visible.sync="showImportJsonDialogFlag"
 | 
			
		||||
               v-if="showImportJsonDialogFlag" :show-close="true" class="small-padding-dialog" center v-dialog-drag
 | 
			
		||||
               :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true">
 | 
			
		||||
      <el-alert type="info" :title="i18nt('designer.hint.importJsonHint')" show-icon></el-alert>
 | 
			
		||||
      <el-alert type="info" :title="i18nt('designer.hint.importJsonHint')" show-icon class="alert-padding"></el-alert>
 | 
			
		||||
      <code-editor :mode="'json'" :readonly="false" v-model="importTemplate"></code-editor>
 | 
			
		||||
      <div slot="footer" class="dialog-footer">
 | 
			
		||||
        <el-button type="primary" @click="doJsonImport">
 | 
			
		||||
| 
						 | 
				
			
			@ -445,15 +445,15 @@
 | 
			
		|||
 | 
			
		||||
  .small-padding-dialog {
 | 
			
		||||
    ::v-deep .el-dialog__header {
 | 
			
		||||
      padding-top: 3px;
 | 
			
		||||
      padding-bottom: 3px;
 | 
			
		||||
      //padding-top: 3px;
 | 
			
		||||
      //padding-bottom: 3px;
 | 
			
		||||
      background: #f1f2f3;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ::v-deep .el-dialog__body {
 | 
			
		||||
      padding: 12px 15px 12px 15px;
 | 
			
		||||
 | 
			
		||||
      .el-alert {
 | 
			
		||||
      .el-alert.alert-padding {
 | 
			
		||||
        padding: 0 10px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -481,6 +481,7 @@
 | 
			
		|||
 | 
			
		||||
  .form-render-wrapper {
 | 
			
		||||
    //height: calc(100vh - 142px);
 | 
			
		||||
    all: revert !important; /* 防止表单继承el-dialog等外部样式,未生效,原因不明?? */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .form-render-wrapper.h5-layout {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@
 | 
			
		|||
                     :move="checkContainerMove" @end="onContainerDragEnd">
 | 
			
		||||
            <li v-for="(ctn, index) in containers" :key="index" class="container-widget-item" :title="ctn.displayName"
 | 
			
		||||
                @dblclick="addContainerByDbClick(ctn)">
 | 
			
		||||
              <span><svg-icon :icon-class="ctn.icon" />{{i18nt(`designer.widgetLabel.${ctn.type}`)}}</span>
 | 
			
		||||
              <span><svg-icon :icon-class="ctn.icon" />{{i18n2t(`designer.widgetLabel.${ctn.type}`, `extension.widgetLabel.${ctn.type}`)}}</span>
 | 
			
		||||
            </li>
 | 
			
		||||
          </draggable>
 | 
			
		||||
        </el-collapse-item>
 | 
			
		||||
| 
						 | 
				
			
			@ -19,7 +19,7 @@
 | 
			
		|||
                     :clone="handleFieldWidgetClone" ghost-class="ghost" :sort="false">
 | 
			
		||||
            <li v-for="(fld, index) in basicFields" :key="index" class="field-widget-item" :title="fld.displayName"
 | 
			
		||||
                @dblclick="addFieldByDbClick(fld)">
 | 
			
		||||
              <span><svg-icon :icon-class="fld.icon" />{{i18nt(`designer.widgetLabel.${fld.type}`)}}</span>
 | 
			
		||||
              <span><svg-icon :icon-class="fld.icon" />{{i18n2t(`designer.widgetLabel.${fld.type}`, `extension.widgetLabel.${fld.type}`)}}</span>
 | 
			
		||||
            </li>
 | 
			
		||||
          </draggable>
 | 
			
		||||
        </el-collapse-item>
 | 
			
		||||
| 
						 | 
				
			
			@ -29,22 +29,23 @@
 | 
			
		|||
                     :clone="handleFieldWidgetClone" ghost-class="ghost" :sort="false">
 | 
			
		||||
            <li v-for="(fld, index) in advancedFields" :key="index" class="field-widget-item" :title="fld.displayName"
 | 
			
		||||
                @dblclick="addFieldByDbClick(fld)">
 | 
			
		||||
              <span><svg-icon :icon-class="fld.icon" />{{i18nt(`designer.widgetLabel.${fld.type}`)}}</span>
 | 
			
		||||
              <span><svg-icon :icon-class="fld.icon" />{{i18n2t(`designer.widgetLabel.${fld.type}`, `extension.widgetLabel.${fld.type}`)}}</span>
 | 
			
		||||
            </li>
 | 
			
		||||
          </draggable>
 | 
			
		||||
        </el-collapse-item>
 | 
			
		||||
 | 
			
		||||
        <!--
 | 
			
		||||
        <!-- -->
 | 
			
		||||
        <el-collapse-item name="4" :title="i18nt('designer.customFieldTitle')">
 | 
			
		||||
          <draggable tag="ul" :list="customFields" :group="{name: 'dragGroup', pull: 'clone', put: false}"
 | 
			
		||||
                     :clone="handleFieldWidgetClone" ghost-class="ghost" :sort="false">
 | 
			
		||||
            <li v-for="(fld, index) in customFields" :key="index" class="field-widget-item" :title="fld.displayName"
 | 
			
		||||
                @dblclick="addFieldByDbClick(fld)">
 | 
			
		||||
              <span :title="fld.displayName"><svg-icon :icon-class="fld.icon" />{{i18nt(`designer.widgetLabel.${fld.type}`)}}</span>
 | 
			
		||||
              <span>
 | 
			
		||||
                <svg-icon :icon-class="fld.icon" />{{i18n2t(`designer.widgetLabel.${fld.type}`, `extension.widgetLabel.${fld.type}`)}}</span>
 | 
			
		||||
            </li>
 | 
			
		||||
          </draggable>
 | 
			
		||||
        </el-collapse-item>
 | 
			
		||||
        -->
 | 
			
		||||
        <!-- -->
 | 
			
		||||
 | 
			
		||||
      </el-collapse>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -102,8 +103,7 @@
 | 
			
		|||
        this.containers = this.containers.map(con => {
 | 
			
		||||
          return {
 | 
			
		||||
            ...con,
 | 
			
		||||
            //category: 'container',
 | 
			
		||||
            displayName: this.i18nt(`designer.widgetLabel.${con.type}`)
 | 
			
		||||
            displayName: this.i18n2t(`designer.widgetLabel.${con.type}`, `extension.widgetLabel.${con.type}`)
 | 
			
		||||
          }
 | 
			
		||||
        }).filter(con => {
 | 
			
		||||
          return !con.internal
 | 
			
		||||
| 
						 | 
				
			
			@ -112,25 +112,23 @@
 | 
			
		|||
        this.basicFields = this.basicFields.map(fld => {
 | 
			
		||||
          return {
 | 
			
		||||
            ...fld,
 | 
			
		||||
            displayName: this.i18nt(`designer.widgetLabel.${fld.type}`)
 | 
			
		||||
            displayName: this.i18n2t(`designer.widgetLabel.${fld.type}`, `extension.widgetLabel.${fld.type}`)
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        this.advancedFields = this.advancedFields.map(fld => {
 | 
			
		||||
          return {
 | 
			
		||||
            ...fld,
 | 
			
		||||
            displayName: this.i18nt(`designer.widgetLabel.${fld.type}`)
 | 
			
		||||
            displayName: this.i18n2t(`designer.widgetLabel.${fld.type}`, `extension.widgetLabel.${fld.type}`)
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        ///*
 | 
			
		||||
        this.customFields = this.customFields.map(fld => {
 | 
			
		||||
          return {
 | 
			
		||||
            ...fld,
 | 
			
		||||
            displayName: this.i18nt(`designer.widgetLabel.${fld.type}`)
 | 
			
		||||
            displayName: this.i18n2t(`designer.widgetLabel.${fld.type}`, `extension.widgetLabel.${fld.type}`)
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
        //*/
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      handleContainerWidgetClone(origin) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,6 +62,9 @@ export const containers = [
 | 
			
		|||
      name: '',
 | 
			
		||||
      hidden: false,
 | 
			
		||||
      span: 12,
 | 
			
		||||
      offset: 0,
 | 
			
		||||
      push: 0,
 | 
			
		||||
      pull: 0,
 | 
			
		||||
      customClass: '',  //自定义css类名
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			@ -99,6 +102,46 @@ export const containers = [
 | 
			
		|||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
  {
 | 
			
		||||
    type: 'data-table',
 | 
			
		||||
    category: 'container',
 | 
			
		||||
    icon: 'data-table',
 | 
			
		||||
    options: {
 | 
			
		||||
      name: '',
 | 
			
		||||
      label: '',
 | 
			
		||||
      hidden: false,
 | 
			
		||||
      columns: {},
 | 
			
		||||
      checkboxColumn: {
 | 
			
		||||
        width: 45,
 | 
			
		||||
      },
 | 
			
		||||
      operationColumn: {
 | 
			
		||||
        buttons: [
 | 
			
		||||
          {label: 'Edit', name: '', type: '', plain: false, round: true, circle: false, disabled: false, hidden: false},
 | 
			
		||||
          {label: 'View', name: '', type: '', plain: false, round: true, circle: false, disabled: false, hidden: false},
 | 
			
		||||
          {label: 'Delete', name: '', type: '', plain: false, round: true, circle: false, disabled: false, hidden: false},
 | 
			
		||||
          {label: 'More...', name: '', type: '', plain: false, round: true, circle: false, disabled: false, hidden: false},
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      size: 'medium',
 | 
			
		||||
      height: '100%',
 | 
			
		||||
      maxHeight: '1200px',
 | 
			
		||||
      stripe: false,
 | 
			
		||||
      border: false,
 | 
			
		||||
      fit: true,
 | 
			
		||||
      highlightCurrentRow: false,
 | 
			
		||||
      emptyText: 'no data',
 | 
			
		||||
      showHeader: true,
 | 
			
		||||
      showCheckBox: true,
 | 
			
		||||
      showPager: false,
 | 
			
		||||
      pagerPosition: 'center',
 | 
			
		||||
      pagerSmall: false,
 | 
			
		||||
      pagerBackground: false,
 | 
			
		||||
      pagerCount: 7,
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export const basicFields = [
 | 
			
		||||
| 
						 | 
				
			
			@ -886,6 +929,7 @@ export const advancedFields = [
 | 
			
		|||
]
 | 
			
		||||
 | 
			
		||||
export const customFields = [
 | 
			
		||||
  /*
 | 
			
		||||
  {
 | 
			
		||||
    type: 'custom',
 | 
			
		||||
    icon: 'custom-component',
 | 
			
		||||
| 
						 | 
				
			
			@ -895,5 +939,22 @@ export const customFields = [
 | 
			
		|||
    type: 'slot',
 | 
			
		||||
    icon: 'slot-component',
 | 
			
		||||
  },
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export function addContainerWidgetSchema(containerSchema) {
 | 
			
		||||
  containers.push(containerSchema)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function addBasicFieldSchema(fieldSchema) {
 | 
			
		||||
  basicFields.push(fieldSchema)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function addAdvancedFieldSchema(fieldSchema) {
 | 
			
		||||
  advancedFields.push(fieldSchema)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function addCustomWidgetSchema(widgetSchema) {
 | 
			
		||||
  customFields.push(widgetSchema)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-col class="grid-cell" :span="widget.options.span" :class="[customClass]"
 | 
			
		||||
          :offset="widget.options.offset || 0" :push="widget.options.push || 0" :pull="widget.options.pull || 0"
 | 
			
		||||
          :key="widget.id" v-show="!widget.options.hidden">
 | 
			
		||||
    <template v-if="!!widget.widgetList && (widget.widgetList.length > 0)">
 | 
			
		||||
      <template v-for="(subWidget, swIdx) in widget.widgetList">
 | 
			
		||||
| 
						 | 
				
			
			@ -24,15 +25,13 @@
 | 
			
		|||
<script>
 | 
			
		||||
  import i18n from "../../../utils/i18n"
 | 
			
		||||
  import refMixin from "../../../components/form-render/refMixin"
 | 
			
		||||
  import ContainerItems from './index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "GridColItem",
 | 
			
		||||
    componentName: 'GridColItem',
 | 
			
		||||
    componentName: 'ContainerItem',
 | 
			
		||||
    mixins: [i18n, refMixin],
 | 
			
		||||
    components: {
 | 
			
		||||
      ...ContainerItems,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,11 @@
 | 
			
		|||
import Vue from "vue"
 | 
			
		||||
 | 
			
		||||
const requireComponent = require.context('./', false, /\w+\.vue$/)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 容器组件时递归组件,且内部可以嵌套其他容器,局部注册会找不到组件,必须注册为全局组件,原因不明?!
 | 
			
		||||
 * begin
 | 
			
		||||
 *
 | 
			
		||||
let comps = {}
 | 
			
		||||
 | 
			
		||||
requireComponent.keys().map(fileName => {
 | 
			
		||||
| 
						 | 
				
			
			@ -8,3 +14,11 @@ requireComponent.keys().map(fileName => {
 | 
			
		|||
})
 | 
			
		||||
 | 
			
		||||
export default comps;
 | 
			
		||||
 | 
			
		||||
end */
 | 
			
		||||
 | 
			
		||||
/* 全局注册!! */
 | 
			
		||||
requireComponent.keys().map(fileName => {
 | 
			
		||||
  let comp = requireComponent(fileName).default;
 | 
			
		||||
  Vue.component(comp.name, comp)
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,6 @@
 | 
			
		|||
  import refMixin from "../../../components/form-render/refMixin"
 | 
			
		||||
  import ContainerItemWrapper from './container-item-wrapper'
 | 
			
		||||
  import containerItemMixin from "./containerItemMixin";
 | 
			
		||||
  import ContainerItems from './index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +37,6 @@
 | 
			
		|||
    mixins: [emitter, i18n, refMixin, containerItemMixin],
 | 
			
		||||
    components: {
 | 
			
		||||
      ContainerItemWrapper,
 | 
			
		||||
      ...ContainerItems,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,15 +18,13 @@
 | 
			
		|||
<script>
 | 
			
		||||
  import i18n from "../../../utils/i18n"
 | 
			
		||||
  import refMixin from "../../../components/form-render/refMixin"
 | 
			
		||||
  import ContainerItems from './index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "TableCellItem",
 | 
			
		||||
    componentName: "TableCellItem",
 | 
			
		||||
    componentName: "ContainerItem",
 | 
			
		||||
    mixins: [i18n, refMixin],
 | 
			
		||||
    components: {
 | 
			
		||||
      ...ContainerItems,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@
 | 
			
		|||
<script>
 | 
			
		||||
  //import ElForm from 'element-ui/packages/form/src/form.vue'  /* 用于源码调试Element UI */
 | 
			
		||||
  import emitter from 'element-ui/lib/mixins/emitter'
 | 
			
		||||
  import ContainerComponents from './container-item/index'
 | 
			
		||||
  import './container-item/index'
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
  import {deepClone, insertCustomCssToHead, insertGlobalFunctionsToHtml} from "../../utils/util"
 | 
			
		||||
  import i18n, { changeLocale } from "../../utils/i18n"
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +41,6 @@
 | 
			
		|||
    components: {
 | 
			
		||||
      //ElForm,
 | 
			
		||||
 | 
			
		||||
      ...ContainerComponents,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <el-container id="commonTable">
 | 
			
		||||
    <el-main>
 | 
			
		||||
      <el-table :data="data" :height="height" :max-height="maxHeight" border stripe tooltip-effect="light"
 | 
			
		||||
                @selection-change="handleSelectionChange" :size="tableSize" :style="{width: tableWidth}">
 | 
			
		||||
        <el-table-column v-if="showCheckBox" type="selection" width="45"></el-table-column>
 | 
			
		||||
        <template v-for="(item, index) in columns">
 | 
			
		||||
          <el-table-column
 | 
			
		||||
                  v-if="item.show !== false"
 | 
			
		||||
                  :key="index"
 | 
			
		||||
                  :fixed="item.fixed"
 | 
			
		||||
                  :prop="item.prop"
 | 
			
		||||
                  :label="item.label"
 | 
			
		||||
                  :align="item.align ? item.align:'center'"
 | 
			
		||||
                  :width="item.width"
 | 
			
		||||
                  :show-overflow-tooltip="true"
 | 
			
		||||
                  :formatter="item.formatter ? item.formatter : formatterValue">
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
        </template>
 | 
			
		||||
        <slot name="table_operation"/>
 | 
			
		||||
      </el-table>
 | 
			
		||||
    </el-main>
 | 
			
		||||
 | 
			
		||||
    <el-footer id="simpleTableFooter" v-if="showPager" style="height: 42px;padding-top: 6px; background: white">
 | 
			
		||||
      <el-pagination
 | 
			
		||||
              @size-change="handleSizeChange"
 | 
			
		||||
              @current-change="handleCurrentChange"
 | 
			
		||||
              style="text-align: right;margin:0;"
 | 
			
		||||
              :current-page="pagination.pageNo"
 | 
			
		||||
              :page-size="pagination.limit"
 | 
			
		||||
              :page-sizes="pagination.sizes"
 | 
			
		||||
              :total="pagination.total"
 | 
			
		||||
              layout="total, sizes, prev, pager, next, jumper">
 | 
			
		||||
      </el-pagination>
 | 
			
		||||
    </el-footer>
 | 
			
		||||
  </el-container>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  export default {
 | 
			
		||||
    name: 'VTable',
 | 
			
		||||
    props: {
 | 
			
		||||
      tableWidth: [String, Number],
 | 
			
		||||
      columns: Array,
 | 
			
		||||
      data: Array,
 | 
			
		||||
      showPager: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: true
 | 
			
		||||
      },
 | 
			
		||||
      showCheckBox: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: false
 | 
			
		||||
      },
 | 
			
		||||
      pagination: Object,
 | 
			
		||||
      height: {
 | 
			
		||||
        type: String,
 | 
			
		||||
        default: "100%"
 | 
			
		||||
      },
 | 
			
		||||
      maxHeight: {
 | 
			
		||||
        type: Number,
 | 
			
		||||
        default: 2000
 | 
			
		||||
      },
 | 
			
		||||
      tableSize: {
 | 
			
		||||
        type: String,
 | 
			
		||||
        default: 'medium'
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      handleSelectionChange(val) {
 | 
			
		||||
        this.$emit('handleSelectionChange', val);
 | 
			
		||||
      },
 | 
			
		||||
      handleSizeChange(val) {
 | 
			
		||||
        this.$emit('handleSizeChange', val);
 | 
			
		||||
      },
 | 
			
		||||
      handleCurrentChange(val) {
 | 
			
		||||
        this.$emit('handleCurrentChange', val);
 | 
			
		||||
      },
 | 
			
		||||
      formatterValue(row, column, cellValue) {
 | 
			
		||||
        return cellValue;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
 | 
			
		||||
  .el-table {
 | 
			
		||||
    // 解决table组件内容滚动时页面滚动条同步滚动
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
    // 必须设置
 | 
			
		||||
    position: relative;
 | 
			
		||||
 | 
			
		||||
    ::v-deep .el-table__fixed-header-wrapper thead th > .cell {
 | 
			
		||||
      white-space: nowrap !important;  /* 禁止表头换行 */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ::v-deep .el-table__header-wrapper thead th > .cell {
 | 
			
		||||
      white-space: nowrap !important;  /* 禁止表头换行 */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ::v-deep .el-table__body-wrapper {
 | 
			
		||||
      //height: 100% !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
import {
 | 
			
		||||
  addContainerWidgetSchema,
 | 
			
		||||
  addBasicFieldSchema,
 | 
			
		||||
  addAdvancedFieldSchema,
 | 
			
		||||
  addCustomWidgetSchema
 | 
			
		||||
} from '@/components/form-designer/widget-panel/widgetsConfig'
 | 
			
		||||
import {
 | 
			
		||||
  registerCommonProperty,
 | 
			
		||||
  registerAdvancedProperty,
 | 
			
		||||
  registerEventProperty
 | 
			
		||||
} from '@/components/form-designer/setting-panel/propertyRegister'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  addContainerWidgetSchema,
 | 
			
		||||
  addBasicFieldSchema,
 | 
			
		||||
  addAdvancedFieldSchema,
 | 
			
		||||
  addCustomWidgetSchema,
 | 
			
		||||
 | 
			
		||||
  registerCommonProperty,
 | 
			
		||||
  registerAdvancedProperty,
 | 
			
		||||
  registerEventProperty,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,97 @@
 | 
			
		|||
import Vue from 'vue'
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  addContainerWidgetSchema,
 | 
			
		||||
  addCustomWidgetSchema
 | 
			
		||||
} from '@/components/form-designer/widget-panel/widgetsConfig'
 | 
			
		||||
import * as PERegister from '@/components/form-designer/setting-panel/propertyRegister'
 | 
			
		||||
import * as PEFactory from '@/components/form-designer/setting-panel/property-editor-factory'
 | 
			
		||||
 | 
			
		||||
import {cardSchema} from "@/extension/samples/extension-schema"
 | 
			
		||||
import CardWidget from '@/extension/samples/card/card-widget'
 | 
			
		||||
import CardItem from '@/extension/samples/card/card-item'
 | 
			
		||||
 | 
			
		||||
import {alertSchema} from "@/extension/samples/extension-schema"
 | 
			
		||||
import AlertWidget from '@/extension/samples/alert/alert-widget'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const loadExtension = function () {
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * 加载容器组件步骤:
 | 
			
		||||
   * 1. 加载组件Json Schema;
 | 
			
		||||
   * 2. 全局注册容器组件,容器组件有两种状态——设计期和运行期,故需要注册两个组件;
 | 
			
		||||
   * 3. 全局注册属性编辑器组件(基本属性、高级属性、事件属性);
 | 
			
		||||
   * 4. 加载完毕。
 | 
			
		||||
   */
 | 
			
		||||
  addContainerWidgetSchema(cardSchema)  //加载组件Json Schema
 | 
			
		||||
  /* -------------------------------------------------- */
 | 
			
		||||
  Vue.component(CardWidget.name, CardWidget)  //设计期的容器组件
 | 
			
		||||
  Vue.component(CardItem.name, CardItem)  //运行期的容器组件
 | 
			
		||||
  /* -------------------------------------------------- */
 | 
			
		||||
  PERegister.registerCPEditor('cardWidth', 'card-cardWidth-editor',
 | 
			
		||||
      PEFactory.createInputTextEditor('cardWidth', 'extension.setting.cardWidth'))
 | 
			
		||||
 | 
			
		||||
  let shadowOptions = [
 | 
			
		||||
    {label: 'never', value: 'never'},
 | 
			
		||||
    {label: 'hover', value: 'hover'},
 | 
			
		||||
    {label: 'always', value: 'always'},
 | 
			
		||||
  ]
 | 
			
		||||
  PERegister.registerCPEditor('shadow', 'card-shadow-editor',
 | 
			
		||||
      PEFactory.createSelectEditor('shadow', 'extension.setting.cardShadow',
 | 
			
		||||
          {optionItems: shadowOptions}))
 | 
			
		||||
  /* -------------------------------------------------- */
 | 
			
		||||
  /* 容器组件加载完毕 end */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * 加载字段组件步骤:
 | 
			
		||||
   * 1. 加载组件Json Schema;
 | 
			
		||||
   * 2. 全局注册字段组件,字段组件设计期和运行期共用,故需要仅需注册一个组件;
 | 
			
		||||
   * 3. 全局注册属性编辑器组件(基本属性、高级属性、事件属性);
 | 
			
		||||
   * 4. 加载完毕。
 | 
			
		||||
   */
 | 
			
		||||
  addCustomWidgetSchema(alertSchema)  //加载组件Json Schema
 | 
			
		||||
  /* -------------------------------------------------- */
 | 
			
		||||
  Vue.component(AlertWidget.name, AlertWidget)  //注册组件
 | 
			
		||||
  /* -------------------------------------------------- */
 | 
			
		||||
  PERegister.registerCPEditor('title', 'alert-title-editor',
 | 
			
		||||
      PEFactory.createInputTextEditor('title', 'extension.setting.alertTitle'))
 | 
			
		||||
 | 
			
		||||
  let typeOptions = [
 | 
			
		||||
    {label: 'success', value: 'success'},
 | 
			
		||||
    {label: 'warning', value: 'warning'},
 | 
			
		||||
    {label: 'info', value: 'info'},
 | 
			
		||||
    {label: 'error', value: 'error'},
 | 
			
		||||
  ]
 | 
			
		||||
  PERegister.registerCPEditor('type', 'alert-type-editor',
 | 
			
		||||
      PEFactory.createSelectEditor('type', 'extension.setting.alertType',
 | 
			
		||||
          {optionItems: typeOptions}))
 | 
			
		||||
 | 
			
		||||
  PERegister.registerCPEditor('description', 'alert-description-editor',
 | 
			
		||||
      PEFactory.createInputTextEditor('description', 'extension.setting.description'))
 | 
			
		||||
 | 
			
		||||
  PERegister.registerCPEditor('closable', 'alert-closable-editor',
 | 
			
		||||
      PEFactory.createBooleanEditor('closable', 'extension.setting.closable'))
 | 
			
		||||
 | 
			
		||||
  PERegister.registerCPEditor('closeText', 'alert-closeText-editor',
 | 
			
		||||
      PEFactory.createInputTextEditor('closeText', 'extension.setting.closeText'))
 | 
			
		||||
 | 
			
		||||
  PERegister.registerCPEditor('center', 'alert-center-editor',
 | 
			
		||||
      PEFactory.createBooleanEditor('center', 'extension.setting.center'))
 | 
			
		||||
 | 
			
		||||
  PERegister.registerCPEditor('showIcon', 'alert-showIcon-editor',
 | 
			
		||||
      PEFactory.createBooleanEditor('showIcon', 'extension.setting.showIcon'))
 | 
			
		||||
 | 
			
		||||
  let effectOptions = [
 | 
			
		||||
    {label: 'light', value: 'light'},
 | 
			
		||||
    {label: 'dark', value: 'dark'},
 | 
			
		||||
  ]
 | 
			
		||||
  PERegister.registerCPEditor('effect', 'alert-effect-editor',
 | 
			
		||||
      PEFactory.createRadioButtonGroupEditor('effect', 'extension.setting.effect',
 | 
			
		||||
          {optionItems: effectOptions}))
 | 
			
		||||
 | 
			
		||||
  PERegister.registerEPEditor('onClose', 'alert-onClose-editor',
 | 
			
		||||
      PEFactory.createEventHandlerEditor('onClose', []))
 | 
			
		||||
  /* -------------------------------------------------- */
 | 
			
		||||
  /* 字段组件加载完毕 end */
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,72 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <static-content-wrapper :designer="designer" :field="field" :design-state="designState"
 | 
			
		||||
                          :parent-widget="parentWidget" :parent-list="parentList" :index-of-parent-list="indexOfParentList"
 | 
			
		||||
                          :sub-form-row-index="subFormRowIndex" :sub-form-col-index="subFormColIndex" :sub-form-row-id="subFormRowId">
 | 
			
		||||
    <el-alert ref="fieldEditor" :title="field.options.title" :type="field.options.type"
 | 
			
		||||
              :description="field.options.description" :closable="field.options.closable"
 | 
			
		||||
              :center="field.options.center" :close-text="field.options.closeText"
 | 
			
		||||
              :show-icon="field.options.showIcon" :effect="field.options.effect" @close="handelCloseCustomEvent"></el-alert>
 | 
			
		||||
  </static-content-wrapper>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import StaticContentWrapper from '@/components/form-designer/form-widget/field-widget/static-content-wrapper'
 | 
			
		||||
  import emitter from 'element-ui/lib/mixins/emitter'
 | 
			
		||||
  import i18n from "@/utils/i18n"
 | 
			
		||||
  import fieldMixin from "@/components/form-designer/form-widget/field-widget/fieldMixin"
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "alert-widget",
 | 
			
		||||
    componentName: 'FieldWidget',  //必须固定为FieldWidget,用于接收父级组件的broadcast事件
 | 
			
		||||
    mixins: [emitter, fieldMixin, i18n],
 | 
			
		||||
    props: {
 | 
			
		||||
      field: Object,
 | 
			
		||||
      parentWidget: Object,
 | 
			
		||||
      parentList: Array,
 | 
			
		||||
      indexOfParentList: Number,
 | 
			
		||||
      designer: Object,
 | 
			
		||||
 | 
			
		||||
      designState: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: false
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      subFormRowIndex: { /* 子表单组件行索引,从0开始计数 */
 | 
			
		||||
        type: Number,
 | 
			
		||||
        default: -1
 | 
			
		||||
      },
 | 
			
		||||
      subFormColIndex: { /* 子表单组件列索引,从0开始计数 */
 | 
			
		||||
        type: Number,
 | 
			
		||||
        default: -1
 | 
			
		||||
      },
 | 
			
		||||
      subFormRowId: { /* 子表单组件行Id,唯一id且不可变 */
 | 
			
		||||
        type: String,
 | 
			
		||||
        default: ''
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    components: {
 | 
			
		||||
      StaticContentWrapper,
 | 
			
		||||
    },
 | 
			
		||||
    created() {
 | 
			
		||||
      this.registerToRefList()
 | 
			
		||||
      this.initEventHandler()
 | 
			
		||||
    },
 | 
			
		||||
    beforeDestroy() {
 | 
			
		||||
      this.unregisterFromRefList()
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      handelCloseCustomEvent() {
 | 
			
		||||
        if (!!this.field.options.onClose) {
 | 
			
		||||
          let changeFn = new Function(this.field.options.onClose)
 | 
			
		||||
          changeFn.call(this)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <container-item-wrapper>
 | 
			
		||||
    <el-card :key="widget.id" class="card-container" :class="[customClass]"
 | 
			
		||||
             :shadow="widget.options.shadow" :style="{width: widget.options.cardWidth + '!important' || ''}"
 | 
			
		||||
             :ref="widget.id" v-show="!widget.options.hidden">
 | 
			
		||||
      <div slot="header"><span>{{widget.options.label}}</span></div>
 | 
			
		||||
      <template v-if="!!widget.widgetList && (widget.widgetList.length > 0)">
 | 
			
		||||
        <template v-for="(subWidget, swIdx) in widget.widgetList">
 | 
			
		||||
          <template v-if="'container' === subWidget.category">
 | 
			
		||||
            <component :is="subWidget.type + '-item'" :widget="subWidget" :key="swIdx" :parent-list="widget.widgetList"
 | 
			
		||||
                       :index-of-parent-list="swIdx" :parent-widget="widget"></component>
 | 
			
		||||
          </template>
 | 
			
		||||
          <template v-else>
 | 
			
		||||
            <component :is="subWidget.type + '-widget'" :field="subWidget" :designer="null" :key="swIdx" :parent-list="widget.widgetList"
 | 
			
		||||
                       :index-of-parent-list="swIdx" :parent-widget="widget"></component>
 | 
			
		||||
          </template>
 | 
			
		||||
        </template>
 | 
			
		||||
      </template>
 | 
			
		||||
    </el-card>
 | 
			
		||||
  </container-item-wrapper>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import emitter from 'element-ui/lib/mixins/emitter'
 | 
			
		||||
  import i18n from "@/utils/i18n"
 | 
			
		||||
  import refMixin from "@/components/form-render/refMixin"
 | 
			
		||||
  import ContainerItemWrapper from '@/components/form-render/container-item/container-item-wrapper'
 | 
			
		||||
  import containerItemMixin from "@/components/form-render/container-item/containerItemMixin"
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "card-item",
 | 
			
		||||
    componentName: 'ContainerItem',
 | 
			
		||||
    mixins: [emitter, i18n, refMixin, containerItemMixin],
 | 
			
		||||
    components: {
 | 
			
		||||
      ContainerItemWrapper,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
      widget: Object,
 | 
			
		||||
    },
 | 
			
		||||
    inject: ['refList', 'sfRefList', 'globalModel'],
 | 
			
		||||
    computed: {
 | 
			
		||||
      customClass() {
 | 
			
		||||
        return this.widget.options.customClass || ''
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    created() {
 | 
			
		||||
      this.initRefList()
 | 
			
		||||
    },
 | 
			
		||||
    beforeDestroy() {
 | 
			
		||||
      this.unregisterFromRefList()
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
  ::v-deep .el-card__header {
 | 
			
		||||
    padding: 10px 12px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,83 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <container-wrapper :designer="designer" :widget="widget" :parent-widget="parentWidget" :parent-list="parentList"
 | 
			
		||||
                     :index-of-parent-list="indexOfParentList">
 | 
			
		||||
    <el-card :key="widget.id" class="card-container" @click.native.stop="selectWidget(widget)"
 | 
			
		||||
             :shadow="widget.options.shadow" :style="{width: widget.options.cardWidth + '!important' || ''}"
 | 
			
		||||
             :class="[selected ? 'selected' : '', customClass]">
 | 
			
		||||
      <div slot="header"><span>{{widget.options.label}}</span></div>
 | 
			
		||||
      <draggable :list="widget.widgetList" v-bind="{group:'dragGroup', ghostClass: 'ghost',animation: 200}"
 | 
			
		||||
                 handle=".drag-handler"
 | 
			
		||||
                 @add="(evt) => onContainerDragAdd(evt, widget.widgetList)"
 | 
			
		||||
                 @update="onContainerDragUpdate" :move="checkContainerMove">
 | 
			
		||||
        <transition-group name="fade" tag="div" class="form-widget-list">
 | 
			
		||||
          <template v-for="(subWidget, swIdx) in widget.widgetList">
 | 
			
		||||
            <template v-if="'container' === subWidget.category">
 | 
			
		||||
              <component :is="subWidget.type + '-widget'" :widget="subWidget" :designer="designer" :key="subWidget.id" :parent-list="widget.widgetList"
 | 
			
		||||
                         :index-of-parent-list="swIdx" :parent-widget="widget"></component>
 | 
			
		||||
            </template>
 | 
			
		||||
            <template v-else>
 | 
			
		||||
              <component :is="subWidget.type + '-widget'" :field="subWidget" :designer="designer" :key="subWidget.id" :parent-list="widget.widgetList"
 | 
			
		||||
                         :index-of-parent-list="swIdx" :parent-widget="widget" :design-state="true"></component>
 | 
			
		||||
            </template>
 | 
			
		||||
          </template>
 | 
			
		||||
        </transition-group>
 | 
			
		||||
      </draggable>
 | 
			
		||||
    </el-card>
 | 
			
		||||
  </container-wrapper>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import i18n from "@/utils/i18n"
 | 
			
		||||
  import containerMixin from "@/components/form-designer/form-widget/container-widget/containerMixin"
 | 
			
		||||
  import Draggable from 'vuedraggable'
 | 
			
		||||
  import ContainerWrapper from "@/components/form-designer/form-widget/container-widget/container-wrapper"
 | 
			
		||||
  import FieldComponents from '@/components/form-designer/form-widget/field-widget/index'
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "card-widget",
 | 
			
		||||
    componentName: 'ContainerWidget',
 | 
			
		||||
    mixins: [i18n, containerMixin],
 | 
			
		||||
    components: {
 | 
			
		||||
      Draggable,
 | 
			
		||||
      ContainerWrapper,
 | 
			
		||||
      ...FieldComponents,
 | 
			
		||||
    },
 | 
			
		||||
    props: {
 | 
			
		||||
      widget: Object,
 | 
			
		||||
      parentWidget: Object,
 | 
			
		||||
      parentList: Array,
 | 
			
		||||
      indexOfParentList: Number,
 | 
			
		||||
      designer: Object,
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
      selected() {
 | 
			
		||||
        return this.widget.id === this.designer.selectedId
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      customClass() {
 | 
			
		||||
        return this.widget.options.customClass || ''
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      /**
 | 
			
		||||
       * 检查接收哪些组件拖放,如不接受某些组件拖放,则根据组件类型判断后返回false
 | 
			
		||||
       * @param evt
 | 
			
		||||
       * @returns {boolean}
 | 
			
		||||
       */
 | 
			
		||||
      checkContainerMove(evt) {
 | 
			
		||||
        return true
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
  .card-container.selected {
 | 
			
		||||
    outline: 2px solid $--color-primary !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .el-card__header {
 | 
			
		||||
    padding: 10px 12px;
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
export const cardSchema = {
 | 
			
		||||
  type: 'card',
 | 
			
		||||
  category: 'container',
 | 
			
		||||
  icon: 'card',
 | 
			
		||||
  widgetList: [],
 | 
			
		||||
  options: {
 | 
			
		||||
    name: '',
 | 
			
		||||
    label: 'card',
 | 
			
		||||
    hidden: false,
 | 
			
		||||
    cardWidth: '100%',
 | 
			
		||||
    shadow: 'never',
 | 
			
		||||
    customClass: '',
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const alertSchema = {
 | 
			
		||||
  type: 'alert',
 | 
			
		||||
  icon: 'alert',
 | 
			
		||||
  formItemFlag: false,
 | 
			
		||||
  options: {
 | 
			
		||||
    name: '',
 | 
			
		||||
    title: 'Good things are coming...',
 | 
			
		||||
    type: 'info',
 | 
			
		||||
    description: '',
 | 
			
		||||
    closable: true,
 | 
			
		||||
    closeText: '',
 | 
			
		||||
    center: true,
 | 
			
		||||
    showIcon: false,
 | 
			
		||||
    effect: 'light',
 | 
			
		||||
    hidden: false,
 | 
			
		||||
    onClose: '',
 | 
			
		||||
    customClass: '',
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1634810180296" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6431" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300"><defs><style type="text/css"></style></defs><path d="M512 85.162667a319.573333 319.573333 0 0 1 319.829333 309.333333l0.170667 10.666667v174.805333l58.88 134.656a53.290667 53.290667 0 0 1-48.853333 74.709333L640 789.418667a128 128 0 0 1-255.786667 7.509333L384 789.290667l-201.6 0.042666a53.333333 53.333333 0 0 1-48.938667-74.581333L192 580.010667V405.162667c0-177.28 143.018667-320 320-320zM576 789.333333l-128 0.128a64 64 0 0 0 127.701333 6.144l0.256-6.272zM512 149.162667c-141.653333 0-256 114.090667-256 256v188.16L198.656 725.333333h627.072L768 593.365333V405.717333l-0.170667-9.6A255.488 255.488 0 0 0 512 149.162667z m384 202.837333h85.333333a32 32 0 0 1 4.352 63.701333L981.333333 416h-85.333333a32 32 0 0 1-4.352-63.701333L896 352z m-853.333333 0h85.333333a32 32 0 0 1 4.352 63.701333L128 416H42.666667a32 32 0 0 1-4.352-63.701333L42.666667 352z m921.6-243.2a32 32 0 0 1-2.816 41.685333l-3.584 3.114667-85.333334 64a32 32 0 0 1-41.984-48.085333l3.584-3.114667 85.333334-64a32 32 0 0 1 44.8 6.4zM104.533333 102.4l85.333334 64a32 32 0 1 1-38.4 51.2l-85.333334-64a32 32 0 1 1 38.4-51.2z" p-id="6432"></path></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.4 KiB  | 
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1634802035575" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4165" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300"><defs><style type="text/css"></style></defs><path d="M858.656 864H165.344C109.472 864 64 818.56 64 762.688V261.312C64 205.44 109.472 160 165.344 160h693.312C914.528 160 960 205.44 960 261.312v501.376C960 818.56 914.528 864 858.656 864zM165.344 224C144.736 224 128 240.736 128 261.312v501.376C128 783.264 144.736 800 165.344 800h693.312C879.264 800 896 783.264 896 762.688V261.312C896 240.736 879.264 224 858.656 224H165.344zM800 416H224c-17.664 0-32-14.336-32-32s14.336-32 32-32h576c17.696 0 32 14.336 32 32s-14.304 32-32 32zM320 736h-96c-17.664 0-32-14.304-32-32s14.336-32 32-32h96c17.664 0 32 14.304 32 32s-14.336 32-32 32z" fill="#333333" p-id="4166"></path></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 991 B  | 
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1634631759986" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11934" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300"><defs><style type="text/css"></style></defs><path d="M915.692 39.385H108.308c-15.754 0-29.539 13.784-29.539 29.538v98.462c0 15.753 13.785 29.538 29.539 29.538h807.384c15.754 0 29.539-13.785 29.539-29.538V68.923c0-15.754-13.785-29.538-29.539-29.538zM285.538 275.692h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538V305.23c0-15.754-13.785-29.539-29.539-29.539z m315.077 0h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538V305.23c0-15.754-13.785-29.539-29.539-29.539z m315.077 0h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538V305.23c0-15.754-13.785-29.539-29.539-29.539zM285.538 472.615h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538v-59.077c0-15.754-13.785-29.539-29.539-29.539z m315.077 0h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538v-59.077c0-15.754-13.785-29.539-29.539-29.539z m315.077 0h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538v-59.077c0-15.754-13.785-29.539-29.539-29.539zM285.538 669.538h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538v-59.077c0-15.754-13.785-29.539-29.539-29.539z m315.077 0h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538v-59.077c0-15.754-13.785-29.539-29.539-29.539z m315.077 0h-177.23c-15.754 0-29.539 13.785-29.539 29.539v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538v-59.077c0-15.754-13.785-29.539-29.539-29.539zM285.538 866.462h-177.23c-15.754 0-29.539 13.784-29.539 29.538v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538V896c0-15.754-13.785-29.538-29.539-29.538z m315.077 0h-177.23c-15.754 0-29.539 13.784-29.539 29.538v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538V896c0-15.754-13.785-29.538-29.539-29.538z m315.077 0h-177.23c-15.754 0-29.539 13.784-29.539 29.538v59.077c0 15.754 13.785 29.538 29.539 29.538h177.23c15.754 0 29.539-13.784 29.539-29.538V896c0-15.754-13.785-29.538-29.539-29.538z" p-id="11935"></path></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 2.8 KiB  | 
| 
						 | 
				
			
			@ -29,6 +29,7 @@ export default {
 | 
			
		|||
      'grid-col':       'GridCol',
 | 
			
		||||
      'table-cell':     'TableCell',
 | 
			
		||||
      'tab-pane':       'TabPane',
 | 
			
		||||
      'data-table':     'DataTable',
 | 
			
		||||
 | 
			
		||||
      input:          'Input',
 | 
			
		||||
      textarea:       'Textarea',
 | 
			
		||||
| 
						 | 
				
			
			@ -154,7 +155,7 @@ export default {
 | 
			
		|||
      commonSetting: 'Common Setting',
 | 
			
		||||
      advancedSetting: 'Advanced Setting',
 | 
			
		||||
      eventSetting: 'Event Setting',
 | 
			
		||||
      fieldName: 'Unique Name',
 | 
			
		||||
      uniqueName: 'Unique Name',
 | 
			
		||||
      label: 'Label',
 | 
			
		||||
      displayType: 'Type',
 | 
			
		||||
      defaultValue: 'Default Value',
 | 
			
		||||
| 
						 | 
				
			
			@ -212,12 +213,15 @@ export default {
 | 
			
		|||
      fileTypesHelp: 'Allows to add more file types',
 | 
			
		||||
      headers: 'Request Headers',
 | 
			
		||||
 | 
			
		||||
      cellWidth: 'width',
 | 
			
		||||
      cellHeight: 'height',
 | 
			
		||||
      cellWidth: 'Width',
 | 
			
		||||
      cellHeight: 'Height',
 | 
			
		||||
      gutter: 'Gutter(px)',
 | 
			
		||||
      columnSetting: 'Cols Setting',
 | 
			
		||||
      colsOfGrid: 'Cols Of Grid:',
 | 
			
		||||
      colSpanTitle: 'Spans Of Col',
 | 
			
		||||
      colOffsetTitle: 'Offset Of Col',
 | 
			
		||||
      colPushTitle: 'Push Of Col',
 | 
			
		||||
      colPullTitle: 'Pull Of Col',
 | 
			
		||||
      addColumn: 'Add Column',
 | 
			
		||||
 | 
			
		||||
      tabPaneSetting: 'Tab Panes',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,24 @@
 | 
			
		|||
export default {
 | 
			
		||||
  extension: {
 | 
			
		||||
    widgetLabel: {
 | 
			
		||||
      card: 'Card',
 | 
			
		||||
      alert: 'Alert',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setting: {
 | 
			
		||||
      cardWidth: 'Width Of Card',
 | 
			
		||||
      cardShadow: 'Shadow',
 | 
			
		||||
 | 
			
		||||
      alertTitle: 'Title',
 | 
			
		||||
      alertType: 'Type',
 | 
			
		||||
      description: 'Description',
 | 
			
		||||
      closable: 'Closable',
 | 
			
		||||
      closeText: 'Text On Close Btn',
 | 
			
		||||
      center: 'Center',
 | 
			
		||||
      showIcon: 'Show Icon',
 | 
			
		||||
      effect: 'Effect',
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ export default {
 | 
			
		|||
      'grid-col':       '栅格列',
 | 
			
		||||
      'table-cell':     '单元格',
 | 
			
		||||
      'tab-pane':       '选项卡页',
 | 
			
		||||
      'data-table':     '数据表格',
 | 
			
		||||
 | 
			
		||||
      input:          '单行输入',
 | 
			
		||||
      textarea:       '多行输入',
 | 
			
		||||
| 
						 | 
				
			
			@ -154,7 +155,7 @@ export default {
 | 
			
		|||
      commonSetting: '常见属性',
 | 
			
		||||
      advancedSetting: '高级属性',
 | 
			
		||||
      eventSetting: '事件属性',
 | 
			
		||||
      fieldName: '字段唯一名称',
 | 
			
		||||
      uniqueName: '唯一名称',
 | 
			
		||||
      label: '字段标签',
 | 
			
		||||
      displayType: '显示类型',
 | 
			
		||||
      defaultValue: '默认值',
 | 
			
		||||
| 
						 | 
				
			
			@ -217,7 +218,10 @@ export default {
 | 
			
		|||
      gutter: '栅格间隔(像素)',
 | 
			
		||||
      columnSetting: '栅格属性设置',
 | 
			
		||||
      colsOfGrid: '当前栅格列:',
 | 
			
		||||
      colSpanTitle: '栅格列',
 | 
			
		||||
      colSpanTitle: '栅格宽度',
 | 
			
		||||
      colOffsetTitle: '左侧间隔格数',
 | 
			
		||||
      colPushTitle: '右移栅格数',
 | 
			
		||||
      colPullTitle: '左移栅格数',
 | 
			
		||||
      addColumn: '增加栅格',
 | 
			
		||||
 | 
			
		||||
      tabPaneSetting: '选项卡设置',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,24 @@
 | 
			
		|||
export default {
 | 
			
		||||
  extension: {
 | 
			
		||||
    widgetLabel: {
 | 
			
		||||
      card: '卡片',
 | 
			
		||||
      alert: '提示',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setting: {
 | 
			
		||||
      cardWidth: '卡片宽度',
 | 
			
		||||
      cardShadow: '显示阴影',
 | 
			
		||||
 | 
			
		||||
      alertTitle: '标题',
 | 
			
		||||
      alertType: '类型',
 | 
			
		||||
      description: '辅助性文字',
 | 
			
		||||
      closable: '是否可关闭',
 | 
			
		||||
      closeText: '关闭按钮文字',
 | 
			
		||||
      center: '文字居中',
 | 
			
		||||
      showIcon: '显示图标',
 | 
			
		||||
      effect: '显示效果',
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,9 @@ import 'element-ui/lib/theme-chalk/index.css'
 | 
			
		|||
import '@/styles/index.scss'
 | 
			
		||||
import '@/iconfont/iconfont.css'
 | 
			
		||||
 | 
			
		||||
import {loadExtension} from '@/extension/extension-loader'
 | 
			
		||||
 | 
			
		||||
loadExtension()
 | 
			
		||||
 | 
			
		||||
Vue.use(ElementUI, { size: 'small' })
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,6 @@ const langResources = {
 | 
			
		|||
 | 
			
		||||
Vue.use(VueI18n)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const i18n = new VueI18n({
 | 
			
		||||
  locale: localStorage.getItem('v_form_locale') || 'zh-CN',
 | 
			
		||||
  //locale: 'en-US',
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +57,14 @@ export default {
 | 
			
		|||
  methods: {
 | 
			
		||||
    i18nt(key) {
 | 
			
		||||
      return i18n._t(key, i18n.locale, i18n._getMessages())
 | 
			
		||||
    }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    /* 如果key1不存在,则查找key2 */
 | 
			
		||||
    i18n2t(key1, key2) {
 | 
			
		||||
      return i18n.te(key1) ? i18n._t(key1, i18n.locale, i18n._getMessages()) :
 | 
			
		||||
          i18n._t(key2, i18n.locale, i18n._getMessages())
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue