diff --git a/.ls-lint.yml b/.ls-lint.yml index ac8a63998db51b447e9463922f967cf38cd8b4ec..cdadb461e18eec3714b869f172ccff1fa3aedd12 100644 --- a/.ls-lint.yml +++ b/.ls-lint.yml @@ -68,6 +68,7 @@ ignore: - packages/designer/dist - packages/designer/projects - packages/designer/public/assets/monaco-editor + - packages/designer/public/platform # renderer - packages/renderer/.vscode - packages/renderer/docs/.vitepress diff --git a/eslint.config.mjs b/eslint.config.mjs index fa5cb4a940f8ac50935770355ead4bb298518353..82100d6b65b8f102a18a8151e445a6d28aed34ce 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -21,6 +21,7 @@ export default [ "packages/**/lib/*", "packages/**/dist-rollup/*", "packages/**/package/*", + "packages/**/public/*", "packages/ui-vue/docs/*", "packages/ui-vue/demos/*", "packages/charts-vue/docs/*", diff --git a/packages/designer/package.json b/packages/designer/package.json index 12679748b463e80ed73d50df83f82320f6ceadfd..55b1cc00c2493b2c3fea119e6fa7f70f99179448 100644 --- a/packages/designer/package.json +++ b/packages/designer/package.json @@ -4,6 +4,7 @@ "type": "module", "scripts": { "dev": "vite --config ./vite.config.dev.ts", + "check": "vue-tsc --noEmit", "build": "vue-tsc --noEmit && vite build --config ./vite.config.dev.ts", "preview": "vite preview --config ./vite.config.dev.ts", "build:system": "farris-cli build -c ./farris.config.mjs" diff --git a/packages/designer/public/api/dev/main/v1.0/mdservice/SagiDemo/SagiDemeModule/CommonDictionaries/bo-commondictionaries-front/metadata/components/webcmd.json b/packages/designer/public/api/dev/main/v1.0/mdservice/SagiDemo/SagiDemeModule/CommonDictionaries/bo-commondictionaries-front/metadata/components/webcmd.json new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/designer/public/assets/config-default.json b/packages/designer/public/assets/config-default.json new file mode 100644 index 0000000000000000000000000000000000000000..decfb3ab957de218a092e0cf23aac7e530504ca8 --- /dev/null +++ b/packages/designer/public/assets/config-default.json @@ -0,0 +1,16 @@ +{ + "apiResource": "local", + "canvasPattern": "designer-canvas", + "uriPattern": "restful", + "metadataBaseUri": "/api/dev/main/v1.0/metadatas", + "metadataDevBaseUri": "/api/dev/main/v1.0/mdservice", + "createSchemaUri": "/api/dev/main/v1.0/designschema/create", + "createSourceCodeUri": "/api/dev/main/v1.0/tsfile/create", + "localMetadataUri": "/designer-canvas/empty1.json", + "templateRulesOfCommon": "assets/template-rules/common.json", + "templateRulesBaseUri": "assets/template-rules", + "publishStatusSocketUri": "/api/dev/main/v1.0/lcm-log/ws", + "publishApplicationUri": "/api/dev/main/v1.0/repo-packages/publish", + "deployApplicationUri": "/api/dev/main/v1.0/frontend-project/runvueform", + "lookupConfigUri": "/api/dev/main/v1.0/bff/handleHelpConfigFilterSort" +} \ No newline at end of file diff --git a/packages/designer/public/designer-canvas/empty.json b/packages/designer/public/designer-canvas/empty.json new file mode 100644 index 0000000000000000000000000000000000000000..308a6d15eb46792a5e6c17345a74dbab34a1e7ca --- /dev/null +++ b/packages/designer/public/designer-canvas/empty.json @@ -0,0 +1,75 @@ +{ + "header": { + "code": "empty-template", + "type": "Form", + "nameSpace": "Inspur.GS.SagiDemo.SagiDemeModule.Templates.EmptyTemplate", + "certId": null, + "name": "页面模板", + "fileName": "EmptyTemplate.frm", + "bizobjectID": "d8b09de6-5e7c-bfdf-d308-468827ba0d6b", + "language": null, + "extendable": false, + "nameLanguage": { + "zh-CHS": "页面模板", + "en": "Empty Template", + "zh-CHT": "" + }, + "id": "35dd45be-60c7-4ae8-a827-533424031b76", + "isTranslating": false + }, + "refs": [], + "Content": { + "code": null, + "name": null, + "Contents": { + "module": { + "id": "35dd45be-60c7-4ae8-a827-533424031b76", + "code": "CommonDictionary", + "name": "通用字典", + "type": "Module", + "creator": "Sagi", + "creationDate": "2025-02-07T07:43:41.186Z", + "templateId": "list-card-template", + "templateRule": "list-card-template", + "entity": [], + "states": [], + "stateMachines": [], + "viewmodels": [], + "components": [ + { + "id": "root-component", + "type": "component", + "componentType": "frame", + "viewModel": "root-viewmodel", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-navigate f-page-is-grid-card" + }, + "contents": [] + } + ] + } + ], + "webcmds": [], + "projectName": "bo-commondictionaries-front", + "actions": [] + } + }, + "id": "35dd45be-60c7-4ae8-a827-533424031b76", + "creationDate": null + }, + "extendRule": null, + "relativePath": "SagiDemo/SagiDemeModule/CommonDictionaries/bo-commondictionaries-front/metadata/components", + "extendProperty": "", + "extended": false, + "previousVersion": null, + "version": null, + "properties": { + "schemaVersion": null, + "cacheVersion": null, + "framework": "Vue" + } +} \ No newline at end of file diff --git a/packages/designer/public/designer-canvas/empty1.json b/packages/designer/public/designer-canvas/empty1.json new file mode 100644 index 0000000000000000000000000000000000000000..c257280239217c5dc16a035ffdc4e42745006bfd --- /dev/null +++ b/packages/designer/public/designer-canvas/empty1.json @@ -0,0 +1,734 @@ +{ + "header" : { + "Code" : "CommonDictionary", + "Type" : "Form", + "NameSpace" : "Inspur.GS.SagiDemo.SagiDemeModule.CommonDictionaries.CommonDictionaries.Front", + "CertId" : null, + "Name" : "通用字典", + "FileName" : "CommonDictionary.frm", + "BizobjectID" : "d8b09de6-5e7c-bfdf-d308-468827ba0d6b", + "Language" : null, + "Extendable" : false, + "NameLanguage" : { + "zh-CHS" : "通用字典", + "en" : "Common Dictionary", + "zh-CHT" : "" + }, + "ID" : "35dd45be-60c7-4ae8-a827-533424031b76", + "IsTranslating" : false + }, + "refs" : [ { + "DependentMetadata" : { + "ID" : "4fdfc52d-8ac3-4f56-b431-d371c1fcf3ec", + "CertId" : null, + "NameSpace" : "Inspur.GS.SagiDemo.SagiDemeModule.CommonDictionaries.CommonDictionaries.Front", + "Code" : "CommonDictionary.frm", + "Name" : "CommonDictionary.frm", + "Type" : "ResourceMetadata", + "BizobjectID" : "d8b09de6-5e7c-bfdf-d308-468827ba0d6b" + } + } ], + "Content" : { + "code" : null, + "name" : null, + "Contents" : { + "module" : { + "id" : "35dd45be-60c7-4ae8-a827-533424031b76", + "code" : "CommonDictionary", + "name" : "通用字典", + "type" : "Module", + "creator" : "Sagi", + "creationDate" : "2025-02-07T07:43:41.186Z", + "templateId" : "list-card-template", + "templateRule" : "list-card-template", + "entity" : [ { + "eapiId" : "626b3ac9-e713-4cf2-95bd-9d01e401b51e", + "eapiCode" : "CommonDictionary_frm", + "eapiName" : "通用字典_frm", + "eapiNameSpace" : "Inspur.GS.SagiDemo.SagiDemeModule.CommonDictionaries.CommonDictionaries.Front", + "voPath" : "SagiDemo/SagiDemeModule/CommonDictionaries/bo-commondictionaries-front/metadata/components", + "voNameSpace" : "Inspur.GS.SagiDemo.SagiDemeModule.CommonDictionaries.CommonDictionaries.Front", + "name" : "通用字典_frm", + "id" : "52c7e73a-4797-4547-a772-fd50edf39f63", + "entities" : [ { + "label" : "commonDictionarys", + "name" : "通用字典", + "id" : "57a6ad1b-0dc2-4617-b820-a973da18887c", + "type" : { + "$type" : "EntityType", + "fields" : [ { + "$type" : "SimpleField", + "defaultValue" : "", + "editor" : { + "$type" : "TextBox" + }, + "require" : true, + "multiLanguage" : false, + "readonly" : false, + "label" : "id", + "name" : "主键", + "id" : "740c1cff-164d-4f47-96d9-cf7c8075cddb", + "type" : { + "$type" : "StringType", + "displayName" : "字符串", + "length" : 36, + "name" : "String" + }, + "path" : "ID", + "code" : "ID", + "originalId" : "740c1cff-164d-4f47-96d9-cf7c8075cddb", + "bindingField" : "id", + "bindingPath" : "id" + }, { + "$type" : "SimpleField", + "defaultValue" : "", + "editor" : { + "$type" : "DateBox", + "format" : "'yyyy-MM-dd'" + }, + "require" : false, + "multiLanguage" : false, + "readonly" : false, + "label" : "version", + "name" : "版本", + "id" : "43a7c79e-56e0-442e-b39d-8f9f45e8b0c8", + "type" : { + "$type" : "DateTimeType", + "displayName" : "日期时间", + "name" : "DateTime" + }, + "path" : "Version", + "code" : "Version", + "originalId" : "43a7c79e-56e0-442e-b39d-8f9f45e8b0c8", + "bindingField" : "version", + "bindingPath" : "version" + }, { + "$type" : "SimpleField", + "defaultValue" : "", + "editor" : { + "$type" : "TextBox" + }, + "require" : false, + "multiLanguage" : false, + "readonly" : false, + "label" : "code", + "name" : "编号", + "id" : "ddfc72d4-0c9b-49bf-8f41-8047264f6edc", + "type" : { + "$type" : "StringType", + "displayName" : "字符串", + "length" : 36, + "name" : "String" + }, + "path" : "Code", + "code" : "Code", + "originalId" : "ddfc72d4-0c9b-49bf-8f41-8047264f6edc", + "bindingField" : "code", + "bindingPath" : "code" + }, { + "$type" : "SimpleField", + "defaultValue" : "", + "editor" : { + "$type" : "TextBox" + }, + "require" : false, + "multiLanguage" : false, + "readonly" : false, + "label" : "name", + "name" : "名称", + "id" : "1ecd5759-6df4-41c8-9526-0108a5e2d9b6", + "type" : { + "$type" : "StringType", + "displayName" : "字符串", + "length" : 36, + "name" : "String" + }, + "path" : "Name", + "code" : "Name", + "originalId" : "1ecd5759-6df4-41c8-9526-0108a5e2d9b6", + "bindingField" : "name", + "bindingPath" : "name" + }, { + "$type" : "SimpleField", + "defaultValue" : "", + "editor" : { + "$type" : "TextBox" + }, + "require" : false, + "multiLanguage" : false, + "readonly" : false, + "label" : "category", + "name" : "分类", + "id" : "8e00ef40-17ba-4cbb-8a3c-709cf40b7939", + "type" : { + "$type" : "StringType", + "displayName" : "字符串", + "length" : 36, + "name" : "String" + }, + "path" : "Category", + "code" : "Category", + "originalId" : "8e00ef40-17ba-4cbb-8a3c-709cf40b7939", + "bindingField" : "category", + "bindingPath" : "category" + }, { + "$type" : "SimpleField", + "defaultValue" : "", + "editor" : { + "$type" : "EnumField" + }, + "require" : false, + "multiLanguage" : false, + "readonly" : false, + "label" : "enableStatus", + "name" : "启用状态", + "id" : "df3b84c2-dc6b-419c-85e3-0006b0535e61", + "type" : { + "$type" : "EnumType", + "displayName" : "枚举", + "name" : "Enum", + "enumValues" : [ { + "disabled" : false, + "name" : "未启用", + "value" : "0" + }, { + "disabled" : false, + "name" : "已启用", + "value" : "1" + } ], + "valueType" : { + "$type" : "StringType", + "displayName" : "字符串", + "length" : 36, + "name" : "String" + } + }, + "path" : "EnableStatus", + "code" : "EnableStatus", + "originalId" : "df3b84c2-dc6b-419c-85e3-0006b0535e61", + "bindingField" : "enableStatus", + "bindingPath" : "enableStatus" + } ], + "entities" : [ ], + "primary" : "id", + "displayName" : "通用字典", + "name" : "CommonDictionary" + }, + "code" : "CommonDictionary" + } ], + "sourceUri" : "api/sagidemo/sagidememodule/v1.0/CommonDictionary_frm", + "code" : "CommonDictionary_frm", + "variables" : [ ], + "sourceType" : "vo", + "extendProperties" : { + "enableStdTimeFormat" : true + } + } ], + "states" : [ ], + "stateMachines" : [ { + "id" : "CommonDictionary_state_machine", + "name" : "通用字典", + "uri" : "cde50e74-98bb-484d-8c21-247c84e615e0", + "code" : "CommonDictionary_frm", + "nameSpace" : "Inspur.GS.SagiDemo.SagiDemeModule.CommonDictionaries.CommonDictionaries.Front" + } ], + "viewmodels" : [ { + "id" : "root-viewmodel", + "code" : "root-viewmodel", + "name" : "通用字典", + "fields" : [ ], + "stateMachine" : "CommonDictionary_state_machine", + "serviceRefs" : [ ], + "commands" : [ ], + "states" : [ ], + "bindTo" : "/", + "enableValidation" : false, + "enableUnifiedSession" : false + }, { + "id" : "data-grid-component-viewmodel", + "code" : "data-grid-component-viewmodel", + "name" : "通用字典", + "fields" : [ { + "type" : "Form", + "id" : "ddfc72d4-0c9b-49bf-8f41-8047264f6edc", + "fieldName" : "code", + "groupId" : null, + "groupName" : null, + "updateOn" : "blur" + }, { + "type" : "Form", + "id" : "1ecd5759-6df4-41c8-9526-0108a5e2d9b6", + "fieldName" : "name", + "groupId" : null, + "groupName" : null, + "updateOn" : "blur" + }, { + "type" : "Form", + "id" : "df3b84c2-dc6b-419c-85e3-0006b0535e61", + "fieldName" : "enableStatus", + "groupId" : null, + "groupName" : null, + "updateOn" : "change" + } ], + "commands" : [ { + "id" : "fda876c8-7230-46e7-af3d-d38233642275", + "code" : "loadList1", + "name" : "加载列表数据", + "params" : [ ], + "handlerName" : "loadList", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + }, { + "id" : "22576fc1-08fb-49a9-b132-295c7392b481", + "code" : "remove1", + "name" : "删除当前数据", + "params" : [ { + "name" : "id", + "shownName" : "待删除数据的标识", + "value" : "{DATA~/id}" + } ], + "handlerName" : "remove", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + }, { + "id" : "8788c27e-722a-4b98-9d57-98eafb526fe5", + "code" : "loadCard1", + "name" : "加载卡片数据", + "params" : [ ], + "handlerName" : "loadCard", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + }, { + "id" : "ef281c13-4480-4256-901e-4bef5f92bd9e", + "code" : "add1", + "name" : "新增一条数据", + "params" : [ ], + "handlerName" : "add", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + }, { + "id" : "e7cf83c2-e52d-4dce-aded-047a819c8068", + "code" : "changePage1", + "name" : "切换页码", + "params" : [ { + "name" : "loadCommandName", + "shownName" : "切换页面后回调方法", + "value" : "loadList1" + }, { + "name" : "loadCommandFrameId", + "shownName" : "目标组件", + "value" : "data-grid-component" + } ], + "handlerName" : "changePage", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + } ], + "serviceRefs" : [ ], + "states" : [ ], + "bindTo" : "/", + "parent" : "root-viewmodel", + "enableValidation" : false + }, { + "id" : "detail-form-component-viewmodel", + "code" : "detail-form-component-viewmodel", + "name" : "通用字典", + "fields" : [ { + "type" : "Form", + "id" : "ddfc72d4-0c9b-49bf-8f41-8047264f6edc", + "fieldName" : "code", + "groupId" : null, + "groupName" : null, + "updateOn" : "blur" + }, { + "type" : "Form", + "id" : "1ecd5759-6df4-41c8-9526-0108a5e2d9b6", + "fieldName" : "name", + "groupId" : null, + "groupName" : null, + "updateOn" : "blur" + }, { + "type" : "Form", + "id" : "8e00ef40-17ba-4cbb-8a3c-709cf40b7939", + "fieldName" : "category", + "groupId" : null, + "groupName" : null, + "updateOn" : "blur" + } ], + "commands" : [ { + "id" : "d12acc4e-6274-44dc-95e6-cedeb5e66707", + "code" : "edit1", + "name" : "编辑数据", + "params" : [ { + "name" : "id", + "shownName" : "待编辑数据的标识", + "value" : "{DATA~/id}" + }, { + "name" : "transitionAction", + "shownName" : "状态机动作", + "value" : "Edit" + } ], + "handlerName" : "edit", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + }, { + "id" : "5707d460-c441-45c4-8fe1-f77abd9f75b1", + "code" : "save1", + "name" : "保存变更", + "params" : [ ], + "handlerName" : "save", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + }, { + "id" : "b3897b4b-a37f-48e3-afb3-8489cec02806", + "code" : "cancel1", + "name" : "取消变更", + "params" : [ ], + "handlerName" : "cancel", + "cmpId" : "7c48ef46-339c-42d4-8365-a21236c63044", + "extensions" : [ ], + "isInvalid" : false + } ], + "serviceRefs" : [ ], + "states" : [ ], + "bindTo" : "/", + "parent" : "root-viewmodel", + "enableValidation" : true + } ], + "components" : [ { + "id" : "root-component", + "type" : "component", + "componentType" : "frame", + "viewModel" : "root-viewmodel", + "contents" : [ { + "id" : "root-layout", + "type" : "content-container", + "appearance" : { + "class" : "f-page f-page-navigate f-page-is-grid-card" + }, + "contents" : [ { + "id" : "page-header", + "type" : "page-header", + "appearance" : { + "class" : "f-page-header" + }, + "iconClass" : "f-title-icon f-text-orna-dict", + "icon" : "f-icon f-icon-page-title-dictionary", + "title" : "通用字典", + "toolbar" : { + "type" : "response-toolbar", + "buttons" : [ { + "id" : "button-add", + "type" : "response-toolbar-item", + "appearance" : { + "class" : "btn-primary" + }, + "disabled" : "!viewModel.stateMachine['canAdd']", + "onClick" : "root-viewmodel.data-grid-component-viewmodel.add1", + "text" : "新增" + }, { + "id" : "button-edit", + "type" : "response-toolbar-item", + "text" : "编辑", + "disabled" : "!viewModel.stateMachine['canEdit']", + "onClick" : "root-viewmodel.detail-form-component-viewmodel.edit1" + }, { + "id" : "button-save", + "type" : "response-toolbar-item", + "text" : "保存", + "disabled" : "!viewModel.stateMachine['canSave']", + "onClick" : "root-viewmodel.detail-form-component-viewmodel.save1" + }, { + "id" : "button-cancel", + "type" : "response-toolbar-item", + "text" : "取消", + "disabled" : "!viewModel.stateMachine['canCancel']", + "onClick" : "root-viewmodel.detail-form-component-viewmodel.cancel1" + }, { + "id" : "button-delete", + "type" : "response-toolbar-item", + "text" : "删除", + "disabled" : "!viewModel.stateMachine['canRemove']", + "onClick" : "root-viewmodel.data-grid-component-viewmodel.remove1" + } ] + } + }, { + "id" : "main-container", + "type" : "content-container", + "appearance" : { + "class" : "f-page-main" + }, + "contents" : [ { + "id" : "content-splitter", + "type" : "splitter", + "appearance" : { + "class" : "f-page-content" + }, + "contents" : [ { + "id" : "content-list", + "type" : "splitter-pane", + "appearance" : { + "class" : "f-col-w6 f-page-content-nav" + }, + "resizable" : true, + "contents" : [ { + "id" : "data-grid-component-ref", + "type" : "component-ref", + "component" : "data-grid-component" + } ] + }, { + "id" : "content-main", + "type" : "splitter-pane", + "appearance" : { + "class" : "f-page-content-main" + }, + "contents" : [ { + "id" : "detail-component-ref", + "type" : "component-ref", + "component" : "detail-form-component" + } ] + } ] + } ] + } ] + } ] + }, { + "id" : "data-grid-component", + "type" : "component", + "componentType" : "data-grid", + "viewModel" : "data-grid-component-viewmodel", + "appearance" : { + "class" : "f-struct-wrapper f-utils-fill-flex-column" + }, + "onInit" : "loadList1", + "contents" : [ { + "id" : "data-grid-section", + "type" : "section", + "appearance" : { + "class" : "f-section-grid f-section-in-nav" + }, + "fill" : true, + "showHeader" : false, + "contents" : [ { + "id" : "dataGrid", + "type" : "data-grid", + "appearance" : { + "class" : "f-component-grid" + }, + "dataSource" : "commonDictionarys", + "columns" : [ { + "id" : "code_ddfc72d4_hxcr", + "type" : "data-grid-column", + "title" : "编号", + "field" : "code", + "dataType" : "string", + "binding" : { + "type" : "Form", + "path" : "code", + "field" : "ddfc72d4-0c9b-49bf-8f41-8047264f6edc", + "fullPath" : "Code" + }, + "width" : 120, + "visible" : true, + "filter" : "", + "showSetting" : false, + "actualWidth" : 120 + }, { + "id" : "name_1ecd5759_yj0s", + "type" : "data-grid-column", + "title" : "名称", + "field" : "name", + "dataType" : "string", + "binding" : { + "type" : "Form", + "path" : "name", + "field" : "1ecd5759-6df4-41c8-9526-0108a5e2d9b6", + "fullPath" : "Name" + }, + "width" : 120, + "visible" : true, + "filter" : "", + "showSetting" : false, + "actualWidth" : 120 + }, { + "id" : "enableStatus_df3b84c2_jhvi", + "type" : "data-grid-column", + "title" : "启用状态", + "field" : "enableStatus", + "dataType" : "enum", + "binding" : { + "type" : "Form", + "path" : "enableStatus", + "field" : "df3b84c2-dc6b-419c-85e3-0006b0535e61", + "fullPath" : "EnableStatus" + }, + "width" : 120, + "formatter" : { + "type" : "enum", + "data" : [ { + "disabled" : false, + "name" : "未启用", + "value" : "0" + }, { + "disabled" : false, + "name" : "已启用", + "value" : "1" + } ] + }, + "visible" : true, + "filter" : "", + "showSetting" : true, + "actualWidth" : 120 + } ], + "fieldEditable" : false, + "onClickRow" : "loadCard1", + "onPageIndexChanged" : "changePage1", + "onPageSizeChanged" : "changePage1", + "pagination" : { + "enable" : true, + "mode" : "server" + }, + "disabled" : "viewModel.stateMachine['editable']" + } ] + } ] + }, { + "id" : "detail-form-component", + "type" : "component", + "componentType" : "form", + "formColumns" : 1, + "viewModel" : "detail-form-component-viewmodel", + "appearance" : { + "class" : "f-struct-wrapper" + }, + "contents" : [ { + "id" : "detail-form-section", + "type" : "section", + "appearance" : { + "class" : "f-section-form f-section-in-main" + }, + "mainTitle" : "基本信息", + "contents" : [ { + "id" : "detail-form-layout", + "type" : "response-form", + "appearance" : { + "class" : "f-form-layout farris-form farris-form-controls-inline" + }, + "contents" : [ { + "id" : "code_ddfc72d4_njzh", + "type" : "form-group", + "appearance" : { + "class" : "col-12" + }, + "label" : "编号", + "binding" : { + "type" : "Form", + "path" : "code", + "field" : "ddfc72d4-0c9b-49bf-8f41-8047264f6edc", + "fullPath" : "Code" + }, + "editor" : { + "type" : "input-group", + "readonly" : "!viewModel.stateMachine['editable']", + "maxLength" : 36 + }, + "path" : "code" + }, { + "id" : "name_1ecd5759_onbj", + "type" : "form-group", + "appearance" : { + "class" : "col-12" + }, + "label" : "名称", + "binding" : { + "type" : "Form", + "path" : "name", + "field" : "1ecd5759-6df4-41c8-9526-0108a5e2d9b6", + "fullPath" : "Name" + }, + "editor" : { + "type" : "input-group", + "readonly" : "!viewModel.stateMachine['editable']", + "maxLength" : 36 + }, + "path" : "name" + }, { + "id" : "category_8e00ef40_wdtg", + "type" : "form-group", + "appearance" : { + "class" : "col-12" + }, + "label" : "分类", + "binding" : { + "type" : "Form", + "path" : "category", + "field" : "8e00ef40-17ba-4cbb-8a3c-709cf40b7939", + "fullPath" : "Category" + }, + "editor" : { + "type" : "input-group", + "readonly" : "!viewModel.stateMachine['editable']", + "maxLength" : 36 + }, + "path" : "category" + } ], + "controlsInline" : true, + "formAutoIntl" : true + } ] + } ] + } ], + "webcmds" : [ { + "id" : "7c48ef46-339c-42d4-8365-a21236c63044", + "path" : "/projects/packages/Inspur.GS.Gsp.Web.WebCmp/webcmd", + "name" : "ListCardController.webcmd", + "refedHandlers" : [ { + "host" : "fda876c8-7230-46e7-af3d-d38233642275", + "handler" : "loadList" + }, { + "host" : "8788c27e-722a-4b98-9d57-98eafb526fe5", + "handler" : "loadCard" + }, { + "host" : "ef281c13-4480-4256-901e-4bef5f92bd9e", + "handler" : "add" + }, { + "host" : "d12acc4e-6274-44dc-95e6-cedeb5e66707", + "handler" : "edit" + }, { + "host" : "5707d460-c441-45c4-8fe1-f77abd9f75b1", + "handler" : "save" + }, { + "host" : "b3897b4b-a37f-48e3-afb3-8489cec02806", + "handler" : "cancel" + }, { + "host" : "22576fc1-08fb-49a9-b132-295c7392b481", + "handler" : "remove" + }, { + "host" : "e7cf83c2-e52d-4dce-aded-047a819c8068", + "handler" : "changePage" + } ], + "code" : "ListCardController", + "nameSpace" : "Inspur.GS.Gsp.Web.WebCmp" + } ], + "projectName" : "bo-commondictionaries-front", + "actions" : [ ] + } + }, + "Id" : "35dd45be-60c7-4ae8-a827-533424031b76", + "CreationDate" : null + }, + "extendRule" : null, + "relativePath" : "SagiDemo/SagiDemeModule/CommonDictionaries/bo-commondictionaries-front/metadata/components", + "extendProperty" : "", + "extended" : false, + "previousVersion" : null, + "version" : null, + "properties" : { + "SchemaVersion" : null, + "CacheVersion" : null, + "Framework" : "Vue" + } +} \ No newline at end of file diff --git a/packages/designer/public/platform/common/web/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf b/packages/designer/public/platform/common/web/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..27ee4c68caef1cd22342f481420d6dbda1648012 Binary files /dev/null and b/packages/designer/public/platform/common/web/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf differ diff --git a/packages/designer/public/platform/common/web/monaco/vs/base/worker/workerMain.js b/packages/designer/public/platform/common/web/monaco/vs/base/worker/workerMain.js new file mode 100644 index 0000000000000000000000000000000000000000..fd469db1daaec95fe464c95b9f8b9351430ea7e3 --- /dev/null +++ b/packages/designer/public/platform/common/web/monaco/vs/base/worker/workerMain.js @@ -0,0 +1,21642 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/ + +(function() { +var __m = ["require","exports","vs/editor/common/core/range","vs/base/common/errors","vs/editor/common/core/position","vs/editor/common/core/offsetRange","vs/base/common/strings","vs/base/common/arrays","vs/base/common/lifecycle","vs/base/common/event","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm","vs/base/common/platform","vs/base/common/assert","vs/editor/common/core/lineRange","vs/base/common/uri","vs/base/common/arraysFind","vs/editor/common/diff/defaultLinesDiffComputer/utils","vs/editor/common/diff/rangeMapping","vs/base/common/functional","vs/base/common/iterator","vs/base/common/linkedList","vs/base/common/map","vs/base/common/stopwatch","vs/base/common/cancellation","vs/base/common/diff/diff","vs/base/common/types","vs/base/common/codiconsUtil","vs/base/common/objects","vs/base/common/uint","vs/editor/common/core/characterClassifier","vs/editor/common/core/textLength","vs/editor/common/core/wordHelper","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/myersDiffAlgorithm","vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence","vs/editor/common/diff/linesDiffComputer","vs/nls.messages","vs/nls","vs/base/common/path","vs/base/common/network","vs/base/common/cache","vs/base/common/color","vs/base/common/diff/diffChange","vs/base/common/keyCodes","vs/base/common/lazy","vs/base/common/hash","vs/base/common/symbols","vs/base/common/codiconsLibrary","vs/base/common/codicons","vs/editor/common/core/selection","vs/editor/common/core/positionToOffset","vs/editor/common/core/textEdit","vs/editor/common/core/wordCharacterClassifier","vs/editor/common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations","vs/editor/common/diff/defaultLinesDiffComputer/lineSequence","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/dynamicProgrammingDiffing","vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines","vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer","vs/editor/common/diff/legacyLinesDiffComputer","vs/editor/common/diff/linesDiffComputers","vs/editor/common/languages/defaultDocumentColorsComputer","vs/editor/common/languages/linkComputer","vs/editor/common/languages/supports/inplaceReplaceSupport","vs/editor/common/model","vs/editor/common/model/prefixSumComputer","vs/editor/common/model/mirrorTextModel","vs/editor/common/model/textModelSearch","vs/editor/common/services/editorWorkerHost","vs/editor/common/services/findSectionHeaders","vs/editor/common/services/unicodeTextModelHighlighter","vs/editor/common/standalone/standaloneEnums","vs/editor/common/tokenizationRegistry","vs/base/common/async","vs/base/common/process","vs/editor/common/languages","vs/editor/common/services/editorBaseApi","vs/editor/common/services/textModelSync/textModelSync.impl","vs/base/common/worker/simpleWorker","vs/editor/common/services/editorSimpleWorker"]; +var __M = function(deps) { + var result = []; + for (var i = 0, len = deps.length; i < len; i++) { + result[i] = __m[deps[i]]; + } + return result; +}; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------- + * Please make sure to make edits in the .ts file at https://github.com/microsoft/vscode-loader/ + *--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------- + *--------------------------------------------------------------------------------------------*/ +const _amdLoaderGlobal = this; +const _commonjsGlobal = typeof global === 'object' ? global : {}; +var AMDLoader; +(function (AMDLoader) { + AMDLoader.global = _amdLoaderGlobal; + class Environment { + get isWindows() { + this._detect(); + return this._isWindows; + } + get isNode() { + this._detect(); + return this._isNode; + } + get isElectronRenderer() { + this._detect(); + return this._isElectronRenderer; + } + get isWebWorker() { + this._detect(); + return this._isWebWorker; + } + get isElectronNodeIntegrationWebWorker() { + this._detect(); + return this._isElectronNodeIntegrationWebWorker; + } + constructor() { + this._detected = false; + this._isWindows = false; + this._isNode = false; + this._isElectronRenderer = false; + this._isWebWorker = false; + this._isElectronNodeIntegrationWebWorker = false; + } + _detect() { + if (this._detected) { + return; + } + this._detected = true; + this._isWindows = Environment._isWindows(); + this._isNode = (typeof module !== 'undefined' && !!module.exports); + this._isElectronRenderer = (typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.electron !== 'undefined' && process.type === 'renderer'); + this._isWebWorker = (typeof AMDLoader.global.importScripts === 'function'); + this._isElectronNodeIntegrationWebWorker = this._isWebWorker && (typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.electron !== 'undefined' && process.type === 'worker'); + } + static _isWindows() { + if (typeof navigator !== 'undefined') { + if (navigator.userAgent && navigator.userAgent.indexOf('Windows') >= 0) { + return true; + } + } + if (typeof process !== 'undefined') { + return (process.platform === 'win32'); + } + return false; + } + } + AMDLoader.Environment = Environment; +})(AMDLoader || (AMDLoader = {})); +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +var AMDLoader; +(function (AMDLoader) { + class LoaderEvent { + constructor(type, detail, timestamp) { + this.type = type; + this.detail = detail; + this.timestamp = timestamp; + } + } + AMDLoader.LoaderEvent = LoaderEvent; + class LoaderEventRecorder { + constructor(loaderAvailableTimestamp) { + this._events = [new LoaderEvent(1 /* LoaderEventType.LoaderAvailable */, '', loaderAvailableTimestamp)]; + } + record(type, detail) { + this._events.push(new LoaderEvent(type, detail, AMDLoader.Utilities.getHighPerformanceTimestamp())); + } + getEvents() { + return this._events; + } + } + AMDLoader.LoaderEventRecorder = LoaderEventRecorder; + class NullLoaderEventRecorder { + record(type, detail) { + // Nothing to do + } + getEvents() { + return []; + } + } + NullLoaderEventRecorder.INSTANCE = new NullLoaderEventRecorder(); + AMDLoader.NullLoaderEventRecorder = NullLoaderEventRecorder; +})(AMDLoader || (AMDLoader = {})); +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +var AMDLoader; +(function (AMDLoader) { + class Utilities { + /** + * This method does not take care of / vs \ + */ + static fileUriToFilePath(isWindows, uri) { + uri = decodeURI(uri).replace(/%23/g, '#'); + if (isWindows) { + if (/^file:\/\/\//.test(uri)) { + // This is a URI without a hostname => return only the path segment + return uri.substr(8); + } + if (/^file:\/\//.test(uri)) { + return uri.substr(5); + } + } + else { + if (/^file:\/\//.test(uri)) { + return uri.substr(7); + } + } + // Not sure... + return uri; + } + static startsWith(haystack, needle) { + return haystack.length >= needle.length && haystack.substr(0, needle.length) === needle; + } + static endsWith(haystack, needle) { + return haystack.length >= needle.length && haystack.substr(haystack.length - needle.length) === needle; + } + // only check for "?" before "#" to ensure that there is a real Query-String + static containsQueryString(url) { + return /^[^\#]*\?/gi.test(url); + } + /** + * Does `url` start with http:// or https:// or file:// or / ? + */ + static isAbsolutePath(url) { + return /^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(url); + } + static forEachProperty(obj, callback) { + if (obj) { + let key; + for (key in obj) { + if (obj.hasOwnProperty(key)) { + callback(key, obj[key]); + } + } + } + } + static isEmpty(obj) { + let isEmpty = true; + Utilities.forEachProperty(obj, () => { + isEmpty = false; + }); + return isEmpty; + } + static recursiveClone(obj) { + if (!obj || typeof obj !== 'object' || obj instanceof RegExp) { + return obj; + } + if (!Array.isArray(obj) && Object.getPrototypeOf(obj) !== Object.prototype) { + // only clone "simple" objects + return obj; + } + let result = Array.isArray(obj) ? [] : {}; + Utilities.forEachProperty(obj, (key, value) => { + if (value && typeof value === 'object') { + result[key] = Utilities.recursiveClone(value); + } + else { + result[key] = value; + } + }); + return result; + } + static generateAnonymousModule() { + return '===anonymous' + (Utilities.NEXT_ANONYMOUS_ID++) + '==='; + } + static isAnonymousModule(id) { + return Utilities.startsWith(id, '===anonymous'); + } + static getHighPerformanceTimestamp() { + if (!this.PERFORMANCE_NOW_PROBED) { + this.PERFORMANCE_NOW_PROBED = true; + this.HAS_PERFORMANCE_NOW = (AMDLoader.global.performance && typeof AMDLoader.global.performance.now === 'function'); + } + return (this.HAS_PERFORMANCE_NOW ? AMDLoader.global.performance.now() : Date.now()); + } + } + Utilities.NEXT_ANONYMOUS_ID = 1; + Utilities.PERFORMANCE_NOW_PROBED = false; + Utilities.HAS_PERFORMANCE_NOW = false; + AMDLoader.Utilities = Utilities; +})(AMDLoader || (AMDLoader = {})); +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +var AMDLoader; +(function (AMDLoader) { + function ensureError(err) { + if (err instanceof Error) { + return err; + } + const result = new Error(err.message || String(err) || 'Unknown Error'); + if (err.stack) { + result.stack = err.stack; + } + return result; + } + AMDLoader.ensureError = ensureError; + ; + class ConfigurationOptionsUtil { + /** + * Ensure configuration options make sense + */ + static validateConfigurationOptions(options) { + function defaultOnError(err) { + if (err.phase === 'loading') { + console.error('Loading "' + err.moduleId + '" failed'); + console.error(err); + console.error('Here are the modules that depend on it:'); + console.error(err.neededBy); + return; + } + if (err.phase === 'factory') { + console.error('The factory function of "' + err.moduleId + '" has thrown an exception'); + console.error(err); + console.error('Here are the modules that depend on it:'); + console.error(err.neededBy); + return; + } + } + options = options || {}; + if (typeof options.baseUrl !== 'string') { + options.baseUrl = ''; + } + if (typeof options.isBuild !== 'boolean') { + options.isBuild = false; + } + if (typeof options.paths !== 'object') { + options.paths = {}; + } + if (typeof options.config !== 'object') { + options.config = {}; + } + if (typeof options.catchError === 'undefined') { + options.catchError = false; + } + if (typeof options.recordStats === 'undefined') { + options.recordStats = false; + } + if (typeof options.urlArgs !== 'string') { + options.urlArgs = ''; + } + if (typeof options.onError !== 'function') { + options.onError = defaultOnError; + } + if (!Array.isArray(options.ignoreDuplicateModules)) { + options.ignoreDuplicateModules = []; + } + if (options.baseUrl.length > 0) { + if (!AMDLoader.Utilities.endsWith(options.baseUrl, '/')) { + options.baseUrl += '/'; + } + } + if (typeof options.cspNonce !== 'string') { + options.cspNonce = ''; + } + if (typeof options.preferScriptTags === 'undefined') { + options.preferScriptTags = false; + } + if (options.nodeCachedData && typeof options.nodeCachedData === 'object') { + if (typeof options.nodeCachedData.seed !== 'string') { + options.nodeCachedData.seed = 'seed'; + } + if (typeof options.nodeCachedData.writeDelay !== 'number' || options.nodeCachedData.writeDelay < 0) { + options.nodeCachedData.writeDelay = 1000 * 7; + } + if (!options.nodeCachedData.path || typeof options.nodeCachedData.path !== 'string') { + const err = ensureError(new Error('INVALID cached data configuration, \'path\' MUST be set')); + err.phase = 'configuration'; + options.onError(err); + options.nodeCachedData = undefined; + } + } + return options; + } + static mergeConfigurationOptions(overwrite = null, base = null) { + let result = AMDLoader.Utilities.recursiveClone(base || {}); + // Merge known properties and overwrite the unknown ones + AMDLoader.Utilities.forEachProperty(overwrite, (key, value) => { + if (key === 'ignoreDuplicateModules' && typeof result.ignoreDuplicateModules !== 'undefined') { + result.ignoreDuplicateModules = result.ignoreDuplicateModules.concat(value); + } + else if (key === 'paths' && typeof result.paths !== 'undefined') { + AMDLoader.Utilities.forEachProperty(value, (key2, value2) => result.paths[key2] = value2); + } + else if (key === 'config' && typeof result.config !== 'undefined') { + AMDLoader.Utilities.forEachProperty(value, (key2, value2) => result.config[key2] = value2); + } + else { + result[key] = AMDLoader.Utilities.recursiveClone(value); + } + }); + return ConfigurationOptionsUtil.validateConfigurationOptions(result); + } + } + AMDLoader.ConfigurationOptionsUtil = ConfigurationOptionsUtil; + class Configuration { + constructor(env, options) { + this._env = env; + this.options = ConfigurationOptionsUtil.mergeConfigurationOptions(options); + this._createIgnoreDuplicateModulesMap(); + this._createSortedPathsRules(); + if (this.options.baseUrl === '') { + if (this.options.nodeRequire && this.options.nodeRequire.main && this.options.nodeRequire.main.filename && this._env.isNode) { + let nodeMain = this.options.nodeRequire.main.filename; + let dirnameIndex = Math.max(nodeMain.lastIndexOf('/'), nodeMain.lastIndexOf('\\')); + this.options.baseUrl = nodeMain.substring(0, dirnameIndex + 1); + } + } + } + _createIgnoreDuplicateModulesMap() { + // Build a map out of the ignoreDuplicateModules array + this.ignoreDuplicateModulesMap = {}; + for (let i = 0; i < this.options.ignoreDuplicateModules.length; i++) { + this.ignoreDuplicateModulesMap[this.options.ignoreDuplicateModules[i]] = true; + } + } + _createSortedPathsRules() { + // Create an array our of the paths rules, sorted descending by length to + // result in a more specific -> less specific order + this.sortedPathsRules = []; + AMDLoader.Utilities.forEachProperty(this.options.paths, (from, to) => { + if (!Array.isArray(to)) { + this.sortedPathsRules.push({ + from: from, + to: [to] + }); + } + else { + this.sortedPathsRules.push({ + from: from, + to: to + }); + } + }); + this.sortedPathsRules.sort((a, b) => { + return b.from.length - a.from.length; + }); + } + /** + * Clone current configuration and overwrite options selectively. + * @param options The selective options to overwrite with. + * @result A new configuration + */ + cloneAndMerge(options) { + return new Configuration(this._env, ConfigurationOptionsUtil.mergeConfigurationOptions(options, this.options)); + } + /** + * Get current options bag. Useful for passing it forward to plugins. + */ + getOptionsLiteral() { + return this.options; + } + _applyPaths(moduleId) { + let pathRule; + for (let i = 0, len = this.sortedPathsRules.length; i < len; i++) { + pathRule = this.sortedPathsRules[i]; + if (AMDLoader.Utilities.startsWith(moduleId, pathRule.from)) { + let result = []; + for (let j = 0, lenJ = pathRule.to.length; j < lenJ; j++) { + result.push(pathRule.to[j] + moduleId.substr(pathRule.from.length)); + } + return result; + } + } + return [moduleId]; + } + _addUrlArgsToUrl(url) { + if (AMDLoader.Utilities.containsQueryString(url)) { + return url + '&' + this.options.urlArgs; + } + else { + return url + '?' + this.options.urlArgs; + } + } + _addUrlArgsIfNecessaryToUrl(url) { + if (this.options.urlArgs) { + return this._addUrlArgsToUrl(url); + } + return url; + } + _addUrlArgsIfNecessaryToUrls(urls) { + if (this.options.urlArgs) { + for (let i = 0, len = urls.length; i < len; i++) { + urls[i] = this._addUrlArgsToUrl(urls[i]); + } + } + return urls; + } + /** + * Transform a module id to a location. Appends .js to module ids + */ + moduleIdToPaths(moduleId) { + if (this._env.isNode) { + const isNodeModule = (this.options.amdModulesPattern instanceof RegExp + && !this.options.amdModulesPattern.test(moduleId)); + if (isNodeModule) { + // This is a node module... + if (this.isBuild()) { + // ...and we are at build time, drop it + return ['empty:']; + } + else { + // ...and at runtime we create a `shortcut`-path + return ['node|' + moduleId]; + } + } + } + let result = moduleId; + let results; + if (!AMDLoader.Utilities.endsWith(result, '.js') && !AMDLoader.Utilities.isAbsolutePath(result)) { + results = this._applyPaths(result); + for (let i = 0, len = results.length; i < len; i++) { + if (this.isBuild() && results[i] === 'empty:') { + continue; + } + if (!AMDLoader.Utilities.isAbsolutePath(results[i])) { + results[i] = this.options.baseUrl + results[i]; + } + if (!AMDLoader.Utilities.endsWith(results[i], '.js') && !AMDLoader.Utilities.containsQueryString(results[i])) { + results[i] = results[i] + '.js'; + } + } + } + else { + if (!AMDLoader.Utilities.endsWith(result, '.js') && !AMDLoader.Utilities.containsQueryString(result)) { + result = result + '.js'; + } + results = [result]; + } + return this._addUrlArgsIfNecessaryToUrls(results); + } + /** + * Transform a module id or url to a location. + */ + requireToUrl(url) { + let result = url; + if (!AMDLoader.Utilities.isAbsolutePath(result)) { + result = this._applyPaths(result)[0]; + if (!AMDLoader.Utilities.isAbsolutePath(result)) { + result = this.options.baseUrl + result; + } + } + return this._addUrlArgsIfNecessaryToUrl(result); + } + /** + * Flag to indicate if current execution is as part of a build. + */ + isBuild() { + return this.options.isBuild; + } + shouldInvokeFactory(strModuleId) { + if (!this.options.isBuild) { + // outside of a build, all factories should be invoked + return true; + } + // during a build, only explicitly marked or anonymous modules get their factories invoked + if (AMDLoader.Utilities.isAnonymousModule(strModuleId)) { + return true; + } + if (this.options.buildForceInvokeFactory && this.options.buildForceInvokeFactory[strModuleId]) { + return true; + } + return false; + } + /** + * Test if module `moduleId` is expected to be defined multiple times + */ + isDuplicateMessageIgnoredFor(moduleId) { + return this.ignoreDuplicateModulesMap.hasOwnProperty(moduleId); + } + /** + * Get the configuration settings for the provided module id + */ + getConfigForModule(moduleId) { + if (this.options.config) { + return this.options.config[moduleId]; + } + } + /** + * Should errors be caught when executing module factories? + */ + shouldCatchError() { + return this.options.catchError; + } + /** + * Should statistics be recorded? + */ + shouldRecordStats() { + return this.options.recordStats; + } + /** + * Forward an error to the error handler. + */ + onError(err) { + this.options.onError(err); + } + } + AMDLoader.Configuration = Configuration; +})(AMDLoader || (AMDLoader = {})); +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +var AMDLoader; +(function (AMDLoader) { + /** + * Load `scriptSrc` only once (avoid multiple + + + \ No newline at end of file diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/app.vue b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/app.vue new file mode 100644 index 0000000000000000000000000000000000000000..086f3bf1a32ba04d3b215da862ad3c4a1b283c38 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/app.vue @@ -0,0 +1,34 @@ +import { defineComponent } from "vue"; + + + + diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..191cca774370af5dbd770f7ff48e9b6b56443d3f --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.component.tsx @@ -0,0 +1,132 @@ +import { computed, defineComponent, ref } from "vue"; +import { FButton, FListView, FProgress, FSection } from "@farris/ui-vue/components"; +import { AnalysisProps, analysisProps } from "./analysis.props"; +import { mockAnalysisTasks } from './mock-data'; + +import FAppAnalysisTaskCard from './components/analysis-task-card.component'; + +import './analysis.scss'; +import { AyalysisTask } from "./type"; + +export default defineComponent({ + name: 'FAppAnalysis', + props: analysisProps, + emits: [], + setup(props: AnalysisProps, context) { + const title = '程序分析任务列表'; + const analysisListViewRef = ref(); + const analysisTasks = ref(mockAnalysisTasks); + const currentView = ref('listView'); + const shouldShowListView = computed(() => currentView.value === 'listView'); + const shouldShowCardView = computed(() => currentView.value === 'cardView'); + + function renderTitleArea() { + return ( +
+ +

{title}

+
+ ); + } + + function onClickNewTask() { + currentView.value = 'cardView'; + + } + + function onClickAnalysisCard(payload: string) { + if (payload === 'cancel' || payload === 'confirm') { + currentView.value = 'listView'; + } + } + + function renderToolbar() { + return ( +
+ 新建任务 +
+ ); + } + + function renderAnalysisTaskList() { + return + + {{ + content: ({ item, index, selectedItem }) => { + return ( +
+
+ + {item.id} +
+
+ +
{(item.creationTime as Date).toLocaleDateString()}
+
{(item.creationTime as Date).toLocaleTimeString()}
+
+
+ + {/* {item.completedTime} */} +
+
+ + {item.name} +
+
+ + {item.targetApp} +
+
+ + {item.version} +
+
+ + {item.options.map((option: string) => {option})} +
+
+ + +
+
+ + +
+
+ + {item.description} +
+
+ ); + } + }} +
+
; + } + + function renderAnalysistTaskCard() { + return ; + } + + return () => { + return ( +
+
+
+
+ +
+
+
+ {shouldShowListView.value && renderAnalysisTaskList()} + {shouldShowCardView.value && renderAnalysistTaskCard()} +
+
+
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.props.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ba80c7d91d1809373f1700cac19bc7a81d438cd --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const analysisProps = { + +}; + +export type AnalysisProps = ExtractPropTypes; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.scss b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.scss new file mode 100644 index 0000000000000000000000000000000000000000..fce9e81362486fb7b16e9b4509e7a7b9336e07b6 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/analysis.scss @@ -0,0 +1,105 @@ +.f-app-analysis { + .f-page-header { + position: relative; + height: 48px; + margin-bottom: 1rem !important; + + .f-page-header-base { + position: absolute; + z-index: 1; + width: 100%; + + .f-toolbar { + .btn { + box-shadow: 0 4px 10px 0 rgba(69, 144, 255, 0.25); + border-radius: 15px; + margin: 0 6px; + } + + .btn-primary { + background-image: linear-gradient(-51deg, #328bff 0%, #2a87ff 100%); + } + } + } + + .f-page-header-background { + background-image: linear-gradient(180deg, rgba(221, 236, 255, 0.9) 0%, rgba(249, 252, 255, 0.9) 63%); + border-radius: 8px; + box-shadow: 0 1px 10px 0 rgba(90, 102, 133, 0.05); + height: 100%; + opacity: 0.66; + position: absolute; + width: 100%; + z-index: 0; + } + } + + .f-page-main { + height: 100%; + + .f-app-analysis-task { + background-image: linear-gradient(0deg, #F7FBFF 0%, #FFFFFF 100%); + border: 1px solid rgba(42, 135, 255, 0.1); + border-radius: 6px; + display: flex; + margin-bottom: 10px; + + >div { + padding: 24px 20px 10px; + } + + label { + color: rgba(45, 47, 51, 0.65); + display: block; + font-size: 13px; + font-weight: 400; + margin-bottom: 10px; + } + + .analysis-creation-time { + div { + font-size: 13px; + color: #58CACC; + letter-spacing: 0.56px; + font-weight: 400; + } + } + + .analysis-completed-time { + div { + font-size: 13px; + color: #5FC875; + letter-spacing: 0.56px; + font-weight: 400; + } + } + + .analysis-target-app { + span { + font-size: 13px; + color: #2A87FF; + letter-spacing: 0.56px; + font-weight: 400; + } + } + + .analysis-options { + span { + background: rgba(89, 161, 255, 0.10); + border: 0.8px solid rgba(56, 143, 255, 0.8); + border-radius: 11px; + color: #388FFF; + font-size: 12px; + text-align: left; + font-weight: 500; + padding: 0px 8px; + margin-right: 6px; + } + } + + .analysis-status { + flex: 1; + } + } + } +} \ No newline at end of file diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card-background-icon.png b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card-background-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7402042b47e72d78aa69c6e6a747a388992606c6 Binary files /dev/null and b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card-background-icon.png differ diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card-background.png b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card-background.png new file mode 100644 index 0000000000000000000000000000000000000000..00a4e24ef2163e6b49d36f96d55ce1ebbf00e42e Binary files /dev/null and b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card-background.png differ diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..53e4c0d8aa1e2e00371ecb9ef620f347089681ad --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.component.tsx @@ -0,0 +1,111 @@ +import { defineComponent, ref } from "vue"; +import { FButton, FDynamicForm, FDynamicFormGroup, FStep } from "@farris/ui-vue/components"; +import { analysisTaskCardProps, AnalysisTaskCardProps } from "./analysis-task-card.props"; + +import './analysis-task-card.scss'; + +export default defineComponent({ + name: 'FAppAnalysisTaskCard', + props: analysisTaskCardProps, + emits: ['change'], + setup(props: AnalysisTaskCardProps, context) { + + const steps = ref([ + { + id: '1', + title: '配置选项', + description: '正在审批' + }, + { + id: '2', + title: '上传项目', + description: '等待复核', + } + ]); + + const baseFrameworkOptions = { + type: 'check-group', + idField: 'value', + data: [ + { name: '基础框架特性分析', value: 'commonOptions' } + ] + }; + + const advanceFrameworkOptions = { + type: 'check-group', + idField: 'value', + data: [ + { name: '依赖注入', value: 'injector' }, + { name: 'HTTP端点配置', value: 'httpEndPoint' }, + ] + }; + + const javaVersionEditorOptions = { + type: 'combo-list', + idField: 'value', + data: [ + { name: '8', value: 'java8' }, + { name: '17', value: 'java17' }, + ], + textField: 'name', + valueField: 'value', + }; + + const persistenceFrameworkOptions = { + type: 'check-group', + idField: 'value', + data: [ + { name: '持久化框架特性分析', value: 'persistenceOptions' } + ] + }; + + function onCancel() { + context.emit('change', 'cancel'); + } + + function onNext() { + context.emit('change', 'next'); + } + + function onConfirm() { + context.emit('change', 'confirm'); + } + + return () => { + return ( +
+
+
+
填写任务流程
+
+
+ +
+
+ + + + + + + + + + + + + + +
+
+
+ 取消 + 下一步 + +
+
+
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.props.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..a35ace5cecfcce16456e006f37a80ee169d19848 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const analysisTaskCardProps = { + +}; + +export type AnalysisTaskCardProps = ExtractPropTypes; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.scss b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.scss new file mode 100644 index 0000000000000000000000000000000000000000..9d44a542059bd4be0efd85e8622000e0891b56e3 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/components/analysis-task-card.scss @@ -0,0 +1,68 @@ +.f-app-analysis-task-card { + background-image: url(/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background.png); + background-position: center; + flex: 1; + + .task-card-banner { + display: flex; + flex-direction: column; + padding-top: 57px; + margin-bottom: 36px; + + .task-card-icon { + background-image: url(/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background-icon.png); + background-position: center; + background-repeat: no-repeat; + background-size: contain; + height: 36px; + margin-bottom: 20px; + } + + .task-card-title { + color: #2D2F33; + font-size: 24px; + font-weight: 500; + margin: auto; + } + } + + .task-card-progress { + display: flex; + flex-direction: column; + + .f-progress-step { + margin: auto; + } + } + + .task-card-options { + display: flex; + justify-content: center; + + .f-app-analysis-form { + flex: 1; + max-width: 26.625rem; + } + } + + .task-card-toolbar { + display: flex; + justify-content: center; + + .btn { + background: #FFFFFF; + border: 1px solid rgba(233, 236, 243, 1); + box-shadow: 0px 2px 6px 0px rgba(31, 35, 41, 0.06); + border-radius: 6px; + } + + .btn-primary { + background-image: linear-gradient(-51deg, #328BFF 0%, #2A87FF 100%); + box-shadow: 0px 4px 10px 0px rgba(69, 144, 255, 0.25); + border-radius: 6px; + font-size: 13px; + color: #FFFFFF; + font-weight: 400; + } + } +} \ No newline at end of file diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/mock-data.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/mock-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2a3292f962d89acfa022c7fb233470b5773b8ba --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/mock-data.ts @@ -0,0 +1,7 @@ +import { AyalysisTask } from "./type"; + +export const mockAnalysisTasks = [ + { id: 'RW1', name: '泵房控制程序', creationTime: new Date('2025-05-12 00:00:00'), completedTime: new Date('2025-5-12 00:01:00'), targetApp: 'ProgramA', version: 'v1.0.0', options: ['Java8', '持久化框架'], status: 100, description: '' }, + { id: 'RW2', name: '泵房控制程序', creationTime: new Date('2025-05-12 00:00:00'), completedTime: new Date('2025-5-12 00:01:00'), targetApp: 'ProgramA', version: 'v1.0.0', options: ['Java8', '持久化框架'], status: 80, description: '' }, + { id: 'RW3', name: '泵房控制程序', creationTime: new Date('2025-05-12 00:00:00'), completedTime: new Date('2025-5-12 00:01:00'), targetApp: 'ProgramA', version: 'v1.0.0', options: ['Java8', '持久化框架'], status: 0, description: '' } +] as AyalysisTask[]; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/type.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/type.ts new file mode 100644 index 0000000000000000000000000000000000000000..f46eb4d9d29a708dba80815d78b5f42b9e28f757 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/analysis/type.ts @@ -0,0 +1,20 @@ +export interface AyalysisTask { + /** 任务ID */ + id: string; + /** 任务名称 */ + name: string; + /** 提交时间 */ + creationTime: Date; + /** 完成时间 */ + completedTime: Date; + /** 关联应用 */ + targetApp: string; + /** 版本标志 */ + version: string; + /** 分析选项 */ + options: string[] + /** 分析状态 */ + status: number; + /** 备注 */ + description: string; +} diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/component-registry.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/component-registry.ts new file mode 100644 index 0000000000000000000000000000000000000000..1bafe55db631f4c64a1b4c32f6b16392c88d4550 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/component-registry.ts @@ -0,0 +1,10 @@ +import FAppAnalysis from './analysis/analysis.component'; +import FAppMenu from './menu/menu.component'; +import FAppVariables from './variables/variables.component'; +import FAppProfile from './profile/profile.component'; + +const componentRegistryMap = new Map( + [['menu', FAppMenu], ['variables', FAppVariables], ['profile', FAppProfile], ['analysis', FAppAnalysis]] +); + +export default componentRegistryMap; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/menu/menu.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/menu/menu.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9eb07535fa4dc221e9b11445829ef58ad28b3ca8 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/menu/menu.component.tsx @@ -0,0 +1,21 @@ +import { defineComponent } from "vue"; +import { menuProps, MenuProps } from "./menu.props"; + +export default defineComponent({ + name: 'FAppMenu', + props: menuProps, + emits: [], + setup(props: MenuProps, context) { + + return () => { + return ( +
+
+
+

App Menu

+
+
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/menu/menu.props.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/menu/menu.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..be1406ce042192703f6696fb5ef346cea8ccbc41 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/menu/menu.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const menuProps = { + +}; + +export type MenuProps = ExtractPropTypes; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7e8469c753a921f3620c96b730ed8a39cc75f833 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.component.tsx @@ -0,0 +1,85 @@ +import { defineComponent } from "vue"; +import { FButton, FDynamicForm, FDynamicFormGroup, FSection } from "@farris/ui-vue/components"; +import { ProfileProps, profileProps } from "./profile.props"; + +import './profile.scss'; + +export default defineComponent({ + name: 'FAppProfile', + props: profileProps, + emits: [], + setup(props: ProfileProps, context) { + const title = '泵房控制-应用信息详情'; + const profileEditorOptions = { + type: 'textarea' + }; + const appStatusEditorOptions = { + type: 'combo-list', + idField: 'value', + data: [ + { name: '待发布', value: 'created' }, + { name: '发布中', value: 'publishing' }, + { name: '已发布', value: 'published' } + ], + textField: 'name', + valueField: 'value', + }; + + function renderTitleArea() { + return ( +
+ +

{title}

+
+ ); + } + + function renderToolbar() { + return ( +
+ 预览 + 编辑代码 + 发布 +
+ ); + } + + return () => { + return ( +
+
+
+
+ +
+
+
+ + + + + + + + + + +
+
+ 保存 + 编辑 + 取消 +
+
+
+
+
+
+
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.props.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..8a96dadc87747876ce1ca5ec332de393d1ca92df --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const profileProps = { + +}; + +export type ProfileProps = ExtractPropTypes; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.scss b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.scss new file mode 100644 index 0000000000000000000000000000000000000000..62a62e38a41d84bcca068e9ce7218ac24b824860 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/profile/profile.scss @@ -0,0 +1,66 @@ +.f-app-profile { + .f-page-header { + position: relative; + height: 48px; + + .f-page-header-base { + position: absolute; + z-index: 1; + width: 100%; + + .f-toolbar { + .btn { + box-shadow: 0 4px 10px 0 rgba(69, 144, 255, 0.25); + border-radius: 15px; + margin: 0 6px; + } + + .btn-primary { + background-image: linear-gradient(-51deg, #328bff 0%, #2a87ff 100%); + } + } + } + + .f-page-header-background { + background-image: linear-gradient(180deg, rgba(221, 236, 255, 0.9) 0%, rgba(249, 252, 255, 0.9) 63%); + border-radius: 8px; + box-shadow: 0 1px 10px 0 rgba(90, 102, 133, 0.05); + height: 100%; + opacity: 0.66; + position: absolute; + width: 100%; + z-index: 0; + } + } + + .f-page-main { + height: 100%; + + .f-app-profile-form { + margin: 20%; + + .col-12 { + margin-bottom: .5rem; + } + + .f-profile-toolbar { + display: flex; + margin: .5rem auto; + + >div { + margin: auto; + + .btn { + box-shadow: 0 4px 10px 0 rgba(69, 144, 255, 0.25); + border-radius: 15px; + margin: 0 6px; + } + + .btn-primary { + background-image: linear-gradient(-51deg, #328bff 0%, #2a87ff 100%); + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/variables/variables.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/variables/variables.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..411d7b07892066aafc1924d3352fbfa5224482f4 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/variables/variables.component.tsx @@ -0,0 +1,21 @@ +import { defineComponent } from "vue"; +import { VariablesProps, variablesProps } from "./variables.props"; + +export default defineComponent({ + name: 'FAppVaribles', + props: variablesProps, + emits: [], + setup(props: VariablesProps, context) { + + return () => { + return ( +
+
+
+

App Variables

+
+
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/variables/variables.props.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/variables/variables.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..53c8a32962aa3d28341b3420f3c060dfe0bbf5a8 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/variables/variables.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const variablesProps = { + +}; + +export type VariablesProps = ExtractPropTypes; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e8eac856bde064e31caa5e5332798761d3a5f4f0 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.component.tsx @@ -0,0 +1,134 @@ +import { computed, defineComponent, onMounted, provide, ref } from 'vue'; +import FANavigation from '@farris/farris-admin/components/navigation/navigation.component'; +import FANavigationCompact from '@farris/farris-admin/components/navigation/navigation-compact.component'; +import FAContentArea from '@farris/farris-admin/components/content-area/content-area.component'; +import { ConfigOptions, WorkAreaInstance } from '@farris/farris-admin/composition/types'; +import { useConfig } from '@farris/farris-admin/composition/use-config'; +import { useFunctionInstance } from '@farris/farris-admin/composition/use-function-instance'; +import { useMenuData } from '@farris/farris-admin/composition/use-menu-data'; +import { useWorkAreaInstance } from '@farris/farris-admin/composition/use-work-area-instance'; +import { WorkspaceProps, workspaceProps } from './workspace.props'; + +import innerComponentRegistry from '../component-registry'; + +import './workspace.css'; + +export default defineComponent({ + name: 'FAppWorkspace', + props: workspaceProps, + emits: [], + setup(props: WorkspaceProps, context) { + const adminMainElementRef = ref(); + const sideBarCollapsed = ref(false); + const title = ref(); + // 初始化Farris Admin全局配置对象 + const config = useConfig(); + // 初始化Farris Admin全局配置对象,并记录初始化异步对象,用于监听初始化完成事件 + const configInitialized = config.initialize(); + // 初始化功能菜单实例管理服务 + const useFunctionInstanceComposition = useFunctionInstance(config); + + const useWorkAreaInstanceComposition = useWorkAreaInstance(); + const { activeInstanceId, workAreaInstances, workAreaInstanceMap } = useWorkAreaInstanceComposition; + + // 初始化导航菜单数据 + const useMenuDataComposition = useMenuData(); + // 监听Farris Admin全局配置对象初始化完成事件 + configInitialized.then((result: ConfigOptions) => { + title.value = result.title; + useWorkAreaInstanceComposition.loadWorkAreaConfiguration(result.workAreaSourceUri); + // useWorkAreaInstanceComposition.setResidentInstance(result.residentWorkAreas); + // 根据配置选项设置初始状态下打开的预制菜单,默认状态下为用户工作中心首页 + // useFunctionInstanceComposition.setResidentInstance(result.residentFunctions); + // 根据配置选项提供的功能菜单数据源Url地址生成功能菜单数据源 + useMenuDataComposition.generateFunctionMenu(result.functionSourceUri); + }); + + const sideContentStyle = computed(() => { + const sideBarWidth = sideBarCollapsed.value ? 64 : 230; + return { + 'width': `${sideBarWidth}px`, + 'overflow': 'visible', + 'transition': 'width 0.3s ease 0s', + 'border-top': 'none' + }; + }); + + const sideContentClass = computed(() => { + const classObject = { + 'f-admin-navigation': true, + 'f-page-content-side': true, + 'f-side-bar-collapsed': sideBarCollapsed.value, + 'f-side-bar-expanded': !sideBarCollapsed.value + }; + return classObject; + }); + + function getWorkAreaClass(workAreaInstance: WorkAreaInstance) { + const classObject = { + 'active': workAreaInstance.id === activeInstanceId.value, + } as Record; + return classObject; + } + + function onClickSidebarHandle() { + sideBarCollapsed.value = !sideBarCollapsed.value; + } + + function onActiveWorkArea(workAreaId: string) { + if (workAreaInstanceMap.has(workAreaId)) { + activeInstanceId.value = workAreaId; + } + } + + function renderSidebarHandle() { + return ; + } + + function renderWorkAreas() { + return workAreaInstances.value.map((workAreaInstance: WorkAreaInstance) => { + const workAreaInstanceRef = workAreaInstanceMap.get(workAreaInstance.id); + if (innerComponentRegistry.has(workAreaInstance.id)) { + const InnerComponent = innerComponentRegistry.get(workAreaInstance.id); + return ; + } + return ; + }); + } + + // 在依赖注入服务中注册功能菜单实例管理服务 + provide('f-admin-function-instance', useFunctionInstanceComposition); + // 在依赖注入服务中注册功能菜单数据服务 + provide('f-admin-menu-data', useMenuDataComposition); + + onMounted(() => { + // 在依赖注入服务中注册Farris Admin主框架Html元素 + provide('f-admin-main-element', adminMainElementRef.value); + }); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.css b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.css new file mode 100644 index 0000000000000000000000000000000000000000..c743f7f84cec71f0b138c3dcea6ef0e7ed5caa6f --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.css @@ -0,0 +1,7 @@ +.f-admin .f-admin-content > div { + display: none; +} + +.f-admin .f-admin-content > div.active { + display: flex; +} diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.props.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..ac61fe65abadc299011c0880a9fb21c363366573 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/components/workspace/workspace.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const workspaceProps = { + +}; + +export type WorkspaceProps = ExtractPropTypes; diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/main.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f0eb4348a6f7e35450b532c1e7a05f9705c36d6 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/main.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import FAAppCenter from './app.vue'; + +const app = createApp(FAAppCenter); + +app.mount('#app'); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/style.css b/packages/farris-admin/apps/platform/development-platform/ide/app-builder/src/style.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/index.html b/packages/farris-admin/apps/platform/development-platform/ide/app-center/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1cb6c2ea2027662251bd637a488ba243e06f1ac5 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/index.html @@ -0,0 +1,15 @@ + + + + + + + + + Farris App Center + + +
+ + + diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/app.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/app.tsx new file mode 100644 index 0000000000000000000000000000000000000000..51cb5c3b30e3fcfe58e671a9a425fb2f57261377 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/app.tsx @@ -0,0 +1,92 @@ +import { computed, defineComponent, provide, ref } from "vue"; +import FApps from './components/apps/apps.component'; +import FWelcome from './components/welcome/welcome.component'; +import { FNav } from '@farris/ui-vue/components'; +import { useAppDomain } from "./composition/use-app-domain"; +import { useAppConfig } from "./composition/use-app-config"; +import { AppConfigOptions } from "./composition/type"; + +import './style.css'; + +export default defineComponent({ + name: 'FAAppCenter', + setup() { + const title = "inBuilder Community"; + const workspace = ref('ws-Sagi-01'); + const currentUserName = ref('Sagi'); + const currentView = ref('start'); + const navData = [ + { id: 'start', text: '开始' }, + { id: 'my-apps', text: '我的应用' } + ]; + + // 初始化Farris Admin全局配置对象 + const config = useAppConfig(); + // 初始化Farris Admin全局配置对象,并记录初始化异步对象,用于监听初始化完成事件 + const configInitialized = config.initialize(); + // 初始化导航菜单数据 + const useAppDomainComposition = useAppDomain(); + // 监听Farris Admin全局配置对象初始化完成事件 + configInitialized.then((result: AppConfigOptions) => { + useAppDomainComposition.setAppDomainSourceUri(result.appDataSourceUri); + // 根据配置选项提供的功能菜单数据源Url地址生成功能菜单数据源 + useAppDomainComposition.generateAppDomain(result.appDataSourceUri); + }); + + const shouldShowWelcome = computed(() => currentView.value === 'start'); + const shouldShowAppsView = computed(() => currentView.value === 'my-apps'); + + function renderTitleArea() { + return
+ +

{title}

+
; + } + + function onClickNavigationItem(navItem: Record) { + currentView.value = navItem.id; + } + + function renderHeaderTabs() { + return
+ +
; + } + + // 在依赖注入服务中应用程序域服务 + provide('f-app-center-app-domain', useAppDomainComposition); + + function renderToolbar() { + return
+ +
; + } + + return () => { + return ( +
+
+ +
+
+ {shouldShowWelcome.value && } + {shouldShowAppsView.value && } +
+
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/apps/apps.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/apps/apps.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..68f863e8e4cabf86be230faa8a8c46bc36172c40 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/apps/apps.component.tsx @@ -0,0 +1,169 @@ +import { defineComponent, inject, onMounted, Ref, ref, watch } from "vue"; +import { FAccordion, FAccordionItem, FButton, FLayout, FLayoutPane, FListView, FModalService, FSearchBox } from "@farris/ui-vue/components"; +import { AppDomain, AppModule, AppObject, UseAppDomain } from "../../composition/type"; +import AppWizardComponent from '../wizard/app-wizard/app-wizard.component'; + +import './apps.css'; + +export default defineComponent({ + name: 'FAApps', + props: {}, + emits: [], + setup() { + const useAppDomainComposition = inject('f-app-center-app-domain') as UseAppDomain; + const { appDomains, appDomainMap, currentAppDomain, currentAppModule, currentAppObjects, updateAppDomain } = useAppDomainComposition; + const appListViewRef = ref(); + // const currentAppDomain = ref(); + // const currentAppModule = ref(); + // const currentAppObjects: Ref = ref([]); + const defaultAppDomainIconUrl = ''; + const appWizardComponentRef = ref(); + + function resetMenuItemSelectionStatus() { + Array.from(appDomainMap.entries()).forEach(([appDomainId, appDomainInstanceRef]) => { + appDomainInstanceRef.value?.clearSelection(); + }); + } + + function onClickMenuGroupHeader() { + resetMenuItemSelectionStatus(); + } + + function updateAppObjects(appDomain: AppDomain, item: AppModule) { + currentAppDomain.value = appDomain; + currentAppModule.value = item; + currentAppObjects.value = item.apps; + } + + watch(() => currentAppObjects.value, () => { + appListViewRef.value.updateDataSource(currentAppObjects.value); + }); + + function onClickMenuItem(payload: MouseEvent, appDomain: AppDomain, appModule: AppModule) { + resetMenuItemSelectionStatus(); + updateAppObjects(appDomain, appModule); + } + + function acceptToCreateNewApp() { + if (appWizardComponentRef.value) { + appWizardComponentRef.value.acceptToCreateNewApp().then(() => { + updateAppDomain(); + }); + } + } + + function onClickNewApp() { + const options = { + title: '创建应用', + width: 540, + render: () => , + acceptCallback: acceptToCreateNewApp + } as any; + FModalService.show(options); + } + + function renderAppModule(appDomain: AppDomain, { item, index, selectedItem }) { + return
onClickMenuItem(payload, appDomain, item)}> + + + + {item.name} + + + +
; + } + + function renderAppModules(appDomain: AppDomain, appModules: AppModule[]) { + const appDomainInstanceRef = appDomainMap.get(appDomain.id); + return + {{ content: ({ item, index, selectedItem }) => renderAppModule(appDomain, { item, index, selectedItem }) }} + ; + } + + function renderAppDomainNavigation(appDomains: any[]) { + return + {appDomains.map((appDomain: AppDomain) => { + return + {renderAppModules(appDomain, appDomain.modules)} + ; + })} + ; + } + + function renderAppsListHeader() { + return ( +
+ + {currentAppModule.value?.name} + / + {currentAppModule.value?.name} + + +
+ 新建应用 +
+
+ ); + } + + function getIconColor(item: Record, index: number) { + const colorMap = new Map([[0, '#4D98FF'], [1, '#FF7B51'], [2, '#B59EFF'], [3, '#30c87b']]); + const colorIndex = index % 4; + return { '--bg': colorMap.get(colorIndex) }; + } + + function onClickAppCard(appObject: AppObject) { + const appPath = `/${currentAppDomain.value.code}/${currentAppModule.value.code}/${appObject.code}`; + // const appUri = `/platform/dev/main/web/webide/newide/index.html?path=${appPath}&boId=${appObject.id}&ws=625s7acd&version=2.0#/home`; + const appUri = '/apps/platform/development-platform/ide/app-builder/index.html'; + + window.open(appUri); + } + + function renderAppCard({ item, index, selectedItem }) { + return ( +
onClickAppCard(item)}> +
+
+ +
+
+

{item.name}

+
{item.code}
+
+ +
+ +
+ ); + } + + onMounted(() => { + // if (appDomains.value.length && appDomains.value[0].modules.length) { + // updateAppObjects(appDomains.value[0], appDomains.value[0].modules[0]); + // } + }); + + return () => { + return ( + + + {renderAppDomainNavigation(appDomains.value)} + + + + {{ + header: renderAppsListHeader, + content: renderAppCard + }} + + + + ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/apps/apps.css b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/apps/apps.css new file mode 100644 index 0000000000000000000000000000000000000000..bb3287fdd552deb8806d2951efb0376861d0182d --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/apps/apps.css @@ -0,0 +1,272 @@ +.f-admin-app-center .accordion.farris-panel { + border: none; +} + +.f-admin-app-center .accordion.farris-panel .card-body { + padding-right: 0; +} +.f-admin-app-center .accordion.farris-panel .card-body .main-navigation.selected { + background-color: white; + font-size: 13px; + color: #2a87ff; + font-weight: 400; +} + +.f-admin-app-center .accordion.farris-panel .card-body > div:has(.main-navigation.selected) { + background-color: white !important; + border-radius: 10px; +} + +.f-admin-app-domain-groups { + border: none; + padding: 30px 12px 0 27px; + font-size: 14px; + background: transparent; +} + +/* .f-admin-app-domain-groups .f-admin-app-domain-icon { + line-height: 30px; + width: 64px; + height: 30px; + float: right; + text-align: center; + cursor: pointer; +} */ + +.f-admin-app-domain-groups .f-admin-app-domain { + padding: 0.375rem 0; + background: transparent; +} + +.f-admin-app-domain-groups .card-header { + padding: 1px 0.875rem 1px 0 !important; + background-color: transparent !important; + /* padding-left: 0 !important; */ +} + +.f-admin-app-domain-groups .card-header > .panel-item-title { + display: flex; + float: none; +} + +.f-admin-app-domain-groups .card-header > .panel-item-title > span { + flex: 1; +} + +.f-admin-app-domain-groups .card-header > .panel-item-title > i { + margin: 0; + opacity: 0.75; +} + +.f-admin-app-domain-groups .card-header > .panel-item-title > .panel-item-title-image { + margin-right: 8px; +} + +.f-admin-app-domain-groups .card-body { + padding: 0 0 0 0.9375rem !important; +} + +.f-admin-app-domain-groups .f-admin-app-module-list { + overflow: visible; +} + +.f-admin-app-domain-groups .f-admin-app-module-list > .f-list-view-content { + padding: 10px 0 10px 10px; + overflow: visible; +} + +.f-admin-app-domain-groups .f-admin-app-module-list-item { + position: relative; + padding: 8px 0 8px 1rem; + font-size: 14px; +} + +.f-admin-app-domain-groups .f-admin-app-module-list-item.f-listview-active { + font-size: 13px; + font-weight: 400; + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; +} + +.f-admin-app-center-content { + flex: 1; + overflow-y: auto; + padding: 26px 28px 26px 58px; +} + +.f-admin-apps-list .f-list-view-header { + display: flex; + flex-direction: column; + padding: 10px; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header { + display: flex; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-bread-crumbs { + flex: auto; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-bread-crumbs > span { + font-size: 18px; + font-family: 'PingFangSC-Medium'; + font-weight: 500; + color: #8d96a7; + margin-right: 0.25rem; + text-align: center; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-bread-crumbs > .f-admin-app-module-title { + color: #435069; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-tool-bar .btn { + background-image: linear-gradient(-51deg, #328bff 0%, #2a87ff 100%); + box-shadow: 0 4px 10px 0 rgba(69, 144, 255, 0.25); + border-radius: 15px; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-search-bar { + display: flex; + padding: 0 14px; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-search-bar > .search-handle { + text-align: center; + cursor: pointer; + margin: 0 auto; + display: flex; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-search-bar > .search-handle > i { + font-size: 24px; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-search-bar .form-control { + border-radius: 15px; +} +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-search-bar .input-group { + border-radius: 15px; +} + +.f-admin-apps-list .f-list-view-header .f-admin-apps-list-header .f-admin-apps-search-bar .input-group-append { + border-radius: 0 15px 15px 0; +} + +.f-app-card { + /* background-image: url('/assets/images/card-background.png'); + background-size: cover; + border-radius: 10px; + margin: 6px; + padding: 20px 20px 14px 20px; + position: relative; + width: 280px; */ + + margin: 4px; + padding: 20px 20px 14px 20px; + position: relative; + /* width: 297px; + height: 130px; */ + height: 110px; + width: 297px; + border: 1px solid #dae3ff; + border-radius: 10px; + cursor: pointer; + background-color: #fff; + /* margin: 0 !important; */ +} + +.f-app-card:hover { + box-shadow: 0 10px 16px 0 rgba(66, 103, 166, 0.11); +} + +.f-app-card-header.listview-item-content { + display: flex; +} + +.f-app-card-header > .listview-item-main { + flex: auto; +} + +.f-app-card-header .listview-item-icon { + border-radius: 21px; + display: flex; + height: 42px; + margin-right: 20px; + width: 42px; + --bg: grey; + --bg2: hsl(from var(--bg) h calc(s - 20) calc(l + 10)); + background-image: linear-gradient(-51deg, var(--bg2) 0%, var(--bg) 50%); +} + +.f-app-card-header .listview-item-icon > i { + margin: auto; + font-size: 22px; + color: white; +} + +.f-app-card-header .listview-item-title { + /* color: rgba(0, 0, 0, 0.85); + font-size: 15px; + font-weight: 500; + letter-spacing: 0.11px; + line-height: 1.4rem; + margin-bottom: 0; */ + + height: 22px; + color: #303e55; + font-size: 16px; + font-weight: 500; + max-width: calc(100% - 30px); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.f-app-card-header .listview-item-subtitle { + color: #7a8dae; + font-size: 13px; + font-weight: 400; + letter-spacing: 0; +} + +.f-app-card-header .f-app-favor { + border-radius: 10px; + color: #e8ebf1; + cursor: pointer; + height: 20px; + position: absolute; + top: 10px; + right: 0; + text-align: center; + font-weight: 500; + font-size: 20px; + width: 50px; +} + +.f-app-card-content p { + color: #7a8dae; + font-size: 13px; + font-weight: 400; + letter-spacing: 0; + margin-bottom: 0.375rem; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} + +.f-app-card-footer { + display: flex; + flex-direction: row-reverse; + margin-top: 14px; +} + +.f-app-card-footer .btn-group { + visibility: hidden; +} + +.f-listview-hover .btn-group { + visibility: visible; +} diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/welcome/welcome.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/welcome/welcome.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fe55e263955adee4aa96f3f201f37661bbf1db36 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/welcome/welcome.component.tsx @@ -0,0 +1,17 @@ +import { defineComponent } from "vue"; + +export default defineComponent({ + name: 'FAWelcome', + props: {}, + emits: [], + setup() { + + return () => { + return
+
+
+
+
; + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.component.tsx b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..214550aefbef0cfe2a55c2fb8a3bbe8647b12819 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.component.tsx @@ -0,0 +1,55 @@ +import { FDynamicForm, FDynamicFormGroup } from "@farris/ui-vue/components"; +import { defineComponent, ref } from "vue"; +import { AppWizardProps, appWizardProps } from "./app-wizard.props"; +import { useCreateApp } from './composition/use-create-app'; + +import './app-wizard.css'; + +export default defineComponent({ + name: 'FAppWizard', + props: appWizardProps, + setup(props: AppWizardProps, context) { + const appModuleName = ref(props.appModule.name); + const appModuleId = ref(props.appModule.id); + const appCode = ref(''); + const appName = ref(''); + const { createNewApp } = useCreateApp(); + + const appGroupEditorOptions = { + type: 'combo-list', + idField: 'value', + data: [], + textField: 'name', + valueField: 'value', + }; + + const requiredInputGroupOptions = { + type: 'input-group', + required: true + }; + + const readonlyInputGroupOptions = { + type: 'input-group', + readonly: true + }; + + function acceptToCreateNewApp() { + return createNewApp(appCode.value, appName.value, appModuleId.value); + } + + context.expose({ acceptToCreateNewApp }); + + return () => { + return ( +
+ + + + + + +
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.css b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.css new file mode 100644 index 0000000000000000000000000000000000000000..920a864db1974c2e378108a482601ea3cf883df0 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.css @@ -0,0 +1,7 @@ +.f-app-center-app-wizard{ + margin: 28px 0; +} + +.f-app-center-app-wizard .farris-group-wrap{ + max-width: 28.625rem; +} \ No newline at end of file diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.props.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..df2f1b508bc223f90cbed7485d9d7b444a154126 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/app-wizard.props.ts @@ -0,0 +1,11 @@ +import { ExtractPropTypes } from "vue"; + +export const appWizardProps = { + + appDomain: { type: Object, default: {} }, + + appModule: { type: Object, default: {} } +}; + +export type AppWizardProps = ExtractPropTypes; + diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/composition/use-create-app.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/composition/use-create-app.ts new file mode 100644 index 0000000000000000000000000000000000000000..d85387e1843c236963da2b793cef469275e80201 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/components/wizard/app-wizard/composition/use-create-app.ts @@ -0,0 +1,33 @@ +import axios from "axios"; + +export function useCreateApp() { + const createNewAppApiUri = '/api/runtime/sys/v1.0/business-objects/'; + const defaultAppInfoPayload = { + code: "", + id: "", + isDetail: "1", + isSysInit: false, + languageName: { 'zh-CHS': "" }, + layer: 4, + name: "", + parentID: "", + sortOrder: 2, + sysInit: "0", + }; + + function createNewApp(code: string, name: string, appModelId: string) { + const id = Date.now().toString(); + const appInfoPayload = Object.assign({}, defaultAppInfoPayload, { + id, code, name, languageName: { 'zh-CHS': name }, parentID: appModelId + }); + return new Promise((resolve, reject) => { + axios.post(createNewAppApiUri, appInfoPayload).then((response) => { + resolve(true); + }, (error) => { + reject(); + }); + }); + } + + return { createNewApp }; +} diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/type.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/type.ts new file mode 100644 index 0000000000000000000000000000000000000000..ba729fbb70dfba54deb97fe92888f0a73c54e054 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/type.ts @@ -0,0 +1,74 @@ +import { Ref } from "vue"; + +export interface RawAppDataItem { + id: string; + code: string; + name: string; + description: string; + refSUCode: string; + parentID: string; + sortOrder: number; + isDetail: string; + layer: number; + userId: string; + wsId: string; + type: string; + sysInit: string; +} + +export interface AppObject { + id: string; + code: string; + name: string; + description: string; + userId: string; +} + +export interface AppModule { + id: string; + code: string; + name: string; + description: string; + refSUCode: string; + apps: AppObject[] +} + +export interface AppDomain { + id: string; + code: string; + name: string; + description: string; + modules: AppModule[] +} + +export interface UseAppDomain { + + appDomains: Ref; + + appDomainMap: Map; + + currentAppDomain: Ref; + + currentAppModule: Ref; + + currentAppObjects: Ref; + + generateAppDomain: (appSourceUri: string) => void; + + setAppDomainSourceUri: (dataUri: string) => void; + + updateAppDomain: () => void; +} + +export interface AppConfigOptions { + + appDataSourceUri: string; + +} + +export interface UseAppConfig { + + options: AppConfigOptions; + + initialize: () => Promise +} diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/use-app-config.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/use-app-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ad716c247ae44597d139328be207c01fd480db0 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/use-app-config.ts @@ -0,0 +1,29 @@ +import axios from "axios"; +import { AppConfigOptions, UseAppConfig } from "./type"; + +export function useAppConfig(): UseAppConfig { + // Farris Admin 全局配置对象资源地址 + // 默认配置选项: 加载本地菜单和页面资源 + const defaultConfigFileUrl = '/assets/app-config-default.json'; + // inBuilder配置选项: 可加载UBML低代码产品发行版inBuilder的菜单和页面数据, 启动inBuilder运行环境后,即可使用此配置文件加载数据 + // const defaultConfigFileUrl = './assets/config-for-inBuilder.json'; + // 全局配置对象接口 + const options: AppConfigOptions = { + /** 功能菜单数据Url */ + appDataSourceUri: '', + }; + + function initialize() { + return new Promise((resolve, reject) => { + axios.get(defaultConfigFileUrl).then((response) => { + const config = response.data; + if (config) { + options.appDataSourceUri = config['appDataSourceUri'] || options.appDataSourceUri; + } + resolve(options); + }); + }); + } + + return { options, initialize }; +} diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/use-app-domain.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/use-app-domain.ts new file mode 100644 index 0000000000000000000000000000000000000000..dc50995a1e5b936d7d4423cadc5f72ed797ee228 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/composition/use-app-domain.ts @@ -0,0 +1,169 @@ +import axios from "axios"; +import { AppDomain, AppModule, AppObject, RawAppDataItem, UseAppDomain } from "./type"; +import { Ref, ref } from "vue"; + +export function useAppDomain(): UseAppDomain { + const rawAppDomainDataItemMap = new Map(); + const rawAppDataItemMap = new Map(); + const parentIdAndChildrenMap = new Map(); + const appDomains = ref([]); + const appDomainMap = new Map(); + const appDomainSourceUri = ref(''); + const currentAppDomain = ref(); + const currentAppModule = ref(); + const currentAppObjects: Ref = ref([]); + + function setAppDomainSourceUri(dataUri: string) { + appDomainSourceUri.value = dataUri; + } + + function updateCurrent() { + if (!currentAppDomain.value) { + if (appDomains.value.length) { + currentAppDomain.value = appDomains.value[0]; + } + } else { + const currentAppDomainId = currentAppDomain.value.id; + currentAppDomain.value = (appDomains.value as AppDomain[]).find((appDomain: AppDomain) => appDomain.id === currentAppDomainId); + } + if (!currentAppModule.value) { + currentAppModule.value = currentAppDomain.value.modules[0]; + } else { + const currentAppModuleId = currentAppModule.value.id; + currentAppModule.value = (currentAppDomain.value.modules as AppModule[]).find((appModule: AppModule) => appModule.id === currentAppModuleId); + if (!currentAppModule.value) { + currentAppModule.value = currentAppDomain.value.modules[0]; + } + } + currentAppObjects.value = (currentAppModule.value as AppModule).apps; + } + + /** + * 将原始数据加载为字典,以便于检索数据 + * @param rawAppData 原始数据 + */ + function generateAppDataItemMap(rawAppData: RawAppDataItem[]) { + rawAppDataItemMap.clear(); + rawAppDomainDataItemMap.clear(); + rawAppData.forEach((dataItem: RawAppDataItem) => { + rawAppDataItemMap.set(dataItem.id, dataItem); + if (Number(dataItem.layer) === 2 && dataItem.sysInit !== '1') { + rawAppDomainDataItemMap.set(dataItem.id, dataItem); + } + }); + } + + /** + * 构造数据父子关系字典,以便于查找数据上下级关系 + * @param rawAppData 原始数据 + */ + function generateParentIdAndChildrenMap(rawAppData: RawAppDataItem[]) { + parentIdAndChildrenMap.clear(); + rawAppData.reduce((childrenMap: Map, rawDataItem: RawAppDataItem) => { + const parentIdOfCurrent = rawDataItem.parentID !== undefined ? rawDataItem.parentID : ''; + const siblingsOfCurrent = childrenMap.has(parentIdOfCurrent) ? childrenMap.get(parentIdOfCurrent) as any[] : []; + siblingsOfCurrent.push(rawDataItem); + childrenMap.set(parentIdOfCurrent, siblingsOfCurrent); + return childrenMap; + }, parentIdAndChildrenMap); + } + + /** + * 构造应用模块 + * @param rawAppModuleData 应用模块原始数据 + * @returns 应用模块对象 + */ + function buildAppModule(rawAppModuleData: RawAppDataItem): AppModule { + const { id, code, name, description } = rawAppModuleData; + const rawAppObjectDataItems = parentIdAndChildrenMap.get(id) || []; + const apps: AppObject[] = rawAppObjectDataItems.map((rawAppObjectDataItem: RawAppDataItem) => { + const { id, code, name, description, userId } = rawAppObjectDataItem; + return { id, code, name, description, userId }; + }); + return { id, code, name, description, apps } as AppModule; + } + + /** + * 构造应用程序域 + * @param rawAppDomainDataItem 应用程序域原始数据 + * @returns 应用程序域对象 + */ + function buildAppDomain(rawAppDomainDataItem: RawAppDataItem): AppDomain { + const { id, code, name, description } = rawAppDomainDataItem; + const rawAppModuleDataItems = parentIdAndChildrenMap.get(id) || []; + const modules: AppModule[] = rawAppModuleDataItems.map((rawAppModuleData: RawAppDataItem) => { + return buildAppModule(rawAppModuleData); + }); + return { id, code, name, description, modules } as AppDomain; + + } + + /** + * 构造应用程序域集合,每个应用程序域是一个独立的软件系统 + * @param rawAppData 应用信息原始数据 + * @returns 应用程序域集合 + */ + function generateAppDomains(rawAppData: RawAppDataItem[]): AppDomain[] { + generateAppDataItemMap(rawAppData); + generateParentIdAndChildrenMap(rawAppData); + + const menuGroups: AppDomain[] = Array.from(rawAppDomainDataItemMap.values()) + .map((rawAppDomainDataItem: RawAppDataItem) => { + return buildAppDomain(rawAppDomainDataItem); + }); + + return menuGroups; + } + + /** + * 获取应用信息原始数据 + * @param appSourceUri 功能菜单数据源Url + * @returns + */ + function getAppData(appSourceUri: string): Promise { + return new Promise((resolve, reject) => { + axios.get(appSourceUri).then((response) => { + resolve(response.data); + }, (error) => { + resolve([]); + }); + }); + } + + /** + * 加载并初始化应用程序域数据 + * @param domains 应用程序域对象集合 + */ + function loadAppDomain(domains: AppDomain[]) { + appDomains.value = domains; + appDomainMap.clear(); + (appDomains.value as AppDomain[]).reduce((emptyMenuMap: Map, appDomain: AppDomain) => { + emptyMenuMap.set(appDomain.id, ref()); + return emptyMenuMap; + }, appDomainMap); + } + + /** + * 获取应用信息原始数据 + * @param appSourceUri 应用信息数据源Url + */ + function generateAppDomain(appSourceUri: string) { + getAppData(appSourceUri).then((rawAppData: any[]) => { + const appDomains = generateAppDomains(rawAppData); + loadAppDomain(appDomains); + updateCurrent(); + }); + } + + function updateAppDomain() { + if (appDomainSourceUri.value) { + getAppData(appDomainSourceUri.value).then((rawAppData: any[]) => { + const appDomains = generateAppDomains(rawAppData); + loadAppDomain(appDomains); + updateCurrent(); + }); + } + } + + return { appDomains, appDomainMap, currentAppDomain, currentAppModule, currentAppObjects, generateAppDomain, setAppDomainSourceUri, updateAppDomain }; +} diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/main.ts b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..47eaa69d8778f9d93b512d44547b3d296983a2b2 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/main.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import FAAppCenter from './app'; + +const app = createApp(FAAppCenter); + +app.mount('#app'); diff --git a/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/style.css b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/style.css new file mode 100644 index 0000000000000000000000000000000000000000..cdf1a1e5497d3ac0bd179edf9cbc929d5fb84695 --- /dev/null +++ b/packages/farris-admin/apps/platform/development-platform/ide/app-center/src/style.css @@ -0,0 +1,79 @@ +.f-admin-app-center > .f-page-header > .f-page-header-base { + padding: 0; +} + +.f-admin-app-center .f-page-header .f-title { + width: 400px; +} + +.f-admin-app-center .f-page-header .f-title-logo { + background-image: url(/assets/images/farris_design_light.png); + background-position-x: unset; + background-size: cover; + height: 32px; + margin: 4px 4px 0 12px; + width: 32px; +} + +.f-admin-app-center .f-page-header .farris-nav { + border-bottom: none; + margin: auto; +} + +.f-admin-app-center .f-page-header .farris-nav .farris-nav-item-link { + border-bottom: none; +} +.f-admin-app-center .f-page-header .farris-nav .farris-nav-item .farris-nav-item-bottom-line { + height: 4px; + margin: 4px auto 0; +} + +.f-admin-app-center .f-page-header .farris-nav .farris-nav-item.active .farris-nav-item-bottom-line { + height: 4px; + background-image: linear-gradient(186deg, #0e6ded 10%, #1f7cfa 100%); + box-shadow: 0 2px 10px 0 rgba(13, 106, 246, 0.4); + border-radius: 2px; + max-width: 50%; + margin: 4px auto 0; +} + +.f-admin-app-center .f-page-header .f-header-toolbar { + display: flex; + justify-content: end; + padding-right: 20px; + position: relative; + width: 400px; +} +.f-admin-app-center .f-page-header .f-header-toolbar .nav { + display: flex; + align-items: center; +} + +.f-admin-app-center .f-page-header .f-header-toolbar .f-app-center-toolbar-split { + margin: 0 1rem; + height: 20px; + border-right: 1px solid #ccc; +} + +.f-admin-app-center .f-page-header .f-header-toolbar .f-app-center-user { + align-items: center; + display: flex; + flex-direction: row; +} +.f-admin-app-center .f-page-header .f-header-toolbar .f-app-center-user .f-app-center-user-icon { + align-items: center; + background: #dae9ff; + border-radius: 20px; + display: flex; + height: 30px; + justify-content: center; + text-align: center; + vertical-align: middle; + width: 30px; +} +.f-admin-app-center .f-page-header .f-app-center-user .f-app-center-user-icon .f-icon { + color: #529dff; +} +.f-admin-app-center .f-page-header .f-app-center-user .f-app-center-user-name { + margin-left: 0.5rem; +} diff --git a/packages/farris-admin/apps/domain/index.html b/packages/farris-admin/apps/platform/domain-platform/customize/domain/index.html similarity index 91% rename from packages/farris-admin/apps/domain/index.html rename to packages/farris-admin/apps/platform/domain-platform/customize/domain/index.html index e8d6760234f57bb7899078dc7d04b14e5d0efb68..0fa3f1a0e45eb1a388bf7d2347f2370b5667b4cb 100644 --- a/packages/farris-admin/apps/domain/index.html +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/index.html @@ -9,7 +9,7 @@ Farris Admin -
+
diff --git a/packages/farris-admin/apps/domain/src/app.tsx b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/app.tsx similarity index 92% rename from packages/farris-admin/apps/domain/src/app.tsx rename to packages/farris-admin/apps/platform/domain-platform/customize/domain/src/app.tsx index bfe76ff3c81609b75c180d7349fed8ebe3de6573..4bf71acc0811c21059370168c6d291e3bdf7e738 100644 --- a/packages/farris-admin/apps/domain/src/app.tsx +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/app.tsx @@ -1,6 +1,8 @@ import { defineComponent } from "vue"; import FDomainManagement from './components/domain-management'; +import './style.css'; + export default defineComponent({ name: 'FADomainLCDP', setup() { diff --git a/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/assets/domains.json b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/assets/domains.json new file mode 100644 index 0000000000000000000000000000000000000000..7d57eb2ca13dcd8b1773b4ffd002e8dcff9bedda --- /dev/null +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/assets/domains.json @@ -0,0 +1,112 @@ +[ + { + "id": "1", + "title": "智慧矿山", + "color": "", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-mine", + "creater": "user01", + "status": "testing", + "description": "智慧矿山是以矿山数字化、信息化为前提和基础,对矿山生产、职业健康与安全、技术支持与后勤保障等进行主动感知、自动分析、快速处理,建设形成的安全、无人、高效、清洁的矿山。" + }, + { + "id": "2", + "title": "智慧楼宇", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-buildings", + "creater": "user01", + "status": "testing", + "description": "智慧楼宇是将建筑、通信、计算机和控制等各方面的先进科技相互融合,能够适应信息化社会发展需求的现代化新型建筑。" + }, + { + "id": "3", + "title": "智能制造", + "color": "#FF7B51", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-manufacturing", + "creater": "user01", + "status": "published", + "description": "智能制造一种由智能机器和人类专家共同组成的人机一体化智能系统,它在制造过程中能进行智能活动,诸如分析、推理、判断、构思和决策等。" + }, + { + "id": "4", + "title": "智慧物流", + "color": "#B59EFF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-logistics", + "creater": "user01", + "status": "editing", + "description": "智慧物流是通过智能软硬件、物联网、大数据等智慧化技术手段,实现物流各环节精细化、动态化、可视化管理,提高物流系统智能化分析决策和自动化操作执行能力,提升物流运作效率的现代化物流模式。" + }, + { + "id": "5", + "title": "城市应急", + "color": "#FF7B51", + "icon": "f-icon f-icon-engineering", + "path": "/domain/urban-emergency", + "creater": "user01", + "status": "testing", + "description": "城市应急机制是指在应对突发事件中,对政府行政权力进行应急配置而形成的权力运行机制。" + }, + { + "id": "6", + "title": "智慧园区", + "color": "#B59EFF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-parks", + "creater": "user01", + "status": "testing", + "description": "智慧园区平台主要包含三大模块:智能化应用系统、绿色节能管理和政务办公服务平台。" + }, + { + "id": "7", + "title": "智慧水务", + "color": "#30c87b", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-water-plant", + "creater": "user01", + "status": "published", + "description": "智慧水务是通过新一代信息技术与水务技术的深度融合,充分发掘数据价值和逻辑关系,实现水务业务系统的控制智能化、数据资源化、管理精确化、决策智慧化" + }, + { + "id": "8", + "title": "智能粮库", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-grain-depot", + "creater": "user01", + "status": "editing", + "description": "智能粮库" + }, + { + "id": "9", + "title": "智慧车间", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-workshop", + "creater": "user01", + "status": "testing", + "description": "智慧车间" + }, + { + "id": "10", + "title": "鱼菜共生", + "color": "#30c87b", + "icon": "f-icon f-icon-engineering", + "path": "/domain/aquaponics", + "creater": "user01", + "status": "testing", + "description": "鱼菜共生" + }, + { + "id": "11", + "title": "钻井平台", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/drilling-rigs", + "creater": "user01", + "status": "published", + "description": "钻井平台" + } +] \ No newline at end of file diff --git a/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/components/domain-management.css b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/components/domain-management.css new file mode 100644 index 0000000000000000000000000000000000000000..90c3c440980c2b97812f31239e0ce08cf27a1e26 --- /dev/null +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/components/domain-management.css @@ -0,0 +1,102 @@ +.f-domain-card { + background-image: url('/assets/images/card-background.png'); + background-size: cover; + border-radius: 10px; + margin: 6px; + padding: 20px 20px 14px 20px; + position: relative; + width: 280px; +} + +.f-domain-card-header.listview-item-content { + display: flex; +} + +.f-domain-card-header .listview-item-icon { + border-radius: 21px; + display: flex; + height: 42px; + margin-right: 20px; + width: 42px; + --bg: grey; + --bg2: hsl(from var(--bg) h calc(s - 20) calc(l + 10)); + background-image: linear-gradient(-51deg, var(--bg2) 0%, var(--bg) 50%); +} + +.f-domain-card-header .listview-item-icon > i { + margin: auto; + font-size: 22px; + color: white; +} + +.f-domain-card-header .listview-item-title { + color: rgba(0, 0, 0, 0.85); + font-size: 15px; + font-weight: 500; + letter-spacing: 0.11px; + line-height: 1.4rem; + margin-bottom: 0; +} + +.f-domain-card-header .listview-item-subtitle { + color: #7a8dae; + font-size: 13px; + font-weight: 400; + letter-spacing: 0; +} + +.f-domain-card-header .bage { + position: absolute; + top: 20px; + right: 20px; + height: 20px; + width: 50px; + border-radius: 10px; + font-size: 12px; + text-align: center; + font-weight: 500; +} + +.f-domain-card-header .bage-testing { + background: #eef5ff; + border: 1px solid rgba(56, 143, 255, 0.8); + color: #388fff; +} + +.f-domain-card-header .bage-published { + background: #fff4e5; + border: 1px solid rgba(255, 152, 0, 0.8); + color: #ff9800; +} + +.f-domain-card-header .bage-editing { + background: #f0f9f2; + border: 1px solid rgba(51, 186, 143, 1); + color: #33ba8f; +} + +.f-domain-card-content p { + color: #7a8dae; + font-size: 13px; + font-weight: 400; + letter-spacing: 0; + margin-bottom: 0.375rem; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; +} + +.f-domain-card-footer { + display: flex; + flex-direction: row-reverse; + margin-top: 14px; +} + +.f-domain-card-footer .btn-group { + visibility: hidden; +} + +.f-listview-hover .btn-group { + visibility: visible; +} diff --git a/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/components/domain-management.tsx b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/components/domain-management.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8c7788b87514d22293b904bc48c04099f9a435e0 --- /dev/null +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/components/domain-management.tsx @@ -0,0 +1,114 @@ +import { defineComponent, onMounted, ref } from "vue"; +import { FButton, FDynamicForm, FDynamicFormGroup, FListView, FPageHeader, FSection } from "@farris/ui-vue/components"; + +import './domain-management.css'; +import { useDomain } from "../composition/use-domain"; + +export default defineComponent({ + name: "FADomainManagement", + setup() { + const domianListViewRef = ref(); + const { domains, getDomains, createDomain } = useDomain(); + const items = [{ id: 'createDomain', text: '创建领域', class: 'btn-primary', onClick: () => createDomain() }]; + const statusMap = new Map([['testing', '测试中'], ['published', '已发布'], ['editing', '定制中']]); + const editorOptions = { + type: 'combo-list', + idField: 'value', + data: [ + { name: '定制中', value: 'editing' }, + { name: '测试中', value: 'testing' }, + { name: '已发布', value: 'published' } + ], + textField: 'name', + valueField: 'value', + }; + + function getBageClass(item: Record) { + const classObject = { + 'bage': true, + 'bage-testing': item.status === 'testing', + 'bage-published': item.status === 'published', + 'bage-editing': item.status === 'editing' + }; + return classObject; + } + + function getIconColor(item: Record) { + return { '--bg': item.color }; + } + + onMounted(() => { + getDomains().then((domains: Record[]) => { + domianListViewRef.value.updateDataSource(domains); + }); + }); + + function openDomainPlatform(domain: Record) { + const { id } = domain; + const code = domain.id; + const name = domain.title; + // const deployPath = '/platform/dev/main/web/webide-apps/index.html#/home'; + const deployPath = name === '智慧楼宇' ? '/platform/dev/main/web/webide-apps/index.html#/home' : '/apps/platform/development-platform/ide/app-center/index.html'; + window.top?.postMessage({ + eventType: 'invoke', + method: 'openUrl', + params: [id, code, name, deployPath] + }); + } + + return () => { + return ( +
+ +
+ + + + + + +
+ 筛选 +
+
+
+ + + {{ + content: ({ item, index, selectedItem }) => { + return ( +
+
+
+ +
+
+

{item.title}

+
{item.creater}
+ {statusMap.get(item.status)} +
+
+
+

{item.path}

+

{item.description}

+
+ +
+ ); + } + }} +
+
+
+
+ ); + }; + } +}); diff --git a/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/composition/types.ts b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/composition/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8e92088021930920f9b25f03d57a428454f04a0 --- /dev/null +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/composition/types.ts @@ -0,0 +1,10 @@ +import { Ref } from "vue"; + +export interface UseDomain { + + createDomain: () => void; + + domains: Ref[]>; + + getDomains: () => Promise[]>; +} diff --git a/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/composition/use-domain.ts b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/composition/use-domain.ts new file mode 100644 index 0000000000000000000000000000000000000000..e1304c8669c87f5b20d5db5843761362091289f0 --- /dev/null +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/composition/use-domain.ts @@ -0,0 +1,38 @@ +import { Ref, ref } from "vue"; +import { UseDomain } from "./types"; +import axios from "axios"; + +export function useDomain(): UseDomain { + const domainSourceUri = './assets/domains.json'; + const domains: Ref[]> = ref([]); + + // const domains = ref([ + // { id: '1', title: '智慧矿山', color: '', icon: 'f-icon f-icon-engineering', path: '/domain/smart-mine', creater: 'user01', status: 'testing', description: '智慧矿山是以矿山数字化、信息化为前提和基础,对矿山生产、职业健康与安全、技术支持与后勤保障等进行主动感知、自动分析、快速处理,建设形成的安全、无人、高效、清洁的矿山。' }, + // { id: '2', title: '智慧楼宇', color: '#4D98FF', icon: 'f-icon f-icon-engineering', path: '/domain/smart-buildings', creater: 'user01', status: 'testing', description: '智慧楼宇是将建筑、通信、计算机和控制等各方面的先进科技相互融合,能够适应信息化社会发展需求的现代化新型建筑。' }, + // { id: '3', title: '智能制造', color: '#FF7B51', icon: 'f-icon f-icon-engineering', path: '/domain/smart-manufacturing', creater: 'user01', status: 'published', description: '智能制造一种由智能机器和人类专家共同组成的人机一体化智能系统,它在制造过程中能进行智能活动,诸如分析、推理、判断、构思和决策等。' }, + // { id: '4', title: '智慧物流', color: '#B59EFF', icon: 'f-icon f-icon-engineering', path: '/domain/smart-logistics', creater: 'user01', status: 'editing', description: '智慧物流是通过智能软硬件、物联网、大数据等智慧化技术手段,实现物流各环节精细化、动态化、可视化管理,提高物流系统智能化分析决策和自动化操作执行能力,提升物流运作效率的现代化物流模式。' }, + // { id: '5', title: '城市应急', color: '#FF7B51', icon: 'f-icon f-icon-engineering', path: '/domain/urban-emergency', creater: 'user01', status: 'testing', description: '城市应急机制是指在应对突发事件中,对政府行政权力进行应急配置而形成的权力运行机制。' }, + // { id: '6', title: '智慧园区', color: '#B59EFF', icon: 'f-icon f-icon-engineering', path: '/domain/smart-parks', creater: 'user01', status: 'testing', description: '智慧园区平台主要包含三大模块:智能化应用系统、绿色节能管理和政务办公服务平台。' }, + // { id: '7', title: '智慧水务', color: '#30c87b', icon: 'f-icon f-icon-engineering', path: '/domain/smart-water-plant', creater: 'user01', status: 'published', description: '智慧水务是通过新一代信息技术与水务技术的深度融合,充分发掘数据价值和逻辑关系,实现水务业务系统的控制智能化、数据资源化、管理精确化、决策智慧化' }, + // { id: '8', title: '智能粮库', color: '#4D98FF', icon: 'f-icon f-icon-engineering', path: '/domain/smart-grain-depot', creater: 'user01', status: 'editing', description: '智能粮库' }, + // { id: '9', title: '智慧车间', color: '#4D98FF', icon: 'f-icon f-icon-engineering', path: '/domain/smart-workshop', creater: 'user01', status: 'testing', description: '智慧车间' }, + // { id: '10', title: '鱼菜共生', color: '#30c87b', icon: 'f-icon f-icon-engineering', path: '/domain/aquaponics', creater: 'user01', status: 'testing', description: '鱼菜共生' }, + // { id: '11', title: '钻井平台', color: '#4D98FF', icon: 'f-icon f-icon-engineering', path: '/domain/drilling-rigs', creater: 'user01', status: 'published', description: '钻井平台' }, + // ]); + + function createDomain() { } + + function getDomains() { + return new Promise((resolve, reject) => { + axios.get(domainSourceUri).then((response) => { + const domainData = response.data; + domains.value = domainData; + resolve(domainData); + }, (error) => { + resolve([]); + }); + }); + } + + return { createDomain, domains, getDomains }; +} diff --git a/packages/farris-admin/apps/domain/src/main.ts b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/main.ts similarity index 100% rename from packages/farris-admin/apps/domain/src/main.ts rename to packages/farris-admin/apps/platform/domain-platform/customize/domain/src/main.ts diff --git a/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/style.css b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/style.css new file mode 100644 index 0000000000000000000000000000000000000000..ad411c6cefa736bf151270695e3491bde85d2d5f --- /dev/null +++ b/packages/farris-admin/apps/platform/domain-platform/customize/domain/src/style.css @@ -0,0 +1,26 @@ +.solo-admin .f-page, +.solo-admin .f-page::before { + background: 0 0; + box-shadow: none; +} + +.solo-admin .f-page-main { + background: 0 0; + box-shadow: none; +} + +.solo-admin .f-page-header { + margin: 0.5rem; +} + +.solo-admin .f-page-header-base { + background-image: linear-gradient(180deg, #ddecff 0%, #f9fcff 63%); + box-shadow: 0px 1px 10px 0px rgba(90, 102, 133, 0.05); + border-radius: 8px; +} + +.solo-admin .btn-primary { + background-image: linear-gradient(-51deg, #328bff 0%, #2a87ff 100%); + box-shadow: 0 4px 10px 0 rgba(69, 144, 255, 0.25); + border-radius: 15px; +} diff --git a/packages/farris-admin/apps/scenario/index.html b/packages/farris-admin/apps/platform/scenario-platform/customize/scenario/index.html similarity index 100% rename from packages/farris-admin/apps/scenario/index.html rename to packages/farris-admin/apps/platform/scenario-platform/customize/scenario/index.html diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/app-builder-functions.json b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/app-builder-functions.json new file mode 100644 index 0000000000000000000000000000000000000000..a96396adbed6130065ad4ececb9c14da3a86fb41 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/app-builder-functions.json @@ -0,0 +1,122 @@ +[ + { + "id": "profile", + "code": "Profile", + "name": "应用信息", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/SystemFoundation.svg", + "description": null, + "pinyin": null, + "simpinyin": null, + "child": null + }, + { + "id": "work-flow", + "code": "WorkFlow", + "name": "业务流程", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/SystemFoundation.svg", + "description": null, + "pinyin": null, + "simpinyin": null, + "child": null + }, + { + "id": "devices", + "code": "Devices", + "name": "设备管理", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/businessplatform.svg", + "description": "BFZT", + "pinyin": null, + "simpinyin": null, + "child": null + }, + { + "id": "pages", + "code": "Pages", + "name": "页面管理", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/SystemFoundation.svg", + "description": null, + "pinyin": null, + "simpinyin": null, + "child": null + }, + { + "id": "page-flow", + "code": "PageFlow", + "name": "页面流管理", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/SystemFoundation.svg", + "description": null, + "pinyin": null, + "simpinyin": null, + "child": null + }, + { + "id": "menu", + "code": "Menu", + "name": "菜单管理", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/SystemFoundation.svg", + "description": null, + "pinyin": null, + "simpinyin": null, + "child": null + }, + { + "id": "variables", + "code": "Variables", + "name": "全局变量", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/SystemFoundation.svg", + "description": null, + "pinyin": null, + "simpinyin": null, + "child": null + }, + { + "id": "analysis", + "code": "Analysis", + "name": "质量保障", + "parentId": "0", + "layer": "1", + "menuType": "", + "funcType": "1", + "menuPath": "", + "icon": "./assets/icon/SystemFoundation.svg", + "description": null, + "pinyin": null, + "simpinyin": null, + "child": null + } +] \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/app-builder-work-areas.json b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/app-builder-work-areas.json new file mode 100644 index 0000000000000000000000000000000000000000..8301fcdf0e252a58c5dbf17ae2d820e7b68a045d --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/app-builder-work-areas.json @@ -0,0 +1,103 @@ +[ + { + "id": "profile", + "code": "profile", + "name": "应用信息" + }, + { + "id": "work-flow", + "code": "work-flow", + "name": "业务流程", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/apps/platform/development-platform/ide/app-builder/assets/default-home.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ] + }, + { + "id": "devices", + "code": "devices", + "name": "设备管理", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/apps/platform/development-platform/ide/app-builder/assets/default-home.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ] + }, + { + "id": "pages", + "code": "pages", + "name": "页面管理", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/platform/dev/main/web/webide/newide/index.html?path=/SagiDemo/SagiDemeModule/CommonDictionaries&boId=d8b09de6-5e7c-bfdf-d308-468827ba0d6b&ws=625s7acd&version=2.0#/home", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ], + "showHeader": false + }, + { + "id": "page-flow", + "code": "page-flow", + "name": "页面流", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/apps/platform/development-platform/ide/app-builder/assets/default-home.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ] + }, + { + "id": "menu", + "code": "menu", + "name": "菜单管理" + }, + { + "id": "variables", + "code": "variables", + "name": "全局变量" + }, + { + "id": "analysis", + "code": "analysis", + "name": "质量保障" + }, + { + "id": "default", + "code": "default", + "name": "default", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/apps/platform/development-platform/ide/app-builder/assets/default-home.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ] + } +] \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/config-default.json b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/config-default.json new file mode 100644 index 0000000000000000000000000000000000000000..2a07e4379690f9be41c22c202ac0ec80cc494c30 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/config-default.json @@ -0,0 +1,28 @@ +{ + "title": "智慧矿山", + "emptyFunctionPage": "./assets/empty-page.html", + "functionSourceUri": "./assets/app-builder-functions.json", + "workAreaSourceUri": "./assets/app-builder-work-areas.json", + "residentFunctions": [], + "residentWorkAreas": [ + { + "workAreaId": "default", + "instanceId": "default", + "code": "default", + "name": "default", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/apps/platform/development-platform/ide/app-builder/assets/default-home.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ] + } + ], + "resolveFunctionUri": "/api/runtime/sys/v1.0/functions/funcInvok", + "fallbackResovleFunctionUri": "" +} \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/default-home.html b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/default-home.html new file mode 100644 index 0000000000000000000000000000000000000000..1ec4b4ef61808c0697b8df1dd25d03da01cd98aa --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/default-home.html @@ -0,0 +1,16 @@ + + + + + + + Farris Admin Default Home + + + +
+

Farris Admin Default Home

+
+ + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/SystemFoundation.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/SystemFoundation.svg new file mode 100644 index 0000000000000000000000000000000000000000..ebc54f268e50d7feff2c5198df9b26d566392308 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/SystemFoundation.svg @@ -0,0 +1,23 @@ + + + 系统公共 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/aiplatform.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/aiplatform.svg new file mode 100644 index 0000000000000000000000000000000000000000..2d1c8359ae17ac2aa92ef7ea18332bf8b1d69f6f --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/aiplatform.svg @@ -0,0 +1,8 @@ + + + 3 + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/businessplatform.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/businessplatform.svg new file mode 100644 index 0000000000000000000000000000000000000000..f33376e90af9bf137ca0fffecac06e3d13944691 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/businessplatform.svg @@ -0,0 +1,22 @@ + + + 业务公共 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/businessplatform2.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/businessplatform2.svg new file mode 100644 index 0000000000000000000000000000000000000000..4f90ef6f7ae7741c92654d6d667e94a4ee48b307 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/businessplatform2.svg @@ -0,0 +1,15 @@ + + + 业务定制平台 + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/cms.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/cms.svg new file mode 100644 index 0000000000000000000000000000000000000000..7edbd8c070eb3ebd1c9d577f49fb133cba5e8222 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/cms.svg @@ -0,0 +1,20 @@ + + + 内容管理 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/dev.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/dev.svg new file mode 100644 index 0000000000000000000000000000000000000000..def6d6b601a8260569c8e731f8ef1b7eacc92bb4 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/dev.svg @@ -0,0 +1,21 @@ + + + 开发平台 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/hip.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/hip.svg new file mode 100644 index 0000000000000000000000000000000000000000..046ba62e0f17917ca0c48440d234127fe37c7d26 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/hip.svg @@ -0,0 +1,30 @@ + + + 集成平台 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/iconfont.css b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..0ef374b24a1acb4f70e6218d6ef764f42a93e487 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/iconfont.css @@ -0,0 +1,490 @@ +@font-face { + font-family: 'fd-i-Family'; + src: url('iconfont.ttf?t=1640255080725') format('truetype'); +} + +.fd-i-Family { + font-family: 'fd-i-Family' !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.fd_pc-response-layout-4:before { + content: '\e601'; +} + +.fd_pc-response-layout-3:before { + content: '\e602'; +} + +.fd_pc-response-layout-2:before { + content: '\e603'; +} + +.fd_pc-response-layout-1:before { + content: '\e604'; +} +.fd_pc-city-selector:before { + content: '\e600'; +} +.fd_pc-shenpiyijian:before { + content: '\e073'; +} + +.fd_pc-eventCode:before { + content: '\e071'; +} + +.fd_pc-delete-element:before { + content: '\e070'; +} + +.fd_pc-enable-function:before { + content: '\e06f'; +} + +.fd_pc-dragHandler:before { + content: '\e06e'; +} + +.fd_pc-editEvent:before { + content: '\e06d'; +} + +.fd_pc-extend-setting:before { + content: '\e06c'; +} + +.fd_pc-variable-setting:before { + content: '\e06b'; +} + +.fd_pc-leaf-node:before { + content: '\e06a'; +} + +.fd_pc-import-from-cdm:before { + content: '\e069'; +} + +.fd_pc-root-node:before { + content: '\e068'; +} + +.fd_pc-push:before { + content: '\e6067'; +} + +.fd_pc-save-sync:before { + content: '\e066'; +} + +.fd_pc-delete-obj:before { + content: '\e065'; +} + +.fd_pc-sync-bizelements:before { + content: '\e064'; +} + +.fd_pc-basic-info:before { + content: '\e063'; +} + +.fd_pc-advanced-setting:before { + content: '\e062'; +} + +.fd_pc-add-new-element:before { + content: '\e061'; +} + +.fd_pc-corner-marks-right-bottom:before { + content: '\e060'; +} + +.fd_pc-add-virtual-element:before { + content: '\e05f'; +} + +.fd_pc-cancel:before { + content: '\e05e'; +} + +.fd_pc-add-child-obj:before { + content: '\e05d'; +} + +.fd_pc-add-same-obj:before, +.fd_pc-imageupload:before { + content: '\e05c'; +} + +.fd_pc-yilaiguanxi:before { + content: '\e05b'; +} + +.fd_pc-shanchu:before { + content: '\e05a'; +} + +.fd_pc-gengduo:before { + content: '\e059'; +} + +.fd_pc-git:before { + content: '\e058'; +} + +.fd_pc-shouji:before { + content: '\e057'; +} + +.fd_pc-diannao:before { + content: '\e056'; +} + +.fd_pc-quanxian:before { + content: '\e055'; +} + +.fd_pc-daorudaochu:before { + content: '\e054'; +} + +.fd_pc-dayinshezhi:before { + content: '\e053'; +} + +.fd_pc-yewuliu:before { + content: '\e052'; +} + +.fd_pc-shujuzhuanhuanguize:before { + content: '\e051'; +} + +.fd_pc-shenjirizhi:before { + content: '\e050'; +} + +.fd_pc-bianmaguize:before { + content: '\e04f'; +} + +.fd_pc-zhuanyebanshejiqi:before { + content: '\e04e'; +} + +.fd_pc-lingdaimashejiqi:before { + content: '\e04d'; +} + +.fd_pc-didaimashejiqi:before { + content: '\e04c'; +} + +.fd_pc-geshidingzhi:before { + content: '\e04b'; +} + +.fd_pc-kuozhankaifa:before { + content: '\e04a'; +} + +.fd_pc-dingzhi:before { + content: '\e049'; +} + +.fd_pc-ziyuanguanliqi:before { + content: '\e048'; +} + +.fd_pc-zhedieshouqi:before { + content: '\e047'; +} + +.fd_pc-zhediezhankai:before { + content: '\e046'; +} + +.fd_pc-xianshiID:before { + content: '\e045'; +} + +.fd_pc-sousuo:before { + content: '\e044'; +} + +.fd_pc-shuaxin:before { + content: '\e043'; +} + +.fd_pc-anheimoshiqidongtai:before { + content: '\e042'; +} + +.fd_pc-anheimoshi:before { + content: '\e041'; +} +.fd_pc-tag:before { + content: '\e040'; +} + +.fd_pc-html-template:before { + content: '\e03f'; +} + +.fd_pc-button-group:before { + content: '\e03e'; +} + +.fd_pc-display-field:before, +.fd_pc-static-text:before { + content: '\e03d'; +} + +.fd_pc-QdpFramework:before { + content: '\e03c'; +} + +.fd_pc-check-group:before { + content: '\e03b'; +} + +.fd_pc-list-nav:before { + content: '\e03a'; +} + +.fd_pc-nav-tab:before { + content: '\e039'; +} + +.fd_pc-file-upload:before { + content: '\e038'; +} + +.fd_pc-section:before { + content: '\e037'; +} + +.fd_pc-jingtaiwenben:before { + content: '\e036'; +} + +.fd_pc-discussion-list:before { + content: '\e035'; +} + +.fd_pc-personnel-selector:before { + content: '\e034'; +} + +.fd_pc-gags:before { + content: '\e033'; +} + +.fd_pc-module:before { + content: '\e032'; +} + +.fd_pc-multi-select:before { + content: '\e031'; +} + +.fd_pc-sidebar:before { + content: '\e030'; +} + +.fd_pc-steps:before { + content: '\e02f'; +} + +.fd_pc-splitter:before { + content: '\e02e'; +} + +.fd_pc-scrollspy:before { + content: '\e02d'; +} + +.fd_pc-multi-view-container:before { + content: '\e02c'; +} + +.fd_pc-list-view:before { + content: '\e02b'; +} + +.fd_pc-charts:before { + content: '\e02a'; +} + +.fd_pc-image:before { + content: '\e029'; +} + +.fd_pc-scroll-collapsible-area:before { + content: '\e028'; +} + +.fd_pc-modal-footer:before { + content: '\e027'; +} + +.fd_pc-wizard:before { + content: '\e026'; +} + +.fd_pc-page-header:before { + content: '\e025'; +} + +.fd_pc-component:before { + content: '\e024'; +} + +.fd_pc-data-grid:before { + content: '\e023'; +} + +.fd_pc-mingxibiao2:before { + content: '\e022'; +} + +.fd_pc-tubiao:before { + content: '\e021'; +} + +.fd_pc-query-solution:before { + content: '\e020'; +} + +.fd_pc-liushuihao:before { + content: '\e01f'; +} + +.fd_pc-switch:before { + content: '\e01e'; +} + +.fd_pc-lookup:before { + content: '\e01d'; +} + +.fd_pc-erweima:before { + content: '\e01c'; +} + +.fd_pc-radio-group:before { + content: '\e01b'; +} + +.fd_pc-organization-selector:before { + content: '\e01a'; +} + +.fd_pc-approval-logs:before { + content: '\e019'; +} + +.fd_pc-combo-list:before { + content: '\e018'; +} + +.fd_pc-input-group:before { + content: '\e017'; +} + +.fd_pc-textarea:before { + content: '\e016'; +} + +.fd_pc-tabs:before { + content: '\e015'; +} + +.fd_pc-OCR:before { + content: '\e014'; +} + +.fd_pc-number-spinner:before { + content: '\e013'; +} + +.fd_pc-field-set:before { + content: '\e012'; +} + +.fd_pc-list-filter:before { + content: '\e011'; +} + +.fd_pc-avatar:before { + content: '\e010'; +} + +.fd_pc-date-picker:before { + content: '\e00f'; +} + +.fd_pc-language-text-box:before { + content: '\e00e'; +} + +.fd_pc-discussion-editor:before { + content: '\e00d'; +} + +.fd_pc-button:before { + content: '\e00c'; +} + +.fd_pc-yuyinshuru:before { + content: '\e00b'; +} + +.fd_pc-rich-text-box:before { + content: '\e00a'; +} + +.fd_pc-dizhi:before { + content: '\e009'; +} + +.fd_pc-time-picker:before { + content: '\e008'; +} + +.fd_pc-input-group:before { + content: '\e007'; +} + +.fd_pc-view-model:before { + content: '\e006'; +} + +.fd_pc-check-box:before { + content: '\e005'; +} + +.fd_pc-file-upload:before { + content: '\e004'; +} + +.fd_pc-tree-grid:before { + content: '\e003'; +} + +.fd_pc-response-form:before { + content: '\e002'; +} + +.fd_pc-content-container:before { + content: '\e001'; +} + +.fd_pc-fenlanmianban:before { + content: '\e000'; +} diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/iconfont.ttf b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ae8d3ff7e1832d16ec45ed40a09b4972d1a7fb13 Binary files /dev/null and b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/iconfont.ttf differ diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/portal.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/portal.svg new file mode 100644 index 0000000000000000000000000000000000000000..7a0936bc02b6afee6a5e017c748188aa24f6bc85 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/portal.svg @@ -0,0 +1,22 @@ + + + 企业门户 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/wf.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/wf.svg new file mode 100644 index 0000000000000000000000000000000000000000..f5c735efa7ff651177b5ff46057bd61dd2c3fce8 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/wf.svg @@ -0,0 +1,21 @@ + + + 流程平台 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/xietongbangong.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/xietongbangong.svg new file mode 100644 index 0000000000000000000000000000000000000000..d78171b38c274c28b798cd1e3d2270c26058a6fa --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/icon/xietongbangong.svg @@ -0,0 +1,15 @@ + + + 协同办公 + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background-icon.png b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7402042b47e72d78aa69c6e6a747a388992606c6 Binary files /dev/null and b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background-icon.png differ diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background.png b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background.png new file mode 100644 index 0000000000000000000000000000000000000000..00a4e24ef2163e6b49d36f96d55ce1ebbf00e42e Binary files /dev/null and b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/analysis-task-card-background.png differ diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/card-background.png b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/card-background.png new file mode 100644 index 0000000000000000000000000000000000000000..958a29e5351ebaf0825dd3509185c8d43e80fdd6 Binary files /dev/null and b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/card-background.png differ diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/farris_design_light.png b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/farris_design_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bdce3482e283bec8e6f0a8ed55c4890ae70d2bbb Binary files /dev/null and b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/farris_design_light.png differ diff --git a/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/top.svg b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/top.svg new file mode 100644 index 0000000000000000000000000000000000000000..699590e509dc8e640cbd8750963e5297039820b9 --- /dev/null +++ b/packages/farris-admin/public/apps/platform/development-platform/ide/app-builder/assets/images/top.svg @@ -0,0 +1,31 @@ + + + 背景@1x + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/farris-admin/public/apps/platform/domain-platform/customize/domain/assets/domains.json b/packages/farris-admin/public/apps/platform/domain-platform/customize/domain/assets/domains.json new file mode 100644 index 0000000000000000000000000000000000000000..7d57eb2ca13dcd8b1773b4ffd002e8dcff9bedda --- /dev/null +++ b/packages/farris-admin/public/apps/platform/domain-platform/customize/domain/assets/domains.json @@ -0,0 +1,112 @@ +[ + { + "id": "1", + "title": "智慧矿山", + "color": "", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-mine", + "creater": "user01", + "status": "testing", + "description": "智慧矿山是以矿山数字化、信息化为前提和基础,对矿山生产、职业健康与安全、技术支持与后勤保障等进行主动感知、自动分析、快速处理,建设形成的安全、无人、高效、清洁的矿山。" + }, + { + "id": "2", + "title": "智慧楼宇", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-buildings", + "creater": "user01", + "status": "testing", + "description": "智慧楼宇是将建筑、通信、计算机和控制等各方面的先进科技相互融合,能够适应信息化社会发展需求的现代化新型建筑。" + }, + { + "id": "3", + "title": "智能制造", + "color": "#FF7B51", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-manufacturing", + "creater": "user01", + "status": "published", + "description": "智能制造一种由智能机器和人类专家共同组成的人机一体化智能系统,它在制造过程中能进行智能活动,诸如分析、推理、判断、构思和决策等。" + }, + { + "id": "4", + "title": "智慧物流", + "color": "#B59EFF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-logistics", + "creater": "user01", + "status": "editing", + "description": "智慧物流是通过智能软硬件、物联网、大数据等智慧化技术手段,实现物流各环节精细化、动态化、可视化管理,提高物流系统智能化分析决策和自动化操作执行能力,提升物流运作效率的现代化物流模式。" + }, + { + "id": "5", + "title": "城市应急", + "color": "#FF7B51", + "icon": "f-icon f-icon-engineering", + "path": "/domain/urban-emergency", + "creater": "user01", + "status": "testing", + "description": "城市应急机制是指在应对突发事件中,对政府行政权力进行应急配置而形成的权力运行机制。" + }, + { + "id": "6", + "title": "智慧园区", + "color": "#B59EFF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-parks", + "creater": "user01", + "status": "testing", + "description": "智慧园区平台主要包含三大模块:智能化应用系统、绿色节能管理和政务办公服务平台。" + }, + { + "id": "7", + "title": "智慧水务", + "color": "#30c87b", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-water-plant", + "creater": "user01", + "status": "published", + "description": "智慧水务是通过新一代信息技术与水务技术的深度融合,充分发掘数据价值和逻辑关系,实现水务业务系统的控制智能化、数据资源化、管理精确化、决策智慧化" + }, + { + "id": "8", + "title": "智能粮库", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-grain-depot", + "creater": "user01", + "status": "editing", + "description": "智能粮库" + }, + { + "id": "9", + "title": "智慧车间", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-workshop", + "creater": "user01", + "status": "testing", + "description": "智慧车间" + }, + { + "id": "10", + "title": "鱼菜共生", + "color": "#30c87b", + "icon": "f-icon f-icon-engineering", + "path": "/domain/aquaponics", + "creater": "user01", + "status": "testing", + "description": "鱼菜共生" + }, + { + "id": "11", + "title": "钻井平台", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/drilling-rigs", + "creater": "user01", + "status": "published", + "description": "钻井平台" + } +] \ No newline at end of file diff --git a/packages/farris-admin/public/assets/app-config-default.json b/packages/farris-admin/public/assets/app-config-default.json new file mode 100644 index 0000000000000000000000000000000000000000..b45ce17ef6f46f73625be44813e54d8ff265bb03 --- /dev/null +++ b/packages/farris-admin/public/assets/app-config-default.json @@ -0,0 +1,17 @@ +{ + "emptyFunctionPage": "./assets/empty-page.html", + "appDataSourceUri": "/api/runtime/sys/v1.0/business-objects-lock/bolistwithlock", + "residentFunctions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "./assets/default-home.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ], + "resolveFunctionUri": "/api/runtime/sys/v1.0/functions/funcInvok", + "fallbackResovleFunctionUri": "" +} \ No newline at end of file diff --git a/packages/farris-admin/public/assets/config-default.json b/packages/farris-admin/public/assets/config-default.json index ad244d6c5225149f4cfa39ff2ef2f2fef5a0d80c..3c5131cc096bda4d4557e1aa94d3a55cf4205368 100644 --- a/packages/farris-admin/public/assets/config-default.json +++ b/packages/farris-admin/public/assets/config-default.json @@ -1,16 +1,38 @@ { + "title": "场景计算开发平台", "emptyFunctionPage": "./assets/empty-page.html", "functionSourceUri": "./assets/solo-functions.json", + "workAreaSourceUri": "./assets/work-areas.json", + "residentWorkAreas": [ + { + "workAreaId": "default", + "instanceId": "default", + "code": "default", + "name": "default", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/platform/runtime/sys/web/home/index.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ] + } + ], "residentFunctions": [ { "functionId": "home", "instanceId": "home", "code": "home", "name": "", - "url": "./assets/default-home.html", + "url": "/platform/runtime/sys/web/home/index.html", "icon": "f-icon f-icon-index-face", "fix": true } ], - "resolveFunctionUri": "/api/runtime/sys/v1.0/functions/funcInvok" + "resolveFunctionUri": "/api/runtime/sys/v1.0/functions/funcInvok", + "fallbackResovleFunctionUri": "" } \ No newline at end of file diff --git a/packages/farris-admin/public/assets/config-for-inBuilder.json b/packages/farris-admin/public/assets/config-for-inBuilder.json index 4051ea1756576a792081369757ebec1c9e6a2310..e48670410fdf4d8e6418303adf43a2250d2234a5 100644 --- a/packages/farris-admin/public/assets/config-for-inBuilder.json +++ b/packages/farris-admin/public/assets/config-for-inBuilder.json @@ -1,4 +1,5 @@ { + "title":"Farris Admin", "emptyFunctionPage": "./assets/empty-page.html", "functionSourceUri": "/api/runtime/sys/v1.0/functions/funcGroups?funcType=4", "residentFunctions": [ diff --git a/packages/farris-admin/public/assets/domains.json b/packages/farris-admin/public/assets/domains.json new file mode 100644 index 0000000000000000000000000000000000000000..7d57eb2ca13dcd8b1773b4ffd002e8dcff9bedda --- /dev/null +++ b/packages/farris-admin/public/assets/domains.json @@ -0,0 +1,112 @@ +[ + { + "id": "1", + "title": "智慧矿山", + "color": "", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-mine", + "creater": "user01", + "status": "testing", + "description": "智慧矿山是以矿山数字化、信息化为前提和基础,对矿山生产、职业健康与安全、技术支持与后勤保障等进行主动感知、自动分析、快速处理,建设形成的安全、无人、高效、清洁的矿山。" + }, + { + "id": "2", + "title": "智慧楼宇", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-buildings", + "creater": "user01", + "status": "testing", + "description": "智慧楼宇是将建筑、通信、计算机和控制等各方面的先进科技相互融合,能够适应信息化社会发展需求的现代化新型建筑。" + }, + { + "id": "3", + "title": "智能制造", + "color": "#FF7B51", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-manufacturing", + "creater": "user01", + "status": "published", + "description": "智能制造一种由智能机器和人类专家共同组成的人机一体化智能系统,它在制造过程中能进行智能活动,诸如分析、推理、判断、构思和决策等。" + }, + { + "id": "4", + "title": "智慧物流", + "color": "#B59EFF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-logistics", + "creater": "user01", + "status": "editing", + "description": "智慧物流是通过智能软硬件、物联网、大数据等智慧化技术手段,实现物流各环节精细化、动态化、可视化管理,提高物流系统智能化分析决策和自动化操作执行能力,提升物流运作效率的现代化物流模式。" + }, + { + "id": "5", + "title": "城市应急", + "color": "#FF7B51", + "icon": "f-icon f-icon-engineering", + "path": "/domain/urban-emergency", + "creater": "user01", + "status": "testing", + "description": "城市应急机制是指在应对突发事件中,对政府行政权力进行应急配置而形成的权力运行机制。" + }, + { + "id": "6", + "title": "智慧园区", + "color": "#B59EFF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-parks", + "creater": "user01", + "status": "testing", + "description": "智慧园区平台主要包含三大模块:智能化应用系统、绿色节能管理和政务办公服务平台。" + }, + { + "id": "7", + "title": "智慧水务", + "color": "#30c87b", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-water-plant", + "creater": "user01", + "status": "published", + "description": "智慧水务是通过新一代信息技术与水务技术的深度融合,充分发掘数据价值和逻辑关系,实现水务业务系统的控制智能化、数据资源化、管理精确化、决策智慧化" + }, + { + "id": "8", + "title": "智能粮库", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-grain-depot", + "creater": "user01", + "status": "editing", + "description": "智能粮库" + }, + { + "id": "9", + "title": "智慧车间", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/smart-workshop", + "creater": "user01", + "status": "testing", + "description": "智慧车间" + }, + { + "id": "10", + "title": "鱼菜共生", + "color": "#30c87b", + "icon": "f-icon f-icon-engineering", + "path": "/domain/aquaponics", + "creater": "user01", + "status": "testing", + "description": "鱼菜共生" + }, + { + "id": "11", + "title": "钻井平台", + "color": "#4D98FF", + "icon": "f-icon f-icon-engineering", + "path": "/domain/drilling-rigs", + "creater": "user01", + "status": "published", + "description": "钻井平台" + } +] \ No newline at end of file diff --git a/packages/farris-admin/public/assets/images/card-background.png b/packages/farris-admin/public/assets/images/card-background.png new file mode 100644 index 0000000000000000000000000000000000000000..958a29e5351ebaf0825dd3509185c8d43e80fdd6 Binary files /dev/null and b/packages/farris-admin/public/assets/images/card-background.png differ diff --git a/packages/farris-admin/public/assets/images/farris_design_light.png b/packages/farris-admin/public/assets/images/farris_design_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bdce3482e283bec8e6f0a8ed55c4890ae70d2bbb Binary files /dev/null and b/packages/farris-admin/public/assets/images/farris_design_light.png differ diff --git a/packages/farris-admin/public/assets/solo-functions.json b/packages/farris-admin/public/assets/solo-functions.json index e86a4b5f9113677629252809e3682073a79db1e9..768cf773324215b747aae0c7ca4885784f94dfb3 100644 --- a/packages/farris-admin/public/assets/solo-functions.json +++ b/packages/farris-admin/public/assets/solo-functions.json @@ -271,7 +271,7 @@ }, { "id": "CustomizeLCDP", - "code": "CustomizeLCDP", + "code": "platform", "name": "定制平台", "parentId": "0", "layer": "1", @@ -286,7 +286,7 @@ }, { "id": "DomainLCDP", - "code": "DomainLCDP", + "code": "domain-platform", "name": "领域平台", "parentId": "CustomizeLCDP", "layer": "2", @@ -301,7 +301,7 @@ }, { "id": "CustomizeDomain", - "code": "CustomizeDomain", + "code": "customize", "name": "定制领域", "parentId": "DomainLCDP", "layer": "3", @@ -316,7 +316,7 @@ }, { "id": "CustomizeDomainLCDP", - "code": "CustomizeDomainLCDP", + "code": "domain", "name": "领域平台列表", "parentId": "CustomizeDomain", "layer": "4", @@ -331,7 +331,7 @@ }, { "id": "ScenarioLCDP", - "code": "ScenarioLCDP", + "code": "scenario-platform", "name": "场景平台", "parentId": "CustomizeLCDP", "layer": "2", @@ -346,7 +346,7 @@ }, { "id": "CustomizeScenario", - "code": "CustomizeScenario", + "code": "customize", "name": "定制场景", "parentId": "ScenarioLCDP", "layer": "3", @@ -361,7 +361,7 @@ }, { "id": "CustomizeScenarioLCDP", - "code": "CustomizeScenarioLCDP", + "code": "scenario", "name": "场景平台列表", "parentId": "CustomizeScenario", "layer": "4", diff --git a/packages/farris-admin/public/assets/work-areas.json b/packages/farris-admin/public/assets/work-areas.json new file mode 100644 index 0000000000000000000000000000000000000000..a91e0c6d415261ef61509c3965991d7da18dc717 --- /dev/null +++ b/packages/farris-admin/public/assets/work-areas.json @@ -0,0 +1,19 @@ +[ + { + "workAreaId": "default", + "instanceId": "default", + "code": "default", + "name": "default", + "functions": [ + { + "functionId": "home", + "instanceId": "home", + "code": "home", + "name": "", + "url": "/platform/runtime/sys/web/home/index.html", + "icon": "f-icon f-icon-index-face", + "fix": true + } + ] + } +] \ No newline at end of file diff --git a/packages/farris-admin/src/components/component-registry.ts b/packages/farris-admin/src/components/component-registry.ts new file mode 100644 index 0000000000000000000000000000000000000000..0bb0a32a524f95586bdb4de5044b39df18c44a6a --- /dev/null +++ b/packages/farris-admin/src/components/component-registry.ts @@ -0,0 +1,3 @@ +const componentRegistryMap = new Map(); + +export default componentRegistryMap; diff --git a/packages/farris-admin/src/components/content-area/content-area.component.tsx b/packages/farris-admin/src/components/content-area/content-area.component.tsx index e7ba4092962687f2905b02c907f08ec25cf12e4c..52ecfe0435e2cdd361a33aff35bbd9d67166e574 100644 --- a/packages/farris-admin/src/components/content-area/content-area.component.tsx +++ b/packages/farris-admin/src/components/content-area/content-area.component.tsx @@ -1,14 +1,21 @@ -import { defineComponent, inject, withModifiers } from 'vue'; -import { FunctionInstance, UseFunctionInstance } from '../../composition/types'; +import { defineComponent, inject, onMounted, withModifiers } from 'vue'; +import { ConfigOptions, FunctionInstance, UseConfig, UseFunctionInstance } from '../../composition/types'; import './content-area.css'; +import { useFunctionInstance } from '../../composition/use-function-instance'; +import { contentAreaProps, ContentAreaProps } from './content-area.props'; export default defineComponent({ name: 'FAContentArea', + props: contentAreaProps, emits: [], - setup() { - const useFunctionInstanceComposition = inject('f-admin-function-instance') as UseFunctionInstance; - const { activeInstanceId, functionInstances, close } = useFunctionInstanceComposition; + setup(props: ContentAreaProps, context) { + const useConfigInstance = inject('f-admin-config') as UseConfig; + // 初始化功能菜单实例管理服务 + const useFunctionInstanceComposition = useFunctionInstance(useConfigInstance); + // const useFunctionInstanceComposition = inject('f-admin-function-instance') as UseFunctionInstance; + const { activeInstanceId, functionInstances, close, open, openUrl, setResidentInstance } = useFunctionInstanceComposition; + setResidentInstance(props.residentFunctions); function onClickFunctionTabItem(functionInstance: FunctionInstance) { activeInstanceId.value = functionInstance.instanceId; @@ -23,7 +30,7 @@ export default defineComponent({ return classObject; } - function getFunctionContentClass(functionInstance:FunctionInstance){ + function getFunctionContentClass(functionInstance: FunctionInstance) { const classObject = { 'active': functionInstance.instanceId === activeInstanceId.value, 'f-admin-main-tab-content': true @@ -32,15 +39,20 @@ export default defineComponent({ } function renderTabs() { - return functionInstances.value.map((tabItem: FunctionInstance) => { - return
onClickFunctionTabItem(tabItem)}> - {tabItem.icon && } - {tabItem.name && {tabItem.name}} - {!tabItem.fix &&
close(tabItem.instanceId), ['stop'])}> - -
} -
; - }); + return
+
+ {functionInstances.value.map((tabItem: FunctionInstance) => { + return
onClickFunctionTabItem(tabItem)}> + {tabItem.icon && } + {tabItem.name && {tabItem.name}} + {!tabItem.fix &&
close(tabItem.instanceId), ['stop'])}> + +
} +
; + })} +
+
+
; } function renderContents() { @@ -51,16 +63,26 @@ export default defineComponent({ }); } + onMounted(() => { + window.addEventListener('message', (message: MessageEvent) => { + const messageEvent = message.data; + if (typeof messageEvent === 'object' && messageEvent.eventType === 'invoke') { + const invokeMethod = messageEvent.method; + if (invokeMethod === 'openUrl') { + const [functionId, code, name, url] = messageEvent.params; + openUrl(functionId, code, name, url); + } + } + }); + }); + + context.expose({ open }); + return () => { return (
-
-
- {renderTabs()} -
-
-
+ {props.showHeader && renderTabs()}
{renderContents()}
diff --git a/packages/farris-admin/src/components/content-area/content-area.css b/packages/farris-admin/src/components/content-area/content-area.css index a0622c22d28c34ab94b221e8eb4a1269fe8ed512..6bb7bf2639e032d1791bff16f598a1df1a242635 100644 --- a/packages/farris-admin/src/components/content-area/content-area.css +++ b/packages/farris-admin/src/components/content-area/content-area.css @@ -72,6 +72,7 @@ .f-admin-main-content { flex: 1; + margin: 0 24px; position: relative; } @@ -80,6 +81,8 @@ position: absolute; width: 100%; height: 100%; + /* width: calc(100% - 36px); */ + /* height: calc(100% - 18px);} */ } .f-admin-main-content .f-admin-main-tab-content.active { diff --git a/packages/farris-admin/src/components/content-area/content-area.props.ts b/packages/farris-admin/src/components/content-area/content-area.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d685e0560429c306564cc7719a3b024504a7012 --- /dev/null +++ b/packages/farris-admin/src/components/content-area/content-area.props.ts @@ -0,0 +1,8 @@ +import { ExtractPropTypes } from "vue"; + +export const contentAreaProps = { + residentFunctions: { type: Array, default: [] }, + showHeader: { type: Boolean, default: true } +}; + +export type ContentAreaProps = ExtractPropTypes; diff --git a/packages/farris-admin/src/components/frame/frame.component.tsx b/packages/farris-admin/src/components/frame/frame.component.tsx index fe6ec056d896b64b1e91edccff2afe7fd3638f09..0db9210109af7d3f2b7403d3fe488dec6fa0bee1 100644 --- a/packages/farris-admin/src/components/frame/frame.component.tsx +++ b/packages/farris-admin/src/components/frame/frame.component.tsx @@ -2,10 +2,12 @@ import { computed, defineComponent, onMounted, provide, ref } from 'vue'; import FANavigation from '../navigation/navigation.component'; import FANavigationCompact from '../navigation/navigation-compact.component'; import FAContentArea from '../content-area/content-area.component'; -import { ConfigOptions } from '../../composition/types'; +import { ConfigOptions, FunctionItem, WorkAreaInstance } from '../../composition/types'; import { useConfig } from '../../composition/use-config'; import { useFunctionInstance } from '../../composition/use-function-instance'; import { useMenuData } from '../../composition/use-menu-data'; +import { useWorkAreaInstance } from '../../composition/use-work-area-instance'; +import innerComponentRegistry from '../component-registry'; import './frame.css'; @@ -15,18 +17,26 @@ export default defineComponent({ setup() { const adminMainElementRef = ref(); const sideBarCollapsed = ref(false); + const title = ref(''); + // const workAreaMap = new Map(); // 初始化Farris Admin全局配置对象 const config = useConfig(); // 初始化Farris Admin全局配置对象,并记录初始化异步对象,用于监听初始化完成事件 const configInitialized = config.initialize(); // 初始化功能菜单实例管理服务 const useFunctionInstanceComposition = useFunctionInstance(config); + + const useWorkAreaInstanceComposition = useWorkAreaInstance(); + const { activeInstanceId, workAreaInstances, workAreaInstanceMap } = useWorkAreaInstanceComposition; // 初始化导航菜单数据 const useMenuDataComposition = useMenuData(); // 监听Farris Admin全局配置对象初始化完成事件 configInitialized.then((result: ConfigOptions) => { + title.value = result.title; + useWorkAreaInstanceComposition.loadWorkAreaConfiguration(result.workAreaSourceUri); + // useWorkAreaInstanceComposition.setResidentInstance(result.residentWorkAreas); // 根据配置选项设置初始状态下打开的预制菜单,默认状态下为用户工作中心首页 - useFunctionInstanceComposition.setResidentInstance(result.residentFunctions); + // useFunctionInstanceComposition.setResidentInstance(result.residentFunctions); // 根据配置选项提供的功能菜单数据源Url地址生成功能菜单数据源 useMenuDataComposition.generateFunctionMenu(result.functionSourceUri); }); @@ -50,11 +60,32 @@ export default defineComponent({ }; return classObject; }); + + function getWorkAreaClass(workAreaInstance: WorkAreaInstance) { + const classObject = { + 'active': workAreaInstance.id === activeInstanceId.value, + } as Record; + return classObject; + } + function onClickSidebarHandle() { sideBarCollapsed.value = !sideBarCollapsed.value; } + function onActiveWorkArea(workAreaId: string) { + if (workAreaInstanceMap.has(workAreaId)) { + activeInstanceId.value = workAreaId; + } + } + + function onOpenFunction(functionItem: FunctionItem) { + const activeWorkArea = workAreaInstanceMap.get(activeInstanceId.value); + if (activeWorkArea.value) { + activeWorkArea.value.open(functionItem); + } + } + function renderSidebarHandle() { return ; } + function renderWorkAreas() { + return workAreaInstances.value.map((workAreaInstance: WorkAreaInstance) => { + const workAreaInstanceRef = workAreaInstanceMap.get(workAreaInstance.id); + if (innerComponentRegistry.has(workAreaInstance.id)) { + const InnerComponent = innerComponentRegistry.get(workAreaInstance.id); + return ; + } + return ; + }); + } + // 在依赖注入服务中注册功能菜单实例管理服务 provide('f-admin-function-instance', useFunctionInstanceComposition); // 在依赖注入服务中注册功能菜单数据服务 provide('f-admin-menu-data', useMenuDataComposition); + provide('f-admin-config', config); + onMounted(() => { // 在依赖注入服务中注册Farris Admin主框架Html元素 provide('f-admin-main-element', adminMainElementRef.value); @@ -80,12 +124,13 @@ export default defineComponent({
- {!sideBarCollapsed.value && } - {sideBarCollapsed.value && } + {!sideBarCollapsed.value && } + {sideBarCollapsed.value && } {renderSidebarHandle()}
- + {renderWorkAreas()} + {/* */}
diff --git a/packages/farris-admin/src/components/function-board/function-board.component.tsx b/packages/farris-admin/src/components/function-board/function-board.component.tsx index 619eece8e9aba785698e5d4acf7c505d84947014..16badc84a396602df37fc8cf117d8f55a57f0162 100644 --- a/packages/farris-admin/src/components/function-board/function-board.component.tsx +++ b/packages/farris-admin/src/components/function-board/function-board.component.tsx @@ -8,7 +8,7 @@ import './function-board.css'; export default defineComponent({ name: 'FAFunctionBoard', props: functionBoardProps, - emits: ['FunctionOpened'], + emits: ['FunctionOpened', 'OpenFunction'], setup(props: FunctionBoardProps, context) { // 记录功能列表元素 const functionListViewRef = ref(); @@ -50,7 +50,8 @@ export default defineComponent({ } function onClickFunctionItem(functionItem: FunctionItem) { - open(functionItem); + // open(functionItem); + context.emit('OpenFunction', functionItem); context.emit('FunctionOpened'); } diff --git a/packages/farris-admin/src/components/navigation/navigation-compact.component.tsx b/packages/farris-admin/src/components/navigation/navigation-compact.component.tsx index f4b6215253dcf25bba765cc3f1cb919d22121638..d816923ef7bd341fb2d76a95b9685c84e9648f41 100644 --- a/packages/farris-admin/src/components/navigation/navigation-compact.component.tsx +++ b/packages/farris-admin/src/components/navigation/navigation-compact.component.tsx @@ -1,6 +1,6 @@ import { computed, defineComponent, inject, nextTick, onMounted, ref } from 'vue'; import { FListView, FPopover } from '@farris/ui-vue/components'; -import { navigationProps } from './navigation.props'; +import { NavigationProps, navigationProps } from './navigation.props'; import FFunctionNavigation from '../function-board/function-board.component'; import { FunctionItem, MenuGroup, MenuGroupItem, UseMenuData } from '../../composition/types'; @@ -9,8 +9,8 @@ import './navigation.css'; export default defineComponent({ name: 'Vertical Navigation Compact', props: navigationProps, - emits: [], - setup() { + emits: ['OpenFunction'], + setup(props: NavigationProps, context) { const useMenuDataComposition = inject('f-admin-menu-data') as UseMenuData; const { menuData, menuMap } = useMenuDataComposition; const navigationPanelRef = ref(); @@ -55,12 +55,18 @@ export default defineComponent({ functionGroups: [] }; currentMenuGroupItems.value = [defaultMenuItem, ...item.items]; - nextTick(() => { - if (popoverRef.value) { - popoverRef.value.show(popoverReference); - } - showPopover.value = true; - }); + if (item.items.length) { + nextTick(() => { + if (popoverRef.value) { + popoverRef.value.show(popoverReference); + } + showPopover.value = true; + }); + } + } + + function onOpenFunction(functionItem: FunctionItem) { + context.emit('OpenFunction', functionItem); } function renderPopoverPanel() { @@ -76,7 +82,12 @@ export default defineComponent({ onHidden={() => { showPopover.value = false; }}> - + ); } diff --git a/packages/farris-admin/src/components/navigation/navigation.component.tsx b/packages/farris-admin/src/components/navigation/navigation.component.tsx index 8033749d581ab7a856c8ede42f05483af5bc4361..047360beff0540143fb26afd2ab97ee71e9661c2 100644 --- a/packages/farris-admin/src/components/navigation/navigation.component.tsx +++ b/packages/farris-admin/src/components/navigation/navigation.component.tsx @@ -1,6 +1,6 @@ import { computed, defineComponent, inject, onMounted, ref } from 'vue'; import { FAccordion, FAccordionItem, FListView, FPopover, FSearchBox } from '@farris/ui-vue/components'; -import { navigationProps } from './navigation.props'; +import { NavigationProps, navigationProps } from './navigation.props'; import { FunctionItem, MenuGroup, MenuGroupItem, UseMenuData } from '../../composition/types'; import FFunctionNavigation from '../function-board/function-board.component'; @@ -9,8 +9,8 @@ import './navigation.css'; export default defineComponent({ name: 'Vertical Navigation', props: navigationProps, - emits: [], - setup() { + emits: ['OpenFunction', 'ActiveWorkArea'], + setup(props: NavigationProps, context) { const useMenuDataComposition = inject('f-admin-menu-data') as UseMenuData; const { menuData, menuMap } = useMenuDataComposition; const navigationPanelRef = ref(); @@ -33,8 +33,9 @@ export default defineComponent({ } } - function onClickMenuGroupHeader() { + function onClickMenuGroupHeader(menuGroupId: string) { resetMenuItemSelectionStatus(); + context.emit('ActiveWorkArea', menuGroupId); } function onClickMenuItem(payload: MouseEvent, item: MenuGroupItem) { @@ -49,6 +50,10 @@ export default defineComponent({ showPopover.value = true; } + function onOpenFunction(functionItem: FunctionItem) { + context.emit('OpenFunction', functionItem); + } + function renderPopoverPanel() { return ( { showPopover.value = false; }}> - + ); } @@ -89,8 +97,8 @@ export default defineComponent({ function renderNavigationMenu(menuGroups: any[]) { return {menuGroups.map((menuGroup: MenuGroup) => { - return - {renderMenuItems(menuGroup, menuGroup.items)} + return 0} iconUri={menuGroup.icon} title={menuGroup.name} onClickHeader={() => onClickMenuGroupHeader(menuGroup.id)}> + {menuGroup.items.length > 0 && renderMenuItems(menuGroup, menuGroup.items)} ; })} ; @@ -146,7 +154,7 @@ export default defineComponent({
{context.slots.toolbar && context.slots.toolbar()}
diff --git a/packages/ui-vue/components/accordion/src/components/accordion-item.props.ts b/packages/ui-vue/components/accordion/src/components/accordion-item.props.ts index 9f0ab0e67933ccca56d3b90027e1fdee85de1447..94f1cf5f5a41c5d7de55f748ba1eb5eff048e234 100644 --- a/packages/ui-vue/components/accordion/src/components/accordion-item.props.ts +++ b/packages/ui-vue/components/accordion/src/components/accordion-item.props.ts @@ -17,12 +17,12 @@ import { ExtractPropTypes } from 'vue'; import { createPropsResolver } from '@farris/ui-vue/components/dynamic-resolver'; import { schemaMapper } from '../schema/schema-mapper'; import accordionItemSchema from '../schema/accordion-item.schema.json'; -import { autoResetRef } from '@vueuse/core'; export const accordionItemProps = { active: { type: Boolean, default: false }, customClass: { type: String, default: '' }, disabled: { type: Boolean, default: false }, + enableFold: { type: Boolean, default: true }, height: { type: Number }, iconUri: { type: String, default: '' }, maxHeight: { type: Number }, diff --git a/packages/ui-vue/components/binding-selector/src/binding-selector.props.ts b/packages/ui-vue/components/binding-selector/src/binding-selector.props.ts index 4da8379796d44540d135b383a5f8557f603257be..ed8589a6a782d7f474aaa67aabb775700b2881eb 100644 --- a/packages/ui-vue/components/binding-selector/src/binding-selector.props.ts +++ b/packages/ui-vue/components/binding-selector/src/binding-selector.props.ts @@ -1,4 +1,4 @@ -import { DesignerHostService } from "@farris/ui-vue/components/designer-canvas"; +import { DesignerHost } from "@farris/ui-vue/components/designer-canvas"; import { createPropsResolver } from "@farris/ui-vue/components/dynamic-resolver"; import { ExtractPropTypes, PropType } from "vue"; import bindingSelectorSchema from './schema/binding-selector.schema.json'; @@ -37,7 +37,7 @@ export interface BindingSelectorEditorParams { /** 当前控件所属的视图模型id */ viewModelId: { type: string, default: '' }, /** 设计器服务类 */ - designerHostService: { type: DesignerHostService }, + designerHostService: { type: DesignerHost }, /** 表单中已使用的字段是否需要设置为禁用 */ disableOccupiedFields: { type: boolean, default: false }, diff --git a/packages/ui-vue/components/binding-selector/src/composition/use-field-selection.ts b/packages/ui-vue/components/binding-selector/src/composition/use-field-selection.ts index 54ed88eadc1843e0e51a5d45faeeb472c7844c5f..2df21ae508fda1a30134fd2e824819c529f1bf2f 100644 --- a/packages/ui-vue/components/binding-selector/src/composition/use-field-selection.ts +++ b/packages/ui-vue/components/binding-selector/src/composition/use-field-selection.ts @@ -6,7 +6,7 @@ import { FormSchemaEntityField$Type } from "@farris/ui-vue/components/common"; export function useFieldSelection(props: BindingSelectorProps) { - const { designViewModelUtils, schemaService, formSchemaUtils } = props.editorParams.designerHostService; + const { designViewModel, entitySchema, pageSchema } = props.editorParams.designerHostService; const { viewModelId } = props.editorParams; let fieldTreeData = []; let localeVariableTreeData = []; @@ -30,24 +30,24 @@ export function useFieldSelection(props: BindingSelectorProps) { } function loadFieldTreeData() { - fieldTreeData = designViewModelUtils.getAllFields2TreeByVMId(viewModelId); + fieldTreeData = designViewModel.getAllFields2TreeByVMId(viewModelId); } function loadLocaleVariableTreeData() { - const viewModel = formSchemaUtils.getViewModelById(viewModelId); + const viewModel = pageSchema.getViewModelById(viewModelId); if (viewModel.parent) { - const rootLocalVars = formSchemaUtils.getLocaleVariablesByViewModelId(viewModel.parent); + const rootLocalVars = pageSchema.getLocaleVariablesByViewModelId(viewModel.parent); if (rootLocalVars && rootLocalVars.length) { rootLocalVars[0].data.name = '根组件'; localeVariableTreeData = localeVariableTreeData.concat(rootLocalVars); } } - const localVars = formSchemaUtils.getLocaleVariablesByViewModelId(viewModelId); + const localVars = pageSchema.getLocaleVariablesByViewModelId(viewModelId); localeVariableTreeData = localeVariableTreeData.concat(localVars); } function loadFormVariableTreeData() { - formVariableTreeData = formSchemaUtils.getRemoteVariables(); + formVariableTreeData = pageSchema.getRemoteVariables(); } /** * 同步视图模型字段 @@ -55,7 +55,7 @@ export function useFieldSelection(props: BindingSelectorProps) { function updataViewModelField(bindingData: Record) { const currentSelectedField = merge({}, bindingData.rawData, { groupId: null, groupName: null }); const originalBinding = props.editorParams.componentSchema?.binding; - const dgViewModel = designViewModelUtils.getDgViewModel(viewModelId); + const dgViewModel = designViewModel.getDgViewModel(viewModelId); // 删除原始绑定信息 if (originalBinding?.field) { @@ -75,7 +75,7 @@ export function useFieldSelection(props: BindingSelectorProps) { function updataViewModelVariable(bindingData: Record) { const originalBinding = props.editorParams.componentSchema?.binding; - const dgViewModel = designViewModelUtils.getDgViewModel(viewModelId); + const dgViewModel = designViewModel.getDgViewModel(viewModelId); const currentSelectedVar = { type: 'Variable', @@ -86,7 +86,7 @@ export function useFieldSelection(props: BindingSelectorProps) { }; // 删除原始绑定信息 if (originalBinding?.field) { - const viewModel = formSchemaUtils.getViewModelById(viewModelId); + const viewModel = pageSchema.getViewModelById(viewModelId); const originalBindingField = viewModel?.fields.find(f => f.id === originalBinding?.field); if (originalBindingField) { currentSelectedVar.groupName = originalBindingField.groupName; @@ -95,7 +95,7 @@ export function useFieldSelection(props: BindingSelectorProps) { dgViewModel.removeField([originalBinding?.field]); } // 向视图模型中添加新字段 - formSchemaUtils.addViewModelField(viewModelId, currentSelectedVar); + pageSchema.addViewModelField(viewModelId, currentSelectedVar); } /** @@ -196,8 +196,8 @@ export function useFieldSelection(props: BindingSelectorProps) { function resolveOccupiedFields(currentBinding: any) { const currentBindingId = currentBinding?.field; const occupiedFieldSet = new Set(); - const formSchema = formSchemaUtils.getFormSchema().module; - const viewModelNode = formSchemaUtils.getViewModelById(viewModelId); + const formSchema = pageSchema.getPageSchema().module; + const viewModelNode = pageSchema.getViewModelById(viewModelId); const componentNode = formSchema.components.find(component => component.viewModel === viewModelId); @@ -294,7 +294,7 @@ export function useFieldSelection(props: BindingSelectorProps) { let isOriginalBindComplexField = false; if (originalBinding.type === FormBindingType.Form) { - const schemaField = schemaService.getFieldByID(originalBinding.field); + const schemaField = entitySchema.getFieldByID(originalBinding.field); if (schemaField) { const oldField = getFieldType(schemaField, FormBindingType.Form); originalFieldType = oldField.fieldType; @@ -304,7 +304,7 @@ export function useFieldSelection(props: BindingSelectorProps) { } } else { - const varField = formSchemaUtils.getVariableById(originalBinding.field); + const varField = pageSchema.getVariableById(originalBinding.field); if (varField) { originalFieldType = varField.type; } diff --git a/packages/ui-vue/components/component/src/composition/field-tree-builder.ts b/packages/ui-vue/components/component/src/composition/field-tree-builder.ts index 0ee33d3f022ae57322a11f32c2b7ab0c1c1480d5..d000445495122191587937c0340ac98e9a31b2be 100644 --- a/packages/ui-vue/components/component/src/composition/field-tree-builder.ts +++ b/packages/ui-vue/components/component/src/composition/field-tree-builder.ts @@ -1,5 +1,5 @@ -import { DesignViewModelField } from "@farris/ui-vue/components/common"; -import { DesignerHostService, DgControl } from "../../../designer-canvas"; +import { DesignViewModelField } from "../../../common"; +import { DesignerHost, DgControl } from "../../../designer-canvas"; import { FormBindingType } from "../../../property-panel"; @@ -29,15 +29,15 @@ export interface FieldTreeNode { */ export class FieldTreeBuilder { private controlsInfo: any = {}; - public formSchemaUtils: any; - public designViewModelUtils: any; + public pageSchema: any; + public designViewModel: any; private viewModelId = ''; - constructor(private designerHostService: DesignerHostService, private componentId: string) { - this.formSchemaUtils = this.designerHostService.formSchemaUtils; - this.designViewModelUtils = this.designerHostService.designViewModelUtils; - this.viewModelId = this.formSchemaUtils.getViewModelIdByComponentId(this.componentId); + constructor(private designerHostService: DesignerHost, private componentId: string) { + this.pageSchema = this.designerHostService.pageSchema; + this.designViewModel = this.designerHostService.designViewModel; + this.viewModelId = this.pageSchema.getViewModelIdByComponentId(this.componentId); } /** @@ -45,11 +45,11 @@ export class FieldTreeBuilder { * @param viewModelId 视图模型标识 */ public buildFieldTreeData(): FieldTreeNode[] { - const dgViewModel = this.designViewModelUtils.getDgViewModel(this.viewModelId); + const dgViewModel = this.designViewModel.getDgViewModel(this.viewModelId); if (!dgViewModel) { return []; } - const component = this.formSchemaUtils.getComponentById(this.componentId); + const component = this.pageSchema.getComponentById(this.componentId); if (!component) { return []; } @@ -172,8 +172,8 @@ export class FieldTreeBuilder { private buildFieldTreeNodeWithBindingVariable(control: any): FieldTreeNode { const bindingFieldId = control.binding.field; - const variable = this.formSchemaUtils.getVariableById(bindingFieldId); - const viewModelNode = this.formSchemaUtils.getViewModelById(this.viewModelId); + const variable = this.pageSchema.getVariableById(bindingFieldId); + const viewModelNode = this.pageSchema.getViewModelById(this.viewModelId); const viewModelFieldElement = viewModelNode?.fields.find(field => field.id === bindingFieldId);; const groupId = viewModelFieldElement && viewModelFieldElement.groupId; @@ -282,7 +282,7 @@ export class FieldTreeBuilder { nodeType: 'group' }; } else { - const viewModelNode = this.formSchemaUtils.getViewModelById(this.viewModelId); + const viewModelNode = this.pageSchema.getViewModelById(this.viewModelId); const viewModelVariableElement = viewModelNode?.fields.find(field => field.id === bindingFieldId);; if (!viewModelVariableElement) { return; diff --git a/packages/ui-vue/components/component/src/composition/use-sibling-component.tsx b/packages/ui-vue/components/component/src/composition/use-sibling-component.tsx index 54a575f789c83a0d57890faf32355541f0fbdce2..0fc61166f290d384b19e57c43423583db9da3134 100644 --- a/packages/ui-vue/components/component/src/composition/use-sibling-component.tsx +++ b/packages/ui-vue/components/component/src/composition/use-sibling-component.tsx @@ -1,9 +1,9 @@ import EntityBindingSelectorComponent from "../../../entity-binding-selector/entity-binding-selector.component"; -import { DesignerHostService, DraggingResolveContext } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DraggingResolveContext } from "../../../designer-canvas/src/composition/types"; import { DesignerItemContext } from "../../../designer-canvas"; import { ModalFunctions } from "../../../modal/src/composition/type"; -export function useSiblingComponent(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService) { +export function useSiblingComponent(designItemContext: DesignerItemContext, designerHostService?: DesignerHost) { /** 弹窗实例 */ let modalEditorRef: ModalFunctions; @@ -57,10 +57,10 @@ export function useSiblingComponent(designItemContext: DesignerItemContext, desi if (!designerHostService) { return; } - const { schemaService, formSchemaUtils } = designerHostService; + const { entitySchema, pageSchema } = designerHostService; const { componentType } = designItemContext.schema; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(designItemContext.componentInstance.value.belongedComponentId); - const bindingEntityInfo = schemaService.getTableInfoByViewModelId(viewModelId); + const viewModelId = pageSchema.getViewModelIdByComponentId(designItemContext.componentInstance.value.belongedComponentId); + const bindingEntityInfo = entitySchema.getTableInfoByViewModelId(viewModelId); const bindingTargetId = bindingEntityInfo?.id; const steps: string[] = ['selectFields']; diff --git a/packages/ui-vue/components/component/src/composition/use-split-component.tsx b/packages/ui-vue/components/component/src/composition/use-split-component.tsx index 9061df624661b8dadbce21d301295f99aba58407..5dd79e439ac2dd175201c93066aeaad306890aba 100644 --- a/packages/ui-vue/components/component/src/composition/use-split-component.tsx +++ b/packages/ui-vue/components/component/src/composition/use-split-component.tsx @@ -1,6 +1,6 @@ import { ref, nextTick } from "vue"; -import { DesignerHostService } from "../../../designer-canvas/src/composition/types"; -import { ComponentSchema, DesignerItemContext, DgControl } from "@farris/ui-vue/components/designer-canvas"; +import { DesignerHost } from "../../../designer-canvas/src/composition/types"; +import { ComponentSchema, DesignerItemContext, DgControl } from "../../../designer-canvas"; import { ModalFunctions } from "../../../modal/src/composition/type"; import SplitterFormComponent from '../components/split-form-component.component'; import { getSchemaByType, schemaMap } from "../../../dynamic-resolver"; @@ -10,7 +10,7 @@ import { refreshCanvas } from "../../../designer-canvas/src/composition/update-c import { cloneDeep } from "lodash-es"; import { FormBindingType } from "@farris/ui-vue/components/property-panel"; -export function useSplitFormComponent(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService) { +export function useSplitFormComponent(designItemContext: DesignerItemContext, designerHostService?: DesignerHost) { /** 弹窗实例 */ let modalEditorRef: ModalFunctions; @@ -137,9 +137,9 @@ export function useSplitFormComponent(designItemContext: DesignerItemContext, de const currentComponentRefIndex = componentRefParentSchema.contents.findIndex(element => element.component === componentId); if (currentComponentRefIndex > -1) { - const { formSchemaUtils } = designerHostService; - formSchemaUtils.getComponents().push(newComponent); - formSchemaUtils.getViewModels().push(newViewModel); + const { pageSchema } = designerHostService; + pageSchema.getComponents().push(newComponent); + pageSchema.getViewModels().push(newViewModel); componentRefParentSchema.contents.splice(currentComponentRefIndex + 1, 0, newComponentRef); } @@ -152,10 +152,10 @@ export function useSplitFormComponent(designItemContext: DesignerItemContext, de return; } const currentComponent = designItemContext.componentInstance.value.schema; - const { schemaService, formSchemaUtils } = designerHostService; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(componentId); - const viewModelNode = formSchemaUtils.getViewModelById(viewModelId); - const { code: tableCode } = schemaService.getTableInfoByViewModelId(viewModelId); + const { entitySchema, pageSchema } = designerHostService; + const viewModelId = pageSchema.getViewModelIdByComponentId(componentId); + const viewModelNode = pageSchema.getViewModelById(viewModelId); + const { code: tableCode } = entitySchema.getTableInfoByViewModelId(viewModelId); const cmpGUID = tableCode + '-' + Math.random().toString(36).slice(2, 6); // 1、创建组件引用节点 @@ -192,11 +192,11 @@ export function useSplitFormComponent(designItemContext: DesignerItemContext, de if (!designerHostService) { return; } - const { formSchemaUtils } = designerHostService; + const { pageSchema } = designerHostService; const currentComponent = designItemContext.componentInstance.value.schema; const removedControlIds = movedControls.value.map(control => control.id); - const responseFormNode = formSchemaUtils.selectNode(currentComponent, item => item.type === DgControl['response-form'].type); + const responseFormNode = pageSchema.selectNode(currentComponent, item => item.type === DgControl['response-form'].type); responseFormNode.contents.forEach(contentElement => { if (contentElement.type === DgControl.fieldset.type) { contentElement.contents = contentElement.contents.filter(childContent => !removedControlIds.includes(childContent.id)); @@ -220,9 +220,9 @@ export function useSplitFormComponent(designItemContext: DesignerItemContext, de if (!designerHostService) { return; } - const { formSchemaUtils } = designerHostService; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(componentId); - const viewModelNode = formSchemaUtils.getViewModelById(viewModelId); + const { pageSchema } = designerHostService; + const viewModelId = pageSchema.getViewModelIdByComponentId(componentId); + const viewModelNode = pageSchema.getViewModelById(viewModelId); if (viewModelNode && viewModelNode.fields) { viewModelNode.fields = viewModelNode.fields.filter(field => !movedViewModelFieldIds.value.includes(field.id)); } @@ -232,7 +232,7 @@ export function useSplitFormComponent(designItemContext: DesignerItemContext, de if (!designerHostService) { return; } - const { formSchemaUtils } = designerHostService; + const { pageSchema } = designerHostService; // 1、新建命令 const guiId = useGuid().guid(); const newCommand = Object.assign({}, oldCommand, { @@ -243,7 +243,7 @@ export function useSplitFormComponent(designItemContext: DesignerItemContext, de // 2、新建的命令添加到webCmds节点下 - const webCmds = formSchemaUtils.getCommands(); + const webCmds = pageSchema.getCommands(); const component = webCmds.find(cmd => cmd.id === oldCommand.cmpId); if (component) { component.refedHandlers.push({ @@ -262,9 +262,9 @@ export function useSplitFormComponent(designItemContext: DesignerItemContext, de if (!designerHostService) { return; } - const { formSchemaUtils } = designerHostService; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(componentId); - const currentViewModel = formSchemaUtils.getViewModelById(viewModelId); + const { pageSchema } = designerHostService; + const viewModelId = pageSchema.getViewModelIdByComponentId(componentId); + const currentViewModel = pageSchema.getViewModelById(viewModelId); // 多个控件绑定一个命令时,不重复创建新命令 const commandMap = {}; diff --git a/packages/ui-vue/components/component/src/designer/component.design.component.tsx b/packages/ui-vue/components/component/src/designer/component.design.component.tsx index e5764d1801373fe29bd824cba62eb8cd647dfa1f..555ca5e1dbd5fe8722ffcc06a3b136c57a3ffa11 100644 --- a/packages/ui-vue/components/component/src/designer/component.design.component.tsx +++ b/packages/ui-vue/components/component/src/designer/component.design.component.tsx @@ -1,4 +1,4 @@ -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; import { SetupContext, defineComponent, inject, ref, onMounted, computed } from 'vue'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; @@ -12,7 +12,7 @@ export default defineComponent({ emits: ['init', 'afterViewInit'], setup(props: ComponentPropsType, context) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/component/src/designer/use-designer-rules.ts b/packages/ui-vue/components/component/src/designer/use-designer-rules.ts index 2bbc428dfd8a92700210ccc296035887a37744f9..12630850073bf6b5bc0a769d8c3d015dc7f6a07f 100644 --- a/packages/ui-vue/components/component/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/component/src/designer/use-designer-rules.ts @@ -1,11 +1,11 @@ -import { DesignerHostService, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { DesignerComponentButton, DesignerItemContext } from "../../../designer-canvas/src/types"; import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; import { ComponentProperty } from "../property-config/component.property-config"; import { useSiblingComponent } from "../composition/use-sibling-component"; import { useSplitFormComponent } from "../composition/use-split-component"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); const { canMove, canDelete } = dragAndDropRules.getTemplateRule(designItemContext, designerHostService); @@ -13,7 +13,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe * 判断是否可以接收拖拽新增的子级控件 */ function canAccepts(): boolean { - return false; + return true; } function checkCanDeleteComponent() { @@ -45,8 +45,8 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe */ function removeAddDeleteBtnOnParentContainer() { const schema = designItemContext?.schema; - const formSchemaUtils = designerHostService?.formSchemaUtils; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(schema.id); + const pageSchema = designerHostService?.pageSchema; + const viewModelId = pageSchema.getViewModelIdByComponentId(schema.id); if (schema.componentType !== 'data-grid' && schema.componentType !== 'form') { return; @@ -84,34 +84,34 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe * 组件删除后事件:移除viewmodel和component */ function removeViewModelComponent() { - const designViewModelUtils = designerHostService?.designViewModelUtils; - const formSchemaUtils = designerHostService?.formSchemaUtils; + const designViewMode = designerHostService?.designViewModelUtils; + const pageSchema = designerHostService?.pageSchema; const schema = designItemContext?.schema; - if (designViewModelUtils && formSchemaUtils) { - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(schema.id); - designViewModelUtils.deleteViewModelById(viewModelId); + if (designViewMode && pageSchema) { + const viewModelId = pageSchema.getViewModelIdByComponentId(schema.id); + designViewMode.deleteViewModelById(viewModelId); - formSchemaUtils.deleteComponent(schema.id); + pageSchema.deleteComponent(schema.id); } } /** * 组件删除后事件:移除表达式、界面规则、受控规则等全局配置 */ function removeGlobalConfigs() { - const designViewModelUtils = designerHostService?.designViewModelUtils; - const formSchemaUtils = designerHostService?.formSchemaUtils; + const designViewMode = designerHostService?.designViewModelUtils; + const pageSchema = designerHostService?.pageSchema; const schema = designItemContext?.schema; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(schema.id); - const designViewModel = designViewModelUtils.getDgViewModel(viewModelId); + const viewModelId = pageSchema.getViewModelIdByComponentId(schema.id); + const designViewModel = designViewMode.getDgViewModel(viewModelId); if (designViewModel?.fields) { designViewModel.fields.forEach(field => { - const expressions = formSchemaUtils.getExpressions(); + const expressions = pageSchema.getExpressions(); // 若绑定字段配置了表达式,需要删除表达式 if (expressions?.length) { const expFieldIndex = expressions.findIndex(e => e.target === field.id); if (expFieldIndex > -1) { - formSchemaUtils.getExpressions().splice(expFieldIndex, 1); + pageSchema.getExpressions().splice(expFieldIndex, 1); } } }); diff --git a/packages/ui-vue/components/component/src/property-config/component.property-config.ts b/packages/ui-vue/components/component/src/property-config/component.property-config.ts index 8865e97f789c3f5c6e98c3512ab7d20975c0c24f..314c7f1f35e714faa7ba05744471f6d3f181539e 100644 --- a/packages/ui-vue/components/component/src/property-config/component.property-config.ts +++ b/packages/ui-vue/components/component/src/property-config/component.property-config.ts @@ -1,8 +1,5 @@ -import { PropertyChangeObject } from "../../../property-panel/src/composition/entity/property-entity"; import { BaseControlProperty } from "../../../property-panel/src/composition/entity/base-property"; -import { DesignerComponentInstance } from "@farris/ui-vue/components/designer-canvas"; - export class ComponentProperty extends BaseControlProperty { constructor(componentId: string, designerHostService: any) { super(componentId, designerHostService); @@ -20,7 +17,7 @@ export class ComponentProperty extends BaseControlProperty { } private getAppearancePropConfig(propertyData) { // 【模型名称】是保存到ViewModel上的,不是保存到Component上,所以这里复制一份属性值 - const viewModelInfo = this.formSchemaUtils.getViewModelById(this.viewModelId); + const viewModelInfo = this.pageSchema.getViewModelById(this.viewModelId); propertyData.name = viewModelInfo ? viewModelInfo.name : null; const self = this; const appearanceConfig = this.getAppearanceConfig(propertyData, { @@ -54,7 +51,7 @@ export class ComponentProperty extends BaseControlProperty { }, ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -75,15 +72,15 @@ export class ComponentProperty extends BaseControlProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } } }; } getBehaviorConfig(propertyData: any) { // 是否启用校验是保存到ViewModel上的,不是保存到Component上,所以这里复制一份属性值 - const viewModel = this.formSchemaUtils.getViewModelById(this.viewModelId); - const enableValidation = viewModel ? viewModel.enableValidation : null; + const viewModel = this.pageSchema.getViewModelById(this.viewModelId); + propertyData.enableValidation = viewModel ? viewModel.enableValidation : null; const self = this; this.propertyConfig.categories['behavior'] = { title: "行为", @@ -115,7 +112,7 @@ export class ComponentProperty extends BaseControlProperty { * 将变更的属性值同步到ViewModel上 */ private syncChangesToViewModel(changeObject: any) { - const viewModel = this.formSchemaUtils.getViewModelById(this.viewModelId); + const viewModel = this.pageSchema.getViewModelById(this.viewModelId); if (!viewModel) { return; } diff --git a/packages/ui-vue/components/components.ts b/packages/ui-vue/components/components.ts index e430b4918726340b464773490bcc8d2b2691fe8a..b8b83cc7ff307dc2a2c57530ad6af4fbaf42767e 100644 --- a/packages/ui-vue/components/components.ts +++ b/packages/ui-vue/components/components.ts @@ -14,6 +14,7 @@ export type { CalculatorProps } from './calculator'; export { default as FCalendar } from './calendar'; export type { CalendarPropsType } from './calendar'; export { default as FCapsule } from './capsule'; +export type { CapsuleItem } from './capsule'; export { default as FCheckbox } from './checkbox'; export type { CheckboxProps } from './checkbox'; export { default as FCheckBoxGroup } from './checkbox-group'; @@ -36,7 +37,7 @@ export * from './data-view'; export type { DataColumn, VisualData, VisualDataCell, RowOptions } from './data-view'; export { default as FDrawer } from './drawer'; export type { DrawerProps } from './drawer'; -export { FResponseForm, FResponseForm as FDynamicForm, FDynamicFormGroup, FDynamicFormInput } from './dynamic-form'; +export { FResponseForm, FResponseForm as FDynamicForm, FDynamicFormGroup, FDynamicFormInput } from './dynamic-form'; export type { EditorConfig } from './dynamic-form'; export { default as FFilterBar } from './filter-bar'; export type { FilterBarProps } from './filter-bar'; @@ -49,12 +50,12 @@ export { default as FListNav } from './list-nav'; export type { ListNavProps } from './list-nav'; export { default as FListView } from './list-view'; export type { ListViewProps } from './list-view'; -export { default as FLayout } from './layout'; +export { FLayout, FLayoutPane } from './layout'; export type { LayoutProps } from './layout'; export { default as FLoading, FLoadingService } from './loading'; export type { LoadingProps } from './loading'; export { default as FModal, F_MODAL_SERVICE_TOKEN, FModalService } from './modal'; -export type { ModalProps } from './modal'; +export type { ModalProps, ModalOptions, ModalButton } from './modal'; export { default as FMessageBox, FMessageBoxService } from './message-box'; export type { MessageBoxProps, MessageType } from './message-box'; export { FNav } from './nav'; diff --git a/packages/ui-vue/components/content-container/src/designer/content-container.design.component.tsx b/packages/ui-vue/components/content-container/src/designer/content-container.design.component.tsx index 308f7d2ce29861b950290a5ff87bace796ac0ba4..2a2993dc07ec685d872282b774068595b87392f8 100644 --- a/packages/ui-vue/components/content-container/src/designer/content-container.design.component.tsx +++ b/packages/ui-vue/components/content-container/src/designer/content-container.design.component.tsx @@ -3,15 +3,16 @@ import { ContentContainerPropsType, contentContainerProps } from '../content-con import { useDesignerRulesForContentContainer } from './use-designer-rules'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; -import { getCustomClass } from '@farris/ui-vue/components/common'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { getCustomClass } from '../../../common'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; + export default defineComponent({ name: 'FContentContainerDesign', props: contentContainerProps, emits: [], setup(props: ContentContainerPropsType, context) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + 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/ui-vue/components/content-container/src/designer/use-designer-rules.ts b/packages/ui-vue/components/content-container/src/designer/use-designer-rules.ts index c6ac285d9bffcbc59a0a7a9e4a5ce80c445b4f00..a1215e62767a796705b5497d2eb3f8bbf5c508aa 100644 --- a/packages/ui-vue/components/content-container/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/content-container/src/designer/use-designer-rules.ts @@ -1,11 +1,11 @@ -import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; import { DgControl } from "../../../designer-canvas"; import { ContentContainerProperty } from "../property-config/content-container.property-config"; -export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const schema = designItemContext.schema as ComponentSchema; const dragAndDropRules = new UseTemplateDragAndDropRules(); @@ -26,12 +26,12 @@ export function useDesignerRulesForContentContainer(designItemContext: DesignerI * 只有不可编辑的表格,才支持启用筛选方案 */ function getUnEditableDataGrid() { - const formSchemaUtils = designerHostService?.formSchemaUtils; - const matchedDataGridComponentRef = formSchemaUtils.selectNode(schema, (item) => { + const pageSchema = designerHostService?.pageSchema; + const matchedDataGridComponentRef = pageSchema.selectNode(schema, (item) => { if (item.type === 'component-ref') { - const childComponent = formSchemaUtils.getComponentById(item.component); + const childComponent = pageSchema.getComponentById(item.component); if (childComponent?.componentType === 'data-grid') { - const dataGrid = formSchemaUtils.selectNode(childComponent, childItem => childItem.type === 'data-grid' && !childItem.fieldEditable); + const dataGrid = pageSchema.selectNode(childComponent, childItem => childItem.type === 'data-grid' && !childItem.fieldEditable); if (dataGrid) { return true; } @@ -84,7 +84,7 @@ export function useDesignerRulesForContentContainer(designItemContext: DesignerI * 判断是否可以接收拖拽新增的子级控件 */ function canAccepts(draggingContext: DraggingResolveContext): boolean { - + return true; if (checkIfDraggingQuerySolution(draggingContext)) { return checkCanAcceptQuerySolution(draggingContext); } diff --git a/packages/ui-vue/components/data-grid/src/composition/data-grid-component-creator.service.ts b/packages/ui-vue/components/data-grid/src/composition/data-grid-component-creator.service.ts index 8d9a142f4646408c1c932cc89a9c10dfc955e9f7..0035bf8710105346bdbdaab805a6a733f2a29698 100644 --- a/packages/ui-vue/components/data-grid/src/composition/data-grid-component-creator.service.ts +++ b/packages/ui-vue/components/data-grid/src/composition/data-grid-component-creator.service.ts @@ -1,4 +1,4 @@ -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; import { DynamicResolver } from '../../../../components/dynamic-resolver'; import { ComponentBuildInfo } from '../../../component/src/composition/inner-component-build-info'; import { ComponentSchema } from '../../../../components/designer-canvas'; @@ -14,7 +14,7 @@ const ROOT_VIEW_MODEL_ID = 'root-viewmodel'; */ export class DataGridComponentCreatorService { - private formSchemaUtils: any; + private pageSchema: any; private controlCreatorUtils: any; private designViewModelUtils: any; private useFormCommand: any; @@ -22,13 +22,13 @@ export class DataGridComponentCreatorService { constructor( private resolver: DynamicResolver, - private designerHostService: DesignerHostService + private designerHostService: DesignerHost ) { - this.formSchemaUtils = this.designerHostService.formSchemaUtils; - this.controlCreatorUtils = this.designerHostService.controlCreatorUtils; - this.designViewModelUtils = this.designerHostService.designViewModelUtils; + this.pageSchema = this.designerHostService.pageSchema; + this.controlCreatorUtils = this.designerHostService.controlCreator; + this.designViewModelUtils = this.designerHostService.designViewModel; this.useFormCommand = this.designerHostService.useFormCommand; - this.formStateMachineUtils = this.designerHostService.formStateMachineUtils; + this.formStateMachineUtils = this.designerHostService.stateMachine; } public createComponent(buildInfo: ComponentBuildInfo) { @@ -38,9 +38,9 @@ export class DataGridComponentCreatorService { const viewModelNode = this.createViewModeNode(buildInfo); - const formSchema = this.formSchemaUtils.getFormSchema(); - formSchema.module.viewmodels.push(viewModelNode); - formSchema.module.components.push(componentNode); + const pageSchema = this.pageSchema.getPageSchema(); + pageSchema.module.viewmodels.push(viewModelNode); + pageSchema.module.components.push(componentNode); this.designViewModelUtils.assembleDesignViewModel(); @@ -56,7 +56,7 @@ export class DataGridComponentCreatorService { const parentContainerType = buildInfo?.parentComponentInstance?.schema?.type; // 双列表模板、左树右列表模板,拖拽子表时,不生成父标题区域 - const templateId = this.formSchemaUtils.getFormSchema()?.module?.templateId; + const templateId = this.pageSchema.getPageSchema()?.module?.templateId; if (parentContainerType === DgControl['splitter-pane'].type && ['double-list-template', 'tree-list-template'].includes(templateId)) { return componentRefNode; } @@ -184,7 +184,7 @@ export class DataGridComponentCreatorService { // 3、记录构件命令 - const webCmds = this.formSchemaUtils.getFormSchema().module.webcmds; + const webCmds = this.pageSchema.getPageSchema().module.webcmds; const cardCmd = webCmds.find(webCmd => webCmd.id === cardControllerId); cardCmd.refedHandlers.push( { @@ -201,7 +201,7 @@ export class DataGridComponentCreatorService { * 获取新增删除子表命令可用的控制器id。 */ private resolveCommandController(): string { - const webCmds = this.formSchemaUtils.getFormSchema().module.webcmds; + const webCmds = this.pageSchema.getPageSchema().module.webcmds; // 卡片控制器 / 树卡控制器 / 高级列卡控制器 const optionalControllerId = [ '8172a979-2c80-4637-ace7-b13074d3f393', @@ -272,7 +272,7 @@ export class DataGridComponentCreatorService { * 获取表格组件层级的class样式 */ private getDataGridComponentClass(): string { - const { templateId } = this.formSchemaUtils.getFormSchema().module; + const { templateId } = this.pageSchema.getPageSchema().module; // 双列表标签页、双列表、树列表模板,要求列表填充表单高度 if (['double-list-in-tab-template', 'double-list-template', 'tree-list-template'].includes(templateId)) { @@ -285,7 +285,7 @@ export class DataGridComponentCreatorService { * 创建表格组件内层级结构 */ private createDateGridComponentContents(buildInfo: ComponentBuildInfo) { - const { templateId } = this.formSchemaUtils.getFormSchema().module; + const { templateId } = this.pageSchema.getPageSchema().module; let container; // 根据模板不同,创建不同的容器类型和样式 if (templateId === 'double-list-in-tab-template') { diff --git a/packages/ui-vue/components/data-grid/src/designer/data-grid-column.design.component.tsx b/packages/ui-vue/components/data-grid/src/designer/data-grid-column.design.component.tsx index 92382d84ccd7b2158b3c61f98b365b874eb54a0e..f3aab8ea2e008bb40674b5855ddfdd8a2134f425 100644 --- a/packages/ui-vue/components/data-grid/src/designer/data-grid-column.design.component.tsx +++ b/packages/ui-vue/components/data-grid/src/designer/data-grid-column.design.component.tsx @@ -1,6 +1,6 @@ import { SetupContext, defineComponent, inject, onMounted, ref } from 'vue'; import { dataGridColumnProps, DataGridColumnProps } from './data-grid-column.props'; -import { DesignerHostService, DesignerItemContext } from '../../../designer-canvas'; +import { DesignerHost, DesignerItemContext } from '../../../designer-canvas'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRulesForDataGridColumn } from './use-column-rules'; import { useFormBindingResolverDesign } from '../../../dynamic-form/src/composition/form-binding-resolver-design'; @@ -11,7 +11,7 @@ export default defineComponent({ emits: [], setup(props: DataGridColumnProps, context) { const columnRef = ref(); - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service') as DesignerHost; const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRulesForDataGridColumn(designItemContext, designerHostService); const componentInstance = useDesignerComponent(columnRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/data-grid/src/designer/data-grid.design.component.tsx b/packages/ui-vue/components/data-grid/src/designer/data-grid.design.component.tsx index bda59a8f1537390cf6daec9481b7f54e6df0827d..92685e00ad8902f7148f5213333bac5745209109 100644 --- a/packages/ui-vue/components/data-grid/src/designer/data-grid.design.component.tsx +++ b/packages/ui-vue/components/data-grid/src/designer/data-grid.design.component.tsx @@ -28,7 +28,7 @@ import getColumnHeader from './column-header.design.component'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRulesForDataGrid } from './use-designer-rules'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; import { canvasChanged } from '../../../designer-canvas/src/composition/designer-canvas-changed'; export default defineComponent({ @@ -37,7 +37,7 @@ export default defineComponent({ emits: ['ClickRow', 'DoubleClickRow', 'selectionChange', 'enterUpInLastCell', 'pageIndexChanged', 'pageSizeChanged'], setup(props: DataGridDesignProps, context) { const dataGridRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRulesForDataGrid(designItemContext, designerHostService); const componentInstance = useDesignerComponent(dataGridRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/data-grid/src/designer/grid-field-editor.component.tsx b/packages/ui-vue/components/data-grid/src/designer/grid-field-editor.component.tsx index 38224fd15d5154a90b22a858ff7f9ce9a3b4a360..19386dd7018c49dbd7e824f3ca14a30e9b5049fb 100644 --- a/packages/ui-vue/components/data-grid/src/designer/grid-field-editor.component.tsx +++ b/packages/ui-vue/components/data-grid/src/designer/grid-field-editor.component.tsx @@ -19,6 +19,7 @@ import FButtonEdit from '../../../button-edit/src/button-edit.component'; import { gridFieldEditorProps, GridFieldEditorProps } from './grid-field-editor.props'; import FTransfer from '../../../transfer/src/transfer.component'; import { FormSchemaEntityField$Type } from '@farris/ui-vue/components/common'; +import { DesignerHost } from '@farris/ui-vue/components/designer-canvas'; export default defineComponent({ name: 'FGridFieldEditor', @@ -27,9 +28,8 @@ export default defineComponent({ setup(props: GridFieldEditorProps, context) { const viewModelId = ref(props.viewModelId); - const designViewModelUtils = inject('designViewModelUtils') as any; - const formSchemaUtils = inject('useFormSchema') as any; - const controlCreatorUtils = inject('controlCreatorUtils') as any; + const designerHostService = inject('designer-host-service') as DesignerHost; + const { designViewModel, pageSchema, controlCreator } = designerHostService; let fieldColumns = props.gridData['columns']; // 控制表格列是否需要有编辑器 const { fieldEditable } = props.gridData; @@ -94,7 +94,7 @@ export default defineComponent({ * 更新dataSource */ function resetDataSource() { - dataSource.value = designViewModelUtils['getAllFields2TreeByVMId'](viewModelId.value); + dataSource.value = designViewModel['getAllFields2TreeByVMId'](viewModelId.value); plainColumns = convertTreeNodes2PlainObject(dataSource.value); } @@ -149,7 +149,7 @@ export default defineComponent({ } function clickConfirm() { - const dgViewModel = designViewModelUtils.getDgViewModel(viewModelId.value); + const dgViewModel = designViewModel.getDgViewModel(viewModelId.value); const newFields = [] as any; const newFieldIds = [] as any; const filterSelected = selectPanels.value.filter(item => !item['isInValidBinding']); @@ -161,7 +161,7 @@ export default defineComponent({ } }); if (!foundColumn) { - const gridFieldMetadata = controlCreatorUtils.setGridFieldProperty(props.gridType, selectItem.data, null, fieldEditable); + const gridFieldMetadata = controlCreator.setGridFieldProperty(props.gridType, selectItem.data, null, fieldEditable); dgViewModel.addField(selectItem); // DgVM增加字段 newFields.push(gridFieldMetadata); } else { @@ -177,7 +177,10 @@ export default defineComponent({ dgViewModel.removeField(deletedFieldIds); // 若字段配置了表达式,需要删除表达式 - removeExpression(deletedFieldIds); + if (pageSchema.getExpressions() && pageSchema.getExpressions().length && deletedFieldIds.length) { + const newExpressions = pageSchema.getExpressions().filter(e => !deletedFieldIds.includes(e.fieldId)); + pageSchema.setExpressions(newExpressions); + } } if (filterSelected.length !== selectPanels.value.length) { selectPanels.value = filterSelected; @@ -214,7 +217,7 @@ export default defineComponent({ } const columns = [{ field: 'name', title: '', dataType: 'string', width: '100%', formatter: (cellInfo, totalInfo) => { - return cellInfo.data + ` [${totalInfo.data['path'].data}]`; + return cellInfo.data + ` [${totalInfo.data['code'].data}]`; } }, { field: 'path', visible: false, title: '', dataType: 'string' diff --git a/packages/ui-vue/components/data-grid/src/designer/use-designer-rules.ts b/packages/ui-vue/components/data-grid/src/designer/use-designer-rules.ts index 0f730c481d5b1c34ea5b0beb717115d68df3bc37..7a50f5052074aea00d83dcdf32a65c30ce038458 100644 --- a/packages/ui-vue/components/data-grid/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/data-grid/src/designer/use-designer-rules.ts @@ -1,9 +1,9 @@ import { ref } from "vue"; -import { DraggingResolveContext, DesignerHTMLElement, UseDesignerRules, DesignerHostService } from "../../../designer-canvas/src/composition/types"; +import { DraggingResolveContext, DesignerHTMLElement, UseDesignerRules, DesignerHost } from "../../../designer-canvas/src/composition/types"; import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { DataGridProperty } from "../property-config/data-grid.property-config"; -export function useDesignerRulesForDataGrid(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRulesForDataGrid(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const schema = designItemContext.schema as ComponentSchema; /** 组件在拖拽时需要将所属的Component一起拖拽 */ const triggerBelongedComponentToMoveWhenMoved = ref(true); diff --git a/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts b/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts index 80077a328d1cc4ce5b82bfa01990af107b429161..d48c87b8e7f64434dbf1607ceb0bc88e47bd2f73 100644 --- a/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts +++ b/packages/ui-vue/components/data-grid/src/property-config/data-grid-column.property-config.ts @@ -164,7 +164,7 @@ export class DataGriColumnProperty extends BaseControlProperty { * @param viewModelId viewModelId */ getFieldEditorProp(propertyData: any, showPosition = 'gridFieldEditor', isSimpleTable = false) { - const editorType = this.formMetadataConverter.getRealEditorType(propertyData.editor.type); + const editorType = this.pageMetadataConverter.getRealEditorType(propertyData.editor.type); // const editorTypeConfig = propertyConfigSchemaMap[editorType]; let editorTypeConfig; switch (editorType) { @@ -286,7 +286,7 @@ export class DataGriColumnProperty extends BaseControlProperty { */ changeFieldEditorType(propertyData: any, newControlType: string) { // 1、记录viewModel 变更---全量替换editor - const dgViewModel = this.designViewModelUtils.getDgViewModel(this.viewModelId); + const dgViewModel = this.designViewModel.getDgViewModel(this.viewModelId); dgViewModel.changeField( this.designViewModelField.id, { @@ -301,8 +301,8 @@ export class DataGriColumnProperty extends BaseControlProperty { ); // 2、定位列表 - const cmp = this.formSchemaUtils.getComponentByViewModelId(this.viewModelId); - const grid = this.formSchemaUtils.selectNode( + const cmp = this.pageSchema.getComponentByViewModelId(this.viewModelId); + const grid = this.pageSchema.selectNode( cmp, (item) => item.type === DgControl['data-grid'].type || item.type === DgControl['tree-grid'].type ); @@ -311,7 +311,7 @@ export class DataGriColumnProperty extends BaseControlProperty { return; } const columnData = dgViewModel.fields.find((item) => item['id'] === this.designViewModelField.id); - const newField = this.controlCreatorUtils.setGridFieldProperty(newControlType, columnData, null, true); + const newField = this.controlCreator.setGridFieldProperty(newControlType, columnData, null, true); // 4、替换列编辑器 // 兼容新旧表格列属性 diff --git a/packages/ui-vue/components/data-grid/src/property-config/data-grid.property-config.ts b/packages/ui-vue/components/data-grid/src/property-config/data-grid.property-config.ts index 3dfde33f80c8c7cba522c1528de5eab8158443e1..cd6d325ef06a7ac6c75c66bfb26dcce862bedc58 100644 --- a/packages/ui-vue/components/data-grid/src/property-config/data-grid.property-config.ts +++ b/packages/ui-vue/components/data-grid/src/property-config/data-grid.property-config.ts @@ -23,7 +23,7 @@ export class DataGridProperty extends BaseControlProperty { } getBasicPropConfig(propertyData: any) { - const mainEntity = this.formSchemaUtils.getFormSchema()?.module?.entity[0]?.entities[0]; + const mainEntity = this.pageSchema.getPageSchema()?.module?.entity[0]?.entities[0]; const entityTreeData = this.assembleSchemaEntityToTree(mainEntity, 0); const self = this; const basicConfig = super.getBasicPropConfig(propertyData); @@ -48,12 +48,12 @@ export class DataGridProperty extends BaseControlProperty { setPropertyRelates(changeObject: PropertyChangeObject, data: any) { switch (changeObject && changeObject.propertyID) { case 'dataSource': { - const viewModelNode = self.formSchemaUtils.getViewModelById(self.viewModelId); + const viewModelNode = self.pageSchema.getViewModelById(self.viewModelId); if (viewModelNode) { const selectedEntity = entityTreeData.find(entityData => entityData.label === changeObject.propertyValue); viewModelNode.bindTo = selectedEntity.bindTo; } - self.designViewModelUtils.assembleDesignViewModel(); + self.designViewModel.assembleDesignViewModel(); break; } } @@ -258,7 +258,7 @@ export class DataGridProperty extends BaseControlProperty { } ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -279,7 +279,7 @@ export class DataGridProperty extends BaseControlProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } // 联动修改排序开关 propertyData.remoteSort = propertyData.columnSorted ? true : false; @@ -287,7 +287,7 @@ export class DataGridProperty extends BaseControlProperty { }; } private isSubGrid() { - const viewModelInfo = this.formSchemaUtils.getViewModelById(this.viewModelId); + const viewModelInfo = this.pageSchema.getViewModelById(this.viewModelId); return viewModelInfo && viewModelInfo.bindTo ? viewModelInfo.bindTo.trim() !== '/' : false; } }; diff --git a/packages/ui-vue/components/data-grid/src/schema/schema-resolver.ts b/packages/ui-vue/components/data-grid/src/schema/schema-resolver.ts index e74211489468e74c59f7b44f8f813fa206294df1..f8feacc38ea44640603fe7b77a7bbed2b2e66d39 100644 --- a/packages/ui-vue/components/data-grid/src/schema/schema-resolver.ts +++ b/packages/ui-vue/components/data-grid/src/schema/schema-resolver.ts @@ -1,10 +1,10 @@ import { ComponentBuildInfo } from "../../../component/src/composition/inner-component-build-info"; -import { DesignerHostService } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost } from "../../../designer-canvas/src/composition/types"; import { DesignerComponentInstance } from "../../../designer-canvas/src/types"; import { DynamicResolver } from "../../../dynamic-resolver"; import { DataGridComponentCreatorService } from "../composition/data-grid-component-creator.service"; -export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHostService): Record { +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHost): Record { const parentComponentInstance = context.parentComponentInstance as DesignerComponentInstance; if (parentComponentInstance && designerHostService) { const radomNumber = Math.random().toString(36).slice(2, 6); diff --git a/packages/ui-vue/components/data-view/composition/data/use-data-view.ts b/packages/ui-vue/components/data-view/composition/data/use-data-view.ts index 47585442a83ee43fbcba3419262571a3f83f93b3..fefcf2326f0f72cd792900af938b2257f21bae09 100644 --- a/packages/ui-vue/components/data-view/composition/data/use-data-view.ts +++ b/packages/ui-vue/components/data-view/composition/data/use-data-view.ts @@ -39,7 +39,7 @@ export function useDataView( const sorters = ref([]); const groupComposition = useGroupData(props, useIdentifyCompostion); const { generateGroupData, groupFields, shouldGroupingData } = groupComposition; - const originalData = ref(props.data); + const originalData = ref(props.data || []); const hierarchyDataComposition = useHierarchyData(props, originalData, useHierarchyCompostion, useIdentifyCompostion); const { collapseTo: collpaseToLayer, expandTo: expandToLayer, generateHierarchyData, hasRealChildren, insertSibling, insertChild, insertChildren, isVisibleInTree, @@ -47,9 +47,12 @@ export function useDataView( const { idField, reviseIdentifyField } = useIdentifyCompostion; const getNewDataItem = ref(props.newDataItem); const totalData = ref(props.data || []); - const rawView = ref(props.data); - const { flatTreeData, isNestedTree } = useTreeData(props); - if (props.hierarchy && isNestedTree(props.data)) { + const rawView = ref(props.data || []); + const { flatTreeData } = useTreeData(props); + function flattenTreeData(data: any) { + return flatTreeData(data) as any; + } + if (props.hierarchy && props.data && props.data[0]?.children) { // 树表打平数据 const flattenedData = flatTreeData(props.data); originalData.value = flattenedData; @@ -355,7 +358,8 @@ export function useDataView( function load(newData: Record[]) { // jumphere, it need to remove the dependency of children property at first row, it's awful. - const shouldFlattenData = props.hierarchy && isNestedTree(newData); + // const shouldFlattenData = props.hierarchy && isNestedTree(newData); + const shouldFlattenData = props.hierarchy; const loadingData = shouldFlattenData ? flatTreeData(newData) : newData; originalData.value = loadingData; updateDataView(); diff --git a/packages/ui-vue/components/designer-canvas/index.ts b/packages/ui-vue/components/designer-canvas/index.ts index c9435dd29509c5f3ffe30235cf0ac20915e2ab15..fabd9ad0ac7fce596f10fb0d7ac52532a4dcf45d 100644 --- a/packages/ui-vue/components/designer-canvas/index.ts +++ b/packages/ui-vue/components/designer-canvas/index.ts @@ -1,7 +1,7 @@ import FDesignerCanvas from './src/designer-canvas.component'; import FDesignerItem from './src/components/designer-item.component'; import { DgControl } from './src/composition/dg-control'; -import type { DesignerHostService, UseDesignerRules, DesignerHTMLElement, DraggingResolveContext } from './src/composition/types'; +import type { DesignerHost, UseDesignerRules } from './src/composition/types'; export * from './src/composition/props/designer-canvas.props'; export * from './src/composition/function/use-designer-component'; @@ -11,4 +11,4 @@ export * from './src/composition/rule/use-dragula-common-rule'; export * from './src/composition/types'; export * from './src/types'; -export { FDesignerCanvas, FDesignerItem, DgControl, UseDesignerRules, DesignerHostService, DesignerHTMLElement, DraggingResolveContext }; +export { FDesignerCanvas, FDesignerItem, DgControl, UseDesignerRules, DesignerHost }; diff --git a/packages/ui-vue/components/designer-canvas/src/components/designer-item.component.tsx b/packages/ui-vue/components/designer-canvas/src/components/designer-item.component.tsx index 0dbd79d0ea718eb0f4429d3332003061003b784a..b82e7f48bd2c79063ec0dc52c95441f02a7b8283 100644 --- a/packages/ui-vue/components/designer-canvas/src/components/designer-item.component.tsx +++ b/packages/ui-vue/components/designer-canvas/src/components/designer-item.component.tsx @@ -2,7 +2,7 @@ import { Ref, SetupContext, computed, defineComponent, inject, onMounted, provide, ref, watch, onBeforeUnmount, triggerRef } from 'vue'; import { DesignerItemPropsType, designerItemProps } from '../composition/props/designer-item.props'; import { componentMap, componentPropsConverter } from './maps'; -import { DesignerHostService, UseDragula } from '../composition/types'; +import { DesignerHost, UseDragula } from '../composition/types'; import { ComponentSchema, DesignerComponentInstance, DesignerItemContext } from '../types'; import FDesignerPlaceholder from './designer-placeholder.component'; import { canvasChanged, setPositionOfButtonGroup, setPositionOfButtonGroupInContainer } from '../composition/designer-canvas-changed'; @@ -28,8 +28,7 @@ const FDesignerItem = defineComponent({ 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 designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service') as DesignerHost; // 外部容器引入的表单,记录所属容器id const externalContainerId = inject('external-container-id'); @@ -183,14 +182,28 @@ const FDesignerItem = defineComponent({ context.emit('dragEnd'); } + function tryToAttachViewProps(viewProps: any, viewSchema: ComponentSchema) { + if (Object.prototype.hasOwnProperty.call(viewProps, 'customClass')) { + viewProps.customClass = props.ignore ? viewProps.customClass : ''; + } + if (Object.prototype.hasOwnProperty.call(viewProps, 'componentId')) { + viewProps.componentId = componentId.value; + } + if (Object.prototype.hasOwnProperty.call(viewProps, 'id')) { + viewProps.id = viewSchema.id; + } + } + 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; + + // viewProps.customClass = props.ignore ? viewProps.customClass : ''; + // viewProps.componentId = componentId.value; + // viewProps.id = viewSchema.id; + tryToAttachViewProps(viewProps, viewSchema); const shouldShowPlaceholder = viewSchema.contents && viewSchema.contents.length === 0; const hasContent = viewSchema.contents && !!viewSchema.contents.length; return hasContent && Component ? ( @@ -219,7 +232,7 @@ const FDesignerItem = defineComponent({ } function getExternalFormSchema() { - const externalFormInfo = useFormSchema.externalFormSchema.get(externalContainerId); + const externalFormInfo = designerHostService.pageSchema.externalPageSchema.get(externalContainerId); if (externalFormInfo?.content) { return externalFormInfo?.content; } @@ -227,14 +240,13 @@ const FDesignerItem = defineComponent({ function renderChildComponentContent(viewSchema: ComponentSchema) { const componentKey = viewSchema.type; if (componentKey === 'component-ref') { - const formSchema = externalContainerId ? getExternalFormSchema() : useFormSchema?.getFormSchema(); + const formSchema = props.completeFormSchema ? props.completeFormSchema : designerHostService.pageSchema?.getPageSchema(); - const componentSchema = formSchema.module.components.find((component: any) => component.id === viewSchema.component); - const componentSchemaRef = ref(componentSchema); + const componentSchema = formSchema?.module.components.find((component: any) => component.id === viewSchema.component); if (componentSchema) { return ; diff --git a/packages/ui-vue/components/designer-canvas/src/composition/designer-canvas-changed.ts b/packages/ui-vue/components/designer-canvas/src/composition/designer-canvas-changed.ts index 867da936d1b060e718f9ffafd7d62fc6527dd999..d72ba52a6223ccdb84c9232f968c7fe3a4789e11 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/designer-canvas-changed.ts +++ b/packages/ui-vue/components/designer-canvas/src/composition/designer-canvas-changed.ts @@ -1,4 +1,3 @@ -import { unset } from "lodash"; import { ref } from "vue"; /** 用于响应画布发生变更 */ diff --git a/packages/ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx b/packages/ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx index 4ead40183e4be989919063444bff989f8b0d2788..67767a11d13b0574791d17255331e0a14e7ce40e 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx +++ b/packages/ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx @@ -1,5 +1,5 @@ import { ModalFunctions } from "../../../../modal/src/composition/type"; -import { ComponentBindingSourceContext, DesignerHostService, DesignerHTMLElement, DraggingResolveContext } from "../types"; +import { ComponentBindingSourceContext, DesignerHost, DesignerHTMLElement, DraggingResolveContext } from "../types"; import EntityBindingSelectorComponent from '../../../../entity-binding-selector/entity-binding-selector.component'; import { FBindingSelectorContainer as BindingSelectorComponent } from "@farris/ui-vue/components/binding-selector"; import { DesignViewModelField, FormVariable } from "@farris/ui-vue/components/common"; @@ -8,7 +8,7 @@ import { DesignerComponentInstance } from "../../types"; import { DgControl } from "../dg-control"; import { FNotifyService } from "@farris/ui-vue/components/notify"; -export function dragResolveService(designerHostService: DesignerHostService) { +export function dragResolveService(designerHostService: DesignerHost) { /** 弹窗实例 */ let modalEditorRef: ModalFunctions; /** 拖拽上下文 */ @@ -166,7 +166,7 @@ export function dragResolveService(designerHostService: DesignerHostService) { */ function renderFieldComponent() { const { parentComponentInstance } = componentResolveContext; - const viewModelId = designerHostService.formSchemaUtils.getViewModelIdByComponentId(parentComponentInstance?.belongedComponentId); + const viewModelId = designerHostService.pageSchema.getViewModelIdByComponentId(parentComponentInstance?.belongedComponentId); const editorParams = { viewModelId, designerHostService, @@ -203,12 +203,12 @@ export function dragResolveService(designerHostService: DesignerHostService) { * 收集绑定同一个实体的同类型组件中已使用的字段(form类、dataGrid类...) */ function resolveOccupiedFields() { - const { formSchemaUtils } = designerHostService; + const { pageSchema } = designerHostService; const targetComponentId = componentResolveContext.parentComponentInstance.belongedComponentId; const occupiedFieldSet = new Set(); - const formSchema = formSchemaUtils.getFormSchema().module; + const formSchema = pageSchema.getPageSchema().module; const targetComponentNode = formSchema.components.find(component => component.id === targetComponentId); - const targetViewModelNode = formSchemaUtils.getViewModelById(targetComponentNode.viewModel); + const targetViewModelNode = pageSchema.getViewModelById(targetComponentNode.viewModel); // 当前组件的类型 @@ -257,8 +257,8 @@ export function dragResolveService(designerHostService: DesignerHostService) { return; } else { const bindingSourceContext: ComponentBindingSourceContext = { bindingType: 'field' }; - const targetComponentNode = designerHostService.formSchemaUtils.getComponentById(parentComponentInstance.belongedComponentId); - const resolveResult = designerHostService.schemaService.getFieldByIDAndVMID(bindingTargetId, targetComponentNode.viewModel); + const targetComponentNode = designerHostService.pageSchema.getComponentById(parentComponentInstance.belongedComponentId); + const resolveResult = designerHostService.entitySchema.getFieldByIDAndVMID(bindingTargetId, targetComponentNode.viewModel); const schemaField = merge({}, resolveResult.schemaField); bindingSourceContext.entityFieldNode = schemaField; @@ -314,6 +314,12 @@ export function dragResolveService(designerHostService: DesignerHostService) { */ async function resolveComponentCreationContextByDrop(sourceElement: DesignerHTMLElement, sourceContainer: DesignerHTMLElement, targetContainer: DesignerHTMLElement): Promise { componentResolveContext = getComponentResolveContext(sourceElement, sourceContainer, targetContainer); + const entities = designerHostService.pageSchema.getSchemaEntities() as any[]; + const hasBindingEntity = entities.length > 0; + if (!hasBindingEntity) { + resolveComponentSchema(); + return componentResolveContext; + } await resolveBindingSource(); diff --git a/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-component.ts b/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-component.ts index b004a38664bcafb73c9ee62df4c242663a4169b6..6a537dd522ec0bbaabe319daae5ca1eadb7ed714 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-component.ts +++ b/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-component.ts @@ -1,5 +1,5 @@ import { Ref, ref } from "vue"; -import { DesignerHostService, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../types"; +import { DesignerHost, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../types"; import { ComponentSchema, DesignerComponentInstance, DesignerItemContext } from "../../types"; import { getSchemaByTypeForDesigner } from '@farris/ui-vue/components/dynamic-resolver'; @@ -129,7 +129,7 @@ export function useDesignerComponent( /** * 当前容器接收新创建的子控件,返回子控件schema结构 */ - function addNewChildComponentSchema(resolveContext: DraggingResolveContext, designerHostService: DesignerHostService) { + function addNewChildComponentSchema(resolveContext: DraggingResolveContext, designerHostService: DesignerHost) { const { componentType } = resolveContext; let componentSchema = getSchemaByTypeForDesigner(componentType, resolveContext, designerHostService) as ComponentSchema; if (designerRules && designerRules.onResolveNewComponentSchema) { @@ -167,16 +167,13 @@ export function useDesignerComponent( /** * 删除控件相关的表达式 */ - function removeExpressionsInComponent(designerHostService: DesignerHostService) { - if (!designerHostService) { - return; - } + function removeExpressionsInComponent(designerHostService: DesignerHost) { const componentSchema = designItemContext?.schema; - const { formSchemaUtils } = designerHostService; - if (componentSchema && formSchemaUtils.getExpressions().length) { - const expTargetIndex = formSchemaUtils.getExpressions().findIndex(e => e.target === componentSchema.id); + const { pageSchema } = designerHostService; + if (componentSchema && pageSchema.getExpressions().length) { + const expTargetIndex = pageSchema.getExpressions().findIndex(e => e.target === componentSchema.id); if (expTargetIndex > -1) { - formSchemaUtils.getExpressions().splice(expTargetIndex, 1); + pageSchema.getExpressions().splice(expTargetIndex, 1); } } @@ -184,7 +181,7 @@ export function useDesignerComponent( /** * 控件删除后事件 */ - function onRemoveComponent(designerHostService: DesignerHostService) { + function onRemoveComponent(designerHostService: DesignerHost) { // 调用当前控件的删除后事件 if (designerRules && designerRules.onRemoveComponent) { designerRules.onRemoveComponent(); diff --git a/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-inner-component.ts b/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-inner-component.ts index c49852495370000d3369eeb7895acbd6a8439466..fe78a6b5c6f44b189bf9f4300761858c1a724365 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-inner-component.ts +++ b/packages/ui-vue/components/designer-canvas/src/composition/function/use-designer-inner-component.ts @@ -1,5 +1,5 @@ import { inject, Ref, ref } from "vue"; -import { DesignerHostService, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../types"; +import { DesignerHost, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../types"; import { ComponentSchema, DesignerComponentInstance, DesignerItemContext } from "../../types"; import { getSchemaByTypeForDesigner } from '@farris/ui-vue/components/dynamic-resolver'; @@ -122,8 +122,8 @@ export function useDesignerInnerComponent( function addNewChildComponentSchema(resolveContext: DraggingResolveContext) { const { componentType } = resolveContext; - const designerHostServer = inject('designer-host-service') as DesignerHostService; - let componentSchema = getSchemaByTypeForDesigner(componentType, resolveContext, designerHostServer) as ComponentSchema; + const designerHostService = inject('designer-host-service') as DesignerHost; + let componentSchema = getSchemaByType(componentType, resolveContext, designerHostService) as ComponentSchema; if (designerRules && designerRules.onResolveNewComponentSchema) { componentSchema = designerRules.onResolveNewComponentSchema(resolveContext, componentSchema); } diff --git a/packages/ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts b/packages/ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts index 0dddca3267549a83ff74de046031379b285c6322..e26895652d4a5e109ad01c44d09973084e3ae9ae 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts +++ b/packages/ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts @@ -1,12 +1,12 @@ import dragula from '@farris/designer-dragula'; -import { DesignerHostService, DesignerHTMLElement, DraggingResolveContext, UseDragula } from '../types'; +import { DesignerHost, DesignerHTMLElement, DraggingResolveContext, UseDragula } from '../types'; import { findIndex } from 'lodash-es'; import { ref } from 'vue'; import { canvasChanged } from '../designer-canvas-changed'; import { ComponentSchema } from '../../types'; import { dragResolveService } from './drag-resolve'; -export function useDragula(designerHostService: DesignerHostService): UseDragula { +export function useDragula(designerHostService: DesignerHost): UseDragula { let dragulaInstance: any; diff --git a/packages/ui-vue/components/designer-canvas/src/composition/rule/use-dragula-common-rule.ts b/packages/ui-vue/components/designer-canvas/src/composition/rule/use-dragula-common-rule.ts index 2a618e6b6d206c7aca73760c245e2e9a7ec7478c..a8cf9c185175d34f6194aef53a32106898360faa 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/rule/use-dragula-common-rule.ts +++ b/packages/ui-vue/components/designer-canvas/src/composition/rule/use-dragula-common-rule.ts @@ -1,12 +1,12 @@ import { DgControl } from "../dg-control"; -import { DesignerHostService, DraggingResolveContext } from "../types"; +import { DesignerHost, DraggingResolveContext } from "../types"; export function useDragulaCommonRule() { /** * 容器类控件的基础控制规则 */ - function basalDragulaRuleForContainer(draggingContext: DraggingResolveContext, designerHostService?: DesignerHostService): boolean { + function basalDragulaRuleForContainer(draggingContext: DraggingResolveContext, designerHostService?: DesignerHost): boolean { if (!draggingContext) { return false; } @@ -19,7 +19,7 @@ export function useDragulaCommonRule() { return false; } const targetContainerType = targetCmpInstance.schema.type; - const belongedComponent = designerHostService?.formSchemaUtils.getComponentById(targetCmpInstance.belongedComponentId); + const belongedComponent = designerHostService?.pageSchema.getComponentById(targetCmpInstance.belongedComponentId); // 限制输入类控件的可接收容器 if (draggingContext.componentCategory === 'input' || draggingContext.componentType === 'form-group') { diff --git a/packages/ui-vue/components/designer-canvas/src/composition/rule/use-template-rule.ts b/packages/ui-vue/components/designer-canvas/src/composition/rule/use-template-rule.ts index 93c1c87835d2f8ac2f0d07ad33aa969e4d5f06b7..9b4df0ca29e6e160ec06f8751930bfc1dedde173 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/rule/use-template-rule.ts +++ b/packages/ui-vue/components/designer-canvas/src/composition/rule/use-template-rule.ts @@ -1,5 +1,5 @@ import { DesignerItemContext } from "../../types"; -import { DesignerHostService } from "../types"; +import { DesignerHost } from "../types"; export interface DragDropRule { canAccept: boolean; @@ -12,10 +12,10 @@ export interface DragDropRule { * 解析模板拖拽控制规则 */ export class UseTemplateDragAndDropRules { - public getTemplateRule(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): DragDropRule { + public getTemplateRule(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): DragDropRule { - const formSchemaUtils = designerHostService?.formSchemaUtils; - const dragTemplateRules = formSchemaUtils?.getFormTemplateRule(); + const pageSchema = designerHostService?.pageSchema; + const dragTemplateRules = pageSchema?.getFormTemplateRule(); const dragDropRule = { canAccept: true, canDelete: true, canMove: true }; if (!dragTemplateRules) { return dragDropRule; diff --git a/packages/ui-vue/components/designer-canvas/src/composition/types.ts b/packages/ui-vue/components/designer-canvas/src/composition/types.ts index 4861b5b0acab3259faf2d94f85b8d5097c3d07a0..e70cf8493e9cd27b71e87467d53baabb014751c8 100644 --- a/packages/ui-vue/components/designer-canvas/src/composition/types.ts +++ b/packages/ui-vue/components/designer-canvas/src/composition/types.ts @@ -19,17 +19,33 @@ export interface UseDragula { getDragulaInstance: () => any; } -export interface DesignerHostService { - eventsEditorUtils: any; - formSchemaUtils: any; - formMetadataConverter: any; - designViewModelUtils: any; - controlCreatorUtils: any; - metadataService?: any; - formStateMachineUtils: any; - schemaService?: any; +// export interface DesignerHost { +// eventsEditor: any; +// formSchemaUtils: any; +// formMetadataConverter: any; +// designViewModelUtils: any; +// controlCreatorUtils: any; +// metadataService?: any; +// formStateMachineUtils: any; +// schemaService?: any; +// [key: string]: any; +// } + + +export interface DesignerHost { + commands: any; + configOptions: any; + controlCreator: any; + designViewModel: any; + entitySchema: any; + eventEditor: any; + metadataService: any; + pageMetadataConverter: any; + pageSchema: any; + stateMachine: any; [key: string]: any; } + /** * 绑定上下文 */ diff --git a/packages/ui-vue/components/designer-canvas/src/designer-canvas.component.tsx b/packages/ui-vue/components/designer-canvas/src/designer-canvas.component.tsx index 98f8f0ad9de0f6f33504bec1022cc20860e7714e..84c30e02e502f773804eb4fde4e3ed0dc1e563d9 100644 --- a/packages/ui-vue/components/designer-canvas/src/designer-canvas.component.tsx +++ b/packages/ui-vue/components/designer-canvas/src/designer-canvas.component.tsx @@ -4,7 +4,7 @@ import { ComponentSchema, DesignerComponentInstance, DesignerItemContext } from import { canvasChanged, changeCanvas, setPositionOfButtonGroupInContainer } 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 { DesignerHost, UseDragula } from './composition/types'; import FDesignerItem from './components/designer-item.component'; import './composition/class/designer-canvas.css'; import './composition/class/control.css'; @@ -29,20 +29,21 @@ export default defineComponent({ 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(F_MODAL_SERVICE_TOKEN), - formStateMachineUtils: inject('useFormStateMachine'), - messagerService: inject('FMessageBoxService') - }; - provide('designer-host-service', designerHostService); + // 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(F_MODAL_SERVICE_TOKEN), + // formStateMachineUtils: inject('useFormStateMachine'), + // messagerService: inject('FMessageBoxService') + // }; + // provide('designer-host-service', designerHostService); + const designerHostService = inject('designer-host-service') as DesignerHost; const useDragulaComposition = useDragula(designerHostService); @@ -137,7 +138,7 @@ export default defineComponent({ onUnmounted(() => { if (resizeObserver) { - resizeObserver.unobserve(designerCanvasElementRef.value); + designerCanvasElementRef.value && resizeObserver.unobserve(designerCanvasElementRef.value); resizeObserver.disconnect(); resizeObserver = null; } diff --git a/packages/ui-vue/components/designer-canvas/src/types.ts b/packages/ui-vue/components/designer-canvas/src/types.ts index 8da297b5d48a8aa57046a972fdb03bc8788460c1..9d8de3a361b36ccf2fb6ef3bfd31dc0d2a53a8f7 100644 --- a/packages/ui-vue/components/designer-canvas/src/types.ts +++ b/packages/ui-vue/components/designer-canvas/src/types.ts @@ -1,6 +1,6 @@ /* eslint-disable no-use-before-define */ import { Ref, SetupContext } from "vue"; -import { DesignerHostService, DesignerHTMLElement, DraggingResolveContext } from "./composition/types"; +import { DesignerHost, DesignerHTMLElement, DraggingResolveContext } from "./composition/types"; export interface ComponentSchema { @@ -57,7 +57,7 @@ export interface DesignerComponentInstance { onChildElementMovedOut: (element: HTMLElement) => void; - addNewChildComponentSchema: (resolveContext: DraggingResolveContext, designerHostService?: DesignerHostService) => ComponentSchema; + addNewChildComponentSchema: (resolveContext: DraggingResolveContext, designerHostService?: DesignerHost) => ComponentSchema; /** 组件在拖拽时是否需要将所属的Component一起拖拽,用于form、data-grid等控件的拖拽 */ triggerBelongedComponentToMoveWhenMoved?: Ref; @@ -72,7 +72,7 @@ export interface DesignerComponentInstance { belongedComponentId?: string; /** 控件删除后事件 */ - onRemoveComponent: (designerHostService?: DesignerHostService) => void; + onRemoveComponent: (designerHostService?: DesignerHost) => void; /** 获取控件自定义操作按钮 */ getCustomButtons?: () => DesignerComponentButton[]; diff --git a/packages/ui-vue/components/designer-outline/src/composition/use-outline-node.ts b/packages/ui-vue/components/designer-outline/src/composition/use-outline-node.ts index 39ba686b2ccee5396d1f9a40ee38784d326f2d4f..c4fa3f87d09c9ac6a84cd3c717e2837566824f24 100644 --- a/packages/ui-vue/components/designer-outline/src/composition/use-outline-node.ts +++ b/packages/ui-vue/components/designer-outline/src/composition/use-outline-node.ts @@ -3,12 +3,12 @@ import { DgControl } from '../../../designer-canvas/src/composition/dg-control'; import { ref, SetupContext } from 'vue'; import { ComponentType } from '../types'; import { UseOutlineNode } from './types'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; /** * 组装控件树节点的展示文本、图标 */ -export function useOutlineNode(designerHostService: DesignerHostService, context: SetupContext): UseOutlineNode { +export function useOutlineNode(designerHostService: DesignerHost, context: SetupContext): UseOutlineNode { /** 当前选中的树节点id */ const currentSelectedNodeId = ref(''); @@ -111,7 +111,7 @@ export function useOutlineNode(designerHostService: DesignerHostService, context } case ComponentType.dataGrid: case ComponentType.table: { - const treeGrid = designerHostService?.formSchemaUtils.selectNode(componentsItem, (item) => item.type === (DgControl['tree-grid'] && DgControl['tree-grid'].type)); + const treeGrid = designerHostService?.pageSchema.selectNode(componentsItem, (item) => item.type === (DgControl['tree-grid'] && DgControl['tree-grid'].type)); if (treeGrid) { return '树表格组件'; } diff --git a/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx b/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx index c2169ec2da2694d7f3e39a88ffd35a92e1496a98..49604c659343ec10c9dae3526638ae1dcc7bff64 100644 --- a/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx +++ b/packages/ui-vue/components/drawer/src/designer/drawer.design.component.tsx @@ -21,7 +21,7 @@ import { drawerPropsDesignerProps } from '../drawer.props'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRules } from './use-designer-rules'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; import { responseToolbarResolver } from '../../../response-toolbar'; import FResponseToolbarDesignComponent from '../../../response-toolbar/src/designer/response-toolbar.design.component'; import FDesignerInnerItem from '../../../designer-canvas/src/components/designer-inner-item.component'; @@ -31,7 +31,7 @@ export default defineComponent({ props: drawerPropsDesignerProps, setup(props, context) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/drawer/src/designer/use-designer-rules.ts b/packages/ui-vue/components/drawer/src/designer/use-designer-rules.ts index 083b618f372c14e13dc75250fdc05b2d39441cf3..2a7b3551f1db2ebf8824249d2d6e194b07330bad 100644 --- a/packages/ui-vue/components/drawer/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/drawer/src/designer/use-designer-rules.ts @@ -1,9 +1,9 @@ -import { DesignerHostService, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { DesignerItemContext } from "../../../designer-canvas/src/types"; import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; import { DrawerProperty } from "../property-config/drawer.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); /** diff --git a/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.design.component.tsx b/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.design.component.tsx index 75fc84dcc00287bf01b0e13bb276939bfff574ec..5faeb2538f201c24d4f9fe15f687e3954b1ab04a 100644 --- a/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.design.component.tsx +++ b/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.design.component.tsx @@ -2,7 +2,7 @@ import { SetupContext, computed, defineComponent, ref, watch, inject } from 'vue import { DynamicFormGroupPropsType, dynamicFormGroupProps } from './dynamic-form-group.props'; import Label from '../dynamic-form-label/dynamic-form-label.component'; import { useTypeResolverDesign } from '../../composition/use-type-resolver-design'; -import { DesignerHostService } from '../../../../../components/designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../../../components/designer-canvas/src/composition/types'; import { DesignerItemContext } from '../../../../designer-canvas/src/types'; import { useFormBindingResolverDesign } from '../../composition/form-binding-resolver-design'; @@ -21,7 +21,7 @@ export default defineComponent({ const showLabel = ref(props.showLabel); const type = ref(props.type); const editorRef = ref(); - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service') as DesignerHost; const designItemContext = inject('design-item-context') as DesignerItemContext; const { resolveEditorProps, resolveEditorType } = useTypeResolverDesign(); diff --git a/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.props.ts b/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.props.ts index 66860ea7b2ca50d3a425acd4c9f8156731c49232..0a971e2d8194d09b788d9d97f7cfa0efec7a6274 100644 --- a/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.props.ts +++ b/packages/ui-vue/components/dynamic-form/src/component/dynamic-form-group/dynamic-form-group.props.ts @@ -13,8 +13,8 @@ export const dynamicFormGroupProps = { /** 筛选组件配置器,具体配置项可查看各组件文档 */ editor: { type: Object as PropType, default: {} }, label: { type: String, default: '' }, - /** value is uncertain because type is uncertain, default value should not be set */ - modelValue: { type: [String, Boolean, Array, Number] }, + /** 组件值 */ + modelValue: { type: [String, Boolean, Array, Number, Object], default: '' }, // readonly: { type: Boolean, default: false }, visible: { type: Boolean, default: true }, required: { type: Boolean, default: false }, diff --git a/packages/ui-vue/components/dynamic-form/src/component/validation-message/validation-message.props.ts b/packages/ui-vue/components/dynamic-form/src/component/validation-message/validation-message.props.ts index 7872786b9972cd1994bdb0977dd39805785b09db..0545839cde757a8ddff2bafaaec9a47faa3e9f44 100644 --- a/packages/ui-vue/components/dynamic-form/src/component/validation-message/validation-message.props.ts +++ b/packages/ui-vue/components/dynamic-form/src/component/validation-message/validation-message.props.ts @@ -1,12 +1,13 @@ import { PropType } from "vue"; -export type FormValidationInfo ={ +export type FormValidationInfo = { [validateType: string]: { name: string; } } export const validationMessageProps = { + id: { type: String, default: '' }, /** * 显示的错误信息 */ diff --git a/packages/ui-vue/components/dynamic-form/src/composition/form-binding-resolver-design.ts b/packages/ui-vue/components/dynamic-form/src/composition/form-binding-resolver-design.ts index 51ddabb2f8e0c7f8a7dcfde2a5aa144ea9c0a5c6..cdc4aebed237fc59bb7eb4a88872e4f4f670165d 100644 --- a/packages/ui-vue/components/dynamic-form/src/composition/form-binding-resolver-design.ts +++ b/packages/ui-vue/components/dynamic-form/src/composition/form-binding-resolver-design.ts @@ -1,23 +1,23 @@ import { FormBindingType } from "../../../../components/property-panel"; -import { DesignerHostService } from "../../../../components/designer-canvas/src/composition/types"; +import { DesignerHost } from "../../../../components/designer-canvas/src/composition/types"; import { DesignerItemContext } from "../../../../components/designer-canvas"; import { FormSchemaEntityField$Type } from "../../../../components/common/entity/entity-schema"; import { DynamicFormGroupPropsType } from "../component/dynamic-form-group/dynamic-form-group.props"; -export function useFormBindingResolverDesign(designerHostService: DesignerHostService, designItemContext: DesignerItemContext, props: DynamicFormGroupPropsType) { +export function useFormBindingResolverDesign(designerHostService: DesignerHost, designItemContext: DesignerItemContext, props: DynamicFormGroupPropsType) { function checkBindingFormFieldValidation() { const belongedComponentId = props.componentId; if (!belongedComponentId) { return false; } - const viewModelId = designerHostService.formSchemaUtils.getViewModelIdByComponentId(belongedComponentId); + const viewModelId = designerHostService.pageSchema.getViewModelIdByComponentId(belongedComponentId); if (!viewModelId) { return false; } const { schema } = designItemContext; - const { designViewModelUtils } = designerHostService; - const dgViewModel = designViewModelUtils.getDgViewModel(viewModelId); + const { designViewModel } = designerHostService; + const dgViewModel = designViewModel.getDgViewModel(viewModelId); const dgVMField = dgViewModel?.fields.find(f => f.id === schema.binding.field); // schema中已移除的字段 @@ -34,7 +34,7 @@ export function useFormBindingResolverDesign(designerHostService: DesignerHostSe function checkBindingVariableFieldValidation() { const { schema } = designItemContext; - const bindingVarible = designerHostService.formSchemaUtils.getVariableById(schema.binding.field); + const bindingVarible = designerHostService.pageSchema.getVariableById(schema.binding.field); // vm中已移除的变量 if (!bindingVarible) { diff --git a/packages/ui-vue/components/dynamic-form/src/composition/response-form-component-creator.service.ts b/packages/ui-vue/components/dynamic-form/src/composition/response-form-component-creator.service.ts index 1a4dcd986fa0f382dda1b9777eee730209a65c0a..4d5511473a90f99070ebf79f2d48aa4471eb88e2 100644 --- a/packages/ui-vue/components/dynamic-form/src/composition/response-form-component-creator.service.ts +++ b/packages/ui-vue/components/dynamic-form/src/composition/response-form-component-creator.service.ts @@ -1,5 +1,4 @@ -import { inject } from 'vue'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; import { DynamicResolver } from '../../../../components/dynamic-resolver'; import { ComponentBuildInfo } from '../../../component/src/composition/inner-component-build-info'; import { ComponentSchema } from '../../../../components/designer-canvas'; @@ -12,17 +11,17 @@ const ROOT_VIEW_MODEL_ID = 'root-viewmodel'; */ export class ResponseFormComponentCreatorService { - private formSchemaUtils: any; - private controlCreatorUtils: any; - private designViewModelUtils: any; + private pageSchema: any; + private controlCreator: any; + private designViewModel: any; constructor( private resolver: DynamicResolver, - private designerHostService: DesignerHostService + private designerHostService: DesignerHost ) { - this.formSchemaUtils = this.designerHostService.formSchemaUtils; - this.controlCreatorUtils = this.designerHostService.controlCreatorUtils; - this.designViewModelUtils = this.designerHostService.designViewModelUtils; + this.pageSchema = this.designerHostService.pageSchema; + this.controlCreator = this.designerHostService.controlCreator; + this.designViewModel = this.designerHostService.designViewModel; } public createComponent(buildInfo: ComponentBuildInfo) { @@ -32,11 +31,11 @@ export class ResponseFormComponentCreatorService { const viewModelNode = this.createViewModeNode(buildInfo); - const formSchema = this.formSchemaUtils.getFormSchema(); - formSchema.module.viewmodels.push(viewModelNode); - formSchema.module.components.push(componentNode); + const pageSchema = this.pageSchema.getPageSchema(); + pageSchema.module.viewmodels.push(viewModelNode); + pageSchema.module.components.push(componentNode); - this.designViewModelUtils.assembleDesignViewModel(); + this.designViewModel.assembleDesignViewModel(); return componentRefNode; } @@ -70,7 +69,7 @@ export class ResponseFormComponentCreatorService { * 获取卡片组件层级的class样式 */ private getFormComponentClass(): string { - const {templateId} = this.formSchemaUtils.getFormSchema().module; + const { templateId } = this.pageSchema.getPageSchema().module; // 双列表标签页模板中拖入卡片 if (templateId === 'double-list-in-tab-template') { @@ -108,7 +107,7 @@ export class ResponseFormComponentCreatorService { selectedFields?.forEach(field => { const dgVMField = cloneDeep(field); const resolvedControlClass = this.resolveControlClassByFormColumns(buildInfo); - const fieldMetadata = this.controlCreatorUtils.setFormFieldProperty(dgVMField, '', resolvedControlClass); + const fieldMetadata = this.controlCreator.setFormFieldProperty(dgVMField, '', resolvedControlClass); if (fieldMetadata) { controls.push(fieldMetadata); @@ -116,7 +115,7 @@ export class ResponseFormComponentCreatorService { }); // 双列表标签页模板中拖入卡片,要求卡片要填充 - const {templateId} = this.formSchemaUtils.getFormSchema().module; + const { templateId } = this.pageSchema.getPageSchema().module; if (templateId === 'double-list-in-tab-template') { section.appearance.class = 'f-section-grid f-section-in-main px-0 pt-0'; section.fill = true; diff --git a/packages/ui-vue/components/dynamic-form/src/designer/form-group-use-designer-rules.ts b/packages/ui-vue/components/dynamic-form/src/designer/form-group-use-designer-rules.ts index 76cc460da981633a375d9e5a719a22e3d136fd04..987dfd61db62bd175b117912655f9a190884130d 100644 --- a/packages/ui-vue/components/dynamic-form/src/designer/form-group-use-designer-rules.ts +++ b/packages/ui-vue/components/dynamic-form/src/designer/form-group-use-designer-rules.ts @@ -1,6 +1,6 @@ -import { DesignerItemContext, DesignerHostService, UseDesignerRules, DgControl } from "@farris/ui-vue/components/designer-canvas"; +import { DesignerItemContext, DesignerHost, UseDesignerRules, DgControl } from "@farris/ui-vue/components/designer-canvas"; -export function useDesignerRulesForFormGroup(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRulesForFormGroup(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { function checkCanMoveComponent() { return true; @@ -20,13 +20,13 @@ export function useDesignerRulesForFormGroup(designItemContext: DesignerItemCont * 若控件有绑定信息,删除控件时需要同步移除viewmodel中的记录 */ function removeBindingFromViewModel(bindingFieldId: string) { - const designViewModelUtils = designerHostService?.designViewModelUtils; - const formSchemaUtils = designerHostService?.formSchemaUtils; + const designViewModelUtils = designerHostService?.designViewModel; + const pageSchema = designerHostService?.pageSchema; const belongedComponentId = designItemContext?.componentInstance.value?.belongedComponentId; - if (!belongedComponentId || !designViewModelUtils || !formSchemaUtils) { + if (!belongedComponentId || !designViewModelUtils || !pageSchema) { return; } - const belongedviewModelId = formSchemaUtils.getViewModelIdByComponentId(belongedComponentId); + const belongedviewModelId = pageSchema.getViewModelIdByComponentId(belongedComponentId); const dgViewModel = designViewModelUtils.getDgViewModel(belongedviewModelId); if (dgViewModel) { @@ -63,22 +63,12 @@ export function useDesignerRulesForFormGroup(designItemContext: DesignerItemCont * 若控件配置了表达式,删除控件时需要同步移除表达式 */ function removeExpression(bindingFieldId: string) { - const formSchemaUtils = designerHostService?.formSchemaUtils; - const { schema } = designItemContext; - if (formSchemaUtils.getExpressions().length) { - const expressions = formSchemaUtils.getExpressions(); - const expFieldIndex = expressions.findIndex(e => e.target === bindingFieldId); + const pageSchema = designerHostService?.pageSchema; + + if (pageSchema.getExpressions().length) { + const expFieldIndex = pageSchema.getExpressions().findIndex(e => e.target === bindingFieldId); if (expFieldIndex > -1) { - expressions[expFieldIndex].rules?.map(expresssionRule => { - // 只有当前控件配置了表达式,才会触发删除 - const propertyInSchema = expresssionRule.type === 'visible' ? schema[expresssionRule.type] : schema.editor?.[expresssionRule.type]; - if (propertyInSchema && propertyInSchema.type === 'Expression' && propertyInSchema.expressionId === expresssionRule.id) { - if (!checkExpressionOccupiedRepeated(bindingFieldId, expresssionRule)) { - expresssionRule.needDelete = true; - } - } - }); - expressions[expFieldIndex].rules = expressions[expFieldIndex].rules.filter(rule => !rule.needDelete); + pageSchema.getExpressions().splice(expFieldIndex, 1); } } diff --git a/packages/ui-vue/components/dynamic-form/src/designer/form-group.design.component.tsx b/packages/ui-vue/components/dynamic-form/src/designer/form-group.design.component.tsx index f035477836680b4a89f816648e3db49aa0e88bc2..80842dd19fec2630f362e3fc7da1d146d303c348 100644 --- a/packages/ui-vue/components/dynamic-form/src/designer/form-group.design.component.tsx +++ b/packages/ui-vue/components/dynamic-form/src/designer/form-group.design.component.tsx @@ -1,11 +1,10 @@ - -import { SetupContext, defineComponent, inject, onMounted, ref } from 'vue'; + import { defineComponent, inject, onMounted, ref } from 'vue'; import { DynamicFormGroupPropsType, dynamicFormGroupProps } from '../component/dynamic-form-group/dynamic-form-group.props'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import FDynamicFormGroupDesign from '../component/dynamic-form-group/dynamic-form-group.design.component'; -import { propertyConfigSchemaMapForDesigner } from '@farris/ui-vue/components/dynamic-resolver'; -import { DesignerHostService } from '../../../../components/designer-canvas/src/composition/types'; +import { propertyConfigSchemaMap } from '../../../../components/dynamic-resolver/src/property-config-resolver'; +import { DesignerHost } from '../../../../components/designer-canvas/src/composition/types'; import { useDesignerRulesForFormGroup } from './form-group-use-designer-rules'; export default defineComponent({ @@ -15,7 +14,7 @@ export default defineComponent({ setup(props: DynamicFormGroupPropsType, context) { const elementRef = ref(); const designItemContext = inject('design-item-context') as DesignerItemContext; - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designerRulesComposition = useDesignerRulesForFormGroup(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/dynamic-form/src/designer/response-form-use-designer-rules.ts b/packages/ui-vue/components/dynamic-form/src/designer/response-form-use-designer-rules.ts index 7863c860357f7597737145ac17a42cd2d5ea889d..9efb06f3cf781d8fb7c5a0d2ad21700de063ef59 100644 --- a/packages/ui-vue/components/dynamic-form/src/designer/response-form-use-designer-rules.ts +++ b/packages/ui-vue/components/dynamic-form/src/designer/response-form-use-designer-rules.ts @@ -1,4 +1,4 @@ -import { DesignerHostService, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "@farris/ui-vue/components/designer-canvas"; +import { DesignerHost, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; import { ComponentSchema, DesignerItemContext } from "@farris/ui-vue/components/designer-canvas"; import { getSchemaByTypeForDesigner, schemaMap } from "@farris/ui-vue/components/dynamic-resolver"; @@ -20,7 +20,7 @@ export interface FormUseDesignerRules extends UseDesignerRules { syncFieldToViewModel: (resolveContext: DraggingResolveContext, editorType: string, groupId?: string, groupName?: string) => void; } -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): FormUseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): FormUseDesignerRules { const schema = designItemContext.schema as ComponentSchema; const dragAndDropRules = new UseTemplateDragAndDropRules(); @@ -32,14 +32,14 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe function checkBindingSameEntity(draggingContext: DraggingResolveContext, canMoveBetweenCompoenent: boolean) { const { sourceElement } = draggingContext; const { componentInstance: sourceComponentInstance } = sourceElement; - const formSchemaUtils = designerHostService?.formSchemaUtils; - if (!formSchemaUtils) { + const pageSchema = designerHostService?.pageSchema; + if (!pageSchema) { return true; } - const sourceComponent = formSchemaUtils.getComponentById(sourceComponentInstance.value.belongedComponentId); - const sourceViewmodel = formSchemaUtils.getViewModelById(sourceComponent.viewModel); - const currentComponent = formSchemaUtils.getComponentById(designItemContext.componentInstance.value.belongedComponentId); - const currentViewmodel = formSchemaUtils.getViewModelById(currentComponent.viewModel); + const sourceComponent = pageSchema.getComponentById(sourceComponentInstance.value.belongedComponentId); + const sourceViewmodel = pageSchema.getViewModelById(sourceComponent.viewModel); + const currentComponent = pageSchema.getComponentById(designItemContext.componentInstance.value.belongedComponentId); + const currentViewmodel = pageSchema.getViewModelById(currentComponent.viewModel); // 只能在当前组件内移动 if (!canMoveBetweenCompoenent) { return sourceViewmodel?.id === currentViewmodel?.id; @@ -58,9 +58,9 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (!designerHostService) { return; } - const { formSchemaUtils, schemaService } = designerHostService; - const currentComponent = formSchemaUtils.getComponentById(designItemContext.componentInstance.value.belongedComponentId); - const fieldInfo = schemaService.getFieldByIDAndVMID(bindingTargetId, currentComponent.viewModel); + const { pageSchema, entitySchema } = designerHostService; + const currentComponent = pageSchema.getComponentById(designItemContext.componentInstance.value.belongedComponentId); + const fieldInfo = entitySchema.getFieldByIDAndVMID(bindingTargetId, currentComponent.viewModel); if (fieldInfo?.schemaField) { return true; } @@ -119,11 +119,11 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe function changeGroupValueForViewModelField(sourceElement: DesignerHTMLElement) { const sourceComponentInstance = sourceElement.componentInstance; const sourceComponentSchema = sourceComponentInstance.value.schema; - const useFormSchema = designerHostService?.formSchemaUtils; - const dgViewModelUtil = designerHostService?.designViewModelUtils; + const pageSchema = designerHostService?.pageSchema; + const designViewModel = designerHostService?.designViewModel; - const sourceViewModelId = useFormSchema.getViewModelIdByComponentId(sourceComponentInstance.value.belongedComponentId); - const sourceDesignViewModel = dgViewModelUtil.getDgViewModel(sourceViewModelId); + const sourceViewModelId = pageSchema.getViewModelIdByComponentId(sourceComponentInstance.value.belongedComponentId); + const sourceDesignViewModel = designViewModel.getDgViewModel(sourceViewModelId); const sourceParentComponentInstance = sourceComponentInstance.value.parent; if (sourceParentComponentInstance && DgControl['fieldset'] && sourceParentComponentInstance['schema']?.type === DgControl['fieldset'].type) { @@ -136,7 +136,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe break; } case FormBindingType.Variable: { - useFormSchema.modifyViewModelFieldById(sourceViewModelId, sourceComponentSchema.binding.field, vmChangeSet, true); + pageSchema.modifyViewModelFieldById(sourceViewModelId, sourceComponentSchema.binding.field, vmChangeSet, true); break; } } @@ -149,14 +149,13 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe * @param sourceViewModelId 源控件所属视图模型id * @param dgViewModelService 视图模型服务类 */ - function moveFieldBetweenViewModel(sourceBindingFieldId: string, sourceViewModel: any, currentViewmodelId: string) { - const sourceFieldInViewmodel = sourceViewModel.fields.find(field => field.id === sourceBindingFieldId); - const dgViewModelUtil = designerHostService?.designViewModelUtils; - const sourceDgViewModel = dgViewModelUtil.getDgViewModel(sourceViewModel.id); + function moveFieldBetweenViewModel(sourceBindingFieldId: string, sourceViewModelId: string, currentViewmodelId: string) { + const designViewModel = designerHostService?.designViewModel; + const sourceDgViewModel = designViewModel.getDgViewModel(sourceViewModelId); const sourceVMField = sourceDgViewModel.fields.find(f => f.id === sourceBindingFieldId); sourceDgViewModel.removeField([sourceBindingFieldId]); - const currentDgViewModel = dgViewModelUtil.getDgViewModel(currentViewmodelId); + const currentDgViewModel = designViewModel.getDgViewModel(currentViewmodelId); currentDgViewModel.addField(sourceVMField); if (sourceFieldInViewmodel.fieldSchema) { currentDgViewModel.changeField(sourceVMField.id, sourceFieldInViewmodel.fieldSchema); @@ -291,8 +290,8 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (!variableIds.length) { return; } - const useFormSchema = designerHostService?.formSchemaUtils; - const sourceComponent = useFormSchema.getComponentByViewModelId(sourceViewModelId); + const pageSchema = designerHostService?.pageSchema; + const sourceComponent = pageSchema.getComponentByViewModelId(sourceViewModelId); const allUsedVariables: string[] = []; const searchVariableInControl = ((control: any, usedVariables: string[]) => { if (!control) { @@ -310,8 +309,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe }); searchInAllControls(sourceComponent, searchVariableInControl, allUsedVariables); - - const sourceViewModel = useFormSchema.getViewModelById(sourceViewModelId); + const sourceViewModel = pageSchema.getViewModelById(sourceViewModelId); variableIds.forEach(variableId => { if (!allUsedVariables.includes(variableId)) { sourceViewModel.states = sourceViewModel.states.filter(state => state.id !== variableId); @@ -407,14 +405,14 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe * 跨组件移动输入类控件,需要同步视图模型中的字段和变量等信息 */ function moveInputBetweenComponent(sourceElement: DesignerHTMLElement) { - const useFormSchema = designerHostService?.formSchemaUtils; + const pageSchema = designerHostService?.pageSchema; const sourceComponentInstance = sourceElement.componentInstance; const sourceComponentSchema = sourceComponentInstance.value.schema; - const sourceViewModelId = useFormSchema.getViewModelIdByComponentId(sourceComponentInstance.value.belongedComponentId); - const sourceViewModel = useFormSchema.getViewModelById(sourceViewModelId); - const currentComponent = useFormSchema.getComponentById(designItemContext.componentInstance.value.belongedComponentId); - const currentViewmodel = useFormSchema.getViewModelById(currentComponent.viewModel); + const sourceViewModelId = pageSchema.getViewModelIdByComponentId(sourceComponentInstance.value.belongedComponentId); + const sourceViewModel = pageSchema.getViewModelById(sourceViewModelId); + const currentComponent = pageSchema.getComponentById(designItemContext.componentInstance.value.belongedComponentId); + const currentViewmodel = pageSchema.getViewModelById(currentComponent.viewModel); if (sourceViewModelId !== currentViewmodel.id) { // 源控件绑定的字段或变量id @@ -504,7 +502,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (belongedComponentInstance && belongedComponentInstance.schema && belongedComponentInstance.schema.componentType) { const { formColumns } = belongedComponentInstance.schema; let appearanceClass = resolveControlClassByComponentType(formColumns); - appearanceClass = designerHostService?.formSchemaUtils.getControlClassByFormUnifiedLayout(appearanceClass, belongedComponentInstance.schema.id, designItemContext.schema); + appearanceClass = designerHostService?.pageSchema.getControlClassByFormUnifiedLayout(appearanceClass, belongedComponentInstance.schema.id, designItemContext.schema); if (!formGroupElementSchema.appearance) { formGroupElementSchema.appearance = {}; @@ -518,11 +516,11 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe function syncFieldToViewModel(resolveContext: DraggingResolveContext, editorType: string, groupId?: string, groupName?: string) { const { bindingSourceContext, parentComponentInstance } = resolveContext; if (bindingSourceContext?.entityFieldNode && parentComponentInstance) { - const designViewModelUtils = designerHostService?.designViewModelUtils; - const formSchemaUtils = designerHostService?.formSchemaUtils; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(parentComponentInstance.belongedComponentId); + const designViewModel = designerHostService?.designViewModel; + const pageSchema = designerHostService?.pageSchema; + const viewModelId = pageSchema.getViewModelIdByComponentId(parentComponentInstance.belongedComponentId); - const dgViewModel = designViewModelUtils.getDgViewModel(viewModelId); + const dgViewModel = designViewModel.getDgViewModel(viewModelId); dgViewModel.removeField([bindingSourceContext.entityFieldNode.id]); dgViewModel.addField(bindingSourceContext.designViewModelField); if (editorType) { @@ -541,8 +539,8 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe let formGroupElementSchema; // 控件若有绑定信息,则根据绑定信息创建控件 if (resolveContext.bindingSourceContext?.entityFieldNode) { - const controlCreatorUtils = designerHostService?.controlCreatorUtils; - formGroupElementSchema = controlCreatorUtils.setFormFieldProperty(resolveContext.bindingSourceContext?.entityFieldNode, componentSchema?.type); + const controlCreator = designerHostService?.controlCreator; + formGroupElementSchema = controlCreator.setFormFieldProperty(resolveContext.bindingSourceContext?.entityFieldNode, componentSchema?.type); } else { formGroupElementSchema = getSchemaByTypeForDesigner('form-group') as ComponentSchema; formGroupElementSchema.editor = componentSchema; diff --git a/packages/ui-vue/components/dynamic-form/src/designer/response-form.design.component.tsx b/packages/ui-vue/components/dynamic-form/src/designer/response-form.design.component.tsx index a7ca0c430ff2a80f4e906fea403d884b0750cf48..4e14f5e96951af86960548e6c1cdce2707700497 100644 --- a/packages/ui-vue/components/dynamic-form/src/designer/response-form.design.component.tsx +++ b/packages/ui-vue/components/dynamic-form/src/designer/response-form.design.component.tsx @@ -3,8 +3,8 @@ import { DynamicFormGroupPropsType, dynamicFormGroupProps } from '../component/d import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRules } from './response-form-use-designer-rules'; -import { areaResponseDirective } from '@farris/ui-vue/components/common'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import areaResponseDirective from '../../../common/directive/area-response'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FResponseFormDesign', @@ -16,7 +16,7 @@ export default defineComponent({ setup(props: DynamicFormGroupPropsType, context) { const elementRef = ref(); const designItemContext = inject('design-item-context') as DesignerItemContext; - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/dynamic-form/src/property-config/response-form.property-config.ts b/packages/ui-vue/components/dynamic-form/src/property-config/response-form.property-config.ts index c24abde5c82c786ffffeb840f1246626c8033c4d..964bdbdb02fb1d478fea2f1813c11779d61465fe 100644 --- a/packages/ui-vue/components/dynamic-form/src/property-config/response-form.property-config.ts +++ b/packages/ui-vue/components/dynamic-form/src/property-config/response-form.property-config.ts @@ -14,7 +14,7 @@ export class ResponseFormProperty extends BaseControlProperty { // 基本信息 this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); // 外观 - const { checkIsInFormComponent, assembleUnifiedLayoutContext, changeFormControlsByUnifiedLayoutConfig } = useResponseFormLayoutSetting(this.formSchemaUtils, this.componentId); + const { checkIsInFormComponent, assembleUnifiedLayoutContext, changeFormControlsByUnifiedLayoutConfig } = useResponseFormLayoutSetting(this.pageSchema, this.componentId); const appearanceCategory = this.getAppearanceConfig(propertyData); const issInFormComponent= checkIsInFormComponent(this.componentId); appearanceCategory.properties['labelAutoOverflow']={ @@ -58,8 +58,8 @@ export class ResponseFormProperty extends BaseControlProperty { } private setLabelAutoOverflow(propertyData: any, enableLableAutoOverflow: boolean) { // const formNode = this.domService.domDgMap.get(propertyData.id); - const componentNode = this.formSchemaUtils.getComponentById(this.componentId); - const formNode = this.formSchemaUtils.selectNode(componentNode, item => item.id === propertyData.id); + const componentNode = this.pageSchema.getComponentById(this.componentId); + const formNode = this.pageSchema.selectNode(componentNode, item => item.id === propertyData.id); if (formNode && formNode.contents && formNode.contents.length) { formNode.contents.forEach(control => { if (!control.appearance) { diff --git a/packages/ui-vue/components/dynamic-form/src/schema/response-form-schema-resolver.ts b/packages/ui-vue/components/dynamic-form/src/schema/response-form-schema-resolver.ts index 8c4c432523175ccb41f3e6b149591a0300f89056..21ac44368738a23046fc3b99a3aca57d588e9234 100644 --- a/packages/ui-vue/components/dynamic-form/src/schema/response-form-schema-resolver.ts +++ b/packages/ui-vue/components/dynamic-form/src/schema/response-form-schema-resolver.ts @@ -1,11 +1,11 @@ import { ComponentBuildInfo } from "../../../component/src/composition/inner-component-build-info"; -import { DesignerHostService } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost } from "../../../designer-canvas/src/composition/types"; import { DesignerComponentInstance } from "../../../designer-canvas/src/types"; import { DynamicResolver } from "../../../dynamic-resolver"; import { ResponseFormComponentCreatorService } from "../composition/response-form-component-creator.service"; -export function reponseFormSchemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHostService): Record { +export function reponseFormSchemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHost): Record { const parentComponentInstance = context.parentComponentInstance as DesignerComponentInstance; if (parentComponentInstance && designerHostService) { const parentComponentType = parentComponentInstance.schema?.type; diff --git a/packages/ui-vue/components/dynamic-resolver/src/props-resolver.ts b/packages/ui-vue/components/dynamic-resolver/src/props-resolver.ts index 4149639d269f7eaa860917a848a9fdd2dfe981f6..d33d3212b5d456f8afd1ef95505d1ebb624883b1 100644 --- a/packages/ui-vue/components/dynamic-resolver/src/props-resolver.ts +++ b/packages/ui-vue/components/dynamic-resolver/src/props-resolver.ts @@ -1,5 +1,5 @@ -import { DesignerHostService } from './../../designer-canvas/src/composition/types'; -import { mappingSchemaToProps, resolveSchemaToProps, schemaMap, schemaResolverMap } from './resolver/schema/schema-resolver'; +import { DesignerHost } from './../../designer-canvas/src/composition/types'; +import { mappingSchemaToProps, resolveSchemaToProps, schemaMap, schemaResolverMap } from './schema-resolver'; import { DynamicResolver, EffectFunction, MapperFunction, SchemaResolverFunction } from './types'; import { propertyConfigSchemaMap, propertyEffectMap } from './resolver/property-config/property-config-resolver'; import { schemaMapForDesigner, schemaResolverMapForDesigner } from './resolver/schema/schema-resolver-design'; @@ -13,7 +13,7 @@ export function createPropsResolver>( dynamicResolver: DynamicResolver, schema: Record, resolveContext: Record, - designerHostService?: DesignerHostService + designerHostService?: DesignerHost ) => schema, propertyConfig: Record = {}, propertyEffect: EffectFunction = (properties: Record) => properties diff --git a/packages/ui-vue/components/dynamic-resolver/src/schema-resolver.ts b/packages/ui-vue/components/dynamic-resolver/src/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..2284fbbccfe7f27454a606097a70009b0830485b --- /dev/null +++ b/packages/ui-vue/components/dynamic-resolver/src/schema-resolver.ts @@ -0,0 +1,134 @@ +import { cloneDeep, isPlainObject } from "lodash-es"; +import { DesignerHost } from "../../designer-canvas/src/composition/types"; +import { MapperFunction, SchemaResolverFunction } from "./types"; + +const schemaMap = {} as Record; +const schemaResolverMap = {} as Record; + +function getSchemaValueByDefault(defaultSchema: Record): Record { + const { properties, title, ignore: ignoreList } = defaultSchema as Record; + const canIgnoreProperty = ignoreList && Array.isArray(ignoreList); + const resolvedSchema = Object.keys(properties).reduce((propsObject: Record, propKey: string) => { + if (!canIgnoreProperty || !ignoreList.find(item => item === propKey)) { + propsObject[propKey] = (properties[propKey].type === 'object' && !!properties[propKey].properties) ? + getSchemaValueByDefault(properties[propKey]) : cloneDeep(properties[propKey].default); + } + return propsObject; + }, {}); + if (title && (!canIgnoreProperty || !ignoreList.find(item => item === 'id'))) { + const typePrefix = title.toLowerCase().replace(/-/g, '_'); + resolvedSchema.id = `${typePrefix}_${Math.random().toString().slice(2, 6)}`; + } + return resolvedSchema; +} +/** + * 获取控件元数据,只组装必填的字段 + */ +function getRequiredSchemaValueByDefault(defaultSchema: Record): Record { + const { properties, title, required: requiredProperty } = defaultSchema as Record; + if (requiredProperty && Array.isArray(requiredProperty)) { + const resolvedSchema = requiredProperty.reduce((propsObject: Record, propKey: string) => { + + propsObject[propKey] = (properties[propKey].type === 'object' && !!properties[propKey].properties) ? + getSchemaValueByDefault(properties[propKey]) : cloneDeep(properties[propKey].default); + + return propsObject; + }, {}); + if (title && requiredProperty.find(item => item === 'id')) { + const typePrefix = title.toLowerCase().replace(/-/g, '_'); + resolvedSchema.id = `${typePrefix}_${Math.random().toString().slice(2, 6)}`; + } + return resolvedSchema; + } + return { + type: title + }; + +} +function getSchemaByType(componentType: string, resolveContext: Record = {}, designerHostService?: DesignerHost) + : Record | null { + const defaultSchema = schemaMap[componentType]; + if (defaultSchema) { + let componentSchema = getRequiredSchemaValueByDefault(defaultSchema); + const schemaResolver = schemaResolverMap[componentType]; + componentSchema = schemaResolver ? schemaResolver({ getSchemaByType }, componentSchema, resolveContext, designerHostService) + : componentSchema; + return componentSchema; + } + return null; +} + +function resolveSchema(schemaValue: Record, defaultSchema: Record): Record { + + const resolvedSchema = getSchemaValueByDefault(defaultSchema); + + Object.keys(resolvedSchema).reduce((resolvedSchema: Record, propKey: string) => { + if (Object.prototype.hasOwnProperty.call(schemaValue, propKey)) { + // 解决属性是对象类型,默认值被冲掉的情况 + // 增加非判断,解决针对属性时对象,但是schemaValue=null或者undefined情况 + if (resolvedSchema[propKey] && isPlainObject(resolvedSchema[propKey]) && (isPlainObject(schemaValue[propKey] || !schemaValue[propKey]))) { + Object.assign(resolvedSchema[propKey], schemaValue[propKey] || {}); + } else { + resolvedSchema[propKey] = schemaValue[propKey]; + } + } + + return resolvedSchema; + }, resolvedSchema); + + return resolvedSchema; +}; + +function mappingSchemaToProps(resolvedSchema: Record, schemaMapper: Map) { + const props = Object.keys(resolvedSchema) + .filter((propKey: string) => resolvedSchema[propKey] != null) + .reduce((resolvedProps: Record, propKey: string) => { + if (schemaMapper.has(propKey)) { + const mapper = schemaMapper.get(propKey) as string | MapperFunction; + if (typeof mapper === 'string') { + resolvedProps[mapper] = resolvedSchema[propKey]; + } else { + const mapperResult = (mapper as MapperFunction)(propKey, resolvedSchema[propKey], resolvedSchema); + Object.assign(resolvedProps, mapperResult); + } + } else { + resolvedProps[propKey] = resolvedSchema[propKey]; + } + return resolvedProps; + }, {}); + return props; +} + +function resolveSchemaToProps( + schemaValue: Record, + defaultSchema: Record, + schemaMapper: Map = new Map() +): Record { + const resolvedSchema = resolveSchema(schemaValue, defaultSchema); + const props = mappingSchemaToProps(resolvedSchema, schemaMapper); + return props; +} + +function resolveSchemaWithDefaultValue(schemaValue: Record): Record { + const componentType = schemaValue.type; + if (componentType) { + const defaultSchema = schemaMap[componentType]; + if (!defaultSchema) { + return schemaValue; + } + const resolvedSchema = resolveSchema(schemaValue, defaultSchema); + const editorType = schemaValue.editor?.type || ''; + /* 解决schemeValue结构如下图场景,在editor下,获取不到date-picker类型的默认值的问题 + * {type:'input-group',...,editor:{type:'date-picker',...}} + */ + if (editorType) { + const defaulEditorSchema = schemaMap[editorType]; + const resolvedEditorSchema = resolveSchema(schemaValue.editor, defaulEditorSchema); + resolvedSchema.editor = resolvedEditorSchema; + } + return resolvedSchema; + } + return schemaValue; +} + +export { getSchemaByType, resolveSchemaWithDefaultValue, resolveSchemaToProps, schemaMap, schemaResolverMap, mappingSchemaToProps }; diff --git a/packages/ui-vue/components/dynamic-resolver/src/types.ts b/packages/ui-vue/components/dynamic-resolver/src/types.ts index 5c096dff439b022863b4fe4b12610e9338c55117..f3181b5967ebfcaf157072e6c30bc910ad86b7e0 100644 --- a/packages/ui-vue/components/dynamic-resolver/src/types.ts +++ b/packages/ui-vue/components/dynamic-resolver/src/types.ts @@ -1,5 +1,5 @@ -import { DesignerHostService } from "../../designer-canvas/src/composition/types"; +import { DesignerHost } from "../../designer-canvas/src/composition/types"; export type MapperFunction = (key: string, value: any, resolvedSchema?: any) => Record; @@ -28,7 +28,7 @@ export interface PropertyConverter { } export interface DynamicResolver { - getSchemaByType: (componentType: string, resolveContext?: Record, designerHostService?: DesignerHostService) => Record | null; + getSchemaByType: (componentType: string, resolveContext?: Record, designerHostService?: DesignerHost) => Record | null; getPropertyConfigByType?: (componentType: string) => Record | null; }; @@ -36,7 +36,7 @@ export type SchemaResolverFunction = ( dynamicResolver: DynamicResolver, schema: Record, resolveContext: Record, - designerHostService?: DesignerHostService + designerHostService?: DesignerHost ) => Record; export type EffectFunction = (source: Record) => Record; diff --git a/packages/ui-vue/components/dynamic-view/src/dynamic-view.component.tsx b/packages/ui-vue/components/dynamic-view/src/dynamic-view.component.tsx index f654b4c4120db6fd61d112f2e663960bd05c6bbd..b52f965fc8ff01a2a85b2e317789d466b8969b26 100644 --- a/packages/ui-vue/components/dynamic-view/src/dynamic-view.component.tsx +++ b/packages/ui-vue/components/dynamic-view/src/dynamic-view.component.tsx @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-unsafe-function-type */ /* eslint-disable no-use-before-define */ -import { SetupContext, defineComponent, ref, watch, inject, createVNode, VNode, reactive, Reactive } from 'vue'; +import { SetupContext, defineComponent, ref, watch, inject, createVNode, VNode, reactive, Reactive, onMounted, onBeforeMount } from 'vue'; import { cloneDeep, merge, mergeWith } from 'lodash-es'; import { dynamicViewProps, DynamicViewProps } from './dynamic-view.props'; import { componentMap, componentPropsConverter, loadRegister, resolverMap } from './components/maps'; @@ -394,6 +394,16 @@ const FDynamicView = defineComponent({ convertSchemaToProps(viewSchema); }); + onBeforeMount(() => { + if (schema.value?.module?.components) { + const viewSchema = getFrameComponentSchema(); + if (!viewSchema) { + return; + } + convertSchemaToProps(viewSchema); + } + }); + setupContext.expose({ componentManager, rerender, getProps, invoke, setProps, selectItemById, getSchema, setSchema, convertPartialSchemaToProps }); return () => { diff --git a/packages/ui-vue/components/entity-binding-selector/composition/use-entity-tree.ts b/packages/ui-vue/components/entity-binding-selector/composition/use-entity-tree.ts index 37183ac33772ee1dd890d6dbd956aae64a518233..276b3bcdc85bcf51bf214b6efc4b11cee8ec21f7 100644 --- a/packages/ui-vue/components/entity-binding-selector/composition/use-entity-tree.ts +++ b/packages/ui-vue/components/entity-binding-selector/composition/use-entity-tree.ts @@ -90,12 +90,12 @@ export function useEntityTree(props: EntityBindingSelectorProps) { * 组装实体树 */ function resolveEntityDataSource() { - const { formSchemaUtils } = designerHostService; - const rootSchemaEntity = formSchemaUtils.getFormSchema().module.entity[0]?.entities[0]; + const { pageSchema } = designerHostService; + const rootSchemaEntity = pageSchema.getPageSchema().module.entity[0]?.entities[0]; entityBindToMap.clear(); const rootSchemaTreeNode = resolveEntity(rootSchemaEntity); - entityDataSource.value = [rootSchemaTreeNode]; + entityDataSource.value = rootSchemaTreeNode ? [rootSchemaTreeNode] : []; } function checkAndGetSelectedEntity() { diff --git a/packages/ui-vue/components/entity-binding-selector/composition/use-field-tree.ts b/packages/ui-vue/components/entity-binding-selector/composition/use-field-tree.ts index f33dec453151a6ed98c766827184c1512cf58bec..aea5ff819e6078fdc351a32440d64332a5d95b3b 100644 --- a/packages/ui-vue/components/entity-binding-selector/composition/use-field-tree.ts +++ b/packages/ui-vue/components/entity-binding-selector/composition/use-field-tree.ts @@ -83,19 +83,19 @@ export function useFieldTree(props: EntityBindingSelectorProps) { if (['frame', 'table', 'form'].includes(targetComponentType)) { targetComponentType = 'form'; } - const { formSchemaUtils, schemaService } = designerHostService; + const { pageSchema, entitySchema } = designerHostService; - formSchemaUtils.getFormSchema().module.viewmodels.forEach(viewModel => { + pageSchema.getPageSchema().module.viewmodels.forEach(viewModel => { if (!viewModel.fields || viewModel.fields.length === 0) { return; } - const componentNode = formSchemaUtils.getComponentByViewModelId(viewModel.id); + const componentNode = pageSchema.getComponentByViewModelId(viewModel.id); // 绑定同一个实体,并且是同类型的组件(form类、dataGrid类...) let sourceComponentType = componentNode.componentType; if (['frame', 'table', 'form'].includes(sourceComponentType)) { sourceComponentType = 'form'; } - const entityInfo = schemaService.getTableInfoByViewModelId(viewModel.id); + const entityInfo = entitySchema.getTableInfoByViewModelId(viewModel.id); if (sourceComponentType !== targetComponentType || !entityInfo || entityInfo.id !== bindingEntity.id) { return; diff --git a/packages/ui-vue/components/events-editor/src/components/combine-form/combine-form.component.tsx b/packages/ui-vue/components/events-editor/src/components/combine-form/combine-form.component.tsx index 42f1811e7e1d9f80174eddcfd331fc1abaa1d977..6d081ed2addd6c0aad63fc4f726199ef843eb7e5 100644 --- a/packages/ui-vue/components/events-editor/src/components/combine-form/combine-form.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/combine-form/combine-form.component.tsx @@ -8,6 +8,7 @@ import "./combine-form.scss"; import { useCommunication } from "./use-communication"; import { Communication } from "./types"; import FSelectSourceControl from './select-source-control.component'; +import { DesignerHost } from "../../../../designer-canvas"; /** * 组合表单通讯相关组件 @@ -17,14 +18,11 @@ export default defineComponent({ props: combineFormProps, emits: ['changed'] as (string[] & ThisType) | undefined, setup(props: CombineFormProps, context: SetupContext) { - - const useFormSchema = inject('useFormSchema') as any; - const { saveCommunication, resolveCommunication } = useCommunication(useFormSchema); + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema } = designerHostService; + const { saveCommunication, resolveCommunication } = useCommunication(pageSchema); const communication = ref() as Ref; communication.value = resolveCommunication(props); - const shouldShowSourceControl = ref(props.sourceCommunication?.needSelectSourceControl); - const shouldShowTargetPanel = computed(() => communication.value?.source?.componentId && communication.value?.source?.event); - const parameterRef = ref(); onMounted(() => { }); diff --git a/packages/ui-vue/components/events-editor/src/components/combine-form/select-command.component.tsx b/packages/ui-vue/components/events-editor/src/components/combine-form/select-command.component.tsx index fc50a455f5483145933c8bbb3e3febb5c609fa74..6878bb2390c466eb983f6e34ad6019917e3eb348 100644 --- a/packages/ui-vue/components/events-editor/src/components/combine-form/select-command.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/combine-form/select-command.component.tsx @@ -1,6 +1,7 @@ import { SetupContext, defineComponent, ref, inject, computed, onMounted, watch, Ref } from "vue"; import { Communication } from "./types"; import { combineFormProps, CombineFormProps } from './combine-form.props'; +import { DesignerHost } from "../../../../designer-canvas"; /** * 选择目标命令 @@ -11,8 +12,9 @@ export default defineComponent({ emits: ['selectCommand', 'addParameter'] as (string[] & ThisType) | undefined, setup(props: CombineFormProps, context: SetupContext) { const communication = ref(props.communication) as Ref; - const useFormSchema = inject('useFormSchema') as any; - const formMetaBasicInfo = useFormSchema.getFormMetadataBasicInfo(); + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema } = designerHostService; + const formMetaBasicInfo = pageSchema.getMetadata(); const targetCommands: any = ref([]); const selectedTargetCommand = ref(); const shouldShowCommandList = ref(false); @@ -65,10 +67,10 @@ export default defineComponent({ } // 当前表单 if (communication.value.target.formId === formMetaBasicInfo.id) { - getAllCommands(useFormSchema.getViewModels()); + getAllCommands(pageSchema.getViewModels()); } else { // 外部表单 - const targetFormSchema = useFormSchema.externalFormSchema.get(communication.value?.target?.externalContainerId); + const targetFormSchema = pageSchema.externalPageSchema.get(communication.value?.target?.externalContainerId); if (targetFormSchema?.content?.module?.viewmodels) { getAllCommands(targetFormSchema.content.module.viewmodels); } diff --git a/packages/ui-vue/components/events-editor/src/components/combine-form/select-parameter.component.tsx b/packages/ui-vue/components/events-editor/src/components/combine-form/select-parameter.component.tsx index d35519f188e27b1e9a60023a20a1f6db38e8a50c..3bc728e87645f57e641e8593dcf94ed5b4d9c01f 100644 --- a/packages/ui-vue/components/events-editor/src/components/combine-form/select-parameter.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/combine-form/select-parameter.component.tsx @@ -3,10 +3,9 @@ import { SetupContext, defineComponent, ref, inject, computed, onMounted, watch, import { combineFormProps, CombineFormProps } from './combine-form.props'; import { useGuid } from "@farris/ui-vue/components/common"; import { VisualData } from "../../../../data-view"; -import { Communication, CommunicationParameter } from "./types"; -import { cloneDeep } from "lodash-es"; -import { FNotifyService } from "@farris/ui-vue/components/notify"; -import FEventParameter from "@farris/ui-vue/components/event-parameter"; +import { Communication } from "../../types"; +import { DesignerHost } from "../../../../designer-canvas"; + /** * 配置通讯参数 @@ -23,9 +22,9 @@ export default defineComponent({ const communication = ref(props.communication) as Ref; /** 参数列表 */ const parameters = ref(communication.value?.paramMappings || []); - - const useFormSchema = inject('useFormSchema') as any; - const formMetaBasicInfo = useFormSchema.getFormMetadataBasicInfo(); + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema } = designerHostService; + const formMetaBasicInfo = pageSchema.getMetadata(); /** 目标表单的变量,树结构 */ const targetVariableTreeData: any = ref([]); /** 目标表单的变量,平级结构 */ @@ -105,10 +104,10 @@ export default defineComponent({ } // 当前表单 if (communication.value.target.formId === formMetaBasicInfo.id) { - targetVariableTreeData.value = getAllVariables(useFormSchema.getViewModels()); + targetVariableTreeData.value = getAllVariables(pageSchema.getViewModels()); } else { // 外部表单 - const targetFormSchema = useFormSchema.externalFormSchema.get(communication.value.target.externalContainerId); + const targetFormSchema = pageSchema.externalPageSchema.get(communication.value.target.externalContainerId); if (targetFormSchema?.content?.module?.viewmodels) { targetVariableTreeData.value = getAllVariables(targetFormSchema?.content?.module.viewmodels); } diff --git a/packages/ui-vue/components/events-editor/src/components/combine-form/select-source-control.component.tsx b/packages/ui-vue/components/events-editor/src/components/combine-form/select-source-control.component.tsx index cf2aeca15bc9610a3c79cb3e4d287812bab47006..eaec7bd36935ca3a9ee086ba39c5349f422f44e4 100644 --- a/packages/ui-vue/components/events-editor/src/components/combine-form/select-source-control.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/combine-form/select-source-control.component.tsx @@ -2,7 +2,8 @@ import { SetupContext, defineComponent, ref, inject, computed, onMounted, Ref, w import { combineFormProps, CombineFormProps } from './combine-form.props'; import { useOutlineNode } from '../../../../designer-outline/src/composition/use-outline-node'; import { useDataView } from "../../../../designer-outline/src/composition/use-data-view"; -import { FTreeView } from "@farris/ui-vue/components/tree-view"; +import { FTreeView } from "./../../../../tree-view"; +import { DesignerHost } from "../../../../designer-canvas"; import "./combine-form.scss"; import { schemaMap } from "@farris/ui-vue/components/dynamic-resolver"; @@ -16,8 +17,8 @@ export default defineComponent({ setup(props: CombineFormProps, context: SetupContext) { /** 当前通讯数据 */ const communication = ref(props.communication); - const useFormSchema = inject('useFormSchema') as any; - const formMetaBasicInfo = useFormSchema.getFormMetadataBasicInfo(); + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema } = designerHostService; const columns = ref([{ field: 'name', title: '', dataType: 'string' }]); /** 源表单大纲树数据 */ @@ -61,7 +62,7 @@ export default defineComponent({ function assembleSourceOutline() { const designerHostService: any = inject('designer-host-service'); const useOutlineNodeComposition = useOutlineNode(designerHostService, context); - const sourceFormSchema = useFormSchema.externalFormSchema.get(communication.value?.source.externalContainerId); + const sourceFormSchema = pageSchema.externalPageSchema.get(communication.value?.source.externalContainerId); if (sourceFormSchema?.content) { const outlineProps = { data: sourceFormSchema.content }; const { getData } = useDataView(outlineProps, useOutlineNodeComposition); diff --git a/packages/ui-vue/components/events-editor/src/components/combine-form/select-target-form.component.tsx b/packages/ui-vue/components/events-editor/src/components/combine-form/select-target-form.component.tsx index 44aa741c534736397d2f3c6be5326f06ff11df5e..3e872a4c428972e505d9b98632fd5fb25ef2343d 100644 --- a/packages/ui-vue/components/events-editor/src/components/combine-form/select-target-form.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/combine-form/select-target-form.component.tsx @@ -1,6 +1,7 @@ import { SetupContext, defineComponent, ref, inject, computed, onMounted, Ref, watch } from "vue"; import { Communication } from "./types"; import { combineFormProps, CombineFormProps } from './combine-form.props'; +import { DesignerHost } from "../../../../designer-canvas"; /** * 选择目标表单 @@ -12,8 +13,9 @@ export default defineComponent({ setup(props: CombineFormProps, context: SetupContext) { /** 当前通讯数据 */ const communication = ref(props.communication) as Ref; - const useFormSchema = inject('useFormSchema') as any; - const formMetaBasicInfo = useFormSchema.getFormMetadataBasicInfo(); + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema } = designerHostService; + const formMetaBasicInfo = pageSchema.getMetadata(); /** 页面列表数据 */ const targetForms: any = ref([]); /** 当前选择的页面 */ @@ -46,7 +48,7 @@ export default defineComponent({ } /** 组装目标页面数据列表 */ function getTargetForms() { - const externalFormMap = useFormSchema.externalFormSchema; + const externalFormMap = pageSchema.externalPageSchema; Array.from(externalFormMap.keys()).forEach(containerId => { const formItem = externalFormMap.get(containerId); diff --git a/packages/ui-vue/components/events-editor/src/components/combine-form/use-communication.ts b/packages/ui-vue/components/events-editor/src/components/combine-form/use-communication.ts index 80f8a2103296a5420bc18e89e9568f48afa11b84..69cdf41bcc0399380ee791331bc5dcb933222a88 100644 --- a/packages/ui-vue/components/events-editor/src/components/combine-form/use-communication.ts +++ b/packages/ui-vue/components/events-editor/src/components/combine-form/use-communication.ts @@ -4,7 +4,7 @@ import { Communication } from "./types"; import { CombineFormProps } from "./combine-form.props"; import { InteractionItem } from "../../types"; -export function useCommunication(useFormSchema: any) { +export function useCommunication(usePageSchemaComposition: any) { const communication = ref(); /** @@ -12,7 +12,7 @@ export function useCommunication(useFormSchema: any) { */ function resolveCommunication(props: CombineFormProps): Communication { let result; - const { communications } = useFormSchema.getFormSchema().module; + const { communications } = usePageSchemaComposition.getPageSchema().module; if (props.communication?.id && communications?.length) { result = communications.find(item => item.id === props.communication.id); } @@ -44,7 +44,7 @@ export function useCommunication(useFormSchema: any) { * 保存新增的通讯 */ function saveCommunication(communication: Communication) { - const formSchema = useFormSchema.getFormSchema(); + const formSchema = usePageSchemaComposition.getPageSchema(); const { communications } = formSchema.module; if (!communications) { @@ -61,7 +61,7 @@ export function useCommunication(useFormSchema: any) { */ function clearCommunication(interaction: InteractionItem) { if (interaction?.communication) { - const formSchema = useFormSchema.getFormSchema(); + const formSchema = usePageSchemaComposition.getPageSchema(); if (formSchema.module.communications) { formSchema.module.communications = formSchema.module.communications.filter(communication => communication.id !== interaction.communication?.id); } diff --git a/packages/ui-vue/components/events-editor/src/components/command-source/command-source.component.tsx b/packages/ui-vue/components/events-editor/src/components/command-source/command-source.component.tsx index ab985b51af5bc623c11b0c3116aca1b57a3f6cd8..9993db52f2c6cf2c721360968e25508bc8641b75 100644 --- a/packages/ui-vue/components/events-editor/src/components/command-source/command-source.component.tsx +++ b/packages/ui-vue/components/events-editor/src/components/command-source/command-source.component.tsx @@ -4,6 +4,7 @@ import { Command, CommandItem, MethodChangedEventArgs, PropertyItem } from "../. import { FSchemaSelector } from '@farris/ui-vue/components/schema-selector'; import { F_MODAL_SERVICE_TOKEN } from '@farris/ui-vue/components/modal'; import { UseMethods } from '../../composition/types'; +import { DesignerHost } from "../../../../designer-canvas"; import './command-source.css'; import FCommandList from '../command-list/command-list.component'; @@ -38,8 +39,10 @@ export default defineComponent({ 'switchToCommunicationPanel' ] as (string[] & ThisType) | undefined, setup(props: CommandSourceProps, context: SetupContext) { + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema, commands } = designerHostService; const methodsComposition = inject('useMethodsComposition') as UseMethods; - const formCommandService = inject('useFormCommand') as any; + // const formCommandService = inject('useFormCommand') as any; const notifyService = new NotifyService(); const { checkIfNewControllerExists, addNewController } = methodsComposition; const haveBoundCommand = ref(false); @@ -62,13 +65,13 @@ export default defineComponent({ 'flex': '1 1 0' }; }); - const useFormSchema = inject('useFormSchema') as any; + const modalService = inject(F_MODAL_SERVICE_TOKEN) as any; let newFuncModal: any; const shoulShowCommunication = ref(false); onMounted(() => { - shoulShowCommunication.value = useFormSchema.externalFormSchema.size > 0; + shoulShowCommunication.value = pageSchema.externalPageSchema.size > 0; }); /** * 「引入控制器」-方法绑定 @@ -81,7 +84,7 @@ export default defineComponent({ addNewController(controller); if (controller.Commands) { // 构造内置控制器 - const importData = formCommandService['getInternalControllerFromControllerMetadata'](controller, code, nameSpace); + const importData = commands['getInternalControllerFromControllerMetadata'](controller, code, nameSpace); // 检测新增的控制器不存在于原internals中 if (checkIfNewControllerExists(importData)) { notifyService.info({ position: 'top-center', message: '该控制器已存在' }); @@ -93,7 +96,7 @@ export default defineComponent({ * @param selectedController 控制器元数据 */ async function onSubmitController(selectedController: any) { - formCommandService['getSupportedControllerMetadata'](selectedController).then((result: any) => { + commands['getSupportedControllerMetadata'](selectedController).then((result: any) => { if (result) { // 引入控制器 importNewController(result['controller'], result['code'], result['nameSpace']); @@ -112,7 +115,7 @@ export default defineComponent({ } function renderControllerModal() { const controllerSelectorParams = { - formBasicInfo: useFormSchema?.getFormMetadataBasicInfo() + formBasicInfo: pageSchema.getMetadata() }; return ('useMethodsComposition') as UseMethods; const { toggleSelectingMethod, emitFinalState, getViewModeId, getMethodsOnViewModel, getComponentList, updateTarget, updateCommandHasPath } = methodsComposition; - const useFormSchema = inject('useFormSchema') as any; - const { clearCommunication } = useCommunication(useFormSchema); + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema } = designerHostService; const { clearCommunication } = useCommunication(pageSchema); const controllers = ref(props.controllers); const interaction = ref(props.interaction); const methodSelectedChanged = ref(false); diff --git a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.css b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.css index 556775277cf811ef060a7f3cceae9a9e83d1c9ae..cb43943bd1cf18467fee9ee09a324c2a5772e2cf 100644 --- a/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.css +++ b/packages/ui-vue/components/events-editor/src/components/parameter-editor/parameter-editor.css @@ -75,20 +75,20 @@ height: 25px; } -.f-icon.f-icon-yxs_delete:hover { +.f-page-events-editor .f-icon.f-icon-yxs_delete:hover { color: #2a75ee; } -.f-icon.f-icon-yxs_delete { +.f-page-events-editor .f-icon.f-icon-yxs_delete { color: #a7b0bb; } -.f-icon.f-icon-edit-button:hover { +.f-page-events-editor .f-icon.f-icon-edit-button:hover { color: #2a75ee; cursor: pointer; } -.f-icon.f-icon-edit-button { +.f-page-events-editor .f-icon.f-icon-edit-button { color: #a7b0bb; } diff --git a/packages/ui-vue/components/events-editor/src/events-editor.component.tsx b/packages/ui-vue/components/events-editor/src/events-editor.component.tsx index 01a2c32df1158b9d60eacd0bf7300b3349fe877b..60af52fdb7be53153121099485ed2753c7023e1d 100644 --- a/packages/ui-vue/components/events-editor/src/events-editor.component.tsx +++ b/packages/ui-vue/components/events-editor/src/events-editor.component.tsx @@ -9,6 +9,7 @@ import { useEvents } from "./composition/use-events"; import FInteractionButton from './components/interaction-button/interaction-button.component'; import FInteractionItem from './components/interaction-item/interaction-item.component'; import { UseEvents, UseInteraction, UseMethods } from "./composition/types"; +import { DesignerHost } from "../../designer-canvas"; import './events-editor.css'; import { useMethods } from "./composition/use-methods"; @@ -28,8 +29,9 @@ export default defineComponent({ const useEventsComposition = useEvents(initialData); const { loadEvents, resetBoundEvents } = useEventsComposition; - const useFormSchema = inject('useFormSchema') as any; - const useInteractionCompostion = useInteraction(useFormSchema, useEventsComposition, initialData); + const designerHostService = inject('designer-host-service') as DesignerHost; + const { pageSchema } = designerHostService; + const useInteractionCompostion = useInteraction(pageSchema, useEventsComposition, initialData); const { addNewInteraction, deleteInteracton, interactions, loadInteractions } = useInteractionCompostion; const useMethodsComposition = useMethods(initialData, useInteractionCompostion, context); diff --git a/packages/ui-vue/components/events-editor/src/events-editor.css b/packages/ui-vue/components/events-editor/src/events-editor.css index e93fe26af26bb9974a97e64e54c71752ab387e94..8266f46d9ac975aa573f5d8153f1f4d908be477c 100644 --- a/packages/ui-vue/components/events-editor/src/events-editor.css +++ b/packages/ui-vue/components/events-editor/src/events-editor.css @@ -119,31 +119,31 @@ margin-bottom: 0 !important; } -.f-icon.f-icon-arrow-chevron-down:hover { +.f-page-events-editor .f-icon.f-icon-arrow-chevron-down:hover { color: #2a75ee; cursor: pointer; } -.f-icon.f-icon-arrow-chevron-left:hover { +.f-page-events-editor .f-icon.f-icon-arrow-chevron-left:hover { color: #2a75ee; cursor: pointer; } -.f-icon.f-icon-yxs_delete:hover { +.f-page-events-editor .f-icon.f-icon-yxs_delete:hover { color: #2a75ee; cursor: pointer; } -.f-icon.f-icon-home-add:hover { +.f-page-events-editor .f-icon.f-icon-home-add:hover { color: #2a75ee; cursor: pointer; } -.f-icon.f-icon-yxs_delete { +.f-page-events-editor .f-icon.f-icon-yxs_delete { color: #a7b0bb; } -.f-icon.f-icon-home-add { +.f-page-events-editor .f-icon.f-icon-home-add { color: #a7b0bb; } diff --git a/packages/ui-vue/components/external-container/src/designer/external-container.design.component.tsx b/packages/ui-vue/components/external-container/src/designer/external-container.design.component.tsx index aa8b4fde2c057765c8bba0c4e9f8b71811cc41dc..fa373b748eb365b99a01717fb706b1781b47c6d2 100644 --- a/packages/ui-vue/components/external-container/src/designer/external-container.design.component.tsx +++ b/packages/ui-vue/components/external-container/src/designer/external-container.design.component.tsx @@ -1,9 +1,10 @@ import { defineComponent, inject, ref, onMounted, computed, watch, provide } from 'vue'; -import { FDesignerItem, DesignerItemContext, DesignerHostService, useDesignerComponent } from '@farris/ui-vue/components/designer-canvas'; +import { FDesignerItem, DesignerItemContext, useDesignerComponent } from '@farris/ui-vue/components/designer-canvas'; import { FLoadingService } from '@farris/ui-vue/components/loading'; import { externalContainerProps, ExteranlContainerPropsType } from '../external-container.props'; import { useDesignerRules } from './use-designer-rules'; import FImportExternalSchema from './import-external-schema.component'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FExternalContainerDesign', @@ -11,13 +12,13 @@ export default defineComponent({ emits: [], setup(props: ExteranlContainerPropsType, context) { const elementRef = ref(); - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service') as DesignerHost; const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); const messagerService: any = inject('FMessageBoxService'); const loadingService: any | null = inject('FLoadingService'); - const useFormSchema = designerHostService.formSchemaUtils; + const { pageSchema } = designerHostService; /** 引入表单的基础信息 */ const externalComponent = ref(props.externalComponent); @@ -42,11 +43,11 @@ export default defineComponent({ content: externalFormSchema.value, nameLanguage: externalComponent.value.nameLanguage }; - useFormSchema.externalFormSchema.set(componentInstance.value.schema.id, externalForm); + pageSchema.externalPageSchema.set(componentInstance.value.schema.id, externalForm); } /** 查询子表单的元数据内容 */ async function loadFormMetadata() { - const formBasicInfo = designerHostService.formSchemaUtils.getFormMetadataBasicInfo(); + const formBasicInfo = designerHostService.pageSchema.getMetadata(); if (externalComponent.value?.id) { const instance = loadingService?.show(); designerHostService.metadataService.getPickMetadata(formBasicInfo.relativePath, externalComponent.value) diff --git a/packages/ui-vue/components/external-container/src/designer/import-external-schema.component.tsx b/packages/ui-vue/components/external-container/src/designer/import-external-schema.component.tsx index 996e0f09649b6773ff2f38bb3546e9694f3da419..c2ed357f63874d639207187bfe2a87c9beefa2ba 100644 --- a/packages/ui-vue/components/external-container/src/designer/import-external-schema.component.tsx +++ b/packages/ui-vue/components/external-container/src/designer/import-external-schema.component.tsx @@ -1,26 +1,26 @@ import { defineComponent, inject, ref } from 'vue'; import { ModalFunctions } from "@farris/ui-vue/components/modal"; -import { DesignerHostService } from "@farris/ui-vue/components/designer-canvas"; import { FSchemaSelector } from '@farris/ui-vue/components/schema-selector'; import { FormSchemaRepositorySymbol } from '@farris/ui-vue/components/common'; import { FNotifyService } from '@farris/ui-vue/components/notify'; import './import-external-schema.css'; +import { DesignerHost } from "../../../designer-canvas/src/composition/types"; export default defineComponent({ name: 'FImportExteranlSchema', emits: ['close', 'submit'], setup(props, context) { - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service') as DesignerHost; let modalEditorRef: ModalFunctions; const selectedItem = ref(); const notifyService: any = new FNotifyService(); notifyService.globalConfig = { position: 'top-center' }; - const formBasicInfo = designerHostService.formSchemaUtils.getFormMetadataBasicInfo(); + const formBasicInfo = designerHostService.pageSchema.getMetadata(); const schemaSelectorRef = ref(); async function checkFormValidtion(selectionFormInfo: any) { - const formBasicInfo = designerHostService.formSchemaUtils.getFormMetadataBasicInfo(); + const formBasicInfo = designerHostService.pageSchema.getMetadata(); return designerHostService.metadataService.getPickMetadata(formBasicInfo.relativePath, selectionFormInfo) .then((res: any) => { diff --git a/packages/ui-vue/components/external-container/src/designer/use-designer-rules.ts b/packages/ui-vue/components/external-container/src/designer/use-designer-rules.ts index 07b195b895ad2a52dab246498dde50dc3509ea07..51fdc0342d6bcc93a7b41a783bb6ecc6f69012af 100644 --- a/packages/ui-vue/components/external-container/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/external-container/src/designer/use-designer-rules.ts @@ -1,7 +1,8 @@ -import { DesignerHostService, UseDesignerRules, ComponentSchema, DesignerItemContext } from "@farris/ui-vue/components/designer-canvas"; +import { DesignerHost, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { ExternalContainerProperty } from "../property-config/external-container.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const schema = designItemContext.schema as ComponentSchema; /** @@ -34,8 +35,8 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe function onRemoveComponent() { // 移除全局服务中记录的外部表单元数据 - if (designerHostService?.formSchemaUtils) { - designerHostService.formSchemaUtils.externalFormSchema.delete(designItemContext.schema.id); + if (designerHostService?.pageSchema) { + designerHostService.pageSchema.externalPageSchema.delete(designItemContext.schema.id); } } return { canAccepts, checkCanDeleteComponent, checkCanMoveComponent, hideNestedPaddingInDesginerView, getStyles, getPropsConfig, onRemoveComponent }; diff --git a/packages/ui-vue/components/external-container/src/property-config/external-container.property-config.ts b/packages/ui-vue/components/external-container/src/property-config/external-container.property-config.ts index 3e711af4009644277eb40e8c7051eabfc998325e..3be273cbb2cc3c5c954338014efc80fcdf36139d 100644 --- a/packages/ui-vue/components/external-container/src/property-config/external-container.property-config.ts +++ b/packages/ui-vue/components/external-container/src/property-config/external-container.property-config.ts @@ -44,7 +44,7 @@ export class ExternalContainerProperty extends BaseControlProperty { modalHeight: 600, modalWidth: 950, editorParams: { - formBasicInfo: this.formSchemaUtils.getFormMetadataBasicInfo() + formBasicInfo: this.pageSchema.getFormMetadataBasicInfo() }, viewOptions: [ { id: 'recommend', title: '推荐', type: 'Card', dataSource: 'Recommand', pagination: false }, @@ -93,7 +93,7 @@ export class ExternalContainerProperty extends BaseControlProperty { } ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -111,7 +111,7 @@ export class ExternalContainerProperty extends BaseControlProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } } }; diff --git a/packages/ui-vue/components/external-container/src/schema/schema-resolver.ts b/packages/ui-vue/components/external-container/src/schema/schema-resolver.ts index e4854b4da0e6e5ebb6218ef0ca1a3f2531f97755..156c18dd96c05109080cf7a6947762ec9f2991c2 100644 --- a/packages/ui-vue/components/external-container/src/schema/schema-resolver.ts +++ b/packages/ui-vue/components/external-container/src/schema/schema-resolver.ts @@ -1,7 +1,7 @@ -import { DesignerComponentInstance, DesignerHostService, DgControl } from "@farris/ui-vue/components/designer-canvas"; -import { type DynamicResolver } from "@farris/ui-vue/components/dynamic-resolver"; +import { DesignerComponentInstance, DesignerHost, DgControl } from "../../../designer-canvas"; +import { DynamicResolver } from "../../../dynamic-resolver"; -export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHostService): Record { +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHost): Record { const parentComponentInstance = context.parentComponentInstance as DesignerComponentInstance; if (parentComponentInstance && designerHostService) { diff --git a/packages/ui-vue/components/fieldset/src/designer/fieldset.design.component.tsx b/packages/ui-vue/components/fieldset/src/designer/fieldset.design.component.tsx index 03e5dabeeadc620fb63fd267847d02210d7f510f..d44440f9ae539ff06d659ee23b0bee0c41fef713 100644 --- a/packages/ui-vue/components/fieldset/src/designer/fieldset.design.component.tsx +++ b/packages/ui-vue/components/fieldset/src/designer/fieldset.design.component.tsx @@ -1,9 +1,9 @@ import { computed, defineComponent, inject, onMounted, ref } from 'vue'; import { FieldsetDesignerProps, fieldsetDesignerProps } from '../fieldset.props'; -import { useDesignerComponent, DesignerItemContext, DesignerHostService } from '@farris/ui-vue/components/designer-canvas'; +import { useDesignerComponent, DesignerItemContext } from '@farris/ui-vue/components/designer-canvas'; // import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerRules } from './use-designer-rules'; -// import { DesignerHostService } from '../../../designer-canvas'; +import { DesignerHost } from '../../../designer-canvas'; export default defineComponent({ name: 'FFieldsetDesign', @@ -13,7 +13,7 @@ export default defineComponent({ const fieldsetRef = ref(); const elementRef = ref(); const designItemContext = inject('design-item-context') as DesignerItemContext; - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); context.expose(componentInstance.value); diff --git a/packages/ui-vue/components/fieldset/src/designer/use-designer-rules.ts b/packages/ui-vue/components/fieldset/src/designer/use-designer-rules.ts index bae2935bf064649a686b987c754fd1ea443614e2..4917a741253aaa26e28cc1f2095c40c181ae2d49 100644 --- a/packages/ui-vue/components/fieldset/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/fieldset/src/designer/use-designer-rules.ts @@ -1,11 +1,14 @@ -import { DgControl, useDragulaCommonRule, UseTemplateDragAndDropRules, - DesignerHostService, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules, ComponentSchema, DesignerItemContext } from "@farris/ui-vue/components/designer-canvas"; -import { FormBindingType } from "@farris/ui-vue/components/property-panel"; +import { DgControl } from "../../../designer-canvas"; +import { FormBindingType } from "../../../property-panel"; +import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; +import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; +import { DesignerHost, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { FieldsetProperty } from '../property-config/fieldset.property-config'; import { useDesignerRules as formUseDesignerRules } from "@farris/ui-vue/components/dynamic-form"; import { getSchemaByType } from "@farris/ui-vue/components/dynamic-resolver"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); const { canAccept } = dragAndDropRules.getTemplateRule(designItemContext, designerHostService); const schema = designItemContext.schema as ComponentSchema; @@ -29,14 +32,14 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe function checkBindingSameEntity(draggingContext: DraggingResolveContext) { const { sourceElement } = draggingContext; const { componentInstance: sourceComponentInstance } = sourceElement; - const formSchemaUtils = designerHostService?.formSchemaUtils; - if (!formSchemaUtils) { + const pageSchema = designerHostService?.pageSchema; + if (!pageSchema) { return true; } - const sourceComponent = formSchemaUtils.getComponentById(sourceComponentInstance.value.belongedComponentId); - const sourceViewmodel = formSchemaUtils.getViewModelById(sourceComponent.viewModel); - const currentComponent = formSchemaUtils.getComponentById(designItemContext.componentInstance.value.belongedComponentId); - const currentViewmodel = formSchemaUtils.getViewModelById(currentComponent.viewModel); + const sourceComponent = pageSchema.getComponentById(sourceComponentInstance.value.belongedComponentId); + const sourceViewmodel = pageSchema.getViewModelById(sourceComponent.viewModel); + const currentComponent = pageSchema.getComponentById(designItemContext.componentInstance.value.belongedComponentId); + const currentViewmodel = pageSchema.getViewModelById(currentComponent.viewModel); if (sourceViewmodel?.id && currentViewmodel?.id && sourceViewmodel.id !== currentViewmodel.id) { return sourceViewmodel.bindTo === currentViewmodel.bindTo; @@ -51,9 +54,9 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (!designerHostService) { return; } - const { formSchemaUtils, schemaService } = designerHostService; - const currentComponent = formSchemaUtils.getComponentById(designItemContext.componentInstance.value.belongedComponentId); - const fieldInfo = schemaService.getFieldByIDAndVMID(bindingTargetId, currentComponent.viewModel); + const { pageSchema, entitySchema } = designerHostService; + const currentComponent = pageSchema.getComponentById(designItemContext.componentInstance.value.belongedComponentId); + const fieldInfo = entitySchema.getFieldByIDAndVMID(bindingTargetId, currentComponent.viewModel); if (fieldInfo?.schemaField) { return true; } @@ -108,12 +111,12 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (!designerHostService) { return; } - const { formSchemaUtils, designViewModelUtils } = designerHostService; + const { pageSchema, designViewModel } = designerHostService; const sourceComponentInstance = sourceElement.componentInstance; const sourceParentComponentInstance = sourceComponentInstance.value.parent; - const sourceComponent = formSchemaUtils.getComponentById(sourceComponentInstance.value.belongedComponentId); - const sourceDesignViewModel = designViewModelUtils.getDgViewModel(sourceComponent.viewModel); + const sourceComponent = pageSchema.getComponentById(sourceComponentInstance.value.belongedComponentId); + const sourceDesignViewModel = designViewModel.getDgViewModel(sourceComponent.viewModel); switch (sourceParentComponentInstance && sourceParentComponentInstance['schema']?.type) { case DgControl['fieldset'].type: case DgControl['response-form'].type: case DgControl['response-layout-item'].type: { @@ -126,7 +129,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe break; } case FormBindingType.Variable: { - formSchemaUtils.modifyViewModelFieldById(sourceComponent.viewModel, sourceBindingId, changeSet, true); + pageSchema.modifyViewModelFieldById(sourceComponent.viewModel, sourceBindingId, changeSet, true); break; } } @@ -148,9 +151,9 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe changeGroupValueForViewModelField(sourceElement); // 若是跨组件的移动,需要移动viewmodel的字段 - const { formSchemaUtils } = designerHostService; - const sourceViewModelId = formSchemaUtils.getViewModelIdByComponentId(sourceComponentInstance.value.belongedComponentId); - const currentViewModelId = formSchemaUtils.getViewModelIdByComponentId(designItemContext.componentInstance.value.belongedComponentId); + const { pageSchema } = designerHostService; + const sourceViewModelId = pageSchema.getViewModelIdByComponentId(sourceComponentInstance.value.belongedComponentId); + const currentViewModelId = pageSchema.getViewModelIdByComponentId(designItemContext.componentInstance.value.belongedComponentId); if (sourceViewModelId !== currentViewModelId) { const formMoveHandler = formUseDesignerRules(designItemContext, designerHostService); formMoveHandler.moveInputBetweenComponent(sourceElement); @@ -165,8 +168,8 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe let formGroupElementSchema; // 控件若有绑定信息,则根据绑定信息创建控件 if (resolveContext.bindingSourceContext?.entityFieldNode) { - const controlCreatorUtils = designerHostService?.controlCreatorUtils; - formGroupElementSchema = controlCreatorUtils.setFormFieldProperty(resolveContext.bindingSourceContext?.entityFieldNode, componentSchema?.type); + const controlCreator = designerHostService?.controlCreator; + formGroupElementSchema = controlCreator.setFormFieldProperty(resolveContext.bindingSourceContext?.entityFieldNode, componentSchema?.type); } else { formGroupElementSchema = getSchemaByType('form-group') as ComponentSchema; formGroupElementSchema.editor = componentSchema; diff --git a/packages/ui-vue/components/fieldset/src/property-config/fieldset.property-config.ts b/packages/ui-vue/components/fieldset/src/property-config/fieldset.property-config.ts index ca7b59b698312180a53cb9ee7574d56c6cc81bc0..95b3fdb1f38e832eb52bc5d8e2101d334ebc6e3e 100644 --- a/packages/ui-vue/components/fieldset/src/property-config/fieldset.property-config.ts +++ b/packages/ui-vue/components/fieldset/src/property-config/fieldset.property-config.ts @@ -38,11 +38,11 @@ export class FieldsetProperty extends BaseControlProperty { * 修改分组标题后,需要同步viewmodel中字段的分组信息 */ private changeGroupNameInViewModel(groupId: string, groupName: string) { - const dgViewModel = this.designViewModelUtils.getDgViewModel(this.viewModelId); + const dgViewModel = this.designViewModel.getDgViewModel(this.viewModelId); if (dgViewModel) { dgViewModel.changeGroupName(groupId, groupName); } - const viewModel = this.formSchemaUtils.getViewModelById(this.viewModelId); + const viewModel = this.pageSchema.getViewModelById(this.viewModelId); if (viewModel?.fields?.length) { viewModel.fields.forEach(field => { if (field.groupId === groupId) { diff --git a/packages/ui-vue/components/index.ts b/packages/ui-vue/components/index.ts index 86097beba66b628b6eed8033855c99feafdb3610..81673608a20e0ba7a5f2039d419f789e8424f25a 100644 --- a/packages/ui-vue/components/index.ts +++ b/packages/ui-vue/components/index.ts @@ -98,6 +98,7 @@ import '../public/assets/farris-all.css'; export * from './components'; // export all designer components modules export * from './designer'; +export * from './common'; // 不注册设计时组件 export default { diff --git a/packages/ui-vue/components/layout/src/designer/layout-pane-use-designer-rules.ts b/packages/ui-vue/components/layout/src/designer/layout-pane-use-designer-rules.ts index 10104e81ee69ab983dff68fda9c9c7ed384630f2..e81bd3b79b97142b84412138908c7ea2eaa1ba7f 100644 --- a/packages/ui-vue/components/layout/src/designer/layout-pane-use-designer-rules.ts +++ b/packages/ui-vue/components/layout/src/designer/layout-pane-use-designer-rules.ts @@ -1,8 +1,8 @@ -import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const schema = designItemContext.schema as ComponentSchema; /** * 判断是否可以接收拖拽新增的子级控件 diff --git a/packages/ui-vue/components/layout/src/designer/layout-pane.design.component.tsx b/packages/ui-vue/components/layout/src/designer/layout-pane.design.component.tsx index 47e961783581680fa99f7f53119caf66cc0e0fb3..347c1e80890994e69c4dfe44e4be27d845192cda 100644 --- a/packages/ui-vue/components/layout/src/designer/layout-pane.design.component.tsx +++ b/packages/ui-vue/components/layout/src/designer/layout-pane.design.component.tsx @@ -5,7 +5,7 @@ import { useResizePane } from '../composition/use-resize-pane'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRules } from './layout-pane-use-designer-rules'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FLayoutPaneDesign', @@ -14,7 +14,7 @@ export default defineComponent({ setup(props: LayoutPaneProps, context) { const layoutPaneElementRef = ref(); const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/list-nav/src/designer/list-nav.design.component.tsx b/packages/ui-vue/components/list-nav/src/designer/list-nav.design.component.tsx index fe4750cc0fe95885e7b13666513b3cf313502f35..2a5d406e8f7a45d2d05ebd9e152d13cb8fb2ecfc 100644 --- a/packages/ui-vue/components/list-nav/src/designer/list-nav.design.component.tsx +++ b/packages/ui-vue/components/list-nav/src/designer/list-nav.design.component.tsx @@ -18,7 +18,7 @@ import { listNavProps, ListNavProps } from '../list-nav.props'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerRules } from './use-designer-rules'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FListNavDesign', @@ -26,7 +26,7 @@ export default defineComponent({ emits: [] as (string[] & ThisType) | undefined, setup(props: ListNavProps, context: SetupContext) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/list-nav/src/designer/use-designer-rules.ts b/packages/ui-vue/components/list-nav/src/designer/use-designer-rules.ts index b1b36109ef3a98d0c0c2d0372fec7f0e0c5f074f..b8ff2da29c017bfdf8f178d370d069b1b86b730d 100644 --- a/packages/ui-vue/components/list-nav/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/list-nav/src/designer/use-designer-rules.ts @@ -1,12 +1,12 @@ - - -import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; + + +import { DesignerHost, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; import { DgControl, DesignerItemContext } from "@farris/ui-vue/components/designer-canvas"; import { ListNavProperty } from "../property-config/list-nav.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); const { canAccept } = dragAndDropRules.getTemplateRule(designItemContext, designerHostService); diff --git a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts index 1df2f5729da7b36c3b727ee86d03d8e8a2af7229..dbdfd5351933ce03ed346645bcd7df8b22daf352 100644 --- a/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts +++ b/packages/ui-vue/components/lookup/src/property-config/lookup.property-config.ts @@ -33,12 +33,17 @@ export class LookupPropertyConfig extends InputBaseProperty { private freeInputEditor: any = { ...this.comboListEditor, editable: false }; getExpressionConfig(propertyData: any, type: 'Field' | 'Button' | 'Container') { - const suportTypes = ['validate',]; - if (propertyData.type === 'form-group') { - suportTypes.push('dataPicking'); - } - - return new ExpressionProperty(this.formSchemaUtils).getExpressionConfig(propertyData, 'Field', suportTypes); + return new ExpressionProperty(this.pageSchema).getExpressionConfig( + propertyData, + 'Field', + ['validate', 'dataPicking'], + (rule: any) => { + if (rule && rule.value.trim() && rule.type === 'dataPicking') { + propertyData.dictPickingExpressionId = rule.id; + } else { + delete propertyData.dictPickingExpressionId; + } + }); } getPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance | null) { @@ -83,38 +88,21 @@ export class LookupPropertyConfig extends InputBaseProperty { return this.getPropertyConfig(propertyData, null).categories; } - private flattenTreeNodes(treeNodes: any[]): any[] { - return treeNodes.reduce((result, item) => { - result.push(item); - if (item.children?.length) { - result.push(...this.flattenTreeNodes(item.children)); - } - return result; - }, [] as any[]); - } - private isSimpleStringField(): boolean { + private isSimpleStringField() { const fullPath = this.designViewModelField?.path || ''; - if (!fullPath || !fullPath.includes('.')) { return true; } - - const fieldList = fullPath.split('.'); - const fields = this.designViewModelUtils.getAllFields2TreeByVMId(this.viewModelId); - if (!fields?.length) { return false; } - - const fieldInfo = fields.find(item => item.data.code === fieldList[0]); - if (!fieldInfo) { return false; } - - const allFields = [fieldInfo, ...this.flattenTreeNodes(fieldInfo.children)]; - return !fieldList - .reduce((paths, current, index) => - [...paths, index ? `${paths[index - 1]}.${current}` : current], - [] as string[] - ) - .some(path => - allFields.find(field => field.data.path === path)?.data?.type?.$type === 'EntityType' - ); + if (fullPath) { + const field = fullPath.indexOf('.') > -1 ? fullPath.split('.')[0] : fullPath; + const fields = this.designViewModel.getAllFields2TreeByVMId(this.viewModelId); + if (fields && fields.length) { + const fieldInfo = fields.map(node => node.data).find(data => data.code === field); + return fieldInfo?.type?.$type === "StringType" && fieldInfo?.$type === 'SimpleField'; + } + return ''; + } } + getBehaviorConfig(propertyData) { return { description: "Basic Infomation", @@ -146,8 +134,8 @@ export class LookupPropertyConfig extends InputBaseProperty { private getLookupConfig(propertyData: any) { const editorOptions = propertyData.editor; const getRemoteParams = () => { - const viewModelId = this.formSchemaUtils.getFormSchema().module.entity[0].id; - const formBasicInfo = this.formSchemaUtils.getFormMetadataBasicInfo(); + const viewModelId = this.pageSchema.getPageSchema().module.entity[0].id; + const formBasicInfo = this.pageSchema.getFormMetadataBasicInfo(); return { propertyData: editorOptions, formBasicInfo, viewModelId, dataSourceId: editorOptions.helpId }; }; @@ -224,7 +212,7 @@ export class LookupPropertyConfig extends InputBaseProperty { title: "选择数据源", editorParams: { propertyData: editorOptions, - formBasicInfo: this.formSchemaUtils.getFormMetadataBasicInfo() + formBasicInfo: this.pageSchema.getFormMetadataBasicInfo() }, displayFormatter: (items) => { if (items && items.length) { @@ -248,7 +236,7 @@ export class LookupPropertyConfig extends InputBaseProperty { onSubmitModal: (dataSourceSchema: any) => { if (dataSourceSchema) { delete editorOptions.mappingFields; - const formInfo = this.formSchemaUtils.getFormMetadataBasicInfo(); + const formInfo = this.pageSchema.getFormMetadataBasicInfo(); // 获取数据源详细配置信息 return this.metadataService.getPickMetadata(formInfo.relativePath, dataSourceSchema[0].data) .then((res: any) => { @@ -273,8 +261,8 @@ export class LookupPropertyConfig extends InputBaseProperty { enableExpression: true, editorParams: { propertyData: editorOptions, - formBasicInfo: this.formSchemaUtils.getFormMetadataBasicInfo(), - viewModelId: this.formSchemaUtils.getFormSchema().module.entity[0].id, + formBasicInfo: this.pageSchema.getMetadata(), + viewModelId: this.pageSchema.getPageSchema().module.entity[0].id, }, idField: 'path', repositoryToken: FieldSelectorRepositoryToken, @@ -286,7 +274,7 @@ export class LookupPropertyConfig extends InputBaseProperty { } const repositoryParams = getRemoteParams(); - const expressionService = new ExpressionProperty(this.formSchemaUtils); + const expressionService = new ExpressionProperty(this.pageSchema); const entitiesAndVariables = expressionService.getEntitiesAndVariables(); @@ -368,7 +356,7 @@ export class LookupPropertyConfig extends InputBaseProperty { idField: 'bindingPath', editorParams: { propertyData: editorOptions, - formBasicInfo: this.formSchemaUtils.getFormMetadataBasicInfo() + formBasicInfo: this.pageSchema.getFormMetadataBasicInfo() }, columns: [ { field: 'name', title: '名称' }, @@ -391,7 +379,7 @@ export class LookupPropertyConfig extends InputBaseProperty { idField: 'bindingPath', editorParams: { propertyData: editorOptions, - formBasicInfo: this.formSchemaUtils.getFormMetadataBasicInfo() + formBasicInfo: this.pageSchema.getFormMetadataBasicInfo() }, columns: [ { field: 'name', title: '名称' }, @@ -413,7 +401,7 @@ export class LookupPropertyConfig extends InputBaseProperty { editable: false, editorParams: { propertyData: editorOptions, - formBasicInfo: this.formSchemaUtils.getFormMetadataBasicInfo() + formBasicInfo: this.pageSchema.getFormMetadataBasicInfo() }, fromData: { editable: false, @@ -429,14 +417,7 @@ export class LookupPropertyConfig extends InputBaseProperty { idField: 'bindingPath', textField: 'bindingPath', valueField: 'bindingPath', - dataSource: () => { - const fields = this.designViewModelUtils.getAllFields2TreeByVMId(this.viewModelId); - const primaryField = this.schemaService.getPrimaryField(); - if (primaryField) { - return fields.filter(item => item.data.bindingPath !== primaryField); - } - return fields; - }, + dataSource: this.designViewModel.getAllFields2TreeByVMId(this.viewModelId), formatter: (cell, data) => { return `${data.raw['name']} [${data.raw['bindingPath']}]`; } @@ -817,7 +798,7 @@ export class LookupPropertyConfig extends InputBaseProperty { // this.appendFieldValueChangeEvents(propertyData, events); - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -837,12 +818,12 @@ export class LookupPropertyConfig extends InputBaseProperty { const parameters = changeObject.propertyValue; delete newPropertyData[self.viewModelId]; if (parameters) { - // parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(newPropertyData, self.viewModelId, parameters['events'], parameters); + parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } // 同步视图模型值变化事件 - const designVM = self.designViewModelUtils.getDgViewModel(self.viewModelId); + const designVM = self.designViewModel.getDgViewModel(self.viewModelId); if (designVM && self.designViewModelField) { designVM.changeField(self.designViewModelField.id, { valueChanging: newPropertyData.fieldValueChanging, valueChanged: newPropertyData.fieldValueChanged }); } diff --git a/packages/ui-vue/components/modal/index.ts b/packages/ui-vue/components/modal/index.ts index a884c987dba86d258f54e08c4b1b7e7dd66de524..62cecdeb47004ae18436eb81a3ce5bc121d99979 100644 --- a/packages/ui-vue/components/modal/index.ts +++ b/packages/ui-vue/components/modal/index.ts @@ -19,6 +19,7 @@ import FModalService from './src/composition/modal.service'; export * from './src/composition/type'; export * from './src/modal.props'; +export * from './src/composition/type'; export const F_MODAL_SERVICE_TOKEN = Symbol('FModalService'); diff --git a/packages/ui-vue/components/modal/src/composition/modal.service.tsx b/packages/ui-vue/components/modal/src/composition/modal.service.tsx index 2339bf9910ce67df36eb9467db29119fc6ef0fdd..30602824f882731e6dd8be7ae24b4eb53f37fe03 100644 --- a/packages/ui-vue/components/modal/src/composition/modal.service.tsx +++ b/packages/ui-vue/components/modal/src/composition/modal.service.tsx @@ -29,6 +29,7 @@ function createModalInstance(options: ModalOptions) { const showButtons = ref(!!options.showButtons); const showHeader = ref(!!options.showHeader); const showCloseButton = ref(options.showCloseButton == null ? true : options.showCloseButton); + const showFloatingCloseButton = ref(!!options.showFloatingClose); const showModal = ref(true); const modalTitle = ref(options.title || ''); const acceptCallback = options.acceptCallback || (() => { }); @@ -66,6 +67,7 @@ function createModalInstance(options: ModalOptions) { show-buttons={showButtons.value} show-close-button={showCloseButton.value} show-max-button={false} + showFloatingClose={showFloatingCloseButton.value} onAccept={acceptCallback} onCancel={rejectCallback} fitContent={options.fitContent == null ? true : options.fitContent} @@ -129,7 +131,7 @@ export default class ModalService { height = winHeight - 14; } - return { + return { width, height }; @@ -220,7 +222,7 @@ export default class ModalService { }; const { width: modalWidth, height: modalHeight } = modalOptions.value; - const adaptedSize = this.adaptToWindow(modalWidth || 500, modalHeight || 320); + const adaptedSize = this.adaptToWindow(modalWidth || 500, modalHeight || 320); Object.assign(modalOptions.value, adaptedSize); const ModalWrapper = () => ( diff --git a/packages/ui-vue/components/modal/src/modal.component.tsx b/packages/ui-vue/components/modal/src/modal.component.tsx index e194c8e7824eb92f4e401d0a0cba3a8836745f9c..4ea39596feeb536430e09cb012a7679a49a2363a 100644 --- a/packages/ui-vue/components/modal/src/modal.component.tsx +++ b/packages/ui-vue/components/modal/src/modal.component.tsx @@ -122,7 +122,7 @@ export default defineComponent({ watch(() => props.modelValue, (newValue, oldValue) => { if (newValue !== oldValue) { modelValue.value = newValue; - if(modelValue.value && props.draggable) { + if (modelValue.value && props.draggable) { // 等待DOM挂载后,注册拖拽handler nextTick(() => { if (modalElementRef.value && !containment.value) { @@ -133,7 +133,7 @@ export default defineComponent({ }); } if (!newValue) { - if(containment.value){ + if (containment.value) { containment.value = null; } removeModalOpenStyle(); @@ -180,6 +180,7 @@ export default defineComponent({ modal: true, 'farris-modal': true, 'fade': true, + 'fe-cmp-page-modal': !!props.showFloatingClose } as Record; classObject['f-modal-fitContent'] = !!fitContent.value; classObject.show = !!showModal.value; @@ -221,7 +222,7 @@ export default defineComponent({ const styleObject: any = { display: 'block' }; - if(!props.mask) { + if (!props.mask) { styleObject.pointerEvents = 'none'; styleObject.backgroundColor = 'transparent'; } @@ -350,6 +351,13 @@ export default defineComponent({ }); function renderFloatingCloseButton() { + return
close(payload, false)}> + +
; + + } + + function renderHeaderButtons() { return
    {enableMinimize.value && (
  • @@ -398,7 +406,7 @@ export default defineComponent({
}
- {renderFloatingCloseButton()} + {renderHeaderButtons()}
; } @@ -423,6 +431,7 @@ export default defineComponent({ function renderModal() { return
+ {props.showFloatingClose && renderFloatingCloseButton()}
{showHeader.value && renderModalHeader()}
@@ -454,8 +463,8 @@ export default defineComponent({ {showModal.value && -
('design-item-context') as DesignerItemContext; - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service') as DesignerHost; // jumphere by sagi const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/property-editor/src/composition/use-property-editor.ts b/packages/ui-vue/components/property-editor/src/composition/use-property-editor.ts index 602aa723b9768ddfb1f7ee1a6a6fec3d3ec49839..c2f3f297a4b6a14a3573448fcc6400dd775db6f7 100644 --- a/packages/ui-vue/components/property-editor/src/composition/use-property-editor.ts +++ b/packages/ui-vue/components/property-editor/src/composition/use-property-editor.ts @@ -1,5 +1,5 @@ import { FormVariable } from "@farris/ui-vue/components/common"; -import { DesignerHostService } from "@farris/ui-vue/components/designer-canvas"; +import { DesignerHost } from "@farris/ui-vue/components/designer-canvas"; import { StateMachineItem, UsePropertyEditor, VariableItem } from "./types"; /** @@ -7,8 +7,8 @@ import { StateMachineItem, UsePropertyEditor, VariableItem } from "./types"; * @param designerHostService * @returns */ -export function usePropertyEditor(designerHostService: DesignerHostService): UsePropertyEditor { - const { formSchemaUtils, formStateMachineUtils } = designerHostService; +export function usePropertyEditor(designerHostService: DesignerHost): UsePropertyEditor { + const { pageSchema, formStateMachine } = designerHostService; /** * 把变量视图模型的变量转化为PropertyEditor的变量格式 @@ -29,15 +29,15 @@ export function usePropertyEditor(designerHostService: DesignerHostService): Use * @returns */ function getVariablesByViewModelId(viewModelId: string, pathPrefix: string = ''): VariableItem[] { - const viewModel = formSchemaUtils.getViewModelById(viewModelId); - return viewModel.states.map(state => convertToEditorVariable(state, pathPrefix)); + const viewModel = pageSchema.getViewModelById(viewModelId); + return viewModel ? viewModel.states.map(state => convertToEditorVariable(state, pathPrefix)) : []; } /** * 获取PropertyEditor需要的变量数据 */ function getVariables(viewModelId: string): VariableItem[] { - const rootViewModelId = formSchemaUtils.getRootViewModelId(); + const rootViewModelId = pageSchema.getRootViewModelId(); // 1、当前组件的组件变量 const currentViewModelVariables = getVariablesByViewModelId(viewModelId); if (viewModelId === rootViewModelId) { @@ -63,7 +63,7 @@ export function usePropertyEditor(designerHostService: DesignerHostService): Use * 获取PropertyEditor需要的状态机数据 */ function getStateMachines(): StateMachineItem[] { - const renderStates = formStateMachineUtils && formStateMachineUtils.getRenderStates(); + const renderStates = formStateMachine && formStateMachine.getRenderStates(); return renderStates || []; } diff --git a/packages/ui-vue/components/property-panel/src/component/property-panel-item.component.tsx b/packages/ui-vue/components/property-panel/src/component/property-panel-item.component.tsx index 62d2831eace18a6263feaf5d4a42fc4198b93239..38d9f63f60c1003c1650c0e0a33e0894b961d1b0 100644 --- a/packages/ui-vue/components/property-panel/src/component/property-panel-item.component.tsx +++ b/packages/ui-vue/components/property-panel/src/component/property-panel-item.component.tsx @@ -60,12 +60,12 @@ export default defineComponent({ context.emit('triggerRefreshPanel'); } } - const descriptionElement = props.elementConfig.description ? `
描述 :${props.elementConfig.description}
` : ''; + const descriptionElement = props.elementConfig.description ? `
描述:${props.elementConfig.description}
` : ''; const labelTooltip = reactive({ content: `
${props.elementConfig.propertyName}
-
ID:${props.elementConfig.propertyID}
+
ID:${props.elementConfig.propertyID}
${descriptionElement}
`, placement: 'left' diff --git a/packages/ui-vue/components/property-panel/src/composition/entity/base-property.ts b/packages/ui-vue/components/property-panel/src/composition/entity/base-property.ts index 68a52edecde373c78455aa098f27cd817c7c51e4..e7e0c66a8ba031ddc9ec4cb35d0f8b3083cc9f48 100644 --- a/packages/ui-vue/components/property-panel/src/composition/entity/base-property.ts +++ b/packages/ui-vue/components/property-panel/src/composition/entity/base-property.ts @@ -15,16 +15,16 @@ export class BaseControlProperty { public viewModelId: string; - public eventsEditorUtils: any; + public eventEditor: any; - public formSchemaUtils: any; - public formMetadataConverter: any; - public designViewModelUtils: any; + public pageSchema: any; + public pageMetadataConverter: any; + public designViewModel: any; public designViewModelField: any; - public controlCreatorUtils: any; + public controlCreator: any; public designerHostService: any; - schemaService: any = null; + entitySchema: any = null; metadataService: any = null; @@ -36,18 +36,18 @@ export class BaseControlProperty { 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.eventEditor = designerHostService['eventEditor']; + this.pageSchema = designerHostService['pageSchema']; + this.pageMetadataConverter = designerHostService['pageMetadataConverter']; + this.viewModelId = this.pageSchema?.getViewModelIdByComponentId(componentId) || ''; + this.designViewModel = designerHostService['designViewModel']; + this.controlCreator = designerHostService['controlCreator']; this.metadataService = designerHostService['metadataService']; - this.schemaService = designerHostService['schemaService']; + this.entitySchema = designerHostService['entitySchema']; } getTableInfo() { - return this.schemaService?.getTableInfoByViewModelId(this.viewModelId); + return this.entitySchema?.getTableInfoByViewModelId(this.viewModelId); } setDesignViewModelField(propertyData: any) { @@ -55,7 +55,7 @@ export class BaseControlProperty { // 视图模型中[字段更新时机]属性现在要在控件上维护,所以在控件上复制一份属性值 if (bindingFieldId) { if (!this.designViewModelField) { - const dgViewModel = this.designViewModelUtils.getDgViewModel(this.viewModelId); + const dgViewModel = this.designViewModel.getDgViewModel(this.viewModelId); this.designViewModelField = dgViewModel.fields.find(f => f.id === bindingFieldId); } propertyData.updateOn = this.designViewModelField?.updateOn; @@ -286,9 +286,9 @@ export class BaseControlProperty { delete newPropertyValue.isNewVariable; // 4、把新变量添加到ViewModel中 - const existedVariable = this.formSchemaUtils.getVariableByCode(newVariable.code); + const existedVariable = this.pageSchema.getVariableByCode(newVariable.code); if (!existedVariable) { - const viewModel = this.formSchemaUtils.getViewModelById(viewModelId); + const viewModel = this.pageSchema.getViewModelById(viewModelId); viewModel.states.push(newVariable); } } @@ -309,7 +309,7 @@ export class BaseControlProperty { const { expressionId, expressionInfo } = newPropertyValue; const { targetId, targetType, expressionType, value, message } = expressionInfo; - const module = this.formSchemaUtils.getModule(); + const module = this.pageSchema.getModule(); module.expressions ??= []; const { expressions } = module; @@ -348,7 +348,7 @@ export class BaseControlProperty { // 2、属性值不是表达式后,需要清空表达式 const expressionType = changeObject.propertyID; - const expressions = this.formSchemaUtils.getExpressions(); + const expressions = this.pageSchema.getExpressions(); const targetId = propertyData.binding ? propertyData.binding.field : propertyData.id; const targetExpression = expressions.find(expression => expression.target === targetId); @@ -359,7 +359,7 @@ export class BaseControlProperty { } getExpressionOptions(propertyData: any, targetType: 'Field' | 'Button' | 'Container', expressionType: string) { - return new ExpressionProperty(this.formSchemaUtils).getExpressionOptions(propertyData, targetType, expressionType); + return new ExpressionProperty(this.pageSchema).getExpressionOptions(propertyData, targetType, expressionType); } getRealTargetType(propertyData: any,) { diff --git a/packages/ui-vue/components/property-panel/src/composition/entity/expression-property.ts b/packages/ui-vue/components/property-panel/src/composition/entity/expression-property.ts index d976887149d4d74b734e1d164061c691eee538e3..1bd3ce3b621a9217ad6ca83081a0c39d3905a2db 100644 --- a/packages/ui-vue/components/property-panel/src/composition/entity/expression-property.ts +++ b/packages/ui-vue/components/property-panel/src/composition/entity/expression-property.ts @@ -54,11 +54,11 @@ export class ExpressionProperty { } ]; - constructor(private formSchemaService: any) { + constructor(private pageSchema: any) { } private getExpressionRule(expressionId: any, rultType: string) { - const expressions = this.formSchemaService.getExpressions(); + const expressions = this.pageSchema.getExpressions(); if (!expressions) { return ''; } @@ -77,13 +77,13 @@ export class ExpressionProperty { // 获取上下文表单变量 private getContextFormVariables() { - const { module } = this.formSchemaService.getFormSchema(); + const { module } = this.pageSchema.getPageSchema(); if (!module.viewmodels || module.viewmodels.length === 0) { return []; } - const rootViewModelId = this.formSchemaService.getRootViewModelId(); - const viewModel = this.formSchemaService.getViewModelById(rootViewModelId); + const rootViewModelId = this.pageSchema.getRootViewModelId(); + const viewModel = this.pageSchema.getViewModelById(rootViewModelId); if (!viewModel || !viewModel.states || viewModel.states.length === 0) { return []; @@ -152,7 +152,7 @@ export class ExpressionProperty { } private getEntitiesTreeData() { - const entities = this.formSchemaService.getSchemaEntities(); + const entities = this.pageSchema.getSchemaEntities(); if (!entities?.length) { // 空值检查 return []; } @@ -235,7 +235,7 @@ export class ExpressionProperty { } private getExpressionData(): Array { - const { expressions } = this.formSchemaService.getFormSchema().module; + const { expressions } = this.pageSchema.getPageSchema().module; return expressions || []; } diff --git a/packages/ui-vue/components/property-panel/src/composition/entity/input-base-property.ts b/packages/ui-vue/components/property-panel/src/composition/entity/input-base-property.ts index 527b57264302f1d1fffb14c28e419ece825ed1c9..8fd1a8a256997043a7b987a1284ab5a3ab1dcb3d 100644 --- a/packages/ui-vue/components/property-panel/src/composition/entity/input-base-property.ts +++ b/packages/ui-vue/components/property-panel/src/composition/entity/input-base-property.ts @@ -20,7 +20,7 @@ export class InputBaseProperty extends BaseControlProperty { constructor(componentId: string, designerHostService: any) { super(componentId, designerHostService); - this.responseLayoutEditorFunction = useResponseLayoutEditorSetting(this.formSchemaUtils); + this.responseLayoutEditorFunction = useResponseLayoutEditorSetting(this.pageSchema); } private getCommonPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance | null) { // 基本信息 @@ -140,7 +140,7 @@ export class InputBaseProperty extends BaseControlProperty { } if (propertyData.binding.type === 'Variable') { - this.bindingVarible = this.formSchemaUtils.getVariableById(propertyData.binding.field); + this.bindingVarible = this.pageSchema.getVariableById(propertyData.binding.field); // vm中已移除的变量 if (!this.bindingVarible) { return false; @@ -271,21 +271,17 @@ export class InputBaseProperty extends BaseControlProperty { let newControl; if (this.designViewModelField) { - // 2、记录绑定字段viewModel的变更 - const viewModel = this.formSchemaUtils.getViewModelById(this.viewModelId); - const viewModelField = viewModel.fields.find(field => field.id === this.designViewModelField.id); - const viewModelFieldSchema = viewModelField.fieldSchema || {}; - if (!viewModelFieldSchema.editor) { viewModelFieldSchema.editor = {}; } - viewModelFieldSchema.editor.$type = newControlType; - - const dgViewModel = this.designViewModelUtils.getDgViewModel(this.viewModelId); - dgViewModel.changeField(this.designViewModelField.id, viewModelFieldSchema, false); - + const dgViewModel = this.designViewModel.getDgViewModel(this.viewModelId); + dgViewModel.changeField(this.designViewModelField.id, { + editor: { + $type: newControlType + } + }, false); // 3、创建新控件 - newControl = this.controlCreatorUtils.setFormFieldProperty(this.designViewModelField, newControlType); + newControl = this.controlCreator.setFormFieldProperty(this.designViewModelField, newControlType); } if (!newControl) { - newControl = this.controlCreatorUtils.createFormGroupWithoutField(newControlType); + newControl = this.controlCreator.createFormGroupWithoutField(newControlType); } // 4、保留原id样式等属性 Object.assign(newControl, { @@ -572,7 +568,7 @@ export class InputBaseProperty extends BaseControlProperty { // 追加值变化 this.appendFieldValueChangeEvents(propertyData, eventList); - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, eventList); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, eventList); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -593,7 +589,7 @@ export class InputBaseProperty extends BaseControlProperty { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 parameters.controlInfo = { type: self.getControlMethodType(propertyData), name: propertyData.title }; // 暂存控件信息,用于自动创建新方法的方法编号和名称 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } if (setPropertyRelates) { @@ -601,7 +597,7 @@ export class InputBaseProperty extends BaseControlProperty { } // 同步视图模型值变化事件 - const designVM = self.designViewModelUtils.getDgViewModel(self.viewModelId); + const designVM = self.designViewModel.getDgViewModel(self.viewModelId); if (designVM && self.designViewModelField) { designVM.changeField(self.designViewModelField.id, { valueChanging: propertyData.fieldValueChanging, valueChanged: propertyData.fieldValueChanged }); } @@ -615,7 +611,7 @@ export class InputBaseProperty extends BaseControlProperty { expressionTypes: string[] = ['compute', 'dependency', 'validate'], associationCallBack?: (rule: Record) => void ) { - return new ExpressionProperty(this.formSchemaUtils).getExpressionConfig( + return new ExpressionProperty(this.pageSchema).getExpressionConfig( propertyData, type, expressionTypes, associationCallBack); } diff --git a/packages/ui-vue/components/query-solution/src/composition/build-solution.ts b/packages/ui-vue/components/query-solution/src/composition/build-solution.ts index a3095de50e2fa8593216d3cccab238b560c02fe2..3fb98ca6b744a475400964149e4eb67953b101e8 100644 --- a/packages/ui-vue/components/query-solution/src/composition/build-solution.ts +++ b/packages/ui-vue/components/query-solution/src/composition/build-solution.ts @@ -1,13 +1,10 @@ -import { useGuid } from "@farris/ui-vue/components/common"; -import { DesignerHostService, DgControl } from "@farris/ui-vue/components/designer-canvas"; -import { getSchemaByType } from "@farris/ui-vue/components/dynamic-resolver"; +import { useGuid } from "../.../../../../common"; +import { DesignerHost, DgControl } from "../.../../../../designer-canvas"; +import { getSchemaByType } from "../.../../../../dynamic-resolver"; -/** - * 创建筛选方案 - */ -export function querySolutionCreatorService(context: Record, designerHostService?: DesignerHostService) { +export function querySolutionCreatorService(context: Record, designerHostService?: DesignerHost) { - const formSchemaUtils = designerHostService?.formSchemaUtils; + const pageSchema = designerHostService?.pageSchema; const targetComponentInstance = context.parentComponentInstance; /** 加载命令的控制器id */ const loadCommandCmpId = '54bddc89-5f7e-4b91-9c45-80dd6606cfe9'; @@ -18,8 +15,8 @@ export function querySolutionCreatorService(context: Record, design */ function createCommandsForSolution(solutionMetadata: any) { const targetComponentId = targetComponentInstance.belongedComponentId; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(targetComponentId); - const viewModel = formSchemaUtils.getViewModelById(viewModelId); + const viewModelId = pageSchema.getViewModelIdByComponentId(targetComponentId); + const viewModel = pageSchema.getViewModelById(viewModelId); // 1、预制筛选方案查询命令 let newFilterCommandId; @@ -63,7 +60,7 @@ export function querySolutionCreatorService(context: Record, design } // 2、预置筛选方案查询数据的构件 - const webCmds = formSchemaUtils.getFormSchema().module.webcmds; + const webCmds = pageSchema.getPageSchema().module.webcmds; if (webCmds) { let loadDataCmd = webCmds.find(cmd => cmd.id === loadCommandCmpId); if (!loadDataCmd) { @@ -73,7 +70,7 @@ export function querySolutionCreatorService(context: Record, design name: 'LoadCommands.webcmd', refedHandlers: [] }; - formSchemaUtils.getFormSchema().module.webcmds.push(loadDataCmd); + pageSchema.getPageSchema().module.webcmds.push(loadDataCmd); } if (newFilterCommandId) { loadDataCmd.refedHandlers.push( @@ -108,7 +105,7 @@ export function querySolutionCreatorService(context: Record, design id: 'solution-' + prefix, fields: [], presetFields: [], - formId: formSchemaUtils.getFormMetadataBasicInfo().code + formId: pageSchema.getMetadata().code }); @@ -125,8 +122,8 @@ export function querySolutionCreatorService(context: Record, design // 3、预置筛选方案相关的变量 const targetComponentId = targetComponentInstance.belongedComponentId; - const viewModelId = formSchemaUtils.getViewModelIdByComponentId(targetComponentId); - const viewModel = formSchemaUtils.getViewModelById(viewModelId); + const viewModelId = pageSchema.getViewModelIdByComponentId(targetComponentId); + const viewModel = pageSchema.getViewModelById(viewModelId); if (viewModel?.states) { if (!viewModel.states.find(state => state.code === 'originalFilterConditionList')) { viewModel.states.push( diff --git a/packages/ui-vue/components/query-solution/src/designer/query-solution-config/query-solution-config.props.ts b/packages/ui-vue/components/query-solution/src/designer/query-solution-config/query-solution-config.props.ts index d649688e0b0015c9f749012a2bb61b2a4039336c..2ca914d9f19a9e179412d26ffa333dc58553053f 100644 --- a/packages/ui-vue/components/query-solution/src/designer/query-solution-config/query-solution-config.props.ts +++ b/packages/ui-vue/components/query-solution/src/designer/query-solution-config/query-solution-config.props.ts @@ -31,10 +31,10 @@ export const querySolutionConfigProps = { modelValue: { type: Array, default: [] }, source: { type: String as PropType, default: 'query-solution' }, onFieldsChanged: { type: Function, default: null}, - formSchemaUtils: { type: Object, default: {}}, + pageSchema: { type: Object, default: {}}, metadataService: { type: Object, default: {} }, - designViewModelUtils: { type: Object, default: {} }, - eventsEditorUtils: { type: Object, default: {} }, + designViewModel: { type: Object, default: {} }, + eventEditor: { type: Object, default: {} }, viewModelId: { type: String, default: '' }, } as Record; diff --git a/packages/ui-vue/components/query-solution/src/designer/query-solution-config/schema/query-solution-config.schema.json b/packages/ui-vue/components/query-solution/src/designer/query-solution-config/schema/query-solution-config.schema.json index a01430b467b992bb29d7602944d0d9b0cbe0433d..651036a8896e54b33b6564b25ec2dbf152133025 100644 --- a/packages/ui-vue/components/query-solution/src/designer/query-solution-config/schema/query-solution-config.schema.json +++ b/packages/ui-vue/components/query-solution/src/designer/query-solution-config/schema/query-solution-config.schema.json @@ -8,11 +8,15 @@ "description": "所有字段(树结构)", "type": "array" }, - "designViewModelUtils": { + "flatAllFields": { + "description": "所有字段(扁平化)", + "type": "array" + }, + "designViewModel": { "description": "", "type": "object" }, - "formSchemaUtils": { + "pageSchema": { "description": "", "type": "object" }, @@ -24,7 +28,7 @@ "description": "", "type": "array" }, - "eventsEditorUtils": { + "eventEditor": { "description": "", "type": "object" } diff --git a/packages/ui-vue/components/query-solution/src/property-config/query-solution.property-config.ts b/packages/ui-vue/components/query-solution/src/property-config/query-solution.property-config.ts index 848c47e6d4d9b32cfa4489e26328f98487c4e061..8a62066f50775fef323d2a27b62bb16dc336c986 100644 --- a/packages/ui-vue/components/query-solution/src/property-config/query-solution.property-config.ts +++ b/packages/ui-vue/components/query-solution/src/property-config/query-solution.property-config.ts @@ -53,7 +53,9 @@ export class QuerySolutionPropertyConfig extends InputBaseProperty { } private getQuerySolutionConfig(propertyData: any) { - const allFields = this.designViewModelUtils.getAllFields2TreeByVMId(this.viewModelId); + const allFields = this.designViewModel.getAllFields2TreeByVMId(this.viewModelId); + const flatData = new Map([]); + this.getFlatFields(allFields, flatData); const self = this; this.propertyConfig.categories['control'] = { description: "Basic Infomation", @@ -67,11 +69,13 @@ export class QuerySolutionPropertyConfig extends InputBaseProperty { editor: { type: "query-solution-config", fieldsConfig: allFields, - formSchemaUtils: this.formSchemaUtils, + flatAllFields: flatData, + pageSchema: this.pageSchema, metadataService: this.metadataService, viewModelId: this.viewModelId, - designViewModelUtils: this.designViewModelUtils, - eventsEditorUtils: this.eventsEditorUtils + designViewModel: this.designViewModel, + eventEditor: this.eventEditor + }, $converter: solutionFieldsConverter }, @@ -118,7 +122,7 @@ export class QuerySolutionPropertyConfig extends InputBaseProperty { } ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -139,7 +143,7 @@ export class QuerySolutionPropertyConfig extends InputBaseProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } // 联动修改排序开关 propertyData.remoteSort = propertyData.columnSorted ? true : false; diff --git a/packages/ui-vue/components/query-solution/src/schema/schema-resolver.ts b/packages/ui-vue/components/query-solution/src/schema/schema-resolver.ts index 7158be02d0561b935638189e8aca69113853be9b..679ff176ecdf7226e5eb80861086f7b1922fd32b 100644 --- a/packages/ui-vue/components/query-solution/src/schema/schema-resolver.ts +++ b/packages/ui-vue/components/query-solution/src/schema/schema-resolver.ts @@ -1,8 +1,8 @@ -import { DesignerComponentInstance, DesignerHostService } from "@farris/ui-vue/components/designer-canvas"; -import { DynamicResolver } from "@farris/ui-vue/components/dynamic-resolver"; +import { DesignerComponentInstance, DesignerHost } from "../../../designer-canvas"; +import { DynamicResolver } from "../../../dynamic-resolver"; import { querySolutionCreatorService } from "../composition/build-solution"; -export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHostService): Record { +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record, designerHostService?: DesignerHost): Record { const parentComponentInstance = context.parentComponentInstance as DesignerComponentInstance; if (parentComponentInstance && designerHostService) { diff --git a/packages/ui-vue/components/response-layout-editor/src/composition/props/response-layout-editor-setting.props.ts b/packages/ui-vue/components/response-layout-editor/src/composition/props/response-layout-editor-setting.props.ts index bc8fdd676fc67413904fb82a7e9a3a8b2dbd12ee..583963d970bd6377f65317e4a0cb8a38b1d15158 100644 --- a/packages/ui-vue/components/response-layout-editor/src/composition/props/response-layout-editor-setting.props.ts +++ b/packages/ui-vue/components/response-layout-editor/src/composition/props/response-layout-editor-setting.props.ts @@ -13,11 +13,11 @@ export const responseLayoutEditorSettingProps = { /** 页面高度 */ height: { type: Number, default: 0 }, /** 页面宽度 */ - width: { type: Number, default: 0}, - - modelValue: { type: Object as PropType }, + width: { type: Number, default: 0 }, + // jumphere by sagi - unused property in response-layout-editor-setting + // modelValue: { type: Object as PropType }, /** 打开弹窗前进行校验 */ - beforeOpen: { type: Object as PropType<() => InitialState> } + beforeOpen: { type: Function as PropType<() => InitialState> } } as Record; export type ResponseLayoutEditorSettingProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/response-toolbar/src/designer/response-toolbar.design.component.tsx b/packages/ui-vue/components/response-toolbar/src/designer/response-toolbar.design.component.tsx index 83dd69968da16682c92f87e2f818f869ec70cc01..7b442eaabfb10593883fb07d5c5bed1c7804568e 100644 --- a/packages/ui-vue/components/response-toolbar/src/designer/response-toolbar.design.component.tsx +++ b/packages/ui-vue/components/response-toolbar/src/designer/response-toolbar.design.component.tsx @@ -4,7 +4,7 @@ import { ResponseToolbarDesignProps, responseToolbarDesignProps } from '../respo import { ComponentSchema, DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerRules } from './use-designer-rules'; import { getCustomClass } from '@farris/ui-vue/components/common'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; import { responseToolbarItemDragula } from '../composition/toolbar-item-dragula'; import { getSchemaByType } from "../../../dynamic-resolver"; import getDropdownMenu from './toolbar-dropdown-menu.design.component'; @@ -23,26 +23,21 @@ export default defineComponent({ const resizedContainer = ref(); const resizedContent = ref(); const elementRef = ref(); - // 记录保持选中的元素 - const selectedId = ref(''); - let resizedContainerWidthRecord = 0; - // 响应宽度阈值 - const widthThreshold = 15; - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const actionHandlers: ResponseToolbarItemActionHandler = { clearAllDropdown: (id?) => { }, toggleDropdownMenu: (event) => { }, updateToolbarItems: () => { }, changeSelectedId: (id) => { - selectedId.value = id; + // selectedId.value = id; }, renderDropdownMenu: (item, parent?) => { }, toolbarContext: designItemContext, changeMenuPosition: (item, buttonElement: Element | null, parent?) => { return {}; }, toolbarPosition:'' }; - const designerRulesComposition = useDesignerRules(designItemContext, designerHostService, actionHandlers); + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); const toolbarItemHandlerService: any = inject('toolbar-item-handler'); const { initDragula, dragulaInstance } = responseToolbarItemDragula(designItemContext); @@ -57,7 +52,7 @@ export default defineComponent({ if (toolbarItemHandlerService) { // 更改方法 toolbarItemHandlerService.changeSelectedId = function (id) { - selectedId.value = id; + // selectedId.value = id; }; } /** @@ -74,27 +69,27 @@ export default defineComponent({ * @returns */ function selectItemAfterChanged() { - if (!selectedId.value) { - return; - } - if (isDropdownItem(selectedId.value, toolbarItems.value)) { - // 如果是下拉再处理 - const { parent, item } = getMenuItemById(selectedId.value, toolbarItems.value); - if (parent) { - actionHandlers.toggleDropdownMenu(parent, true); - setTimeout(() => { - // 如果是下拉再处理 - const parentElement = elementRef.value.querySelector('#' + parent.id); - const newBtnElement = parentElement?.querySelector('#' + item.id) as HTMLElement; - if ((newBtnElement?.parentElement?.className || '').indexOf('dgComponentFocused') < 0) { - // 如果已经选中了,就不需要再触发选中 - newBtnElement?.click(); - } - }, 0); - } - } else { - resetPositionForSelectedElement(); - } + // if (!selectedId.value) { + // return; + // } + // if (isDropdownItem(selectedId.value, toolbarItems.value)) { + // // 如果是下拉再处理 + // const { parent, item } = getMenuItemById(selectedId.value, toolbarItems.value); + // if (parent) { + // actionHandlers.toggleDropdownMenu(parent, true); + // setTimeout(() => { + // // 如果是下拉再处理 + // const parentElement = elementRef.value.querySelector('#' + parent.id); + // const newBtnElement = parentElement?.querySelector('#' + item.id) as HTMLElement; + // if ((newBtnElement?.parentElement?.className || '').indexOf('dgComponentFocused') < 0) { + // // 如果已经选中了,就不需要再触发选中 + // newBtnElement?.click(); + // } + // }, 0); + // } + // } else { + // resetPositionForSelectedElement(); + // } } function collapseAllDropdownMenu(id = "") { toolbarItems.value @@ -126,35 +121,35 @@ export default defineComponent({ } const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => { - if (entries.length) { - const responseContainerEntry = entries[0]; - const containerWidth = responseContainerEntry.contentRect.width; - if (containerWidth === 0) { - // 为了解决从其他页签切换到画布,记录宽度 - resizedContainerWidthRecord = 0; - return; - } - if (Math.abs(containerWidth - resizedContainerWidthRecord) > widthThreshold) { - resizedContainerWidthRecord = containerWidth; - // 处理当前选中是二级按钮 - if (isDropdownItem(selectedId.value, toolbarItems.value)) { - // 如果是下拉再处理 - const { parent, item } = getMenuItemById(selectedId.value, toolbarItems.value); - changeMenuPosition(parent); - } else if (isExpandedDropdownButton(selectedId.value, toolbarItems.value)) { - // 当前选中是一级下拉按钮,并且是展开的 - const selectedItem = toolbarItems.value?.find((schema: ComponentSchema) => schema.id === selectedId.value); - changeMenuPosition(selectedItem); - } else { - // 只是展开下拉,没有选中元素或者选中的是普通一级按钮 - collapseAllDropdownMenu(); - } - } - } + // if (entries.length) { + // const responseContainerEntry = entries[0]; + // const containerWidth = responseContainerEntry.contentRect.width; + // if (containerWidth === 0) { + // // 为了解决从其他页签切换到画布,记录宽度 + // resizedContainerWidthRecord = 0; + // return; + // } + // if (Math.abs(containerWidth - resizedContainerWidthRecord) > widthThreshold) { + // resizedContainerWidthRecord = containerWidth; + // // 处理当前选中是二级按钮 + // if (isDropdownItem(selectedId.value, toolbarItems.value)) { + // // 如果是下拉再处理 + // const { parent, item } = getMenuItemById(selectedId.value, toolbarItems.value); + // changeMenuPosition(parent); + // } else if (isExpandedDropdownButton(selectedId.value, toolbarItems.value)) { + // // 当前选中是一级下拉按钮,并且是展开的 + // const selectedItem = toolbarItems.value?.find((schema: ComponentSchema) => schema.id === selectedId.value); + // changeMenuPosition(selectedItem); + // } else { + // // 只是展开下拉,没有选中元素或者选中的是普通一级按钮 + // collapseAllDropdownMenu(); + // } + // } + // } }); onMounted(() => { observer.observe(elementRef.value); - resizedContainerWidthRecord = elementRef.value.clientWidth; + // resizedContainerWidthRecord = elementRef.value.clientWidth; elementRef.value.componentInstance = componentInstance; initDragula(resizedContent.value, resizedContainer.value, updateToolbarItems); }); diff --git a/packages/ui-vue/components/response-toolbar/src/designer/use-designer-rules.ts b/packages/ui-vue/components/response-toolbar/src/designer/use-designer-rules.ts index a4b809bfa5c4285bbd1f1468218d5e992aa7de83..c013c5b250607b3e85dc54e993966227543a9f27 100644 --- a/packages/ui-vue/components/response-toolbar/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/response-toolbar/src/designer/use-designer-rules.ts @@ -1,10 +1,10 @@ import { getSchemaByType } from "../../../dynamic-resolver"; -import { DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { ResponseToolbarProperty } from "../property-config/response-toolbar.property-config"; import { ResponseToolbarItemActionHandler } from "../types/common"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService, actionHandlers: ResponseToolbarItemActionHandler): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const schema = designItemContext.schema as ComponentSchema; function getToolbarPosition() { @@ -12,7 +12,7 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe if (["page-header", "tabs", "section"].findIndex(item => item === resultType) === -1) { resultType = ""; } - actionHandlers.toolbarPosition = resultType; + // actionHandlers.toolbarPosition = resultType; } // 存储工具栏的位置 getToolbarPosition(); @@ -74,8 +74,8 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe schema.buttons.push(toolbarItemSchema); // 更新Tab工具栏 - actionHandlers.updateToolbarItems(); - actionHandlers.changeSelectedId(''); + // actionHandlers.updateToolbarItems(); + // actionHandlers.changeSelectedId(''); } /** * 获取自定义操作按钮 diff --git a/packages/ui-vue/components/response-toolbar/src/property-config/response-toolbar-item.property-config.ts b/packages/ui-vue/components/response-toolbar/src/property-config/response-toolbar-item.property-config.ts index 86309dbb07c14352465ced0b6a792e489cd1201c..de1315074a9822b37bed3c0236e6a7511eee00a2 100644 --- a/packages/ui-vue/components/response-toolbar/src/property-config/response-toolbar-item.property-config.ts +++ b/packages/ui-vue/components/response-toolbar/src/property-config/response-toolbar-item.property-config.ts @@ -98,7 +98,7 @@ export class ResponseToolbarItemProperty extends BaseControlProperty { } ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -119,7 +119,7 @@ export class ResponseToolbarItemProperty extends BaseControlProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } } }; diff --git a/packages/ui-vue/components/section/src/designer/section.design.component.tsx b/packages/ui-vue/components/section/src/designer/section.design.component.tsx index d3577e064fa04915feb8dd289f47da2407df86fb..ae653422d81665909331580bfe57fe14b6dcec53 100644 --- a/packages/ui-vue/components/section/src/designer/section.design.component.tsx +++ b/packages/ui-vue/components/section/src/designer/section.design.component.tsx @@ -21,8 +21,8 @@ import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import getSectionHeaderRenderDesign from './section-header.design.component'; import renderSectionToolbarDesign from './section-toolbar.design.component'; -import { getCustomClass } from '@farris/ui-vue/components/common'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { getCustomClass } from '../../../common'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FSectionDesign', @@ -32,7 +32,7 @@ export default defineComponent({ const elementRef = ref(); const sectionRef = ref(); const sectionParentElementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/section/src/designer/use-designer-rules.ts b/packages/ui-vue/components/section/src/designer/use-designer-rules.ts index 1bab37d7ab8f8a9cd4a31f18a21d34ccf316cf20..32c246bb2c916afda3b2556a3a9e5e633e1d3579 100644 --- a/packages/ui-vue/components/section/src/designer/use-designer-rules.ts +++ b/packages/ui-vue/components/section/src/designer/use-designer-rules.ts @@ -1,4 +1,4 @@ -import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { SectionProperty } from "../property-config/section.property-config"; @@ -6,7 +6,7 @@ import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/compos import { DgControl } from "../../../designer-canvas"; import { getSchemaByType } from "../../../dynamic-resolver"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); const schema = designItemContext.schema as ComponentSchema; @@ -125,12 +125,12 @@ export function useDesignerRules(designItemContext: DesignerItemContext, designe */ function getCustomButtons() { const { schema } = designItemContext; - const useFormSchema = designerHostService?.formSchemaUtils; - if (schema.showHeader === false || !useFormSchema) { + const pageSchema = designerHostService?.pageSchema; + if (schema.showHeader === false || !pageSchema) { return; } // 当分组面板不包含卡片面板,且当前无按钮时,显示新增工具栏的图标 - const responseForm = useFormSchema.selectNode(schema, (childSchema) => childSchema.type === DgControl['response-form'].type); + const responseForm = pageSchema.selectNode(schema, (childSchema) => childSchema.type === DgControl['response-form'].type); const toolbarButtons = schema.toolbar?.buttons || []; if (!responseForm && toolbarButtons.length === 0) { return [{ diff --git a/packages/ui-vue/components/splitter/src/designer/splitter-pane-use-designer-rules.ts b/packages/ui-vue/components/splitter/src/designer/splitter-pane-use-designer-rules.ts index 3b654481288672c462a7e05c5593d9a13410eaac..8593d35acd73c48bc1b86269e1aba347d9cc3f12 100644 --- a/packages/ui-vue/components/splitter/src/designer/splitter-pane-use-designer-rules.ts +++ b/packages/ui-vue/components/splitter/src/designer/splitter-pane-use-designer-rules.ts @@ -1,10 +1,10 @@ import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; -import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { SplitterPaneProperty } from "../property-config/splitter-pane.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); const schema = designItemContext.schema as ComponentSchema; const { canAccept } = dragAndDropRules.getTemplateRule(designItemContext, designerHostService); diff --git a/packages/ui-vue/components/splitter/src/designer/splitter-pane.design.component.tsx b/packages/ui-vue/components/splitter/src/designer/splitter-pane.design.component.tsx index 7825b1aa8be331113df0141aa87a8bc398d0d28a..8eb64b5aa4f3f168e3db65e58111a5cf271ea8e9 100644 --- a/packages/ui-vue/components/splitter/src/designer/splitter-pane.design.component.tsx +++ b/packages/ui-vue/components/splitter/src/designer/splitter-pane.design.component.tsx @@ -5,8 +5,8 @@ import { useResizePane } from '../composition/use-resize-pane'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRules } from './splitter-pane-use-designer-rules'; -import { getCustomClass, getCustomStyle } from '@farris/ui-vue/components/common'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { getCustomClass, getCustomStyle } from '../../../common'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FSplitterPaneDesign', @@ -14,7 +14,7 @@ export default defineComponent({ emits: [], setup(props: SplitterPanePropsType, context) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/splitter/src/designer/splitter-use-designer-rules.ts b/packages/ui-vue/components/splitter/src/designer/splitter-use-designer-rules.ts index a3b6ebdbcbdadea469e135a2b634f15b6fa12aad..1637d9bbc6d48283dc4f10047c9b07535444daf0 100644 --- a/packages/ui-vue/components/splitter/src/designer/splitter-use-designer-rules.ts +++ b/packages/ui-vue/components/splitter/src/designer/splitter-use-designer-rules.ts @@ -1,9 +1,9 @@ -import { DesignerHostService, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; -import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; +import { DesignerHost, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerItemContext } from "../../../designer-canvas/src/types"; import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; import { SplitterProperty } from "../property-config/splitter.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); const { canMove, canDelete } = dragAndDropRules.getTemplateRule(designItemContext, designerHostService); const schema = designItemContext.schema as ComponentSchema; diff --git a/packages/ui-vue/components/splitter/src/designer/splitter.design.component.tsx b/packages/ui-vue/components/splitter/src/designer/splitter.design.component.tsx index 72d45522c5a6e4747df21a48ca50842c02ee49c3..10b1d8b55404f1638d0fa540cc35dd678dd56005 100644 --- a/packages/ui-vue/components/splitter/src/designer/splitter.design.component.tsx +++ b/packages/ui-vue/components/splitter/src/designer/splitter.design.component.tsx @@ -6,8 +6,8 @@ import { SplitterContext } from '../composition/types'; import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRules } from './splitter-use-designer-rules'; -import { getCustomClass, getCustomStyle } from '@farris/ui-vue/components/common'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { getCustomClass, getCustomStyle } from '../../../common'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FSplitterDesign', @@ -15,7 +15,7 @@ export default defineComponent({ emits: [], setup(props: SplitterPropsType, context) { const elementRef = ref(); - const designerHostService = inject('designer-host-service'); + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/step/index.ts b/packages/ui-vue/components/step/index.ts index 88752b82c184820d95877e922290bf954d240e92..d55aa21d505e3b2472b378c3af1f077793cda038 100644 --- a/packages/ui-vue/components/step/index.ts +++ b/packages/ui-vue/components/step/index.ts @@ -1,23 +1,19 @@ - -import type { App } from 'vue'; -import Step from './src/step.component'; + +import FStep from './src/step.component'; import { propsResolver } from './src/step.props'; import FStepDesign from './src/designer/step.design.component'; +import { withInstall } from '@farris/ui-vue/components/common'; export * from './src/step.props'; -export { Step }; - -export default { - install(app: App): void { - app.component(Step.name as string, Step); - }, - register(componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record): void { - componentMap.step = Step; - propsResolverMap.step = propsResolver; - }, - registerDesigner(componentMap: Record, propsResolverMap: Record, configResolverMap: Record): void { - componentMap.step = FStepDesign; - propsResolverMap.step = propsResolver; - } +FStep.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap.step = FStep; + propsResolverMap.step = propsResolver; }; +FStep.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + componentMap.step = FStepDesign; + propsResolverMap.step = propsResolver; +}; + +export { FStep, FStep as Step }; +export default withInstall(FStep); diff --git a/packages/ui-vue/components/tabs/src/designer/tab-page-use-designer-rules.ts b/packages/ui-vue/components/tabs/src/designer/tab-page-use-designer-rules.ts index 739e7fd8a0528edddd4fddf90d0eac1bf0c64ebd..bfb3165fb12d5b67b023f240ce50a7f80b9ec8e5 100644 --- a/packages/ui-vue/components/tabs/src/designer/tab-page-use-designer-rules.ts +++ b/packages/ui-vue/components/tabs/src/designer/tab-page-use-designer-rules.ts @@ -1,9 +1,9 @@ import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; -import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { useDragulaCommonRule } from "../../../designer-canvas/src/composition/rule/use-dragula-common-rule"; import { DesignerItemContext } from "../../../designer-canvas/src/types"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const dragAndDropRules = new UseTemplateDragAndDropRules(); const { canAccept } = dragAndDropRules.getTemplateRule(designItemContext, designerHostService); /** diff --git a/packages/ui-vue/components/tabs/src/designer/tab-page.design.component.tsx b/packages/ui-vue/components/tabs/src/designer/tab-page.design.component.tsx index 7575bda661f4fbb013fc53001d15161aeacadf10..421f06f5f34a34ce019c19ca02f785071a249209 100644 --- a/packages/ui-vue/components/tabs/src/designer/tab-page.design.component.tsx +++ b/packages/ui-vue/components/tabs/src/designer/tab-page.design.component.tsx @@ -21,7 +21,7 @@ import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRules } from './tab-page-use-designer-rules'; import { JSX } from 'vue/jsx-runtime'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FTabPageDesign', @@ -30,7 +30,7 @@ export default defineComponent({ setup(props: TabPageDesignProps, 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'); const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); componentInstance.value.canNested = false; diff --git a/packages/ui-vue/components/tabs/src/designer/tab-use-designer-rules.ts b/packages/ui-vue/components/tabs/src/designer/tab-use-designer-rules.ts index 61dcfdd3f702e4bfdd12d85ae7b8e47220474f86..0f1ef20ac037ba628389db2e9c73c6c081ec5e9f 100644 --- a/packages/ui-vue/components/tabs/src/designer/tab-use-designer-rules.ts +++ b/packages/ui-vue/components/tabs/src/designer/tab-use-designer-rules.ts @@ -1,11 +1,11 @@ import { nextTick } from "vue"; import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; -import { DesignerHostService, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { DesignerHost, DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; import { TabPageProperty } from "../property-config/tab-page.property-config"; import { TabsProperty } from "../property-config/tabs.property-config"; -export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { const schema = designItemContext.schema as ComponentSchema; const dragAndDropRules = new UseTemplateDragAndDropRules(); diff --git a/packages/ui-vue/components/tabs/src/designer/tabs.design.component.tsx b/packages/ui-vue/components/tabs/src/designer/tabs.design.component.tsx index b44d92afe90f52dea5ebba3dd2c03ab7981549c0..f6b7f7339d592748a9b5f440a2fc231fde7620ad 100644 --- a/packages/ui-vue/components/tabs/src/designer/tabs.design.component.tsx +++ b/packages/ui-vue/components/tabs/src/designer/tabs.design.component.tsx @@ -28,7 +28,7 @@ import { useDesignerRules } from './tab-use-designer-rules'; import { useDesignTabs } from './tabs-use-design'; import tabToolbarDesignRender from './tab-toolbar.design.component'; import { JSX } from 'vue/jsx-runtime'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; import { tabHeaderItemDragula } from '../composition/tab-header-dragula'; export default defineComponent({ @@ -37,7 +37,7 @@ export default defineComponent({ emits: ['tabChange', 'tabRemove'] as (string[] & ThisType) | undefined, setup(props: TabsDesignProps, context: SetupContext) { const elementRef = ref(); - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service'); const designItemContext = inject('design-item-context') as DesignerItemContext; const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); diff --git a/packages/ui-vue/components/tabs/src/property-config/tab-toolbar-item.property-config.ts b/packages/ui-vue/components/tabs/src/property-config/tab-toolbar-item.property-config.ts index d0d13bf49f0a7f2e06eaec157c06692b812287c0..3712f7ec1565a453892efb21b3a61374e3785598 100644 --- a/packages/ui-vue/components/tabs/src/property-config/tab-toolbar-item.property-config.ts +++ b/packages/ui-vue/components/tabs/src/property-config/tab-toolbar-item.property-config.ts @@ -1,4 +1,3 @@ -import { PropertyChangeObject } from "../../../property-panel/src/composition/entity/property-entity"; import { BaseControlProperty } from "../../../property-panel/src/composition/entity/base-property"; export class TabToolbarItemProperty extends BaseControlProperty { @@ -68,7 +67,7 @@ export class TabToolbarItemProperty extends BaseControlProperty { } ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -89,7 +88,7 @@ export class TabToolbarItemProperty extends BaseControlProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } } }; diff --git a/packages/ui-vue/components/tabs/src/property-config/tabs.property-config.ts b/packages/ui-vue/components/tabs/src/property-config/tabs.property-config.ts index 260c553cfe818c4d89e9903544bcca22d2322d48..888f01e96e07954d2bfa906b40bfce953c63e247 100644 --- a/packages/ui-vue/components/tabs/src/property-config/tabs.property-config.ts +++ b/packages/ui-vue/components/tabs/src/property-config/tabs.property-config.ts @@ -114,7 +114,7 @@ export class TabsProperty extends BaseControlProperty { } ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -135,7 +135,7 @@ export class TabsProperty extends BaseControlProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } } }; diff --git a/packages/ui-vue/components/tree-grid/src/property-config/tree-grid.property-config.ts b/packages/ui-vue/components/tree-grid/src/property-config/tree-grid.property-config.ts index dd0746d5b5a6dbb10c72d0060ab7a87775eec41f..05e0ef6cca741ea724f35655379ac527472e0601 100644 --- a/packages/ui-vue/components/tree-grid/src/property-config/tree-grid.property-config.ts +++ b/packages/ui-vue/components/tree-grid/src/property-config/tree-grid.property-config.ts @@ -23,7 +23,7 @@ export class TreeGridProperty extends BaseControlProperty { } getBasicPropConfig(propertyData: any) { - const mainEntity = this.formSchemaUtils.getFormSchema()?.module?.entity[0]?.entities[0]; + const mainEntity = this.pageSchema.getPageSchema()?.module?.entity[0]?.entities[0]; const entityTreeData = this.assembleSchemaEntityToTree(mainEntity, 0); const self = this; const basicConfig = super.getBasicPropConfig(propertyData); @@ -48,12 +48,12 @@ export class TreeGridProperty extends BaseControlProperty { setPropertyRelates(changeObject: PropertyChangeObject, data: any) { switch (changeObject && changeObject.propertyID) { case 'dataSource': { - const viewModelNode = self.formSchemaUtils.getViewModelById(self.viewModelId); + const viewModelNode = self.pageSchema.getViewModelById(self.viewModelId); if (viewModelNode) { const selectedEntity = entityTreeData.find(entityData => entityData.label === changeObject.propertyValue); viewModelNode.bindTo = selectedEntity.bindTo; } - self.designViewModelUtils.assembleDesignViewModel(); + self.pageSchema.assembleDesignViewModel(); break; } } @@ -168,7 +168,7 @@ export class TreeGridProperty extends BaseControlProperty { } ]; const self = this; - const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const initialData = self.eventEditor['formProperties'](propertyData, self.viewModelId, events); const properties = {}; properties[self.viewModelId] = { type: 'events-editor', @@ -189,7 +189,7 @@ export class TreeGridProperty extends BaseControlProperty { delete propertyData[self.viewModelId]; if (parameters) { parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 - self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + self.eventEditor.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); } // 联动修改排序开关 propertyData.remoteSort = propertyData.columnSorted ? true : false; diff --git a/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx b/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx index 019beb7dc120df3d9d0342768b56c367da661694..670d5c162a81795f2d4d3d5ae2f3f40b2240e767 100644 --- a/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx +++ b/packages/ui-vue/components/tree-grid/src/tree-grid.component.tsx @@ -30,8 +30,6 @@ import { DataViewType, UpdateDataOption, } from '@farris/ui-vue/components/data-view'; -import { isUndefined } from 'lodash-es'; -import { TreeGridProps, treeGridProps } from './tree-grid.props'; import getDataArea from './components/data/data-area.component'; import './tree-grid.css'; diff --git a/packages/ui-vue/components/video/src/designer/video.design.component.tsx b/packages/ui-vue/components/video/src/designer/video.design.component.tsx index 10d226150dbd12db72f48b3eb6ed5ec610fcf97f..c918a7dcf807fc9b71171aeedf465584cf3edeb6 100644 --- a/packages/ui-vue/components/video/src/designer/video.design.component.tsx +++ b/packages/ui-vue/components/video/src/designer/video.design.component.tsx @@ -20,7 +20,7 @@ import { DesignerItemContext } from '../../../designer-canvas/src/types'; import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; import { useDesignerRules } from '../../../component/src/designer/use-designer-rules'; import { useViewport } from '../composition/use-viewport'; -import { DesignerHostService } from '../../../designer-canvas/src/composition/types'; +import { DesignerHost } from '../../../designer-canvas/src/composition/types'; export default defineComponent({ name: 'FVideoDesign', @@ -28,7 +28,7 @@ export default defineComponent({ setup(props: VideoProps, context: SetupContext) { const elementRef = ref(); const designItemContext = inject('design-item-context') as DesignerItemContext; - const designerHostService = inject('designer-host-service') as DesignerHostService; + const designerHostService = inject('designer-host-service') as DesignerHost; // jumphere by sagi const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition);