Browse Source

1. 修复图形化编辑器内容面板更新的问题

2. 增加了规则引擎日期和集合相关函数
main
wangshaoping 2 months ago
parent
commit
356e363eb6
  1. 10
      erm.frontend/package.json
  2. 2
      gradle.properties
  3. 10
      io.sc.engine.mv.frontend/package.json
  4. 21
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/CollectionFunction.java
  5. 50
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/DateFunction.java
  6. 22
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl
  7. 10
      io.sc.engine.rule.frontend/package.json
  8. 3
      io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue
  9. 5
      io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue
  10. 10
      io.sc.engine.st.frontend/package.json
  11. 10
      io.sc.platform.core.frontend/package.json
  12. 7
      io.sc.platform.core.frontend/src/platform/components/code-mirror/WCodeMirror.vue
  13. 45
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Collection.vue
  14. 4
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Date.vue
  15. 44
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMax.vue
  16. 44
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMin.vue
  17. 44
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionSize.vue
  18. 6
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/hasElements.vue
  19. 2
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/Now.vue
  20. 10
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/DaysBetween.vue
  21. 10
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/HoursBetween.vue
  22. 10
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MinutesBetween.vue
  23. 10
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MonthsBetween.vue
  24. 10
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/SecondsBetween.vue
  25. 10
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/WeeksBetween.vue
  26. 10
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/YearsBetween.vue
  27. 173
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/Format.vue
  28. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/formatDate.vue
  29. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy.vue
  30. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMM.vue
  31. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMMdd.vue
  32. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM.vue
  33. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd.vue
  34. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH.vue
  35. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm.vue
  36. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss.vue
  37. 46
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss_SSS.vue
  38. 122
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/Plus.vue
  39. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusDays.vue
  40. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusHours.vue
  41. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMinutes.vue
  42. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMonths.vue
  43. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusSeconds.vue
  44. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusWeeks.vue
  45. 52
      io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusYears.vue
  46. 22
      io.sc.platform.core.frontend/src/platform/i18n/messages.json
  47. 22
      io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json
  48. 23
      io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json
  49. 163
      io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager.ts
  50. 190
      io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager2.ts
  51. 9
      io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue
  52. 1
      io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue
  53. 12
      io.sc.platform.core.frontend/template-project/package.json
  54. 163
      io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager.ts
  55. 190
      io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager2.ts
  56. 9
      io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue
  57. 1
      io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue
  58. 2
      io.sc.platform.developer.doc/package.json
  59. 10
      io.sc.platform.developer.frontend/package.json
  60. 10
      io.sc.platform.lcdp.frontend/package.json
  61. 10
      io.sc.platform.license.keygen.frontend/package.json
  62. 10
      io.sc.platform.mvc.frontend/package.json
  63. 10
      io.sc.platform.scheduler.manager.frontend/package.json
  64. 10
      io.sc.platform.system.frontend/package.json
  65. 339
      io.sc.platform.util/src/main/java/io/sc/platform/util/ArrayUtil.java
  66. 218
      io.sc.platform.util/src/main/java/io/sc/platform/util/CollectionUtil.java
  67. 166
      io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java
  68. 10
      io.sc.standard.frontend/package.json
  69. 2
      io.sc.website/package.json

10
erm.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.2.5 platform_version=8.2.5
platform_plugin_version=8.2.5 platform_plugin_version=8.2.5
platform_core_frontend_version=8.2.22 platform_core_frontend_version=8.2.24
########################################################### ###########################################################
# dependencies version # dependencies version

10
io.sc.engine.mv.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

21
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/CollectionFunction.java

@ -0,0 +1,21 @@
package io.sc.engine.rule.core.function;
import io.sc.platform.util.CollectionUtil;
public class CollectionFunction {
public static boolean hasElements(Object object){
return CollectionUtil.hasElements(object);
}
public static int collectionSize(Object object){
return CollectionUtil.size(object);
}
public static Object collectionMax(Object object){
return CollectionUtil.max(object);
}
public static Object collectionMin(Object object){
return CollectionUtil.min(object);
}
}

50
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/function/DateFunction.java

@ -19,20 +19,48 @@ public class DateFunction {
} }
/** /**
* 格式化日期 * 日期格式化函数
* @param date 日期 * @param date 日期对象
* @return 格式化后的日期字符串 * @param format 格式化字符串
* @return 格式化字符串
*/ */
public static String yyyyMMdd(Date date) { public static String formatDate(Date date,String format){
return DateUtil.formatDate(date, DateUtil.yyyyMMdd); return DateUtil.formatDate(date,format);
}
public static String yyyy_MM_dd_HH_mm_ss_SSS(Date date) {
return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH_mm_ss_SSS);
}
public static String yyyy_MM_dd_HH_mm_ss(Date date) {
return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH_mm_ss);
}
public static String yyyy_MM_dd_HH_mm(Date date) {
return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH_mm);
}
public static String yyyy_MM_dd_HH(Date date) {
return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd_HH);
} }
/**
* 格式化日期
* @param date 日期
* @return 格式化后的日期字符串
*/
public static String yyyy_MM_dd(Date date) { public static String yyyy_MM_dd(Date date) {
return DateUtil.formatDate(date, DateUtil.yyyy_MM_dd); return DateUtil.formatDate(date,DateUtil.yyyy_MM_dd);
}
public static String yyyyMMdd(Date date) {
return DateUtil.formatDate(date,DateUtil.yyyyMMdd);
}
public static String yyyy_MM(Date date) {
return DateUtil.formatDate(date, DateUtil.yyyy_MM);
}
public static String yyyyMM(Date date) {
return DateUtil.formatDate(date, DateUtil.yyyyMM);
}
public static String yyyy(Date date) {
return DateUtil.formatDate(date, DateUtil.yyyy);
} }
} }

22
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl

@ -35,9 +35,21 @@ import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt;
import static io.sc.engine.rule.core.function.ArithmeticFunction.root; import static io.sc.engine.rule.core.function.ArithmeticFunction.root;
import static io.sc.engine.rule.core.function.ArithmeticFunction.sum; import static io.sc.engine.rule.core.function.ArithmeticFunction.sum;
import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing; import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing;
import static io.sc.engine.rule.core.function.CollectionFunction.hasElements;
import static io.sc.engine.rule.core.function.CollectionFunction.collectionSize;
import static io.sc.engine.rule.core.function.CollectionFunction.collectionMax;
import static io.sc.engine.rule.core.function.CollectionFunction.collectionMin;
import static io.sc.engine.rule.core.function.DateFunction.now; import static io.sc.engine.rule.core.function.DateFunction.now;
import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd; import static io.sc.engine.rule.core.function.DateFunction.formatDate;
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm_ss_SSS;
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm_ss;
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH_mm;
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd_HH;
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd; import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd;
import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd;
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM;
import static io.sc.engine.rule.core.function.DateFunction.yyyyMM;
import static io.sc.engine.rule.core.function.DateFunction.yyyy;
import static io.sc.engine.rule.core.function.NormalDistributionFunction.G; import static io.sc.engine.rule.core.function.NormalDistributionFunction.G;
import static io.sc.engine.rule.core.function.NormalDistributionFunction.iG; import static io.sc.engine.rule.core.function.NormalDistributionFunction.iG;
import static io.sc.engine.rule.core.function.SpecialValueFunction.infinite; import static io.sc.engine.rule.core.function.SpecialValueFunction.infinite;
@ -56,7 +68,6 @@ import static io.sc.engine.rule.core.function.StringFunction.lowerCase;
import static io.sc.engine.rule.core.function.StringFunction.startsWith; import static io.sc.engine.rule.core.function.StringFunction.startsWith;
import static io.sc.engine.rule.core.function.StringFunction.trim; import static io.sc.engine.rule.core.function.StringFunction.trim;
import static io.sc.engine.rule.core.function.StringFunction.upperCase; import static io.sc.engine.rule.core.function.StringFunction.upperCase;
import static io.sc.platform.util.CollectionUtil.hasElements;
import static io.sc.platform.util.DateUtil.yearsBetween; import static io.sc.platform.util.DateUtil.yearsBetween;
import static io.sc.platform.util.DateUtil.monthsBetween; import static io.sc.platform.util.DateUtil.monthsBetween;
import static io.sc.platform.util.DateUtil.weeksBetween; import static io.sc.platform.util.DateUtil.weeksBetween;
@ -64,6 +75,13 @@ import static io.sc.platform.util.DateUtil.daysBetween;
import static io.sc.platform.util.DateUtil.hoursBetween; import static io.sc.platform.util.DateUtil.hoursBetween;
import static io.sc.platform.util.DateUtil.minutesBetween; import static io.sc.platform.util.DateUtil.minutesBetween;
import static io.sc.platform.util.DateUtil.secondsBetween; import static io.sc.platform.util.DateUtil.secondsBetween;
import static io.sc.platform.util.DateUtil.plusYears;
import static io.sc.platform.util.DateUtil.plusMonths;
import static io.sc.platform.util.DateUtil.plusWeeks;
import static io.sc.platform.util.DateUtil.plusDays;
import static io.sc.platform.util.DateUtil.plusHours;
import static io.sc.platform.util.DateUtil.plusMinutes;
import static io.sc.platform.util.DateUtil.plusSeconds;
import static io.sc.platform.util.NumberUtil.comma; import static io.sc.platform.util.NumberUtil.comma;
import static io.sc.platform.util.NumberUtil.decimal; import static io.sc.platform.util.NumberUtil.decimal;
import static io.sc.platform.util.NumberUtil.money; import static io.sc.platform.util.NumberUtil.money;

10
io.sc.engine.rule.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

3
io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue

@ -68,6 +68,7 @@ const edgeDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },
@ -152,6 +153,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: false, lineBreak: false,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },
@ -203,6 +205,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },

5
io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue

@ -69,6 +69,7 @@ const edgeDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },
@ -153,6 +154,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: false, lineBreak: false,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },
@ -199,6 +201,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },
@ -433,6 +436,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },
@ -445,6 +449,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletionManager.autoCompletion(), autoCompletion: autoCompletionManager.autoCompletion(),
userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(), userDefinedFunctions: userDefinedFunctionsManager.userDefinedFunctions(),
}, },

10
io.sc.engine.st.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

10
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.22", "version": "8.2.24",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件", "//main": "库的主文件",
"main": "dist/platform-core.js", "main": "dist/platform-core.js",
@ -101,7 +101,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -109,10 +109,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",

7
io.sc.platform.core.frontend/src/platform/components/code-mirror/WCodeMirror.vue

@ -86,6 +86,8 @@ interface FieldProps extends FormFieldProps {
toolbar?: boolean; toolbar?: boolean;
// //
editable?: boolean; editable?: boolean;
//
forceUpdate?: boolean;
// //
lineWrap?: boolean; lineWrap?: boolean;
// tab size // tab size
@ -113,6 +115,7 @@ const props = withDefaults(defineProps<FieldProps>(), {
rows: 4, rows: 4,
toolbar: true, toolbar: true,
editable: true, editable: true,
forceUpdate: false,
lineWrap: false, lineWrap: false,
tabSize: 2, tabSize: 2,
lineNumber: false, lineNumber: false,
@ -277,8 +280,8 @@ onMounted(() => {
() => modelValue.value, () => modelValue.value,
() => { () => {
// , , 便 // , , 便
// , , // , , modelValue,
if (!editorView.hasFocus) { if (props.forceUpdate || !editorView.hasFocus) {
let content = modelValue.value; let content = modelValue.value;
if (!props.lineBreak && !Tools.isEmpty(content)) { if (!props.lineBreak && !Tools.isEmpty(content)) {
content = content.replace(/[\r\n]/g, ''); content = content.replace(/[\r\n]/g, '');

45
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Collection.vue

@ -20,6 +20,45 @@
<HasElements ref="hasElementsRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></HasElements> <HasElements ref="hasElementsRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></HasElements>
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.collection.collectionSize')"
draggable="true"
@dragstart="collectionSizeRef?.dragstart"
@click="collectionSizeRef?.append"
>
<q-item-section>
<CollectionSize ref="collectionSizeRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></CollectionSize>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.collection.collectionMax')"
draggable="true"
@dragstart="collectionMaxRef?.dragstart"
@click="collectionMaxRef?.append"
>
<q-item-section>
<CollectionMax ref="collectionMaxRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></CollectionMax>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.collection.collectionMin')"
draggable="true"
@dragstart="collectionMinRef?.dragstart"
@click="collectionMinRef?.append"
>
<q-item-section>
<CollectionMin ref="collectionMinRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></CollectionMin>
</q-item-section>
</q-item>
</q-list> </q-list>
</q-menu> </q-menu>
</q-item> </q-item>
@ -27,6 +66,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
import HasElements from './collection/HasElements.vue'; import HasElements from './collection/HasElements.vue';
import CollectionSize from './collection/CollectionSize.vue';
import CollectionMax from './collection/CollectionMax.vue';
import CollectionMin from './collection/CollectionMin.vue';
const modelValueRef = defineModel({ type: String, default: '' }); const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({ const props = defineProps({
@ -34,4 +76,7 @@ const props = defineProps({
}); });
const hasElementsRef = ref(); const hasElementsRef = ref();
const collectionSizeRef = ref();
const collectionMaxRef = ref();
const collectionMinRef = ref();
</script> </script>

4
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/Date.vue

@ -12,6 +12,8 @@
<q-item-section><Now ref="nowRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></Now></q-item-section> <q-item-section><Now ref="nowRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></Now></q-item-section>
</q-item> </q-item>
<Between v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></Between> <Between v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></Between>
<Format v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></Format>
<Plus v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></Plus>
</q-list> </q-list>
</q-menu> </q-menu>
</q-item> </q-item>
@ -20,6 +22,8 @@
import { ref } from 'vue'; import { ref } from 'vue';
import Now from './date/Now.vue'; import Now from './date/Now.vue';
import Between from './date/between/Between.vue'; import Between from './date/between/Between.vue';
import Format from './date/format/Format.vue';
import Plus from './date/plus/Plus.vue';
const modelValueRef = defineModel({ type: String, default: '' }); const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({ const props = defineProps({

44
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMax.vue

@ -0,0 +1,44 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>collectionMax</mo>
<mi>(</mi>
<mi>c</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>collectionMax</mo>
<mi>(</mi>
<mi>c</mi>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('collectionMax(c)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

44
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionMin.vue

@ -0,0 +1,44 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>collectionMin</mo>
<mi>(</mi>
<mi>c</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>collectionMin</mo>
<mi>(</mi>
<mi>c</mi>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('collectionMin(c)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

44
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/CollectionSize.vue

@ -0,0 +1,44 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>collectionSize</mo>
<mi>(</mi>
<mi>c</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>collectionSize</mo>
<mi>(</mi>
<mi>c</mi>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('collectionSize(c)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

6
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/collection/hasElements.vue

@ -4,7 +4,7 @@
<mrow> <mrow>
<mo>hasElements</mo> <mo>hasElements</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>c</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -16,7 +16,7 @@ const xmlData = `
<mrow> <mrow>
<mo>hasElements</mo> <mo>hasElements</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>c</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
<mspace></mspace> <mspace></mspace>
@ -33,7 +33,7 @@ const dragstart = (event) => {
}; };
const append = () => { const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('hasElements(x)')); props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('hasElements(c)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', ''); modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
}; };

2
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/Now.vue

@ -25,7 +25,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

10
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/DaysBetween.vue

@ -4,9 +4,9 @@
<mrow> <mrow>
<mo>daysBetween</mo> <mo>daysBetween</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>d1</mi>
<mo>,</mo> <mo>,</mo>
<mi>y</mi> <mi>d2</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -19,11 +19,11 @@ const xmlData = `
<mo>daysBetween</mo> <mo>daysBetween</mo>
<mi>(</mi> <mi>(</mi>
<mspace></mspace> <mspace></mspace>
<mi>x</mi> <mi>d1</mi>
<mspace></mspace> <mspace></mspace>
<mo>,</mo> <mo>,</mo>
<mspace></mspace> <mspace></mspace>
<mi>y</mi> <mi>d2</mi>
<mspace></mspace> <mspace></mspace>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
@ -35,7 +35,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

10
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/HoursBetween.vue

@ -4,9 +4,9 @@
<mrow> <mrow>
<mo>hoursBetween</mo> <mo>hoursBetween</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>d1</mi>
<mo>,</mo> <mo>,</mo>
<mi>y</mi> <mi>d2</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -19,11 +19,11 @@ const xmlData = `
<mo>hoursBetween</mo> <mo>hoursBetween</mo>
<mi>(</mi> <mi>(</mi>
<mspace></mspace> <mspace></mspace>
<mi>x</mi> <mi>d1</mi>
<mspace></mspace> <mspace></mspace>
<mo>,</mo> <mo>,</mo>
<mspace></mspace> <mspace></mspace>
<mi>y</mi> <mi>d2</mi>
<mspace></mspace> <mspace></mspace>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
@ -35,7 +35,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

10
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MinutesBetween.vue

@ -4,9 +4,9 @@
<mrow> <mrow>
<mo>minutesBetween</mo> <mo>minutesBetween</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>d1</mi>
<mo>,</mo> <mo>,</mo>
<mi>y</mi> <mi>d2</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -19,11 +19,11 @@ const xmlData = `
<mo>minutesBetween</mo> <mo>minutesBetween</mo>
<mi>(</mi> <mi>(</mi>
<mspace></mspace> <mspace></mspace>
<mi>x</mi> <mi>d1</mi>
<mspace></mspace> <mspace></mspace>
<mo>,</mo> <mo>,</mo>
<mspace></mspace> <mspace></mspace>
<mi>y</mi> <mi>d2</mi>
<mspace></mspace> <mspace></mspace>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
@ -35,7 +35,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

10
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/MonthsBetween.vue

@ -4,9 +4,9 @@
<mrow> <mrow>
<mo>monthsBetween</mo> <mo>monthsBetween</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>d1</mi>
<mo>,</mo> <mo>,</mo>
<mi>y</mi> <mi>d2</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -19,11 +19,11 @@ const xmlData = `
<mo>monthsBetween</mo> <mo>monthsBetween</mo>
<mi>(</mi> <mi>(</mi>
<mspace></mspace> <mspace></mspace>
<mi>x</mi> <mi>d1</mi>
<mspace></mspace> <mspace></mspace>
<mo>,</mo> <mo>,</mo>
<mspace></mspace> <mspace></mspace>
<mi>y</mi> <mi>d2</mi>
<mspace></mspace> <mspace></mspace>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
@ -35,7 +35,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

10
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/SecondsBetween.vue

@ -4,9 +4,9 @@
<mrow> <mrow>
<mo>secondsBetween</mo> <mo>secondsBetween</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>d1</mi>
<mo>,</mo> <mo>,</mo>
<mi>y</mi> <mi>d2</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -19,11 +19,11 @@ const xmlData = `
<mo>secondsBetween</mo> <mo>secondsBetween</mo>
<mi>(</mi> <mi>(</mi>
<mspace></mspace> <mspace></mspace>
<mi>x</mi> <mi>d1</mi>
<mspace></mspace> <mspace></mspace>
<mo>,</mo> <mo>,</mo>
<mspace></mspace> <mspace></mspace>
<mi>y</mi> <mi>d2</mi>
<mspace></mspace> <mspace></mspace>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
@ -35,7 +35,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

10
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/WeeksBetween.vue

@ -4,9 +4,9 @@
<mrow> <mrow>
<mo>weeksBetween</mo> <mo>weeksBetween</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>d1</mi>
<mo>,</mo> <mo>,</mo>
<mi>y</mi> <mi>d2</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -19,11 +19,11 @@ const xmlData = `
<mo>weeksBetween</mo> <mo>weeksBetween</mo>
<mi>(</mi> <mi>(</mi>
<mspace></mspace> <mspace></mspace>
<mi>x</mi> <mi>d1</mi>
<mspace></mspace> <mspace></mspace>
<mo>,</mo> <mo>,</mo>
<mspace></mspace> <mspace></mspace>
<mi>y</mi> <mi>d2</mi>
<mspace></mspace> <mspace></mspace>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
@ -35,7 +35,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

10
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/between/YearsBetween.vue

@ -4,9 +4,9 @@
<mrow> <mrow>
<mo>yearBetween</mo> <mo>yearBetween</mo>
<mi>(</mi> <mi>(</mi>
<mi>x</mi> <mi>d1</mi>
<mo>,</mo> <mo>,</mo>
<mi>y</mi> <mi>d2</mi>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
</math> </math>
@ -19,11 +19,11 @@ const xmlData = `
<mo>yearBetween</mo> <mo>yearBetween</mo>
<mi>(</mi> <mi>(</mi>
<mspace></mspace> <mspace></mspace>
<mi>x</mi> <mi>d1</mi>
<mspace></mspace> <mspace></mspace>
<mo>,</mo> <mo>,</mo>
<mspace></mspace> <mspace></mspace>
<mi>y</mi> <mi>d2</mi>
<mspace></mspace> <mspace></mspace>
<mi>)</mi> <mi>)</mi>
</mrow> </mrow>
@ -35,7 +35,7 @@ const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined }, sourceCodeEditor: { type: Object, default: undefined },
}); });
const dragstart = (event) => { const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData); event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0); event.dataTransfer.setDragImage(event.srcElement, 0, 0);
}; };

173
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/Format.vue

@ -0,0 +1,173 @@
<template>
<q-item clickable>
<q-item-section>
<q-item-label>{{ $t('math.toolbar.functions.date.format') }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-icon name="keyboard_arrow_right" />
</q-item-section>
<q-menu anchor="top end" self="top start">
<q-list dense>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.formatDate')"
draggable="true"
@dragstart="formatDate_Ref?.dragstart"
@click="formatDate_Ref?.append"
>
<q-item-section>
<formatDate ref="formatDate_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></formatDate>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss_SSS')"
draggable="true"
@dragstart="yyyy_MM_dd_HH_mm_ss_SSS_Ref?.dragstart"
@click="yyyy_MM_dd_HH_mm_ss_SSS_Ref?.append"
>
<q-item-section>
<yyyy_MM_dd_HH_mm_ss_SSS ref="yyyy_MM_dd_HH_mm_ss_SSS_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyy_MM_dd_HH_mm_ss_SSS>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss')"
draggable="true"
@dragstart="yyyy_MM_dd_HH_mm_ss_Ref?.dragstart"
@click="yyyy_MM_dd_HH_mm_ss_Ref?.append"
>
<q-item-section>
<yyyy_MM_dd_HH_mm_ss ref="yyyy_MM_dd_HH_mm_ss_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyy_MM_dd_HH_mm_ss>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm')"
draggable="true"
@dragstart="yyyy_MM_dd_HH_mm_Ref?.dragstart"
@click="yyyy_MM_dd_HH_mm_Ref?.append"
>
<q-item-section>
<yyyy_MM_dd_HH_mm ref="yyyy_MM_dd_HH_mm_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyy_MM_dd_HH_mm>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyy_MM_dd_HH')"
draggable="true"
@dragstart="yyyy_MM_dd_HH_Ref?.dragstart"
@click="yyyy_MM_dd_HH_Ref?.append"
>
<q-item-section>
<yyyy_MM_dd_HH ref="yyyy_MM_dd_HH_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyy_MM_dd_HH>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyy_MM_dd')"
draggable="true"
@dragstart="yyyy_MM_dd_Ref?.dragstart"
@click="yyyy_MM_dd_Ref?.append"
>
<q-item-section>
<yyyy_MM_dd ref="yyyy_MM_dd_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyy_MM_dd>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyyMMdd')"
draggable="true"
@dragstart="yyyyMMdd_Ref?.dragstart"
@click="yyyyMMdd_Ref?.append"
>
<q-item-section>
<yyyyMMdd ref="yyyyMMdd_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyyMMdd>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyy_MM')"
draggable="true"
@dragstart="yyyy_MM_Ref?.dragstart"
@click="yyyy_MM_Ref?.append"
>
<q-item-section>
<yyyy_MM ref="yyyy_MM_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyy_MM>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyyMM')"
draggable="true"
@dragstart="yyyyMM_Ref?.dragstart"
@click="yyyyMM_Ref?.append"
>
<q-item-section>
<yyyyMM ref="yyyyMM_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyyMM>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.format.yyyy')"
draggable="true"
@dragstart="yyyy_Ref?.dragstart"
@click="yyyy_Ref?.append"
>
<q-item-section>
<yyyy ref="yyyy_Ref" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></yyyy>
</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-item>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import formatDate from './formatDate.vue';
import yyyy_MM_dd_HH_mm_ss_SSS from './yyyy_MM_dd_HH_mm_ss_SSS.vue';
import yyyy_MM_dd_HH_mm_ss from './yyyy_MM_dd_HH_mm_ss.vue';
import yyyy_MM_dd_HH_mm from './yyyy_MM_dd_HH_mm.vue';
import yyyy_MM_dd_HH from './yyyy_MM_dd_HH.vue';
import yyyy_MM_dd from './yyyy_MM_dd.vue';
import yyyyMMdd from './yyyyMMdd.vue';
import yyyy_MM from './yyyy_MM.vue';
import yyyyMM from './yyyyMM.vue';
import yyyy from './yyyy.vue';
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const formatDate_Ref = ref();
const yyyy_MM_dd_HH_mm_ss_SSS_Ref = ref();
const yyyy_MM_dd_HH_mm_ss_Ref = ref();
const yyyy_MM_dd_HH_mm_Ref = ref();
const yyyy_MM_dd_HH_Ref = ref();
const yyyy_MM_dd_Ref = ref();
const yyyyMMdd_Ref = ref();
const yyyy_MM_Ref = ref();
const yyyyMM_Ref = ref();
const yyyy_Ref = ref();
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/formatDate.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>formatDate</mo>
<mi>(</mi>
<mi>d</mi>
<mo>,</mo>
<mi>f</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>formatDate</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>f</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('formatDate(d,f)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyy</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyy</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyy(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMM.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyyMM</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyyMM</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyyMM(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyyMMdd.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyyMMdd</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyyMMdd</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyyMMdd(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyy_MM</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyy_MM</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyy_MM(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyy_MM_dd</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyy_MM_dd</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyy_MM_dd(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyy_MM_dd_HH</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyy_MM_dd_HH</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyy_MM_dd_HH(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyy_MM_dd_HH_mm</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyy_MM_dd_HH_mm</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyy_MM_dd_HH_mm(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyy_MM_dd_HH_mm_ss</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyy_MM_dd_HH_mm_ss</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyy_MM_dd_HH_mm_ss(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

46
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/format/yyyy_MM_dd_HH_mm_ss_SSS.vue

@ -0,0 +1,46 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>yyyy_MM_dd_HH_mm_ss_SSS</mo>
<mi>(</mi>
<mi>d</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>yyyy_MM_dd_HH_mm_ss_SSS</mo>
<mi>(</mi>
<mspace></mspace>
<mi>d</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('yyyy_MM_dd_HH_mm_ss_SSS(d)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

122
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/Plus.vue

@ -0,0 +1,122 @@
<template>
<q-item clickable>
<q-item-section>
<q-item-label>{{ $t('math.toolbar.functions.date.plus') }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-icon name="keyboard_arrow_right" />
</q-item-section>
<q-menu anchor="top end" self="top start">
<q-list dense>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.plus.plusYears')"
draggable="true"
@dragstart="plusYearsRef?.dragstart"
@click="plusYearsRef?.append"
>
<q-item-section>
<PlusYears ref="plusYearsRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></PlusYears>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.plus.plusMonths')"
draggable="true"
@dragstart="plusMonthsRef?.dragstart"
@click="plusMonthsRef?.append"
>
<q-item-section>
<PlusMonths ref="plusMonthsRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></PlusMonths>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.plus.plusWeeks')"
draggable="true"
@dragstart="plusWeeksRef?.dragstart"
@click="plusWeeksRef?.append"
>
<q-item-section>
<PlusWeeks ref="plusWeeksRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></PlusWeeks>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.plus.plusDays')"
draggable="true"
@dragstart="plusDaysRef?.dragstart"
@click="plusDaysRef?.append"
>
<q-item-section>
<PlusDays ref="plusDaysRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></PlusDays>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.plus.plusHours')"
draggable="true"
@dragstart="plusHoursRef?.dragstart"
@click="plusHoursRef?.append"
>
<q-item-section>
<PlusHours ref="plusHoursRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></PlusHours>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.plus.plusMinutes')"
draggable="true"
@dragstart="plusMinutesRef?.dragstart"
@click="plusMinutesRef?.append"
>
<q-item-section>
<PlusMinutes ref="plusMinutesRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></PlusMinutes>
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
:title="$t('math.toolbar.functions.date.plus.plusSeconds')"
draggable="true"
@dragstart="plusSecondsRef?.dragstart"
@click="plusSecondsRef?.append"
>
<q-item-section>
<PlusSeconds ref="plusSecondsRef" v-model="modelValueRef" :source-code-editor="sourceCodeEditor"></PlusSeconds>
</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-item>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PlusYears from './PlusYears.vue';
import PlusMonths from './PlusMonths.vue';
import PlusWeeks from './PlusWeeks.vue';
import PlusDays from './PlusDays.vue';
import PlusHours from './PlusHours.vue';
import PlusMinutes from './PlusMinutes.vue';
import PlusSeconds from './PlusSeconds.vue';
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const plusYearsRef = ref();
const plusMonthsRef = ref();
const plusWeeksRef = ref();
const plusDaysRef = ref();
const plusHoursRef = ref();
const plusMinutesRef = ref();
const plusSecondsRef = ref();
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusDays.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>plusDays</mo>
<mi>(</mi>
<mi>date</mi>
<mo>,</mo>
<mi>days</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>plusDays</mo>
<mi>(</mi>
<mspace></mspace>
<mi>date</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>days</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('plusDays(date,days)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusHours.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>plusHours</mo>
<mi>(</mi>
<mi>date</mi>
<mo>,</mo>
<mi>hours</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>plusHours</mo>
<mi>(</mi>
<mspace></mspace>
<mi>date</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>hours</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('plusHours(date,hours)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMinutes.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>plusMinutes</mo>
<mi>(</mi>
<mi>date</mi>
<mo>,</mo>
<mi>minutes</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>plusMinutes</mo>
<mi>(</mi>
<mspace></mspace>
<mi>date</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>minutes</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('plusMinutes(date,minutes)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusMonths.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>plusMonths</mo>
<mi>(</mi>
<mi>date</mi>
<mo>,</mo>
<mi>months</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>plusMonths</mo>
<mi>(</mi>
<mspace></mspace>
<mi>date</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>months</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('plusMonths(date,months)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusSeconds.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>plusSeconds</mo>
<mi>(</mi>
<mi>date</mi>
<mo>,</mo>
<mi>seconds</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>plusSeconds</mo>
<mi>(</mi>
<mspace></mspace>
<mi>date</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>seconds</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('plusSeconds(date,seconds)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusWeeks.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>plusWeeks</mo>
<mi>(</mi>
<mi>date</mi>
<mo>,</mo>
<mi>weeks</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>plusWeeks</mo>
<mi>(</mi>
<mspace></mspace>
<mi>date</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>weeks</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('plusWeeks(date,weeks)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

52
io.sc.platform.core.frontend/src/platform/components/math/toolbar/functions/date/plus/PlusYears.vue

@ -0,0 +1,52 @@
<template>
<span>
<math display="inline">
<mrow>
<mo>plusYears</mo>
<mi>(</mi>
<mi>date</mi>
<mo>,</mo>
<mi>years</mi>
<mi>)</mi>
</mrow>
</math>
</span>
</template>
<script setup lang="ts">
const xmlData = `
<mspace></mspace>
<mrow>
<mo>plusYears</mo>
<mi>(</mi>
<mspace></mspace>
<mi>date</mi>
<mspace></mspace>
<mo>,</mo>
<mspace></mspace>
<mi>years</mi>
<mspace></mspace>
<mi>)</mi>
</mrow>
<mspace></mspace>
`;
const modelValueRef = defineModel({ type: String, default: '' });
const props = defineProps({
sourceCodeEditor: { type: Object, default: undefined },
});
const dragstart = (event: any) => {
event.dataTransfer.setData('math', xmlData);
event.dataTransfer.setDragImage(event.srcElement, 0, 0);
};
const append = () => {
props.sourceCodeEditor?.dispatch(props.sourceCodeEditor?.state?.replaceSelection('plusYears(date,years)'));
modelValueRef.value = modelValueRef.value + xmlData.replace('<mspace></mspace>', '');
};
defineExpose({
dragstart,
append,
});
</script>

22
io.sc.platform.core.frontend/src/platform/i18n/messages.json

@ -231,6 +231,25 @@
"math.toolbar.functions.date.between.hours": "Hours", "math.toolbar.functions.date.between.hours": "Hours",
"math.toolbar.functions.date.between.minutes": "Minutes", "math.toolbar.functions.date.between.minutes": "Minutes",
"math.toolbar.functions.date.between.seconds": "Seconds", "math.toolbar.functions.date.between.seconds": "Seconds",
"math.toolbar.functions.date.format": "Format",
"math.toolbar.functions.date.format.formatDate": "formatDate",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss_SSS": "2025-10-10 00:00:00.000",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss": "2025-10-10 00:00:00",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm": "2025-10-10 00:00",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH": "2025-10-10 00",
"math.toolbar.functions.date.format.yyyy_MM_dd": "2025-10-10",
"math.toolbar.functions.date.format.yyyyMMdd": "20251010",
"math.toolbar.functions.date.format.yyyy_MM": "2025-10",
"math.toolbar.functions.date.format.yyyyMM": "202510",
"math.toolbar.functions.date.format.yyyy": "2025",
"math.toolbar.functions.date.plus": "Date Calculate",
"math.toolbar.functions.date.plus.plusYears": "Add years",
"math.toolbar.functions.date.plus.plusMonths": "Add months",
"math.toolbar.functions.date.plus.plusWeeks": "Add weeks",
"math.toolbar.functions.date.plus.plusDays": "Add days",
"math.toolbar.functions.date.plus.plusHours": "Add hours",
"math.toolbar.functions.date.plus.plusMinutes": "Add minutes",
"math.toolbar.functions.date.plus.plusSeconds": "Add seconds",
"math.toolbar.functions.date.log": "Logarithm", "math.toolbar.functions.date.log": "Logarithm",
"math.toolbar.functions.date.log.lg": "base 10 logarithm of x", "math.toolbar.functions.date.log.lg": "base 10 logarithm of x",
"math.toolbar.functions.date.log.ln": "base e logarithm of x", "math.toolbar.functions.date.log.ln": "base e logarithm of x",
@ -275,6 +294,9 @@
"math.toolbar.functions.formater.percent": "Percentage, leave the y digits after the x decimal point", "math.toolbar.functions.formater.percent": "Percentage, leave the y digits after the x decimal point",
"math.toolbar.functions.collection": "Collection", "math.toolbar.functions.collection": "Collection",
"math.toolbar.functions.collection.hasElements": "Has Elements", "math.toolbar.functions.collection.hasElements": "Has Elements",
"math.toolbar.functions.collection.collectionSize": "Elements Count",
"math.toolbar.functions.collection.collectionMax": "Maximum Element",
"math.toolbar.functions.collection.collectionMin": "Minimum Element",
"math.toolbar.userDefinedFunction": "User Defined Function", "math.toolbar.userDefinedFunction": "User Defined Function",

22
io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json

@ -231,6 +231,25 @@
"math.toolbar.functions.date.between.hours": "間隔小時數", "math.toolbar.functions.date.between.hours": "間隔小時數",
"math.toolbar.functions.date.between.minutes": "間隔分鐘數", "math.toolbar.functions.date.between.minutes": "間隔分鐘數",
"math.toolbar.functions.date.between.seconds": "間隔秒數", "math.toolbar.functions.date.between.seconds": "間隔秒數",
"math.toolbar.functions.date.format": "日期格式化",
"math.toolbar.functions.date.format.formatDate": "formatDate",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss_SSS": "2025-10-10 00:00:00.000",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss": "2025-10-10 00:00:00",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm": "2025-10-10 00:00",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH": "2025-10-10 00",
"math.toolbar.functions.date.format.yyyy_MM_dd": "2025-10-10",
"math.toolbar.functions.date.format.yyyyMMdd": "20251010",
"math.toolbar.functions.date.format.yyyy_MM": "2025-10",
"math.toolbar.functions.date.format.yyyyMM": "202510",
"math.toolbar.functions.date.format.yyyy": "2025",
"math.toolbar.functions.date.plus": "日期計算",
"math.toolbar.functions.date.plus.plusYears": "添加年數",
"math.toolbar.functions.date.plus.plusMonths": "添加月數",
"math.toolbar.functions.date.plus.plusWeeks": "添加周數",
"math.toolbar.functions.date.plus.plusDays": "添加天數",
"math.toolbar.functions.date.plus.plusHours": "添加小時數",
"math.toolbar.functions.date.plus.plusMinutes": "添加分鐘數",
"math.toolbar.functions.date.plus.plusSeconds": "添加秒數",
"math.toolbar.functions.log": "對數", "math.toolbar.functions.log": "對數",
"math.toolbar.functions.log.lg": "以 10 為底的對數", "math.toolbar.functions.log.lg": "以 10 為底的對數",
"math.toolbar.functions.log.ln": "以自然對數 e 為底的對數", "math.toolbar.functions.log.ln": "以自然對數 e 為底的對數",
@ -275,6 +294,9 @@
"math.toolbar.functions.formater.percent": "百分數, 保留 x 小數點後 y 位", "math.toolbar.functions.formater.percent": "百分數, 保留 x 小數點後 y 位",
"math.toolbar.functions.collection": "集合函數", "math.toolbar.functions.collection": "集合函數",
"math.toolbar.functions.collection.hasElements": "是否有元素", "math.toolbar.functions.collection.hasElements": "是否有元素",
"math.toolbar.functions.collection.collectionSize": "元素個數",
"math.toolbar.functions.collection.collectionMax": "最大元素",
"math.toolbar.functions.collection.collectionMin": "最小元素",
"math.toolbar.userDefinedFunction": "自定義函數", "math.toolbar.userDefinedFunction": "自定義函數",

23
io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json

@ -231,6 +231,26 @@
"math.toolbar.functions.date.between.hours": "间隔小时数", "math.toolbar.functions.date.between.hours": "间隔小时数",
"math.toolbar.functions.date.between.minutes": "间隔分钟数", "math.toolbar.functions.date.between.minutes": "间隔分钟数",
"math.toolbar.functions.date.between.seconds": "间隔秒数", "math.toolbar.functions.date.between.seconds": "间隔秒数",
"math.toolbar.functions.date.format": "日期格式化",
"math.toolbar.functions.date.format.formatDate": "formatDate",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss_SSS": "2025-10-10 00:00:00.000",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm_ss": "2025-10-10 00:00:00",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH_mm": "2025-10-10 00:00",
"math.toolbar.functions.date.format.yyyy_MM_dd_HH": "2025-10-10 00",
"math.toolbar.functions.date.format.yyyy_MM_dd": "2025-10-10",
"math.toolbar.functions.date.format.yyyyMMdd": "20251010",
"math.toolbar.functions.date.format.yyyy_MM": "2025-10",
"math.toolbar.functions.date.format.yyyyMM": "202510",
"math.toolbar.functions.date.format.yyyy": "2025",
"math.toolbar.functions.date.plus": "日期计算",
"math.toolbar.functions.date.plus.plusYears": "添加年数",
"math.toolbar.functions.date.plus.plusMonths": "添加月数",
"math.toolbar.functions.date.plus.plusWeeks": "添加周数",
"math.toolbar.functions.date.plus.plusDays": "添加天数",
"math.toolbar.functions.date.plus.plusHours": "添加小时数",
"math.toolbar.functions.date.plus.plusMinutes": "添加分钟数",
"math.toolbar.functions.date.plus.plusSeconds": "添加秒数",
"math.toolbar.functions.log": "对数函数", "math.toolbar.functions.log": "对数函数",
"math.toolbar.functions.log.lg": "以 10 为底的对数", "math.toolbar.functions.log.lg": "以 10 为底的对数",
"math.toolbar.functions.log.ln": "以自然对数 e 为底的对数", "math.toolbar.functions.log.ln": "以自然对数 e 为底的对数",
@ -275,6 +295,9 @@
"math.toolbar.functions.formater.percent": "百分数, 保留 x 小数点后 y 位", "math.toolbar.functions.formater.percent": "百分数, 保留 x 小数点后 y 位",
"math.toolbar.functions.collection": "集合函数", "math.toolbar.functions.collection": "集合函数",
"math.toolbar.functions.collection.hasElements": "是否有元素", "math.toolbar.functions.collection.hasElements": "是否有元素",
"math.toolbar.functions.collection.collectionSize": "元素个数",
"math.toolbar.functions.collection.collectionMax": "最大元素",
"math.toolbar.functions.collection.collectionMin": "最小元素",
"math.toolbar.userDefinedFunction": "自定义函数", "math.toolbar.userDefinedFunction": "自定义函数",

163
io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager.ts

@ -1,20 +1,27 @@
import { Tools } from '@/platform'; import { axios, Tools } from '@/platform';
class AutoCompletionManager { class AutoCompletionManager {
parameters: object[]; parameters: any;
valueTypes: object[]; valueTypes: any;
public setParameters(parameters) { constructor() {
this.parameters = {};
this.valueTypes = {};
}
public setParameters(parameters: any) {
this.parameters = parameters; this.parameters = parameters;
} }
public setValueTypes(valueTypes) { public setValueTypes(valueTypes: any) {
this.valueTypes = valueTypes; this.valueTypes = valueTypes;
} }
public getOptions(path: string): any { public getOptions(path: string): any {
// 如果没有路径, 返回参数列表
if (!path) { if (!path) {
return this.getParameterOptions(); return this.getParameterOptions();
} }
// 以 . 结束表示对象属性
if (path.endsWith('.')) { if (path.endsWith('.')) {
path = path.substring(0, path.length - 1); path = path.substring(0, path.length - 1);
} }
@ -22,55 +29,54 @@ class AutoCompletionManager {
if (!names) { if (!names) {
return this.getParameterOptions(); return this.getParameterOptions();
} }
//参数 //查找参数
const parameter = this.findParmeter(names[0]); const parameter = this.findParmeterByName(names[0]);
if (!parameter) { if (!parameter) {
return null; return null;
} }
const valueTypeString = parameter.valueType; let valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
const valueTypeVersion = parameter.valueTypeVersion;
let valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType || !valueType.properties || valueType.properties.length <= 0) { if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
return null; return null;
} }
let index = 1; let index = 1;
while (index < names.length) { while (index < names.length) {
valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index++]); valueType = this.findValueTypeByPropertyName(valueType.code, valueType.version, names[index++]);
} }
const options: any[] = [];
const options = [];
for (const property of valueType.properties) { for (const property of valueType.properties) {
const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); const option = this.getOptionItem(property);
if (!propertyValueType) { if (option) {
continue; options.push(option);
} }
const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name;
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info });
} }
return options; return options;
} }
public findParmeter(parameterName) { public findParmeterByCode(parameterCode: string) {
for (const parameter of this.parameters) { return this.parameters[parameterCode];
if (parameter.name === parameterName) { }
return parameter;
public findParmeterByName(parameterName: string) {
const values = Object.values(this.parameters);
for (const value of values) {
if (value.name === parameterName) {
return value;
} }
} }
return null; return null;
} }
public findValueType(valueTypeString, valueTypeVersion) { public findValueType(valueType: string, valueTypeVersion: number): any {
for (const valueType of this.valueTypes) { if (Tools.isNill(valueType)) {
if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) {
return valueType;
}
}
return null; return null;
} }
const key = valueType + (Tools.isNill(valueTypeVersion) ? '' : ':' + valueTypeVersion);
return this.valueTypes[key];
}
public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) { public findValueTypeByPropertyName(valueTypeString: string, valueTypeVersion: number, propertyName: string) {
const valueType = this.findValueType(valueTypeString, valueTypeVersion); const valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType) { if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
return null; return null;
} }
for (const property of valueType.properties) { for (const property of valueType.properties) {
@ -78,71 +84,68 @@ class AutoCompletionManager {
return this.findValueType(property.valueType, property.valueTypeVersion); return this.findValueType(property.valueType, property.valueTypeVersion);
} }
} }
return null;
} }
public getParameterOptions(): any { public findValueTypeByPropertyCode(valueTypeString: string, valueTypeVersion: number, propertyCode: string) {
const options = []; const valueType = this.findValueType(valueTypeString, valueTypeVersion);
for (const parameter of this.parameters) { if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info });
}
return options;
}
public getPropertyOptions(parameterName: string): any {
let parameterType = undefined;
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
parameterType = parameter.valueType;
}
}
if (!parameterType) {
return null; return null;
} }
for (const type of this.valueTypes) { for (const property of valueType.properties) {
if (type.code === parameterType) { if (property.code === propertyCode) {
parameterType = type; return this.findValueType(property.valueType, property.valueTypeVersion);
} }
} }
if (!parameterType) {
return null; return null;
} }
if (parameterType.properties && parameterType.properties.length > 0) { public getParameterOptions(): any {
const options = []; const options: any[] = [];
for (const property of parameterType.properties) { Object.values(this.parameters).forEach((parameter: any) => {
options.push({ const option = this.getOptionItem(parameter);
label: property.name, if (option) {
type: 'property', options.push(option);
apply: '${' + property.name + '}',
detail: this.findValueTypeInfo(property.valueType),
});
} }
});
return options; return options;
} }
public getOptionItem(parameter: any) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
if (!Tools.isNill(valueType)) {
const version = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
const info = parameter.valueTypeIsList ? 'List<' + version + '>' : version;
if (parameter.valueTypeIsList) {
return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}[0]', info: info };
} else {
return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info };
}
}
return null;
} }
public autoCompletionParameters(to, matchedText): any { public autoCompletionParameters(to: any, matchedText?: any): any {
return { return {
from: to, from: to,
options: this.getParameterOptions(), options: this.getParameterOptions(),
//validFor: /(.*)?/, validFor: /(.*)?/,
validFor: (text, from, to, state) => {
console.log(text);
},
}; };
} }
public autoCompletionProperties(to, matchedText): any { public autoCompletionProperties(to: any, matchedText?: any): any {
const matchedTextReverse = Tools.reverseString(matchedText); const matchedTextReverse = Tools.reverseString(matchedText);
const regReverse = /(\.\}(.+?)\{\$)+/g; //匹配 '.}xxx{$' 模式 const regReverse = /(\.(\](.+?)\[)?\}(.+?)\{\$)+/g; //匹配 '.]n[}xxx{$' 模式
const matcheds = matchedTextReverse.match(regReverse); // -- -- --- -- -- --- ----
// . ] n [ } xxx { $
const matcheds: any = matchedTextReverse.match(regReverse);
if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) { if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) {
return null; return null;
} }
const matched = Tools.reverseString(matcheds[0]); const matched = Tools.reverseString(matcheds[0]);
const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1'); const parameterName = matched.replace(/\$\{(.+?)\}(\[(.+?)\])?/g, '$1');
// ---- --- -- -- --- --
// $ { xxx } [ n ]
if (Tools.isUndefinedOrNull(parameterName)) { if (Tools.isUndefinedOrNull(parameterName)) {
return null; return null;
} }
@ -153,14 +156,11 @@ class AutoCompletionManager {
return { return {
from: to, from: to,
options: options, options: options,
//validFor: /(.*)?/, validFor: /^(.*)?$/,
validFor: (text, from, to, state) => {
console.log(text, from, to, state);
},
}; };
} }
public autoCompletion(context): any { public doAutoCompletion(context: any): any {
const beforeMatched = context.matchBefore(/(.+?)/g); const beforeMatched = context.matchBefore(/(.+?)/g);
if (Tools.isUndefinedOrNull(beforeMatched)) { if (Tools.isUndefinedOrNull(beforeMatched)) {
return null; return null;
@ -176,6 +176,19 @@ class AutoCompletionManager {
return null; return null;
} }
} }
public load(url: string) {
axios.get(url).then((response) => {
this.setParameters(response.data?.parameters);
this.setValueTypes(response.data?.valueTypes);
});
}
public autoCompletion(): any {
return (context: any) => {
return this.doAutoCompletion(context);
};
}
} }
export { AutoCompletionManager }; export { AutoCompletionManager };

190
io.sc.platform.core.frontend/src/views/testcase/code-mirror/AutoCompletionManager2.ts

@ -1,190 +0,0 @@
import { Tools } from '@/platform';
class AutoCompletionManager2 {
parameters: object[];
valueTypes: object[];
public setParameters(parameters) {
this.parameters = parameters;
}
public setValueTypes(valueTypes) {
this.valueTypes = valueTypes;
}
public getOptions(path: string): any {
if (!path) {
return this.getParameterOptions();
}
if (path.endsWith('.')) {
path = path.substring(0, path.length - 1);
}
const names = path.split('.');
if (!names) {
return this.getParameterOptions();
}
//参数
const parameter = this.findParmeter(names[0]);
if (!parameter) {
return null;
}
const valueTypeString = parameter.valueType;
const valueTypeVersion = parameter.valueTypeVersion;
let valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
return null;
}
let index = 1;
let lastNameIsNotCompleted = false;
while (index < names.length) {
const _valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index]);
if (_valueType) {
valueType = _valueType;
} else {
lastNameIsNotCompleted = true;
}
index++;
}
const options = [];
if (lastNameIsNotCompleted) {
for (const property of valueType.properties) {
if (property.name.indexOf(names[names.length - 1]) != -1) {
const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion);
if (!propertyValueType) {
continue;
}
const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name;
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info });
}
}
return options;
} else {
for (const property of valueType.properties) {
const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion);
if (!propertyValueType) {
continue;
}
const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name;
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info });
}
return options;
}
}
public findParmeter(parameterName) {
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
return parameter;
}
}
return null;
}
public findValueType(valueTypeString, valueTypeVersion) {
for (const valueType of this.valueTypes) {
if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) {
return valueType;
}
}
return null;
}
public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) {
const valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType) {
return null;
}
for (const property of valueType.properties) {
if (property.name === propertyName) {
return this.findValueType(property.valueType, property.valueTypeVersion);
}
}
}
public getParameterOptions(): any {
const options = [];
for (const parameter of this.parameters) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info });
}
return options;
}
public getPropertyOptions(parameterName: string): any {
let parameterType = undefined;
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
parameterType = parameter.valueType;
}
}
if (!parameterType) {
return null;
}
for (const type of this.valueTypes) {
if (type.code === parameterType) {
parameterType = type;
}
}
if (!parameterType) {
return null;
}
if (parameterType.properties && parameterType.properties.length > 0) {
const options = [];
for (const property of parameterType.properties) {
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', detail: this.findValueTypeInfo(property.valueType) });
}
return options;
}
}
public autoCompletionParameters(to, matchedText): any {
return {
from: to,
options: this.getParameterOptions(),
validFor: /(.*)?/,
};
}
public autoCompletionProperties(to, matchedText): any {
const matchedTextReverse = Tools.reverseString(matchedText);
const regReverse = /((.*)?\}(.+?)\{\$)+/g; //匹配 'xxx.}xxx{$' 模式
const matcheds = matchedTextReverse.match(regReverse);
if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) {
return null;
}
const matched = Tools.reverseString(matcheds[0]);
const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1');
console.log(parameterName);
if (Tools.isUndefinedOrNull(parameterName)) {
return null;
}
const options = this.getOptions(parameterName);
if (Tools.isUndefinedOrNull(options)) {
return null;
}
return {
from: to,
options: options,
//validFor: /^(.*)?$/,
};
}
public autoCompletion(context): any {
const beforeMatched = context.matchBefore(/(.+?)/g);
if (Tools.isUndefinedOrNull(beforeMatched)) {
return null;
}
const beforeText = beforeMatched.text || '';
if (beforeText.endsWith(' ')) {
//匹配参数
return this.autoCompletionParameters(beforeMatched.to);
} else {
//匹配属性
return this.autoCompletionProperties(beforeMatched.to, beforeText);
}
}
}
export { AutoCompletionManager2 };

9
io.sc.platform.core.frontend/src/views/testcase/code-mirror/code-mirror.vue

@ -3,10 +3,13 @@
<q-btn label="ok" @click="click"></q-btn> <q-btn label="ok" @click="click"></q-btn>
<w-code-mirror <w-code-mirror
v-model="modelValue" v-model="modelValue"
lang="sql" lang="java"
:rows="20" :rows="20"
:placeholder="true" :placeholder="true"
:line-wrap="true"
:line-break="false"
:editable="true" :editable="true"
:auto-completion="autoCompletionManager.autoCompletion()"
:user-defined-functions="userDefinedFunctionsManager.userDefinedFunctions().value" :user-defined-functions="userDefinedFunctionsManager.userDefinedFunctions().value"
></w-code-mirror> ></w-code-mirror>
</div> </div>
@ -15,6 +18,7 @@
import { ref } from 'vue'; import { ref } from 'vue';
import { axios, Environment, EnumTools, Tools, Formater } from '@/platform'; import { axios, Environment, EnumTools, Tools, Formater } from '@/platform';
import { UserDefinedFunctionsManager } from './UserDefinedFunctionsManager'; import { UserDefinedFunctionsManager } from './UserDefinedFunctionsManager';
import { AutoCompletionManager } from './AutoCompletionManager';
const modelValue = ref('${个人征信报告.报告头.报告头信息单元.报告标识信息段.报告编号}'); const modelValue = ref('${个人征信报告.报告头.报告头信息单元.报告标识信息段.报告编号}');
@ -23,7 +27,10 @@ const click = () => {
modelValue.value = modelValue.value + ' ok'; modelValue.value = modelValue.value + ' ok';
}; };
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByIndicatorId/34e7391f-ba76-4e14-b152-ae0da917fd20'));
userDefinedFunctionsManager.load(); userDefinedFunctionsManager.load();
console.log(Tools.escapeHtml('<xml>&</xml>')); console.log(Tools.escapeHtml('<xml>&</xml>'));
</script> </script>

1
io.sc.platform.core.frontend/src/views/testcase/maxgraph/maxgraph.vue

@ -196,6 +196,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletion, autoCompletion: autoCompletion,
userDefinedFunctions: userDefinedFunctionsRef, userDefinedFunctions: userDefinedFunctionsRef,
}, },

12
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.2.22", "version": "8.2.24",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -110,7 +110,7 @@
"mockjs": "1.1.0", "mockjs": "1.1.0",
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

163
io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager.ts

@ -1,20 +1,27 @@
import { Tools } from '@/platform'; import { axios, Tools } from '@/platform';
class AutoCompletionManager { class AutoCompletionManager {
parameters: object[]; parameters: any;
valueTypes: object[]; valueTypes: any;
public setParameters(parameters) { constructor() {
this.parameters = {};
this.valueTypes = {};
}
public setParameters(parameters: any) {
this.parameters = parameters; this.parameters = parameters;
} }
public setValueTypes(valueTypes) { public setValueTypes(valueTypes: any) {
this.valueTypes = valueTypes; this.valueTypes = valueTypes;
} }
public getOptions(path: string): any { public getOptions(path: string): any {
// 如果没有路径, 返回参数列表
if (!path) { if (!path) {
return this.getParameterOptions(); return this.getParameterOptions();
} }
// 以 . 结束表示对象属性
if (path.endsWith('.')) { if (path.endsWith('.')) {
path = path.substring(0, path.length - 1); path = path.substring(0, path.length - 1);
} }
@ -22,55 +29,54 @@ class AutoCompletionManager {
if (!names) { if (!names) {
return this.getParameterOptions(); return this.getParameterOptions();
} }
//参数 //查找参数
const parameter = this.findParmeter(names[0]); const parameter = this.findParmeterByName(names[0]);
if (!parameter) { if (!parameter) {
return null; return null;
} }
const valueTypeString = parameter.valueType; let valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
const valueTypeVersion = parameter.valueTypeVersion;
let valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType || !valueType.properties || valueType.properties.length <= 0) { if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
return null; return null;
} }
let index = 1; let index = 1;
while (index < names.length) { while (index < names.length) {
valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index++]); valueType = this.findValueTypeByPropertyName(valueType.code, valueType.version, names[index++]);
} }
const options: any[] = [];
const options = [];
for (const property of valueType.properties) { for (const property of valueType.properties) {
const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion); const option = this.getOptionItem(property);
if (!propertyValueType) { if (option) {
continue; options.push(option);
} }
const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name;
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info });
} }
return options; return options;
} }
public findParmeter(parameterName) { public findParmeterByCode(parameterCode: string) {
for (const parameter of this.parameters) { return this.parameters[parameterCode];
if (parameter.name === parameterName) { }
return parameter;
public findParmeterByName(parameterName: string) {
const values = Object.values(this.parameters);
for (const value of values) {
if (value.name === parameterName) {
return value;
} }
} }
return null; return null;
} }
public findValueType(valueTypeString, valueTypeVersion) { public findValueType(valueType: string, valueTypeVersion: number): any {
for (const valueType of this.valueTypes) { if (Tools.isNill(valueType)) {
if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) {
return valueType;
}
}
return null; return null;
} }
const key = valueType + (Tools.isNill(valueTypeVersion) ? '' : ':' + valueTypeVersion);
return this.valueTypes[key];
}
public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) { public findValueTypeByPropertyName(valueTypeString: string, valueTypeVersion: number, propertyName: string) {
const valueType = this.findValueType(valueTypeString, valueTypeVersion); const valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType) { if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
return null; return null;
} }
for (const property of valueType.properties) { for (const property of valueType.properties) {
@ -78,71 +84,68 @@ class AutoCompletionManager {
return this.findValueType(property.valueType, property.valueTypeVersion); return this.findValueType(property.valueType, property.valueTypeVersion);
} }
} }
return null;
} }
public getParameterOptions(): any { public findValueTypeByPropertyCode(valueTypeString: string, valueTypeVersion: number, propertyCode: string) {
const options = []; const valueType = this.findValueType(valueTypeString, valueTypeVersion);
for (const parameter of this.parameters) { if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info });
}
return options;
}
public getPropertyOptions(parameterName: string): any {
let parameterType = undefined;
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
parameterType = parameter.valueType;
}
}
if (!parameterType) {
return null; return null;
} }
for (const type of this.valueTypes) { for (const property of valueType.properties) {
if (type.code === parameterType) { if (property.code === propertyCode) {
parameterType = type; return this.findValueType(property.valueType, property.valueTypeVersion);
} }
} }
if (!parameterType) {
return null; return null;
} }
if (parameterType.properties && parameterType.properties.length > 0) { public getParameterOptions(): any {
const options = []; const options: any[] = [];
for (const property of parameterType.properties) { Object.values(this.parameters).forEach((parameter: any) => {
options.push({ const option = this.getOptionItem(parameter);
label: property.name, if (option) {
type: 'property', options.push(option);
apply: '${' + property.name + '}',
detail: this.findValueTypeInfo(property.valueType),
});
} }
});
return options; return options;
} }
public getOptionItem(parameter: any) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
if (!Tools.isNill(valueType)) {
const version = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
const info = parameter.valueTypeIsList ? 'List<' + version + '>' : version;
if (parameter.valueTypeIsList) {
return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}[0]', info: info };
} else {
return { label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info };
}
}
return null;
} }
public autoCompletionParameters(to, matchedText): any { public autoCompletionParameters(to: any, matchedText?: any): any {
return { return {
from: to, from: to,
options: this.getParameterOptions(), options: this.getParameterOptions(),
//validFor: /(.*)?/, validFor: /(.*)?/,
validFor: (text, from, to, state) => {
console.log(text);
},
}; };
} }
public autoCompletionProperties(to, matchedText): any { public autoCompletionProperties(to: any, matchedText?: any): any {
const matchedTextReverse = Tools.reverseString(matchedText); const matchedTextReverse = Tools.reverseString(matchedText);
const regReverse = /(\.\}(.+?)\{\$)+/g; //匹配 '.}xxx{$' 模式 const regReverse = /(\.(\](.+?)\[)?\}(.+?)\{\$)+/g; //匹配 '.]n[}xxx{$' 模式
const matcheds = matchedTextReverse.match(regReverse); // -- -- --- -- -- --- ----
// . ] n [ } xxx { $
const matcheds: any = matchedTextReverse.match(regReverse);
if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) { if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) {
return null; return null;
} }
const matched = Tools.reverseString(matcheds[0]); const matched = Tools.reverseString(matcheds[0]);
const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1'); const parameterName = matched.replace(/\$\{(.+?)\}(\[(.+?)\])?/g, '$1');
// ---- --- -- -- --- --
// $ { xxx } [ n ]
if (Tools.isUndefinedOrNull(parameterName)) { if (Tools.isUndefinedOrNull(parameterName)) {
return null; return null;
} }
@ -153,14 +156,11 @@ class AutoCompletionManager {
return { return {
from: to, from: to,
options: options, options: options,
//validFor: /(.*)?/, validFor: /^(.*)?$/,
validFor: (text, from, to, state) => {
console.log(text, from, to, state);
},
}; };
} }
public autoCompletion(context): any { public doAutoCompletion(context: any): any {
const beforeMatched = context.matchBefore(/(.+?)/g); const beforeMatched = context.matchBefore(/(.+?)/g);
if (Tools.isUndefinedOrNull(beforeMatched)) { if (Tools.isUndefinedOrNull(beforeMatched)) {
return null; return null;
@ -176,6 +176,19 @@ class AutoCompletionManager {
return null; return null;
} }
} }
public load(url: string) {
axios.get(url).then((response) => {
this.setParameters(response.data?.parameters);
this.setValueTypes(response.data?.valueTypes);
});
}
public autoCompletion(): any {
return (context: any) => {
return this.doAutoCompletion(context);
};
}
} }
export { AutoCompletionManager }; export { AutoCompletionManager };

190
io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/AutoCompletionManager2.ts

@ -1,190 +0,0 @@
import { Tools } from '@/platform';
class AutoCompletionManager2 {
parameters: object[];
valueTypes: object[];
public setParameters(parameters) {
this.parameters = parameters;
}
public setValueTypes(valueTypes) {
this.valueTypes = valueTypes;
}
public getOptions(path: string): any {
if (!path) {
return this.getParameterOptions();
}
if (path.endsWith('.')) {
path = path.substring(0, path.length - 1);
}
const names = path.split('.');
if (!names) {
return this.getParameterOptions();
}
//参数
const parameter = this.findParmeter(names[0]);
if (!parameter) {
return null;
}
const valueTypeString = parameter.valueType;
const valueTypeVersion = parameter.valueTypeVersion;
let valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType || !valueType.properties || valueType.properties.length <= 0) {
return null;
}
let index = 1;
let lastNameIsNotCompleted = false;
while (index < names.length) {
const _valueType = this.findValueTypeByProperty(valueType.code, valueType.version, names[index]);
if (_valueType) {
valueType = _valueType;
} else {
lastNameIsNotCompleted = true;
}
index++;
}
const options = [];
if (lastNameIsNotCompleted) {
for (const property of valueType.properties) {
if (property.name.indexOf(names[names.length - 1]) != -1) {
const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion);
if (!propertyValueType) {
continue;
}
const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name;
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info });
}
}
return options;
} else {
for (const property of valueType.properties) {
const propertyValueType = this.findValueType(property.valueType, property.valueTypeVersion);
if (!propertyValueType) {
continue;
}
const info = propertyValueType.version ? propertyValueType.name + '(V' + propertyValueType.version + ')' : propertyValueType.name;
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', info: info });
}
return options;
}
}
public findParmeter(parameterName) {
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
return parameter;
}
}
return null;
}
public findValueType(valueTypeString, valueTypeVersion) {
for (const valueType of this.valueTypes) {
if (valueType.code === valueTypeString && valueType.version === valueTypeVersion) {
return valueType;
}
}
return null;
}
public findValueTypeByProperty(valueTypeString, valueTypeVersion, propertyName) {
const valueType = this.findValueType(valueTypeString, valueTypeVersion);
if (!valueType) {
return null;
}
for (const property of valueType.properties) {
if (property.name === propertyName) {
return this.findValueType(property.valueType, property.valueTypeVersion);
}
}
}
public getParameterOptions(): any {
const options = [];
for (const parameter of this.parameters) {
const valueType = this.findValueType(parameter.valueType, parameter.valueTypeVersion);
const info = valueType.version ? valueType.name + '(V' + valueType.version + ')' : valueType.name;
options.push({ label: parameter.name, type: 'variable', apply: '${' + parameter.name + '}', info: info });
}
return options;
}
public getPropertyOptions(parameterName: string): any {
let parameterType = undefined;
for (const parameter of this.parameters) {
if (parameter.name === parameterName) {
parameterType = parameter.valueType;
}
}
if (!parameterType) {
return null;
}
for (const type of this.valueTypes) {
if (type.code === parameterType) {
parameterType = type;
}
}
if (!parameterType) {
return null;
}
if (parameterType.properties && parameterType.properties.length > 0) {
const options = [];
for (const property of parameterType.properties) {
options.push({ label: property.name, type: 'property', apply: '${' + property.name + '}', detail: this.findValueTypeInfo(property.valueType) });
}
return options;
}
}
public autoCompletionParameters(to, matchedText): any {
return {
from: to,
options: this.getParameterOptions(),
validFor: /(.*)?/,
};
}
public autoCompletionProperties(to, matchedText): any {
const matchedTextReverse = Tools.reverseString(matchedText);
const regReverse = /((.*)?\}(.+?)\{\$)+/g; //匹配 'xxx.}xxx{$' 模式
const matcheds = matchedTextReverse.match(regReverse);
if (Tools.isUndefinedOrNull(matcheds) || matcheds.length <= 0) {
return null;
}
const matched = Tools.reverseString(matcheds[0]);
const parameterName = matched.replace(/\$\{(.+?)\}/g, '$1');
console.log(parameterName);
if (Tools.isUndefinedOrNull(parameterName)) {
return null;
}
const options = this.getOptions(parameterName);
if (Tools.isUndefinedOrNull(options)) {
return null;
}
return {
from: to,
options: options,
//validFor: /^(.*)?$/,
};
}
public autoCompletion(context): any {
const beforeMatched = context.matchBefore(/(.+?)/g);
if (Tools.isUndefinedOrNull(beforeMatched)) {
return null;
}
const beforeText = beforeMatched.text || '';
if (beforeText.endsWith(' ')) {
//匹配参数
return this.autoCompletionParameters(beforeMatched.to);
} else {
//匹配属性
return this.autoCompletionProperties(beforeMatched.to, beforeText);
}
}
}
export { AutoCompletionManager2 };

9
io.sc.platform.core.frontend/template-project/src/views/testcase/code-mirror/code-mirror.vue

@ -3,10 +3,13 @@
<q-btn label="ok" @click="click"></q-btn> <q-btn label="ok" @click="click"></q-btn>
<w-code-mirror <w-code-mirror
v-model="modelValue" v-model="modelValue"
lang="sql" lang="java"
:rows="20" :rows="20"
:placeholder="true" :placeholder="true"
:line-wrap="true"
:line-break="false"
:editable="true" :editable="true"
:auto-completion="autoCompletionManager.autoCompletion()"
:user-defined-functions="userDefinedFunctionsManager.userDefinedFunctions().value" :user-defined-functions="userDefinedFunctionsManager.userDefinedFunctions().value"
></w-code-mirror> ></w-code-mirror>
</div> </div>
@ -15,6 +18,7 @@
import { ref } from 'vue'; import { ref } from 'vue';
import { axios, Environment, EnumTools, Tools, Formater } from '@/platform'; import { axios, Environment, EnumTools, Tools, Formater } from '@/platform';
import { UserDefinedFunctionsManager } from './UserDefinedFunctionsManager'; import { UserDefinedFunctionsManager } from './UserDefinedFunctionsManager';
import { AutoCompletionManager } from './AutoCompletionManager';
const modelValue = ref('${个人征信报告.报告头.报告头信息单元.报告标识信息段.报告编号}'); const modelValue = ref('${个人征信报告.报告头.报告头信息单元.报告标识信息段.报告编号}');
@ -23,7 +27,10 @@ const click = () => {
modelValue.value = modelValue.value + ' ok'; modelValue.value = modelValue.value + ' ok';
}; };
const autoCompletionManager = new AutoCompletionManager();
const userDefinedFunctionsManager = new UserDefinedFunctionsManager(); const userDefinedFunctionsManager = new UserDefinedFunctionsManager();
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/autoCompletionByIndicatorId/34e7391f-ba76-4e14-b152-ae0da917fd20'));
userDefinedFunctionsManager.load(); userDefinedFunctionsManager.load();
console.log(Tools.escapeHtml('<xml>&</xml>')); console.log(Tools.escapeHtml('<xml>&</xml>'));
</script> </script>

1
io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue

@ -196,6 +196,7 @@ const vertexDefines = [
placeholder: true, placeholder: true,
lineWrap: true, lineWrap: true,
lineBreak: true, lineBreak: true,
forceUpdate: true,
autoCompletion: autoCompletion, autoCompletion: autoCompletion,
userDefinedFunctions: userDefinedFunctionsRef, userDefinedFunctions: userDefinedFunctionsRef,
}, },

2
io.sc.platform.developer.doc/package.json

@ -28,7 +28,7 @@
"vuepress": "2.0.0-rc.15" "vuepress": "2.0.0-rc.15"
}, },
"dependencies": { "dependencies": {
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"vue": "3.5.13", "vue": "3.5.13",
"vue-i18n": "10.0.4" "vue-i18n": "10.0.4"

10
io.sc.platform.developer.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

10
io.sc.platform.lcdp.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

10
io.sc.platform.license.keygen.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

10
io.sc.platform.mvc.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

10
io.sc.platform.scheduler.manager.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

10
io.sc.platform.system.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -110,7 +110,7 @@
"mockjs": "1.1.0", "mockjs": "1.1.0",
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

339
io.sc.platform.util/src/main/java/io/sc/platform/util/ArrayUtil.java

@ -0,0 +1,339 @@
package io.sc.platform.util;
public class ArrayUtil {
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(boolean[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(byte[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(char[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(short[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(int[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(long[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(float[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(double[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组是否含有元素
* @param arrays 数组对象
* @return 数组是否含有元素
*/
public static boolean hasElements(Object[] arrays){
if(arrays==null){ return false; }
return arrays.length>0;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static boolean max(boolean[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
for(boolean v : arrays){
if(v){
return true;
}
}
return false;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static byte max(byte[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
byte r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>r){
r =arrays[i];
}
}
return r;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static char max(char[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
char r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>r){
r =arrays[i];
}
}
return r;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static short max(short[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
short r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>r){
r =arrays[i];
}
}
return r;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static int max(int[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
int r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>r){
r =arrays[i];
}
}
return r;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static long max(long[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
long r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>r){
r =arrays[i];
}
}
return r;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static float max(float[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
float r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>r){
r =arrays[i];
}
}
return r;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static double max(double[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
double r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]>r){
r =arrays[i];
}
}
return r;
}
/**
* 获取数组中最大的元素
* @param arrays 数组对象
* @return 数组中最大的元素
*/
public static Comparable max(Comparable[] arrays){
if(arrays==null){ return null; }
Comparable r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i].compareTo(r)>0){
r =arrays[i];
}
}
return r;
}
public static boolean min(boolean[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
for(boolean v : arrays){
if(!v){
return false;
}
}
return true;
}
public static byte min(byte[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
byte r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]<r){
r =arrays[i];
}
}
return r;
}
public static char min(char[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
char r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]<r){
r =arrays[i];
}
}
return r;
}
public static short min(short[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
short r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]<r){
r =arrays[i];
}
}
return r;
}
public static int min(int[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
int r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]<r){
r =arrays[i];
}
}
return r;
}
public static long min(long[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
long r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]<r){
r =arrays[i];
}
}
return r;
}
public static float min(float[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
float r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]<r){
r =arrays[i];
}
}
return r;
}
public static double min(double[] arrays){
if(arrays==null){ throw new RuntimeException("parameter must NOT null"); }
double r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i]<r){
r =arrays[i];
}
}
return r;
}
public static Comparable min(Comparable[] arrays){
if(arrays==null){ return null; }
Comparable r =arrays[0];
for(int i=1;i<arrays.length;i++){
if(arrays[i].compareTo(r)<0){
r =arrays[i];
}
}
return r;
}
}

218
io.sc.platform.util/src/main/java/io/sc/platform/util/CollectionUtil.java

@ -13,24 +13,6 @@ import java.util.*;
public class CollectionUtil { public class CollectionUtil {
private CollectionUtil(){} private CollectionUtil(){}
/**
* 监测集合是否为空,当集合对象为 null 或者不包含任何元素时返回 false,否则返回 true
* @param collection 集合
* @return 是否为空
*/
public static boolean hasElements(Collection collection){
return collection!=null && !collection.isEmpty();
}
/**
* 监测数组是否为空,当数组对象为 null 或者不包含任何元素时返回 false,否则返回 true
* @param arrays 集合
* @return 是否为空
*/
public static boolean hasElements(Object[] arrays){
return arrays!=null && arrays.length>0;
}
/** /**
* 获取 List 集合元素的类型 * 获取 List 集合元素的类型
* @param type * @param type
@ -228,10 +210,10 @@ public class CollectionUtil {
} }
/** /**
* 字符串数组中查找字符串 * 数组中查找对象
* @param array * @param array 数组
* @param obj * @param obj 对象
* @return * @return 查找到的对象
*/ */
public static int search(Object[] array, Object obj){ public static int search(Object[] array, Object obj){
if(array==null || array.length==0 || obj==null || ((obj instanceof String) && ((String) obj).isEmpty())){ if(array==null || array.length==0 || obj==null || ((obj instanceof String) && ((String) obj).isEmpty())){
@ -245,6 +227,12 @@ public class CollectionUtil {
return -1; return -1;
} }
/**
* 在列表中查找对象
* @param list 列表
* @param obj 对象
* @return 查找到的对象
*/
public static int search(List<Object> list, Object obj){ public static int search(List<Object> list, Object obj){
if(list==null || list.size()==0 || obj==null || ((obj instanceof String) && ((String) obj).isEmpty())){ if(list==null || list.size()==0 || obj==null || ((obj instanceof String) && ((String) obj).isEmpty())){
return -1; return -1;
@ -257,4 +245,190 @@ public class CollectionUtil {
} }
return -1; return -1;
} }
/**
* 判断一个集合或数组中是否包含元素
* @param object 集合或数组对象
* @return 一个集合或数组中是否包含元素
*/
public static boolean hasElements(Object object){
if(object==null){ return false; }
// 集合
if(Collection.class.isAssignableFrom(object.getClass())){
return !((Collection)object).isEmpty();
}
// 数组
if(object.getClass().isArray()){
Class elementClass =object.getClass().getComponentType();
if(boolean.class.equals(elementClass)){
return ArrayUtil.hasElements((boolean[])object);
}else if(byte.class.equals(elementClass)){
return ArrayUtil.hasElements((byte[])object);
}else if(char.class.equals(elementClass)){
return ArrayUtil.hasElements((char[])object);
}else if(short.class.equals(elementClass)){
return ArrayUtil.hasElements((short[])object);
}else if(int.class.equals(elementClass)){
return ArrayUtil.hasElements((int[])object);
}else if(long.class.equals(elementClass)){
return ArrayUtil.hasElements((long[])object);
}else if(float.class.equals(elementClass)){
return ArrayUtil.hasElements((float[])object);
}else if(double.class.equals(elementClass)){
return ArrayUtil.hasElements((double[])object);
}else{
return ArrayUtil.hasElements((Object[])object);
}
}
// 其他
throw new RuntimeException("parameter must be Collection or Array type.");
}
/**
* 判断一个集合或数组中包含元素的个数
* @param object 集合或数组对象
* @return 一个集合或数组中包含元素的个数
*/
public static int size(Object object){
if(object==null){ return 0; }
// 集合
if(Collection.class.isAssignableFrom(object.getClass())){
return ((Collection)object).size();
}
// 数组
if(object.getClass().isArray()){
Class elementClass =object.getClass().getComponentType();
if(boolean.class.equals(elementClass)){
return ((boolean[])object).length;
}else if(byte.class.equals(elementClass)){
return ((byte[])object).length;
}else if(char.class.equals(elementClass)){
return ((char[])object).length;
}else if(short.class.equals(elementClass)){
return ((short[])object).length;
}else if(int.class.equals(elementClass)){
return ((int[])object).length;
}else if(long.class.equals(elementClass)){
return ((long[])object).length;
}else if(float.class.equals(elementClass)){
return ((float[])object).length;
}else if(double.class.equals(elementClass)){
return ((double[])object).length;
}else{
return ((Object[])object).length;
}
}
// 其他
throw new RuntimeException("parameter must be Collection or Array type.");
}
/**
* 获取一个集合或数组中最大的元素
* @param object 集合或数组对象
* @return 一个集合或数组中最大的元素
*/
public static Object max(Object object){
if(object==null){ return 0; }
// 集合
if(Collection.class.isAssignableFrom(object.getClass())){
Comparable maxValue =null;
Collection collection =(Collection)object;
for(Object o : collection){
if(Comparable.class.isAssignableFrom(o.getClass())){
Comparable c =(Comparable)o;
if(maxValue==null){
maxValue =c;
continue;
}
if(c.compareTo(maxValue)>0){
maxValue =c;
}
}
}
}
// 数组
if(object.getClass().isArray()){
Class elementClass =object.getClass().getComponentType();
if(boolean.class.equals(elementClass)){
return ArrayUtil.max((boolean[])object);
}else if(byte.class.equals(elementClass)){
return ArrayUtil.max((byte[])object);
}else if(char.class.equals(elementClass)){
return ArrayUtil.max((char[])object);
}else if(short.class.equals(elementClass)){
return ArrayUtil.max((short[])object);
}else if(int.class.equals(elementClass)){
return ArrayUtil.max((int[])object);
}else if(long.class.equals(elementClass)){
return ArrayUtil.max((long[])object);
}else if(float.class.equals(elementClass)){
return ArrayUtil.max((float[])object);
}else if(double.class.equals(elementClass)){
return ArrayUtil.max((double[])object);
}else{
if(Comparable.class.isAssignableFrom(elementClass)){
return ArrayUtil.max((Comparable[])object);
}else {
throw new RuntimeException("parameter must be Comparable or Array type.");
}
}
}
// 其他
throw new RuntimeException("parameter must be Collection or Array type.");
}
/**
* 获取一个集合或数组中最小的元素
* @param object 集合或数组对象
* @return 一个集合或数组中最小的元素
*/
public static Object min(Object object){
if(object==null){ return 0; }
// 集合
if(Collection.class.isAssignableFrom(object.getClass())){
Comparable maxValue =null;
Collection collection =(Collection)object;
for(Object o : collection){
if(Comparable.class.isAssignableFrom(o.getClass())){
Comparable c =(Comparable)o;
if(maxValue==null){
maxValue =c;
continue;
}
if(c.compareTo(maxValue)<0){
maxValue =c;
}
}
}
}
// 数组
if(object.getClass().isArray()){
Class elementClass =object.getClass().getComponentType();
if(boolean.class.equals(elementClass)){
return ArrayUtil.min((boolean[])object);
}else if(byte.class.equals(elementClass)){
return ArrayUtil.min((byte[])object);
}else if(char.class.equals(elementClass)){
return ArrayUtil.min((char[])object);
}else if(short.class.equals(elementClass)){
return ArrayUtil.min((short[])object);
}else if(int.class.equals(elementClass)){
return ArrayUtil.min((int[])object);
}else if(long.class.equals(elementClass)){
return ArrayUtil.min((long[])object);
}else if(float.class.equals(elementClass)){
return ArrayUtil.min((float[])object);
}else if(double.class.equals(elementClass)){
return ArrayUtil.min((double[])object);
}else{
if(Comparable.class.isAssignableFrom(elementClass)){
return ArrayUtil.min((Comparable[])object);
}else {
throw new RuntimeException("parameter must be Comparable or Array type.");
}
}
}
// 其他
throw new RuntimeException("parameter must be Collection or Array type.");
}
} }

166
io.sc.platform.util/src/main/java/io/sc/platform/util/DateUtil.java

@ -34,8 +34,11 @@ public class DateUtil {
public static final String yyyy_MM_dd_HH_mm ="yyyy-MM-dd HH:mm"; public static final String yyyy_MM_dd_HH_mm ="yyyy-MM-dd HH:mm";
public static final String yyyy_MM_dd_HH ="yyyy-MM-dd HH"; public static final String yyyy_MM_dd_HH ="yyyy-MM-dd HH";
public static final String yyyy_MM_dd ="yyyy-MM-dd"; public static final String yyyy_MM_dd ="yyyy-MM-dd";
public static final String yyyyMMdd ="yyyy-MM-dd"; public static final String yyyy_MM ="yyyy-MM";
public static final String yyyyMM ="yyyy-MM"; public static final String yyyy ="yyyy";
public static final String yyyyMMdd ="yyyyMMdd";
public static final String yyyyMM ="yyyyMM";
public static final String HH_mm_ss ="HH:mm:ss"; public static final String HH_mm_ss ="HH:mm:ss";
public static final String HH_mm_ss_SSS ="HH:mm:ss.SSS"; public static final String HH_mm_ss_SSS ="HH:mm:ss.SSS";
@ -60,7 +63,10 @@ public class DateUtil {
yyyy_MM_dd_HH_mm, yyyy_MM_dd_HH_mm,
yyyy_MM_dd_HH, yyyy_MM_dd_HH,
yyyy_MM_dd, yyyy_MM_dd,
yyyyMM yyyyMMdd,
yyyy_MM,
yyyyMM,
yyyy
}; };
private static final String SUPPORTED_DATE_FORMAT_EXCEPTION_MESSAGE ="unsupported date format, the valiate format include : \n" private static final String SUPPORTED_DATE_FORMAT_EXCEPTION_MESSAGE ="unsupported date format, the valiate format include : \n"
+ GMT_CHINESE_COMMA + "\n" + GMT_CHINESE_COMMA + "\n"
@ -69,11 +75,15 @@ public class DateUtil {
+ GMT + "\n" + GMT + "\n"
+ yyyy_MM_dd_T_HH_mm_ss_SSS + "\n" + yyyy_MM_dd_T_HH_mm_ss_SSS + "\n"
+ ISO_8601 + "\n" + ISO_8601 + "\n"
+ yyyy_MM_dd_HH_mm_ss_SSS + "\n"
+ yyyy_MM_dd_HH_mm_ss + "\n" + yyyy_MM_dd_HH_mm_ss + "\n"
+ yyyy_MM_dd_HH_mm + "\n" + yyyy_MM_dd_HH_mm + "\n"
+ yyyy_MM_dd_HH + "\n" + yyyy_MM_dd_HH + "\n"
+ yyyy_MM_dd + "\n" + yyyy_MM_dd + "\n"
+ yyyyMM + "\n"; + yyyyMMdd + "\n"
+ yyyy_MM + "\n"
+ yyyyMM + "\n"
+ yyyy + "\n";
/** /**
* 获取日期 * 获取日期
@ -543,8 +553,150 @@ public class DateUtil {
return ChronoUnit.MONTHS.between(ld1,ld2); return ChronoUnit.MONTHS.between(ld1,ld2);
} }
public static void main(String[] args) { /**
long a =monthsBetween("2023-01","2025-02"); * 日期加年数
System.out.println(a); * @param o1 日期对象
* @param years 年数
* @return 日期相加后的结果
*/
public static Date plusYears(Object o1, long years){
if(o1==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld =toLocalDateTime(d1);
LocalDateTime result =ld.plusYears(years);
return fromLocalDateTime(result);
}
/**
* 日期加月数
* @param o1 日期对象
* @param months 月数
* @return 日期相加后的结果
*/
public static Date plusMonths(Object o1, long months){
if(o1==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld =toLocalDateTime(d1);
LocalDateTime result =ld.plusMonths(months);
return fromLocalDateTime(result);
}
/**
* 日期加周数
* @param o1 日期对象
* @param weeks 周数
* @return 日期相加后的结果
*/
public static Date plusWeeks(Object o1, long weeks){
if(o1==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld =toLocalDateTime(d1);
LocalDateTime result =ld.plusWeeks(weeks);
return fromLocalDateTime(result);
}
/**
* 日期加天数
* @param o1 日期对象
* @param days 天数
* @return 日期相加后的结果
*/
public static Date plusDays(Object o1, long days){
if(o1==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld =toLocalDateTime(d1);
LocalDateTime result =ld.plusDays(days);
return fromLocalDateTime(result);
}
/**
* 日期加小时数
* @param o1 日期对象
* @param hours 小时数
* @return 日期相加后的结果
*/
public static Date plusHours(Object o1, long hours){
if(o1==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld =toLocalDateTime(d1);
LocalDateTime result =ld.plusHours(hours);
return fromLocalDateTime(result);
}
/**
* 日期加分钟数
* @param o1 日期对象
* @param minutes 分钟数
* @return 日期相加后的结果
*/
public static Date plusMinutes(Object o1, long minutes){
if(o1==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld =toLocalDateTime(d1);
LocalDateTime result =ld.plusMinutes(minutes);
return fromLocalDateTime(result);
}
/**
* 日期加秒数
* @param o1 日期对象
* @param seconds 秒数
* @return 日期相加后的结果
*/
public static Date plusSeconds(Object o1, long seconds){
if(o1==null) throw new RuntimeException("parameter can NOT be null");
Date d1 =null;
if(o1 instanceof String){
try { d1 = tryParseDate(o1.toString()); }catch (Exception e){ throw new RuntimeException(e); }
}else if(o1 instanceof Date){
d1 =(Date)o1;
}else{
throw new RuntimeException("parameter must be String or Date type.");
}
LocalDateTime ld =toLocalDateTime(d1);
LocalDateTime result =ld.plusSeconds(seconds);
return fromLocalDateTime(result);
} }
} }

10
io.sc.standard.frontend/package.json

@ -73,7 +73,7 @@
"webpack-merge": "6.0.1" "webpack-merge": "6.0.1"
}, },
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.18.3", "@codemirror/autocomplete": "6.18.4",
"@codemirror/commands": "6.7.1", "@codemirror/commands": "6.7.1",
"@codemirror/lang-html": "6.4.9", "@codemirror/lang-html": "6.4.9",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
@ -81,10 +81,10 @@
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.8.0", "@codemirror/lang-sql": "6.8.0",
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.4", "@codemirror/language": "6.10.8",
"@codemirror/search": "6.5.8", "@codemirror/search": "6.5.8",
"@codemirror/state": "6.4.1", "@codemirror/state": "6.5.0",
"@codemirror/view": "6.35.0", "@codemirror/view": "6.36.1",
"@maxgraph/core": "0.13.1", "@maxgraph/core": "0.13.1",
"@quasar/extras": "1.16.13", "@quasar/extras": "1.16.13",
"@univerjs/core": "0.5.0", "@univerjs/core": "0.5.0",
@ -111,7 +111,7 @@
"node-sql-parser": "5.3.4", "node-sql-parser": "5.3.4",
"pinia": "2.2.6", "pinia": "2.2.6",
"pinia-undo": "0.2.4", "pinia-undo": "0.2.4",
"platform-core": "8.2.22", "platform-core": "8.2.24",
"quasar": "2.17.4", "quasar": "2.17.4",
"sort-array": "5.0.0", "sort-array": "5.0.0",
"svg-path-commander": "2.1.5", "svg-path-commander": "2.1.5",

2
io.sc.website/package.json

@ -28,6 +28,6 @@
}, },
"dependencies": { "dependencies": {
"vue": "3.5.13", "vue": "3.5.13",
"platform-core": "8.2.22" "platform-core": "8.2.24"
} }
} }
Loading…
Cancel
Save