diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..b33d9d37
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# 所有文本文件的行结束符为: 换行符
+* text=auto
\ No newline at end of file
diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json
index cc90314c..ee15a41d 100644
--- a/io.sc.engine.rule.frontend/package.json
+++ b/io.sc.engine.rule.frontend/package.json
@@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
- "platform-core": "8.1.312",
+ "platform-core": "8.1.320",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"vue": "3.4.31",
@@ -113,4 +113,4 @@
"pinia-undo": "0.2.4",
"xml-formatter": "3.6.3"
}
-}
\ No newline at end of file
+}
diff --git a/io.sc.engine.rule.frontend/src/views/resources/Resources.vue b/io.sc.engine.rule.frontend/src/views/resources/Resources.vue
index dd50ebd0..4508c599 100644
--- a/io.sc.engine.rule.frontend/src/views/resources/Resources.vue
+++ b/io.sc.engine.rule.frontend/src/views/resources/Resources.vue
@@ -345,7 +345,8 @@
},
}"
@row-db-click="
- (e, row) => {
+ (args) => {
+ console.log(args);
if (row.type !== 'FOLDER') {
designerDialogRef.open(row);
}
diff --git a/io.sc.platform.core.frontend/.editorconfig b/io.sc.platform.core.frontend/.editorconfig
index 2791f744..4bd609e2 100644
--- a/io.sc.platform.core.frontend/.editorconfig
+++ b/io.sc.platform.core.frontend/.editorconfig
@@ -10,5 +10,6 @@ root = true
charset = utf-8 # 字符集: utf-8
indent_size = 2 # 缩进大小: 2
indent_style = space # 缩进风格: 空格
+end_of_line = lf # 行结束符: 换行符
insert_final_newline = true # 是否在文件的最后插入一个空行
trim_trailing_whitespace = true # 是否删除行尾的空格
diff --git a/io.sc.platform.core.frontend/.eslintrc.cjs b/io.sc.platform.core.frontend/.eslintrc.cjs
index 82581f3d..f7fab5cc 100644
--- a/io.sc.platform.core.frontend/.eslintrc.cjs
+++ b/io.sc.platform.core.frontend/.eslintrc.cjs
@@ -1,37 +1,68 @@
module.exports = {
- root: true,
+ // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy
+ // This option interrupts the configuration hierarchy at this file
+ // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos)
+ root: true,
- env: {
- browser: true,
- es2022: true,
- "vue/setup-compiler-macros": true,
- },
+ env: {
+ browser: true,
+ es2022: true,
+ node: true,
+ 'vue/setup-compiler-macros': true,
+ },
- extends:[
- "eslint:recommended",
- "plugin:vue/vue3-recommended",
- "plugin:@typescript-eslint/recommended",
- "plugin:prettier/recommended",
- ],
-
- parser: "vue-eslint-parser",
- parserOptions: {
- ecmaVersion: 2022,
- parser: "@typescript-eslint/parser",
- sourceType: "module",
- ecmaFeatures: {
- jsx : false
- }
- },
+ // Rules order is important, please avoid shuffling them
+ extends: [
+ // Base ESLint recommended rules
+ 'eslint:recommended',
+
+ // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage
+ // ESLint typescript rules
+ 'plugin:@typescript-eslint/recommended',
+
+ // Vue ESLint recommended rules
+ // 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention)
+ // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability)
+ // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead)
+ 'plugin:vue/vue3-recommended',
+
+ // https://github.com/prettier/eslint-config-prettier#installation
+ // usage with Prettier, provided by 'eslint-config-prettier'.
+ 'plugin:prettier/recommended', // Recommended
+ ],
- rules:{
- 'semi':[1],
- '@typescript-eslint/no-var-requires': 'off',
- '@typescript-eslint/no-explicit-any': 'off',
- "@typescript-eslint/no-unused-vars": 'off',
- "@typescript-eslint/no-this-alias": 'off',
- 'vue/multi-word-component-names': 'off', /* 禁用 vue 组件名称检查规则 */
- 'no-prototype-builtins': 'off',
- 'prefer-rest-params': 'off',
+ parser: 'vue-eslint-parser',
+ parserOptions: {
+ ecmaVersion: 2022,
+ parser: '@typescript-eslint/parser',
+ ecmaFeatures: {
+ jsx: false,
},
+ },
+
+ plugins: [
+ // required to apply rules which need type information
+ '@typescript-eslint',
+
+ // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files
+ // required to lint *.vue files
+ 'vue',
+
+ // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674
+ // Prettier has not been included as plugin to avoid performance impact
+ // add it as an extension for your IDE
+ ],
+
+ rules: {
+ semi: [1],
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-empty-object-type': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+ 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */,
+ 'no-prototype-builtins': 'off',
+ 'prefer-rest-params': 'off',
+ },
};
diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json
index 1dd99a5c..4328c4c8 100644
--- a/io.sc.platform.core.frontend/package.json
+++ b/io.sc.platform.core.frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "platform-core",
- "version": "8.1.317",
+ "version": "8.1.321",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"main": "dist/platform-core.js",
@@ -52,93 +52,94 @@
"no-git-checks": true
},
"devDependencies": {
- "@babel/core": "7.24.7",
- "@babel/preset-env": "7.24.7",
+ "@babel/core": "7.25.2",
+ "@babel/preset-env": "7.25.4",
"@babel/preset-typescript": "7.24.7",
- "@babel/plugin-transform-class-properties": "7.24.7",
+ "@babel/plugin-transform-class-properties": "7.25.4",
"@babel/plugin-transform-object-rest-spread": "7.24.7",
- "@quasar/app-webpack": "3.13.2",
+ "@quasar/app-webpack": "4.0.0-beta.16",
"@quasar/cli": "2.4.1",
"@types/mockjs": "1.0.10",
- "@types/node": "20.14.10",
- "@typescript-eslint/eslint-plugin": "7.15.0",
- "@typescript-eslint/parser": "7.15.0",
- "@vue/compiler-sfc": "3.4.31",
+ "@types/node": "22.5.4",
+ "@typescript-eslint/eslint-plugin": "8.5.0",
+ "@typescript-eslint/parser": "8.5.0",
+ "@vue/compiler-sfc": "3.5.3",
"@webpack-cli/serve": "2.0.5",
- "autoprefixer": "10.4.19",
+ "autoprefixer": "10.4.20",
"babel-loader": "9.1.3",
"clean-webpack-plugin": "4.0.0",
"copy-webpack-plugin": "12.0.2",
"cross-env": "7.0.3",
"css-loader": "7.1.2",
- "eslint": "8.56.0",
+ "eslint": "8.57.0",
"eslint-config-prettier": "9.1.0",
- "eslint-plugin-prettier": "5.1.3",
- "eslint-plugin-vue": "9.27.0",
+ "eslint-plugin-prettier": "5.2.1",
+ "eslint-plugin-vue": "9.28.0",
"eslint-webpack-plugin": "4.2.0",
"html-webpack-plugin": "5.6.0",
"json5": "2.2.3",
- "mini-css-extract-plugin": "2.9.0",
+ "mini-css-extract-plugin": "2.9.1",
"nodemon": "3.1.4",
- "postcss": "8.4.39",
+ "postcss": "8.4.45",
"postcss-import": "16.1.0",
"postcss-loader": "8.1.1",
- "postcss-preset-env": "9.6.0",
- "prettier": "3.3.2",
- "sass": "1.77.6",
- "sass-loader": "14.2.1",
- "typescript": "5.5.3",
+ "postcss-preset-env": "10.0.3",
+ "prettier": "3.3.3",
+ "sass": "1.78.0",
+ "sass-loader": "16.0.1",
+ "typescript": "5.5.4",
"vue-loader": "17.4.2",
- "webpack": "5.92.1",
+ "webpack": "5.94.0",
"webpack-bundle-analyzer": "4.10.2",
"webpack-cli": "5.1.4",
- "webpack-dev-server": "5.0.4",
+ "webpack-dev-server": "5.1.0",
"webpack-merge": "6.0.1",
- "@vue/babel-plugin-jsx": "1.2.2"
+ "@vue/babel-plugin-jsx": "1.2.4"
},
"dependencies": {
- "@codemirror/autocomplete": "6.17.0",
- "@codemirror/commands": "6.6.0",
+ "@codemirror/autocomplete": "6.18.0",
+ "@codemirror/commands": "6.6.1",
"@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2",
"@codemirror/lang-json": "6.0.1",
- "@codemirror/lang-sql": "6.7.0",
+ "@codemirror/lang-sql": "6.7.1",
"@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.2",
"@codemirror/search": "6.5.6",
"@codemirror/state": "6.4.1",
- "@codemirror/view": "6.28.4",
+ "@codemirror/view": "6.33.0",
"@maxgraph/core": "0.13.0",
"@quasar/extras": "1.16.12",
- "@vueuse/core": "10.11.0",
- "axios": "1.7.2",
+ "@vueuse/core": "11.0.3",
+ "axios": "1.7.7",
"codemirror": "6.0.1",
- "dayjs": "1.11.11",
+ "dayjs": "1.11.13",
"echarts": "5.5.1",
"exceljs": "4.4.0",
"file-saver": "2.0.5",
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
- "pinia": "2.1.7",
- "quasar": "2.15.4",
+ "pinia": "2.2.2",
+ "quasar": "2.16.11",
"svg-path-commander": "2.0.10",
- "tailwindcss": "3.4.4",
- "vue": "3.4.31",
+ "tailwindcss": "3.4.10",
+ "vue": "3.4.38",
"vue-dompurify-html": "5.1.0",
- "vue-i18n": "9.13.1",
- "vue-router": "4.4.0",
+ "vue-i18n": "10.0.0",
+ "vue-router": "4.4.3",
"xml-formatter": "3.6.3",
- "@univerjs/core": "0.2.0",
- "@univerjs/design": "0.2.0",
- "@univerjs/docs": "0.2.0",
- "@univerjs/docs-ui": "0.2.0",
- "@univerjs/engine-formula": "0.2.0",
- "@univerjs/engine-render": "0.2.0",
- "@univerjs/facade": "0.2.0",
- "@univerjs/sheets": "0.2.0",
- "@univerjs/sheets-formula": "0.2.0",
- "@univerjs/sheets-ui": "0.2.0",
- "@univerjs/ui": "0.2.0"
+ "@univerjs/core": "0.2.12",
+ "@univerjs/design": "0.2.12",
+ "@univerjs/docs": "0.2.12",
+ "@univerjs/docs-ui": "0.2.12",
+ "@univerjs/engine-formula": "0.2.12",
+ "@univerjs/engine-render": "0.2.12",
+ "@univerjs/facade": "0.2.12",
+ "@univerjs/sheets": "0.2.12",
+ "@univerjs/sheets-formula": "0.2.12",
+ "@univerjs/sheets-ui": "0.2.12",
+ "@univerjs/thread-comment": "0.2.12",
+ "@univerjs/ui": "0.2.12"
}
}
diff --git a/io.sc.platform.core.frontend/public/images/point.gif b/io.sc.platform.core.frontend/public/images/point.gif
deleted file mode 100644
index 9074c395..00000000
Binary files a/io.sc.platform.core.frontend/public/images/point.gif and /dev/null differ
diff --git a/io.sc.platform.core.frontend/public/index.html b/io.sc.platform.core.frontend/public/index.html
index c3b9270d..d1c1f7a0 100644
--- a/io.sc.platform.core.frontend/public/index.html
+++ b/io.sc.platform.core.frontend/public/index.html
@@ -29,27 +29,34 @@
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/PlatformGraph.ts b/io.sc.platform.core.frontend/src/platform/components/graph/PlatformGraph.ts
index de9921ca..b373e2b1 100644
--- a/io.sc.platform.core.frontend/src/platform/components/graph/PlatformGraph.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/PlatformGraph.ts
@@ -1,5 +1,19 @@
import type { GraphPluginConstructor } from '@maxgraph/core';
-import { constants, Client, Graph, Point, Cell, Geometry, CellState, ConnectionConstraint, ModelXmlSerializer, styleUtils, eventUtils } from '@maxgraph/core';
+import {
+ constants,
+ Client,
+ Graph,
+ Point,
+ Cell,
+ Geometry,
+ ImageBox,
+ CellState,
+ ConnectionConstraint,
+ ModelXmlSerializer,
+ styleUtils,
+ eventUtils,
+ xmlUtils,
+} from '@maxgraph/core';
import {
CellEditorHandler,
@@ -13,6 +27,7 @@ import {
} from '@maxgraph/core'; // 默认插件
import {
+ PlatformConstraintHandler,
PlatformDragAndDropHandler,
PlatformEdgeDefineHandler,
PlatformKeyBindHandler,
@@ -38,6 +53,7 @@ const plugins: GraphPluginConstructor[] = [
SelectionCellsHandler,
SelectionHandler,
+ PlatformConstraintHandler,
PlatformDragAndDropHandler,
PlatformEdgeDefineHandler,
PlatformKeyBindHandler,
@@ -52,9 +68,6 @@ class PlatformGraph extends Graph {
this.setConnectable(true);
this.setPanning(true);
this.setHtmlLabels(true);
- // this.isCellEditable = function (cell) {
- // return !cell.isEdge();
- // };
// 禁止节点直接连接
const connectionHandler: ConnectionHandler = this.getPlugin('ConnectionHandler');
@@ -100,32 +113,29 @@ class PlatformGraph extends Graph {
convertValueToString(cell) {
if (cell.isVertex()) {
const dom = cell.value;
- const type = dom.nodeName.toLowerCase();
+ const type = dom.nodeName;
const vertexDefineHandler: PlatformVertexDefineHandler = this.getPlugin('PlatformVertexDefineHandler');
if (vertexDefineHandler) {
const value = vertexDefineHandler.getValue(type, dom);
return vertexDefineHandler.getLabel(type, value);
}
+ } else if (cell.isEdge()) {
+ const dom = cell.value;
+ const type = dom.nodeName;
+ const edgeDefineHandler: PlatformEdgeDefineHandler = this.getPlugin('PlatformEdgeDefineHandler');
+ if (edgeDefineHandler) {
+ const value = edgeDefineHandler.getValue(type, dom);
+ return edgeDefineHandler.getLabel(type, value);
+ }
+ } else {
+ return null;
}
- return null;
}
createEdge(parent = null, id, value, source = null, target = null, style = {}) {
- const sourceCell: Cell = source;
- const targetCell: Cell = target;
- const sourceType = sourceCell.value.nodeName.toLowerCase();
- const targetType = targetCell.value.nodeName.toLowerCase();
-
- const ddgeDefineHandler: PlatformEdgeDefineHandler = this.getPlugin('PlatformEdgeDefineHandler');
- if (ddgeDefineHandler) {
- const type = ddgeDefineHandler.getType(sourceType, targetType);
- const dom = document.createElement(type);
- dom.setAttribute('wsp', 'wsp');
- const edge = new Cell(dom, new Geometry(), style);
- edge.setId(id);
- edge.setEdge(true);
- edge.geometry.relative = true;
- return edge;
+ const edgeDefineHandler: PlatformEdgeDefineHandler = this.getPlugin('PlatformEdgeDefineHandler');
+ if (edgeDefineHandler) {
+ return edgeDefineHandler.createEdge(parent, id, value, source, target, style);
}
}
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/WGraph.vue b/io.sc.platform.core.frontend/src/platform/components/graph/WGraph.vue
index e91b48e7..6d7d8b8e 100644
--- a/io.sc.platform.core.frontend/src/platform/components/graph/WGraph.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/WGraph.vue
@@ -1,7 +1,7 @@
-
+
@@ -15,18 +15,8 @@
-
-
-
-
-
-
- Folders
-
-
-
-
+
@@ -38,7 +28,7 @@
-
+
-
+
-
+
@@ -75,41 +65,80 @@
import { ref, onMounted, nextTick, reactive } from 'vue';
import { InternalEvent, CellAttributeChange } from '@maxgraph/core';
import { Tools } from '@/platform';
+import { FormFieldProps, FormFieldMethods } from '@/platform/components/form/FormField';
import { PlatformSelectedCellHandler } from './handler/SelectedCellHandler';
import { PlatformGraph } from './PlatformGraph';
import XmlDialog from './dialog/XmlDialog.vue';
const modelValueRef = defineModel({ type: String, default: '' });
-const props = defineProps({
- vertexPanelWidth: {
- type: Number,
- default: 65,
- },
- propertiesPanelWidth: {
- type: Number,
- default: 400,
- },
- vertexDefines: {
- type: Array,
- default: () => {
- return [];
- },
+
+interface FieldProps extends FormFieldProps {
+ //节点组件面板宽度
+ vertexPanelWidth?: number;
+ //节点组件面板宽度单位
+ vertexPanelWidthUnit: string;
+ //属性面板宽度
+ propertiesPanelWidth?: number;
+ //属性面板宽度单位
+ propertiesPanelWidthUnit?: string;
+ //自定义节点定义数组
+ vertexDefines: [];
+ //自定义边定义数组
+ edgeDefines: [];
+}
+
+const props = withDefaults(defineProps(), {
+ vertexPanelWidth: 65,
+ vertexPanelWidthUnit: 'px',
+ propertiesPanelWidth: 400,
+ propertiesPanelWidthUnit: 'px',
+ vertexDefines: () => {
+ return [];
},
- edgeDefines: {
- type: Array,
- default: () => {
- return [];
- },
+ edgeDefines: () => {
+ return [];
},
});
-const vertexPanelWidthRef = ref(props.vertexPanelWidth);
-const propertiesPanelWidthRef = ref(props.propertiesPanelWidth);
+
+const emit = defineEmits<{
+ // 保存事件
+ (e: 'save', value: string): void;
+}>();
+
+class FieldMethods extends FormFieldMethods {
+ updateValue = (value_) => {
+ if (props['onUpdateValue']) {
+ props['onUpdateValue']({
+ value: value_,
+ form: props['form'],
+ });
+ }
+ };
+ validate = () => {
+ return true;
+ };
+ setValue = (value_) => {
+ modelValueRef.value = value_;
+ };
+ getValue = () => {
+ return modelValueRef.value;
+ };
+ clearValue = () => {
+ modelValueRef.value = '';
+ };
+}
+const fieldMethodsClass = new FieldMethods();
+
+const vertexPanelWidthRef = ref(props.vertexPanelWidth);
+const vertexPanelWidthUnitRef = ref(props.vertexPanelWidthUnit);
+const propertiesPanelWidthRef = ref(props.propertiesPanelWidth);
+const propertiesPanelWidthUnitRef = ref(props.propertiesPanelWidthUnit);
const currentSelectedTabNameRef = ref('properties');
-const graphContainerRef = ref();
const selectedCellReactive = reactive({
modelValue: {},
fields: [],
});
+const graphContainerRef = ref();
const xmlDialogRef = ref();
let graph: PlatformGraph;
@@ -131,6 +160,10 @@ const generateSvg = (vertexDefine) => {
return svg;
};
+const save = () => {
+ emit('save', graph.getXml());
+};
+
const showXml = () => {
modelValueRef.value = graph.getXml();
nextTick(() => {
@@ -179,7 +212,7 @@ const dragstart = (event, thumbnail) => {
event.dataTransfer.setData('data', Tools.object2Json(data));
};
-const onUpdateValue = (arg) => {
+const updateValue = (arg) => {
const selectedCellHandler = graph.getPlugin('PlatformSelectedCellHandler');
if (selectedCellHandler) {
selectedCellHandler.updateCell(arg);
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformConstraintHandler.ts b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformConstraintHandler.ts
new file mode 100644
index 00000000..88f51460
--- /dev/null
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformConstraintHandler.ts
@@ -0,0 +1,13 @@
+import { Graph, GraphPlugin, ConstraintHandler, ImageBox } from '@maxgraph/core';
+
+export class PlatformConstraintHandler extends ConstraintHandler implements GraphPlugin {
+ public static pluginId: string = 'PlatformConstraintHandler';
+
+ constructor(graph: Graph) {
+ super(graph);
+ const pointImage = new ImageBox('data:image/gif;base64,R0lGODlhBQAFAJECAAAA/////////wAAACH5BAEAAAIALAAAAAAFAAUAAAIIRBSml7yGQAEAOw==', 5, 5);
+ ConstraintHandler.prototype.getImageForConstraint = (state, constraint, point) => {
+ return pointImage;
+ };
+ }
+}
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformDragAndDropHandler.ts b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformDragAndDropHandler.ts
index eda397af..6d826850 100644
--- a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformDragAndDropHandler.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformDragAndDropHandler.ts
@@ -1,4 +1,4 @@
-import { Graph, VertexParameters, GraphPlugin, InternalEvent, styleUtils, eventUtils, CellState } from '@maxgraph/core';
+import { Graph, VertexParameters, GraphPlugin, InternalEvent, styleUtils, eventUtils, xmlUtils, CellState } from '@maxgraph/core';
import { PlatformVertexDefineHandler } from './PlatformVertexDefineHandler';
import { Tools } from '@/platform';
@@ -21,33 +21,29 @@ export class PlatformDragAndDropHandler implements GraphPlugin {
event.stopPropagation();
event.preventDefault();
- const view = this.graph.getView();
- const pt = styleUtils.convertPoint(this.graph.getContainer(), eventUtils.getClientX(event), eventUtils.getClientY(event));
- const tr = view.getTranslate();
- const scale = view.getScale();
- const x = pt.x / scale - tr.x;
- const y = pt.y / scale - tr.y;
+ const pt = this.graph.getPointForEvent(event);
- this.graph.batchUpdate(() => {
- const data = Tools.json2Object(event.dataTransfer.getData('data'));
- const type = data.type;
- const element = document.createElement(type);
- const vertexDefineHandler: PlatformVertexDefineHandler = this.graph.getPlugin('PlatformVertexDefineHandler');
- if (vertexDefineHandler) {
- const value = vertexDefineHandler.getValue(type) || {};
- for (const fieldName in value) {
- element.setAttribute(fieldName, value[fieldName]);
- }
+ const data = Tools.json2Object(event.dataTransfer.getData('data'));
+ const type = data.type;
+ const doc = xmlUtils.createXmlDocument();
+ const element = doc.createElement(type);
+ const vertexDefineHandler: PlatformVertexDefineHandler = this.graph.getPlugin('PlatformVertexDefineHandler');
+ if (vertexDefineHandler) {
+ const value = vertexDefineHandler.getValue(type) || {};
+ for (const fieldName in value) {
+ element.setAttribute(fieldName, value[fieldName]);
}
- const vertexParameters: VertexParameters = {
- value: element,
- parent: this.graph.getDefaultParent(),
- size: data.size,
- position: [x - data.size[0] / 2, y - data.size[1] / 2],
- style: {
- shape: data.shape,
- },
- };
+ }
+ const vertexParameters: VertexParameters = {
+ value: element,
+ parent: this.graph.getDefaultParent(),
+ size: data.size,
+ position: [pt.x - data.size[0] / 2, pt.y - data.size[1] / 2],
+ style: {
+ shape: data.shape,
+ },
+ };
+ this.graph.batchUpdate(() => {
const vertex = this.graph.insertVertex(vertexParameters);
this.graph.setSelectionCell(vertex);
});
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformEdgeDefineHandler.ts b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformEdgeDefineHandler.ts
index 7d216923..c3f6bcec 100644
--- a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformEdgeDefineHandler.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformEdgeDefineHandler.ts
@@ -1,13 +1,42 @@
-import { Graph, GraphPlugin } from '@maxgraph/core';
+import { Graph, GraphPlugin, Cell, Geometry, xmlUtils } from '@maxgraph/core';
export class PlatformEdgeDefineHandler implements GraphPlugin {
public static pluginId: string = 'PlatformEdgeDefineHandler';
private graph: Graph;
- private defines = {};
+ private defines = {
+ Connection: {
+ type: 'Connection',
+ fromVertexType: null,
+ toVertexType: null,
+ getLabel: (value) => {
+ return value.label;
+ },
+ getValue: (dom) => {
+ if (dom) {
+ return {
+ label: dom.getAttribute('label'),
+ };
+ } else {
+ return {
+ label: '',
+ };
+ }
+ },
+ getFormFields: () => {
+ return [
+ {
+ name: 'label',
+ label: 'label',
+ type: 'w-text',
+ },
+ ];
+ },
+ },
+ };
setDefines(configures) {
for (const configure of configures) {
- this.defines[configure.type.toLowerCase()] = {
+ this.defines[configure.type] = {
fromVertexType: configure.fromVertexType,
toVertexType: configure.toVertexType,
getLabel: configure.getLabel,
@@ -17,12 +46,25 @@ export class PlatformEdgeDefineHandler implements GraphPlugin {
}
}
+ createEdge(parent = null, id, value, source = null, target = null, style = {}) {
+ const sourceType = source.value.nodeName;
+ const targetType = target.value.nodeName;
+ const type = this.getType(sourceType, targetType);
+ const doc = xmlUtils.createXmlDocument();
+ const element = doc.createElement(type);
+ const edge = new Cell(element, new Geometry(), style);
+ edge.setEdge(true);
+ return edge;
+ }
+
getType(fromType, toType) {
- for (const define in this.defines) {
- if (define.fromVertexType === fromType && define.toType === toType) {
- return define;
+ for (const type in this.defines) {
+ const define = this.defines[type];
+ if ((define.fromVertexType === fromType && define.toVertexType === toType) || define.fromVertexType === fromType || define.toVertexType === toType) {
+ return type;
}
}
+ return 'Connection';
}
getLabel(type, value) {
@@ -33,6 +75,7 @@ export class PlatformEdgeDefineHandler implements GraphPlugin {
}
getValue(type, dom) {
+ console.log(type, dom);
if (this.defines[type]?.getValue) {
return this.defines[type]?.getValue(dom);
} else {
@@ -56,7 +99,5 @@ export class PlatformEdgeDefineHandler implements GraphPlugin {
}
}
- createEdge(parent = null, id, value, source = null, target = null, style = {}) {}
-
onDestroy() {}
}
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformSelectedCellHandler.ts b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformSelectedCellHandler.ts
index 90d5d397..90659519 100644
--- a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformSelectedCellHandler.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformSelectedCellHandler.ts
@@ -22,7 +22,7 @@ export class PlatformSelectedCellHandler implements GraphPlugin {
}
if (cell.isVertex()) {
const dom = cell.value;
- const type = dom.nodeName.toLowerCase();
+ const type = dom.nodeName;
const vertexDefineHandler: PlatformVertexDefineHandler = this.graph.getPlugin('PlatformVertexDefineHandler');
if (vertexDefineHandler) {
const value = vertexDefineHandler.getValue(type, cell);
@@ -35,7 +35,7 @@ export class PlatformSelectedCellHandler implements GraphPlugin {
}
} else {
const dom = cell.value;
- const type = dom.nodeName.toLowerCase();
+ const type = dom.nodeName;
const edgeDefineHandler: PlatformEdgeDefineHandler = this.graph.getPlugin('PlatformEdgeDefineHandler');
if (edgeDefineHandler) {
const value = edgeDefineHandler.getValue(type, cell);
@@ -58,16 +58,17 @@ export class PlatformSelectedCellHandler implements GraphPlugin {
updateCell(arg) {
this.graph.batchUpdate(() => {
- let cell = this.graph.getSelectionCell();
- if (Tools.isArray(cell)) {
- cell = cell[0];
+ const cell = this.graph.getSelectionCell();
+ if (!cell) {
+ return;
}
const dom = cell.value;
const formData = arg.form.getData();
for (const field in formData) {
dom.setAttribute(field, formData[field]);
}
- const edit = new ValueChange(this.graph.getDataModel(), this.graph.getSelectionCell(), dom);
+ console.log(dom);
+ const edit = new ValueChange(this.graph.getDataModel(), cell, dom);
this.graph.getDataModel().execute(edit);
//this.graph.updateCellSize(cell);
});
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformVertexDefineHandler.ts b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformVertexDefineHandler.ts
index b690694b..7bcd8679 100644
--- a/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformVertexDefineHandler.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/handler/PlatformVertexDefineHandler.ts
@@ -11,7 +11,7 @@ export class PlatformVertexDefineHandler implements GraphPlugin {
setDefines(configures) {
for (const configure of configures) {
- this.defines[configure.type.toLowerCase()] = {
+ this.defines[configure.type] = {
getLabel: configure.getLabel,
getValue: configure.getValue,
getFormFields: configure.getFormFields,
diff --git a/io.sc.platform.core.frontend/src/platform/components/graph/handler/index.ts b/io.sc.platform.core.frontend/src/platform/components/graph/handler/index.ts
index fcc1e785..cc22f79d 100644
--- a/io.sc.platform.core.frontend/src/platform/components/graph/handler/index.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/graph/handler/index.ts
@@ -1,11 +1,13 @@
-import { PlatformDragAndDropHandler } from '@/platform/components/graph/handler/PlatformDragAndDropHandler';
-import { PlatformEdgeDefineHandler } from '@/platform/components/graph/handler/PlatformEdgeDefineHandler';
-import { PlatformKeyBindHandler } from '@/platform/components/graph/handler/PlatformKeyBindHandler';
-import { PlatformSelectedCellHandler } from '@/platform/components/graph/handler/PlatformSelectedCellHandler';
-import { PlatformVertexDefineHandler } from '@/platform/components/graph/handler/PlatformVertexDefineHandler';
-import { PlatformUndoManagerHandler } from '@/platform/components/graph/handler/PlatformUndoManagerHandler';
+import { PlatformConstraintHandler } from './PlatformConstraintHandler';
+import { PlatformDragAndDropHandler } from './PlatformDragAndDropHandler';
+import { PlatformEdgeDefineHandler } from './PlatformEdgeDefineHandler';
+import { PlatformKeyBindHandler } from './PlatformKeyBindHandler';
+import { PlatformSelectedCellHandler } from './PlatformSelectedCellHandler';
+import { PlatformVertexDefineHandler } from './PlatformVertexDefineHandler';
+import { PlatformUndoManagerHandler } from './PlatformUndoManagerHandler';
export {
+ PlatformConstraintHandler,
PlatformDragAndDropHandler,
PlatformEdgeDefineHandler,
PlatformKeyBindHandler,
diff --git a/io.sc.platform.core.frontend/src/platform/plugin/quasar-components.ts b/io.sc.platform.core.frontend/src/platform/plugin/quasar-components.ts
new file mode 100644
index 00000000..264715f9
--- /dev/null
+++ b/io.sc.platform.core.frontend/src/platform/plugin/quasar-components.ts
@@ -0,0 +1,125 @@
+export {
+ QAjaxBar,
+ QAvatar,
+ QBadge,
+ QBanner,
+ QBar,
+ QBreadcrumbs,
+ QBreadcrumbsEl,
+ QBtn,
+ QBtnDropdown,
+ QBtnGroup,
+ QBtnToggle,
+ QCard,
+ QCardSection,
+ QCardActions,
+ QCarousel,
+ QCarouselSlide,
+ QCarouselControl,
+ QChatMessage,
+ QCheckbox,
+ QChip,
+ QCircularProgress,
+ QColor,
+ QDate,
+ QDialog,
+ QDrawer,
+ QEditor,
+ QExpansionItem,
+ QFab,
+ QFabAction,
+ QField,
+ QFile,
+ QFooter,
+ QForm,
+ QFormChildMixin,
+ QHeader,
+ QIcon,
+ QImg,
+ QInfiniteScroll,
+ QInnerLoading,
+ QInput,
+ QIntersection,
+ QList,
+ QItem,
+ QItemSection,
+ QItemLabel,
+ QKnob,
+ QLayout,
+ QLinearProgress,
+ QMarkupTable,
+ QMenu,
+ QNoSsr,
+ QOptionGroup,
+ QPage,
+ QPageContainer,
+ QPageScroller,
+ QPageSticky,
+ QPagination,
+ QParallax,
+ QPopupEdit,
+ QPopupProxy,
+ QPullToRefresh,
+ QRadio,
+ QRange,
+ QRating,
+ QResizeObserver,
+ QResponsive,
+ QScrollArea,
+ QScrollObserver,
+ QSelect,
+ QSeparator,
+ QSkeleton,
+ QSlideItem,
+ QSlideTransition,
+ QSlider,
+ QSpace,
+ QSpinner,
+ QSpinnerAudio,
+ QSpinnerBall,
+ QSpinnerBars,
+ QSpinnerBox,
+ QSpinnerClock,
+ QSpinnerComment,
+ QSpinnerCube,
+ QSpinnerDots,
+ QSpinnerFacebook,
+ QSpinnerGears,
+ QSpinnerGrid,
+ QSpinnerHearts,
+ QSpinnerHourglass,
+ QSpinnerInfinity,
+ QSpinnerIos,
+ QSpinnerOrbit,
+ QSpinnerOval,
+ QSpinnerPie,
+ QSpinnerPuff,
+ QSpinnerRadio,
+ QSpinnerRings,
+ QSpinnerTail,
+ QSplitter,
+ QStep,
+ QStepper,
+ QStepperNavigation,
+ QTabPanels,
+ QTabPanel,
+ QTable,
+ QTh,
+ QTr,
+ QTd,
+ QTabs,
+ QTab,
+ QRouteTab,
+ QTime,
+ QTimeline,
+ QTimelineEntry,
+ QToggle,
+ QToolbar,
+ QToolbarTitle,
+ QTooltip,
+ QTree,
+ QUploader,
+ QUploaderAddTrigger,
+ QVideo,
+ QVirtualScroll,
+} from 'quasar';
diff --git a/io.sc.platform.core.frontend/src/platform/plugin/quasar-directives.ts b/io.sc.platform.core.frontend/src/platform/plugin/quasar-directives.ts
new file mode 100644
index 00000000..546f2375
--- /dev/null
+++ b/io.sc.platform.core.frontend/src/platform/plugin/quasar-directives.ts
@@ -0,0 +1 @@
+export { ClosePopup, Intersection, Morph, Mutation, Ripple, ScrollFire, Scroll, TouchHold, TouchPan, TouchRepeat, TouchSwipe } from 'quasar';
diff --git a/io.sc.platform.core.frontend/src/platform/plugin/quasar-plugins.ts b/io.sc.platform.core.frontend/src/platform/plugin/quasar-plugins.ts
new file mode 100644
index 00000000..1b3c7589
--- /dev/null
+++ b/io.sc.platform.core.frontend/src/platform/plugin/quasar-plugins.ts
@@ -0,0 +1,14 @@
+export {
+ AddressbarColor,
+ AppFullscreen,
+ AppVisibility,
+ BottomSheet,
+ Cookies,
+ Dialog,
+ Loading,
+ LoadingBar,
+ LocalStorage,
+ SessionStorage,
+ Meta,
+ Notify,
+} from 'quasar';
diff --git a/io.sc.platform.core.frontend/src/platform/plugin/quasar.ts b/io.sc.platform.core.frontend/src/platform/plugin/quasar.ts
index 0ee49a2c..7a4d8e57 100644
--- a/io.sc.platform.core.frontend/src/platform/plugin/quasar.ts
+++ b/io.sc.platform.core.frontend/src/platform/plugin/quasar.ts
@@ -1,27 +1,18 @@
import type { App } from 'vue';
-import { EventBus } from 'quasar';
import type { I18nMessageLocaleType } from '@/platform/types';
+import { EventBus } from 'quasar';
import { Environment } from '@/platform/plugin/environment';
import { I18nMessageManager } from '@/platform/plugin/manager';
+import { Tools } from '@/platform/utils/Tools';
const gc = Environment.getConfigure();
const eventBus: any = new EventBus();
-import {
- Quasar,
- AddressbarColor,
- AppFullscreen,
- AppVisibility,
- BottomSheet,
- Cookies,
- Dialog,
- Loading,
- LoadingBar,
- LocalStorage,
- SessionStorage,
- Meta,
- Notify,
-} from 'quasar';
+import { Quasar } from 'quasar';
+
+import * as quasarComponents from './quasar-components';
+import * as quasarDirectives from './quasar-directives';
+import * as quasarPlugins from './quasar-plugins';
export default {
install: (app: App) => {
@@ -41,20 +32,9 @@ export default {
},
},
},
- plugins: {
- AddressbarColor,
- AppFullscreen,
- AppVisibility,
- BottomSheet,
- Cookies,
- Dialog,
- Loading,
- LoadingBar,
- LocalStorage,
- SessionStorage,
- Meta,
- Notify,
- },
+ components: quasarComponents,
+ directives: quasarDirectives,
+ plugins: quasarPlugins,
});
// 初始化 quasar 语言
diff --git a/io.sc.platform.core.frontend/src/platform/utils/JavascriptLoader.ts b/io.sc.platform.core.frontend/src/platform/utils/JavascriptLoader.ts
index 1f80f0fb..43ca47db 100644
--- a/io.sc.platform.core.frontend/src/platform/utils/JavascriptLoader.ts
+++ b/io.sc.platform.core.frontend/src/platform/utils/JavascriptLoader.ts
@@ -25,7 +25,9 @@ class JavascriptLoader {
const element = this.#urlMap.get(url);
if (element) {
element.onerror = element.onload = null;
- element.parentNode && element.parentNode.removeChild(element);
+ if (element.parentNode) {
+ element.parentNode.removeChild(element);
+ }
}
this.#urlMap.delete(url);
if (this.#urlMap.size <= 0 && !this.#failed) {
@@ -38,7 +40,9 @@ class JavascriptLoader {
const element = this.#urlMap.get(url);
if (element) {
element.onerror = element.onload = null;
- element.parentNode && element.parentNode.removeChild(element);
+ if (element.parentNode) {
+ element.parentNode.removeChild(element);
+ }
}
this.#urlMap.delete(url);
if (!this.#failed) {
diff --git a/io.sc.platform.core.frontend/src/platform/utils/Tools.ts b/io.sc.platform.core.frontend/src/platform/utils/Tools.ts
index 2205dfac..72cd07d9 100644
--- a/io.sc.platform.core.frontend/src/platform/utils/Tools.ts
+++ b/io.sc.platform.core.frontend/src/platform/utils/Tools.ts
@@ -123,6 +123,22 @@ class Tools {
return `${h % 12 === 0 ? 12 : h % 12}${h < 12 ? ' am.' : ' pm.'}`;
}
+ /**
+ * 将骆驼命名规则的字符串转换成使用短横线命名法的字符串,并且全小写. 例如:'getElementById'=>'get-element-by-id'
+ * @param str 字符串
+ * @returns 转换后的字符串
+ */
+ public static getKebabCase(str: string): string {
+ const result = str.replace(/[A-Z]/g, function (i) {
+ return '-' + i.toLowerCase();
+ });
+ if (result.startsWith('-')) {
+ return result.substring(1);
+ } else {
+ return result;
+ }
+ }
+
/**
* 将句子的第一个字母大写
* @param param0 字符串
diff --git a/io.sc.platform.core.frontend/src/shims-vue.d.ts b/io.sc.platform.core.frontend/src/shims-vue.d.ts
index 7a93dd4a..ecae964f 100644
--- a/io.sc.platform.core.frontend/src/shims-vue.d.ts
+++ b/io.sc.platform.core.frontend/src/shims-vue.d.ts
@@ -1,3 +1,4 @@
+/* eslint-disable */
import type { AppType } from '@/platform/types';
declare global {
diff --git a/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue b/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue
index 345353ef..7134c7d4 100644
--- a/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue
+++ b/io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue
@@ -7,8 +7,8 @@ import { $t } from '@/platform';
const edgeDefines = [
{
- type: 'condition',
- fromVertexType: 'condition',
+ type: 'ConditionBranch',
+ fromVertexType: 'Condition',
toVertexType: null,
getLabel: (value) => {
return value.value;
@@ -16,7 +16,9 @@ const edgeDefines = [
getValue: (dom) => {
if (dom) {
return {
- condition: dom.getAttribute('condition'),
+ valueType: dom.getAttribute('valueType'),
+ value: dom.getAttribute('value'),
+ commands: dom.getAttribute('commands'),
};
} else {
return {
@@ -55,31 +57,43 @@ const edgeDefines = [
const vertexDefines = [
{
- type: 'start',
+ type: 'Start',
thumbnail: { shape: 'ellipse', label: $t('start'), rx: 8, ry: 8, strokeColor: 'black', strokeWidth: 1 },
cell: {
shape: 'ellipse',
size: [50, 50],
},
getLabel: (value) => {
- return $t('start');
+ return value.label;
},
getValue: (dom) => {
- return {};
+ if (dom) {
+ return {
+ label: dom.getAttribute('label'),
+ };
+ } else {
+ return { label: $t('start') };
+ }
},
getFormFields: () => {
- return [];
+ return [
+ {
+ name: 'label',
+ label: 'label',
+ type: 'w-text',
+ },
+ ];
},
},
{
- type: 'condition',
+ type: 'Condition',
thumbnail: { shape: 'rhombus', label: $t('condition'), strokeColor: 'black', strokeWidth: 1 },
cell: {
shape: 'rhombus',
size: [120, 60],
},
getLabel: (value) => {
- return value.condition;
+ return value.condition ? value.condition : $t('condition');
},
getValue: (dom) => {
if (dom) {
@@ -88,7 +102,7 @@ const vertexDefines = [
};
} else {
return {
- condition: $t('condition'),
+ condition: '',
};
}
},
@@ -108,7 +122,7 @@ const vertexDefines = [
},
},
{
- type: 'expression',
+ type: 'Expression',
thumbnail: { shape: 'rectangle', label: $t('expression'), strokeColor: 'black', strokeWidth: 1 },
cell: {
shape: 'rectangle',
@@ -151,8 +165,8 @@ const vertexDefines = [
},
},
{
- type: 'resourceabstract',
- thumbnail: { shape: 'ellipse', label: '资源摘要', rx: 10, ry: 6, strokeColor: 'black', strokeWidth: 1 },
+ type: 'ResourceAbstract',
+ thumbnail: { shape: 'ellipse', label: '资源摘要', rx: 11, ry: 6, strokeColor: 'black', strokeWidth: 1 },
cell: {
shape: 'ellipse',
size: [120, 60],
diff --git a/io.sc.platform.core.frontend/template-project/.editorconfig b/io.sc.platform.core.frontend/template-project/.editorconfig
index 2791f744..4bd609e2 100644
--- a/io.sc.platform.core.frontend/template-project/.editorconfig
+++ b/io.sc.platform.core.frontend/template-project/.editorconfig
@@ -10,5 +10,6 @@ root = true
charset = utf-8 # 字符集: utf-8
indent_size = 2 # 缩进大小: 2
indent_style = space # 缩进风格: 空格
+end_of_line = lf # 行结束符: 换行符
insert_final_newline = true # 是否在文件的最后插入一个空行
trim_trailing_whitespace = true # 是否删除行尾的空格
diff --git a/io.sc.platform.core.frontend/template-project/.eslintrc.cjs b/io.sc.platform.core.frontend/template-project/.eslintrc.cjs
index 3e35007c..f7fab5cc 100644
--- a/io.sc.platform.core.frontend/template-project/.eslintrc.cjs
+++ b/io.sc.platform.core.frontend/template-project/.eslintrc.cjs
@@ -1,35 +1,68 @@
module.exports = {
- root: true,
+ // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy
+ // This option interrupts the configuration hierarchy at this file
+ // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos)
+ root: true,
- env: {
- browser: true,
- es2022: true,
- "vue/setup-compiler-macros": true,
- },
+ env: {
+ browser: true,
+ es2022: true,
+ node: true,
+ 'vue/setup-compiler-macros': true,
+ },
- extends:[
- "eslint:recommended",
- "plugin:vue/vue3-recommended",
- "plugin:@typescript-eslint/recommended",
- "plugin:prettier/recommended",
- ],
-
- parser: "vue-eslint-parser",
- parserOptions: {
- ecmaVersion: 2022,
- parser: "@typescript-eslint/parser",
- sourceType: "module",
- ecmaFeatures: {
- jsx : false
- }
- },
+ // Rules order is important, please avoid shuffling them
+ extends: [
+ // Base ESLint recommended rules
+ 'eslint:recommended',
+
+ // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage
+ // ESLint typescript rules
+ 'plugin:@typescript-eslint/recommended',
+
+ // Vue ESLint recommended rules
+ // 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention)
+ // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability)
+ // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead)
+ 'plugin:vue/vue3-recommended',
+
+ // https://github.com/prettier/eslint-config-prettier#installation
+ // usage with Prettier, provided by 'eslint-config-prettier'.
+ 'plugin:prettier/recommended', // Recommended
+ ],
- rules:{
- 'semi':[1],
- '@typescript-eslint/no-var-requires': 'off',
- '@typescript-eslint/no-explicit-any': 'off',
- "@typescript-eslint/no-unused-vars": 'off',
- 'vue/multi-word-component-names': 'off', /* 禁用 vue 组件名称检查规则 */
- 'no-prototype-builtins': 'off',
+ parser: 'vue-eslint-parser',
+ parserOptions: {
+ ecmaVersion: 2022,
+ parser: '@typescript-eslint/parser',
+ ecmaFeatures: {
+ jsx: false,
},
+ },
+
+ plugins: [
+ // required to apply rules which need type information
+ '@typescript-eslint',
+
+ // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files
+ // required to lint *.vue files
+ 'vue',
+
+ // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674
+ // Prettier has not been included as plugin to avoid performance impact
+ // add it as an extension for your IDE
+ ],
+
+ rules: {
+ semi: [1],
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-empty-object-type': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+ 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */,
+ 'no-prototype-builtins': 'off',
+ 'prefer-rest-params': 'off',
+ },
};
diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json
index 8192b252..517e3efa 100644
--- a/io.sc.platform.core.frontend/template-project/package.json
+++ b/io.sc.platform.core.frontend/template-project/package.json
@@ -1,6 +1,6 @@
{
"name": "platform-core",
- "version": "8.1.316",
+ "version": "8.1.321",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@@ -24,94 +24,95 @@
"no-git-checks": true
},
"devDependencies": {
- "@babel/core": "7.24.7",
- "@babel/preset-env": "7.24.7",
+ "@babel/core": "7.25.2",
+ "@babel/preset-env": "7.25.4",
"@babel/preset-typescript": "7.24.7",
- "@babel/plugin-transform-class-properties": "7.24.7",
+ "@babel/plugin-transform-class-properties": "7.25.4",
"@babel/plugin-transform-object-rest-spread": "7.24.7",
- "@quasar/app-webpack": "3.13.2",
+ "@quasar/app-webpack": "4.0.0-beta.16",
"@quasar/cli": "2.4.1",
"@types/mockjs": "1.0.10",
- "@types/node": "20.14.10",
- "@typescript-eslint/eslint-plugin": "7.15.0",
- "@typescript-eslint/parser": "7.15.0",
- "@vue/compiler-sfc": "3.4.31",
+ "@types/node": "22.5.4",
+ "@typescript-eslint/eslint-plugin": "8.5.0",
+ "@typescript-eslint/parser": "8.5.0",
+ "@vue/compiler-sfc": "3.5.3",
"@webpack-cli/serve": "2.0.5",
- "autoprefixer": "10.4.19",
+ "autoprefixer": "10.4.20",
"babel-loader": "9.1.3",
"clean-webpack-plugin": "4.0.0",
"copy-webpack-plugin": "12.0.2",
"cross-env": "7.0.3",
"css-loader": "7.1.2",
- "eslint": "8.56.0",
+ "eslint": "8.57.0",
"eslint-config-prettier": "9.1.0",
- "eslint-plugin-prettier": "5.1.3",
- "eslint-plugin-vue": "9.27.0",
+ "eslint-plugin-prettier": "5.2.1",
+ "eslint-plugin-vue": "9.28.0",
"eslint-webpack-plugin": "4.2.0",
"html-webpack-plugin": "5.6.0",
"json5": "2.2.3",
- "mini-css-extract-plugin": "2.9.0",
+ "mini-css-extract-plugin": "2.9.1",
"nodemon": "3.1.4",
- "postcss": "8.4.39",
+ "postcss": "8.4.45",
"postcss-import": "16.1.0",
"postcss-loader": "8.1.1",
- "postcss-preset-env": "9.6.0",
- "prettier": "3.3.2",
- "sass": "1.77.6",
- "sass-loader": "14.2.1",
- "typescript": "5.5.3",
+ "postcss-preset-env": "10.0.3",
+ "prettier": "3.3.3",
+ "sass": "1.78.0",
+ "sass-loader": "16.0.1",
+ "typescript": "5.5.4",
"vue-loader": "17.4.2",
- "webpack": "5.92.1",
+ "webpack": "5.94.0",
"webpack-bundle-analyzer": "4.10.2",
"webpack-cli": "5.1.4",
- "webpack-dev-server": "5.0.4",
+ "webpack-dev-server": "5.1.0",
"webpack-merge": "6.0.1",
- "@vue/babel-plugin-jsx": "1.2.2"
+ "@vue/babel-plugin-jsx": "1.2.4"
},
"dependencies": {
- "@codemirror/autocomplete": "6.17.0",
- "@codemirror/commands": "6.6.0",
+ "@codemirror/autocomplete": "6.18.0",
+ "@codemirror/commands": "6.6.1",
"@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.2",
"@codemirror/lang-json": "6.0.1",
- "@codemirror/lang-sql": "6.7.0",
+ "@codemirror/lang-sql": "6.7.1",
"@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.2",
"@codemirror/search": "6.5.6",
"@codemirror/state": "6.4.1",
- "@codemirror/view": "6.28.4",
+ "@codemirror/view": "6.33.0",
"@maxgraph/core": "0.13.0",
"@quasar/extras": "1.16.12",
- "@univerjs/core": "0.2.0",
- "@univerjs/design": "0.2.0",
- "@univerjs/docs": "0.2.0",
- "@univerjs/docs-ui": "0.2.0",
- "@univerjs/engine-formula": "0.2.0",
- "@univerjs/engine-render": "0.2.0",
- "@univerjs/facade": "0.2.0",
- "@univerjs/sheets": "0.2.0",
- "@univerjs/sheets-formula": "0.2.0",
- "@univerjs/sheets-ui": "0.2.0",
- "@univerjs/ui": "0.2.0",
- "@vueuse/core": "10.11.0",
- "axios": "1.7.2",
+ "@univerjs/core": "0.2.12",
+ "@univerjs/design": "0.2.12",
+ "@univerjs/docs": "0.2.12",
+ "@univerjs/docs-ui": "0.2.12",
+ "@univerjs/engine-formula": "0.2.12",
+ "@univerjs/engine-render": "0.2.12",
+ "@univerjs/facade": "0.2.12",
+ "@univerjs/sheets": "0.2.12",
+ "@univerjs/sheets-formula": "0.2.12",
+ "@univerjs/sheets-ui": "0.2.12",
+ "@univerjs/thread-comment": "0.2.12",
+ "@univerjs/ui": "0.2.12",
+ "@vueuse/core": "11.0.3",
+ "axios": "1.7.7",
"codemirror": "6.0.1",
- "dayjs": "1.11.11",
+ "dayjs": "1.11.13",
"echarts": "5.5.1",
"exceljs": "4.4.0",
"file-saver": "2.0.5",
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
- "pinia": "2.1.7",
- "platform-core": "8.1.316",
- "quasar": "2.15.4",
+ "pinia": "2.2.2",
+ "platform-core": "8.1.321",
+ "quasar": "2.16.11",
"svg-path-commander": "2.0.10",
- "tailwindcss": "3.4.4",
- "vue": "3.4.31",
+ "tailwindcss": "3.4.10",
+ "vue": "3.4.38",
"vue-dompurify-html": "5.1.0",
- "vue-i18n": "9.13.1",
- "vue-router": "4.4.0",
+ "vue-i18n": "10.0.0",
+ "vue-router": "4.4.3",
"xml-formatter": "3.6.3"
}
}
\ No newline at end of file
diff --git a/io.sc.platform.core.frontend/template-project/public/index.html b/io.sc.platform.core.frontend/template-project/public/index.html
index c3b9270d..d1c1f7a0 100644
--- a/io.sc.platform.core.frontend/template-project/public/index.html
+++ b/io.sc.platform.core.frontend/template-project/public/index.html
@@ -29,27 +29,34 @@
diff --git a/io.sc.platform.core.frontend/template-project/src/components/index.ts b/io.sc.platform.core.frontend/template-project/src/components/index.ts
index 82b32f86..06378e8d 100644
--- a/io.sc.platform.core.frontend/template-project/src/components/index.ts
+++ b/io.sc.platform.core.frontend/template-project/src/components/index.ts
@@ -5,7 +5,6 @@
import component_testcase_openNoMenuRoute from '@/views/testcase/route/OpenNoMenuRoute.vue';
import component_testcase_noMenuRoute from '@/views/testcase/route/NoMenuRoute.vue';
import component_testcase_mathEditor from '@/views/testcase/math/MathEditor.vue';
-import component_testcase_mathEditorForm from '@/views/testcase/math/MathEditorForm.vue';
import component_testcase_form from '@/views/testcase/form/form.vue';
import component_testcase_codemirror from '@/views/testcase/code-mirror/code-mirror.vue';
import component_testcase_loading from '@/views/testcase/loading/loading.vue';
@@ -26,7 +25,6 @@ const localComponents = {
'component.testcase.openNoMenuRoute': component_testcase_openNoMenuRoute,
'component.testcase.noMenuRoute': component_testcase_noMenuRoute,
'component.testcase.mathEditor': component_testcase_mathEditor,
- 'component.testcase.mathEditorForm': component_testcase_mathEditorForm,
'component.testcase.form': component_testcase_form,
'component.testcase.codemirror': component_testcase_codemirror,
'component.testcase.loading': component_testcase_loading,
diff --git a/io.sc.platform.core.frontend/template-project/src/routes/routes.json b/io.sc.platform.core.frontend/template-project/src/routes/routes.json
index 0bd0ec1c..29deba26 100644
--- a/io.sc.platform.core.frontend/template-project/src/routes/routes.json
+++ b/io.sc.platform.core.frontend/template-project/src/routes/routes.json
@@ -20,7 +20,7 @@
"priority": 0,
"component": "component.testcase.noMenuRoute",
"componentPath": "@/views/testcase/route/NoMenuRoute.vue",
- "redirect": null,
+ "redirect": null,
"meta": {
"permissions": ["/testcase/route/**/*"]
}
@@ -38,20 +38,6 @@
"permissions": ["/testcase/math/**/*"]
}
},
-
- {
- "name": "route.testcase.mathEditorForm",
- "path": "testcase/mathEditorForm",
- "parent": "/",
- "priority": 0,
- "component": "component.testcase.mathEditorForm",
- "componentPath": "@/views/testcase/math/MathEditorForm.vue",
- "redirect": null,
- "meta": {
- "permissions": ["/testcase/math/**/*"]
- }
- },
-
{
"name": "route.testcase.form",
"path": "testcase/form",
diff --git a/io.sc.platform.core.frontend/template-project/src/shims-vue.d.ts b/io.sc.platform.core.frontend/template-project/src/shims-vue.d.ts
index 1e691bc3..8032c5d6 100644
--- a/io.sc.platform.core.frontend/template-project/src/shims-vue.d.ts
+++ b/io.sc.platform.core.frontend/template-project/src/shims-vue.d.ts
@@ -1,3 +1,4 @@
+/* eslint-disable */
import type { AppType } from 'platform-core/types';
declare global {
diff --git a/io.sc.platform.core.frontend/template-project/src/views/Editor.vue b/io.sc.platform.core.frontend/template-project/src/views/Editor.vue
index b8924ecc..0c658433 100644
--- a/io.sc.platform.core.frontend/template-project/src/views/Editor.vue
+++ b/io.sc.platform.core.frontend/template-project/src/views/Editor.vue
@@ -2,52 +2,52 @@
diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/Dialog.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/Dialog.vue
index 99c8e6ae..60b4aa3b 100644
--- a/io.sc.platform.core.frontend/template-project/src/views/likm/Dialog.vue
+++ b/io.sc.platform.core.frontend/template-project/src/views/likm/Dialog.vue
@@ -2,37 +2,33 @@
-
-
-
-
- 22222
-
-
+ 我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
+ 我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
我是窗口内容
+
+ {
+ dialogRef.show();
+ }
+ "
+ >
diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/Drawer.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/Drawer.vue
index 210f1cb7..9fcedd39 100644
--- a/io.sc.platform.core.frontend/template-project/src/views/likm/Drawer.vue
+++ b/io.sc.platform.core.frontend/template-project/src/views/likm/Drawer.vue
@@ -1,34 +1,88 @@
-
-
-
+
- 1111
-
-
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow',
+ },
+ },
+ grid: {
+ left: '3%',
+ right: '4%',
+ bottom: '3%',
+ containLabel: true,
+ },
+ dataZoom: [
+ {
+ type: 'slider',
+ show: true, // 是否显示滚动条
+ borderColor: '#2563eb', // 边框颜色
+ showDetail: false, // 是否显示detail,即拖拽时显示详细数值信息
+ startValue: 0, // 开始数值
+ endValue: 10, // 结束数值
+ filterMode: 'empty',
+ width: '80%', // 滚动条宽度
+ height: 8, // 滚动条高度
+ left: 'center', // 居中显示
+ zoomLoxk: true, // 是否锁定选择区域的大小
+ handleSize: 0, // 控制手柄的尺寸
+ bottom: 0, // 距离容器下侧的距离
+ },
+ {
+ type: 'inside',
+ zoomOnMouseWheel: false, // 滚动不触发缩放
+ moveOnMouseMove: true, // 鼠标移动触发平移
+ moveOnMouseWheel: true, // 鼠标滚动触发平移
+ },
+ ],
+ xAxis: [
+ {
+ type: 'category',
+ data: [
+ '黄浦支行',
+ '徐汇支行',
+ '长宁支行',
+ '静安支行',
+ '普陀支行',
+ '虹口支行',
+ '杨浦支行',
+ '浦东支行',
+ '闵行支行',
+ '宝山支行',
+ '嘉定支行',
+ '金山支行',
+ '松江支行',
+ '青浦支行',
+ '奉贤支行',
+ '崇明支行',
+ ],
+ axisTick: {
+ alignWithLabel: true,
+ },
+ },
+ ],
+ yAxis: [
+ {
+ type: 'value',
+ name: '单位:万元',
+ },
+ ],
+ series: [
+ {
+ type: 'bar',
+ barWidth: '10%',
+ data: [1700, 1600, 1500, 1400, 1300, 1200, 1100, 1000, 900, 800, 600, 500, 400, 300, 200, 100],
+ },
+ ],
+ }"
+ >
-
+
diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/Form.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/Form.vue
index 46d80793..099f0a1b 100644
--- a/io.sc.platform.core.frontend/template-project/src/views/likm/Form.vue
+++ b/io.sc.platform.core.frontend/template-project/src/views/likm/Form.vue
@@ -1,169 +1,287 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{
+ console.info('form.updateValue=====', args);
+ }
+ "
+ >
+
diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/InfoPanel.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/InfoPanel.vue
index 1b13197c..ecf33342 100644
--- a/io.sc.platform.core.frontend/template-project/src/views/likm/InfoPanel.vue
+++ b/io.sc.platform.core.frontend/template-project/src/views/likm/InfoPanel.vue
@@ -4,8 +4,6 @@
diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue
index 51263db6..55028bad 100644
--- a/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue
+++ b/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue
@@ -2,26 +2,41 @@
{
- console.info('grid=====', grid);
- console.info('updateDatas======', updateDatas);
- }
- "
+ title="树形表格示例"
+ :fetch-data-url="Environment.apiContextPath('api/system/menu/allMenus')"
+ :tree="true"
+ db-click-operation="expand"
+ draggable="local"
+ :columns="[
+ {
+ name: 'name',
+ label: '菜单名称',
+ type: 'text',
+ format: (val, row) => {
+ return t(row.name);
+ },
+ },
+ {
+ name: 'icon',
+ label: '图标',
+ type: 'icon',
+ attrs: {
+ required: true,
+ },
+ format: (val, row) => {
+ return {
+ componentType: 'q-icon',
+ attrs: {
+ name: val,
+ size: 'xs',
+ },
+ };
+ },
+ },
+ { name: 'type', label: '菜单类型' },
+ { name: 'order', label: '排序号' },
+ ]"
+ :toolbar-actions="['expand']"
>
@@ -82,11 +97,11 @@ const testGrid = {
],
'separator',
],
- queryFormFields: [
- { label: '菜单名称', name: 'name', type: 'w-password' },
- { label: '菜单类型', name: 'userName', type: 'select' },
- { label: '是否可用', name: 'enable', type: 'select' },
- ],
+ // queryFormFields: [
+ // { label: '菜单名称', name: 'name', type: 'w-password' },
+ // { label: '菜单类型', name: 'userName', type: 'select' },
+ // { label: '是否可用', name: 'enable', type: 'select' },
+ // ],
tableColumns: [
{
name: 'name',
diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue
index b6c43369..7134c7d4 100644
--- a/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue
+++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue
@@ -1,37 +1,199 @@
-
+
diff --git a/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs b/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs
index a1819edc..248aa8f4 100644
--- a/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs
+++ b/io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs
@@ -61,18 +61,19 @@ module.exports = {
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true },
- "xml-formatter": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/core": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/design": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/docs": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/docs-ui": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/engine-formula": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/engine-render": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/facade": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/sheets": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/sheets-formula": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/sheets-ui": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/ui": { requiredVersion: deps['vue-router'], singleton: true }
+ "xml-formatter": { requiredVersion: deps['xml-formatter'], singleton: true },
+ "@univerjs/core": { requiredVersion: deps['@univerjs/core'], singleton: true },
+ "@univerjs/design": { requiredVersion: deps['@univerjs/design'], singleton: true },
+ "@univerjs/docs": { requiredVersion: deps['@univerjs/docs'], singleton: true },
+ "@univerjs/docs-ui": { requiredVersion: deps['@univerjs/docs-ui'], singleton: true },
+ "@univerjs/engine-formula": { requiredVersion: deps['@univerjs/engine-formula'], singleton: true },
+ "@univerjs/engine-render": { requiredVersion: deps['@univerjs/engine-render'], singleton: true },
+ "@univerjs/facade": { requiredVersion: deps['@univerjs/facade'], singleton: true },
+ "@univerjs/sheets": { requiredVersion: deps['@univerjs/sheets'], singleton: true },
+ "@univerjs/sheets-formula": { requiredVersion: deps['@univerjs/sheets-formula'], singleton: true },
+ "@univerjs/sheets-ui": { requiredVersion: deps['@univerjs/sheets-ui'], singleton: true },
+ "@univerjs/thread-comment": { requiredVersion: deps['@univerjs/thread-comment'], singleton: true },
+ "@univerjs/ui": { requiredVersion: deps['@univerjs/ui'], singleton: true }
}
}),
]
diff --git a/io.sc.platform.core.frontend/webpack.config.mf.cjs b/io.sc.platform.core.frontend/webpack.config.mf.cjs
index a1819edc..248aa8f4 100644
--- a/io.sc.platform.core.frontend/webpack.config.mf.cjs
+++ b/io.sc.platform.core.frontend/webpack.config.mf.cjs
@@ -61,18 +61,19 @@ module.exports = {
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true },
- "xml-formatter": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/core": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/design": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/docs": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/docs-ui": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/engine-formula": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/engine-render": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/facade": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/sheets": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/sheets-formula": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/sheets-ui": { requiredVersion: deps['vue-router'], singleton: true },
- "@univerjs/ui": { requiredVersion: deps['vue-router'], singleton: true }
+ "xml-formatter": { requiredVersion: deps['xml-formatter'], singleton: true },
+ "@univerjs/core": { requiredVersion: deps['@univerjs/core'], singleton: true },
+ "@univerjs/design": { requiredVersion: deps['@univerjs/design'], singleton: true },
+ "@univerjs/docs": { requiredVersion: deps['@univerjs/docs'], singleton: true },
+ "@univerjs/docs-ui": { requiredVersion: deps['@univerjs/docs-ui'], singleton: true },
+ "@univerjs/engine-formula": { requiredVersion: deps['@univerjs/engine-formula'], singleton: true },
+ "@univerjs/engine-render": { requiredVersion: deps['@univerjs/engine-render'], singleton: true },
+ "@univerjs/facade": { requiredVersion: deps['@univerjs/facade'], singleton: true },
+ "@univerjs/sheets": { requiredVersion: deps['@univerjs/sheets'], singleton: true },
+ "@univerjs/sheets-formula": { requiredVersion: deps['@univerjs/sheets-formula'], singleton: true },
+ "@univerjs/sheets-ui": { requiredVersion: deps['@univerjs/sheets-ui'], singleton: true },
+ "@univerjs/thread-comment": { requiredVersion: deps['@univerjs/thread-comment'], singleton: true },
+ "@univerjs/ui": { requiredVersion: deps['@univerjs/ui'], singleton: true }
}
}),
]
diff --git a/io.sc.platform.core.frontend/webpack.env.lib.cjs b/io.sc.platform.core.frontend/webpack.env.lib.cjs
index 0613fe21..cdd02b83 100644
--- a/io.sc.platform.core.frontend/webpack.env.lib.cjs
+++ b/io.sc.platform.core.frontend/webpack.env.lib.cjs
@@ -71,6 +71,7 @@ const config =merge(common, {
'@univerjs/sheets': '@univerjs/sheets',
'@univerjs/sheets-formula': '@univerjs/sheets-formula',
'@univerjs/sheets-ui': '@univerjs/sheets-ui',
+ "@univerjs/thread-comment":"@univerjs/thread-comment",
'@univerjs/ui': '@univerjs/ui'
}
],