From 24bc9e6c59749c2e8aeb4e0634933e10000db27d Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 10 Jul 2025 09:41:58 +0800 Subject: [PATCH 01/10] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E5=BC=B9?= =?UTF-8?q?=E6=A1=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../composition/use-external-component-property.ts | 2 ++ packages/ui-vue/components/dynamic-view/src/components/maps.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/designer/src/components/components/form-designer/components/external-component-panel/composition/use-external-component-property.ts b/packages/designer/src/components/components/form-designer/components/external-component-panel/composition/use-external-component-property.ts index 024366a2aab..a79b2d2dd14 100644 --- a/packages/designer/src/components/components/form-designer/components/external-component-panel/composition/use-external-component-property.ts +++ b/packages/designer/src/components/components/form-designer/components/external-component-panel/composition/use-external-component-property.ts @@ -52,6 +52,8 @@ export function useExternalComponentProperty(designerHostService: DesignerHostSe externalLookupPropertyConfig.events.forEach(event => { convertedPropertyData[event.label] = propertyData[event.label]; }) + }else{ + convertedPropertyData = propertyData; } return convertedPropertyData; diff --git a/packages/ui-vue/components/dynamic-view/src/components/maps.ts b/packages/ui-vue/components/dynamic-view/src/components/maps.ts index 62809978b0e..f0b435a3198 100644 --- a/packages/ui-vue/components/dynamic-view/src/components/maps.ts +++ b/packages/ui-vue/components/dynamic-view/src/components/maps.ts @@ -70,6 +70,7 @@ import FExpressionEditor from '@farris/ui-vue/components/expression-editor'; import FCodeEditor from '@farris/ui-vue/components/code-editor'; import FHtmlTemplate from '@farris/ui-vue/components/html-template'; import FCollectionPropertyEditor from '@farris/ui-vue/components/collection-property-editor'; +import FModal from '@farris/ui-vue/components/modal'; const componentMap: Record = {}; const componentPropsConverter: Record = {}; @@ -156,6 +157,7 @@ function loadRegister() { FCodeEditor.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); FHtmlTemplate.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); FCollectionPropertyEditor.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); + FModal.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); } } -- Gitee From ac1917368805be5b0e464be75a74bf2ffcee2237 Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 31 Jul 2025 13:54:48 +0800 Subject: [PATCH 02/10] =?UTF-8?q?chore:=20=E8=A7=A3=E5=86=B3=E5=86=B2?= =?UTF-8?q?=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/form-designer/form-designer.component.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/designer/src/components/components/form-designer/form-designer.component.tsx b/packages/designer/src/components/components/form-designer/form-designer.component.tsx index 02a56ffa71b..00669c530e6 100644 --- a/packages/designer/src/components/components/form-designer/form-designer.component.tsx +++ b/packages/designer/src/components/components/form-designer/form-designer.component.tsx @@ -288,14 +288,7 @@ export default defineComponent({ components={componentsToRegister} canvasMode={designerMode} > -<<<<<<< HEAD - - -======= {renderExternalComponentPanel()} ->>>>>>> 90b5396d0a375fd0a85804d7b58a8ae919983e8f Date: Fri, 25 Jul 2025 14:48:17 +0800 Subject: [PATCH 03/10] =?UTF-8?q?feature:=20PC=E7=AB=AF=E9=9B=B6=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8E=A5=E5=85=A5Vue=E8=AE=BE=E8=AE=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../composition/command.service.tsx | 8 +++ .../designer-context/use-designer-context.ts | 19 ++++-- .../use-pc-nocode-designer-context.ts | 60 +++++++++++++++++++ .../form-metadata-nocode.service.ts | 47 +++++++++++++++ .../composition/metadata.service.ts | 16 +++-- .../src/components/types/designer-context.ts | 12 +++- 6 files changed, 148 insertions(+), 14 deletions(-) create mode 100644 packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts create mode 100644 packages/designer/src/components/composition/form-metadata-nocode.service.ts diff --git a/packages/designer/src/components/composition/command.service.tsx b/packages/designer/src/components/composition/command.service.tsx index 4fa5dc66715..757957d7db0 100644 --- a/packages/designer/src/components/composition/command.service.tsx +++ b/packages/designer/src/components/composition/command.service.tsx @@ -157,10 +157,18 @@ export function useFormCommandService(formSchemaService: UseFormSchema, useFormS });; }); } + + function hasNoCustomCommands(): boolean { + return [DesignerMode.PC_NoCode, DesignerMode.Mobile_NoCode].includes(formSchemaService.designerMode); + } + /** * 将当前表单相关的自定义构件追加到webCmds中 */ function loadCommandsInCurrentPath(): Promise { + if (hasNoCustomCommands()) { + return Promise.resolve(); + } const commandsInfos = formSchemaService.getCommands(); const metadataInfo = formSchemaService.getFormMetadataBasicInfo(); const formCode = formSchemaService.designerMode === DesignerMode.PC_RTC ? metadataInfo.rtcCode : metadataInfo.code; diff --git a/packages/designer/src/components/composition/designer-context/use-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-designer-context.ts index 2b204cdd421..5dac78fdd7b 100644 --- a/packages/designer/src/components/composition/designer-context/use-designer-context.ts +++ b/packages/designer/src/components/composition/designer-context/use-designer-context.ts @@ -1,14 +1,15 @@ import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; import { useLocation } from "../use-location"; -import { useMobileDesignerContext } from "./use-mobile-designer-context"; import { usePCDesignerContext } from "./use-pc-designer-context"; import { usePCRtcDesignerContext } from "./use-pc-rtc-designer-context"; +import { usePCNocodeDesignerContext } from "./use-pc-nocode-designer-context"; /** * 设计器上下文 * @returns */ export function useDesignerContext(): UseDesignerContext { + /** * 判断的当前设计器运行环境 */ @@ -20,6 +21,12 @@ export function useDesignerContext(): UseDesignerContext { if (designerEnvType === 'runtimeCustom') { return DesignerMode.PC_RTC; } + if (designerEnvType === 'noCode') { + return DesignerMode.PC_NoCode; + } + if (designerEnvType === 'mobileNoCode') { + return DesignerMode.Mobile_NoCode; + } if (metadataPath && metadataPath.includes('.mfrm')) { return DesignerMode.Mobile; } @@ -30,12 +37,14 @@ export function useDesignerContext(): UseDesignerContext { const designerMode = getDesignerMode(); switch (designerMode) { - case DesignerMode.PC: case DesignerMode.Mobile: { + case DesignerMode.PC: + case DesignerMode.Mobile: { return usePCDesignerContext(); } - // { - // return useMobileDesignerContext(); - // } + case DesignerMode.PC_NoCode: + case DesignerMode.Mobile_NoCode: { + return usePCNocodeDesignerContext(); + } case DesignerMode.PC_RTC: { return usePCRtcDesignerContext(); } diff --git a/packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts new file mode 100644 index 00000000000..5ad97612201 --- /dev/null +++ b/packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts @@ -0,0 +1,60 @@ +import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; +import ToolboxItems from '../../types/toolbox/pc-toolbox.json'; +import { usePCControlCreator } from "../control-creator/use-pc-control-creator.service"; +import SupportedControllers from '../../composition/command/supported-controllers/pc-supported-controller.json'; +import { FormComponent, UseFormSchema } from "../../../components/types"; +import ControllCategories from '../schema-repository/controller/pc-categories'; +import { useNocodeFormMetadata } from "../form-metadata-nocode.service"; +import { useCommandBuilderService as useCommandBuilder } from "../command-builder.service"; + +export function usePCNocodeDesignerContext(): UseDesignerContext { + + /** 设计器模式 */ + const designerMode: DesignerMode = DesignerMode.PC_NoCode; + + /** 工具箱的数据 */ + const toolboxItems: any[] = ToolboxItems; + + /** 要注册的UI组件 */ + const componentsToRegister: any = null; + + /** 支持的控制器 */ + const supportedControllers: any = SupportedControllers; + + /** 控制器分类 */ + const controllCategories: any = ControllCategories; + + /** 控件创建服务 */ + const useControlCreator = usePCControlCreator; + + /** 表单元数据服务 */ + const useFormMetadataService = useNocodeFormMetadata; + + /** 表单构件元数据服务 */ + const useCommandBuilderService = useCommandBuilder; + + /** + * 获取所有的页面组件 + * @returns + */ + function getPageComponents(useFormSchema: UseFormSchema): FormComponent[] { + const pageComponents: FormComponent[] = []; + const pageComponent = useFormSchema.getComponentById('root-component'); + if (pageComponent) { + pageComponents.push(pageComponent); + } + return pageComponents; + } + + return { + designerMode, + toolboxItems, + componentsToRegister, + supportedControllers, + controllCategories, + useControlCreator, + getPageComponents, + useFormMetadataService, + useCommandBuilderService + }; +} diff --git a/packages/designer/src/components/composition/form-metadata-nocode.service.ts b/packages/designer/src/components/composition/form-metadata-nocode.service.ts new file mode 100644 index 00000000000..85a685ee0d1 --- /dev/null +++ b/packages/designer/src/components/composition/form-metadata-nocode.service.ts @@ -0,0 +1,47 @@ +import axios from 'axios'; +import { omit } from 'lodash-es'; +import { DesignerProps } from '../designer.props'; +import { FormMetadaDataDom, MetadataDto, UseFormSchema, UseFormMetadata, FormMetaDataModule } from '../types'; +import { useLocation } from './use-location'; +import { useFormMetadata } from './form-metadata.service'; + +export function useNocodeFormMetadata(props: DesignerProps, useFormSchemaComposition: UseFormSchema): UseFormMetadata { + + const nocodeMetadataUrl = '/api/dev/nocode/v1.0/micro-apps/metadatas'; + + function queryMetadata(): Promise { + const { getHrefParam } = useLocation(); + const metadataId = getHrefParam('metadataId'); + const url = `${nocodeMetadataUrl}/${metadataId}`; + return axios.get(url).then((response: any) => { + const formSchema = JSON.parse(response.data.content).Contents; + const formMetadataBasicInfo = omit(response.data, 'content') as MetadataDto; + + useFormSchemaComposition.setFormMetadataBasicInfo(formMetadataBasicInfo); + useFormSchemaComposition.setFormSchema(formSchema); + return formSchema; + }); + } + + function saveFormMetadata() { + return Promise.resolve(); + } + + function queryFormTemplateRule(formModule: FormMetaDataModule): Promise { + return useFormMetadata(props, useFormSchemaComposition).queryFormTemplateRule(formModule); + } + + function runForm(loadingService: any, messageBoxService: any) { + } + + function publishMenu(messageBoxService: any, notifyService: any) { + } + + return { + queryMetadata, + saveFormMetadata, + queryFormTemplateRule, + runForm, + publishMenu, + }; +} diff --git a/packages/designer/src/components/composition/metadata.service.ts b/packages/designer/src/components/composition/metadata.service.ts index 1047d6b16f9..921e414e25e 100644 --- a/packages/designer/src/components/composition/metadata.service.ts +++ b/packages/designer/src/components/composition/metadata.service.ts @@ -40,7 +40,7 @@ export class MetadataService { */ public getMetadataListByType(relativePath: string, metadataType: string): Promise { let url; - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { url = `${this.rtcMetadataBasePath}?metadataTypes=${metadataType}`; } else { url = `${this.metadataBasePath}?path=${relativePath}&metadataTypeList=${metadataType}`; @@ -58,7 +58,7 @@ export class MetadataService { */ public getRefMetadata(relativePath: string, metadataId: string): Promise { let url; - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { url = `${this.rtcMetadataBasePath}/${metadataId}`; } else { url = `${this.metadataBasePath}/relied?metadataPath=${relativePath}&metadataID=${metadataId}`; @@ -103,7 +103,7 @@ export class MetadataService { public getAllMetadataList(relativePath: string, metadataType: string, pageSize = 1000) { let url = `${this.metadataServicePath}/unionmdlist?path=${relativePath}&`; - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { url = `${this.rtcMetadataBasePath}/rtmetadatalist?`; } return axios.get(`${url}pageIndex=1&pageSize=${pageSize}&metadataTypeList=${metadataType}`).then((res: any) => { @@ -116,7 +116,7 @@ export class MetadataService { } public getPickMetadata(relativePath: string, data: any) { - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { const url = `${this.rtcMetadataBasePath}/${data?.id}`; return axios.get(url, data).then((res: any) => { return { metadata: res.data }; @@ -130,7 +130,7 @@ export class MetadataService { } public saveMetadata(metadataDto: any, formBasicInfo?: any) { - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { const { dimension1, dimension2 } = formBasicInfo; return axios.post(this.rtcMetadataBasePath, { metadataDto, @@ -140,7 +140,6 @@ export class MetadataService { } else { return axios.put(this.metadataBasePath, metadataDto); } - } public validateRepeatName(path: string, fileName: string) { @@ -240,4 +239,9 @@ export class MetadataService { return { ok: res.status === 204 }; }); } + + private shouldUseRtcApi(): boolean { + const rtcModes = [DesignerMode.PC_RTC, DesignerMode.PC_NoCode, DesignerMode.Mobile_NoCode]; + return rtcModes.includes(this.designerMode); + } } diff --git a/packages/designer/src/components/types/designer-context.ts b/packages/designer/src/components/types/designer-context.ts index 0570a255278..8c4f6612dc5 100644 --- a/packages/designer/src/components/types/designer-context.ts +++ b/packages/designer/src/components/types/designer-context.ts @@ -11,12 +11,18 @@ export enum DesignerMode { /** 移动设计器 */ Mobile = 'Mobile', - /** PC 运行时定制设计器 */ - PC_RTC = 'PC_RTC' + /** PC运行时定制设计器 */ + PC_RTC = 'PC_RTC', + + /** PC零代码设计器 */ + PC_NoCode = 'PC_NoCode', + + /** 移动端零代码设计器 */ + Mobile_NoCode = 'Mobile_NoCode', } export interface UseDesignerContext { - instances: Record; + instances?: Record; designerMode: DesignerMode; toolboxItems: any[]; componentsToRegister: any[]; -- Gitee From 39015e385d909dc78e45c769dc6c646ad5bea49f Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 14 Aug 2025 14:25:43 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix:=20=E7=A7=BB=E5=8A=A8=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=8E=A7=E4=BB=B6=E5=92=8C=E6=8C=89=E9=92=AE=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/button-group/index.ts | 2 +- .../button-group/src/button-group.props.ts | 2 +- .../button-group/src/button-group.scss | 1 + ....tsx => button-group.design.component.tsx} | 10 +- .../src/designer/use-designer-rules.ts | 10 +- .../button-group.property-config.ts | 2 +- .../src/schema/button-group.schema.json | 2 +- .../button/src/schema/button.schema.json | 9 +- .../date-picker.property-config.ts | 2 +- .../src/schema/date-picker.schema.json | 2 +- .../components/designer-canvas/index.ts | 8 - .../components/designer-item.component.tsx | 340 ------------------ .../designer-canvas/src/components/maps.ts | 49 --- .../src/composition/function/drag-resolve.tsx | 230 ------------ .../src/designer-canvas.component.tsx | 143 -------- .../input-group/src/input-group.scss | 1 + .../src/designer/use-designer-rules.ts | 6 +- .../navbar/src/schema/navbar.schema.json | 2 +- .../components/number-input/index.ts | 2 +- .../number-input.property-config.ts | 2 +- .../src/schema/number-input.schema.json | 4 +- .../designer-canvas/src/components/maps.ts | 2 +- 22 files changed, 40 insertions(+), 791 deletions(-) rename packages/mobile-ui-vue/components/button-group/src/designer/{card.design.component.tsx => button-group.design.component.tsx} (84%) delete mode 100644 packages/mobile-ui-vue/components/designer-canvas/index.ts delete mode 100644 packages/mobile-ui-vue/components/designer-canvas/src/components/designer-item.component.tsx delete mode 100644 packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts delete mode 100644 packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx delete mode 100644 packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx diff --git a/packages/mobile-ui-vue/components/button-group/index.ts b/packages/mobile-ui-vue/components/button-group/index.ts index f825aa66e68..54ce956647f 100644 --- a/packages/mobile-ui-vue/components/button-group/index.ts +++ b/packages/mobile-ui-vue/components/button-group/index.ts @@ -1,7 +1,7 @@ import { withInstall, withRegister, withRegisterDesigner } from '@farris/mobile-ui-vue/common'; import ButtonGroupInstallless from './src/button-group.component'; import { propsResolverGenerator } from './src/button-group.props'; -import ButtonGroupDesign from './src/designer/card.design.component'; +import ButtonGroupDesign from './src/designer/button-group.design.component'; const BUTTON_GROUP_REGISTERED_NAME = 'button-group'; diff --git a/packages/mobile-ui-vue/components/button-group/src/button-group.props.ts b/packages/mobile-ui-vue/components/button-group/src/button-group.props.ts index ec5f39d8c95..fc19278a527 100644 --- a/packages/mobile-ui-vue/components/button-group/src/button-group.props.ts +++ b/packages/mobile-ui-vue/components/button-group/src/button-group.props.ts @@ -31,7 +31,7 @@ export const buttonGroupProps = { mode: { type: String as PropType, default: 'default' }, /** 按钮大小 */ - size: { type: String as PropType, default: 'normal' }, + size: { type: String as PropType, default: 'middle' }, /** 按钮样式 */ type: { type: String as PropType, default: 'primary' }, diff --git a/packages/mobile-ui-vue/components/button-group/src/button-group.scss b/packages/mobile-ui-vue/components/button-group/src/button-group.scss index 5660c571295..923bfdb58e3 100644 --- a/packages/mobile-ui-vue/components/button-group/src/button-group.scss +++ b/packages/mobile-ui-vue/components/button-group/src/button-group.scss @@ -45,6 +45,7 @@ &--block { display: flex; + width: 100%; } &--vertical { diff --git a/packages/mobile-ui-vue/components/button-group/src/designer/card.design.component.tsx b/packages/mobile-ui-vue/components/button-group/src/designer/button-group.design.component.tsx similarity index 84% rename from packages/mobile-ui-vue/components/button-group/src/designer/card.design.component.tsx rename to packages/mobile-ui-vue/components/button-group/src/designer/button-group.design.component.tsx index 145466524ca..a96eb98b5dd 100644 --- a/packages/mobile-ui-vue/components/button-group/src/designer/card.design.component.tsx +++ b/packages/mobile-ui-vue/components/button-group/src/designer/button-group.design.component.tsx @@ -28,8 +28,16 @@ export default defineComponent({ elementRef.value?.click?.(); } + const buttonGroupProps = computed(() => { + return { + ...props, + customStyle: '' + }; + }); + + return () => ( - + ); } }); diff --git a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts index e5c930c80df..32fe586f60a 100644 --- a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts @@ -12,6 +12,13 @@ export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemCo return ''; } + function getDesignerClass(): string{ + if(designItemContext.schema.block){ + return ' fm-button-group--block '; + } + return ''; + } + function checkCanMoveComponent() { return true; } @@ -36,6 +43,7 @@ export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemCo checkCanMoveComponent, checkCanDeleteComponent, hideNestedPaddingInDesginerView, - getPropsConfig + getPropsConfig, + getDesignerClass }; } diff --git a/packages/mobile-ui-vue/components/button-group/src/property-config/button-group.property-config.ts b/packages/mobile-ui-vue/components/button-group/src/property-config/button-group.property-config.ts index bfa8c6387fa..71f11600eed 100644 --- a/packages/mobile-ui-vue/components/button-group/src/property-config/button-group.property-config.ts +++ b/packages/mobile-ui-vue/components/button-group/src/property-config/button-group.property-config.ts @@ -86,7 +86,7 @@ export class ButtonGroupProperty extends BaseControlProperty { valueField: 'value', data: [ { value: 'large', text: '大号按钮' }, - { value: 'normal', text: '普通按钮' }, + { value: 'middle', text: '普通按钮' }, { value: 'small', text: '小号按钮' }, { value: 'mini', text: '迷你按钮' }, ], diff --git a/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json b/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json index f9f7c17b46d..e89da23926e 100644 --- a/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json +++ b/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json @@ -55,7 +55,7 @@ "size": { "description": "按钮大小", "type": "string", - "default": "normal" + "default": "middle" }, "items": { "description": "按钮项集合", diff --git a/packages/mobile-ui-vue/components/button/src/schema/button.schema.json b/packages/mobile-ui-vue/components/button/src/schema/button.schema.json index adb0613d6d7..2d9556ee2b7 100644 --- a/packages/mobile-ui-vue/components/button/src/schema/button.schema.json +++ b/packages/mobile-ui-vue/components/button/src/schema/button.schema.json @@ -40,21 +40,22 @@ "displayType": { "description": "显示类型", "type": "string", - "default": "default" + "default": "primary" }, "text": { "description": "文本", - "type": "string" + "type": "string", + "default": "按钮" }, "block": { "description": "沾满整行", "type": "boolean", - "default": false + "default": true }, "round": { "description": "圆角按钮", "type": "boolean", - "default": false + "default": true }, "plain": { "description": "朴素按钮", diff --git a/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts b/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts index 14815dbae02..e915e2bd227 100644 --- a/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts +++ b/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts @@ -10,7 +10,7 @@ export class DatePickerProperty extends InputBaseProperty { const displayFormatOptions = this.getDateFormatOptions(propertyData?.editor); return this.getComponentConfig( propertyData, - {}, + { type: 'date-picker' }, { title: { description: '', diff --git a/packages/mobile-ui-vue/components/date-picker/src/schema/date-picker.schema.json b/packages/mobile-ui-vue/components/date-picker/src/schema/date-picker.schema.json index f0216d49dcc..7309b42382c 100644 --- a/packages/mobile-ui-vue/components/date-picker/src/schema/date-picker.schema.json +++ b/packages/mobile-ui-vue/components/date-picker/src/schema/date-picker.schema.json @@ -81,5 +81,5 @@ }, "events": ["onUpdate:modelValue"], "required": ["type"], - "ignore": ["id", "type", "appearance"] + "ignore": ["id", "appearance"] } diff --git a/packages/mobile-ui-vue/components/designer-canvas/index.ts b/packages/mobile-ui-vue/components/designer-canvas/index.ts deleted file mode 100644 index d2d31b946fc..00000000000 --- a/packages/mobile-ui-vue/components/designer-canvas/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { DgControl } from './src/composition/dg-control'; -import type { DesignerHostService, UseDesignerRules } from './src/composition/types'; -export * from './src/composition/props/designer-canvas.props'; -export * from './src/composition/function/use-designer-component'; -export * from './src/composition/function/use-designer-inner-component'; -export * from './src/types'; - -export { DgControl, UseDesignerRules, DesignerHostService }; diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/components/designer-item.component.tsx b/packages/mobile-ui-vue/components/designer-canvas/src/components/designer-item.component.tsx deleted file mode 100644 index 10b54bee926..00000000000 --- a/packages/mobile-ui-vue/components/designer-canvas/src/components/designer-item.component.tsx +++ /dev/null @@ -1,340 +0,0 @@ - -import { Ref, SetupContext, computed, defineComponent, inject, onMounted, provide, ref, watch, onBeforeUnmount } from 'vue'; -import { DesignerItemPropsType, designerItemProps } from '../composition/props/designer-item.props'; -import { componentMap, componentPropsConverter } from './maps'; -import { UseDragula } from '../composition/types'; -import { ComponentSchema, DesignerComponentInstance, DesignerItemContext } from '../types'; -import FDesignerPlaceholder from './designer-placeholder.component'; -import { canvasChanged, setPositionOfButtonGroup } from '../composition/designer-canvas-changed'; -import { getCustomClass } from '@farris/mobile-ui-vue/common'; - -const FDesignerItem = defineComponent({ - name: 'FDesignerItem', - props: designerItemProps, - emits: ['selectionChange'], - setup(props: DesignerItemPropsType, context) { - const id = ref(`${props.modelValue.id}-component`); - const canMove = ref(props.canMove); - const canDelete = ref(props.canDelete); - const canNested = ref(false); - const schema = ref(props.modelValue); - const componentId = ref(props.componentId || ''); - const designComponentStyle = ref(''); - const designComponentClass = ref(''); - const designCustomClass = ref(props.customClass); - const designerItemElementRef = ref(); - const useDragulaComposition = inject('canvas-dragula'); - const componentInstance = ref() as Ref; - const parent = inject('design-item-context'); - const designItemContext = { designerItemElementRef, componentInstance, schema: schema.value, parent, setupContext: context as SetupContext }; - provide('design-item-context', designItemContext); - const useFormSchema = inject('useFormSchema'); - - const designerItemClass = computed(() => { - const componentClass = props.modelValue.appearance ? (props.modelValue.appearance.class as string) || '' : ''; - const customButtons = componentInstance.value?.getCustomButtons && componentInstance.value.getCustomButtons(); - let classObject = { - 'farris-component': true, - // 受position-relative影响,整个容器的高度不能被撑起 - 'flex-fill': schema.value.id === 'root-component', - 'position-relative': canMove.value && canDelete.value || (customButtons?.length), - 'farris-nested': canNested.value, - 'can-move': canMove.value, - 'd-none': designerItemElementRef.value && (designerItemElementRef.value as HTMLElement).classList.contains('d-none'), - 'dgComponentSelected': designerItemElementRef.value && (designerItemElementRef.value as HTMLElement).classList.contains('dgComponentSelected'), - 'dgComponentFocused': designerItemElementRef.value && (designerItemElementRef.value as HTMLElement).classList.contains('dgComponentFocused'), - } as Record; - classObject[`farris-component-${schema.value.type}`] = true; - classObject = getCustomClass(classObject, componentClass); - classObject = getCustomClass(classObject, designComponentClass.value); - classObject = getCustomClass(classObject, designCustomClass.value); - return classObject; - }); - - const desginerItemStyle = computed(() => { - const styleObject = {} as Record; - const componentStyle = props.modelValue.appearance ? (props.modelValue.appearance.style as string) || '' : ''; - if (componentStyle) { - componentStyle.split(';').reduce((result: Record, styleString: string) => { - const [styleKey, styleValue] = styleString.split(':'); - result[styleKey] = styleValue; - return result; - }, styleObject); - } - if (designComponentStyle.value) { - designComponentStyle.value.split(';').reduce((result: Record, styleString: string) => { - const [styleKey, styleValue] = styleString.split(':'); - if (styleKey) { - result[styleKey] = styleValue; - } - return result; - }, styleObject); - } - return styleObject; - }); - - function onClickDeleteButton(payload: MouseEvent, schemaToRemove: ComponentSchema) { - if (payload) { - payload.preventDefault(); - payload.stopPropagation(); - } - - // 连同所属组件一起删除,使用场景如data-grid、form控件等。 - if (componentInstance.value.triggerBelongedComponentToDeleteWhenDeleted) { - const belongedComponentInstance = componentInstance.value.getBelongedComponentInstance(componentInstance); - if (belongedComponentInstance && belongedComponentInstance.parent) { - const belongedComponentInstanceParent = ref(belongedComponentInstance?.parent) as any; - const indexToRemove = belongedComponentInstanceParent.value.contents.findIndex( - (contentItem: ComponentSchema) => contentItem.id === belongedComponentInstance.schema.id - ); - belongedComponentInstanceParent.value?.contents?.splice(indexToRemove, 1); - - canvasChanged.value++; - } - return; - } - componentInstance.value.onRemoveComponent(); - let parentContext = parent; - let locatePredicate: any = (contentItem: ComponentSchema) => contentItem.id === schemaToRemove.id; - if (schemaToRemove.type === 'component') { - parentContext = parent?.parent; - locatePredicate = (contentItem: ComponentSchema) => contentItem.component === schemaToRemove.id; - - } - if (parentContext && parentContext.schema.contents) { - const indexToRemove = parentContext.schema.contents.findIndex(locatePredicate); - parentContext.schema.contents.splice(indexToRemove, 1); - - canvasChanged.value++; - context.emit('selectionChange'); - - } - - } - - function renderDeleteButton(componentSchema: ComponentSchema) { - return ( - canDelete.value && ( -
{ - onClickDeleteButton(payload, componentSchema); - }}> - -
- ) - ); - } - - function renderMoveButton() { - return ( - canMove.value && ( -
- -
- ) - ); - } - - function renderCustomButtons() { - const customButtons = componentInstance.value?.getCustomButtons && componentInstance.value.getCustomButtons(); - - return ( - customButtons && - !!customButtons.length && - customButtons.map((buttonConfig: any) => { - return ( -
buttonConfig.onClick && buttonConfig.onClick(payload)}> - -
- ); - }) - ); - } - - function renderIconPanel(componentSchema: ComponentSchema) { - return ( -
-
- {renderDeleteButton(componentSchema)} - {renderMoveButton()} - {renderCustomButtons()} -
-
- ); - } - - function onSelectionChange(schemaType: string, schemaValue: ComponentSchema, componentId: string, componentInstance: DesignerComponentInstance) { - context.emit('selectionChange', schemaType, schemaValue, componentId, componentInstance); - } - - function renderContent(viewSchema: ComponentSchema) { - const componentKey = viewSchema.type; - const Component = componentMap[componentKey]; - const propsConverter = componentPropsConverter[componentKey]; - const viewProps = propsConverter ? propsConverter(viewSchema) : {}; - viewProps.customClass = props.ignore ? viewProps.customClass : ''; - viewProps.componentId = componentId.value; - viewProps.id = viewSchema.id; - const shouldShowPlaceholder = viewSchema.contents && viewSchema.contents.length === 0; - const hasContent = viewSchema.contents && !!viewSchema.contents.length; - return hasContent && Component ? ( - - {(viewSchema.contents as ComponentSchema[]).map((contentSchema: any) => ( - - ))} - - ) : Component ? ( - shouldShowPlaceholder ? ( - - - - ) : ( - - ) - ) : ( -
- ); - } - - function renderChildComponentContent(viewSchema: ComponentSchema) { - const componentKey = viewSchema.type; - if (componentKey === 'component-ref') { - // eslint-disable-next-line prefer-const - let componentSchema = useFormSchema?.getFormSchema().module.components - .find((component: any) => component.id === viewSchema.component); - if (componentSchema) { - - return ; - } - } - } - watch( - () => props.modelValue, - (value: any) => { - schema.value = value; - id.value = `${value.id}-component`; - componentId.value = value.id; - } - ); - - function updatePositionOfButtonGroup(event: Event | any) { - const targetElement = event?.target as any; - setPositionOfButtonGroup(targetElement); - } - /** - * 记录滚动区域 - */ - function recordScrollContainer(element: HTMLElement) { - if (!window['scrollContainerList']) { window['scrollContainerList'] = new Set(); } - - const id = element.getAttribute('id'); - if (id) { - window['scrollContainerList'].add(id); - } - } - - function updatePositionOfBtnGroupWhenScroll(event: Event | any) { - const targetElement = event?.target as any; - recordScrollContainer(targetElement); - updatePositionOfButtonGroup(event); - } - function bindingScrollEvent() { - if (schema.value?.contents?.length && designerItemElementRef.value) { - designerItemElementRef.value.addEventListener('scroll', updatePositionOfBtnGroupWhenScroll); - } - } - - onMounted(() => { - if (designerItemElementRef.value && componentInstance.value && componentInstance.value.schema) { - const draggableContainer = designerItemElementRef.value.querySelector( - `[data-dragref='${componentInstance.value.schema.id}-container']` - ); - if (useDragulaComposition && draggableContainer) { - useDragulaComposition.attachComponents(draggableContainer, schema.value); - } - canNested.value = componentInstance.value.canNested !== undefined ? componentInstance.value.canNested : canNested.value; - canDelete.value = componentInstance.value.canDelete !== undefined ? componentInstance.value.canDelete : canDelete.value; - canMove.value = componentInstance.value.canMove !== undefined ? componentInstance.value.canMove : canMove.value; - designComponentStyle.value = componentInstance.value.styles || ''; - designComponentClass.value = componentInstance.value.designerClass || ''; - if (designerItemElementRef.value) { - designerItemElementRef.value.componentInstance = componentInstance; - designerItemElementRef.value.designItemContext = designItemContext; - } - componentInstance.value.belongedComponentId = componentId.value; - - } - bindingScrollEvent(); - - canvasChanged.value++; - }); - - onBeforeUnmount(() => { - if (designerItemElementRef.value) { - designerItemElementRef.value.removeEventListener('scroll', updatePositionOfButtonGroup); - } - }); - - function onClickDesignerItem(payload: MouseEvent) { - if (payload) { - payload.preventDefault(); - payload.stopPropagation(); - } - let draggabledesignerItemElementRef: any = designItemContext.designerItemElementRef; - const designerItemElement = designerItemElementRef.value as HTMLElement; - if (designerItemElement) { - const currentFocusedElements = document.getElementsByClassName('dgComponentFocused') as HTMLCollectionOf; - // 重复点击 - const duplicateClick = - currentFocusedElements && - currentFocusedElements.length === 1 && - currentFocusedElements[0] === designerItemElementRef.value; - if (!duplicateClick) { - Array.from(currentFocusedElements).forEach((element: HTMLElement) => element.classList.remove('dgComponentFocused')); - Array.from(document.getElementsByClassName('dgComponentSelected') as HTMLCollectionOf).forEach( - (element: HTMLElement) => element.classList.remove('dgComponentSelected') - ); - - designerItemElement.classList.add('dgComponentFocused'); - context.emit('selectionChange', schema.value.type, schema.value, componentId.value, componentInstance.value); - if (componentInstance.value.getDraggableDesignItemElement) { - draggabledesignerItemElementRef = componentInstance.value.getDraggableDesignItemElement(designItemContext); - if (draggabledesignerItemElementRef && draggabledesignerItemElementRef.value) { - draggabledesignerItemElementRef.value.classList.add('dgComponentSelected'); - - } - } - - } - } - - updatePositionOfButtonGroup({ target: draggabledesignerItemElementRef?.value }); - } - - return () => { - return ( - schema.value.type === 'component-ref' ? - renderChildComponentContent(schema.value) : -
- {renderIconPanel(schema.value)} - {renderContent(schema.value)} -
- ); - }; - } -}); -export default FDesignerItem; diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts b/packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts deleted file mode 100644 index 329fd482b8e..00000000000 --- a/packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { CheckboxGroup, ContentContainer, DatePicker, FormItem, PageHeaderContainer, Picker, RadioGroup, Switch } from "@farris/mobile-ui-vue"; -import Button from "@farris/mobile-ui-vue/button"; -import Component from "@farris/mobile-ui-vue/component"; -import FloatContainer from "@farris/mobile-ui-vue/float-container"; -import Form from "@farris/mobile-ui-vue/form"; -import InputGroup from "@farris/mobile-ui-vue/input-group"; -import ListView from "@farris/mobile-ui-vue/list-view"; -import Navbar from "@farris/mobile-ui-vue/navbar"; -import PageBodyContainer from "@farris/mobile-ui-vue/page-body-container"; -import PageContainer from "@farris/mobile-ui-vue/page-container"; -import PageFooterContainer from "@farris/mobile-ui-vue/page-footer-container"; -import Textarea from "@farris/mobile-ui-vue/textarea"; - -const componentMap: Record = {}; -const componentPropsConverter: Record = {}; -const componentPropertyConfigConverter: Record = {}; - - -let hasLoaded = false; -/** - * 加载设计时组件 - */ -function loadDesignerRegister() { - if (!hasLoaded) { - hasLoaded = true; - Button.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - PageContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - PageHeaderContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - PageBodyContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - PageFooterContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - Navbar.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - Component.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - ListView.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - Form.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - InputGroup.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - FloatContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - ContentContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - FormItem.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - DatePicker.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - Textarea.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - RadioGroup.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - Switch.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - Picker.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - CheckboxGroup.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - - } -} - -export { componentMap, componentPropsConverter, componentPropertyConfigConverter, loadDesignerRegister }; diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx b/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx deleted file mode 100644 index 05dbcb49147..00000000000 --- a/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx +++ /dev/null @@ -1,230 +0,0 @@ -import { ModalFunctions } from "../../../../modal/src/composition/type"; -import { ComponentBindingSourceContext, DesignerHostService, DesignerHTMLElement, DraggingResolveContext } from "../types"; -import { DesignViewModelField, FormVariable } from "../../../../common/src/entity/entity-schema"; -import { merge } from "lodash-es"; -import { DgControl } from "../dg-control"; -import { DesignerComponentInstance } from "@farris/mobile-ui-vue"; - -export function dragResolveService(designerHostService: DesignerHostService) { - /** 弹窗实例 */ - let modalEditorRef: ModalFunctions; - /** 拖拽上下文 */ - let componentResolveContext: DraggingResolveContext; - - /** - * 获取拖拽上下文信息 - */ - function getComponentResolveContext(sourceElement: DesignerHTMLElement, sourceContainer: DesignerHTMLElement, targetContainer: DesignerHTMLElement) - : DraggingResolveContext { - - const resolveContext: DraggingResolveContext = { - componentType: String(sourceElement.getAttribute('data-controltype')), - componentFeature: String(sourceElement.getAttribute('data-feature')), - componentCategory: String(sourceElement.getAttribute('data-category')), - label: String(sourceElement.getAttribute('data-controlTypeName')), - sourceType: String(sourceElement.getAttribute('data-sourceType') || 'move'), - parentComponentInstance: targetContainer.componentInstance.value, - sourceElement, - sourceContainer, - targetContainer, - bindingSourceContext: null - }; - - // 现有控件移动位置:从控件实例上获取控件类型 - if (sourceElement.componentInstance) { - resolveContext.componentType = sourceElement.componentInstance.value.schema?.type; - // resolveContext.componentCategory = sourceElement.componentInstance.value.category; - } - - return resolveContext; - } - /** - * 选择绑定实体后事件 - */ - function onSubmitEntitySelctor(bindingSourceContext: ComponentBindingSourceContext) { - componentResolveContext.bindingSourceContext = bindingSourceContext; - - if (modalEditorRef?.modalRef?.value.close) { - modalEditorRef?.modalRef?.value.close(); - } - } - /** - * 取消绑定实体 - */ - function onCancelEntitySelector() { - componentResolveContext.bindingSourceContext = undefined; - if (modalEditorRef?.modalRef?.value.close) { - modalEditorRef?.modalRef?.value.close(); - } - } - /** - * 选择绑定实体窗口 - */ - function renderEntityComponent() { - const { componentType } = componentResolveContext; - const FEntityBindingSelector = designerHostService.uiProviderService.getUiComponent('FEntityBindingSelector'); - return () => (<> ); - } - /** - * 弹出实体绑定窗口 - */ - function triggerBindingEntity() { - return new Promise((resolve, reject) => { - modalEditorRef = designerHostService.modalService.open({ - title: '选择绑定', - width: 800, - height: 600, - fitContent: false, - showButtons: false, - render: renderEntityComponent(), - rejectCallback:()=>{ - componentResolveContext.bindingSourceContext = undefined; - }, - closedCallback: () => { - resolve(componentResolveContext); - }, - draggable: true - }); - }); - } - /** - * 取消绑定字段后事件 - */ - function onCancelFieldSelector() { - componentResolveContext.bindingSourceContext = undefined; - if (modalEditorRef?.modalRef?.value.close) { - modalEditorRef?.modalRef?.value.close(); - } - } - /** - * 获取控件拖拽后的分组信息,以便于后续记录到视图模型 - */ - function getFieldGroupInfo(parentComponentInstance: DesignerComponentInstance) { - let groupId = ''; - let groupName = ''; - if (DgControl['field-set'] && parentComponentInstance.schema.type === DgControl['field-set'].type) { - groupId = parentComponentInstance.schema.id; - groupName = parentComponentInstance.schema.title; - } - return { groupId, groupName }; - } - /** - * 选择绑定字段后事件 - */ - function onSubmitFieldSelctor(data: { selectedData: any, bindingType: any }) { - if (!data || !data.selectedData || !data.bindingType) { - return; - } - const { selectedData, bindingType } = data; - // 若添加到小分组内,需要向vm保存groupId和groupName - const { groupId, groupName } = getFieldGroupInfo(componentResolveContext.parentComponentInstance); - const bindingSourceContext: ComponentBindingSourceContext = { bindingType: 'field' }; - - if (bindingType === 'Form') { - // 绑定字段 - const entityField = selectedData as DesignViewModelField; - bindingSourceContext.entityFieldNode = entityField; - - bindingSourceContext.designViewModelField = merge({}, entityField, { groupId, groupName }); - - componentResolveContext.bindingSourceContext = bindingSourceContext; - } else { - // 绑定变量 - const varibleField = selectedData as FormVariable; - bindingSourceContext.variableFieldNode = merge({}, varibleField, { groupId, groupName }); - componentResolveContext.bindingSourceContext = bindingSourceContext; - } - - if (modalEditorRef?.modalRef?.value.close) { - modalEditorRef?.modalRef?.value.close(); - } - } - /** - * 绑定字段弹窗 - */ - function renderFieldComponent() { - const { parentComponentInstance } = componentResolveContext; - const viewModelId = designerHostService.formSchemaUtils.getViewModelIdByComponentId(parentComponentInstance?.belongedComponentId); - const editorParams = { - viewModelId, - designerHostService, - disableOccupiedFields: true, - componentSchema: { editor: { type: componentResolveContext.componentType } } - }; - const bindingSettings = { enable: false }; - - const FBindingSelectorContainer = designerHostService.uiProviderService.getUiComponent('FBindingSelectorContainer'); - - return () => (<> ); - } - /** - * 弹出绑定字段的窗口 - */ - function triggerBindingField() { - return new Promise((resolve, reject) => { - modalEditorRef = designerHostService.modalService.open({ - title: '选择绑定', - width: 800, - height: 600, - fitContent: false, - showButtons: false, - render: renderFieldComponent(), - rejectCallback:()=>{ - componentResolveContext.bindingSourceContext = undefined; - }, - closedCallback: () => { - resolve(componentResolveContext); - }, - draggable: true - }); - }); - } - /** - * 生成控件schema结构 - */ - function resolveComponentSchema() { - const { parentComponentInstance } = componentResolveContext; - const componentSchema = parentComponentInstance.addNewChildComponentSchema(componentResolveContext, designerHostService); - componentResolveContext.componentSchema = componentSchema; - } - /** - * 解析拖拽元素,并根据场景展示不同的绑定窗口 - */ - async function resolveBindingSource() { - const { componentCategory } = componentResolveContext; - - switch (componentCategory) { - case 'input': { - await triggerBindingField(); - break; - } - case 'dataCollection': { - await triggerBindingEntity(); - break; - } - - } - } - /** - * 根据拖拽元素解析并创建控件 - */ - async function resolveComponentCreationContextByDrop(sourceElement: DesignerHTMLElement, sourceContainer: DesignerHTMLElement, targetContainer: DesignerHTMLElement): Promise { - componentResolveContext = getComponentResolveContext(sourceElement, sourceContainer, targetContainer); - - await resolveBindingSource(); - - // 若返回 undefined 代表终止后续生成 - if (componentResolveContext.bindingSourceContext === undefined) { - return null; - } else { - resolveComponentSchema(); - return componentResolveContext; - } - - } - - return { - getComponentResolveContext, - resolveComponentCreationContextByDrop - }; -} diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx b/packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx deleted file mode 100644 index a8b6a7287e1..00000000000 --- a/packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx +++ /dev/null @@ -1,143 +0,0 @@ - -import { computed, defineComponent, inject, onMounted, onUnmounted, provide, ref, watch } from 'vue'; -import { ComponentSchema, DesignerComponentInstance, DesignerItemContext } from './types'; -import { canvasChanged, setPositionOfButtonGroup } from './composition/designer-canvas-changed'; -import { designerCanvasProps, DesignerCanvasPropsType } from './composition/props/designer-canvas.props'; -import { useDragula } from './composition/function/use-dragula'; -import { DesignerHostService, UseDragula } from './composition/types'; -import FDesignerItem from './components/designer-item.component'; -import './composition/class/designer-canvas.css'; -import './composition/class/control.css'; -import { loadDesignerRegister } from './components/maps'; -import { FM_MODAL_SERVICE_TOKEN } from '../../modal'; -import { FM_UI_PROVIDER_SERVICE_TOKEN } from '@farris/mobile-ui-vue/common'; - -export default defineComponent({ - name: 'FDesignerCanvas', - props: designerCanvasProps, - emits: ['init', 'selectionChange', 'canvasChanged'], - setup(props: DesignerCanvasPropsType, context) { - const schema = ref(); - const componentSchema = ref(); - const designerCanvasElementRef = ref(); - const designerCanvasContainerElementRef = ref(); - const designerItemElementRef = ref(); - const componentInstance = ref(); - const componentId = ref(props.componentId); - let resizeObserver: ResizeObserver | null; - let resizeObserverTimer; - - const designerHostService = { - eventsEditorUtils: inject('eventsEditorUtils'), - formSchemaUtils: inject('useFormSchema'), - formMetadataConverter: inject('formMetadataConverter'), - designViewModelUtils: inject('designViewModelUtils'), - controlCreatorUtils: inject('controlCreatorUtils'), - metadataService: inject('Meatdata_Http_Service_Token'), - schemaService: inject('schemaService'), - useFormCommand: inject('useFormCommand'), - modalService: inject(FM_MODAL_SERVICE_TOKEN), - formStateMachineUtils: inject('useFormStateMachine'), - uiProviderService: inject(FM_UI_PROVIDER_SERVICE_TOKEN), - - }; - provide('designer-host-service', designerHostService); - - const useDragulaComposition = useDragula(designerHostService); - loadDesignerRegister(); - - provide('canvas-dragula', useDragulaComposition); - provide('design-item-context', { - designerItemElementRef, - componentInstance, - schema: componentSchema.value, - parent: undefined - }); - - const designerCanvasClass = computed(() => { - const classObject = { - 'd-flex': true, - 'flex-fill': true, - 'flex-column': true - } as Record; - return classObject; - }); - - /** - * 用于在设计器里 - * @param designerItem - */ - function updateDesignerItem(item: any, compId: string) { - schema.value = item; - componentId.value = compId; - } - - watch(canvasChanged, () => { - setPositionOfButtonGroup(designerCanvasElementRef.value); - - context.emit('canvasChanged'); - }, { flush: 'post' }); - - /** - * 监听画布尺寸变化,重新计算操作图标位置 - */ - function registerResizeListenner() { - resizeObserver = new ResizeObserver(() => { - if (resizeObserverTimer) { - clearTimeout(resizeObserverTimer); - } - - resizeObserverTimer = setTimeout(() => { - setPositionOfButtonGroup(designerCanvasElementRef.value); - }); - }); - resizeObserver.observe(designerCanvasElementRef.value); - } - - function onSelectionChange(schemaType: string, schemaValue: ComponentSchema, cmpId: string, componentInst: DesignerComponentInstance) { - context.emit('selectionChange', schemaType, schemaValue, cmpId, componentInst); - } - - /** - * 监听画布父容器横向滚动条的滚动,重新计算操作图标位置 - */ - function registerEditorPanelScrollEvent() { - designerCanvasContainerElementRef.value.addEventListener('scroll', (e) => { - setPositionOfButtonGroup(designerCanvasElementRef.value); - }); - } - onMounted(() => { - if (designerCanvasElementRef.value) { - useDragulaComposition.initializeDragula(designerCanvasElementRef.value); - } - schema.value = props.modelValue; - context.emit('init', useDragulaComposition); - registerResizeListenner(); - registerEditorPanelScrollEvent(); - }); - - onUnmounted(() => { - if (resizeObserver) { - resizeObserver.unobserve(designerCanvasElementRef.value); - resizeObserver.disconnect(); - resizeObserver = null; - } - }); - - context.expose({ - updateDesignerItem - }); - - return () => { - return ( -
-
-
- {schema.value && } -
-
-
- ); - }; - } -}); diff --git a/packages/mobile-ui-vue/components/input-group/src/input-group.scss b/packages/mobile-ui-vue/components/input-group/src/input-group.scss index a88f7777506..b7c0776a8eb 100644 --- a/packages/mobile-ui-vue/components/input-group/src/input-group.scss +++ b/packages/mobile-ui-vue/components/input-group/src/input-group.scss @@ -42,6 +42,7 @@ background-color: transparent; &::placeholder { color: var(--fm-input-group-sub-color); + font-size: var(--fm-input-group-size); } &:disabled { opacity: 1; diff --git a/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts index eba98e41793..63b69455ba5 100644 --- a/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts @@ -20,14 +20,14 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe } function checkCanMoveComponent() { - return !isInFixedContextRules; + return true; } function checkCanDeleteComponent() { - return !isInFixedContextRules; + return true; } function hideNestedPaddingInDesginerView() { - return hideNestedPadding; + return false; } function getStyles(): string { diff --git a/packages/mobile-ui-vue/components/navbar/src/schema/navbar.schema.json b/packages/mobile-ui-vue/components/navbar/src/schema/navbar.schema.json index 2de5cdc461a..f59dc40179f 100644 --- a/packages/mobile-ui-vue/components/navbar/src/schema/navbar.schema.json +++ b/packages/mobile-ui-vue/components/navbar/src/schema/navbar.schema.json @@ -35,7 +35,7 @@ "title": { "description": "标题", "type": "string", - "default": "" + "default": "导航栏" }, "leftArrow": { "description": "左侧返回按钮", diff --git a/packages/mobile-ui-vue/components/number-input/index.ts b/packages/mobile-ui-vue/components/number-input/index.ts index 3f43cf190a4..9003f2c043a 100644 --- a/packages/mobile-ui-vue/components/number-input/index.ts +++ b/packages/mobile-ui-vue/components/number-input/index.ts @@ -5,7 +5,7 @@ import NumberInputDesign from './src/designer/number-input.design.component'; export * from './src/number-input.props'; -const NUMBER_INPUT_REGISTERED_NAME = 'number-input'; +const NUMBER_INPUT_REGISTERED_NAME = 'number-spinner'; const NumberInput = withInstall(NumberInputInstallless); diff --git a/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts b/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts index 3d51c021344..b54c783ecea 100644 --- a/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts +++ b/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts @@ -8,7 +8,7 @@ export class NumberInputProperty extends InputBaseProperty { getEditorProperties(propertyData: any) { return this.getComponentConfig( propertyData, - { type: 'number-input' }, + { type: 'number-spinner' }, { precision: { description: '', diff --git a/packages/mobile-ui-vue/components/number-input/src/schema/number-input.schema.json b/packages/mobile-ui-vue/components/number-input/src/schema/number-input.schema.json index 9e63068025a..d480151a9a7 100644 --- a/packages/mobile-ui-vue/components/number-input/src/schema/number-input.schema.json +++ b/packages/mobile-ui-vue/components/number-input/src/schema/number-input.schema.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://farris-design.gitee.io/textarea.schema.json", - "title": "number-input", + "title": "number-spinner", "description": "数字输入框", "type": "object", "properties": { @@ -12,7 +12,7 @@ "type": { "description": "控件类型", "type": "string", - "default": "number-input" + "default": "number-spinner" }, "appearance": { "description": "外观", diff --git a/packages/ui-vue/components/designer-canvas/src/components/maps.ts b/packages/ui-vue/components/designer-canvas/src/components/maps.ts index 8b28d9d155f..f09d63307bd 100644 --- a/packages/ui-vue/components/designer-canvas/src/components/maps.ts +++ b/packages/ui-vue/components/designer-canvas/src/components/maps.ts @@ -153,7 +153,7 @@ function registerDesignerComponents(components: any[]) { }; components.forEach(component => { - component.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter, registerContext); + component.registerDesigner && component.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter, registerContext); }); } -- Gitee From ba4769c5ae2596221ef10e642c736b2b3d2f8a3b Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 14 Aug 2025 15:08:03 +0800 Subject: [PATCH 05/10] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/designer/button-group.design.component.tsx | 10 +++++++--- .../button-group/src/designer/use-designer-rules.ts | 2 +- .../button-group/src/schema/button-group.schema.json | 2 +- .../components/button/src/schema/button.schema.json | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/mobile-ui-vue/components/button-group/src/designer/button-group.design.component.tsx b/packages/mobile-ui-vue/components/button-group/src/designer/button-group.design.component.tsx index a96eb98b5dd..0168446c921 100644 --- a/packages/mobile-ui-vue/components/button-group/src/designer/button-group.design.component.tsx +++ b/packages/mobile-ui-vue/components/button-group/src/designer/button-group.design.component.tsx @@ -30,12 +30,16 @@ export default defineComponent({ const buttonGroupProps = computed(() => { return { - ...props, - customStyle: '' + items: props.items, + mode: props.mode, + size: props.size, + type: props.type, + round: props.round, + block: props.block, + vertical: props.vertical, }; }); - return () => ( ); diff --git a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts index 32fe586f60a..da7c1b905f6 100644 --- a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts @@ -13,7 +13,7 @@ export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemCo } function getDesignerClass(): string{ - if(designItemContext.schema.block){ + if(designItemContext.schema.block !== false){ return ' fm-button-group--block '; } return ''; diff --git a/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json b/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json index e89da23926e..3b0aaa2ba42 100644 --- a/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json +++ b/packages/mobile-ui-vue/components/button-group/src/schema/button-group.schema.json @@ -38,7 +38,7 @@ "default": false }, "block": { - "description": "块级元素", + "description": "占满整行", "type": "boolean", "default": true }, diff --git a/packages/mobile-ui-vue/components/button/src/schema/button.schema.json b/packages/mobile-ui-vue/components/button/src/schema/button.schema.json index 2d9556ee2b7..99b32da4d13 100644 --- a/packages/mobile-ui-vue/components/button/src/schema/button.schema.json +++ b/packages/mobile-ui-vue/components/button/src/schema/button.schema.json @@ -48,7 +48,7 @@ "default": "按钮" }, "block": { - "description": "沾满整行", + "description": "占满整行", "type": "boolean", "default": true }, -- Gitee From 9b917d7e4d4973b0cde838e4f649af33b16c499d Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 14 Aug 2025 16:36:04 +0800 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E5=AE=B9=E5=99=A8=E7=B1=BB=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/card/src/card.component.tsx | 5 +- .../src/designer/card.design.component.tsx | 9 ++- .../card/src/designer/use-designer-rules.ts | 6 +- .../common/src/compositions/index.ts | 1 + .../use-designer-component.ts | 11 +++- .../use-dragula/use-dragula-common-rule.ts | 54 ++++++++++++++++ .../common/src/properties/dg-control.ts | 2 +- .../src/properties/schema-dom-mapping.ts | 8 +-- .../src/designer/use-designer-rules.ts | 8 ++- .../content-container.design.component.tsx | 3 +- .../src/designer/use-designer-rules.ts | 6 +- .../designer/form-item-use-designer-rules.ts | 4 +- .../designer/form-item.design.component.tsx | 63 ++++++++----------- .../response-form-use-designer-rules.ts | 10 ++- .../form-item/src/form-item.props.ts | 5 +- .../components/form-item/src/form-item.scss | 19 ++++++ .../src/schema/form-item.schema.json | 5 ++ packages/mobile-ui-vue/components/index.ts | 2 +- .../src/designer/use-designer-rules.ts | 8 ++- .../src/designer/use-designer-rules.ts | 17 +++-- .../src/designer/use-designer-rules.ts | 6 +- .../src/designer/use-designer-rules.ts | 24 +++---- .../components/register-designer.ts | 5 +- packages/mobile-ui-vue/components/register.ts | 40 ++---------- 24 files changed, 196 insertions(+), 125 deletions(-) create mode 100644 packages/mobile-ui-vue/components/common/src/compositions/use-dragula/use-dragula-common-rule.ts diff --git a/packages/mobile-ui-vue/components/card/src/card.component.tsx b/packages/mobile-ui-vue/components/card/src/card.component.tsx index 94e9eee1dfe..73c82f0a7cf 100644 --- a/packages/mobile-ui-vue/components/card/src/card.component.tsx +++ b/packages/mobile-ui-vue/components/card/src/card.component.tsx @@ -11,6 +11,7 @@ export default defineComponent({ const { bem } = useBem(CARD_NAME); const { slots } = context; const elementRef = ref(); + const contentElementRef = ref(); const toolbarItemCount = computed(() => props.toolbarItems?.length ?? 0); @@ -24,7 +25,7 @@ export default defineComponent({ return props.showFooter && !isFooterEmpty; }); - context.expose({ elementRef }); + context.expose({ elementRef, contentElementRef }); function renderHeader() { if (slots.header) { @@ -39,7 +40,7 @@ export default defineComponent({ function renderContent() { return ( -
+
{slots.content ? slots.content?.() : slots.default?.()}
); diff --git a/packages/mobile-ui-vue/components/card/src/designer/card.design.component.tsx b/packages/mobile-ui-vue/components/card/src/designer/card.design.component.tsx index 17122cf19c9..19ec0b4cf2f 100644 --- a/packages/mobile-ui-vue/components/card/src/designer/card.design.component.tsx +++ b/packages/mobile-ui-vue/components/card/src/designer/card.design.component.tsx @@ -11,7 +11,7 @@ export default defineComponent({ setup(props: CardProps, context) { const cardRef = ref(); const elementRef = computed(() => { - return cardRef.value?.elementRef; + return cardRef.value?.contentElementRef; }); const designerHostService = inject('designer-host-service'); @@ -21,16 +21,15 @@ export default defineComponent({ onMounted(() => { elementRef.value.componentInstance = componentInstance; + elementRef.value.setAttribute("data-dragref", `${designItemContext.schema.id}-container`); + elementRef.value.classList.add("drag-container"); }); context.expose(componentInstance.value); return () => ( + {...props}> {context.slots.default && context.slots.default()} ); diff --git a/packages/mobile-ui-vue/components/card/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/card/src/designer/use-designer-rules.ts index e0e932536a5..200a2719c6d 100644 --- a/packages/mobile-ui-vue/components/card/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/card/src/designer/use-designer-rules.ts @@ -1,10 +1,14 @@ -import { DesignerItemContext } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { CardProperty } from "../property-config/card.property-config"; import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; export function useDesignerRulesForCard(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { function canAccepts(draggingContext: DraggingResolveContext): boolean { + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } return true; } diff --git a/packages/mobile-ui-vue/components/common/src/compositions/index.ts b/packages/mobile-ui-vue/components/common/src/compositions/index.ts index d4ed1c00f4d..79452bb26a0 100644 --- a/packages/mobile-ui-vue/components/common/src/compositions/index.ts +++ b/packages/mobile-ui-vue/components/common/src/compositions/index.ts @@ -18,3 +18,4 @@ export * from './use-scroll-parent'; export * from './use-resize-observer'; export * from './use-long-press'; export * from './use-designer-component/use-designer-component'; +export * from './use-dragula/use-dragula-common-rule'; diff --git a/packages/mobile-ui-vue/components/common/src/compositions/use-designer-component/use-designer-component.ts b/packages/mobile-ui-vue/components/common/src/compositions/use-designer-component/use-designer-component.ts index 7d820cfddb9..b2798d1669e 100644 --- a/packages/mobile-ui-vue/components/common/src/compositions/use-designer-component/use-designer-component.ts +++ b/packages/mobile-ui-vue/components/common/src/compositions/use-designer-component/use-designer-component.ts @@ -197,6 +197,14 @@ export function useDesignerComponent( return designerRules.onPropertyChanged(event); } } + + /** + * 配置控件的基础信息(展示标题、路径) + */ + function setComponentBasicInfoMap(designerHostService?: DesignerHostService) { + + } + componentInstance.value = { canMove: checkCanMoveComponent(), canSelectParent: checkCanSelectParentComponent(), @@ -221,7 +229,8 @@ export function useDesignerComponent( triggerBelongedComponentToDeleteWhenDeleted: !!designerRules && designerRules.triggerBelongedComponentToDeleteWhenDeleted || ref(false), onRemoveComponent, getCustomButtons, - onPropertyChanged + onPropertyChanged, + setComponentBasicInfoMap, } as DesignerComponentInstance; return componentInstance as any; diff --git a/packages/mobile-ui-vue/components/common/src/compositions/use-dragula/use-dragula-common-rule.ts b/packages/mobile-ui-vue/components/common/src/compositions/use-dragula/use-dragula-common-rule.ts new file mode 100644 index 00000000000..8337fec1d1f --- /dev/null +++ b/packages/mobile-ui-vue/components/common/src/compositions/use-dragula/use-dragula-common-rule.ts @@ -0,0 +1,54 @@ +import { DgControl } from "../../properties"; +import { DesignerHostService, DraggingResolveContext } from "../../types"; + +export function useDragulaCommonRule() { + + /** + * 容器类控件的基础控制规则 + */ + function basalDragulaRuleForContainer(draggingContext: DraggingResolveContext, designerHostService?: DesignerHostService): boolean { + // 检查基础条件 + if (!draggingContext) { + return false; + } + + // 目标容器的组件实例 + const targetCmpInstance = draggingContext.targetContainer?.componentInstance && + draggingContext.targetContainer.componentInstance.value; + + if (!targetCmpInstance) { + return false; + } + + const targetContainerType = targetCmpInstance.schema.type; + const { componentCategory, componentType } = draggingContext; + + // 限制输入类控件的可接收容器 + if (componentCategory === 'input' || componentType === 'form-group') { + return targetContainerType === DgControl["form"].type; + } + + // 限制导航栏的可接收容器 + if (componentType === 'navbar') { + return targetContainerType === DgControl["page-header-container"].type; + } + + // 限制容器控件的可接收容器 + const containerTypes = [ + DgControl["page-header-container"].type, + DgControl["page-body-container"].type, + DgControl["page-footer-container"].type, + DgControl["float-container"].type + ]; + + if (containerTypes.includes(componentType)) { + return targetContainerType === DgControl["page-container"].type; + } + + return true; + } + + return { + basalDragulaRuleForContainer + }; +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts b/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts index 7686b232834..6d2e60860a5 100644 --- a/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts +++ b/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts @@ -30,7 +30,7 @@ export const DgControl = { 'lookup': { type: 'lookup', name: '帮助', icon: 'LookupEdit' }, - 'number-input': { type: 'number-input', name: '数值', icon: 'NumericBox' }, + 'number-spinner': { type: 'number-spinner', name: '数值', icon: 'NumericBox' }, 'date-picker': { type: 'date-picker', name: '日期', icon: 'DateBox' }, diff --git a/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts b/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts index 71f7291318c..c2fc3c7a24e 100644 --- a/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts +++ b/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts @@ -22,16 +22,16 @@ export class SchemaDOMMapping { { key: DgControl['lookup'].type, value: DgControl['lookup'].name } ], Decimal: [ - { key: DgControl['number-input'].type, value: DgControl['number-input'].name } + { key: DgControl['number-spinner'].type, value: DgControl['number-spinner'].name } ], Integer: [ - { key: DgControl['number-input'].type, value: DgControl['number-input'].name } + { key: DgControl['number-spinner'].type, value: DgControl['number-spinner'].name } ], Number: [ - { key: DgControl['number-input'].type, value: DgControl['number-input'].name } + { key: DgControl['number-spinner'].type, value: DgControl['number-spinner'].name } ], BigNumber: [ - { key: DgControl['number-input'].type, value: DgControl['number-input'].name } + { key: DgControl['number-spinner'].type, value: DgControl['number-spinner'].name } ], Date: [ { key: DgControl['date-picker'].type, value: DgControl['date-picker'].name } diff --git a/packages/mobile-ui-vue/components/component/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/component/src/designer/use-designer-rules.ts index 42ed7e2a757..84ba4678200 100644 --- a/packages/mobile-ui-vue/components/component/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/component/src/designer/use-designer-rules.ts @@ -1,4 +1,4 @@ -import { DesignerHostService, DesignerItemContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerItemContext, DraggingResolveContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { ComponentProperty } from "../property-config/component.property-config"; export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { @@ -6,7 +6,11 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe /** * 判断是否可以接收拖拽新增的子级控件 */ - function canAccepts(): boolean { + function canAccepts(draggingContext: DraggingResolveContext): boolean { + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } return true; } diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx index edc18151625..2c387d1b976 100644 --- a/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx @@ -25,8 +25,7 @@ export default defineComponent({ context.expose(componentInstance.value); const designProps = computed(() => ({ - ...props, - display: 'block', + ...props })); return () => { diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts index 6871ed7a654..fedebf0e226 100644 --- a/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts @@ -1,10 +1,14 @@ -import { DesignerItemContext } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { ContentContainerProperty } from "../property-config/content-container.property-config"; import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { function canAccepts(draggingContext: DraggingResolveContext): boolean { + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } return true; } diff --git a/packages/mobile-ui-vue/components/form-item/src/designer/form-item-use-designer-rules.ts b/packages/mobile-ui-vue/components/form-item/src/designer/form-item-use-designer-rules.ts index 6a9344e98d4..fcf537d99d5 100644 --- a/packages/mobile-ui-vue/components/form-item/src/designer/form-item-use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/form-item/src/designer/form-item-use-designer-rules.ts @@ -1,4 +1,4 @@ -import { DesignerItemContext, DesignerHostService, UseDesignerRules, DesignerComponentInstance, ComponentSchema } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, DesignerHostService, UseDesignerRules, DesignerComponentInstance, ComponentSchema, DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { FormGroupProperty } from "../property-config/form-group.property-config"; export function useDesignerRulesForFormItem(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { @@ -11,7 +11,7 @@ export function useDesignerRulesForFormItem(designItemContext: DesignerItemConte return true; } - function canAccepts() { + function canAccepts(draggingContext: DraggingResolveContext) { return false; } diff --git a/packages/mobile-ui-vue/components/form-item/src/designer/form-item.design.component.tsx b/packages/mobile-ui-vue/components/form-item/src/designer/form-item.design.component.tsx index 6164f934fb1..4d5edd794d6 100644 --- a/packages/mobile-ui-vue/components/form-item/src/designer/form-item.design.component.tsx +++ b/packages/mobile-ui-vue/components/form-item/src/designer/form-item.design.component.tsx @@ -1,5 +1,5 @@ -import { computed, defineComponent, inject, onMounted, PropType, ref } from 'vue'; -import { DesignerHostService, DesignerItemContext, extractProperties, useDesignerComponent } from '@farris/mobile-ui-vue/common';; +import { computed, defineComponent, inject, onMounted, PropType, ref, watch } from 'vue'; +import { DesignerHostService, DesignerItemContext, extractProperties, useDesignerComponent } from '@farris/mobile-ui-vue/common'; import { propertyConfigSchemaMapForDesigner, useTypeResolverDesign } from '@farris/mobile-ui-vue/dynamic-resolver'; import { useDesignerRulesForFormItem } from './form-item-use-designer-rules'; import { formItemProps } from '../form-item.props'; @@ -8,17 +8,13 @@ import FormItem from '../form-item.component'; export default defineComponent({ name: 'FmFormItemDesign', inheritAttrs: false, - props: { - ...extractProperties(formItemProps, ['label', 'labelAlign', 'labelWidth']), - editor: { type: Object as PropType, default: ()=>({}) } - }, + props: formItemProps, setup(props, context) { - const { slots } = context; - const { resolveEditorProps, resolveEditorType } = useTypeResolverDesign(); const elementRef = ref(); const editorRef = ref(); + const editor = ref(props.editor); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerHostService = inject('designer-host-service'); @@ -29,47 +25,42 @@ export default defineComponent({ elementRef.value.componentInstance = componentInstance; componentInstance.value.getPropConfig = (...args) => { - let propertyConfigSchema = propertyConfigSchemaMapForDesigner[props.editor.type]; - if (propertyConfigSchema && Object.keys(propertyConfigSchema).length === 0 && editorRef && editorRef.value && editorRef.value?.getPropConfig) { + let propertyConfigSchema = propertyConfigSchemaMapForDesigner[editor.value.type]; + if ( + propertyConfigSchema && + Object.keys(propertyConfigSchema).length === 0 && + editorRef.value?.getPropConfig + ) { propertyConfigSchema = editorRef.value.getPropConfig(...args, componentInstance.value); } return propertyConfigSchema; - }; }); context.expose(componentInstance.value); - const editorProps = computed(()=>{ - const editorType = props.editor.type || 'input-group'; - return resolveEditorProps(editorType, props.editor); - }); - - const renderConditionEditor = () => { - const editorType = props.editor.type || 'input-group'; + const renderConditionEditor = computed(() => { + const editorType = editor.value.type || 'input-group'; const Component = resolveEditorType(editorType); - return ; - }; - - const innerSlots = { - ...slots, - default: renderConditionEditor, - }; - - const formItemProps = computed(()=>{ - return { - ...props, - required: editorProps.value.required - }; + const editorProps = resolveEditorProps(editorType, editor.value); + return () => ; }); + watch( + [ + () => props.editor, + ], + ([newEditor]) => { + editor.value = { ...newEditor }; + }, { deep: true } + ); + return () => ( - + {...props}> + {renderConditionEditor.value()} ); - } -}); +}); \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/form-item/src/designer/response-form-use-designer-rules.ts b/packages/mobile-ui-vue/components/form-item/src/designer/response-form-use-designer-rules.ts index f0180528884..b4932e52029 100644 --- a/packages/mobile-ui-vue/components/form-item/src/designer/response-form-use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/form-item/src/designer/response-form-use-designer-rules.ts @@ -1,4 +1,4 @@ -import { ComponentSchema, DesignerComponentInstance, DesignerHostService, DesignerItemContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; +import { ComponentSchema, DesignerComponentInstance, DesignerHostService, DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { getSchemaByTypeForDesigner } from "@farris/mobile-ui-vue/dynamic-resolver"; import { ref } from "vue"; @@ -16,6 +16,14 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const isInFixedContextRules = true; function canAccepts(draggingContext: DraggingResolveContext): boolean { + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } + // 只接受输入类控件 + if (draggingContext.componentCategory !== 'input' && draggingContext.componentType !== 'form-group') { + return false; + } return true; } diff --git a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts index 42952726e03..c46682de91a 100644 --- a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts +++ b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts @@ -35,8 +35,9 @@ export const formItemProps = { showErrorMessage: { type: Boolean, default: undefined }, /** 错误信息位置 */ - errorMessageAlign: { type: String as PropType, deafult: undefined } - + errorMessageAlign: { type: String as PropType, deafult: undefined }, + + editor: { type: Object as PropType, default: {} } }; export type FormItemProps = ExtractPropTypes; diff --git a/packages/mobile-ui-vue/components/form-item/src/form-item.scss b/packages/mobile-ui-vue/components/form-item/src/form-item.scss index c663b4ccc65..060df8e5ea2 100644 --- a/packages/mobile-ui-vue/components/form-item/src/form-item.scss +++ b/packages/mobile-ui-vue/components/form-item/src/form-item.scss @@ -104,4 +104,23 @@ text-align: right; } } + +} + +.fm-input-wrapper { + &:not(:last-child) { + .fm-cell { + &:not(.fm-no-hairline) { + @include hairline('bottom', #ddd); + + &::after { + left: 16px; + } + } + } + } +} + +.fm-input-wrapper.farris-component.can-move { + padding: 0px !important; } \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/form-item/src/schema/form-item.schema.json b/packages/mobile-ui-vue/components/form-item/src/schema/form-item.schema.json index cbc0fe9417f..4e61562309c 100644 --- a/packages/mobile-ui-vue/components/form-item/src/schema/form-item.schema.json +++ b/packages/mobile-ui-vue/components/form-item/src/schema/form-item.schema.json @@ -55,6 +55,11 @@ "description": "编辑器", "type": "obejct", "default": null + }, + "binding": { + "description": "绑定", + "type": "obejct", + "default": null } }, "required": [ diff --git a/packages/mobile-ui-vue/components/index.ts b/packages/mobile-ui-vue/components/index.ts index 29a75cdfaca..5bca8209c41 100644 --- a/packages/mobile-ui-vue/components/index.ts +++ b/packages/mobile-ui-vue/components/index.ts @@ -58,7 +58,7 @@ export * from './designer'; export { type DynamicViewContext, DYNAMIC_VIEW_CONTEXT, DefaultDynamicViewContext } from './dynamic-view'; export { LOOKUP_HTTP_SERVICE_TOKEN } from './lookup'; -const components = [ +export const components = [ Button, ButtonEdit, ButtonGroup, diff --git a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts index c94334a2b7c..1c1772314e4 100644 --- a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts @@ -1,6 +1,6 @@ import { nextTick, ref } from "vue"; import { PAGE_BODY_CONTAINER_NAME } from '../page-body-container.props'; -import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DraggingResolveContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DesignerItemContext } from "@farris/mobile-ui-vue/common"; import { PageBodyContainerProperty } from "../property-config/page-body-container.property-config"; @@ -26,6 +26,12 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (unAcceptableControlTypes.includes(componentType)) { return false; } + + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } + return true; } diff --git a/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts index efe4894171d..ca8fc22a4ca 100644 --- a/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts @@ -1,6 +1,6 @@ import { ref } from "vue"; import { PAGE_CONTAINER_NAME } from '../page-container.props'; -import { DesignerHostService, DesignerItemContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { PageContainerProperty } from "../property-config/page-container.property-config"; @@ -15,21 +15,18 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const isInFixedContextRules = true; function canAccepts(draggingContext: DraggingResolveContext): boolean { - const acceptableControlTypes = [ - 'page-header-container', - 'page-footer-container', - 'page-body-container', - 'float-container', - ]; + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } + const uniqueControlTypes = [ 'page-header-container', 'page-footer-container', 'page-body-container', ]; const { componentType, parentComponentInstance } = draggingContext; - if (!acceptableControlTypes.includes(componentType)) { - return false; - } + const shouldBeUnique = uniqueControlTypes.includes(componentType); if (shouldBeUnique) { const parentComponent = parentComponentInstance; diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts index 2020dc0f0eb..4b4c4093eb5 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts @@ -1,6 +1,6 @@ import { ref } from "vue"; import { PAGE_FOOTER_CONTAINER_NAME } from '../page-footer-container.props'; -import { DesignerHostService, DesignerItemContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { PageFooterContainerProperty } from "../property-config/page-footer-container.property-config"; @@ -23,6 +23,10 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (!acceptableControlTypes.includes(componentType)) { return false; } + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } return true; } diff --git a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts index 4015500d20a..a8c5c8ddd40 100644 --- a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts @@ -1,6 +1,6 @@ import { ref } from "vue"; import { PAGE_HEADER_CONTAINER_NAME } from '../page-header-container.props'; -import { DesignerItemContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { PageHeaderContainerProperty } from "../property-config/page-header-container.property-config"; @@ -13,23 +13,19 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const hideNestedPadding = true; function canAccepts(draggingContext: DraggingResolveContext): boolean { - const acceptableControlTypes = [ - 'navbar', - 'content-container', - 'html-template', - ]; + const { componentType, parentComponentInstance } = draggingContext; + const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); + if (!basalRule) { + return false; + } + const uniqueControlTypes = [ 'navbar', ]; - const { sourceType, parentComponentInstance } = draggingContext; - if (!acceptableControlTypes.includes(sourceType)) { - return false; - } - const shouldBeUnique = uniqueControlTypes.includes(sourceType); + const shouldBeUnique = uniqueControlTypes.includes(componentType); if (shouldBeUnique) { - const parentComponent = parentComponentInstance?.parent?.value; - const contents: any[] = parentComponent?.contents || []; - const hasSameTypeControl = !!contents.find((content) => content.type === sourceType); + const contents: any[] = parentComponentInstance?.contents || []; + const hasSameTypeControl = !!contents.find((content) => content.type === componentType); if (hasSameTypeControl) { return false; } diff --git a/packages/mobile-ui-vue/components/register-designer.ts b/packages/mobile-ui-vue/components/register-designer.ts index b20f07ad699..7eb1d382c16 100644 --- a/packages/mobile-ui-vue/components/register-designer.ts +++ b/packages/mobile-ui-vue/components/register-designer.ts @@ -1,4 +1,5 @@ import { RegisterContext } from "./common"; +import { components } from "."; import { propertyConfigSchemaMapForDesigner, schemaMapForDesigner, schemaResolverMapForDesigner } from "./dynamic-resolver"; import { propertyEffectMapForDesigner } from "./dynamic-resolver/src/resolver/property-config/property-config-resolver-design"; @@ -10,7 +11,7 @@ let componentsRegistered = false; /** * 加载设计时组件 */ -function registerDesignerComponents(components: any[]) { +function registerDesignerComponents() { if (componentsRegistered) { return; } @@ -24,7 +25,7 @@ function registerDesignerComponents(components: any[]) { }; components.forEach(component => { - component.registerDesigner && component.registerDesigner(componentMapForDesigner, componentPropsConverterForDesigner, componentPropertyConfigConverterForDesigner, registerContext); + component['registerDesigner'] && component['registerDesigner'](componentMapForDesigner, componentPropsConverterForDesigner, componentPropertyConfigConverterForDesigner, registerContext); }); } diff --git a/packages/mobile-ui-vue/components/register.ts b/packages/mobile-ui-vue/components/register.ts index 785dbbd7fdd..95679f92a34 100644 --- a/packages/mobile-ui-vue/components/register.ts +++ b/packages/mobile-ui-vue/components/register.ts @@ -1,33 +1,8 @@ +import { components } from "."; import { RegisterContext } from "./common"; import { propertyConfigSchemaMap, schemaMap, schemaResolverMap } from "./dynamic-resolver"; import { propertyEffectMap } from "./dynamic-resolver/src/resolver/property-config/property-config-resolver"; -import Button from './button'; -import ButtonGroup from './button-group'; -import InputGroup from './input-group'; -import NumberInput from './number-input'; -import Textarea from './textarea'; -import Navbar from './navbar'; -import Switch from './switch'; -import Form from './form'; -import FormItem from './form-item'; -import { Picker } from './picker'; -import { DatePicker } from './date-picker'; -import { DateTimePicker } from "./date-time-picker"; -import Lookup from './lookup'; -import RadioGroup from './radio-group'; -import CheckboxGroup from './checkbox-group'; - -import PageContainer from './page-container'; -import PageBodyContainer from './page-body-container'; -import PageHeaderContainer from './page-header-container'; -import PageFooterContainer from './page-footer-container'; -import Component from './component'; -import ContentContainer from './content-container'; -import { Card } from './card'; -import FloatContainer from './float-container'; -import Listview from './list-view'; - const componentMap: Record = {}; const propsConverterMap: Record = {}; const propConfigsConverterMap: Record = {}; @@ -42,6 +17,7 @@ function registerComponents() { if (componentsRegistered) { return; } + componentsRegistered = true; const registerContext: RegisterContext = { schemaMap: schemaMap, @@ -50,16 +26,8 @@ function registerComponents() { schemaResolverMap: schemaResolverMap }; - const componentsToRegister = [ - Component, PageContainer, PageHeaderContainer, PageBodyContainer, PageFooterContainer, - ContentContainer, FloatContainer, Card, - Button, ButtonGroup, Navbar, Listview, - Form, FormItem, InputGroup, Textarea, NumberInput, Switch, - DatePicker, DateTimePicker, Picker, - Lookup, RadioGroup, CheckboxGroup - ]; - componentsToRegister.forEach((componentToRegister) => { - componentToRegister.register(componentMap, propsConverterMap, propConfigsConverterMap, resolverMap, registerContext); + components.forEach((componentToRegister) => { + componentToRegister['register'] && componentToRegister['register'](componentMap, propsConverterMap, propConfigsConverterMap, resolverMap, registerContext); }); } -- Gitee From 76f2eeb2ae7d800460af098f73463198f8809e12 Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Wed, 20 Aug 2025 17:17:18 +0800 Subject: [PATCH 07/10] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E8=BE=93=E5=85=A5=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../button/src/designer/use-designer-rules.ts | 19 +- .../designer/date-picker.design.component.tsx | 4 +- .../date-picker.property-config.ts | 5 - .../input-group.property-config.ts | 13 +- .../src/schema/input-group.schema.json | 5 + .../designer/list-view.design.component.tsx | 2 +- .../src/designer/lookup.design.component.tsx | 4 +- .../number-input.property-config.ts | 19 +- .../page-body-container.design.component.tsx | 2 +- ...page-footer-container.design.component.tsx | 2 +- ...page-header-container.design.component.tsx | 2 +- .../src/designer/use-designer-rules.ts | 7 +- .../enum-field-input.design.component.tsx | 75 ---- .../src/designer/picker.design.component.tsx | 4 +- .../src/composition/entity/base-property.ts | 130 ------ .../composition/entity/input-base-property.ts | 390 ------------------ .../src/composition/entity/use-input-rules.ts | 62 --- .../src/designer/switch.design.component.tsx | 2 +- .../switch/src/schema/switch.schema.json | 4 + .../components/time-picker/index.ts | 9 +- .../designer/time-picker.design.component.tsx | 71 ++++ .../src/designer/use-designer-rules.ts | 15 + .../time-picker.property-config.ts | 52 +++ .../time-picker/src/schema/schema-mapper.ts | 6 + .../time-picker/src/schema/schema-resolver.ts | 5 + .../src/schema/time-picker.schema.json | 78 ++++ .../time-picker/src/time-picker.props.ts | 10 + 27 files changed, 311 insertions(+), 686 deletions(-) delete mode 100644 packages/mobile-ui-vue/components/picker/src/designer/enum-field-input.design.component.tsx delete mode 100644 packages/mobile-ui-vue/components/property-panel/src/composition/entity/base-property.ts delete mode 100644 packages/mobile-ui-vue/components/property-panel/src/composition/entity/input-base-property.ts delete mode 100644 packages/mobile-ui-vue/components/property-panel/src/composition/entity/use-input-rules.ts create mode 100644 packages/mobile-ui-vue/components/time-picker/src/designer/time-picker.design.component.tsx create mode 100644 packages/mobile-ui-vue/components/time-picker/src/designer/use-designer-rules.ts create mode 100644 packages/mobile-ui-vue/components/time-picker/src/property-config/time-picker.property-config.ts create mode 100644 packages/mobile-ui-vue/components/time-picker/src/schema/schema-mapper.ts create mode 100644 packages/mobile-ui-vue/components/time-picker/src/schema/schema-resolver.ts create mode 100644 packages/mobile-ui-vue/components/time-picker/src/schema/time-picker.schema.json diff --git a/packages/mobile-ui-vue/components/button/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/button/src/designer/use-designer-rules.ts index da2a3b6fd2b..28b9375b4e3 100644 --- a/packages/mobile-ui-vue/components/button/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/button/src/designer/use-designer-rules.ts @@ -31,7 +31,10 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe } function getDesignerClass(): string { - return ' '; + if (designItemContext.schema.block !== false) { + return ' fm-button--block '; + } + return ''; } /** @@ -42,16 +45,16 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const { schema } = designItemContext; return componentProp.getPropertyConfig(schema); } - + return { canAccepts, - // triggerBelongedComponentToMoveWhenMoved, - // triggerBelongedComponentToDeleteWhenDeleted, - // checkCanMoveComponent, - // checkCanDeleteComponent, + triggerBelongedComponentToMoveWhenMoved, + triggerBelongedComponentToDeleteWhenDeleted, + checkCanMoveComponent, + checkCanDeleteComponent, hideNestedPaddingInDesginerView, - // getStyles, - // getDesignerClass, + getStyles, + getDesignerClass, getPropsConfig }; } diff --git a/packages/mobile-ui-vue/components/date-picker/src/designer/date-picker.design.component.tsx b/packages/mobile-ui-vue/components/date-picker/src/designer/date-picker.design.component.tsx index 6bf49f080e9..f670582894e 100644 --- a/packages/mobile-ui-vue/components/date-picker/src/designer/date-picker.design.component.tsx +++ b/packages/mobile-ui-vue/components/date-picker/src/designer/date-picker.design.component.tsx @@ -34,7 +34,9 @@ export default defineComponent({ const inputProps = computed(() => ({ ...props, - editable: false + editable: false, + rightIcon: 's-arrow', + placeholder: props.placeholder || '请选择日期' })); return () => ; diff --git a/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts b/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts index e915e2bd227..060c423f2ff 100644 --- a/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts +++ b/packages/mobile-ui-vue/components/date-picker/src/property-config/date-picker.property-config.ts @@ -12,11 +12,6 @@ export class DatePickerProperty extends InputBaseProperty { propertyData, { type: 'date-picker' }, { - title: { - description: '', - title: '标题', - type: 'string', - }, displayFormat: { description: '', title: '日期格式', diff --git a/packages/mobile-ui-vue/components/input-group/src/property-config/input-group.property-config.ts b/packages/mobile-ui-vue/components/input-group/src/property-config/input-group.property-config.ts index 27d9818b323..66d9a859d4b 100644 --- a/packages/mobile-ui-vue/components/input-group/src/property-config/input-group.property-config.ts +++ b/packages/mobile-ui-vue/components/input-group/src/property-config/input-group.property-config.ts @@ -19,6 +19,15 @@ export class InputGroupProperty extends InputBaseProperty { getEditorProperties(propertyData: any) { const self = this; + // 获取绑定字段schema中的长度属性 + let maxLength; + if (propertyData?.binding?.type === 'Form') { + const fieldInfo = this.schemaService.getFieldByIDAndVMID(propertyData.binding.field, this.viewModelId); + if (fieldInfo?.schemaField?.type) { + maxLength = fieldInfo.schemaField.type.length; + } + } + const editorProperties = self.getComponentConfig( propertyData, {}, @@ -29,7 +38,9 @@ export class InputGroupProperty extends InputBaseProperty { type: 'number', editor: { nullable: true, - min: 0 + min: 0, + useThousands: false, + max: maxLength } } }, diff --git a/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json b/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json index 4e2924c5f6d..5d090e1359e 100644 --- a/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json +++ b/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json @@ -56,6 +56,11 @@ "type": "object", "default": {} }, + "maxLength": { + "description": "最大长度", + "type": "number", + "default": false + }, "onUpdate:modelValue": { "description": "值更新事件", "type": "string", diff --git a/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx b/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx index 0a55f2f851e..5f579bf0c9c 100644 --- a/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx +++ b/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx @@ -33,7 +33,7 @@ export default defineComponent({ function renderItemTemplate() { return ( -
+
); } diff --git a/packages/mobile-ui-vue/components/lookup/src/designer/lookup.design.component.tsx b/packages/mobile-ui-vue/components/lookup/src/designer/lookup.design.component.tsx index 17407092fa7..1814c31f1c6 100644 --- a/packages/mobile-ui-vue/components/lookup/src/designer/lookup.design.component.tsx +++ b/packages/mobile-ui-vue/components/lookup/src/designer/lookup.design.component.tsx @@ -34,7 +34,9 @@ export default defineComponent({ const inputProps = computed(() => ({ ...props, - editable: false + editable: false, + rightIcon: 's-arrow', + placeholder: props.placeholder || '请选择' })); return () => ; diff --git a/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts b/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts index b54c783ecea..02d8c88f144 100644 --- a/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts +++ b/packages/mobile-ui-vue/components/number-input/src/property-config/number-input.property-config.ts @@ -6,14 +6,27 @@ export class NumberInputProperty extends InputBaseProperty { } getEditorProperties(propertyData: any) { + let maxPrecision; + if (propertyData?.binding?.type === 'Form') { + const fieldInfo = this.schemaService.getFieldByIDAndVMID(propertyData.binding.field, this.viewModelId); + if (fieldInfo?.schemaField?.type) { + maxPrecision = fieldInfo.schemaField.type.precision; + } + } return this.getComponentConfig( propertyData, { type: 'number-spinner' }, { precision: { - description: '', - title: '精度', - type: 'number' + description: "", + title: "精度", + type: "number", + editor: { + readonly: maxPrecision === 0, + min: 0, + max: maxPrecision + }, + refreshPanelAfterChanged: true }, max: { description: '', diff --git a/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx b/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx index 6a35ae95978..23099f4fd85 100644 --- a/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx @@ -9,7 +9,7 @@ export default defineComponent({ emits: [], setup(props: PageBodyContainerProps, context: SetupContext) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service') as DesignerHostService; const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx b/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx index 22c581508dc..5d800295fff 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx @@ -9,7 +9,7 @@ export default defineComponent({ emits: [], setup(props: PageFooterContainerProps, context: SetupContext) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service') as DesignerHostService; const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx b/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx index 0f354e8dd11..8cd5b13c5c9 100644 --- a/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx @@ -10,7 +10,7 @@ export default defineComponent({ setup(props: PageHeaderContainerProps, context: SetupContext) { const elementRef = ref(); const designItemContext = inject('design-item-context') as DesignerItemContext; - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service') as DesignerHostService; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts index a8c5c8ddd40..923eb2dbee9 100644 --- a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts @@ -1,16 +1,17 @@ import { ref } from "vue"; import { PAGE_HEADER_CONTAINER_NAME } from '../page-header-container.props'; -import { DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerItemContext, DesignerMode, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { PageHeaderContainerProperty } from "../property-config/page-header-container.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); const triggerBelongedComponentToDeleteWhenDeleted = ref(false); const hideNestedPadding = true; + const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { const { componentType, parentComponentInstance } = draggingContext; @@ -38,7 +39,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe } function checkCanDeleteComponent() { - return true; + return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/picker/src/designer/enum-field-input.design.component.tsx b/packages/mobile-ui-vue/components/picker/src/designer/enum-field-input.design.component.tsx deleted file mode 100644 index a8e103fb4d7..00000000000 --- a/packages/mobile-ui-vue/components/picker/src/designer/enum-field-input.design.component.tsx +++ /dev/null @@ -1,75 +0,0 @@ - -/** - * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { computed, defineComponent, inject, onMounted, readonly, ref, SetupContext } from 'vue'; -import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@farris/mobile-ui-vue/designer-canvas'; -import { pickerProps } from '../picker.props'; -import Picker from '../picker.component'; -import { useEnumFieldDesignerRules } from './use-designer-rules';; - -export default defineComponent({ - name: 'FmEnumFieldInputDesign', - props: pickerProps, - emits: [] as (string[] & ThisType) | undefined, - setup(props, context: SetupContext) { - const elementRef = ref(); - const designerHostService = inject('designer-host-service'); - const designItemContext = inject('design-item-context') as DesignerItemContext; - const designerRulesComposition = useEnumFieldDesignerRules(designItemContext, designerHostService); - const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); - - onMounted(() => { - elementRef.value.componentInstance = componentInstance; - }); - - /** - * 解决在设计时,数据为空数组,界面不显示内容的问题 - */ - const realEnumData = computed(() => { - if (!props.columns || props.columns.length === 0) { - const result = [] as any; - [ - { value: 'example1', name: '示例一' }, - { value: 'example2', name: '示例二' } - ].map(item => { - const tempData = {}; - tempData[props.valueField] = item['value']; - tempData[props.textField] = item['name']; - result.push(tempData); - }); - return result; - } - return props.columns; - }); - - const inputGroupProps = computed(() => ({ - ...props, - editable: false, - readonly: true, - modelValue:null, - columns:realEnumData.value, - type:null - })); - - context.expose(componentInstance.value); - - return () => { - return ( - - ); - }; - } -}); diff --git a/packages/mobile-ui-vue/components/picker/src/designer/picker.design.component.tsx b/packages/mobile-ui-vue/components/picker/src/designer/picker.design.component.tsx index 8f16c721e37..b146f229496 100644 --- a/packages/mobile-ui-vue/components/picker/src/designer/picker.design.component.tsx +++ b/packages/mobile-ui-vue/components/picker/src/designer/picker.design.component.tsx @@ -54,7 +54,9 @@ export default defineComponent({ const inputProps = computed(() => ({ ...props, - editable: false + editable: false, + rightIcon: 's-arrow', + placeholder: props.placeholder || '请选择' })); return () => ; diff --git a/packages/mobile-ui-vue/components/property-panel/src/composition/entity/base-property.ts b/packages/mobile-ui-vue/components/property-panel/src/composition/entity/base-property.ts deleted file mode 100644 index 9ec35abb278..00000000000 --- a/packages/mobile-ui-vue/components/property-panel/src/composition/entity/base-property.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { DesignerComponentInstance } from "@farris/mobile-ui-vue/designer-canvas"; -import { DgControl } from "../../../../designer-canvas/src/composition/dg-control"; -import { cloneDeep } from "lodash-es"; - -/** - * 控件属性基类 - */ -export class BaseControlProperty { - public componentId: string; - - public viewModelId: string; - - public eventsEditorUtils: any; - - public formSchemaUtils: any; - public formMetadataConverter: any; - public designViewModelUtils: any; - public designViewModelField: any; - public controlCreatorUtils: any; - public designerHostService: any; - - schemaService: any = null; - - metadataService: any = null; - - protected propertyConfig = { - type: 'object', - categories: {} - }; - - constructor(componentId: string, designerHostService: any) { - this.componentId = componentId; - this.designerHostService = designerHostService; - this.eventsEditorUtils = designerHostService['eventsEditorUtils']; - this.formSchemaUtils = designerHostService['formSchemaUtils']; - this.formMetadataConverter = designerHostService['formMetadataConverter']; - this.viewModelId = this.formSchemaUtils?.getViewModelIdByComponentId(componentId) || ''; - this.designViewModelUtils = designerHostService['designViewModelUtils']; - this.controlCreatorUtils = designerHostService['controlCreatorUtils']; - this.metadataService = designerHostService['metadataService']; - this.schemaService = designerHostService['schemaService']; - } - - getTableInfo() { - return this.schemaService?.getTableInfoByViewModelId(this.viewModelId); - } - - setDesignViewModelField(propertyData: any) { - const bindingFieldId = propertyData.binding && propertyData.binding.type === 'Form' && propertyData.binding.field; - // 视图模型中[字段更新时机]属性现在要在控件上维护,所以在控件上复制一份属性值 - if (bindingFieldId) { - if (!this.designViewModelField) { - const dgViewModel = this.designViewModelUtils.getDgViewModel(this.viewModelId); - this.designViewModelField = dgViewModel.fields.find(f => f.id === bindingFieldId); - } - propertyData.updateOn = this.designViewModelField?.updateOn; - } - } - - getBasicPropConfig(propertyData: any): any { - return { - description: 'Basic Information', - title: '基本信息', - properties: { - id: { - description: '组件标识', - title: '标识', - type: 'string', - readonly: true - }, - type: { - description: '组件类型', - title: '控件类型', - type: 'select', - editor: { - type: 'combo-list', - textField: 'name', - valueField: 'value', - editable: false, - data: [{ value: propertyData.type, name: DgControl[propertyData.type] && DgControl[propertyData.type].name }] - } - } - } - }; - - } - - - protected getAppearanceConfig(propertyData = null): any { - return { - title: "外观", - description: "Appearance", - properties: { - class: { - title: "class样式", - type: "string", - description: "组件的CSS样式", - $converter: "/converter/appearance.converter" - }, - style: { - title: "style样式", - type: "string", - description: "组件的样式", - $converter: "/converter/appearance.converter" - } - } - }; - } - - /** - * - * @param propertyId - * @param componentInstance - * @returns - */ - public updateElementByParentContainer(propertyId:string, componentInstance: DesignerComponentInstance){ - // 1、定位控件父容器 - const parentContainer = componentInstance && componentInstance.parent && componentInstance.parent['schema']; - if (!parentContainer) { - return; - } - const index = parentContainer.contents.findIndex(c => c.id === propertyId); - // 通过cloneDeep方式的触发更新 - const controlSchema = cloneDeep(parentContainer.contents[index]); - // 5、替换控件 - parentContainer.contents.splice(index, 1); - parentContainer.contents.splice(index, 0, controlSchema); - } - -} diff --git a/packages/mobile-ui-vue/components/property-panel/src/composition/entity/input-base-property.ts b/packages/mobile-ui-vue/components/property-panel/src/composition/entity/input-base-property.ts deleted file mode 100644 index a8dd354e606..00000000000 --- a/packages/mobile-ui-vue/components/property-panel/src/composition/entity/input-base-property.ts +++ /dev/null @@ -1,390 +0,0 @@ - -import { BaseControlProperty } from "./base-property"; -import { SchemaDOMMapping } from './schema-dom-mapping'; -import { canvasChanged } from '../../../../designer-canvas/src/composition/designer-canvas-changed'; -import { DesignerComponentInstance } from "../../../../designer-canvas/src/types"; -import { FormUnifiedColumnLayout } from "../type"; -import { - ResponseFormLayoutContext, - UseResponseLayoutEditorSetting, -} from "@farris/mobile-ui-vue/response-layout-editor"; -import { useResponseLayoutEditorSetting } from "../../../../response-layout-editor/src/composition/converter/use-response-layout-editor-setting"; -import { FormSchemaEntityFieldType$Type } from "@farris/mobile-ui-vue/common"; - -export class InputBaseProperty extends BaseControlProperty { - public responseLayoutEditorFunction: UseResponseLayoutEditorSetting; - constructor(componentId: string, designerHostService: any) { - super(componentId, designerHostService); - this.responseLayoutEditorFunction = useResponseLayoutEditorSetting(this.formSchemaUtils); - } - - public getPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance) { - // 基本信息 - this.propertyConfig.categories['basic'] = this.getBasicProperties(propertyData, componentInstance); - // 外观 - this.propertyConfig.categories['appearance'] = this.getAppearanceProperties(propertyData, componentInstance); - // 编辑器 - this.propertyConfig.categories['editor'] = this.getEditorProperties(propertyData); - return this.propertyConfig; - } - - public getBasicProperties(propertyData, componentInstance): any { - const self = this; - this.setDesignViewModelField(propertyData); - return { - description: 'Basic Information', - title: '基本信息', - properties: { - id: { - description: '组件标识', - title: '标识', - type: 'string', - readonly: true - }, - type: { - description: '编辑器类型', - title: '编辑器类型', - type: 'string', - refreshPanelAfterChanged: true, - $converter: '/converter/change-editor.converter', - editor: { - type: 'combo-list', - textField: 'value', - valueField: 'key', - editable: false, - data: self.designViewModelField ? SchemaDOMMapping.getEditorTypesByMDataType(self.designViewModelField.type?.name) : SchemaDOMMapping.getAllInputTypes() - } - }, - label: { - title: "标签", - type: "string", - $converter: '/converter/form-group-label.converter' - }, - binding: { - description: "绑定的表单字段", - title: "绑定", - editor: { - type: "binding-selector", - bindingType: { "enable": false }, - editorParams: { - componentSchema: propertyData, - needSyncToViewModel: true, - viewModelId: this.viewModelId, - designerHostService: this.designerHostService, - disableOccupiedFields: true - }, - textField: 'bindingField' - } - } - }, - setPropertyRelates(changeObject, prop) { - if (!changeObject) { - return; - } - switch (changeObject && changeObject.propertyID) { - case 'type': { - self.changeControlType(propertyData, changeObject, componentInstance); - break; - } - case 'label': { - changeObject.needRefreshControlTree = true; - break; - } - } - } - }; - } - public getAppearanceProperties(propertyData, componentInstance): any { - - const self = this; - return { - title: "外观", - description: "Appearance", - properties: { - class: { - title: "class样式", - type: "string", - description: "组件的CSS样式", - $converter: "/converter/appearance.converter" - }, - style: { - title: "style样式", - type: "string", - description: "组件的样式", - $converter: "/converter/appearance.converter" - }, - responseLayout: { - description: "响应式列宽", - title: "响应式列宽", - type: "boolean", - visible: true, - // 这个属性,标记当属性变更得时候触发重新更新属性 - refreshPanelAfterChanged: true, - editor: { - type: "response-layout-editor-setting", - initialState: self.responseLayoutEditorFunction.checkCanOpenLayoutEditor(propertyData, self.componentId) - } - } - }, - setPropertyRelates(changeObject, prop) { - if (!changeObject) { - return; - } - switch (changeObject && changeObject.propertyID) { - case 'responseLayout': - self.responseLayoutEditorFunction.changeFormControlsByResponseLayoutConfig(changeObject.propertyValue, self.componentId || propertyData.id); - self.updateUnifiedLayoutAfterResponseLayoutChanged(self.componentId); - self.updateElementByParentContainer(propertyData.id, componentInstance); - delete propertyData.responseLayout; - break; - case 'class': - self.updateUnifiedLayoutAfterControlChanged(changeObject.propertyValue, propertyData.id, this.componentId); - self.updateElementByParentContainer(propertyData.id, componentInstance); - break; - } - - } - }; - }; - - public getEditorProperties(propertyData): any { - return this.getComponentConfig(propertyData); - } - - - /** - * 卡片控件:切换控件类型后事件 - * @param propertyData 控件DOM属性 - * @param newControlType 新控件类型 - */ - private changeControlType(propertyData, changeObject, componentInstance: DesignerComponentInstance) { - const newControlType = changeObject.propertyValue; - - // 1、定位控件父容器 - const parentContainer = componentInstance && componentInstance.parent && componentInstance.parent['schema']; - if (!parentContainer) { - return; - } - - const index = parentContainer.contents.findIndex(c => c.id === propertyData.id); - const oldControl = parentContainer.contents[index]; - - let newControl; - // 2、记录绑定字段viewModel的变更 - if (this.designViewModelField) { - const dgViewModel = this.designViewModelUtils.getDgViewModel(this.viewModelId); - dgViewModel.changeField(this.designViewModelField.id, { - editor: { - $type: newControlType - }, - name: this.designViewModelField.name, - require: this.designViewModelField.require, - readonly: this.designViewModelField.readonly - }, false); - // 3、创建新控件 - newControl = this.controlCreatorUtils.setFormFieldProperty(this.designViewModelField, newControlType); - } - if (!newControl) { - newControl = this.controlCreatorUtils.createFormGroupWithoutField(newControlType); - } - // 4、保留原id样式等属性 - Object.assign(newControl, { - id: oldControl.id, - appearance: oldControl.appearance, - size: oldControl.size, - label: oldControl.label, - binding: oldControl.binding, - visible: oldControl.visible - }); - Object.assign(newControl.editor, { - isTextArea: newControl.isTextArea && oldControl.isTextArea, - placeholder: oldControl.editor?.placeholder, - holdPlace: oldControl.editor?.holdPlace, - readonly: oldControl.editor?.readonly, - required: oldControl.editor?.required, - }); - - // 5、替换控件 - parentContainer.contents.splice(index, 1); - parentContainer.contents.splice(index, 0, newControl); - componentInstance.schema = Object.assign(oldControl, newControl); - - // 6、暂时移除旧控件的选中样式(后续考虑更好的方式) - Array.from(document.getElementsByClassName('dgComponentSelected') as HTMLCollectionOf).forEach( - (element: HTMLElement) => element.classList.remove('dgComponentSelected') - ); - - Array.from(document.getElementsByClassName('dgComponentFocused') as HTMLCollectionOf).forEach( - (element: HTMLElement) => element.classList.remove('dgComponentFocused') - ); - // 7、触发刷新 - canvasChanged.value++; - - } - - public getComponentConfig(propertyData, info = {}, properties = {}, setPropertyRelates?: any) { - const editorBasic = Object.assign({ - description: "编辑器", - title: "编辑器", - type: "input-group", - $converter: "/converter/property-editor.converter" - }, info); - - const editorProperties = Object.assign({ - readonly: { - description: "", - title: "只读", - type: "boolean", - editor: { - enableClear: true, - editable: true - } - }, - disabled: { - description: "", - title: "禁用", - type: "boolean", - visible: false - }, - // required: { - // description: "", - // title: "必填", - // type: "boolean" - // }, - placeholder: { - description: "空值时,输入控件内的占位文本", - title: "提示文本", - type: "string" - } - }, properties); - - return { ...editorBasic, properties: { ...editorProperties }, setPropertyRelates }; - - } - - - /** - * 修改某一输入控件的样式后更新Form的统一布局配置 - * @param controlClass 控件样式 - * @param controlId 控件Id - * @param componentId 控件所在组件id - */ - private updateUnifiedLayoutAfterControlChanged(controlClass: string, controlId: string, componentId: string) { - const controlClassArray = controlClass.split(' '); - - let colClass = controlClassArray.find(item => /^col-([1-9]|10|11|12)$/.test(item)); - let colMDClass = controlClassArray.find(item => /^col-md-([1-9]|10|11|12)$/.test(item)); - let colXLClass = controlClassArray.find(item => /^col-xl-([1-9]|10|11|12)$/.test(item)); - let colELClass = controlClassArray.find(item => /^col-el-([1-9]|10|11|12)$/.test(item)); - - colClass = colClass || 'col-12'; - colMDClass = colMDClass || 'col-md-' + colClass.replace('col-', ''); - colXLClass = colXLClass || 'col-xl-' + colMDClass.replace('col-md-', ''); - colELClass = colELClass || 'col-el-' + colXLClass.replace('col-xl-', ''); - - const latestControlLayoutConfig = { - id: controlId, - columnInSM: parseInt(colClass.replace('col-', ''), 10), - columnInMD: parseInt(colMDClass.replace('col-md-', ''), 10), - columnInLG: parseInt(colXLClass.replace('col-xl-', ''), 10), - columnInEL: parseInt(colELClass.replace('col-el-', ''), 10), - }; - - this.updateUnifiedLayoutAfterResponseLayoutChanged(componentId, latestControlLayoutConfig); - } - - /** - * 修改控件布局配置后更新Form统一布局配置 - * @param componentId 组件Id - * @param controlLayoutConfig 某单独变动的控件配置项,FormResponseLayoutContext类型 - */ - private updateUnifiedLayoutAfterResponseLayoutChanged(componentId: string, controlLayoutConfig?: any): FormUnifiedColumnLayout | undefined { - const { formNode } = this.responseLayoutEditorFunction.checkCanFindFormNode(componentId); - // 更改form上的统一配置 - if (!formNode || !formNode.unifiedLayout) { - return; - } - const responseLayoutConfig: ResponseFormLayoutContext[] = []; - this.responseLayoutEditorFunction.getResonseFormLayoutConfig(formNode, responseLayoutConfig, 1); - if (controlLayoutConfig) { - const changedControl = responseLayoutConfig.find(c => c.id === controlLayoutConfig.id); - Object.assign(changedControl || {}, controlLayoutConfig); - } - - // 收集每种屏幕下的列数 - const columnInSMArray = responseLayoutConfig.map(config => config.columnInSM); - const columnInMDArray = responseLayoutConfig.map(config => config.columnInMD); - const columnInLGArray = responseLayoutConfig.map(config => config.columnInLG); - const columnInELArray = responseLayoutConfig.map(config => config.columnInEL); - - // 只有每个控件的宽度都一样时,才认为form上有统一宽度,否则认为是自定义的控件宽度,此处传递null - const uniqueColClassInSM = this.checkIsUniqueColumn(columnInSMArray) ? columnInSMArray[0] : null; - const uniqueColClassInMD = this.checkIsUniqueColumn(columnInMDArray) ? columnInMDArray[0] : null; - const uniqueColClassInLG = this.checkIsUniqueColumn(columnInLGArray) ? columnInLGArray[0] : null; - const uniqueColClassInEL = this.checkIsUniqueColumn(columnInELArray) ? columnInELArray[0] : null; - - - Object.assign(formNode.unifiedLayout, { - uniqueColClassInSM, - uniqueColClassInMD, - uniqueColClassInLG, - uniqueColClassInEL - }); - } - /** - * 校验宽度样式值是否一致 - */ - private checkIsUniqueColumn(columnsInScreen: number[]) { - const keySet = new Set(columnsInScreen); - const exclusiveKeys = Array.from(keySet); - - if (exclusiveKeys.length === 1) { - return true; - } - return false; - } - /** - * 枚举项编辑器 - * @param propertyData - * @param valueField - * @param textField - * @returns - */ - protected getItemCollectionEditor(propertyData, valueField, textField) { - valueField = valueField || 'value'; - textField = textField || 'name'; - return { - editor: { - columns: [ - { field: valueField, title: '值', dataType: 'string' }, - { field: textField, title: '名称', dataType: 'string' }, - { field: 'disabled', title: '禁用', visible: false, dataType: 'boolean', editor: { type: 'switch' } }, - ], - type: "item-collection-editor", - valueField: valueField, - nameField: textField, - requiredFields: [valueField, textField], - uniqueFields: [valueField, textField], - readonly: this.checkEnumDataReadonly(propertyData) - } - }; - } - /** - * 判断枚举数据是否只读 - * 1、没有绑定信息或者绑定变量,可以新增、删除、修改 - * 2、绑定类型为字段,且字段为枚举字段,则不可新增、删除、修改枚举值。只能从be修改然后同步到表单上。 - * @param propertyData 下拉框控件属性值 - */ - private checkEnumDataReadonly(propertyData: any): boolean { - // 没有绑定信息或者绑定变量 - if (!propertyData.binding || propertyData.binding.type !== 'Form') { - return false; - } - if (this.designViewModelField && this.designViewModelField.type && - this.designViewModelField.type.$type === FormSchemaEntityFieldType$Type.EnumType) { - // 低代码、零代码,枚举字段均不可以改 - return true; - } - return false; - } -} diff --git a/packages/mobile-ui-vue/components/property-panel/src/composition/entity/use-input-rules.ts b/packages/mobile-ui-vue/components/property-panel/src/composition/entity/use-input-rules.ts deleted file mode 100644 index de3ba04fcd6..00000000000 --- a/packages/mobile-ui-vue/components/property-panel/src/composition/entity/use-input-rules.ts +++ /dev/null @@ -1,62 +0,0 @@ - -import { ref } from "vue"; -import { DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from '../../../../designer-canvas/src/composition/types'; -import { ComponentSchema, DesignerItemContext } from "@farris/mobile-ui-vue/designer-canvas"; - -export function useInputDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { - const schema = designItemContext.schema as ComponentSchema; - /** 组件在拖拽时需要将所属的Component一起拖拽 */ - const triggerBelongedComponentToMoveWhenMoved = ref(true); - /** 组件在删除时需要将所属的Component一起拖拽 */ - const triggerBelongedComponentToDeleteWhenDeleted = ref(true); - /** data-grid所属的上级组件控制规则 */ - /** - * 判断是否可以接收拖拽新增的子级控件 - */ - function canAccepts(draggingContext: DraggingResolveContext): boolean { - return false; - } - - /** - * data-grid是否支持删除,取决于所属组件是否支持删除 - */ - function checkCanDeleteComponent() { - return false; - } - /** - * data-grid是否支持移动,取决于所属组件是否支持移动 - */ - function checkCanMoveComponent() { - return false; - } - - function hideNestedPaddingInDesginerView() { - return true; - } - - function onAcceptMovedChildElement(sourceElement: DesignerHTMLElement) { - } - /** - * 判断data-grid上下文 - */ - function resolveComponentContext() { - - } - // 构造属性配置方法 - function getPropsConfig(componentId: string) { - return null; - } - - return { - canAccepts, - checkCanDeleteComponent, - checkCanMoveComponent, - hideNestedPaddingInDesginerView, - onAcceptMovedChildElement, - resolveComponentContext, - triggerBelongedComponentToMoveWhenMoved, - triggerBelongedComponentToDeleteWhenDeleted, - getPropsConfig - } as UseDesignerRules; - -} diff --git a/packages/mobile-ui-vue/components/switch/src/designer/switch.design.component.tsx b/packages/mobile-ui-vue/components/switch/src/designer/switch.design.component.tsx index a56bdc8759e..3c1ee440398 100644 --- a/packages/mobile-ui-vue/components/switch/src/designer/switch.design.component.tsx +++ b/packages/mobile-ui-vue/components/switch/src/designer/switch.design.component.tsx @@ -11,7 +11,7 @@ import { useInputGroupDesignerRules } from './use-designer-rules'; export default defineComponent({ name: 'FmSwitchDesign', inheritAttrs: false, - props: extractProperties(switchProps, ['activeColor', 'inactiveColor']), + props: extractProperties(switchProps, ['activeColor', 'inactiveColor', 'size']), setup(props, context) { const elementRef = ref(); const designerHostService = inject('designer-host-service'); diff --git a/packages/mobile-ui-vue/components/switch/src/schema/switch.schema.json b/packages/mobile-ui-vue/components/switch/src/schema/switch.schema.json index 4697e9c71d4..1dd3bf46812 100644 --- a/packages/mobile-ui-vue/components/switch/src/schema/switch.schema.json +++ b/packages/mobile-ui-vue/components/switch/src/schema/switch.schema.json @@ -58,6 +58,10 @@ "onUpdate:modelValue": { "description": "值更新事件", "type": "string" + }, + "size": { + "description": "尺寸", + "type": "string" } }, "events": [ diff --git a/packages/mobile-ui-vue/components/time-picker/index.ts b/packages/mobile-ui-vue/components/time-picker/index.ts index 62ab9fe9bda..95d3c5e2819 100644 --- a/packages/mobile-ui-vue/components/time-picker/index.ts +++ b/packages/mobile-ui-vue/components/time-picker/index.ts @@ -1,11 +1,18 @@ -import { withInstall } from '@farris/mobile-ui-vue/common'; +import { withInstall, withRegister, withRegisterDesigner } from '@farris/mobile-ui-vue/common'; import TimePickerInstallless from './src/time-picker.component'; +import TimePickerDesign from './src/designer/time-picker.design.component'; import TimePickerPanelInstallless from './src/time-picker-panel.component'; +import { propsResolverGenerator } from '../time-picker/src/time-picker.props'; export { TimePickerType } from './src/composition'; +const TIME_PICKER_REGISTERED_NAME = 'time-picker'; + const TimePickerPanel = withInstall(TimePickerPanelInstallless); const TimePicker = withInstall(TimePickerInstallless); +withRegister(TimePicker, { name: TIME_PICKER_REGISTERED_NAME, propsResolverGenerator }); +withRegisterDesigner(TimePicker, { name: TIME_PICKER_REGISTERED_NAME, propsResolverGenerator, designerComponent: TimePickerDesign }); + export { TimePicker, TimePickerPanel }; export default TimePicker; diff --git a/packages/mobile-ui-vue/components/time-picker/src/designer/time-picker.design.component.tsx b/packages/mobile-ui-vue/components/time-picker/src/designer/time-picker.design.component.tsx new file mode 100644 index 00000000000..98e3d1aee41 --- /dev/null +++ b/packages/mobile-ui-vue/components/time-picker/src/designer/time-picker.design.component.tsx @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, ref, SetupContext } from 'vue'; +import { + DesignerHostService, + DesignerItemContext, + extractProperties, + useDesignerComponent +} from '@farris/mobile-ui-vue/common'; +import { useTimePickerDesignerRules } from './use-designer-rules'; +import { timePickerProps } from '../time-picker.props'; +import InputGroup from '@farris/mobile-ui-vue/input-group'; + +export default defineComponent({ + name: 'FmTimePickerDesign', + inheritAttrs: false, + props: extractProperties(timePickerProps, ['placeholder']), + setup(props, context) { + const elementRef = ref(); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject( + 'design-item-context' + ) as DesignerItemContext; + const designerRulesComposition = useTimePickerDesignerRules( + designItemContext, + designerHostService + ); + const componentInstance = useDesignerComponent( + elementRef, + designItemContext, + designerRulesComposition + ); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + context.expose(componentInstance.value); + + const inputProps = computed(() => { + return { + ...props, + editable: false, + rightIcon: 's-arrow', + placeholder: props.placeholder || '请选择时间' + }; + }); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/time-picker/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/time-picker/src/designer/use-designer-rules.ts new file mode 100644 index 00000000000..adc7fa0b3ce --- /dev/null +++ b/packages/mobile-ui-vue/components/time-picker/src/designer/use-designer-rules.ts @@ -0,0 +1,15 @@ +import { ComponentSchema, DesignerComponentInstance, DesignerItemContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; +import { TimePickerProperty } from "../property-config/time-picker.property-config"; +export function useTimePickerDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { + + const schema = designItemContext.schema as ComponentSchema; + + // 构造属性配置方法 + function getPropsConfig(componentId: string, componentInstance: DesignerComponentInstance) { + const timePickerProps = new TimePickerProperty(componentId, designerHostService); + return timePickerProps.getPropertyConfig(schema, componentInstance); + } + + return { getPropsConfig } as UseDesignerRules; + +} diff --git a/packages/mobile-ui-vue/components/time-picker/src/property-config/time-picker.property-config.ts b/packages/mobile-ui-vue/components/time-picker/src/property-config/time-picker.property-config.ts new file mode 100644 index 00000000000..7cf6b9054e3 --- /dev/null +++ b/packages/mobile-ui-vue/components/time-picker/src/property-config/time-picker.property-config.ts @@ -0,0 +1,52 @@ +import { DesignerComponentInstance, InputBaseProperty } from '@farris/mobile-ui-vue/common'; + + +export class TimePickerProperty extends InputBaseProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + + public getPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance) { + super.getPropertyConfig(propertyData, componentInstance); + return this.propertyConfig; + } + + getEditorProperties(propertyData: any) { + const self = this; + const editorProperties = self.getComponentConfig( + propertyData, + {}, + { + format: { + description: "", + title: "格式", + type: "enum", + editor: { + type: "combo-list", + textField: "name", + valueField: "value", + data: [ + { value: "HH:mm:ss", name: "HH:mm:ss" }, + { value: "HH:mm", name: "HH:mm" } + ] + } + }, + maxTime: { + title: '最大时间', + type: 'string' + }, + minTime: { + title: '最小时间', + type: 'string' + } + }, + (changeObject) => { + if (!changeObject) { + return; + } + } + ); + + return editorProperties; + } +} diff --git a/packages/mobile-ui-vue/components/time-picker/src/schema/schema-mapper.ts b/packages/mobile-ui-vue/components/time-picker/src/schema/schema-mapper.ts new file mode 100644 index 00000000000..f7d510235fb --- /dev/null +++ b/packages/mobile-ui-vue/components/time-picker/src/schema/schema-mapper.ts @@ -0,0 +1,6 @@ +import { resolveAppearance, MapperFunction } from '../../../dynamic-resolver'; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance], + ['binding', 'modelValue'] +]); diff --git a/packages/mobile-ui-vue/components/time-picker/src/schema/schema-resolver.ts b/packages/mobile-ui-vue/components/time-picker/src/schema/schema-resolver.ts new file mode 100644 index 00000000000..b02bdf93eec --- /dev/null +++ b/packages/mobile-ui-vue/components/time-picker/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "../../../dynamic-resolver"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/mobile-ui-vue/components/time-picker/src/schema/time-picker.schema.json b/packages/mobile-ui-vue/components/time-picker/src/schema/time-picker.schema.json new file mode 100644 index 00000000000..0840c201692 --- /dev/null +++ b/packages/mobile-ui-vue/components/time-picker/src/schema/time-picker.schema.json @@ -0,0 +1,78 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://farris-design.gitee.io/time-picker.schema.json", + "title": "time-picker", + "description": "", + "type": "object", + "properties": { + "id": { + "description": "标识", + "type": "string" + }, + "type": { + "description": "控件类型", + "type": "string", + "default": "time-picker" + }, + "appearance": { + "description": "外观", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "binding": { + "description": "绑定", + "type": "object", + "default": {} + }, + "required": { + "description": "必填", + "type": "boolean", + "default": false + }, + "readonly": { + "description": "只读", + "type": "boolean", + "default": false + }, + "placeholder": { + "description": "提示文本", + "type": "string" + }, + "format": { + "description": "格式", + "type": "string" + }, + "maxTime": { + "description": "最大时间", + "type": "string" + }, + "minTime": { + "description": "最小时间", + "type": "string" + }, + "onUpdate:modelValue": { + "description": "值更新事件", + "type": "string", + "default": "" + } + }, + "events": [ + "onUpdate:modelValue" + ], + "required": [ + "type" + ], + "ignore": [ + "id", + "appearance", + "visible" + ] +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/time-picker/src/time-picker.props.ts b/packages/mobile-ui-vue/components/time-picker/src/time-picker.props.ts index 6fe0505ec07..96075299dd8 100644 --- a/packages/mobile-ui-vue/components/time-picker/src/time-picker.props.ts +++ b/packages/mobile-ui-vue/components/time-picker/src/time-picker.props.ts @@ -1,6 +1,10 @@ import { ExtractPropTypes } from 'vue'; import { buttonEditProps } from '@farris/mobile-ui-vue/button-edit'; import { timePickerPanelProps } from './time-picker-panel.props'; +import { getPropsResolverGenerator } from '@farris/mobile-ui-vue/dynamic-resolver'; +import timePickerSchema from './schema/time-picker.schema.json'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; export const TIME_PICKER_NAME = 'FmTimePicker'; @@ -14,3 +18,9 @@ export const timePickerProps = { }; export type TimePickerInputProps = ExtractPropTypes; +export const propsResolverGenerator = getPropsResolverGenerator( + timePickerProps, + timePickerSchema, + schemaMapper, + schemaResolver +); -- Gitee From 8f082e11ca3ac1a54b4e7e906d597a4a2a0edf58 Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 21 Aug 2025 13:38:29 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feature:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E8=AE=BE=E8=AE=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/app-providers.ts | 8 +- .../form-designer/form-designer.component.tsx | 5 +- .../use-mobile-control-creator.ts | 6 +- .../designer-context/use-designer-context.ts | 14 ++- .../use-mobile-designer-context.ts | 18 +-- .../use-mobile-nocode-designer-context.ts | 61 ++++++++++ .../form-metadata-nocode.service.ts | 49 +++++++- .../types/toolbox/mobile-nocode-toolbox.json | 109 ++++++++++++++++++ .../types/toolbox/mobile-toolbox.json | 4 +- packages/designer/src/main.ts | 2 +- .../src/designer/use-designer-rules.ts | 9 +- .../common/src/properties/dg-control.ts | 4 +- .../src/properties/schema-dom-mapping.ts | 1 + .../common/src/types/designer-rule.ts | 10 ++ .../content-container.design.component.tsx | 2 +- .../src/designer/use-designer-rules.ts | 10 +- .../form-item/src/form-item.props.ts | 4 +- .../property-config/lookup.property-config.ts | 30 ++--- .../navbar/src/designer/use-designer-rules.ts | 9 +- .../src/designer/use-designer-rules.ts | 9 +- .../src/designer/use-designer-rules.ts | 7 +- 21 files changed, 307 insertions(+), 64 deletions(-) create mode 100644 packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts create mode 100644 packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json diff --git a/packages/designer/src/app-providers.ts b/packages/designer/src/app-providers.ts index 45104700aad..401ee6aefc4 100644 --- a/packages/designer/src/app-providers.ts +++ b/packages/designer/src/app-providers.ts @@ -1,7 +1,7 @@ import { App } from "vue"; -import { FLoadingService, FTooltipDirective, FMessageBoxService, F_MODAL_SERVICE_TOKEN, FModalService, LookupSchemaRepositoryToken, FieldSelectorRepositoryToken, F_NOTIFY_SERVICE_TOKEN, FNotifyService, ControllerSchemaRepositorySymbol, FormSchemaRepositorySymbol } from "@farris/ui-vue/components"; -// import { LookupSchemaRepositoryToken as MobileLookupSchemaRepositoryToken, FieldSelectorRepositoryToken as MobileFieldSelectorRepositoryToken } from "@farris/mobile-ui-vue"; +import { FLoadingService, FTooltipDirective, FMessageBoxService, F_MODAL_SERVICE_TOKEN, FModalService, LookupSchemaRepositoryToken, FieldSelectorRepositoryToken, F_NOTIFY_SERVICE_TOKEN, FNotifyService, ControllerSchemaRepositorySymbol, FormSchemaRepositorySymbol } from "@farris/ui-vue/components"; +import { LookupSchemaRepositoryToken as MobileLookupSchemaRepositoryToken, FieldSelectorRepositoryToken as MobileFieldSelectorRepositoryToken } from "@farris/mobile-ui-vue"; import { MetadataService } from "./components/composition/metadata.service"; import { MetadataPathToken, MetadataServiceToken } from "./components/types"; import { LookupFieldSelectorService, LookupSchemaService } from "./components/composition/schema-repository"; @@ -28,8 +28,8 @@ export default { app.provide(LookupSchemaRepositoryToken, new LookupSchemaService(metadataService)); app.provide(FieldSelectorRepositoryToken, new LookupFieldSelectorService(metadataService)); - // app.provide(MobileLookupSchemaRepositoryToken, new LookupSchemaService(metadataService)); - // app.provide(MobileFieldSelectorRepositoryToken, new LookupFieldSelectorService(metadataService)); + app.provide(MobileLookupSchemaRepositoryToken, new LookupSchemaService(metadataService)); + app.provide(MobileFieldSelectorRepositoryToken, new LookupFieldSelectorService(metadataService)); app.provide(F_NOTIFY_SERVICE_TOKEN, new FNotifyService()); app.provide(ControllerSchemaRepositorySymbol, new ControllerSelectorSchemaService(metadataService,designerContext)); app.provide(FormSchemaRepositorySymbol, new FormSelectorSchemaService(metadataService)); diff --git a/packages/designer/src/components/components/form-designer/form-designer.component.tsx b/packages/designer/src/components/components/form-designer/form-designer.component.tsx index 00669c530e6..caa52ea6cc0 100644 --- a/packages/designer/src/components/components/form-designer/form-designer.component.tsx +++ b/packages/designer/src/components/components/form-designer/form-designer.component.tsx @@ -33,6 +33,7 @@ export default defineComponent({ const monacoEditorRef = ref(); const customClassEditorRef = ref(); const { toolboxItems, componentsToRegister, designerMode } = designerContext; + const terminal = designerMode.split('_')[0]; function onCanvasInitialized(dragula: any) { dragulaCompostion.value = dragula; } @@ -157,7 +158,7 @@ export default defineComponent({ propertyConfigSchemaMapForDesigner['Module'] = modulePropertyConfig; - const shouldRenderExternalComponentPanel = designerMode !== DesignerMode.PC_RTC; + const shouldRenderExternalComponentPanel = designerMode === DesignerMode.PC; function renderExternalComponentPanel() { return shouldRenderExternalComponentPanel && ( @@ -286,7 +287,7 @@ export default defineComponent({ componentId={componentId.value} onDragEnd={onCanvasDragEnd} components={componentsToRegister} - canvasMode={designerMode} + canvasMode={terminal} > {renderExternalComponentPanel()} type === formEditor.type)) { + if (fieldTypeInSchema === 'EnumType' || fieldTypeInSchema === 'StringType' && ['radio-group', 'check-group', 'picker'].find(type => type === formEditor.type)) { formEditor.data = field.type.enumValues || []; formEditor.idField = 'value'; formEditor.valueField = 'value'; @@ -67,6 +67,10 @@ export function useMobileControlCreator(): UseControlCreator { } } + if(formEditor.type === 'textarea'){ + formGroupMetadata.labelAlign = 'top' + } + return formGroupMetadata; } diff --git a/packages/designer/src/components/composition/designer-context/use-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-designer-context.ts index 5dac78fdd7b..6676636603a 100644 --- a/packages/designer/src/components/composition/designer-context/use-designer-context.ts +++ b/packages/designer/src/components/composition/designer-context/use-designer-context.ts @@ -3,6 +3,8 @@ import { useLocation } from "../use-location"; import { usePCDesignerContext } from "./use-pc-designer-context"; import { usePCRtcDesignerContext } from "./use-pc-rtc-designer-context"; import { usePCNocodeDesignerContext } from "./use-pc-nocode-designer-context"; +import { useMobileDesignerContext } from "./use-mobile-designer-context"; +import { useMobileNocodeDesignerContext } from "./use-mobile-nocode-designer-context"; /** * 设计器上下文 @@ -37,14 +39,18 @@ export function useDesignerContext(): UseDesignerContext { const designerMode = getDesignerMode(); switch (designerMode) { - case DesignerMode.PC: - case DesignerMode.Mobile: { + case DesignerMode.PC:{ return usePCDesignerContext(); } - case DesignerMode.PC_NoCode: - case DesignerMode.Mobile_NoCode: { + case DesignerMode.Mobile: { + return useMobileDesignerContext(); + } + case DesignerMode.PC_NoCode:{ return usePCNocodeDesignerContext(); } + case DesignerMode.Mobile_NoCode: { + return useMobileNocodeDesignerContext(); + } case DesignerMode.PC_RTC: { return usePCRtcDesignerContext(); } diff --git a/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts index 3643eee3c74..d66588496dd 100644 --- a/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts +++ b/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts @@ -2,11 +2,7 @@ import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; import ToolboxItems from '../../types/toolbox/mobile-toolbox.json'; import SupportedControllers from '../../composition/command/supported-controllers/mobile-supported-controller.json'; -import { - Component, PageContainer, PageHeaderContainer, PageBodyContainer, PageFooterContainer, Picker, NumberInput, Textarea, DatePicker, DateTimePicker, Lookup, - ContentContainer, Card, FloatContainer, Navbar, ListView, Form, FormItem, InputGroup, Button, registerDesignerComponents, Switch, CheckboxGroup, RadioGroup, - ButtonGroup, -} from '@farris/mobile-ui-vue'; +import { registerDesignerComponents, registerComponents, components, } from '@farris/mobile-ui-vue'; import { useMobileControlCreator } from "../control-creator/use-mobile-control-creator"; import { FormComponent, UseFormSchema } from "../../../components/types"; import ControllCategories from '../schema-repository/controller/mobile-categories'; @@ -23,14 +19,10 @@ export function useMobileDesignerContext(): UseDesignerContext { const toolboxItems: any[] = ToolboxItems; /** 要注册的UI组件 */ - const componentsToRegister: any[] = [ - Component, PageContainer, PageHeaderContainer, PageBodyContainer, PageFooterContainer, - ContentContainer, Card, FloatContainer, Textarea, DatePicker, DateTimePicker, Lookup, - Navbar, ListView, Picker, NumberInput, Switch, CheckboxGroup, RadioGroup, - Form, FormItem, InputGroup, - Button, ButtonGroup, - ]; - registerDesignerComponents(componentsToRegister); + const componentsToRegister: any[] = components; + registerDesignerComponents(); + registerComponents(); + /** 支持的控制器 */ const supportedControllers: any = SupportedControllers; diff --git a/packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts new file mode 100644 index 00000000000..b14cb2ff582 --- /dev/null +++ b/packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts @@ -0,0 +1,61 @@ +import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; +import ToolboxItems from '../../types/toolbox/mobile-nocode-toolbox.json'; +import SupportedControllers from '../command/supported-controllers/mobile-supported-controller.json'; + +import { registerDesignerComponents, registerComponents, components, } from '@farris/mobile-ui-vue'; +import { useMobileControlCreator } from "../control-creator/use-mobile-control-creator"; +import { FormComponent, UseFormSchema } from "../../types"; +import ControllCategories from '../schema-repository/controller/mobile-categories'; +import { useCommandBuilderService as useCommandBuilder } from "../command-builder.service"; +import { useNocodeFormMetadata } from "../form-metadata-nocode.service"; + +export function useMobileNocodeDesignerContext(): UseDesignerContext { + + /** 设计器模式 */ + const designerMode: DesignerMode = DesignerMode.Mobile_NoCode; + + /** 工具箱的数据 */ + const toolboxItems: any[] = ToolboxItems; + + /** 要注册的UI组件 */ + const componentsToRegister: any[] = components; + registerDesignerComponents(); + registerComponents(); + + /** 支持的控制器 */ + const supportedControllers: any = SupportedControllers; + + const controllCategories: any = ControllCategories; + + + /** 控件创建服务 */ + const useControlCreator = useMobileControlCreator; + + /** 表单元数据服务 */ + const useFormMetadataService = useNocodeFormMetadata; + + /** 表单构件元数据服务 */ + const useCommandBuilderService = useCommandBuilder; + + /** + * 获取所有的页面组件 + * @returns + */ + function getPageComponents(useFormSchema: UseFormSchema): FormComponent[] { + const predicateFunction = (component: any) => component.componentType && component.componentType.toLowerCase() === 'page'; + const pageComponents = useFormSchema.getComponetsByPredicate(predicateFunction); + return pageComponents; + } + + return { + designerMode, + toolboxItems, + componentsToRegister, + supportedControllers, + controllCategories, + useControlCreator, + getPageComponents, + useFormMetadataService, + useCommandBuilderService + }; +} diff --git a/packages/designer/src/components/composition/form-metadata-nocode.service.ts b/packages/designer/src/components/composition/form-metadata-nocode.service.ts index 85a685ee0d1..f180b07fb76 100644 --- a/packages/designer/src/components/composition/form-metadata-nocode.service.ts +++ b/packages/designer/src/components/composition/form-metadata-nocode.service.ts @@ -23,8 +23,47 @@ export function useNocodeFormMetadata(props: DesignerProps, useFormSchemaComposi }); } + function getMicroAppInfo() { + const appInfo = window.top && window.top['ncdp'] && window.top['ncdp']['applicationInfo']; + return appInfo || null; + } + function saveFormMetadata() { - return Promise.resolve(); + const currentFormSchema = useFormSchemaComposition.getFormSchema(); + const metadataDto = useFormSchemaComposition.getFormMetadataBasicInfo(); + const metadataContent = Object.assign({ + code: null, + name: null, + Id: metadataDto.id, + Contents: JSON.stringify(currentFormSchema) + }); + const content = { + ID: metadataDto.id, + NameSpace: metadataDto.nameSpace, + Code: metadataDto.code, + Name: metadataDto.name, + FileName: metadataDto.fileName, + RelativePath: metadataDto.relativePath, + Content: JSON.stringify(metadataContent), + Type: metadataDto.type, + BizobjectID: metadataDto.bizobjectID, + ExtendProperty: metadataDto.extendProperty, + Extendable: metadataDto.extendable, + Properties : metadataDto.properties + }; + // 处理schema变更 + const voChanges = { + "added": [], + "modified": {} + }; + const appId = getMicroAppInfo()?.id; + const request = { + appId, + metadata: content, + voChanges + }; + + return axios.put(`/api/dev/nocode/v1.0/micro-apps/formmetadatasave`, request); } function queryFormTemplateRule(formModule: FormMetaDataModule): Promise { @@ -32,6 +71,14 @@ export function useNocodeFormMetadata(props: DesignerProps, useFormSchemaComposi } function runForm(loadingService: any, messageBoxService: any) { + const loadingInstance = loadingService?.show({ message: '解析中,请稍候...' }); + const metadataId = useFormSchemaComposition.getFormMetadataBasicInfo()?.id; + const previewUrl = `${window.location.origin}/platform/common/web/renderer/index.html#/?metadataId=${metadataId}`; + const windowProxy = window.open(previewUrl); + if (!windowProxy) { + messageBoxService.error('预览失败,请调整浏览器安全设置后重试!'); + } + loadingInstance.value.close(); } function publishMenu(messageBoxService: any, notifyService: any) { diff --git a/packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json b/packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json new file mode 100644 index 00000000000..54bcfc1a191 --- /dev/null +++ b/packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json @@ -0,0 +1,109 @@ +[ + { + "type": "input", + "name": "输入类控件", + "items": [ + { + "id": "TextBox", + "type": "input-group", + "name": "文本框", + "category": "input", + "icon": "input-group" + }, + { + "id": "MultiTextBox", + "type": "textarea", + "name": "多行文本", + "category": "input", + "icon": "textarea" + }, + { + "id": "DateBox", + "type": "date-picker", + "name": "日期选择", + "category": "input", + "icon": "date-picker" + }, + { + "id": "EnumField", + "type": "picker", + "name": "选择器", + "category": "input", + "icon": "input-group" + }, + { + "id": "NumericBox", + "type": "number-spinner", + "name": "数值", + "category": "input", + "icon": "number-spinner" + }, + { + "id": "RadioGroup", + "type": "radio-group", + "name": "单选组", + "category": "input", + "icon": "radio-group" + }, + { + "id": "CheckBoxGroup", + "type": "check-group", + "name": "复选框组", + "category": "input", + "icon": "check-group" + }, + { + "id": "SwitchField", + "type": "switch", + "name": "开关", + "category": "input", + "icon": "switch" + }, + { + "id": "LookupEdit", + "type": "lookup", + "name": "帮助", + "category": "input" + }, + { + "id": "TimePicker", + "type": "time-picker", + "name": "时间选择", + "category": "input" + } + ] + }, + { + "type": "container", + "name": "容器类控件", + "items": [ + { + "id": "Form", + "type": "form", + "name": "字段卡片", + "category": "container", + "icon": "response-form" + }, + { + "id": "Card", + "type": "card", + "name": "卡片", + "category": "container", + "icon": "section" + } + ] + }, + { + "type": "display", + "name": "展示类控件", + "items": [ + { + "id": "ListView", + "type": "list-view", + "name": "列表", + "category": "display", + "icon": "list-view" + } + ] + } +] \ No newline at end of file diff --git a/packages/designer/src/components/types/toolbox/mobile-toolbox.json b/packages/designer/src/components/types/toolbox/mobile-toolbox.json index fdc942bfbc1..2399883f85f 100644 --- a/packages/designer/src/components/types/toolbox/mobile-toolbox.json +++ b/packages/designer/src/components/types/toolbox/mobile-toolbox.json @@ -46,7 +46,7 @@ }, { "id": "EnumField", - "type": "enum-field", + "type": "picker", "name": "选择器", "category": "input", "icon": "input-group" @@ -87,7 +87,7 @@ "items": [ { "id": "NavigationBar", - "type": "navigation-bar", + "type": "navbar", "name": "导航栏", "category": "navigation", "icon": "nav-tab" diff --git a/packages/designer/src/main.ts b/packages/designer/src/main.ts index d8990be5bb0..c1de26e78b4 100644 --- a/packages/designer/src/main.ts +++ b/packages/designer/src/main.ts @@ -1,5 +1,5 @@ import { createApp } from 'vue'; -import FLocale from '@farris/ui-vue/components/locale'; +import FLocale from '@farris/ui-vue/components'; import './style.css'; import App from './app.vue'; import Designer from './components/index'; diff --git a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts index da7c1b905f6..18c6d409a66 100644 --- a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts @@ -1,8 +1,9 @@ -import { DesignerItemContext } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, DesignerMode } from "@farris/mobile-ui-vue/common"; import { ButtonGroupProperty } from "../property-config/button-group.property-config"; import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; -export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { + const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { return false; @@ -20,11 +21,11 @@ export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemCo } function checkCanMoveComponent() { - return true; + return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; } function checkCanDeleteComponent() { - return true; + return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts b/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts index 6d2e60860a5..ce43c16dbe8 100644 --- a/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts +++ b/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts @@ -44,11 +44,11 @@ export const DgControl = { 'check-box': { type: 'check-box', name: '复选框', icon: 'CheckBox' }, - 'combo-list': { type: 'combo-list', name: '下拉列表', icon: 'EnumField' }, - 'form': { type: 'form', name: '卡片面板', icon: 'Form' }, 'navbar': { type: 'navbar', name: '导航栏', icon: 'NavBar' }, 'picker': { type: 'picker', name: '选择器', icon: 'EnumField' }, + + 'time-picker': { type: 'time-picker', name: '时间选择' } }; diff --git a/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts b/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts index c2fc3c7a24e..ec5a572ed99 100644 --- a/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts +++ b/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts @@ -16,6 +16,7 @@ export class SchemaDOMMapping { { key: DgControl['radio-group'].type, value: DgControl['radio-group'].name }, { key: DgControl['check-group'].type, value: DgControl['check-group'].name }, { key: DgControl['picker'].type, value: DgControl['picker'].name }, + { key: DgControl['time-picker'].type, value: DgControl['time-picker'].name }, ], Text: [ { key: DgControl['textarea'].type, value: DgControl['textarea'].name }, diff --git a/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts b/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts index 6375578d0fb..2638713dc81 100644 --- a/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts +++ b/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts @@ -148,3 +148,13 @@ export interface UseDesignerRules { /** 获取可拖拽的上层容器 */ getDraggableDesignItemElement?: (context: DesignerItemContext) => Ref | null; } + +/** 设计器模式 */ +export enum DesignerMode { + + /** 移动低代码设计器 */ + Mobile = 'Mobile', + + /** 移动端零代码设计器 */ + Mobile_NoCode = 'Mobile_NoCode', +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx index 2c387d1b976..a37991a5d6c 100644 --- a/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx @@ -14,7 +14,7 @@ export default defineComponent({ return contentContainerRef.value?.elementRef; }); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service') as DesignerHostService; const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRulesForContentContainer(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts index fedebf0e226..97cf6614db9 100644 --- a/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts @@ -1,8 +1,10 @@ -import { DesignerItemContext, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, DesignerMode, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { ContentContainerProperty } from "../property-config/content-container.property-config"; import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; -export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { + + const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); @@ -17,11 +19,11 @@ export function useDesignerRulesForContentContainer(designItemContext: DesignerI } function checkCanMoveComponent() { - return true; + return false; } function checkCanDeleteComponent() { - return true; + return false; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts index c46682de91a..4130b7ff692 100644 --- a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts +++ b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts @@ -37,7 +37,9 @@ export const formItemProps = { /** 错误信息位置 */ errorMessageAlign: { type: String as PropType, deafult: undefined }, - editor: { type: Object as PropType, default: {} } + editor: { type: Object as PropType, default: {} }, + customClass: { type: String, default: '' }, + customStyle: { type: String, defaut: '' } }; export type FormItemProps = ExtractPropTypes; diff --git a/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts b/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts index 5600972331d..c4b58e6fdd5 100644 --- a/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts +++ b/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts @@ -1,4 +1,4 @@ -import { InputBaseProperty } from '@farris/mobile-ui-vue/common'; +import { DesignerMode, InputBaseProperty } from '@farris/mobile-ui-vue/common'; import { lookupDataSourceConverter, lookupTextFieldConverter } from './converters/lookup-property.converter'; export const LookupSchemaRepositoryToken = Symbol('schema_repository_token'); @@ -37,18 +37,22 @@ export class LookupProperty extends InputBaseProperty { } return ''; }, - viewOptions: [ - { - id: 'recommend', title: '推荐', type: 'List', - dataSource: 'Recommand', - enableGroup: true, - groupField: 'category', - groupFormatter: (value, data) => { - return `${value === 'local' ? '本地元数据' : '最近使用'}`; - } - }, - { id: 'total', title: '全部', type: 'List', dataSource: 'Total' } - ], + viewOptions: this.formSchemaUtils.designerMode === DesignerMode.Mobile_NoCode ? + [ + { id: 'total', title: '全部', type: 'List', dataSource: 'Total' } + ] : + [ + { + id: 'recommend', title: '推荐', type: 'List', + dataSource: 'Recommand', + enableGroup: true, + groupField: 'category', + groupFormatter: (value, data) => { + return `${value === 'local' ? '本地元数据' : '最近使用'}`; + } + }, + { id: 'total', title: '全部', type: 'List', dataSource: 'Total' } + ], repositoryToken: LookupSchemaRepositoryToken, onSubmitModal: (dataSourceSchema: any) => { if (dataSourceSchema) { diff --git a/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts index c89b7e8e6ce..8314d4796d3 100644 --- a/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts @@ -1,8 +1,8 @@ -import { DesignerItemContext, UseDesignerRules, DraggingResolveContext } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, UseDesignerRules, DraggingResolveContext, DesignerHostService, DesignerMode } from "@farris/mobile-ui-vue/common"; import { ref } from "vue"; import { NavBarProperty } from "../property-config/navbar.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -11,17 +11,18 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const hideNestedPadding = true; const isInFixedContextRules = true; + const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { return false; } function checkCanMoveComponent() { - return true; + return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; } function checkCanDeleteComponent() { - return true; + return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts index 1c1772314e4..a8851aad4ab 100644 --- a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts @@ -1,10 +1,10 @@ import { nextTick, ref } from "vue"; import { PAGE_BODY_CONTAINER_NAME } from '../page-body-container.props'; -import { DesignerHostService, DraggingResolveContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerMode, DraggingResolveContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DesignerItemContext } from "@farris/mobile-ui-vue/common"; import { PageBodyContainerProperty } from "../property-config/page-body-container.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -13,6 +13,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const hideNestedPadding = true; const isInFixedContextRules = true; + const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { const unAcceptableControlTypes = [ @@ -37,10 +38,10 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe function checkCanMoveComponent() { - return !isInFixedContextRules; + return false; } function checkCanDeleteComponent() { - return !isInFixedContextRules; + return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts index 4b4c4093eb5..f356c6931bd 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts @@ -1,16 +1,17 @@ import { ref } from "vue"; import { PAGE_FOOTER_CONTAINER_NAME } from '../page-footer-container.props'; -import { DesignerHostService, DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerItemContext, DesignerMode, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { PageFooterContainerProperty } from "../property-config/page-footer-container.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); const triggerBelongedComponentToDeleteWhenDeleted = ref(false); const hideNestedPadding = true; + const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { const acceptableControlTypes = [ @@ -35,7 +36,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe } function checkCanDeleteComponent() { - return true; + return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; } function hideNestedPaddingInDesginerView() { -- Gitee From 0bb685cf1b84e5c581d1fffbbeaf7f11473c9e08 Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 21 Aug 2025 13:41:18 +0800 Subject: [PATCH 09/10] =?UTF-8?q?Revert=20"feature:=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E7=A7=BB=E5=8A=A8=E8=AE=BE=E8=AE=A1=E5=99=A8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 8f082e11ca3ac1a54b4e7e906d597a4a2a0edf58. --- packages/designer/src/app-providers.ts | 8 +- .../form-designer/form-designer.component.tsx | 5 +- .../use-mobile-control-creator.ts | 6 +- .../designer-context/use-designer-context.ts | 14 +-- .../use-mobile-designer-context.ts | 18 ++- .../use-mobile-nocode-designer-context.ts | 61 ---------- .../form-metadata-nocode.service.ts | 49 +------- .../types/toolbox/mobile-nocode-toolbox.json | 109 ------------------ .../types/toolbox/mobile-toolbox.json | 4 +- packages/designer/src/main.ts | 2 +- .../src/designer/use-designer-rules.ts | 9 +- .../common/src/properties/dg-control.ts | 4 +- .../src/properties/schema-dom-mapping.ts | 1 - .../common/src/types/designer-rule.ts | 10 -- .../content-container.design.component.tsx | 2 +- .../src/designer/use-designer-rules.ts | 10 +- .../form-item/src/form-item.props.ts | 4 +- .../property-config/lookup.property-config.ts | 30 +++-- .../navbar/src/designer/use-designer-rules.ts | 9 +- .../src/designer/use-designer-rules.ts | 9 +- .../src/designer/use-designer-rules.ts | 7 +- 21 files changed, 64 insertions(+), 307 deletions(-) delete mode 100644 packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts delete mode 100644 packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json diff --git a/packages/designer/src/app-providers.ts b/packages/designer/src/app-providers.ts index 401ee6aefc4..45104700aad 100644 --- a/packages/designer/src/app-providers.ts +++ b/packages/designer/src/app-providers.ts @@ -1,7 +1,7 @@ import { App } from "vue"; -import { FLoadingService, FTooltipDirective, FMessageBoxService, F_MODAL_SERVICE_TOKEN, FModalService, LookupSchemaRepositoryToken, FieldSelectorRepositoryToken, F_NOTIFY_SERVICE_TOKEN, FNotifyService, ControllerSchemaRepositorySymbol, FormSchemaRepositorySymbol } from "@farris/ui-vue/components"; -import { LookupSchemaRepositoryToken as MobileLookupSchemaRepositoryToken, FieldSelectorRepositoryToken as MobileFieldSelectorRepositoryToken } from "@farris/mobile-ui-vue"; +import { FLoadingService, FTooltipDirective, FMessageBoxService, F_MODAL_SERVICE_TOKEN, FModalService, LookupSchemaRepositoryToken, FieldSelectorRepositoryToken, F_NOTIFY_SERVICE_TOKEN, FNotifyService, ControllerSchemaRepositorySymbol, FormSchemaRepositorySymbol } from "@farris/ui-vue/components"; +// import { LookupSchemaRepositoryToken as MobileLookupSchemaRepositoryToken, FieldSelectorRepositoryToken as MobileFieldSelectorRepositoryToken } from "@farris/mobile-ui-vue"; import { MetadataService } from "./components/composition/metadata.service"; import { MetadataPathToken, MetadataServiceToken } from "./components/types"; import { LookupFieldSelectorService, LookupSchemaService } from "./components/composition/schema-repository"; @@ -28,8 +28,8 @@ export default { app.provide(LookupSchemaRepositoryToken, new LookupSchemaService(metadataService)); app.provide(FieldSelectorRepositoryToken, new LookupFieldSelectorService(metadataService)); - app.provide(MobileLookupSchemaRepositoryToken, new LookupSchemaService(metadataService)); - app.provide(MobileFieldSelectorRepositoryToken, new LookupFieldSelectorService(metadataService)); + // app.provide(MobileLookupSchemaRepositoryToken, new LookupSchemaService(metadataService)); + // app.provide(MobileFieldSelectorRepositoryToken, new LookupFieldSelectorService(metadataService)); app.provide(F_NOTIFY_SERVICE_TOKEN, new FNotifyService()); app.provide(ControllerSchemaRepositorySymbol, new ControllerSelectorSchemaService(metadataService,designerContext)); app.provide(FormSchemaRepositorySymbol, new FormSelectorSchemaService(metadataService)); diff --git a/packages/designer/src/components/components/form-designer/form-designer.component.tsx b/packages/designer/src/components/components/form-designer/form-designer.component.tsx index caa52ea6cc0..00669c530e6 100644 --- a/packages/designer/src/components/components/form-designer/form-designer.component.tsx +++ b/packages/designer/src/components/components/form-designer/form-designer.component.tsx @@ -33,7 +33,6 @@ export default defineComponent({ const monacoEditorRef = ref(); const customClassEditorRef = ref(); const { toolboxItems, componentsToRegister, designerMode } = designerContext; - const terminal = designerMode.split('_')[0]; function onCanvasInitialized(dragula: any) { dragulaCompostion.value = dragula; } @@ -158,7 +157,7 @@ export default defineComponent({ propertyConfigSchemaMapForDesigner['Module'] = modulePropertyConfig; - const shouldRenderExternalComponentPanel = designerMode === DesignerMode.PC; + const shouldRenderExternalComponentPanel = designerMode !== DesignerMode.PC_RTC; function renderExternalComponentPanel() { return shouldRenderExternalComponentPanel && ( @@ -287,7 +286,7 @@ export default defineComponent({ componentId={componentId.value} onDragEnd={onCanvasDragEnd} components={componentsToRegister} - canvasMode={terminal} + canvasMode={designerMode} > {renderExternalComponentPanel()} type === formEditor.type)) { + if (fieldTypeInSchema === 'EnumType' || fieldTypeInSchema === 'StringType' && ['radio-group', 'check-group', 'combo-list'].find(type => type === formEditor.type)) { formEditor.data = field.type.enumValues || []; formEditor.idField = 'value'; formEditor.valueField = 'value'; @@ -67,10 +67,6 @@ export function useMobileControlCreator(): UseControlCreator { } } - if(formEditor.type === 'textarea'){ - formGroupMetadata.labelAlign = 'top' - } - return formGroupMetadata; } diff --git a/packages/designer/src/components/composition/designer-context/use-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-designer-context.ts index 6676636603a..5dac78fdd7b 100644 --- a/packages/designer/src/components/composition/designer-context/use-designer-context.ts +++ b/packages/designer/src/components/composition/designer-context/use-designer-context.ts @@ -3,8 +3,6 @@ import { useLocation } from "../use-location"; import { usePCDesignerContext } from "./use-pc-designer-context"; import { usePCRtcDesignerContext } from "./use-pc-rtc-designer-context"; import { usePCNocodeDesignerContext } from "./use-pc-nocode-designer-context"; -import { useMobileDesignerContext } from "./use-mobile-designer-context"; -import { useMobileNocodeDesignerContext } from "./use-mobile-nocode-designer-context"; /** * 设计器上下文 @@ -39,17 +37,13 @@ export function useDesignerContext(): UseDesignerContext { const designerMode = getDesignerMode(); switch (designerMode) { - case DesignerMode.PC:{ - return usePCDesignerContext(); - } + case DesignerMode.PC: case DesignerMode.Mobile: { - return useMobileDesignerContext(); - } - case DesignerMode.PC_NoCode:{ - return usePCNocodeDesignerContext(); + return usePCDesignerContext(); } + case DesignerMode.PC_NoCode: case DesignerMode.Mobile_NoCode: { - return useMobileNocodeDesignerContext(); + return usePCNocodeDesignerContext(); } case DesignerMode.PC_RTC: { return usePCRtcDesignerContext(); diff --git a/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts index d66588496dd..3643eee3c74 100644 --- a/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts +++ b/packages/designer/src/components/composition/designer-context/use-mobile-designer-context.ts @@ -2,7 +2,11 @@ import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; import ToolboxItems from '../../types/toolbox/mobile-toolbox.json'; import SupportedControllers from '../../composition/command/supported-controllers/mobile-supported-controller.json'; -import { registerDesignerComponents, registerComponents, components, } from '@farris/mobile-ui-vue'; +import { + Component, PageContainer, PageHeaderContainer, PageBodyContainer, PageFooterContainer, Picker, NumberInput, Textarea, DatePicker, DateTimePicker, Lookup, + ContentContainer, Card, FloatContainer, Navbar, ListView, Form, FormItem, InputGroup, Button, registerDesignerComponents, Switch, CheckboxGroup, RadioGroup, + ButtonGroup, +} from '@farris/mobile-ui-vue'; import { useMobileControlCreator } from "../control-creator/use-mobile-control-creator"; import { FormComponent, UseFormSchema } from "../../../components/types"; import ControllCategories from '../schema-repository/controller/mobile-categories'; @@ -19,10 +23,14 @@ export function useMobileDesignerContext(): UseDesignerContext { const toolboxItems: any[] = ToolboxItems; /** 要注册的UI组件 */ - const componentsToRegister: any[] = components; - registerDesignerComponents(); - registerComponents(); - + const componentsToRegister: any[] = [ + Component, PageContainer, PageHeaderContainer, PageBodyContainer, PageFooterContainer, + ContentContainer, Card, FloatContainer, Textarea, DatePicker, DateTimePicker, Lookup, + Navbar, ListView, Picker, NumberInput, Switch, CheckboxGroup, RadioGroup, + Form, FormItem, InputGroup, + Button, ButtonGroup, + ]; + registerDesignerComponents(componentsToRegister); /** 支持的控制器 */ const supportedControllers: any = SupportedControllers; diff --git a/packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts deleted file mode 100644 index b14cb2ff582..00000000000 --- a/packages/designer/src/components/composition/designer-context/use-mobile-nocode-designer-context.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; -import ToolboxItems from '../../types/toolbox/mobile-nocode-toolbox.json'; -import SupportedControllers from '../command/supported-controllers/mobile-supported-controller.json'; - -import { registerDesignerComponents, registerComponents, components, } from '@farris/mobile-ui-vue'; -import { useMobileControlCreator } from "../control-creator/use-mobile-control-creator"; -import { FormComponent, UseFormSchema } from "../../types"; -import ControllCategories from '../schema-repository/controller/mobile-categories'; -import { useCommandBuilderService as useCommandBuilder } from "../command-builder.service"; -import { useNocodeFormMetadata } from "../form-metadata-nocode.service"; - -export function useMobileNocodeDesignerContext(): UseDesignerContext { - - /** 设计器模式 */ - const designerMode: DesignerMode = DesignerMode.Mobile_NoCode; - - /** 工具箱的数据 */ - const toolboxItems: any[] = ToolboxItems; - - /** 要注册的UI组件 */ - const componentsToRegister: any[] = components; - registerDesignerComponents(); - registerComponents(); - - /** 支持的控制器 */ - const supportedControllers: any = SupportedControllers; - - const controllCategories: any = ControllCategories; - - - /** 控件创建服务 */ - const useControlCreator = useMobileControlCreator; - - /** 表单元数据服务 */ - const useFormMetadataService = useNocodeFormMetadata; - - /** 表单构件元数据服务 */ - const useCommandBuilderService = useCommandBuilder; - - /** - * 获取所有的页面组件 - * @returns - */ - function getPageComponents(useFormSchema: UseFormSchema): FormComponent[] { - const predicateFunction = (component: any) => component.componentType && component.componentType.toLowerCase() === 'page'; - const pageComponents = useFormSchema.getComponetsByPredicate(predicateFunction); - return pageComponents; - } - - return { - designerMode, - toolboxItems, - componentsToRegister, - supportedControllers, - controllCategories, - useControlCreator, - getPageComponents, - useFormMetadataService, - useCommandBuilderService - }; -} diff --git a/packages/designer/src/components/composition/form-metadata-nocode.service.ts b/packages/designer/src/components/composition/form-metadata-nocode.service.ts index f180b07fb76..85a685ee0d1 100644 --- a/packages/designer/src/components/composition/form-metadata-nocode.service.ts +++ b/packages/designer/src/components/composition/form-metadata-nocode.service.ts @@ -23,47 +23,8 @@ export function useNocodeFormMetadata(props: DesignerProps, useFormSchemaComposi }); } - function getMicroAppInfo() { - const appInfo = window.top && window.top['ncdp'] && window.top['ncdp']['applicationInfo']; - return appInfo || null; - } - function saveFormMetadata() { - const currentFormSchema = useFormSchemaComposition.getFormSchema(); - const metadataDto = useFormSchemaComposition.getFormMetadataBasicInfo(); - const metadataContent = Object.assign({ - code: null, - name: null, - Id: metadataDto.id, - Contents: JSON.stringify(currentFormSchema) - }); - const content = { - ID: metadataDto.id, - NameSpace: metadataDto.nameSpace, - Code: metadataDto.code, - Name: metadataDto.name, - FileName: metadataDto.fileName, - RelativePath: metadataDto.relativePath, - Content: JSON.stringify(metadataContent), - Type: metadataDto.type, - BizobjectID: metadataDto.bizobjectID, - ExtendProperty: metadataDto.extendProperty, - Extendable: metadataDto.extendable, - Properties : metadataDto.properties - }; - // 处理schema变更 - const voChanges = { - "added": [], - "modified": {} - }; - const appId = getMicroAppInfo()?.id; - const request = { - appId, - metadata: content, - voChanges - }; - - return axios.put(`/api/dev/nocode/v1.0/micro-apps/formmetadatasave`, request); + return Promise.resolve(); } function queryFormTemplateRule(formModule: FormMetaDataModule): Promise { @@ -71,14 +32,6 @@ export function useNocodeFormMetadata(props: DesignerProps, useFormSchemaComposi } function runForm(loadingService: any, messageBoxService: any) { - const loadingInstance = loadingService?.show({ message: '解析中,请稍候...' }); - const metadataId = useFormSchemaComposition.getFormMetadataBasicInfo()?.id; - const previewUrl = `${window.location.origin}/platform/common/web/renderer/index.html#/?metadataId=${metadataId}`; - const windowProxy = window.open(previewUrl); - if (!windowProxy) { - messageBoxService.error('预览失败,请调整浏览器安全设置后重试!'); - } - loadingInstance.value.close(); } function publishMenu(messageBoxService: any, notifyService: any) { diff --git a/packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json b/packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json deleted file mode 100644 index 54bcfc1a191..00000000000 --- a/packages/designer/src/components/types/toolbox/mobile-nocode-toolbox.json +++ /dev/null @@ -1,109 +0,0 @@ -[ - { - "type": "input", - "name": "输入类控件", - "items": [ - { - "id": "TextBox", - "type": "input-group", - "name": "文本框", - "category": "input", - "icon": "input-group" - }, - { - "id": "MultiTextBox", - "type": "textarea", - "name": "多行文本", - "category": "input", - "icon": "textarea" - }, - { - "id": "DateBox", - "type": "date-picker", - "name": "日期选择", - "category": "input", - "icon": "date-picker" - }, - { - "id": "EnumField", - "type": "picker", - "name": "选择器", - "category": "input", - "icon": "input-group" - }, - { - "id": "NumericBox", - "type": "number-spinner", - "name": "数值", - "category": "input", - "icon": "number-spinner" - }, - { - "id": "RadioGroup", - "type": "radio-group", - "name": "单选组", - "category": "input", - "icon": "radio-group" - }, - { - "id": "CheckBoxGroup", - "type": "check-group", - "name": "复选框组", - "category": "input", - "icon": "check-group" - }, - { - "id": "SwitchField", - "type": "switch", - "name": "开关", - "category": "input", - "icon": "switch" - }, - { - "id": "LookupEdit", - "type": "lookup", - "name": "帮助", - "category": "input" - }, - { - "id": "TimePicker", - "type": "time-picker", - "name": "时间选择", - "category": "input" - } - ] - }, - { - "type": "container", - "name": "容器类控件", - "items": [ - { - "id": "Form", - "type": "form", - "name": "字段卡片", - "category": "container", - "icon": "response-form" - }, - { - "id": "Card", - "type": "card", - "name": "卡片", - "category": "container", - "icon": "section" - } - ] - }, - { - "type": "display", - "name": "展示类控件", - "items": [ - { - "id": "ListView", - "type": "list-view", - "name": "列表", - "category": "display", - "icon": "list-view" - } - ] - } -] \ No newline at end of file diff --git a/packages/designer/src/components/types/toolbox/mobile-toolbox.json b/packages/designer/src/components/types/toolbox/mobile-toolbox.json index 2399883f85f..fdc942bfbc1 100644 --- a/packages/designer/src/components/types/toolbox/mobile-toolbox.json +++ b/packages/designer/src/components/types/toolbox/mobile-toolbox.json @@ -46,7 +46,7 @@ }, { "id": "EnumField", - "type": "picker", + "type": "enum-field", "name": "选择器", "category": "input", "icon": "input-group" @@ -87,7 +87,7 @@ "items": [ { "id": "NavigationBar", - "type": "navbar", + "type": "navigation-bar", "name": "导航栏", "category": "navigation", "icon": "nav-tab" diff --git a/packages/designer/src/main.ts b/packages/designer/src/main.ts index c1de26e78b4..d8990be5bb0 100644 --- a/packages/designer/src/main.ts +++ b/packages/designer/src/main.ts @@ -1,5 +1,5 @@ import { createApp } from 'vue'; -import FLocale from '@farris/ui-vue/components'; +import FLocale from '@farris/ui-vue/components/locale'; import './style.css'; import App from './app.vue'; import Designer from './components/index'; diff --git a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts index 18c6d409a66..da7c1b905f6 100644 --- a/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/button-group/src/designer/use-designer-rules.ts @@ -1,9 +1,8 @@ -import { DesignerItemContext, DesignerMode } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext } from "@farris/mobile-ui-vue/common"; import { ButtonGroupProperty } from "../property-config/button-group.property-config"; import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; -export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { - const { formSchemaUtils } = designerHostService; +export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { function canAccepts(draggingContext: DraggingResolveContext): boolean { return false; @@ -21,11 +20,11 @@ export function useDesignerRulesForButtonGroup(designItemContext: DesignerItemCo } function checkCanMoveComponent() { - return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; + return true; } function checkCanDeleteComponent() { - return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; + return true; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts b/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts index ce43c16dbe8..6d2e60860a5 100644 --- a/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts +++ b/packages/mobile-ui-vue/components/common/src/properties/dg-control.ts @@ -44,11 +44,11 @@ export const DgControl = { 'check-box': { type: 'check-box', name: '复选框', icon: 'CheckBox' }, + 'combo-list': { type: 'combo-list', name: '下拉列表', icon: 'EnumField' }, + 'form': { type: 'form', name: '卡片面板', icon: 'Form' }, 'navbar': { type: 'navbar', name: '导航栏', icon: 'NavBar' }, 'picker': { type: 'picker', name: '选择器', icon: 'EnumField' }, - - 'time-picker': { type: 'time-picker', name: '时间选择' } }; diff --git a/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts b/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts index ec5a572ed99..c2fc3c7a24e 100644 --- a/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts +++ b/packages/mobile-ui-vue/components/common/src/properties/schema-dom-mapping.ts @@ -16,7 +16,6 @@ export class SchemaDOMMapping { { key: DgControl['radio-group'].type, value: DgControl['radio-group'].name }, { key: DgControl['check-group'].type, value: DgControl['check-group'].name }, { key: DgControl['picker'].type, value: DgControl['picker'].name }, - { key: DgControl['time-picker'].type, value: DgControl['time-picker'].name }, ], Text: [ { key: DgControl['textarea'].type, value: DgControl['textarea'].name }, diff --git a/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts b/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts index 2638713dc81..6375578d0fb 100644 --- a/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts +++ b/packages/mobile-ui-vue/components/common/src/types/designer-rule.ts @@ -148,13 +148,3 @@ export interface UseDesignerRules { /** 获取可拖拽的上层容器 */ getDraggableDesignItemElement?: (context: DesignerItemContext) => Ref | null; } - -/** 设计器模式 */ -export enum DesignerMode { - - /** 移动低代码设计器 */ - Mobile = 'Mobile', - - /** 移动端零代码设计器 */ - Mobile_NoCode = 'Mobile_NoCode', -} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx index a37991a5d6c..2c387d1b976 100644 --- a/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx @@ -14,7 +14,7 @@ export default defineComponent({ return contentContainerRef.value?.elementRef; }); - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRulesForContentContainer(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts index 97cf6614db9..fedebf0e226 100644 --- a/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts @@ -1,10 +1,8 @@ -import { DesignerItemContext, DesignerMode, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { ContentContainerProperty } from "../property-config/content-container.property-config"; import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@farris/mobile-ui-vue/common"; -export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { - - const { formSchemaUtils } = designerHostService; +export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { function canAccepts(draggingContext: DraggingResolveContext): boolean { const basalRule = useDragulaCommonRule().basalDragulaRuleForContainer(draggingContext, designerHostService); @@ -19,11 +17,11 @@ export function useDesignerRulesForContentContainer(designItemContext: DesignerI } function checkCanMoveComponent() { - return false; + return true; } function checkCanDeleteComponent() { - return false; + return true; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts index 4130b7ff692..c46682de91a 100644 --- a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts +++ b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts @@ -37,9 +37,7 @@ export const formItemProps = { /** 错误信息位置 */ errorMessageAlign: { type: String as PropType, deafult: undefined }, - editor: { type: Object as PropType, default: {} }, - customClass: { type: String, default: '' }, - customStyle: { type: String, defaut: '' } + editor: { type: Object as PropType, default: {} } }; export type FormItemProps = ExtractPropTypes; diff --git a/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts b/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts index c4b58e6fdd5..5600972331d 100644 --- a/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts +++ b/packages/mobile-ui-vue/components/lookup/src/property-config/lookup.property-config.ts @@ -1,4 +1,4 @@ -import { DesignerMode, InputBaseProperty } from '@farris/mobile-ui-vue/common'; +import { InputBaseProperty } from '@farris/mobile-ui-vue/common'; import { lookupDataSourceConverter, lookupTextFieldConverter } from './converters/lookup-property.converter'; export const LookupSchemaRepositoryToken = Symbol('schema_repository_token'); @@ -37,22 +37,18 @@ export class LookupProperty extends InputBaseProperty { } return ''; }, - viewOptions: this.formSchemaUtils.designerMode === DesignerMode.Mobile_NoCode ? - [ - { id: 'total', title: '全部', type: 'List', dataSource: 'Total' } - ] : - [ - { - id: 'recommend', title: '推荐', type: 'List', - dataSource: 'Recommand', - enableGroup: true, - groupField: 'category', - groupFormatter: (value, data) => { - return `${value === 'local' ? '本地元数据' : '最近使用'}`; - } - }, - { id: 'total', title: '全部', type: 'List', dataSource: 'Total' } - ], + viewOptions: [ + { + id: 'recommend', title: '推荐', type: 'List', + dataSource: 'Recommand', + enableGroup: true, + groupField: 'category', + groupFormatter: (value, data) => { + return `${value === 'local' ? '本地元数据' : '最近使用'}`; + } + }, + { id: 'total', title: '全部', type: 'List', dataSource: 'Total' } + ], repositoryToken: LookupSchemaRepositoryToken, onSubmitModal: (dataSourceSchema: any) => { if (dataSourceSchema) { diff --git a/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts index 8314d4796d3..c89b7e8e6ce 100644 --- a/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts @@ -1,8 +1,8 @@ -import { DesignerItemContext, UseDesignerRules, DraggingResolveContext, DesignerHostService, DesignerMode } from "@farris/mobile-ui-vue/common"; +import { DesignerItemContext, UseDesignerRules, DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { ref } from "vue"; import { NavBarProperty } from "../property-config/navbar.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -11,18 +11,17 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const hideNestedPadding = true; const isInFixedContextRules = true; - const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { return false; } function checkCanMoveComponent() { - return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; + return true; } function checkCanDeleteComponent() { - return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; + return true; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts index a8851aad4ab..1c1772314e4 100644 --- a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts @@ -1,10 +1,10 @@ import { nextTick, ref } from "vue"; import { PAGE_BODY_CONTAINER_NAME } from '../page-body-container.props'; -import { DesignerHostService, DesignerMode, DraggingResolveContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DraggingResolveContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DesignerItemContext } from "@farris/mobile-ui-vue/common"; import { PageBodyContainerProperty } from "../property-config/page-body-container.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -13,7 +13,6 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe const hideNestedPadding = true; const isInFixedContextRules = true; - const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { const unAcceptableControlTypes = [ @@ -38,10 +37,10 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe function checkCanMoveComponent() { - return false; + return !isInFixedContextRules; } function checkCanDeleteComponent() { - return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; + return !isInFixedContextRules; } function hideNestedPaddingInDesginerView() { diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts index f356c6931bd..4b4c4093eb5 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts @@ -1,17 +1,16 @@ import { ref } from "vue"; import { PAGE_FOOTER_CONTAINER_NAME } from '../page-footer-container.props'; -import { DesignerHostService, DesignerItemContext, DesignerMode, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { PageFooterContainerProperty } from "../property-config/page-footer-container.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); const triggerBelongedComponentToDeleteWhenDeleted = ref(false); const hideNestedPadding = true; - const { formSchemaUtils } = designerHostService; function canAccepts(draggingContext: DraggingResolveContext): boolean { const acceptableControlTypes = [ @@ -36,7 +35,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe } function checkCanDeleteComponent() { - return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; + return true; } function hideNestedPaddingInDesginerView() { -- Gitee From aff2fc66259a98d6138d7fd7f7805713ffd9f30a Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Thu, 21 Aug 2025 13:59:41 +0800 Subject: [PATCH 10/10] =?UTF-8?q?chore:=20=E8=BF=98=E5=8E=9F=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../page-header-container/src/designer/use-designer-rules.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts index 923eb2dbee9..89e42ddd5a0 100644 --- a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts @@ -1,6 +1,6 @@ import { ref } from "vue"; import { PAGE_HEADER_CONTAINER_NAME } from '../page-header-container.props'; -import { DesignerHostService, DesignerItemContext, DesignerMode, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; +import { DesignerHostService, DesignerItemContext, UseDesignerRules, useDragulaCommonRule } from "@farris/mobile-ui-vue/common"; import { DraggingResolveContext } from "@farris/mobile-ui-vue/common"; import { PageHeaderContainerProperty } from "../property-config/page-header-container.property-config"; @@ -39,7 +39,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe } function checkCanDeleteComponent() { - return formSchemaUtils.designerMode !== DesignerMode.Mobile_NoCode; + return true; } function hideNestedPaddingInDesginerView() { -- Gitee