From 666a880c4f20466d5228e30aa3acb9ff9922fbef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E4=BA=91=E9=A3=9E?= Date: Thu, 31 Mar 2022 17:46:50 +0800 Subject: [PATCH] feat:format control data --- src/editor/dataset/enum/Control.ts | 7 +++ src/editor/interface/Control.ts | 9 +++- src/editor/interface/Element.ts | 9 +++- src/editor/utils/element.ts | 69 ++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 3 deletions(-) diff --git a/src/editor/dataset/enum/Control.ts b/src/editor/dataset/enum/Control.ts index 2693e3c..15ea71a 100644 --- a/src/editor/dataset/enum/Control.ts +++ b/src/editor/dataset/enum/Control.ts @@ -1,4 +1,11 @@ export enum ControlType { TEXT = 'text', SELECT = 'select' +} + +export enum ControlComponent { + SUFFIX = 'suffix', + POSTFIX = 'postfix', + PLACEHOLDER = 'placeholder', + VALUE = 'value' } \ No newline at end of file diff --git a/src/editor/interface/Control.ts b/src/editor/interface/Control.ts index c4fedf4..a380a0d 100644 --- a/src/editor/interface/Control.ts +++ b/src/editor/interface/Control.ts @@ -6,16 +6,21 @@ export interface IValueSet { code: string; } -export interface IControl { +export interface IControlSelect { + valueSets: IValueSet[]; +} + +export interface IControlBasic { type: ControlType; value: IElement[] | null; placeholder: string; conceptId?: string; prefix?: string; postfix?: string; - valueSets?: IValueSet[]; } +export type IControl = IControlBasic & Partial + export interface IControlOption { placeholderColor?: string; bracketColor?: string; diff --git a/src/editor/interface/Element.ts b/src/editor/interface/Element.ts index bdde96c..bd2d4cd 100644 --- a/src/editor/interface/Element.ts +++ b/src/editor/interface/Element.ts @@ -1,3 +1,4 @@ +import { ControlComponent } from '../dataset/enum/Control' import { ElementType } from '../dataset/enum/Element' import { RowFlex } from '../dataset/enum/Row' import { IControl } from './Control' @@ -52,13 +53,19 @@ export interface ISeparator { dashArray?: number[]; } +export interface IControlElement { + control?: IControl; + controlId?: string; + controlComponent?: ControlComponent; +} + export type IElement = IElementBasic & IElementStyle & ITable & IHyperlinkElement & ISuperscriptSubscript & ISeparator - & { control?: IControl } + & IControlElement export interface IElementMetrics { width: number; diff --git a/src/editor/utils/element.ts b/src/editor/utils/element.ts index 5c7ee4b..491f6bd 100644 --- a/src/editor/utils/element.ts +++ b/src/editor/utils/element.ts @@ -2,6 +2,7 @@ import { deepClone, getUUID } from '.' import { ElementType, IElement } from '..' import { ZERO } from '../dataset/constant/Common' import { EDITOR_ELEMENT_ZIP_ATTR } from '../dataset/constant/Element' +import { ControlComponent } from '../dataset/enum/Control' export function formatElementList(elementList: IElement[], isHandleFirstElement = true) { if (isHandleFirstElement && elementList[0]?.value !== ZERO) { @@ -59,6 +60,74 @@ export function formatElementList(elementList: IElement[], isHandleFirstElement } } i-- + } else if (el.type === ElementType.CONTROL) { + const { prefix, postfix, value, placeholder } = el.control! + const controlId = getUUID() + // 移除父节点 + elementList.splice(i, 1) + // 前缀 + if (prefix) { + const prefixStrList = prefix.split('') + for (let p = 0; p < prefixStrList.length; p++) { + const value = prefixStrList[p] + elementList.splice(i, 0, { + controlId, + value, + type: el.type, + control: el.control, + controlComponent: ControlComponent.SUFFIX + }) + i++ + } + } + // 值 + if (value && value.length) { + for (let v = 0; v < value.length; v++) { + const element = value[v] + const valueStrList = element.value.split('') + for (let e = 0; e < valueStrList.length; e++) { + const value = valueStrList[e] + elementList.splice(i, 0, { + controlId, + value, + type: el.type, + control: el.control, + controlComponent: ControlComponent.VALUE + }) + i++ + } + } + } else { + // placeholder + const placeholderStrList = placeholder.split('') + for (let p = 0; p < placeholderStrList.length; p++) { + const value = placeholderStrList[p] + elementList.splice(i, 0, { + controlId, + value, + type: el.type, + control: el.control, + controlComponent: ControlComponent.PLACEHOLDER + }) + i++ + } + } + // 后缀 + if (postfix) { + const postfixStrList = postfix.split('') + for (let p = 0; p < postfixStrList.length; p++) { + const value = postfixStrList[p] + elementList.splice(i, 0, { + controlId, + value, + type: el.type, + control: el.control, + controlComponent: ControlComponent.POSTFIX + }) + i++ + } + } + i-- } else if ((!el.type || el.type === ElementType.TEXT) && el.value.length > 1) { elementList.splice(i, 1) const valueList = el.value.split('')