From 6e39c84c20baf5d4cb9425b601dae90376e74b43 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Thu, 22 Dec 2022 20:47:31 +0200 Subject: [PATCH] Added base logic --- .../form-designer/toolbar-panel/index.vue | 11 ++++- src/utils/widgets-preview.js | 47 +++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/utils/widgets-preview.js diff --git a/src/components/form-designer/toolbar-panel/index.vue b/src/components/form-designer/toolbar-panel/index.vue index dbca38c..56beaa1 100644 --- a/src/components/form-designer/toolbar-panel/index.vue +++ b/src/components/form-designer/toolbar-panel/index.vue @@ -50,7 +50,7 @@ :fullscreen="(layoutType === 'H5') || (layoutType === 'Pad')">
- @@ -201,7 +201,8 @@ import loadBeautifier from "@/utils/beautifierLoader" import { saveAs } from 'file-saver' import axios from 'axios' - import SvgIcon from "@/components/svg-icon/index"; + import SvgIcon from "@/components/svg-icon/index" + import { fillUnfilledWidgetPropsForPreview, unfilledWidgetPropsDefaultData } from "@/utils/widgets-preview" export default { name: "ToolbarPanel", @@ -273,6 +274,12 @@ } }, computed: { + previewFormJson() { + return { + widgetList: fillUnfilledWidgetPropsForPreview(this.designer.widgetList, unfilledWidgetPropsDefaultData), + formConfig: deepClone(this.designer.formConfig) + } + }, formJson() { return { // widgetList: this.designer.widgetList, diff --git a/src/utils/widgets-preview.js b/src/utils/widgets-preview.js new file mode 100644 index 0000000..74da360 --- /dev/null +++ b/src/utils/widgets-preview.js @@ -0,0 +1,47 @@ +import { deepClone } from "@/utils/util" + +const widgetPropsForDetectChanges = { + input: { defaultValue: '' }, + textarea: { defaultValue: '' }, + number: { defaultValue: 0 }, + radio: { defaultValue: null }, + checkbox: { defaultValue: [] }, + select: { defaultValue: '' }, + time: { defaultValue: null }, + 'time-range': { defaultValue: null }, + date: { defaultValue: null }, + 'date-range': { defaultValue: null }, + switch: { defaultValue: null }, + rate: { defaultValue: null }, + color: { defaultValue: null }, + slider: {}, + 'static-text': { textContent: 'static text' }, + 'html-text': { htmlContent: 'html text' }, + button: { label: 'button', type: '' }, + divider: { label: '' }, + 'picture-upload': { uploadURL: '' }, + 'file-upload': { uploadURL: '' }, + 'rich-editor': {}, + 'cascader': { defaultValue: '' } +} +export const unfilledWidgetPropsDefaultData = { + input: { defaultValue: 'test text' }, + checkbox: { defaultValue: [1] }, + button: { label: 'custom label', type: 'success' }, + time: { defaultValue: '16:04:48' }, +} +export function fillUnfilledWidgetPropsForPreview(widgets, unfilledWidgetPropsData) { + return deepClone(widgets).map((widget) => { + const widgetPropsForDetect = widgetPropsForDetectChanges[widget.type] + Object.keys(widgetPropsForDetect).forEach((widgetProp) => { + if( + unfilledWidgetPropsData[widget.type] + && + JSON.stringify(widget.options[widgetProp]) === JSON.stringify(widgetPropsForDetect[widgetProp]) + ) { + widget.options[widgetProp] = unfilledWidgetPropsData[widget.type][widgetProp] + } + }) + return widget + }); +}