UNPKG

vxe-design

Version:

A PC-based visual designer based on Vxe UI, used for building zero-code and low-code platforms

1,234 lines (1,214 loc) 336 kB
import { VxeUI, renderer as renderer$2, getI18n as getI18n$4, getIcon as getIcon$2, useSize as useSize$1, getConfig as getConfig$1, createEvent as createEvent$1, renderEmptyElement as renderEmptyElement$1 } from '@vxe-ui/core'; export { VxeUI } from '@vxe-ui/core'; import { defineComponent, ref, reactive, h, inject, createCommentVNode, TransitionGroup, watch, provide, nextTick, computed, onMounted } from 'vue'; import XEUtils from 'xe-utils'; import 'dom-zindex'; const { setConfig: setConfig$1, setIcon } = VxeUI; VxeUI.designVersion = "4.1.6"; setConfig$1({ formDesign: { height: 400, showHeader: true, showPc: true, showStyleSetting: false }, formView: {}, listDesign: { height: 400, showPc: true }, listView: {} }); const iconPrefix = 'vxe-icon-'; setIcon({ // form-design FORM_DESIGN_STYLE_SETTING: iconPrefix + 'layout', FORM_DESIGN_PROPS_PC: iconPrefix + 'pc', FORM_DESIGN_PROPS_MOBILE: iconPrefix + 'mobile', FORM_DESIGN_PROPS_ADD: iconPrefix + 'add', FORM_DESIGN_PROPS_EDIT: iconPrefix + 'edit', FORM_DESIGN_WIDGET_ADD: iconPrefix + 'square-plus-fill', FORM_DESIGN_WIDGET_COPY: iconPrefix + 'copy', FORM_DESIGN_WIDGET_DELETE: iconPrefix + 'delete', FORM_DESIGN_WIDGET_SWAP_LR: iconPrefix + 'swap', FORM_DESIGN_WIDGET_OPTION_DELETE: iconPrefix + 'delete', FORM_DESIGN_WIDGET_OPTION_EXPAND_OPEN: iconPrefix + 'square-plus', FORM_DESIGN_WIDGET_OPTION_EXPAND_CLOSE: iconPrefix + 'square-minus', // list-design LIST_DESIGN_FIELD_SETTING: iconPrefix + 'custom-column', LIST_DESIGN_LIST_SETTING: iconPrefix + 'menu', LIST_DESIGN_LIST_SETTING_SEARCH_DELETE: iconPrefix + 'delete', LIST_DESIGN_LIST_SETTING_ACTIVE_DELETE: iconPrefix + 'delete' }); const { log } = VxeUI; const designVersion = `design v${"4.1.6"}`; function createComponentLog(name) { const uiVersion = VxeUI.uiVersion ? `ui v${VxeUI.uiVersion}` : ''; const tableVersion = VxeUI.tableVersion ? `table v${VxeUI.tableVersion}` : ''; const ganttVersion = VxeUI.ganttVersion ? `gantt v${VxeUI.ganttVersion}` : ''; const versionInfo = [uiVersion, tableVersion, ganttVersion, designVersion].join(' '); return { warnLog: log.create('warn', versionInfo + '] [' + name), errLog: log.create('error', versionInfo + '] [' + name) }; } const warnLog = log.create('warn', designVersion); const errLog$3 = log.create('error', designVersion); function checkDependVersion() { const pVersion = 4; const sVersion = 11; if (VxeUI.checkVersion) { if (!VxeUI.checkVersion(VxeUI.tableVersion, pVersion, sVersion)) { errLog$3('vxe.error.errorVersion', [`vxe-table@${VxeUI.tableVersion || '?'}`, `vxe-table v${pVersion}.${sVersion}+`]); } } else { errLog$3(`Requires vxe-table v${pVersion}.${sVersion}+`); } } const defineVxeComponent = defineComponent; var VxeFlowDesignComponent = defineVxeComponent({ name: 'VxeFlowDesign', props: {}, emits: [], setup(props, context) { const { slots } = context; const xID = XEUtils.uniqueId(); const refElem = ref(); const reactData = reactive({}); const refMaps = { refElem }; const computeMaps = {}; const $xeFlowDesign = { xID, props, context, reactData, getRefMaps: () => refMaps, getComputeMaps: () => computeMaps }; const renderVN = () => { const defaultSlot = slots.default; return h('div', { ref: refElem, class: ['vxe-flow-design'] }, defaultSlot ? defaultSlot({}) : []); }; $xeFlowDesign.renderVN = renderVN; return $xeFlowDesign; }, render() { return this.renderVN(); } }); const VxeFlowDesign = Object.assign({}, VxeFlowDesignComponent, { install(app) { checkDependVersion(); app.component(VxeFlowDesignComponent.name, VxeFlowDesignComponent); } }); if (VxeUI.dynamicApp) { VxeUI.dynamicApp.use(VxeFlowDesign); } VxeUI.component(VxeFlowDesignComponent); const FlowDesign = VxeFlowDesign; var VxeFlowViewComponent = defineVxeComponent({ name: 'VxeFlowView', props: {}, emits: [], setup(props, context) { const { slots } = context; const xID = XEUtils.uniqueId(); const refElem = ref(); const reactData = reactive({}); const refMaps = { refElem }; const computeMaps = {}; const $xeFlowView = { xID, props, context, reactData, getRefMaps: () => refMaps, getComputeMaps: () => computeMaps }; const renderVN = () => { const defaultSlot = slots.default; return h('div', { ref: refElem, class: ['vxe-flow-view'] }, defaultSlot ? defaultSlot({}) : []); }; $xeFlowView.renderVN = renderVN; return $xeFlowView; }, render() { return this.renderVN(); } }); const VxeFlowView = Object.assign({}, VxeFlowViewComponent, { install(app) { checkDependVersion(); app.component(VxeFlowViewComponent.name, VxeFlowViewComponent); } }); if (VxeUI.dynamicApp) { VxeUI.dynamicApp.use(VxeFlowView); } VxeUI.component(VxeFlowViewComponent); const FlowView = VxeFlowView; function toCssUnit(val, unit = 'px') { if (XEUtils.isNumber(val) || /^\d+$/.test(`${val}`)) { return `${val}${unit}`; } return `${val || ''}`; } function isEnableConf(conf) { return conf && conf.enabled !== false; } let maxWidgetId = 100000; function getNewWidgetId(widgetObjList) { XEUtils.eachTree(widgetObjList, item => { if (item) { maxWidgetId = Math.max(maxWidgetId, item.id); } }, { children: 'children' }); return ++maxWidgetId; } /** * 判断是否布局控件 */ const hasFormDesignLayoutType = (widget) => { if (widget) { const widgetConf = getWidgetConfig(widget.name); return widgetConf.group === 'layout'; } return false; }; const { errLog: errLog$2 } = createComponentLog('form-design'); // 控件原始配置信息,带响应 const refWidgetReactConfigMaps$1 = ref({}); const getWidgetConfig = (name) => { const widgetReactConfigMaps = refWidgetReactConfigMaps$1.value; return widgetReactConfigMaps[name] || {}; }; function getWidgetConfigTitle(name, $xeFormDesign) { const widgetConf = getWidgetConfig(name); if (widgetConf) { const configTitle = widgetConf.title; const params = { name, $formDesign: $xeFormDesign }; return XEUtils.toValueString(XEUtils.isFunction(configTitle) ? configTitle(params) : configTitle); } return name; } function getWidgetConfigCustomGroup(name, $xeFormDesign) { const widgetConf = getWidgetConfig(name); if (widgetConf) { const configCustomGroup = widgetConf.customGroup; const params = { name, $formDesign: $xeFormDesign }; return XEUtils.toValueString(XEUtils.isFunction(configCustomGroup) ? configCustomGroup(params) : configCustomGroup); } return name; } const validWidgetUniqueField = (field, widgetObjList) => { return !XEUtils.findTree(widgetObjList, item => item.field === field, { children: 'children' }); }; class FormDesignWidgetInfo { constructor($xeFormDesign, name, widgetObjList) { Object.defineProperty(this, "id", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "field", { enumerable: true, configurable: true, writable: true, value: '' }); Object.defineProperty(this, "title", { enumerable: true, configurable: true, writable: true, value: '' }); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: '' }); Object.defineProperty(this, "required", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "hidden", { enumerable: true, configurable: true, writable: true, value: false }); Object.defineProperty(this, "options", { enumerable: true, configurable: true, writable: true, value: {} }); Object.defineProperty(this, "children", { enumerable: true, configurable: true, writable: true, value: [] }); Object.defineProperty(this, "model", { enumerable: true, configurable: true, writable: true, value: { update: false, value: '' } }); let customField = ''; if (name) { const compConf = renderer$2.get(name) || {}; if (compConf) { const widgetReactConfigMaps = refWidgetReactConfigMaps$1.value; const createWidgetFormConfig = compConf.createFormDesignWidgetConfig; if (createWidgetFormConfig) { const params = { name, $formDesign: $xeFormDesign }; const widgetConfig = createWidgetFormConfig(params) || {}; const titleConf = widgetConfig.title; const fieldConf = widgetConfig.field; this.title = XEUtils.toValueString(XEUtils.isFunction(titleConf) ? titleConf(params) : titleConf); this.options = widgetConfig.options || {}; this.children = widgetConfig.children || []; if (fieldConf) { if (XEUtils.isFunction(fieldConf)) { customField = fieldConf({ name, $formDesign: $xeFormDesign }); } else { customField = fieldConf; } } if (!widgetReactConfigMaps[name]) { widgetReactConfigMaps[name] = Object.assign({}, widgetConfig); refWidgetReactConfigMaps$1.value = Object.assign({}, widgetReactConfigMaps); } } } } const widgetId = getNewWidgetId(widgetObjList); if (customField) { // 如果使用了自定义字段,验证字段名是否唯一 if (!validWidgetUniqueField(customField, widgetObjList)) { errLog$2('vxe.error.uniField', [customField]); } } this.id = widgetId; this.field = customField || `${name}${widgetId}`.toLowerCase(); this.name = name; } } function configToWidget(conf) { const widget = new FormDesignWidgetInfo(null, conf.name, []); widget.id = conf.id; widget.title = conf.title || ''; widget.field = conf.field || ''; widget.required = conf.required || false; widget.hidden = conf.hidden || false; widget.options = Object.assign({}, widget.options, conf.options); widget.children = conf.children ? conf.children.map(item => configToWidget(item)) : []; return widget; } function getSlotVNs(vns) { if (XEUtils.isArray(vns)) { return vns; } return vns ? [vns] : []; } var LayoutWidgetComponent = defineVxeComponent({ props: {}, emits: [], setup() { const $xeFormDesign = inject('$xeFormDesign', null); if (!$xeFormDesign) { return () => []; } const { reactData: formDesignReactData } = $xeFormDesign; const dragstartEvent = (evnt) => { const divEl = evnt.currentTarget; const dataTransfer = evnt.dataTransfer; const widgetName = divEl.getAttribute('data-widget-name') || ''; if ($xeFormDesign.validWidgetUnique(widgetName)) { const dragWidget = $xeFormDesign.createWidget(widgetName); if (dataTransfer) { dataTransfer.setData('text/plain', widgetName); } formDesignReactData.sortWidget = null; formDesignReactData.dragWidget = dragWidget; } else { evnt.preventDefault(); } }; const dragendEvent = (evnt) => { evnt.preventDefault(); if (formDesignReactData.dragWidget) { const newWidget = formDesignReactData.dragWidget; formDesignReactData.activeWidget = newWidget; $xeFormDesign.dispatchEvent('widget-add', { newWidget }, evnt); // add-widget 已废弃 $xeFormDesign.dispatchEvent('add-widget', { newWidget }, evnt); } formDesignReactData.dragWidget = null; formDesignReactData.sortWidget = null; }; const cancelDragoverItem = (evnt, group) => { const { widgetObjList, dragWidget } = formDesignReactData; if (dragWidget) { if (group.children.some(widget => widget.name === dragWidget.name)) { const rest = XEUtils.findTree(widgetObjList, item => item && item.id === dragWidget.id, { children: 'children' }); if (rest) { rest.items.splice(rest.index, 1); } } } }; const addNewWidget = (evnt, widgetName) => { if ($xeFormDesign.validWidgetUnique(widgetName)) { const { widgetObjList } = formDesignReactData; const dragWidget = $xeFormDesign.createWidget(widgetName); widgetObjList.push(dragWidget); formDesignReactData.activeWidget = dragWidget; formDesignReactData.sortWidget = null; formDesignReactData.dragWidget = null; $xeFormDesign.dispatchEvent('widget-add', { newWidget: dragWidget }, evnt); // add-widget 已废弃 $xeFormDesign.dispatchEvent('add-widget', { newWidget: dragWidget }, evnt); } }; const renderWidgetIcon = (widgetConf) => { const { icon } = widgetConf; let icVns = []; if (icon) { if (XEUtils.isFunction(icon)) { icVns = getSlotVNs(icon({ widget: widgetConf })); } else { icVns.push(h('i', { class: icon })); } } return h('div', { class: 'vxe-form-design--widget-item-icon' }, icVns); }; const renderWidgetList = (group) => { const widgetVNs = []; if (group.children) { group.children.forEach((widget, index) => { const { name } = widget; const configTitle = getWidgetConfigTitle(name, $xeFormDesign); const compConf = renderer$2.get(name) || {}; const widgetConf = getWidgetConfig(name); const renderWidgetItem = compConf.renderFormDesignWidgetItem; widgetVNs.push(h('div', { key: index, class: 'vxe-form-design--widget-item' }, h('div', { class: 'vxe-form-design--widget-box', 'data-widget-name': name, title: configTitle, draggable: true, onDragstart: dragstartEvent, onDragend: dragendEvent }, renderWidgetItem ? getSlotVNs(renderWidgetItem({}, { $formDesign: $xeFormDesign })) : [ renderWidgetIcon(widgetConf), h('div', { class: 'vxe-form-design--widget-item-name' }, configTitle), h('div', { class: 'vxe-form-design--widget-item-add', onClick(evnt) { addNewWidget(evnt, name); } }, [ h('i', { class: getIcon$2().FORM_DESIGN_WIDGET_ADD }) ]) ]))); }); } return widgetVNs; }; const renderWidgetGroups = () => { const { widgetConfigs } = formDesignReactData; return widgetConfigs.map((config, gIndex) => { const { title, group } = config; return h('div', { key: gIndex, class: 'vxe-form-design--widget-group' }, [ h('div', { class: 'vxe-form-design--widget-title' }, group ? getI18n$4(`vxe.formDesign.widget.group.${group}`) : `${title || ''}`), h('div', { class: 'vxe-form-design--widget-list', onDragover(evnt) { cancelDragoverItem(evnt, config); } }, renderWidgetList(config)) ]); }); }; return () => { return h('div', { class: 'vxe-form-design--widget' }, renderWidgetGroups()); }; } }); const ViewItemComponent = defineVxeComponent({ name: 'FormDesignLayoutViewItem', props: { item: { type: Object, default: () => ({}) }, itemIndex: { type: Number, default: 0 }, items: { type: Array, default: () => [] } }, emits: [], setup(props, { slots }) { const VxeUIButtonComponent = VxeUI.getComponent('vxe-button'); const $xeFormDesign = inject('$xeFormDesign', null); if (!$xeFormDesign) { return () => []; } const { reactData: formDesignReactData } = $xeFormDesign; const sortDragstartEvent = (evnt) => { const { widgetObjList } = formDesignReactData; const divEl = evnt.currentTarget; const widgetId = Number(divEl.getAttribute('data-widget-id')); const currRest = XEUtils.findTree(widgetObjList, item => item && item.id === widgetId, { children: 'children' }); if (currRest) { formDesignReactData.dragWidget = null; formDesignReactData.sortWidget = currRest.item; } }; const sortDragendEvent = () => { formDesignReactData.activeWidget = formDesignReactData.sortWidget; formDesignReactData.sortWidget = null; }; const sortDragenterEvent = (evnt) => { const { widgetObjList, sortWidget } = formDesignReactData; const formDesignInternalData = $xeFormDesign.internalData; const { lastDragTime } = formDesignInternalData; if (lastDragTime && lastDragTime > Date.now() - 300) { evnt.preventDefault(); return; } if (sortWidget) { const divEl = evnt.currentTarget; evnt.preventDefault(); const widgetId = Number(divEl.getAttribute('data-widget-id')); if (widgetId !== sortWidget.id) { const targetRest = XEUtils.findTree(widgetObjList, item => item && item.id === widgetId, { children: 'children' }); if (targetRest) { const currRest = XEUtils.findTree(widgetObjList, item => item && item.id === sortWidget.id, { children: 'children' }); if (currRest) { // 控件换位置 if (currRest.parent && currRest.parent.name === 'row') { // 如是是从 row 移出 currRest.items[currRest.index] = $xeFormDesign.createEmptyWidget(); } else { currRest.items.splice(currRest.index, 1); } targetRest.items.splice(targetRest.index, 0, currRest.item); formDesignInternalData.lastDragTime = Date.now(); $xeFormDesign.dispatchEvent('widget-drag', { widget: currRest.item }, evnt); // drag-widget 已废弃 $xeFormDesign.dispatchEvent('drag-widget', { widget: currRest.item }, evnt); } } } } }; // const dragoverItemEvent = (evnt: DragEvent) => { // // const { sortWidget, dragWidget } = formDesignReactData // // if (sortWidget || dragWidget) { // // evnt.preventDefault() // // } // } const handleClickEvent = (evnt, item) => { $xeFormDesign.handleClickWidget(evnt, item); }; return () => { const { dragWidget, activeWidget, sortWidget } = formDesignReactData; const { item } = props; const { name } = item; const isActive = activeWidget && activeWidget.id === item.id; const defaultSlot = slots.default; return h('div', { key: item.id, 'data-widget-id': item.id, draggable: true, class: ['vxe-form-design--preview-item', `widget-${XEUtils.kebabCase(name)}`, { 'is--active': isActive, 'is--sort': sortWidget && sortWidget.id === item.id, 'is--drag': dragWidget && dragWidget.id === item.id }], onDragstart: sortDragstartEvent, onDragend: sortDragendEvent, onDragenter: sortDragenterEvent, // onDragover: dragoverItemEvent, onContextmenu(evnt) { $xeFormDesign.handleContextmenuWidget(evnt, item); }, onClick(evnt) { handleClickEvent(evnt, item); } }, [ h('div', { class: 'vxe-form-design--preview-item-view vxe-form--item-row' }, defaultSlot ? defaultSlot({}) : []), isActive ? h('div', { class: 'vxe-form-design--preview-item-operate' }, [ h(VxeUIButtonComponent, { icon: getIcon$2().FORM_DESIGN_WIDGET_COPY, status: 'primary', size: 'mini', circle: true, onClick(params) { $xeFormDesign.handleCopyWidget(params.$event, item); } }), h(VxeUIButtonComponent, { icon: getIcon$2().FORM_DESIGN_WIDGET_DELETE, status: 'danger', size: 'mini', circle: true, onClick(params) { $xeFormDesign.handleRemoveWidget(params.$event, item); } }) ]) : createCommentVNode() ]); }; } }); var LayoutPreviewComponent$1 = defineVxeComponent({ name: 'FormDesignLayoutPreview', props: {}, emits: [], setup() { const VxeUIFormComponent = VxeUI.getComponent('vxe-form'); const $xeFormDesign = inject('$xeFormDesign', null); if (!$xeFormDesign) { return () => []; } const { reactData: formDesignReactData } = $xeFormDesign; const dragenterEvent = (evnt) => { const { widgetObjList, dragWidget } = formDesignReactData; if (dragWidget) { evnt.preventDefault(); const rest = XEUtils.findTree(widgetObjList, item => item && item.id === dragWidget.id, { children: 'children' }); if (!rest) { formDesignReactData.sortWidget = dragWidget; widgetObjList.push(dragWidget); $xeFormDesign.dispatchEvent('widget-drag', { widget: dragWidget }, evnt); // drag-widget 已废弃 $xeFormDesign.dispatchEvent('drag-widget', { widget: dragWidget }, evnt); } } }; const dragoverEvent = (evnt) => { evnt.preventDefault(); }; let lastDragTime = Date.now(); const handleDragenterTopPlaceEvent = (evnt) => { const { widgetObjList, sortWidget } = formDesignReactData; evnt.stopPropagation(); if (lastDragTime > Date.now() - 300) { evnt.preventDefault(); return; } if (sortWidget) { if (hasFormDesignLayoutType(sortWidget)) { return; } // const targetRest = XEUtils.findTree(widgetObjList, item => item && item.id === widgetId, { children: 'children' }) const currRest = XEUtils.findTree(widgetObjList, item => item.id === sortWidget.id, { children: 'children' }); if (currRest) { const { item, index, items, parent } = currRest; if (parent && parent.name === 'row') { // 如是是从 row 移出 currRest.items[currRest.index] = $xeFormDesign.createEmptyWidget(); } else { items.splice(index, 1); } widgetObjList.unshift(item); lastDragTime = Date.now(); $xeFormDesign.dispatchEvent('widget-drag', { widget: item }, evnt); // drag-widget 已废弃 $xeFormDesign.dispatchEvent('drag-widget', { widget: item }, evnt); } } }; const handleDragenterBottomPlaceEvent = (evnt) => { const { widgetObjList, sortWidget } = formDesignReactData; evnt.stopPropagation(); if (lastDragTime > Date.now() - 300) { evnt.preventDefault(); return; } if (sortWidget) { if (hasFormDesignLayoutType(sortWidget)) { return; } // const targetRest = XEUtils.findTree(widgetObjList, item => item && item.id === widgetId, { children: 'children' }) const currRest = XEUtils.findTree(widgetObjList, item => item.id === sortWidget.id, { children: 'children' }); if (currRest) { const { item, index, items, parent } = currRest; if (parent && parent.name === 'row') { // 如是是从 row 移出 currRest.items[currRest.index] = $xeFormDesign.createEmptyWidget(); } else { items.splice(index, 1); } widgetObjList.push(item); lastDragTime = Date.now(); $xeFormDesign.dispatchEvent('widget-drag', { widget: item }, evnt); // drag-widget 已废弃 $xeFormDesign.dispatchEvent('drag-widget', { widget: item }, evnt); } } }; return () => { const { widgetObjList } = formDesignReactData; return h('div', { class: 'vxe-form-design--preview', onDragenter: dragenterEvent, onDragover: dragoverEvent }, [ h('div', { class: 'vxe-form-design--preview-wrapper' }, [ h('div', { class: 'vxe-form-design--preview-place-widget', onDragenter: handleDragenterTopPlaceEvent }), h(VxeUIFormComponent, { customLayout: true, span: 24, vertical: true }, { default() { return h(TransitionGroup, { class: 'vxe-form-design--preview-list', tag: 'div', name: 'vxe-form-design--preview-list' }, { default: () => { return widgetObjList.map((widget, widgetIndex) => { return h(ViewItemComponent, { key: widget.id, item: widget, itemIndex: widgetIndex, items: widgetObjList }, { default() { const { name } = widget; const compConf = renderer$2.get(name) || {}; const renderWidgetDesignView = compConf.renderFormDesignWidgetEdit || compConf.renderFormDesignWidgetView; const renderOpts = widget; const isEditMode = true; const params = { widget, readonly: false, disabled: false, isEditMode, isViewMode: !isEditMode, $formDesign: $xeFormDesign, $formView: null }; return renderWidgetDesignView ? getSlotVNs(renderWidgetDesignView(renderOpts, params)) : []; } }); }); } }); } }), h('div', { class: 'vxe-form-design--preview-place-widget', onDragenter: handleDragenterBottomPlaceEvent }) ]) ]); }; } }); const { getIcon: getIcon$1, getI18n: getI18n$3 } = VxeUI; const DefaultSettingFormComponent = defineVxeComponent({ name: 'DefaultSettingForm', props: { formData: { type: Object, default: () => ({}) } }, emits: [], setup(props) { const VxeUIFormComponent = VxeUI.getComponent('vxe-form'); const VxeUIFormItemComponent = VxeUI.getComponent('vxe-form-item'); const VxeUISwitchComponent = VxeUI.getComponent('vxe-switch'); const VxeUITextComponent = VxeUI.getComponent('vxe-text'); const $xeFormDesign = inject('$xeFormDesign', null); if (!$xeFormDesign) { return () => []; } const { props: formDesignProps } = $xeFormDesign; return () => { const { formData } = props; return h(VxeUIFormComponent, { data: formData, span: 24, vertical: true, titleBold: true }, { default() { const { showPc, showMobile } = formDesignProps; return [ h(VxeUIFormItemComponent, { title: getI18n$3('vxe.formDesign.formName'), field: 'title', itemRender: { name: 'VxeInput', props: { placeholder: getI18n$3('vxe.formDesign.defFormTitle') } } }), showPc && showMobile ? h(VxeUIFormItemComponent, { title: getI18n$3('vxe.formDesign.widgetProp.displaySetting.name') }, { default() { return [ h('div', { class: 'vxe-form-design--widget-form-item-devices' }, [ h('div', { class: 'vxe-form-design--widget-form-item-pc' }, [ h(VxeUITextComponent, { icon: getIcon$1().FORM_DESIGN_PROPS_PC, content: getI18n$3('vxe.formDesign.widgetProp.displaySetting.pc') }), h(VxeUISwitchComponent, { modelValue: formData.pcVisible, openLabel: getI18n$3('vxe.formDesign.widgetProp.displaySetting.visible'), closeLabel: getI18n$3('vxe.formDesign.widgetProp.displaySetting.hidden'), 'onUpdate:modelValue'(val) { formData.pcVisible = val; } }) ]), h('div', { class: 'vxe-form-design--widget-form-item-mobile' }, [ h(VxeUITextComponent, { icon: getIcon$1().FORM_DESIGN_PROPS_MOBILE, content: getI18n$3('vxe.formDesign.widgetProp.displaySetting.mobile') }), h(VxeUISwitchComponent, { modelValue: formData.mobileVisible, openLabel: getI18n$3('vxe.formDesign.widgetProp.displaySetting.visible'), closeLabel: getI18n$3('vxe.formDesign.widgetProp.displaySetting.hidden'), 'onUpdate:modelValue'(val) { formData.mobileVisible = val; } }) ]) ]) ]; } }) : createCommentVNode() ]; } }); }; } }); var LayoutSettingComponent$1 = defineVxeComponent({ name: 'FormDesignLayoutSetting', props: {}, emits: [], setup() { const VxeUITabsComponent = VxeUI.getComponent('vxe-tabs'); const VxeUITabPaneComponent = VxeUI.getComponent('vxe-tab-pane'); const $xeFormDesign = inject('$xeFormDesign', null); if (!$xeFormDesign) { return () => []; } const { props: formDesignProps, reactData: formDesignReactData } = $xeFormDesign; const activeTab = ref(1); const renderSettingWidgetForm = () => { const { activeWidget } = formDesignReactData; if (activeWidget) { const compConf = renderer$2.get(activeWidget.name); const renderWidgetFormView = compConf ? compConf.renderFormDesignWidgetFormView : null; if (renderWidgetFormView) { const isEditMode = true; return h('div', { class: 'vxe-form-design--custom-widget-form-view' }, getSlotVNs(renderWidgetFormView(activeWidget, { isEditMode, isViewMode: !isEditMode, widget: activeWidget, $formDesign: $xeFormDesign, $formView: null }))); } } return createCommentVNode(); }; const renderSettingConfigForm = () => { const { formRender } = formDesignProps; const { formData } = formDesignReactData; if (formRender) { const compConf = renderer$2.get(formRender.name); const renderSettingView = compConf ? compConf.renderFormDesignSettingFormView : null; if (renderSettingView) { return h('div', { class: 'vxe-form-design--custom-setting-form-view' }, getSlotVNs(renderSettingView(formRender, { formConfig: formData, $formDesign: $xeFormDesign }))); } } return h(DefaultSettingFormComponent, { formData }); }; watch(() => formDesignReactData.activeWidget, () => { activeTab.value = 1; }); return () => { return h('div', { class: 'vxe-form-design--setting' }, [ h('div', { class: 'vxe-form-design--setting-form' }, [ h(VxeUITabsComponent, { modelValue: activeTab.value, titleWidth: '50%', titleAlign: 'center', padding: true, class: 'vxe-form-design--setting-form-tabs', 'onUpdate:modelValue'(val) { activeTab.value = val; } }, { default() { return [ h(VxeUITabPaneComponent, { title: getI18n$4('vxe.formDesign.widgetPropTab'), name: 1 }, { default() { return renderSettingWidgetForm(); } }), h(VxeUITabPaneComponent, { title: getI18n$4('vxe.formDesign.widgetFormTab'), name: 2 }, { default() { return renderSettingConfigForm(); } }) ]; } }) ]) ]); }; } }); const getDefaultSettingFormData$1 = (defOpts) => { return { title: '', pcVisible: defOpts ? !!defOpts.pcVisible : true, pcVertical: true, pcTitleBold: true, pcTitleColon: false, pcTitleAlign: '', pcTitleWidth: '', pcTitleAutoWidth: true, pcTitleWidthUnit: '', mobileVisible: defOpts ? !!defOpts.mobileVisible : true, mobileVertical: true, mobileTitleBold: true, mobileTitleColon: false, mobileTitleAlign: '', mobileTitleWidth: '', mobileTitleAutoWidth: true, mobileTitleWidthUnit: '' }; }; const createDefaultFormViewPCFormConfig = (params) => { const { formConfig } = params; return { vertical: formConfig.pcVertical, titleBold: formConfig.pcTitleBold, titleColon: formConfig.pcTitleColon, titleAlign: formConfig.pcTitleAlign, titleWidth: formConfig.pcTitleAutoWidth ? 'auto' : formConfig.pcTitleWidth }; }; const createDefaultFormViewMobileFormConfig = (params) => { const { formConfig } = params; return { vertical: formConfig.mobileVertical, titleBold: formConfig.mobileTitleBold, titleColon: formConfig.mobileTitleColon, titleAlign: formConfig.mobileTitleAlign, titleWidth: formConfig.mobileTitleAutoWidth ? 'auto' : formConfig.mobileTitleWidth }; }; var VxeFormViewComponent = defineVxeComponent({ name: 'VxeFormView', props: { modelValue: Object, config: Object, readonly: Boolean, disabled: Boolean, viewRender: Object, formOptions: Object, createFormConfig: Function, size: { type: String, default: () => getConfig$1().formView.size || getConfig$1().size } }, emits: [ 'update:modelValue', 'submit', 'reset' ], setup(props, context) { const VxeUIFormComponent = VxeUI.getComponent('vxe-form'); const VxeUIFormGroupComponent = VxeUI.getComponent('vxe-form-group'); const VxeUIFormItemComponent = VxeUI.getComponent('vxe-form-item'); const { emit, slots } = context; const xID = XEUtils.uniqueId(); const refElem = ref(); const formRef = ref(); const { computeSize } = useSize$1(props); const $xeFormDesignLayoutStyle = inject('$xeFormDesignLayoutStyle', null); const reactData = reactive({ formConfig: {}, formRules: {}, widgetObjList: [] }); const refMaps = { refElem }; const computeMaps = { computeSize }; const $xeFormView = { xID, props, context, reactData, getRefMaps: () => refMaps, getComputeMaps: () => computeMaps }; const clearConfig = () => { return loadConfig({ formConfig: {}, widgetData: [] }); }; const loadConfig = (config) => { if (config) { const { formConfig, widgetData } = config; loadFormConfig(formConfig || {}); loadWidgetData(widgetData || []); } return nextTick(); }; const parseConfig = (config) => { const { formConfig, widgetData } = config || {}; const widgetObjList = parseWidgetData(widgetData || []); return Object.assign(Object.assign({}, parseForm(widgetObjList)), { formConfig: parseFormConfig(formConfig || {}), widgetData: widgetObjList }); }; const parseFormConfig = (formConfig) => { const { viewRender, createFormConfig, formOptions } = props; const params = { viewRender, formConfig }; if (createFormConfig) { return createFormConfig(params); } const { name } = viewRender || {}; const compConf = renderer$2.get(name) || {}; const createPCFormConfig = compConf ? compConf.createFormViewFormConfig : null; return Object.assign({}, createPCFormConfig ? createPCFormConfig(params) : createDefaultFormViewPCFormConfig(params), formOptions); }; const loadFormConfig = (formConfig) => { reactData.formConfig = parseFormConfig(formConfig); return nextTick(); }; const parseForm = (widgetObjList) => { const formData = {}; const formRules = {}; XEUtils.eachTree(widgetObjList, widget => { const { name, field, required } = widget; const compConf = renderer$2.get(name) || {}; const createWidgetFieldValue = compConf.createFormDesignWidgetFieldValue; const createWidgetFieldRules = compConf.createFormDesignWidgetFieldRules; formData[field] = createWidgetFieldValue ? createWidgetFieldValue({ widget, $formView: $xeFormView }) : getWidgetDefaultValue(widget); if (createWidgetFieldRules) { const rules = createWidgetFieldRules({ widget, $formView: $xeFormView }); if (rules && rules.length) { formRules[field] = rules; } } else if (required) { formRules[field] = getWidgetDefaultRule(); } }, { children: 'children' }); return { formData, formRules }; }; const parseWidgetData = (widgetData) => { return (widgetData || []).map(item => configToWidget(item)); }; const loadWidgetData = (widgetData) => { const widgetObjList = parseWidgetData(widgetData); reactData.widgetObjList = widgetObjList; const { formData, formRules } = parseForm(widgetObjList); reactData.formRules = formRules; emit('update:modelValue', Object.assign(formData, props.modelValue)); return nextTick(); }; const getWidgetDefaultValue = (widget) => { switch (widget.name) { case 'subtable': return []; } return null; }; const getWidgetDefaultRule = () => { return [ { required: true, content: '该填写该字段!' } ]; }; const updateWidgetStatus = (widget, value) => { const { field } = widget; const $form = formRef.value; if ($form) { $form.updateStatus({ field }, value); } return nextTick(); }; const setItemValue = (widget, value) => { const { modelValue } = props; const { field } = widget; const $form = formRef.value; if (modelValue) { modelValue[field] = value; } if ($form) { $form.updateStatus({ field }, value); } return nextTick(); }; const getItemValue = (widget) => { const { modelValue } = props; if (modelValue) { return modelValue[widget.field]; } return null; }; const dispatchEvent = (type, params, evnt) => { emit(type, createEvent$1(evnt, { $formView: $xeFormView }, params)); }; const toWidgetFields = (widget) => { if (widget) { if (XEUtils.isArray(widget)) { return widget.map(item => item.name); } else { return [widget.name]; } } return null; }; const formViewMethods = { dispatchEvent, clearConfig, loadConfig, parseConfig, loadFormConfig, loadWidgetData, updateWidgetStatus, setItemValue, getItemValue, validate() { const $form = formRef.value; if ($form) { return $form.validate(); } return nextTick(); }, validateWidget(widget) { const $form = formRef.value; if ($form) { return $form.validateField(toWidgetFields(widget)); } return nextTick(); }, clearValidate(widget) { const $form = formRef.value; if ($form) { return $form.clearValidate(toWidgetFields(widget)); } return nextTick(); }, reset() { const { widgetObjList } = reactData; const { formData } = parseForm(widgetObjList); emit('update:modelValue', Object.assign({}, formData)); return nextTick(); }, /** * 已废弃 * @deprecated */ updateItemStatus(widget, value) { warnLog('vxe.error.delFunc', ['updateItemStatus', 'updateWidgetStatus']); return updateWidgetStatus(widget, value); } }; const handleSubmit = (params) => { dispatchEvent('submit', params, params.$event); }; const handleReset = (params) => { dispatchEvent('reset', params, params.$event); }; const formViewPrivateMethods = {}; Object.assign($xeFormView, formViewMethods, formViewPrivateMethods); const renderVN = () => { const { readonly, disabled, modelValue } = props; const { formConfig, formRules, widgetObjList } = reactData; const vSize = computeSize.value; const topSlot = slots.top; const bottomSlot = slots.bott