Browse Source

add flowable

main
wangshaoping 1 year ago
parent
commit
936ea248b5
  1. 11
      app.platform/src/main/resources/META-INF/platform/plugins/frontend-module.json
  2. 7
      app.platform/src/main/resources/public/configure.js
  3. 49
      build.gradle
  4. 8
      gradle.properties
  5. 16
      io.sc.platform.core.frontend/package.json
  6. 34
      io.sc.platform.core.frontend/public/index.html
  7. 12
      io.sc.platform.core.frontend/src/components/index.ts
  8. 7
      io.sc.platform.core.frontend/src/i18n/messages.json
  9. 7
      io.sc.platform.core.frontend/src/i18n/messages_tw_CN.json
  10. 7
      io.sc.platform.core.frontend/src/i18n/messages_zh_CN.json
  11. 29
      io.sc.platform.core.frontend/src/menus/menus.json
  12. 48
      io.sc.platform.core.frontend/src/platform/components/dialog/WDialog.vue
  13. 9
      io.sc.platform.core.frontend/src/platform/components/index.ts
  14. 10
      io.sc.platform.core.frontend/src/platform/index.ts
  15. 8
      io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts
  16. 1
      io.sc.platform.core.frontend/src/platform/plugin/index.ts
  17. 1
      io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts
  18. 2
      io.sc.platform.core.frontend/src/platform/types/index.ts
  19. 5
      io.sc.platform.core.frontend/src/platform/utils/index.ts
  20. 32
      io.sc.platform.core.frontend/src/routes/routes.json
  21. 39
      io.sc.platform.core.frontend/src/views/View1.vue
  22. 9
      io.sc.platform.core.frontend/src/views/View2.vue
  23. 18
      io.sc.platform.core.frontend/template-project/package.json
  24. 34
      io.sc.platform.core.frontend/template-project/public/index.html
  25. 12
      io.sc.platform.core.frontend/template-project/src/components/index.ts
  26. 7
      io.sc.platform.core.frontend/template-project/src/i18n/messages.json
  27. 7
      io.sc.platform.core.frontend/template-project/src/i18n/messages_tw_CN.json
  28. 7
      io.sc.platform.core.frontend/template-project/src/i18n/messages_zh_CN.json
  29. 29
      io.sc.platform.core.frontend/template-project/src/menus/menus.json
  30. 32
      io.sc.platform.core.frontend/template-project/src/routes/routes.json
  31. 39
      io.sc.platform.core.frontend/template-project/src/views/View1.vue
  32. 9
      io.sc.platform.core.frontend/template-project/src/views/View2.vue
  33. 14
      io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs
  34. 5
      io.sc.platform.core.frontend/util.template-generator.cjs
  35. 14
      io.sc.platform.core.frontend/webpack.config.mf.cjs
  36. 39
      io.sc.platform.core.frontend/webpack.env.lib.cjs
  37. 1
      io.sc.platform.core/build.gradle
  38. 39
      io.sc.platform.core/src/main/java/io/sc/platform/core/controller/EnumsWebController.java
  39. 29
      io.sc.platform.core/src/main/java/io/sc/platform/core/support/Option.java
  40. 41
      io.sc.platform.core/src/main/java/io/sc/platform/core/util/UrlUtil.java
  41. 4
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties
  42. 4
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties
  43. 4
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties
  44. 14
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties
  45. 14
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties
  46. 14
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties
  47. 21
      io.sc.platform.developer.doc/asciidoc/9999-appendix/docker/opengauss/opengauss.adoc
  48. 19
      io.sc.platform.developer.frontend/package.json
  49. 34
      io.sc.platform.developer.frontend/public/index.html
  50. 14
      io.sc.platform.developer.frontend/webpack.config.mf.cjs
  51. 54
      io.sc.platform.flowable/README.adoc
  52. 7
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/AgentWebController.java
  53. 64
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/FlowableModelerEditorWebController.java
  54. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/ProcessEntityWebController.java
  55. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/ProcessOperationWebController.java
  56. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/ProcessQueryWebController.java
  57. 4
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/enums/ProcessStatus.java
  58. 1
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/initializer/SampleWorkFlowSystemDictionaryInitializer.java
  59. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/entity/ProcessEntity.java
  60. 2
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/repository/ProcessEntityRepository.java
  61. 7
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessEntityServiceImpl.java
  62. 4
      io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/components.json
  63. 5
      io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/messages.json
  64. 3
      io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/resources.json
  65. 3
      io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/security.json
  66. 157
      io.sc.platform.flowable/src/main/resources/flowable-modeler/404.html
  67. 9
      io.sc.platform.flowable/src/main/resources/flowable-modeler/browserconfig.xml
  68. 512
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/cmmn-draw.js
  69. 216
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/cmmn-icons.js
  70. 24
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/displaymodel.css
  71. 15
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/displaymodel.html
  72. 272
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/displaymodel.js
  73. 24
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/displaymodel.css
  74. 15
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/displaymodel.html
  75. 270
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/displaymodel.js
  76. 206
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/dmn-draw.js
  77. 182
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/dmn-icons.js
  78. 3
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/.gitignore
  79. 153
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/Gruntfile.js
  80. 387
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/Polyline.js
  81. 880
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/bpmn-draw.js
  82. 395
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/bpmn-icons.js
  83. 24
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/displaymodel.css
  84. 19
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/displaymodel.html
  85. 316
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/displaymodel.js
  86. 2
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/jquery.qtip.min.css
  87. 5
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/jquery.qtip.min.js
  88. 37
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/package.json
  89. 1
      io.sc.platform.flowable/src/main/resources/flowable-modeler/display/raphael.min.js
  90. 19
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/flowable-header-custom.js
  91. 50
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/flowable-toolbar-custom-actions.js
  92. 507
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-assignment-controller.js
  93. 28
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-calledelementtype-controller.js
  94. 86
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-case-reference-controller.js
  95. 59
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-condition-expression-controller.js
  96. 12
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-custom-controllers.js
  97. 330
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-data-properties-controller.js
  98. 288
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-decisionservice-reference-controller.js
  99. 288
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-decisiontable-reference-controller.js
  100. 118
      io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-default-controllers.js

11
app.platform/src/main/resources/META-INF/platform/plugins/frontend-module.json

@ -0,0 +1,11 @@
{
"name": "app.platform",
"components": [
],
"resources": [
"/public/configure.js",
"/public/favicon.svg",
"/public/login-bg.jpg",
"/public/logo.svg"
]
}

7
app.platform/src/main/resources/public/configure.js

@ -0,0 +1,7 @@
window.APP = {}; // 在浏览器 window 对象中新建名为 APP 的变量, 用于存放应用对象的容器
window.APP.configure ={ // 全局配置存储容器
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 应用上下文路径
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[') ? 'http://localhost:8080/' : '[(@{/})]', // 后端 API 请求的服务地址前缀
}
}

49
build.gradle

@ -366,6 +366,31 @@ subprojects {
}
}
/*-----------------------------------------------------------------
* pnpm sync
*----------------------------------------------------------------*/
task frontendNpmSync(type:Exec){
if(isFrontendProject(file('.')) && !project.name.contains("io.sc.platform.security.frontend")){
workingDir '.'
if(org.gradle.internal.os.OperatingSystem.current().isWindows()){
commandLine 'cmd', '/c', 'pnpm', 'sync'
}else{
commandLine 'pnpm', 'sync'
}
}else{
if(org.gradle.internal.os.OperatingSystem.current().isWindows()){
commandLine 'cmd', '/c', 'cd', '.'
}else{
commandLine 'cd', '.'
}
}
}
tasks.frontendNpmSync.doFirst {
if(isFrontendProject(file('.'))) {
println '开始执行 pnpm sync ......';
}
}
/*-----------------------------------------------------------------
* pnpm run build
*----------------------------------------------------------------*/
@ -554,12 +579,33 @@ subprojects {
//resources----------------------------------------
List<String> resources = new ArrayList<String>();
def dirPath = file('dist').absolutePath;
if(project.name.contains('io.sc.platform.mvc.frontend')){
def tree = fileTree('dist') {
include '**/*.*'
exclude "public/${project.name}/configure.js"
exclude "public/${project.name}/favicon.svg"
exclude "public/${project.name}/index.html"
exclude "public/${project.name}/login-bg.jpg"
exclude "public/${project.name}/logo.svg"
}
tree.each { File file ->
resources.add(file.absolutePath.substring(dirPath.length()));
}
}else{
def tree = fileTree('dist') {
include '**/*.*'
exclude '**/webjars/**/*.*'
exclude "public/${project.name}/configure.js"
exclude "public/${project.name}/favicon.svg"
exclude "public/${project.name}/index.html"
exclude "public/${project.name}/login-bg.jpg"
exclude "public/${project.name}/logo.svg"
}
tree.each { File file ->
resources.add(file.absolutePath.substring(dirPath.length()));
}
}
//all-in-one------------------------------------
Map<String,Object> allInOne =new LinkedHashMap<>();
@ -587,7 +633,8 @@ subprojects {
//
frontendNpmInstall.dependsOn(frontendUpdatePackageJson)
frontendNpmBuild.dependsOn(frontendNpmInstall)
frontendNpmSync.dependsOn(frontendNpmInstall)
frontendNpmBuild.dependsOn(frontendNpmSync)
frontendNpmProd.dependsOn(frontendNpmInstall)
//

8
gradle.properties

@ -36,9 +36,9 @@ application_version=1.0.0
# platform
###########################################################
platform_group=io.sc
platform_version=8.1.9
platform_plugin_version=8.1.8
platform_core_frontend_version=8.1.16
platform_version=8.1.11
platform_plugin_version=8.1.11
platform_core_frontend_version=8.1.27
###########################################################
# dependencies version
@ -73,7 +73,7 @@ spring_cloud_version=2021.0.8
spring_security_oauth2_authorization_server_version=0.4.4
spring_statemachine_version=3.2.1
webjars_locator_weblogic_version=0.10
zip4j_version=2.9.1
zip4j_version=2.11.5
###########################################################
# asciidoc deploy directory,the path must end with '/'

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

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.17",
"version": "8.1.28",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"main": "dist/platform-core.js",
@ -96,9 +96,22 @@
"webpack-merge": "5.10.0"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.2",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.9.3",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.3.3",
"@codemirror/view": "6.22.1",
"@quasar/extras": "1.16.7",
"@vueuse/core": "10.3.0",
"axios": "1.5.1",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.1",
"exceljs": "4.3.0",
@ -109,6 +122,7 @@
"quasar": "2.13.0",
"tailwindcss": "3.3.5",
"vue": "3.3.7",
"vue-codemirror6": "1.1.31",
"vue-dompurify-html": "4.1.4",
"vue-i18n": "9.6.0",
"vue-router": "4.2.5"

34
io.sc.platform.core.frontend/public/index.html

@ -6,10 +6,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- luckysheet css -->
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css' th:href="@{/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/plugins/plugins.css' th:href="@{/webjars/luckysheet/2.1.13/plugins/plugins.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/css/luckysheet.css' th:href="@{/webjars/luckysheet/2.1.13/css/luckysheet.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css' th:href="@{/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css" th:href="@{/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/plugins/plugins.css" th:href="@{/webjars/luckysheet/2.1.13/plugins/plugins.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/css/luckysheet.css" th:href="@{/webjars/luckysheet/2.1.13/css/luckysheet.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css" th:href="@{/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css}"/>
<!-- luckysheet js -->
<script src="/webjars/luckysheet/2.1.13/plugins/js/plugin.js" th:src="@{/webjars/luckysheet/2.1.13/plugins/js/plugin.js}"></script>
@ -18,31 +18,7 @@
<!-- tailwindcss js -->
<script src="/webjars/tailwindcss/3.3.5/tailwindcss.js" th:src="@{/webjars/tailwindcss/3.3.5/tailwindcss.js}"></script>
<script>
window.APP = {}; // 在浏览器 window 对象中新建名为 APP 的变量, 用于存放应用对象的容器
window.APP.actions ={}; // 全局 Action 存储容器
window.APP.layoutProviders ={}; // 全局布局提供者存储容器
window.APP.configure ={ // 全局配置存储容器
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 应用上下文路径
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[') ? 'http://localhost:8080/' : '[(@{/})]', // 后端 API 请求的服务地址前缀
},
enableLocalMock: false, // 是否启用本地 mock
localMockTimeout: 10, // mock 请求响应时间(单位:毫秒)
enableRemoteConfigure: true, // 是否启用使用远程服务端配置
useLocaleRouterFirst: true, // 是否首先使用本地路由
axios: {
baseURL: '',
timeout: 1000 * 60,
crossdomain: true,
basicAuth: {
enable: true,
username: 'admin',
password: 'admin',
},
},
}
</script>
<script src="/configure.js" th:src="@{/configure.js}"></script>
</head>
<body>
<noscript>

12
io.sc.platform.core.frontend/src/components/index.ts

@ -2,12 +2,14 @@
* ,
*/
import View1 from '@/views/View1.vue';
import View2 from '@/views/View2.vue';
import dialog from '@/views/Dialog.vue';
import codemirror from '@/views/Codemirror.vue';
import select from '@/views/Select.vue';
const localComponents = {
'component.example.View1': View1,
'component.example.View2': View2,
};
'component.testcase.dialog': dialog,
'component.testcase.codemirror': codemirror,
'component.testcase.select': select,
}
export default localComponents;

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

@ -1,5 +1,6 @@
{
"menu.example": "Example",
"menu.example.menu1": "Menu 1",
"menu.example.menu2": "Menu 2"
"menu.testcase": "Test Case",
"menu.testcase.codemirror": "CodeMirror",
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select"
}

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

@ -1,5 +1,6 @@
{
"menu.example": "示例",
"menu.example.menu1": "菜單 1",
"menu.example.menu2": "菜單 2"
"menu.testcase": "測試用例",
"menu.testcase.codemirror": "CodeMirror",
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select"
}

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

@ -1,5 +1,6 @@
{
"menu.example": "示例",
"menu.example.menu1": "菜单 1",
"menu.example.menu2": "菜单 2"
"menu.testcase": "测试用例",
"menu.testcase.codemirror": "CodeMirror",
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select"
}

29
io.sc.platform.core.frontend/src/menus/menus.json

@ -17,23 +17,32 @@
*/
[
{ "type": "GROUP", "order": 20000, "id": "menu.example", "titleI18nKey": "menu.example", "icon": "bi-gear" },
{ "type": "GROUP", "order": 20000, "id": "menu.testcase", "titleI18nKey": "menu.testcase", "icon": "bi-gear" },
{
"type": "ROUTE",
"order": 300,
"parentId": "menu.example",
"id": "menu.example.menu1",
"titleI18nKey": "menu.example.menu1",
"order": 200,
"parentId": "menu.testcase",
"id": "menu.testcase.dialog",
"titleI18nKey": "menu.testcase.dialog",
"icon": "bi-palette",
"routeName": "route.example.route1"
"routeName": "route.testcase.dialog"
},
{
"type": "ROUTE",
"order": 300,
"parentId": "menu.example",
"id": "menu.example.menu2",
"titleI18nKey": "menu.example.menu2",
"parentId": "menu.testcase",
"id": "menu.testcase.codemirror",
"titleI18nKey": "menu.testcase.codemirror",
"icon": "bi-palette",
"routeName": "route.testcase.codemirror"
},
{
"type": "ROUTE",
"order": 400,
"parentId": "menu.testcase",
"id": "menu.testcase.select",
"titleI18nKey": "menu.testcase.select",
"icon": "bi-palette",
"routeName": "route.example.route2"
"routeName": "route.testcase.select"
}
]

48
io.sc.platform.core.frontend/src/platform/components/dialog/WDialog.vue

@ -1,10 +1,10 @@
<template>
<q-dialog v-model="dialog.dialogShow" allow-focus-outside v-bind="attrs">
<q-dialog v-model="isShowRef" allow-focus-outside v-bind="attrs">
<q-card
:style="{
width: dialog.maximized ? '100vw' : props.width,
width: maximizedRef ? '100vw' : props.width,
'max-width': '100vw',
height: dialog.maximized ? '100vh' : props.height,
height: maximizedRef ? '100vh' : props.height,
'max-height': '100vh',
}"
>
@ -14,7 +14,7 @@
<div class="flex justify-between">
<div class="text-h6">{{ title }}</div>
<div class="flex justify-end gap-4">
<template v-for="(btn, index) in buttons as any" :key="index">
<template v-for="(btn, index) in actions as any" :key="index">
<q-btn
v-if="typeof btn === 'object'"
:loading="btn.loading ? btn.loading : false"
@ -25,11 +25,11 @@
>
</q-btn>
</template>
<q-btn v-if="canMaximize" dense flat :icon="!dialog.maximized ? IconEnum.全屏 : IconEnum.退出全屏" @click="maximizeBtnClick">
<q-tooltip v-if="!dialog.maximized">全屏</q-tooltip>
<q-tooltip v-else-if="dialog.maximized">退出全屏</q-tooltip>
<q-btn v-if="canMaximize" dense flat :icon="!maximizedRef ? PlatformIconEnum.全屏 : PlatformIconEnum.退出全屏" @click="maximizeBtnClick">
<q-tooltip v-if="!maximizedRef">全屏</q-tooltip>
<q-tooltip v-else-if="maximizedRef">退出全屏</q-tooltip>
</q-btn>
<q-btn v-close-popup dense flat :icon="IconEnum.关闭">
<q-btn v-close-popup dense flat :icon="PlatformIconEnum.关闭">
<q-tooltip>关闭</q-tooltip>
</q-btn>
</div>
@ -41,7 +41,7 @@
<q-card-section v-if="!splitter" style="height: 100%" class="scroll">
<slot name="content"></slot>
</q-card-section>
<q-splitter v-else v-model="dialog.splitterModel" :limits="dialog.splitterLimits" :horizontal="dialog.splitterHorizontal" style="height: 100%">
<q-splitter v-else style="height: 100%" v-bind="props.splitter">
<template #before>
<slot name="splitterBefore"></slot>
</template>
@ -56,48 +56,42 @@
</template>
<script setup lang="ts">
import { reactive, useAttrs } from 'vue';
import { IconEnum } from '@/platform/enums';
import { Tools } from '@/platform/utils';
import { ref, reactive, computed, useAttrs } from 'vue';
import { PlatformIconEnum } from '@/platform/components/utils';
import '@/css/tailwind.css';
const attrs = useAttrs();
const props = defineProps({
canMaximize: { type: Boolean, default: true },
title: { type: String, default: '' },
width: { type: String, default: '70%' },
height: { type: String, default: '70%' },
canMaximize: { type: Boolean, default: true },
buttons: { type: Array, default: () => [] },
actions: { type: Array, default: () => [] },
splitter: { type: Object, default: undefined },
});
const emit = defineEmits<{
(
e: 'maximized', //
e: 'maximize', //
maximized: boolean, // true:,false:退
): void;
}>();
const dialog = reactive({
show: false,
maximized: attrs.maximized,
splitterModel: props.splitter?.splitterModel || 50,
splitterLimits: props.splitter?.limits || [0, 100],
splitterHorizontal: props.splitter?.horizontal || false,
});
const isShowRef = ref<boolean>(false);
const maximizedRef = ref<boolean>(attrs.maximized);
const maximizeBtnClick = () => {
dialog.maximized = !dialog.maximized;
emit('maximized', dialog.maximized);
maximizedRef.value = !maximizedRef.value;
emit('maximize', attrs.maximized);
};
const show = () => {
dialog.dialogShow = true;
isShowRef.value = true;
};
const hide = () => {
dialog.dialogShow = false;
isShowRef.value = false;
};
defineExpose({

9
io.sc.platform.core.frontend/src/platform/components/index.ts

@ -6,7 +6,10 @@ import WIconEmpty from './icon/WIconEmpty.vue';
import WColorInput from './widget/color/WColorInput.vue';
import WColorInputPalette from './widget/color/WColorInputPalette.vue';
import WPosition from './widget/position/WPosition.vue';
import WCodemirror from './widget/codemirror/WCodemirror.vue';
import WSelect from './widget/select/WSelect.vue';
import WDialog from './dialog/WDialog.vue';
import PlatformDialog from './dialog/PlatformDialog.vue';
import PlatformDrawer from './drawer/PlatformDrawer.vue';
import PlatformForm from './form/PlatformForm.vue';
@ -22,7 +25,10 @@ export default {
app.component('WColorInput', WColorInput);
app.component('WColorInputPalette', WColorInputPalette);
app.component('WPosition', WPosition);
app.component('WCodemirror', WCodemirror);
app.component('WSelect', WSelect);
app.component('WDialog', WDialog);
app.component('PlatformDialog', PlatformDialog);
app.component('PlatformDrawer', PlatformDrawer);
app.component('PlatformForm', PlatformForm);
@ -38,6 +44,9 @@ export {
WColorInput,
WColorInputPalette,
WPosition,
WCodemirror,
WSelect,
WDialog,
PlatformDialog,
PlatformDrawer,
PlatformForm,

10
io.sc.platform.core.frontend/src/platform/index.ts

@ -36,6 +36,8 @@ export type {
AppInitializeParameterType,
AppType,
ConfigureType,
DialogOptionsType,
EnumType,
FrontEndRouteMetaActionType,
FrontEndRouteMetaType,
FrontEndRouteType,
@ -73,6 +75,7 @@ export { Environment } from './plugin';
export { ApplicationInitializer } from './plugin';
export { ComponentManager } from './plugin';
export { ConfigureManager } from './plugin';
export { DialogManager } from './plugin';
export { I18nMessageManager } from './plugin';
export { MenuManager } from './plugin';
export { MockManager } from './plugin';
@ -84,9 +87,10 @@ export { TagViewManager } from './plugin';
/**
*
*/
export { Tools } from './utils';
export { QuasarTools } from './utils';
export { BackendTools } from './utils';
export { JavascriptLoader } from './utils';
export { QuasarTools } from './utils';
export { Tools } from './utils';
export { TreeBuilder } from './utils';
/**
@ -99,6 +103,8 @@ export {
WColorInput,
WColorInputPalette,
WPosition,
WCodemirror,
WSelect,
PlatformDialog,
PlatformDrawer,
PlatformForm,

8
io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts

@ -110,6 +110,14 @@ class Environment {
return window[PConst.APP][PConst.PLATFORM_CORE_VERSION];
}
/**
*
* @returns
*/
public static getWebContextPath() {
return window[PConst.APP][PConst.CONFIGURE].webContextPath;
}
/**
* url
* @param url url

1
io.sc.platform.core.frontend/src/platform/plugin/index.ts

@ -25,6 +25,7 @@ export { Environment } from './environment';
export { ApplicationInitializer } from './manager';
export { ComponentManager } from './manager';
export { ConfigureManager } from './manager';
export { DialogManager } from './manager';
export { I18nMessageManager } from './manager';
export { MenuManager } from './manager';
export { MockManager } from './manager';

1
io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts

@ -1,6 +1,7 @@
export { ApplicationInitializer } from './ApplicationInitializer';
export { ComponentManager } from './ComponentManager';
export { ConfigureManager } from './ConfigureManager';
export { DialogManager } from './DialogManager';
export { I18nMessageManager } from './I18nMessageManager';
export { MenuManager } from './MenuManager';
export { MockManager } from './MockManager';

2
io.sc.platform.core.frontend/src/platform/types/index.ts

@ -2,6 +2,8 @@ export type { AppInitializeParameterType } from './AppInitializeParameterType';
export type { AnyValueMapType } from './AnyValueMapType';
export type { AppType } from './AppType';
export type { ConfigureType } from './ConfigureType';
export type { DialogOptionsType } from './DialogOptionsType';
export type { EnumType } from './EnumType';
export type { FrontEndRouteType, FrontEndRouteMetaType, FrontEndRouteMetaActionType } from './FrontEndRouteType';
export type { GlobalReactiveType } from './GlobalReactiveType';
export type { I18nMessageLocaleType } from './I18nMessageLocaleType';

5
io.sc.platform.core.frontend/src/platform/utils/index.ts

@ -1,4 +1,5 @@
export { Tools } from './Tools';
export { QuasarTools } from './QuasarTools';
export { BackendTools } from './BackendTools';
export { JavascriptLoader } from './JavascriptLoader';
export { QuasarTools } from './QuasarTools';
export { Tools } from './Tools';
export { TreeBuilder } from './TreeBuilder';

32
io.sc.platform.core.frontend/src/routes/routes.json

@ -1,26 +1,38 @@
[
{
"name": "route.example.route1",
"path": "example/route1",
"name": "route.testcase.dialog",
"path": "testcase/dialog",
"parent": "/",
"priority": 0,
"component": "component.example.View1",
"componentPath": "@/views/View1.vue",
"component": "component.testcase.dialog",
"componentPath": "@/views/Dialog.vue",
"redirect": null,
"meta": {
"permissions": ["/example/**/*"]
"permissions": ["/testcase/dialog/**/*"]
}
},
{
"name": "route.example.route2",
"path": "example/route2",
"name": "route.testcase.codemirror",
"path": "testcase/codemirror",
"parent": "/",
"priority": 0,
"component": "component.example.View2",
"componentPath": "@/views/View2.vue",
"component": "component.testcase.codemirror",
"componentPath": "@/views/Codemirror.vue",
"redirect": null,
"meta": {
"permissions": ["/example/**/*"]
"permissions": ["/testcase/codemirror/**/*"]
}
},
{
"name": "route.testcase.select",
"path": "testcase/select",
"parent": "/",
"priority": 0,
"component": "component.testcase.select",
"componentPath": "@/views/Select.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/select/**/*"]
}
}
]

39
io.sc.platform.core.frontend/src/views/View1.vue

@ -1,39 +0,0 @@
<template>
<w-dialog
ref="dialogRef"
:persistent="true"
:maximized="false"
title="xxx"
width="50%"
height="50%"
:can-maximize="false"
:buttons="[
{
icon: IconEnum.保存,
label: '保存',
loading: false,
click: async () => {},
},
]"
@maximized="dialogMaximize"
></w-dialog>
</template>
<script setup lang="ts">
// import { Environment, axios } from '@/platform';
// const response = await axios.get(Environment.apiContextPath('/api/sample/action1'));
// const message = response.data.message;
import { ref, reactive, onMounted } from 'vue';
import { IconEnum } from '@/platform';
const dialogRef = ref();
const dialogMaximize = (maximizedToggle: boolean) => {
console.log(maximizedToggle);
};
onMounted(() => {
dialogRef.value.show();
});
</script>

9
io.sc.platform.core.frontend/src/views/View2.vue

@ -1,9 +0,0 @@
<template>
<div>{{ message }}</div>
</template>
<script setup lang="ts">
import { Environment, axios } from '@/platform';
const response = await axios.post(Environment.apiContextPath('/api/sample/action2'));
const message = response.data.message;
</script>

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

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.17",
"version": "8.1.28",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -68,9 +68,22 @@
"webpack-merge": "5.10.0"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.2",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.9.3",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.3.3",
"@codemirror/view": "6.22.1",
"@quasar/extras": "1.16.7",
"@vueuse/core": "10.3.0",
"axios": "1.5.1",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.1",
"exceljs": "4.3.0",
@ -78,10 +91,11 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.17",
"platform-core": "8.1.28",
"quasar": "2.13.0",
"tailwindcss": "3.3.5",
"vue": "3.3.7",
"vue-codemirror6": "1.1.31",
"vue-dompurify-html": "4.1.4",
"vue-i18n": "9.6.0",
"vue-router": "4.2.5"

34
io.sc.platform.core.frontend/template-project/public/index.html

@ -6,10 +6,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- luckysheet css -->
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css' th:href="@{/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/plugins/plugins.css' th:href="@{/webjars/luckysheet/2.1.13/plugins/plugins.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/css/luckysheet.css' th:href="@{/webjars/luckysheet/2.1.13/css/luckysheet.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css' th:href="@{/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css" th:href="@{/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/plugins/plugins.css" th:href="@{/webjars/luckysheet/2.1.13/plugins/plugins.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/css/luckysheet.css" th:href="@{/webjars/luckysheet/2.1.13/css/luckysheet.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css" th:href="@{/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css}"/>
<!-- luckysheet js -->
<script src="/webjars/luckysheet/2.1.13/plugins/js/plugin.js" th:src="@{/webjars/luckysheet/2.1.13/plugins/js/plugin.js}"></script>
@ -18,31 +18,7 @@
<!-- tailwindcss js -->
<script src="/webjars/tailwindcss/3.3.5/tailwindcss.js" th:src="@{/webjars/tailwindcss/3.3.5/tailwindcss.js}"></script>
<script>
window.APP = {}; // 在浏览器 window 对象中新建名为 APP 的变量, 用于存放应用对象的容器
window.APP.actions ={}; // 全局 Action 存储容器
window.APP.layoutProviders ={}; // 全局布局提供者存储容器
window.APP.configure ={ // 全局配置存储容器
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 应用上下文路径
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[') ? 'http://localhost:8080/' : '[(@{/})]', // 后端 API 请求的服务地址前缀
},
enableLocalMock: false, // 是否启用本地 mock
localMockTimeout: 10, // mock 请求响应时间(单位:毫秒)
enableRemoteConfigure: true, // 是否启用使用远程服务端配置
useLocaleRouterFirst: true, // 是否首先使用本地路由
axios: {
baseURL: '',
timeout: 1000 * 60,
crossdomain: true,
basicAuth: {
enable: true,
username: 'admin',
password: 'admin',
},
},
}
</script>
<script src="/configure.js" th:src="@{/configure.js}"></script>
</head>
<body>
<noscript>

12
io.sc.platform.core.frontend/template-project/src/components/index.ts

@ -2,12 +2,14 @@
* ,
*/
import View1 from '@/views/View1.vue';
import View2 from '@/views/View2.vue';
import dialog from '@/views/Dialog.vue';
import codemirror from '@/views/Codemirror.vue';
import select from '@/views/Select.vue';
const localComponents = {
'component.example.View1': View1,
'component.example.View2': View2,
};
'component.testcase.dialog': dialog,
'component.testcase.codemirror': codemirror,
'component.testcase.select': select,
}
export default localComponents;

7
io.sc.platform.core.frontend/template-project/src/i18n/messages.json

@ -1,5 +1,6 @@
{
"menu.example": "Example",
"menu.example.menu1": "Menu 1",
"menu.example.menu2": "Menu 2"
"menu.testcase": "Test Case",
"menu.testcase.codemirror": "CodeMirror",
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select"
}

7
io.sc.platform.core.frontend/template-project/src/i18n/messages_tw_CN.json

@ -1,5 +1,6 @@
{
"menu.example": "示例",
"menu.example.menu1": "菜單 1",
"menu.example.menu2": "菜單 2"
"menu.testcase": "測試用例",
"menu.testcase.codemirror": "CodeMirror",
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select"
}

7
io.sc.platform.core.frontend/template-project/src/i18n/messages_zh_CN.json

@ -1,5 +1,6 @@
{
"menu.example": "示例",
"menu.example.menu1": "菜单 1",
"menu.example.menu2": "菜单 2"
"menu.testcase": "测试用例",
"menu.testcase.codemirror": "CodeMirror",
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select"
}

29
io.sc.platform.core.frontend/template-project/src/menus/menus.json

@ -17,23 +17,32 @@
*/
[
{ "type": "GROUP", "order": 20000, "id": "menu.example", "titleI18nKey": "menu.example", "icon": "bi-gear" },
{ "type": "GROUP", "order": 20000, "id": "menu.testcase", "titleI18nKey": "menu.testcase", "icon": "bi-gear" },
{
"type": "ROUTE",
"order": 300,
"parentId": "menu.example",
"id": "menu.example.menu1",
"titleI18nKey": "menu.example.menu1",
"order": 200,
"parentId": "menu.testcase",
"id": "menu.testcase.dialog",
"titleI18nKey": "menu.testcase.dialog",
"icon": "bi-palette",
"routeName": "route.example.route1"
"routeName": "route.testcase.dialog"
},
{
"type": "ROUTE",
"order": 300,
"parentId": "menu.example",
"id": "menu.example.menu2",
"titleI18nKey": "menu.example.menu2",
"parentId": "menu.testcase",
"id": "menu.testcase.codemirror",
"titleI18nKey": "menu.testcase.codemirror",
"icon": "bi-palette",
"routeName": "route.testcase.codemirror"
},
{
"type": "ROUTE",
"order": 400,
"parentId": "menu.testcase",
"id": "menu.testcase.select",
"titleI18nKey": "menu.testcase.select",
"icon": "bi-palette",
"routeName": "route.example.route2"
"routeName": "route.testcase.select"
}
]

32
io.sc.platform.core.frontend/template-project/src/routes/routes.json

@ -1,26 +1,38 @@
[
{
"name": "route.example.route1",
"path": "example/route1",
"name": "route.testcase.dialog",
"path": "testcase/dialog",
"parent": "/",
"priority": 0,
"component": "component.example.View1",
"componentPath": "@/views/View1.vue",
"component": "component.testcase.dialog",
"componentPath": "@/views/Dialog.vue",
"redirect": null,
"meta": {
"permissions": ["/example/**/*"]
"permissions": ["/testcase/dialog/**/*"]
}
},
{
"name": "route.example.route2",
"path": "example/route2",
"name": "route.testcase.codemirror",
"path": "testcase/codemirror",
"parent": "/",
"priority": 0,
"component": "component.example.View2",
"componentPath": "@/views/View2.vue",
"component": "component.testcase.codemirror",
"componentPath": "@/views/Codemirror.vue",
"redirect": null,
"meta": {
"permissions": ["/example/**/*"]
"permissions": ["/testcase/codemirror/**/*"]
}
},
{
"name": "route.testcase.select",
"path": "testcase/select",
"parent": "/",
"priority": 0,
"component": "component.testcase.select",
"componentPath": "@/views/Select.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/select/**/*"]
}
}
]

39
io.sc.platform.core.frontend/template-project/src/views/View1.vue

@ -1,39 +0,0 @@
<template>
<w-dialog
ref="dialogRef"
:persistent="true"
:maximized="false"
title="xxx"
width="50%"
height="50%"
:can-maximize="false"
:buttons="[
{
icon: IconEnum.保存,
label: '保存',
loading: false,
click: async () => {},
},
]"
@maximized="dialogMaximize"
></w-dialog>
</template>
<script setup lang="ts">
// import { Environment, axios } from 'platform-core';
// const response = await axios.get(Environment.apiContextPath('/api/sample/action1'));
// const message = response.data.message;
import { ref, reactive, onMounted } from 'vue';
import { IconEnum } from 'platform-core';
const dialogRef = ref();
const dialogMaximize = (maximizedToggle: boolean) => {
console.log(maximizedToggle);
};
onMounted(() => {
dialogRef.value.show();
});
</script>

9
io.sc.platform.core.frontend/template-project/src/views/View2.vue

@ -1,9 +0,0 @@
<template>
<div>{{ message }}</div>
</template>
<script setup lang="ts">
import { Environment, axios } from 'platform-core';
const response = await axios.post(Environment.apiContextPath('/api/sample/action2'));
const message = response.data.message;
</script>

14
io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs

@ -31,8 +31,21 @@ module.exports = {
exposes: mfExposes,
// 模块联邦共享库
shared: {
'@codemirror/autocomplete': { requiredVersion: deps['@codemirror/autocomplete'], singleton: true },
'@codemirror/commands': { requiredVersion: deps['@codemirror/commands'], singleton: true },
'@codemirror/lang-html': { requiredVersion: deps['@codemirror/lang-html'], singleton: true },
'@codemirror/lang-java': { requiredVersion: deps['@codemirror/lang-java'], singleton: true },
'@codemirror/lang-javascript': { requiredVersion: deps['@codemirror/lang-javascript'], singleton: true },
'@codemirror/lang-json': { requiredVersion: deps['@codemirror/lang-json'], singleton: true },
'@codemirror/lang-sql': { requiredVersion: deps['@codemirror/lang-sql'], singleton: true },
'@codemirror/lang-xml': { requiredVersion: deps['@codemirror/lang-xml'], singleton: true },
'@codemirror/language': { requiredVersion: deps['@codemirror/language'], singleton: true },
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },
'dayjs': { requiredVersion: deps['dayjs'], singleton: true },
'echarts':{ requiredVersion: deps['echarts'], singleton: true },
'exceljs':{ requiredVersion: deps['exceljs'], singleton: true },
@ -43,6 +56,7 @@ module.exports = {
'platform-core': { requiredVersion: deps['platform-core'], singleton: true },
'quasar': { requiredVersion: deps['quasar'], singleton: true },
'vue': { requiredVersion: deps['vue'], singleton: true },
'vue-codemirror6': { requiredVersion: deps['vue-codemirror6'], singleton: true },
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true },

5
io.sc.platform.core.frontend/util.template-generator.cjs

@ -79,8 +79,9 @@ cp('./public', targetDir + 'public');
replaceAll(targetDir + 'src/boostrap.ts', {'@/platform':'platform-core','//<C> ':'','//<C>':''});
replaceAll(targetDir + 'src/shims-vue.d.ts', {'@/platform':'platform-core'});
replaceAll(targetDir + 'src/App.vue', {'@/platform':'platform-core'});
replaceAll(targetDir + 'src/views/View1.vue', {'@/platform':'platform-core'});
replaceAll(targetDir + 'src/views/View2.vue', {'@/platform':'platform-core'});
replaceAll(targetDir + 'src/views/Codemirror.vue', {'@/platform':'platform-core'});
replaceAll(targetDir + 'src/views/Dialog.vue', {'@/platform':'platform-core'});
replaceAll(targetDir + 'src/views/Select.vue', {'@/platform':'platform-core'});
cp(sourceDir + '.browserslistrc', targetDir + '.browserslistrc');

14
io.sc.platform.core.frontend/webpack.config.mf.cjs

@ -31,8 +31,21 @@ module.exports = {
exposes: mfExposes,
// 模块联邦共享库
shared: {
'@codemirror/autocomplete': { requiredVersion: deps['@codemirror/autocomplete'], singleton: true },
'@codemirror/commands': { requiredVersion: deps['@codemirror/commands'], singleton: true },
'@codemirror/lang-html': { requiredVersion: deps['@codemirror/lang-html'], singleton: true },
'@codemirror/lang-java': { requiredVersion: deps['@codemirror/lang-java'], singleton: true },
'@codemirror/lang-javascript': { requiredVersion: deps['@codemirror/lang-javascript'], singleton: true },
'@codemirror/lang-json': { requiredVersion: deps['@codemirror/lang-json'], singleton: true },
'@codemirror/lang-sql': { requiredVersion: deps['@codemirror/lang-sql'], singleton: true },
'@codemirror/lang-xml': { requiredVersion: deps['@codemirror/lang-xml'], singleton: true },
'@codemirror/language': { requiredVersion: deps['@codemirror/language'], singleton: true },
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },
'dayjs': { requiredVersion: deps['dayjs'], singleton: true },
'echarts':{ requiredVersion: deps['echarts'], singleton: true },
'exceljs':{ requiredVersion: deps['exceljs'], singleton: true },
@ -43,6 +56,7 @@ module.exports = {
'platform-core': { requiredVersion: deps['platform-core'], singleton: true },
'quasar': { requiredVersion: deps['quasar'], singleton: true },
'vue': { requiredVersion: deps['vue'], singleton: true },
'vue-codemirror6': { requiredVersion: deps['vue-codemirror6'], singleton: true },
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true },

39
io.sc.platform.core.frontend/webpack.env.lib.cjs

@ -29,16 +29,35 @@ const config =merge(common, {
// 外部化第三方库, 仅打包 platform-core 库
externals: [
{
'@quasar/extras':'@quasar/extras',
'axios':'axios',
'dayjs':'dayjs',
'mockjs':'mockjs',
'pinia':'pinia',
'quasar':'quasar',
'tailwindcss':'tailwindcss',
'vue':'vue',
'vue-i18n':'vue-i18n',
'vue-router':'vue-router',
'@codemirror/autocomplete': '@codemirror/autocomplete',
'@codemirror/commands': '@codemirror/commands',
'@codemirror/lang-html': '@codemirror/lang-html',
'@codemirror/lang-java': '@codemirror/lang-java',
'@codemirror/lang-javascript': '@codemirror/lang-javascript',
'@codemirror/lang-json': '@codemirror/lang-json',
'@codemirror/lang-sql': '@codemirror/lang-sql',
'@codemirror/lang-xml': '@codemirror/lang-xml',
'@codemirror/language': '@codemirror/language',
'@codemirror/search': '@codemirror/search',
'@codemirror/state': '@codemirror/state',
'@codemirror/view': '@codemirror/view',
'@quasar/extras': '@quasar/extras',
'@vueuse/core': '@vueuse/core',
'axios': 'axios',
'codemirror': 'codemirror',
'dayjs': 'dayjs',
'echarts': 'echarts',
'exceljs': 'exceljs',
'file-saver': 'file-saver',
'luckyexcel': 'luckyexcel',
'mockjs': 'mockjs',
'pinia': 'pinia',
'quasar': 'quasar',
'tailwindcss': 'tailwindcss',
'vue': 'vue',
'vue-dompurify-html': 'vue-dompurify-html',
'vue-i18n': 'vue-i18n',
'vue-router': 'vue-router'
}
],

1
io.sc.platform.core/build.gradle

@ -13,5 +13,6 @@ dependencies {
"org.apache.commons:commons-lang3",
"com.google.guava:guava:${guava_version}",
"com.beust:jcommander:${jcommander_version}",
"net.lingala.zip4j:zip4j:${zip4j_version}",
)
}

39
io.sc.platform.core/src/main/java/io/sc/platform/core/controller/EnumsWebController.java

@ -0,0 +1,39 @@
package io.sc.platform.core.controller;
import io.sc.platform.core.support.Option;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Method;
/**
* 系统重启控制器
* 当系统检测到需要重启时, 所有的请求都将被重定向到本控制器
*/
@RestController
@RequestMapping("/api/enums")
public class EnumsWebController {
@GetMapping("list/{lang}")
public Option[] list(@PathVariable(name = "lang",required = false) String type) throws Exception{
if(StringUtils.hasText(type)){
Class<?> clazz =Class.forName(type);
if(clazz.isEnum()){
Method method =clazz.getDeclaredMethod("values");
Enum<?>[] result =(Enum<?>[])method.invoke(null);
return convert(result);
}
}
return new Option[]{};
}
private Option<String>[] convert(Enum<?>[] enums){
Option<String>[] result =new Option[enums.length];
for(int i=0;i<enums.length;i++){
result[i] =new Option(enums[i].toString(),enums[i].getClass().getName() + "." + enums[i].toString());
}
return result;
}
}

29
io.sc.platform.core/src/main/java/io/sc/platform/core/support/Option.java

@ -0,0 +1,29 @@
package io.sc.platform.core.support;
public class Option<T> {
private T value;
private String label;
public Option(){}
public Option(T value, String label){
this.value =value;
this.label =label;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}

41
io.sc.platform.core/src/main/java/io/sc/platform/core/util/UrlUtil.java

@ -0,0 +1,41 @@
package io.sc.platform.core.util;
public class UrlUtil {
public static String standardized(String url){
return "/" + removeUrlSuffixSlash(removeUrlPrefixSlash(url)) + "/";
}
public static String concatUrl(String url1,String url2){
return removeUrlSuffixSlash(url1) + '/' + removeUrlPrefixSlash(url2);
}
public static String removeUrlPrefixSlash(String url){
if (url!=null) {
String _url = url;
while (_url.startsWith("/")) {
_url = _url.substring(1);
}
return _url;
}
return "";
}
public static String removeUrlSuffixSlash(String url){
if (url!=null) {
String _url = url;
while (_url.endsWith("/")) {
_url = _url.substring(0, _url.length() - 1);
}
return _url;
}
return "";
}
public static void main(String[] args) {
System.out.println(standardized("a/b/c/"));
System.out.println(standardized("a/b/c"));
System.out.println(standardized("/a/b/c/"));
System.out.println(standardized("/a/b/c"));
}
}

4
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties

@ -16,3 +16,7 @@ io.sc.platform.core.audit.AuditLogAction.FIND_ONE=Find One
io.sc.platform.core.audit.AuditLogAction.EXPORT=Export
io.sc.platform.core.audit.AuditLogAction.LOGIN=Login
io.sc.platform.core.audit.AuditLogAction.LOGOUT=Logout
io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587
io.sc.platform.core.enums.Language.tw_CN=\u7E41\u4F53\u4E2D\u6587

4
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties

@ -16,3 +16,7 @@ io.sc.platform.core.audit.AuditLogAction.FIND_ONE=\u67E5\u627E\u55AE\u500B
io.sc.platform.core.audit.AuditLogAction.EXPORT=\u5C0E\u51FA
io.sc.platform.core.audit.AuditLogAction.LOGIN=\u767B\u9304
io.sc.platform.core.audit.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587
io.sc.platform.core.enums.Language.tw_CN=\u7E41\u4F53\u4E2D\u6587

4
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties

@ -16,3 +16,7 @@ io.sc.platform.core.audit.AuditLogAction.FIND_ONE=\u67E5\u627E\u5355\u4E2A
io.sc.platform.core.audit.AuditLogAction.EXPORT=\u5BFC\u51FA
io.sc.platform.core.audit.AuditLogAction.LOGIN=\u767B\u5F55
io.sc.platform.core.audit.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587
io.sc.platform.core.enums.Language.tw_CN=\u7E41\u4F53\u4E2D\u6587

14
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties

@ -13,15 +13,20 @@ clone=Clone
close=Close
code=Code
confirm=Confirm
confirmPassword=Confirm Password
createDate=Create Date
creator=Creator
dataComeFrom=Data Come From
deepClone=Deep Clone
delete=Delete
description=Description
download=Download
email=Email
enable=Enable
error=Error
example=Example
expand=Expand
expandAll=Expand All
expandQueryCondition=Expand Query
export=Export
expression=Expression
@ -37,6 +42,7 @@ help=Help
homePage=Home
id=ID
import=Import
isEnable=Enable
key=Key
language=Language
last=Last
@ -45,6 +51,7 @@ lastModifyDate=Last Modify Date
lastPage=Last Page
left=Left
login=Login
loginName=Login Name
logout=Logout
millisecond=Milli Second
mobile=Mobile
@ -57,6 +64,7 @@ name=Name
next=Next
nextPage=Next Page
no=No
org=Org
password=Password
phone=Phone
pixel=px
@ -70,8 +78,12 @@ reset=Reset
restore=Restore
reverse=Reverse
right=Right
role=Role
save=Save
search=Search
select=Select
selectAll=Select All
status=Status
submit=Submit
systemAnnouncements=Announcements
test=Test
@ -82,7 +94,7 @@ top-left=Top Left
top-right=Top Right
true=True
upToTop=Up to Top
username=User Name
userName=User Name
value=Value
version=Version
weixin=WeiXin

14
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties

@ -13,15 +13,20 @@ clone=\u8907\u88FD
close=\u95DC\u9589
code=\u4EE3\u78BC
confirm=\u78BA\u5B9A
confirmPassword=\u78BA\u8A8D\u5BC6\u78BC
createDate=\u5275\u5EFA\u65E5\u671F
creator=\u5275\u5EFA\u4EBA
dataComeFrom=\u6578\u64DA\u4F86\u6E90
deepClone=\u6DF1\u5EA6\u8907\u88FD
delete=\u522A\u9664
description=\u63CF\u8FF0
download=\u4E0B\u8F09
email=\u90F5\u7BB1
enable=\u53EF\u7528
error=\u932F\u8AA4
example=\u793A\u4F8B
expand=\u5C55\u958B
expandAll=\u5168\u90E8\u5C55\u958B
expandQueryCondition=\u5C55\u958B\u67E5\u8A62\u6761\u4EF6
export=\u5C0E\u51FA
expression=\u8868\u9054\u5F0F
@ -37,6 +42,7 @@ help=\u5E6B\u52A9
homePage=\u9996\u9801
id=\u552F\u4E00\u6A19\u8B58
import=\u5C0E\u5165
isEnable=\u662F\u5426\u53EF\u7528
key=\u9375
language=\u8A9E\u8A00
last=\u6700\u5F8C
@ -45,6 +51,7 @@ lastModifyDate=\u6700\u5F8C\u4FEE\u6539\u65E5\u671F
lastPage=\u6700\u5F8C\u9801
left=\u5DE6\u908A
login=\u767B\u9304
loginName=\u767B\u9304\u540D
logout=\u9000\u51FA
millisecond=\u6BEB\u79D2
mobile=\u624B\u6A5F
@ -57,6 +64,7 @@ name=\u540D\u7A31
next=\u4E0B\u4E00
nextPage=\u4E0B\u4E00\u9801
no=\u5426
org=\u6A5F\u69CB
password=\u5BC6\u78BC
phone=\u96FB\u8A71
pixel=\u50CF\u7D20
@ -70,8 +78,12 @@ reset=\u91CD\u7F6E
restore=\u6062\u5FA9
reverse=\u53CD\u8F49
right=\u53F3\u908A
role=\u89D2\u8272
save=\u4FDD\u5B58
search=\u641C\u7D22
select=\u9078\u64C7
selectAll=\u5168\u90E8\u9078\u64C7
status=\u72C0\u614B
submit=\u63D0\u4EA4
systemAnnouncements=\u7CFB\u7D71\u516C\u544A
test=\u6E2C\u8A66
@ -82,7 +94,7 @@ top-left=\u5DE6\u4E0A
top-right=\u53F3\u4E0A
true=\u771F
upToTop=\u56DE\u5230\u9802\u90E8
username=\u7528\u6236\u540D
userName=\u7528\u6236\u540D
value=\u503C
version=\u7248\u672C
weixin=\u5FAE\u4FE1

14
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties

@ -13,15 +13,20 @@ clone=\u590D\u5236
close=\u5173\u95ED
code=\u4EE3\u7801
confirm=\u786E\u5B9A
confirmPassword=\u786E\u8BA4\u5BC6\u7801
createDate=\u521B\u5EFA\u65E5\u671F
creator=\u521B\u5EFA\u4EBA
dataComeFrom=\u6570\u636E\u6765\u6E90
deepClone=\u6DF1\u5EA6\u590D\u5236
delete=\u522A\u9664
description=\u63CF\u8FF0
download=\u4E0B\u8F7D
email=\u90AE\u7BB1
enable=\u53EF\u7528
error=\u9519\u8BEF
example=\u793A\u4F8B
expand=\u5C55\u5F00
expandAll=\u5168\u90E8\u5C55\u5F00
expandQueryCondition=\u5C55\u5F00\u67E5\u8BE2\u6761\u4EF6
export=\u5BFC\u51FA
expression=\u8868\u8FBE\u5F0F
@ -37,6 +42,7 @@ help=\u5E2E\u52A9
homePage=\u9996\u9875
id=\u552F\u4E00\u6807\u8BC6
import=\u5BFC\u5165
isEnable=\u662F\u5426\u53EF\u7528
key=\u952E
language=\u8BED\u8A00
last=\u6700\u540E
@ -45,6 +51,7 @@ lastModifyDate=\u6700\u540E\u4FEE\u6539\u65E5\u671F
lastPage=\u6700\u540E\u9875
left=\u5DE6\u8FB9
login=\u767B\u5F55
loginName=\u767B\u5F55\u540D
logout=\u9000\u51FA
millisecond=\u6BEB\u79D2
mobile=\u624B\u673A
@ -57,6 +64,7 @@ name=\u540D\u79F0
next=\u4E0B\u4E00
nextPage=\u4E0B\u4E00\u9875
no=\u5426
org=\u673A\u6784
password=\u5BC6\u7801
phone=\u7535\u8BDD
pixel=\u50CF\u7D20
@ -70,8 +78,12 @@ reset=\u91CD\u7F6E
restore=\u6062\u590D
reverse=\u53CD\u8F6C
right=\u53F3\u8FB9
role=\u89D2\u8272
save=\u4FDD\u5B58
search=\u641C\u7D22
select=\u9009\u62E9
selectAll=\u5168\u90E8\u9009\u62E9
status=\u72B6\u6001
submit=\u63D0\u4EA4
systemAnnouncements=\u7CFB\u7EDF\u516C\u544A
test=\u6D4B\u8BD5
@ -82,7 +94,7 @@ top-left=\u5DE6\u4E0A
top-right=\u53F3\u4E0A
true=\u771F
upToTop=\u56DE\u5230\u9876\u90E8
username=\u7528\u6237\u540D
userName=\u7528\u6237\u540D
value=\u503C
version=\u7248\u672C
weixin=\u5FAE\u4FE1

21
io.sc.platform.developer.doc/asciidoc/9999-appendix/docker/opengauss/opengauss.adoc

@ -0,0 +1,21 @@
== opengauss
=== docker compose
[source,bash]
----
version: '3'
services:
opengauss:
privileged: true
image: enmotech/opengauss:latest
container_name: opengauss
environment:
- GS_PASSWORD=opengauss
- TZ=Asia/Shanghai
ports:
- "5432:5432"
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
----

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

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.developer.frontend",
"version": "8.1.9",
"version": "8.1.11",
"description": "",
"private": false,
"keywords": [
@ -79,13 +79,26 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.16",
"platform-core": "8.1.27",
"quasar": "2.13.0",
"tailwindcss": "3.3.5",
"vue": "3.3.7",
"vue-dompurify-html": "4.1.4",
"vue-i18n": "9.6.0",
"vue-router": "4.2.5",
"platform-components": "8.1.2"
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.2",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.9.3",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.3.3",
"@codemirror/view": "6.22.1",
"codemirror": "6.0.1",
"vue-codemirror6": "1.1.31"
}
}

34
io.sc.platform.developer.frontend/public/index.html

@ -6,10 +6,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- luckysheet css -->
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css' th:href="@{/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/plugins/plugins.css' th:href="@{/webjars/luckysheet/2.1.13/plugins/plugins.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/css/luckysheet.css' th:href="@{/webjars/luckysheet/2.1.13/css/luckysheet.css}"/>
<link rel='stylesheet' href='/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css' th:href="@{/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css" th:href="@{/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/plugins/plugins.css" th:href="@{/webjars/luckysheet/2.1.13/plugins/plugins.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/css/luckysheet.css" th:href="@{/webjars/luckysheet/2.1.13/css/luckysheet.css}"/>
<link rel="stylesheet" href="/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css" th:href="@{/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css}"/>
<!-- luckysheet js -->
<script src="/webjars/luckysheet/2.1.13/plugins/js/plugin.js" th:src="@{/webjars/luckysheet/2.1.13/plugins/js/plugin.js}"></script>
@ -18,31 +18,7 @@
<!-- tailwindcss js -->
<script src="/webjars/tailwindcss/3.3.5/tailwindcss.js" th:src="@{/webjars/tailwindcss/3.3.5/tailwindcss.js}"></script>
<script>
window.APP = {}; // 在浏览器 window 对象中新建名为 APP 的变量, 用于存放应用对象的容器
window.APP.actions ={}; // 全局 Action 存储容器
window.APP.layoutProviders ={}; // 全局布局提供者存储容器
window.APP.configure ={ // 全局配置存储容器
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 应用上下文路径
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[') ? 'http://localhost:8080/' : '[(@{/})]', // 后端 API 请求的服务地址前缀
},
enableLocalMock: false, // 是否启用本地 mock
localMockTimeout: 10, // mock 请求响应时间(单位:毫秒)
enableRemoteConfigure: true, // 是否启用使用远程服务端配置
useLocaleRouterFirst: true, // 是否首先使用本地路由
axios: {
baseURL: '',
timeout: 1000 * 60,
crossdomain: true,
basicAuth: {
enable: true,
username: 'admin',
password: 'admin',
},
},
}
</script>
<script src="/configure.js" th:src="@{/configure.js}"></script>
</head>
<body>
<noscript>

14
io.sc.platform.developer.frontend/webpack.config.mf.cjs

@ -31,8 +31,21 @@ module.exports = {
exposes: mfExposes,
// 模块联邦共享库
shared: {
'@codemirror/autocomplete': { requiredVersion: deps['@codemirror/autocomplete'], singleton: true },
'@codemirror/commands': { requiredVersion: deps['@codemirror/commands'], singleton: true },
'@codemirror/lang-html': { requiredVersion: deps['@codemirror/lang-html'], singleton: true },
'@codemirror/lang-java': { requiredVersion: deps['@codemirror/lang-java'], singleton: true },
'@codemirror/lang-javascript': { requiredVersion: deps['@codemirror/lang-javascript'], singleton: true },
'@codemirror/lang-json': { requiredVersion: deps['@codemirror/lang-json'], singleton: true },
'@codemirror/lang-sql': { requiredVersion: deps['@codemirror/lang-sql'], singleton: true },
'@codemirror/lang-xml': { requiredVersion: deps['@codemirror/lang-xml'], singleton: true },
'@codemirror/language': { requiredVersion: deps['@codemirror/language'], singleton: true },
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },
'dayjs': { requiredVersion: deps['dayjs'], singleton: true },
'echarts':{ requiredVersion: deps['echarts'], singleton: true },
'exceljs':{ requiredVersion: deps['exceljs'], singleton: true },
@ -43,6 +56,7 @@ module.exports = {
'platform-core': { requiredVersion: deps['platform-core'], singleton: true },
'quasar': { requiredVersion: deps['quasar'], singleton: true },
'vue': { requiredVersion: deps['vue'], singleton: true },
'vue-codemirror6': { requiredVersion: deps['vue-codemirror6'], singleton: true },
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true },

54
io.sc.platform.flowable/README.adoc

@ -0,0 +1,54 @@
= 简介
== 模块说明
[source,bash]
----
io.sc.platform.flowable
\--- src
\--- main
|--- java
\--- resources
|--- flowable-modeler <1>
|--- io
| \--- sc
| \--- platform
| \--- flowable
| |--- sample <2>
| \--- stencilsets <3>
|--- liquibase <4>
|--- liquibase.postgres
|--- META-INF
|--- platform
| \--- plugins
\--- services
----
<1> 流程设计器前端, 来自于 flowable-6.8.0.zip/wars/flowable-ui.war/flowable-ui-modeler-frontend-6.8.0.jar/static/modeler, 并对其进行了部分修改
<2> 示例流程定义
<3> stencilsets 文字模版
<4> 用于创建 flowable 数据库表结构
== 修改内容模块说明
[source,bash]
----
io.sc.platform.flowable
\--- flowable-modeler
|--- index.html <1>
|--- editor-app
| |--- editor-controller.js <2>
| |--- configuration
| | \--- flowable-toolbar-custom-actions.js <3>
| \--- popus
| \--- save-model.html <4>
|--- i18n
| |--- zh-CN.json <5>
| \--- zh-TW.json <6>
\--- styles
\--- common
\--- style.css <7>
----
<1> 流程设计器主页面
<2> 编辑器控制器(修改 http 请求头,)
<3> 自定义工具栏按钮(移除了关闭按钮)
<4> 修改了保存按钮弹出对话框元素
<5> 补充了部分未翻译的项
<6> 补充了部分未翻译的项
<7> 修改了部分样式

7
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/AgentWebController.java

@ -12,19 +12,19 @@ import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/system/agent")
@RequestMapping("/api/flowable/agent")
public class AgentWebController extends RestCrudController<Agent,String, AgentRepository, AgentService> {
@GetMapping("getAvailableAgent")
public List<UserVo> getAvailableAgent() throws Exception{
return service.listAvailableAgentByUserId(SecurityUtil.getUserId());
}
@PostMapping("isc/agree/{id}")
@PostMapping("agree/{id}")
public Agent agree(@PathVariable(name="id")String id){
return service.agree(id);
}
@PostMapping("isc/reject/{id}")
@PostMapping("reject/{id}")
public Agent reject(@PathVariable(name="id")String id,@RequestBody Map<String,String> data){
String comments =null;
if(data!=null) {
@ -32,5 +32,4 @@ public class AgentWebController extends RestCrudController<Agent,String, AgentRe
}
return service.reject(id,comments);
}
}

64
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/FlowableModelerEditorWebController.java

@ -5,6 +5,7 @@ import java.util.Locale;
import java.util.Map;
import io.sc.platform.core.Environment;
import io.sc.platform.core.annotation.IgnoreResponseBodyAdvice;
import io.sc.platform.core.util.LocaleUtil;
import io.sc.platform.flowable.service.FlowableModelerService;
import io.sc.platform.flowable.support.BpmnModelWrapper;
@ -18,6 +19,7 @@ import io.sc.platform.system.role.service.RoleService;
import io.sc.platform.system.user.convertor.UserEntityVoConverter;
import io.sc.platform.system.user.jpa.entity.UserEntity;
import io.sc.platform.system.user.service.UserService;
import liquibase.pro.packaged.G;
import org.apache.commons.io.IOUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.editor.language.json.converter.BpmnJsonConverter;
@ -31,12 +33,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import com.fasterxml.jackson.databind.JsonNode;
@ -47,50 +44,33 @@ import javax.persistence.criteria.Join;
* @author wangshaoping
*
*/
@Controller
@RequestMapping("/flowable-modeler")
@RestController
@RequestMapping("/api/flowable/rest")
public class FlowableModelerEditorWebController {
@Autowired private FlowableModelerService flowableModelerService;
@Autowired private UserService userService;
@Autowired private RoleService roleService;
@RequestMapping(value="editor.html")
public String html() {
return "org/wsp/framework/flowable/view/flowable-modeler-editor.html";
}
/**
* 获取当前登录用户信息
* @param locale 区域
* @return 当前登录用户信息
* @throws Exception 违例
*/
@RequestMapping(value = "app/rest/account", method = RequestMethod.GET)
@ResponseBody
public FlowableUser account(Locale locale) throws Exception{
@GetMapping("account")
@IgnoreResponseBodyAdvice
public FlowableUser account() throws Exception{
return FlowableUser.currentLoginUser();
}
/**
* 获取流程编辑器界面模板
* @param locale 区域
* @return 流程编辑器界面模板
* @throws Exception 违例
*/
@RequestMapping(value = "app/rest/stencil-sets/editor", method = RequestMethod.GET)
@ResponseBody
public String stencilsets(Locale locale) throws Exception{
String[] candidateCodes = LocaleUtil.getCandidateCode(locale);
Resource rs =null;
for(String candidateCode : candidateCodes){
rs =new DefaultResourceLoader().getResource("classpath:/org/wsp/framework/flowable/controller/stencilsets_" + candidateCode + ".json");
if(rs.exists()){
break;
}
}
if(!rs.exists()) {
rs =new DefaultResourceLoader().getResource("classpath:/org/wsp/framework/flowable/controller/stencilsets.json");
}
@GetMapping("stencil-sets/editor")
@IgnoreResponseBodyAdvice
public String stencilsets() throws Exception{
Resource rs =new DefaultResourceLoader().getResource("classpath:/io/sc/platform/flowable/stencilsets/editor.json");
return IOUtils.toString(rs.getInputStream(), Environment.DEFAULT_CHARSET_NAME);
}
@ -100,8 +80,8 @@ public class FlowableModelerEditorWebController {
* @return 流程定义 json
* @throws Exception 违例
*/
@RequestMapping(value="app/rest/models/{id}/editor/json", method = RequestMethod.GET)
@ResponseBody
@GetMapping("models/{id}/editor/json")
@IgnoreResponseBodyAdvice
public BpmnModelWrapper getEditorJson(@PathVariable("id") String id) throws Exception{
return flowableModelerService.getModelJson(id);
}
@ -112,8 +92,8 @@ public class FlowableModelerEditorWebController {
* @param values 客户端提交的流程定义对象
* @throws Exception 违例
*/
@RequestMapping(value="app/rest/models/{id}/editor/json", method = RequestMethod.POST)
@ResponseBody
@PostMapping("models/{id}/editor/json")
@IgnoreResponseBodyAdvice
public void saveModel(@PathVariable String id,@RequestParam Map<String, String> values) throws Exception{
flowableModelerService.saveModelJson(id, values);
}
@ -123,8 +103,8 @@ public class FlowableModelerEditorWebController {
* @param body 流程定义体
* @return 验证错误列表
*/
@RequestMapping(value = "app/rest/model/validate",method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@PostMapping("model/validate")
@IgnoreResponseBodyAdvice
public List<ValidationError> validate(@RequestBody JsonNode body){
BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(body);
ProcessValidator validator = new ProcessValidatorFactory().createDefaultProcessValidator();
@ -138,8 +118,8 @@ public class FlowableModelerEditorWebController {
* @return 符合 filter 条件的用户列表
* @throws Exception 违例
*/
@RequestMapping(value = "app/rest/editor-users",method=RequestMethod.GET)
@ResponseBody
@GetMapping("editor-users")
@IgnoreResponseBodyAdvice
public FlowableUserList editorUsers(@RequestParam(name="filter",required=false) String filter,QueryParameter queryParameter) throws Exception{
Specification<UserEntity> specification = (root, query, criteriaBuilder) -> {
return criteriaBuilder.like(root.get("loginName"),filter);
@ -154,8 +134,8 @@ public class FlowableModelerEditorWebController {
* @return 符合 filter 条件的角色列表
* @throws Exception 违例
*/
@RequestMapping(value = "app/rest/editor-groups",method=RequestMethod.GET)
@ResponseBody
@GetMapping("editor-groups")
@IgnoreResponseBodyAdvice
public FlowableGroupList editorGroups(@RequestParam(name="filter",required=false) String filter,QueryParameter queryParameter) throws Exception{
Page<RoleEntity> roleEntities =roleService.queryRolesByCodeOrName(filter,queryParameter);
return FlowableGroupList.fromGroups(new RoleEntityVoConverter().toVo(roleEntities));

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/ProcessEntityWebController.java

@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/system/process")
@RequestMapping("/api/flowable/process")
public class ProcessEntityWebController extends RestCrudController<ProcessEntity,String, ProcessEntityRepository, ProcessEntityService> {
@PostMapping("deploy/{id}")
public void deploy(@PathVariable(name="id") String id) throws Exception{

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/ProcessOperationWebController.java

@ -12,7 +12,7 @@ import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/system/process/operation")
@RequestMapping("/api/flowable/process/operation")
public class ProcessOperationWebController {
@Autowired private ProcessOperationService processOperationService;

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/ProcessQueryWebController.java

@ -14,7 +14,7 @@ import java.io.InputStream;
import java.util.List;
@RestController
@RequestMapping("/api/system/process/query")
@RequestMapping("/api/flowable/process/query")
public class ProcessQueryWebController {
@Autowired private ProcessQueryService service;

4
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/support/ProcessStatus.java → io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/enums/ProcessStatus.java

@ -1,4 +1,4 @@
package io.sc.platform.flowable.support;
package io.sc.platform.flowable.enums;
/**
* 流程定义状态
@ -8,5 +8,5 @@ package io.sc.platform.flowable.support;
public enum ProcessStatus {
HISTORY, //历史
RELEASE, //发布
SKETCH //草稿
SKETCH; //草稿
}

1
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/initializer/SampleWorkFlowSystemDictionaryInitializer.java

@ -46,6 +46,7 @@ public class SampleWorkFlowSystemDictionaryInitializer implements ApplicationIni
item.setCode("WORK_FLOW");
item.setValue("SAMPLE");
item.setOrder(0);
item.setCorporationCode("_PRIMARY_");
dictionaryService.getRepository().save(item);
}
}

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/entity/ProcessEntity.java

@ -12,7 +12,7 @@ import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import io.sc.platform.flowable.support.ProcessStatus;
import io.sc.platform.flowable.enums.ProcessStatus;
import io.sc.platform.orm.converter.NumericBooleanConverter;
import io.sc.platform.orm.entity.AuditorEntity;
import org.hibernate.annotations.GenericGenerator;

2
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/jpa/repository/ProcessEntityRepository.java

@ -1,7 +1,7 @@
package io.sc.platform.flowable.jpa.repository;
import io.sc.platform.flowable.jpa.entity.ProcessEntity;
import io.sc.platform.flowable.support.ProcessStatus;
import io.sc.platform.flowable.enums.ProcessStatus;
import io.sc.platform.orm.repository.DaoRepository;
import java.util.List;

7
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/service/impl/ProcessEntityServiceImpl.java

@ -6,7 +6,7 @@ import io.sc.platform.core.Environment;
import io.sc.platform.flowable.jpa.entity.ProcessEntity;
import io.sc.platform.flowable.jpa.repository.ProcessEntityRepository;
import io.sc.platform.flowable.service.ProcessEntityService;
import io.sc.platform.flowable.support.ProcessStatus;
import io.sc.platform.flowable.enums.ProcessStatus;
import io.sc.platform.flowable.util.BpmnConverterUtil;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import org.apache.commons.io.IOUtils;
@ -25,7 +25,6 @@ import org.springframework.util.StringUtils;
public class ProcessEntityServiceImpl extends DaoServiceImpl<ProcessEntity, String, ProcessEntityRepository> implements ProcessEntityService {
@Autowired private RepositoryService repositoryService;
@Override
public boolean canClaimTask(String deployedId) {
ProcessEntity entity =repository.findByDeployedId(deployedId);
@ -74,12 +73,12 @@ public class ProcessEntityServiceImpl extends DaoServiceImpl<ProcessEntity, Stri
public Resource getSampleResource(String category){
ResourceLoader resourceLoader =new DefaultResourceLoader();
if(StringUtils.hasText(category)){
Resource rs =resourceLoader.getResource("classpath:/io/sc/platform/flowable/sample/" + category + ".bpmn");
Resource rs =resourceLoader.getResource("classpath:/io/sc/platform/flowable/sample/" + category + ".bpmn20.xml");
if(rs.exists()){
return rs;
}
}
return resourceLoader.getResource("classpath:/io/sc/platform/flowable/sample/Sample.bpmn");
return resourceLoader.getResource("classpath:/io/sc/platform/flowable/sample/Sample.bpmn20.xml");
}
@Override

4
io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/components.json

@ -2,8 +2,6 @@
"includes":[
"io.sc.platform.flowable.controller",
"io.sc.platform.flowable.service.impl",
"io.sc.platform.flowable.extension.listener.task",
"io.sc.platform.flowable.initializer",
"io.sc.platform.flowable.installer"
"io.sc.platform.flowable.extension.listener.task"
]
}

5
io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/messages.json

@ -0,0 +1,5 @@
{
"includes":[
"io/sc/platform/flowable/i18n/enums"
]
}

3
io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/resources.json

@ -1,3 +0,0 @@
[
{"handler":"/flowable-modeler/**" ,"location":"classpath:/flowable-modeler/"}
]

3
io.sc.platform.flowable/src/main/resources/META-INF/platform/plugins/security.json

@ -1,6 +1,5 @@
{
"permitPatterns":[
"/flowable-modeler/editor.html", /**/
"/flowable-modeler/editor-app/**", /**/
"/io.sc.platform.lcdp.frontend/flowable/**" /**/
]
}

157
io.sc.platform.flowable/src/main/resources/flowable-modeler/404.html

@ -1,157 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Page Not Found :(</title>
<style>
::-moz-selection {
background: #b3d4fc;
text-shadow: none;
}
::selection {
background: #b3d4fc;
text-shadow: none;
}
html {
padding: 30px 10px;
font-size: 20px;
line-height: 1.4;
color: #737373;
background: #f0f0f0;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
html,
input {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
body {
max-width: 500px;
_width: 500px;
padding: 30px 20px 50px;
border: 1px solid #b3b3b3;
border-radius: 4px;
margin: 0 auto;
box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;
background: #fcfcfc;
}
h1 {
margin: 0 10px;
font-size: 50px;
text-align: center;
}
h1 span {
color: #bbb;
}
h3 {
margin: 1.5em 0 0.5em;
}
p {
margin: 1em 0;
}
ul {
padding: 0 0 0 40px;
margin: 1em 0;
}
.container {
max-width: 380px;
_width: 380px;
margin: 0 auto;
}
/* google search */
#goog-fixurl ul {
list-style: none;
padding: 0;
margin: 0;
}
#goog-fixurl form {
margin: 0;
}
#goog-wm-qt,
#goog-wm-sb {
border: 1px solid #bbb;
font-size: 16px;
line-height: normal;
vertical-align: top;
color: #444;
border-radius: 2px;
}
#goog-wm-qt {
width: 220px;
height: 20px;
padding: 5px;
margin: 5px 10px 0 0;
box-shadow: inset 0 1px 1px #ccc;
}
#goog-wm-sb {
display: inline-block;
height: 32px;
padding: 0 10px;
margin: 5px 0 0;
white-space: nowrap;
cursor: pointer;
background-color: #f5f5f5;
background-image: -webkit-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -moz-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -ms-linear-gradient(rgba(255,255,255,0), #f1f1f1);
background-image: -o-linear-gradient(rgba(255,255,255,0), #f1f1f1);
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
*overflow: visible;
*display: inline;
*zoom: 1;
}
#goog-wm-sb:hover,
#goog-wm-sb:focus {
border-color: #aaa;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
background-color: #f8f8f8;
}
#goog-wm-qt:hover,
#goog-wm-qt:focus {
border-color: #105cb6;
outline: 0;
color: #222;
}
input::-moz-focus-inner {
padding: 0;
border: 0;
}
</style>
</head>
<body>
<div class="container">
<h1>Not found <span>:(</span></h1>
<p>Sorry, but the page you were trying to view does not exist.</p>
<p>It looks like this was the result of either:</p>
<ul>
<li>a mistyped address</li>
<li>an out-of-date link</li>
</ul>
<script>
var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host;
</script>
<script src="//linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script>
</div>
</body>
</html>

9
io.sc.platform.flowable/src/main/resources/flowable-modeler/browserconfig.xml

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="images/mstile-150x150.png?v=Om5N75Y123"/>
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>

512
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/cmmn-draw.js

@ -1,512 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function _cmmnGetColor(element, defaultColor)
{
var strokeColor;
if(element.current) {
strokeColor = CURRENT_COLOR;
} else if(element.completed) {
strokeColor = COMPLETED_COLOR;
} else {
strokeColor = defaultColor;
}
return strokeColor;
}
function _drawPlanModel(planModel)
{
var rect = paper.rect(planModel.x, planModel.y, planModel.width, planModel.height);
rect.attr({"stroke-width": 1,
"stroke": "#000000",
"fill": "white"
});
if (planModel.name)
{
var planModelName = paper.text(planModel.x + 14, planModel.y + (planModel.height / 2), planModel.name).attr({
"text-anchor" : "middle",
"font-family" : "Arial",
"font-size" : "12",
"fill" : "#000000"
});
planModelName.transform("r270");
}
}
function _drawSubProcess(element)
{
var rect = paper.rect(element.x, element.y, element.width, element.height, 4);
var strokeColor = _cmmnGetColor(element, MAIN_STROKE_COLOR);
rect.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "white"
});
}
function _drawServiceTaskTypeIcon(element)
{
_drawTask(element);
if (element.taskType === "mail")
{
_drawSendTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "camel")
{
_drawCamelTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "mule")
{
_drawMuleTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "http")
{
_drawHttpTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.stencilIconId)
{
paper.image("../service/stencilitem/" + element.stencilIconId + "/icon", element.x + 4, element.y + 4, 16, 16);
}
else
{
_drawServiceTaskIcon(paper, element.x + 4, element.y + 4);
}
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawHttpServiceTask(element)
{
_drawTask(element);
_drawHttpTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawHumanTask(element)
{
_drawTask(element);
_drawHumanTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawCaseTask(element)
{
_drawTask(element);
_drawCaseTaskIcon(paper, element.x + 1, element.y + 1);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawProcessTask(element)
{
_drawTask(element);
_drawProcessTaskIcon(paper, element.x + 1, element.y + 1);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawScriptTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 5,2 0,0.094 c 0.23706,0.064 0.53189,0.1645 0.8125,0.375 0.5582,0.4186 1.05109,1.228 1.15625,2.5312 l 8.03125,0 1,0 1,0 c 0,-3 -2,-3 -2,-3 l -10,0 z M 4,3 4,13 2,13 c 0,3 2,3 2,3 l 9,0 c 0,0 2,0 2,-3 L 15,6 6,6 6,5.5 C 6,4.1111 5.5595,3.529 5.1875,3.25 4.8155,2.971 4.5,3 4.5,3 L 4,3 z");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#72a7d0"
});
var scriptTaskIcon = paper.set();
scriptTaskIcon.push(path1);
scriptTaskIcon.transform("T" + startX + "," + startY);
}
function _drawScriptServiceTask(element)
{
_drawTask(element);
_drawScriptTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawSendEventServiceTask(element)
{
_drawTask(element);
_drawSendTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawExternalWorkerServiceTask(element)
{
_drawTask(element);
_drawServiceTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawDecisionTask(element)
{
_drawTask(element);
_drawDecisionTaskIcon(paper, element.x + 1, element.y + 1);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawServiceTask(element)
{
_drawTask(element);
_drawServiceTaskTypeIcon(element);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawTask(element)
{
var rectAttrs = {};
// Stroke
var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR);
rectAttrs['stroke'] = strokeColor;
var strokeWidth;
if (strokeColor === ACTIVITY_STROKE_COLOR) {
strokeWidth = TASK_STROKE;
} else {
strokeWidth = TASK_HIGHLIGHT_STROKE;
}
var width = element.width - (strokeWidth / 2);
var height = element.height - (strokeWidth / 2);
var rect = paper.rect(element.x, element.y, width, height, 4);
rectAttrs['stroke-width'] = strokeWidth;
// Fill
rectAttrs['fill'] = ACTIVITY_FILL_COLOR;
rect.attr(rectAttrs);
rect.id = element.id;
if (element.name) {
this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11);
}
}
function _drawTimerEventListener(element)
{
_drawEventListener(element);
_drawTimerEventListenerIcon(paper, element);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawUserEventListener(element)
{
_drawEventListener(element);
_drawUserEventListenerIcon(paper, element);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawVariableEventListener(element)
{
_drawEventListener(element);
_drawVariableEventListenerIcon(paper, element);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawGenericEventListener(element)
{
_drawEventListener(element);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawEventListener(element)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 15);
circle.attr({"stroke-width": 1,
"stroke": "black",
"fill": "white"
});
circle.id = element.id;
}
function _drawMilestone(element)
{
var rectAttrs = {};
// Stroke
var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR);
rectAttrs['stroke'] = strokeColor;
var strokeWidth;
if (strokeColor === ACTIVITY_STROKE_COLOR) {
strokeWidth = TASK_STROKE;
} else {
strokeWidth = TASK_HIGHLIGHT_STROKE;
}
var width = element.width - (strokeWidth / 2);
var height = element.height - (strokeWidth / 2);
var rect = paper.rect(element.x, element.y, width, height, 24);
rectAttrs['stroke-width'] = strokeWidth;
// Fill
rectAttrs['fill'] = WHITE_FILL_COLOR;
rect.attr(rectAttrs);
rect.id = element.id;
if (element.name) {
this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11);
}
}
function _drawStage(element)
{
var rectAttrs = {};
// Stroke
var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR);
rectAttrs['stroke'] = strokeColor;
var strokeWidth;
if (strokeColor === ACTIVITY_STROKE_COLOR) {
strokeWidth = TASK_STROKE;
} else {
strokeWidth = TASK_HIGHLIGHT_STROKE;
}
var width = element.width - (strokeWidth / 2);
var height = element.height - (strokeWidth / 2);
var rect = paper.rect(element.x, element.y, width, height, 16);
rectAttrs['stroke-width'] = strokeWidth;
// Fill
rectAttrs['fill'] = WHITE_FILL_COLOR;
rect.attr(rectAttrs);
rect.id = element.id;
if (element.name) {
this._drawMultilineText(element.name, element.x + 10, element.y + 5, element.width, element.height, "start", "top", 11);
}
}
function _drawPlanModel(element)
{
var rectAttrs = {};
// Stroke
var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR);
rectAttrs['stroke'] = strokeColor;
var strokeWidth;
if (strokeColor === ACTIVITY_STROKE_COLOR) {
strokeWidth = TASK_STROKE;
} else {
strokeWidth = TASK_HIGHLIGHT_STROKE;
}
var width = element.width - (strokeWidth / 2);
var height = element.height - (strokeWidth / 2);
var rect = paper.rect(element.x, element.y, width, height, 4);
rectAttrs['stroke-width'] = strokeWidth;
// Fill
rectAttrs['fill'] = WHITE_FILL_COLOR;
rect.attr(rectAttrs);
rect.id = element.id;
var path1 = paper.path("M20 55 L37 34 L275 34 L291 55");
path1.attr({
"opacity": 1,
"stroke": strokeColor,
"fill": "#ffffff"
});
var planModelHeader = paper.set();
planModelHeader.push(path1);
planModelHeader.translate(element.x, element.y - 55);
if (element.name) {
this._drawMultilineText(element.name, element.x + 10, element.y - 16, 275, element.height, "middle", "top", 11);
}
}
function _drawEntryCriterion(element)
{
var strokeColor = _cmmnGetColor(element, MAIN_STROKE_COLOR);
var rhombus = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) +
"L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + element.y + "z"
);
// Fill
var gatewayFillColor = WHITE_FILL_COLOR;
// Opacity
var gatewayOpacity = 1.0;
rhombus.attr("stroke-width", 1);
rhombus.attr("stroke", strokeColor);
rhombus.attr("fill", gatewayFillColor);
rhombus.attr("fill-opacity", gatewayOpacity);
rhombus.id = element.id;
}
function _drawExitCriterion(element)
{
var strokeColor = _cmmnGetColor(element, MAIN_STROKE_COLOR);
var rhombus = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) +
"L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + element.y + "z"
);
// Fill
var gatewayFillColor = '#000000';
// Opacity
var gatewayOpacity = 1.0;
rhombus.attr("stroke-width", 1);
rhombus.attr("stroke", strokeColor);
rhombus.attr("fill", gatewayFillColor);
rhombus.attr("fill-opacity", gatewayOpacity);
rhombus.id = element.id;
}
function _drawMultilineText(text, x, y, boxWidth, boxHeight, horizontalAnchor, verticalAnchor, fontSize)
{
if (!text || text == "")
{
return;
}
var textBoxX, textBoxY;
var width = boxWidth - (2 * TEXT_PADDING);
if (horizontalAnchor === "middle")
{
textBoxX = x + (boxWidth / 2);
}
else if (horizontalAnchor === "start")
{
textBoxX = x;
}
textBoxY = y + (boxHeight / 2);
var t = paper.text(textBoxX + TEXT_PADDING, textBoxY + TEXT_PADDING).attr({
"text-anchor" : horizontalAnchor,
"font-family" : "Arial",
"font-size" : fontSize,
"fill" : "#373e48"
});
var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
t.attr({
"text" : abc
});
var letterWidth = t.getBBox().width / abc.length;
t.attr({
"text" : text
});
var removedLineBreaks = text.split("\n");
var x = 0, s = [];
for (var r = 0; r < removedLineBreaks.length; r++)
{
var words = removedLineBreaks[r].split(" ");
for ( var i = 0; i < words.length; i++) {
var l = words[i].length;
if (x + (l * letterWidth) > width) {
s.push("\n");
x = 0;
}
x += l * letterWidth;
s.push(words[i] + " ");
}
s.push("\n");
x = 0;
}
t.attr({
"text" : s.join("")
});
if (verticalAnchor && verticalAnchor === "top")
{
t.attr({"y": y + (t.getBBox().height / 2)});
}
}
function _drawAssociation(flow){
var polyline = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper);
polyline.element = paper.path(polyline.path);
polyline.element.attr({"stroke-width": ASSOCIATION_STROKE});
polyline.element.attr({"stroke-dasharray": ". "});
polyline.element.attr({"stroke":"#585858"});
polyline.element.id = flow.id;
var polylineInvisible = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper);
polylineInvisible.element = paper.path(polyline.path);
polylineInvisible.element.attr({
"opacity": 0,
"stroke-width": 8,
"stroke" : "#000000"
});
_showTip(jQuery(polylineInvisible.element.node), flow);
polylineInvisible.element.mouseover(function() {
paper.getById(polyline.element.id).attr({"stroke":"blue"});
});
polylineInvisible.element.mouseout(function() {
paper.getById(polyline.element.id).attr({"stroke":"#585858"});
});
}
function _drawArrowHead(line, connectionType)
{
var doubleArrowWidth = 2 * ARROW_WIDTH;
var arrowHead = paper.path("M0 0L-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2 + .5) + " -" + doubleArrowWidth + "z");
// anti smoothing
if (this.strokeWidth%2 == 1)
line.x2 += .5, line.y2 += .5;
arrowHead.transform("t" + line.x2 + "," + line.y2 + "");
arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0);
arrowHead.attr("fill", "#585858");
arrowHead.attr("stroke-width", SEQUENCEFLOW_STROKE);
arrowHead.attr("stroke", "#585858");
return arrowHead;
}

216
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/cmmn-icons.js

@ -1,216 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function _drawHumanTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#d1b575"
});
var userTaskIcon = paper.set();
userTaskIcon.push(path1);
userTaskIcon.transform("T" + startX + "," + startY);
}
function _drawServiceTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M 8,1 7.5,2.875 c 0,0 -0.02438,0.250763 -0.40625,0.4375 C 7.05724,3.330353 7.04387,3.358818 7,3.375 6.6676654,3.4929791 6.3336971,3.6092802 6.03125,3.78125 6.02349,3.78566 6.007733,3.77681 6,3.78125 5.8811373,3.761018 5.8125,3.71875 5.8125,3.71875 l -1.6875,-1 -1.40625,1.4375 0.96875,1.65625 c 0,0 0.065705,0.068637 0.09375,0.1875 0.002,0.00849 -0.00169,0.022138 0,0.03125 C 3.6092802,6.3336971 3.4929791,6.6676654 3.375,7 3.3629836,7.0338489 3.3239228,7.0596246 3.3125,7.09375 3.125763,7.4756184 2.875,7.5 2.875,7.5 L 1,8 l 0,2 1.875,0.5 c 0,0 0.250763,0.02438 0.4375,0.40625 0.017853,0.03651 0.046318,0.04988 0.0625,0.09375 0.1129372,0.318132 0.2124732,0.646641 0.375,0.9375 -0.00302,0.215512 -0.09375,0.34375 -0.09375,0.34375 L 2.6875,13.9375 4.09375,15.34375 5.78125,14.375 c 0,0 0.1229911,-0.09744 0.34375,-0.09375 0.2720511,0.147787 0.5795915,0.23888 0.875,0.34375 0.033849,0.01202 0.059625,0.05108 0.09375,0.0625 C 7.4756199,14.874237 7.5,15.125 7.5,15.125 L 8,17 l 2,0 0.5,-1.875 c 0,0 0.02438,-0.250763 0.40625,-0.4375 0.03651,-0.01785 0.04988,-0.04632 0.09375,-0.0625 0.332335,-0.117979 0.666303,-0.23428 0.96875,-0.40625 0.177303,0.0173 0.28125,0.09375 0.28125,0.09375 l 1.65625,0.96875 1.40625,-1.40625 -0.96875,-1.65625 c 0,0 -0.07645,-0.103947 -0.09375,-0.28125 0.162527,-0.290859 0.262063,-0.619368 0.375,-0.9375 0.01618,-0.04387 0.04465,-0.05724 0.0625,-0.09375 C 14.874237,10.52438 15.125,10.5 15.125,10.5 L 17,10 17,8 15.125,7.5 c 0,0 -0.250763,-0.024382 -0.4375,-0.40625 C 14.669647,7.0572406 14.641181,7.0438697 14.625,7 14.55912,6.8144282 14.520616,6.6141566 14.4375,6.4375 c -0.224363,-0.4866 0,-0.71875 0,-0.71875 L 15.40625,4.0625 14,2.625 l -1.65625,1 c 0,0 -0.253337,0.1695664 -0.71875,-0.03125 l -0.03125,0 C 11.405359,3.5035185 11.198648,3.4455201 11,3.375 10.95613,3.3588185 10.942759,3.3303534 10.90625,3.3125 10.524382,3.125763 10.5,2.875 10.5,2.875 L 10,1 8,1 z m 1,5 c 1.656854,0 3,1.3431458 3,3 0,1.656854 -1.343146,3 -3,3 C 7.3431458,12 6,10.656854 6,9 6,7.3431458 7.3431458,6 9,6 z");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#72a7d0"
});
var serviceTaskIcon = paper.set();
serviceTaskIcon.push(path1);
serviceTaskIcon.transform("T" + startX + "," + startY);
}
function _drawCaseTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M5 8 L9 4 L18 4 L 21 7");
path1.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#000000"
});
var path2 = paper.path("M1 23 L1 4 L30 4 L30 23z");
path2.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#F4F6F7"
});
var caseTaskIcon = paper.set();
caseTaskIcon.push(path1);
caseTaskIcon.push(path2);
caseTaskIcon.translate(startX, startY);
caseTaskIcon.scale(0.7, 0.7);
}
function _drawProcessTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M1 23 L7 11 L1 0 L30 0 L 35 11 L 30 23z");
path1.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#F4F6F7"
});
var processTaskIcon = paper.set();
processTaskIcon.push(path1);
processTaskIcon.translate(startX, startY);
processTaskIcon.scale(0.7, 0.7);
}
function _drawSendTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M 1 3 L 9 11 L 17 3 L 1 3 z M 1 5 L 1 13 L 5 9 L 1 5 z M 17 5 L 13 9 L 17 13 L 17 5 z M 6 10 L 1 15 L 17 15 L 12 10 L 9 13 L 6 10 z");
path1.attr({
"stroke": "none",
"fill": "#16964d"
});
var sendTaskIcon = paper.set();
sendTaskIcon.push(path1);
sendTaskIcon.transform("T" + startX + "," + startY);
}
function _drawDecisionTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.9,2.4000386 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z");
path1.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#F4F6F7"
});
var decisionTaskIcon = paper.set();
decisionTaskIcon.push(path1);
decisionTaskIcon.translate(startX, startY);
decisionTaskIcon.scale(0.7, 0.7);
}
function _drawHttpTaskIcon(paper, startX, startY)
{
var path = paper.path("m 16.704699,5.9229055 q 0.358098,0 0.608767,0.2506681 0.250669,0.250668 0.250669,0.6087677 0,0.3580997 -0.250669,0.6087677 -0.250669,0.2506679 -0.608767,0.2506679 -0.358098,0 -0.608767,-0.2506679 -0.250669,-0.250668 -0.250669,-0.6087677 0,-0.3580997 0.250669,-0.6087677 0.250669,-0.2506681 0.608767,-0.2506681 z m 2.578308,-2.0053502 q -2.229162,0 -3.854034,0.6759125 -1.624871,0.6759067 -3.227361,2.2694472 -0.716197,0.725146 -1.575633,1.7457293 L 7.2329969,8.7876913 Q 7.0897576,8.8055849 7.000233,8.9309334 L 4.9948821,12.368677 q -0.035811,0.06267 -0.035811,0.143242 0,0.107426 0.080572,0.205905 l 0.5729577,0.572957 q 0.125334,0.116384 0.2864786,0.07162 l 2.4708789,-0.760963 2.5156417,2.515645 -0.76096,2.470876 q -0.009,0.02687 -0.009,0.08057 0,0.125338 0.08058,0.205905 l 0.572957,0.572958 q 0.170096,0.152194 0.349146,0.04476 l 3.437744,-2.005351 q 0.125335,-0.08953 0.143239,-0.232763 l 0.17905,-3.392986 q 1.02058,-0.859435 1.745729,-1.575629 1.67411,-1.6830612 2.309735,-3.2049805 0.635625,-1.5219191 0.635625,-3.8585111 0,-0.1253369 -0.08505,-0.2148575 -0.08505,-0.089526 -0.201431,-0.089526 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#16964d"
});
startX += -2;
startY += -2;
path.transform("T" + startX + "," + startY);
}
function _drawBusinessRuleTaskIcon(paper, startX, startY) {
var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.45458,5.6000386 2.90906,0 0,2.7999224 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.7999224 -8.72718,0 z m -4.36364,4.1998844 2.90906,0 0,2.800116 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.800116 -8.72718,0 z");
path1.attr({
"stroke": "none",
"fill": "#72a7d0"
});
var businessRuleTaskIcon = paper.set();
businessRuleTaskIcon.push(path1);
businessRuleTaskIcon.transform("T" + startX + "," + startY);
}
function _drawTimerEventListenerIcon(paper, element)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 10);
circle.attr({"stroke-width": 1,
"stroke": "black",
"fill": "none"
});
var path = paper.path("M 10 0 C 4.4771525 0 0 4.4771525 0 10 C 0 15.522847 4.4771525 20 10 20 C 15.522847 20 20 15.522847 20 10 C 20 4.4771525 15.522847 1.1842379e-15 10 0 z M 9.09375 1.03125 C 9.2292164 1.0174926 9.362825 1.0389311 9.5 1.03125 L 9.5 3.5 L 10.5 3.5 L 10.5 1.03125 C 15.063526 1.2867831 18.713217 4.9364738 18.96875 9.5 L 16.5 9.5 L 16.5 10.5 L 18.96875 10.5 C 18.713217 15.063526 15.063526 18.713217 10.5 18.96875 L 10.5 16.5 L 9.5 16.5 L 9.5 18.96875 C 4.9364738 18.713217 1.2867831 15.063526 1.03125 10.5 L 3.5 10.5 L 3.5 9.5 L 1.03125 9.5 C 1.279102 5.0736488 4.7225326 1.4751713 9.09375 1.03125 z M 9.5 5 L 9.5 8.0625 C 8.6373007 8.2844627 8 9.0680195 8 10 C 8 11.104569 8.8954305 12 10 12 C 10.931981 12 11.715537 11.362699 11.9375 10.5 L 14 10.5 L 14 9.5 L 11.9375 9.5 C 11.756642 8.7970599 11.20294 8.2433585 10.5 8.0625 L 10.5 5 L 9.5 5 z");
path.attr({
"stroke": "none",
"fill": "#585858"
});
path.transform("T" + (element.x + 5) + "," + (element.y + 5));
return path;
}
function _drawUserEventListenerIcon(paper, element) {
var userTaskIcon = paper.set();
var path1 = paper.path("M0.585,24.167h24.083v-7.833c0,0-2.333-3.917-7.083-5.167h-9.25 c-4.417,1.333-7.833,5.75-7.833,5.75L0.585,24.167z");
path1.attr({"opacity": 1, "stroke": "none", "fill": "#F4F6F7"});
userTaskIcon.push(path1);
var path2 = paper.path("M6,20L6,24");
path2.attr({"opacity": 1, "stroke": "white", "fill": "none"});
userTaskIcon.push(path2);
var path3 = paper.path("M20,20L20,24");
path3.attr({"opacity": 1, "stroke": "white", "fill": "none"});
userTaskIcon.push(path3);
var circle = paper.circle(13.002, 5.916, 5.417);
circle.attr({"stroke-width": 1, "stroke": "black", "fill": "#000000"});
userTaskIcon.push(circle);
var path4 = paper.path("M8.043,7.083c0,0,2.814-2.426,5.376-1.807s4.624-0.693,4.624-0.693 c0.25,1.688,0.042,3.75-1.458,5.584c0,0,1.083,0.75,1.083,1.5s0.125,1.875-1,3s-5.5,1.25-6.75,0S8.668,12.834,8.668,12 s0.583-1.25,1.25-1.917C8.835,9.5,7.419,7.708,8.043,7.083z");
path4.attr({"opacity": 1, "stroke": "none", "fill": "#F0EFF0"});
userTaskIcon.push(path4);
var x = (element.width / 2) - 2;
var y = (element.height / 2) - 2;
var circle2 = paper.circle(x, y, 17);
circle2.attr({"stroke-width": 1, "stroke": "#F0EFF0", "fill": "none"});
userTaskIcon.push(circle2);
userTaskIcon.transform("S0.7,0.7T" + (element.x + 2) + "," + (element.y + 2));
return userTaskIcon;
}
function _drawVariableEventListenerIcon(paper, element) {
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 10);
circle.attr({"stroke-width": 1,
"stroke": "black",
"fill": "none"
});
var path = paper.path("M 20.834856,22.874369 L 10.762008,22.873529 L 7.650126,13.293421 L 15.799725,7.3734296 L 23.948336,13.294781 L 20.834856,22.874369 z");
path.attr({
"stroke": "#585858",
"fill": "none"
});
path.transform("S0.8,0.8T" + (element.x - 1) + "," + (element.y - 1));
return path;
}

24
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/displaymodel.css

@ -1,24 +0,0 @@
div[class*='ui-tooltip-flowable-'] {
background-color: #ffffff;
border-color: #c5c5c5;
color: #4a4a4a;
font-family: Verdana;
font-size: 12px;
}
div[class*='ui-tooltip-flowable-'] .qtip-content {
color: #4a4a4a;
background-color: #ffffff;
font-family: Verdana;
font-size: 12px;
}
.ui-tooltip-flowable-cmmn .qtip-titlebar {
color: #FFFFFF;
font-size: 12px;
background: #2B414F;
}
.ui-tooltip-flowable-cmmn .qtip-tip {
background-color: #2B414F;
}

15
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/displaymodel.html

@ -1,15 +0,0 @@
<html>
<head>
<link type="text/css" rel="stylesheet" href="display/jquery.qtip.min.css" />
<link type="text/css" rel="stylesheet" href="display-cmmn/displaymodel.css" />
<script type="text/javascript" src="display/jquery.qtip.min.js"></script>
<script type="text/javascript" src="display/raphael.min.js"></script>
<script type="text/javascript" src="display-cmmn/cmmn-draw.js"></script>
<script type="text/javascript" src="display-cmmn/cmmn-icons.js"></script>
<script type="text/javascript" src="display/Polyline.js"></script>
<script type="text/javascript" src="display-cmmn/displaymodel.js"></script>
</head>
</html>

272
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-cmmn/displaymodel.js

@ -1,272 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var NORMAL_STROKE = 1;
var ASSOCIATION_STROKE = 2;
var TASK_STROKE = 1;
var TASK_HIGHLIGHT_STROKE = 2;
var TEXT_COLOR= "#373e48";
var CURRENT_COLOR= "#017501";
var HOVER_COLOR= "#666666";
var ACTIVITY_STROKE_COLOR = "#bbbbbb";
var ACTIVITY_FILL_COLOR = "#f9f9f9";
var WHITE_FILL_COLOR = "#ffffff";
var MAIN_STROKE_COLOR = "#585858";
var TEXT_PADDING = 3;
var ARROW_WIDTH = 4;
var MARKER_WIDTH = 12;
var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Raphael.rgb(0, 0, 0)};
// icons
var ICON_SIZE = 16;
var ICON_PADDING = 4;
var INITIAL_CANVAS_WIDTH;
var INITIAL_CANVAS_HEIGHT;
var paper;
var viewBox;
var viewBoxWidth;
var viewBoxHeight;
var canvasWidth;
var canvasHeight;
var modelDiv = jQuery('#cmmnModel');
var modelId = modelDiv.attr('data-model-id');
var historyModelId = modelDiv.attr('data-history-id');
var caseDefinitionId = modelDiv.attr('data-case-definition-id');
var modelType = modelDiv.attr('data-model-type');
var elementsAdded = new Array();
var elementsRemoved = new Array();
function _showTip(htmlNode, element)
{
// Default tooltip, no custom tool tip set
if (documentation === undefined) {
var documentation = "";
if (element.name && element.name.length > 0) {
documentation += "<b>Name</b>: <i>" + element.name + "</i><br/><br/>";
}
if (element.properties) {
for (var i = 0; i < element.properties.length; i++) {
var propName = element.properties[i].name;
if (element.properties[i].type && element.properties[i].type === 'list') {
documentation += '<b>' + propName + '</b>:<br/>';
for (var j = 0; j < element.properties[i].value.length; j++) {
documentation += '<i>' + element.properties[i].value[j] + '</i><br/>';
}
}
else {
documentation += '<b>' + propName + '</b>: <i>' + element.properties[i].value + '</i><br/>';
}
}
}
}
var text = element.type + " ";
if (element.name && element.name.length > 0)
{
text += element.name;
}
else
{
text += element.id;
}
htmlNode.qtip({
content: {
text: documentation,
title: {
text: text
}
},
position: {
my: 'top left',
at: 'bottom center',
viewport: jQuery('#cmmnModel')
},
hide: {
fixed: true, delay: 500,
event: 'click mouseleave'
},
style: {
classes: 'ui-tooltip-flowable-cmmn'
}
});
}
function _addHoverLogic(element, type, defaultColor)
{
var strokeColor = _cmmnGetColor(element, defaultColor);
var topBodyRect = null;
if (type === "rect")
{
topBodyRect = paper.rect(element.x, element.y, element.width, element.height);
}
else if (type === "circle")
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
topBodyRect = paper.circle(x, y, 15);
}
else if (type === "rhombus")
{
topBodyRect = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) +
"L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + element.y + "z"
);
}
var opacity = 0;
var fillColor = "#ffffff";
if (jQuery.inArray(element.id, elementsAdded) >= 0)
{
opacity = 0.2;
fillColor = "green";
}
if (jQuery.inArray(element.id, elementsRemoved) >= 0)
{
opacity = 0.2;
fillColor = "red";
}
topBodyRect.attr({
"opacity": opacity,
"stroke" : "none",
"fill" : fillColor
});
_showTip(jQuery(topBodyRect.node), element);
topBodyRect.mouseover(function() {
paper.getById(element.id).attr({"stroke":HOVER_COLOR});
});
topBodyRect.mouseout(function() {
paper.getById(element.id).attr({"stroke":strokeColor});
});
}
function _zoom(zoomIn)
{
var tmpCanvasWidth, tmpCanvasHeight;
if (zoomIn)
{
tmpCanvasWidth = canvasWidth * (1.0/0.90);
tmpCanvasHeight = canvasHeight * (1.0/0.90);
}
else
{
tmpCanvasWidth = canvasWidth * (1.0/1.10);
tmpCanvasHeight = canvasHeight * (1.0/1.10);
}
if (tmpCanvasWidth != canvasWidth || tmpCanvasHeight != canvasHeight)
{
canvasWidth = tmpCanvasWidth;
canvasHeight = tmpCanvasHeight;
paper.setSize(canvasWidth, canvasHeight);
}
}
var modelUrl;
if (modelType == 'runtime') {
if (historyModelId) {
modelUrl = FLOWABLE.APP_URL.getCaseInstancesHistoryModelJsonUrl(historyModelId);
} else {
modelUrl = FLOWABLE.APP_URL.getCaseInstancesModelJsonUrl(modelId);
}
} else if (modelType == 'design') {
if (historyModelId) {
modelUrl = FLOWABLE.APP_URL.getModelHistoryModelJsonUrl(modelId, historyModelId);
} else {
modelUrl = FLOWABLE.APP_URL.getModelModelJsonUrl(modelId);
}
} else if (modelType == 'case-definition') {
modelUrl = FLOWABLE.APP_URL.getCaseDefinitionModelJsonUrl(caseDefinitionId);
}
var request = jQuery.ajax({
type: 'get',
url: modelUrl + '?nocaching=' + new Date().getTime()
});
request.success(function(data, textStatus, jqXHR) {
if ((!data.elements || data.elements.length == 0) && (!data.pools || data.pools.length == 0)) return;
INITIAL_CANVAS_WIDTH = data.diagramWidth;
if (modelType == 'design') {
INITIAL_CANVAS_WIDTH += 20;
} else {
INITIAL_CANVAS_WIDTH += 30;
}
INITIAL_CANVAS_HEIGHT = data.diagramHeight + 50;
canvasWidth = INITIAL_CANVAS_WIDTH;
canvasHeight = INITIAL_CANVAS_HEIGHT;
viewBoxWidth = INITIAL_CANVAS_WIDTH;
viewBoxHeight = INITIAL_CANVAS_HEIGHT;
if (modelType == 'design') {
var headerBarHeight = 170;
var offsetY = 0;
if (jQuery(window).height() > (canvasHeight + headerBarHeight))
{
offsetY = (jQuery(window).height() - headerBarHeight - canvasHeight) / 2;
}
if (offsetY > 50) {
offsetY = 50;
}
jQuery('#cmmnModel').css('marginTop', offsetY);
}
jQuery('#cmmnModel').width(INITIAL_CANVAS_WIDTH);
jQuery('#cmmnModel').height(INITIAL_CANVAS_HEIGHT);
paper = Raphael(document.getElementById('cmmnModel'), canvasWidth, canvasHeight);
paper.setViewBox(0, 0, viewBoxWidth, viewBoxHeight, false);
paper.renderfix();
var modelElements = data.elements;
for (var i = 0; i < modelElements.length; i++)
{
var element = modelElements[i];
//try {
var drawFunction = eval("_draw" + element.type);
drawFunction(element);
//} catch(err) {console.log(err);}
}
if (data.flows)
{
for (var i = 0; i < data.flows.length; i++)
{
var flow = data.flows[i];
_drawAssociation(flow);
}
}
});
request.error(function(jqXHR, textStatus, errorThrown) {
alert("error");
});

24
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/displaymodel.css

@ -1,24 +0,0 @@
div[class*='ui-tooltip-flowable-'] {
background-color: #ffffff;
border-color: #c5c5c5;
color: #4a4a4a;
font-family: Verdana;
font-size: 12px;
}
div[class*='ui-tooltip-flowable-'] .qtip-content {
color: #4a4a4a;
background-color: #ffffff;
font-family: Verdana;
font-size: 12px;
}
.ui-tooltip-flowable-cmmn .qtip-titlebar {
color: #FFFFFF;
font-size: 12px;
background: #2B414F;
}
.ui-tooltip-flowable-cmmn .qtip-tip {
background-color: #2B414F;
}

15
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/displaymodel.html

@ -1,15 +0,0 @@
<html>
<head>
<link type="text/css" rel="stylesheet" href="display/jquery.qtip.min.css" />
<link type="text/css" rel="stylesheet" href="display-dmn/displaymodel.css" />
<script type="text/javascript" src="display/jquery.qtip.min.js"></script>
<script type="text/javascript" src="display/raphael.min.js"></script>
<script type="text/javascript" src="display-dmn/dmn-draw.js"></script>
<script type="text/javascript" src="display-dmn/dmn-icons.js"></script>
<script type="text/javascript" src="display/Polyline.js"></script>
<script type="text/javascript" src="display-dmn/displaymodel.js"></script>
</head>
</html>

270
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/displaymodel.js

@ -1,270 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var NORMAL_STROKE = 1;
var ASSOCIATION_STROKE = 2;
var TASK_STROKE = 1;
var TASK_HIGHLIGHT_STROKE = 2;
var DECISION_SERVICE_STROKE = 3;
var COMPLETED_COLOR = "#2632aa";
var TEXT_COLOR= "#373e48";
var CURRENT_COLOR= "#017501";
var AVAILABLE_COLOR = "#e3da82";
var HOVER_COLOR= "#666666";
var ACTIVITY_STROKE_COLOR = "#bbbbbb";
var ACTIVITY_FILL_COLOR = "#f9f9f9";
var WHITE_FILL_COLOR = "#ffffff";
var MAIN_STROKE_COLOR = "#585858";
var TEXT_PADDING = 3;
var ARROW_WIDTH = 4;
var MARKER_WIDTH = 12;
var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Raphael.rgb(0, 0, 0)};
// icons
var ICON_SIZE = 16;
var ICON_PADDING = 4;
var INITIAL_CANVAS_WIDTH;
var INITIAL_CANVAS_HEIGHT;
var paper;
var viewBox;
var viewBoxWidth;
var viewBoxHeight;
var canvasWidth;
var canvasHeight;
var modelDiv = jQuery('#dmnModel');
var modelId = modelDiv.attr('data-model-id');
var historyModelId = modelDiv.attr('data-history-id');
var decisionDefinitionId = modelDiv.attr('data-decision-definition-id');
var modelType = modelDiv.attr('data-model-type');
var elementsAdded = new Array();
var elementsRemoved = new Array();
function _showTip(htmlNode, element)
{
// Default tooltip, no custom tool tip set
if (documentation === undefined) {
var documentation = "";
if (element.name && element.name.length > 0) {
documentation += "<b>Name</b>: <i>" + element.name + "</i><br/><br/>";
}
if (element.properties) {
for (var i = 0; i < element.properties.length; i++) {
var propName = element.properties[i].name;
if (element.properties[i].type && element.properties[i].type === 'list') {
documentation += '<b>' + propName + '</b>:<br/>';
for (var j = 0; j < element.properties[i].value.length; j++) {
documentation += '<i>' + element.properties[i].value[j] + '</i><br/>';
}
}
else {
documentation += '<b>' + propName + '</b>: <i>' + element.properties[i].value + '</i><br/>';
}
}
}
}
var text = element.type + " ";
if (element.name && element.name.length > 0)
{
text += element.name;
}
else
{
text += element.id;
}
htmlNode.qtip({
content: {
text: documentation,
title: {
text: text
}
},
position: {
my: 'top left',
at: 'bottom center',
viewport: jQuery('#dmnModel')
},
hide: {
fixed: true, delay: 500,
event: 'click mouseleave'
},
style: {
classes: 'ui-tooltip-flowable-cmmn'
}
});
}
function _addHoverLogic(element, type, defaultColor)
{
var strokeColor = _dmnGetColor(element, defaultColor);
var topBodyRect = null;
if (type === "rect")
{
topBodyRect = paper.rect(element.x, element.y, element.width, element.height);
}
else if (type === "circle")
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
topBodyRect = paper.circle(x, y, 15);
}
else if (type === "rhombus")
{
topBodyRect = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) +
"L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + element.y + "z"
);
}
var opacity = 0;
var fillColor = "#ffffff";
if (jQuery.inArray(element.id, elementsAdded) >= 0)
{
opacity = 0.2;
fillColor = "green";
}
if (jQuery.inArray(element.id, elementsRemoved) >= 0)
{
opacity = 0.2;
fillColor = "red";
}
topBodyRect.attr({
"opacity": opacity,
"stroke" : "none",
"fill" : fillColor
});
_showTip(jQuery(topBodyRect.node), element);
topBodyRect.mouseover(function() {
paper.getById(element.id).attr({"stroke":HOVER_COLOR});
paper.getById("divider_"+element.id) != undefined ? paper.getById("divider_"+element.id).attr({"stroke":HOVER_COLOR}) : '';
});
topBodyRect.mouseout(function() {
paper.getById(element.id).attr({"stroke":strokeColor});
paper.getById("divider_"+element.id) != undefined ? paper.getById("divider_"+element.id).attr({"stroke":strokeColor}) : '';
});
}
function _zoom(zoomIn)
{
var tmpCanvasWidth, tmpCanvasHeight;
if (zoomIn)
{
tmpCanvasWidth = canvasWidth * (1.0/0.90);
tmpCanvasHeight = canvasHeight * (1.0/0.90);
}
else
{
tmpCanvasWidth = canvasWidth * (1.0/1.10);
tmpCanvasHeight = canvasHeight * (1.0/1.10);
}
if (tmpCanvasWidth != canvasWidth || tmpCanvasHeight != canvasHeight)
{
canvasWidth = tmpCanvasWidth;
canvasHeight = tmpCanvasHeight;
paper.setSize(canvasWidth, canvasHeight);
}
}
var modelUrl;
if (modelType == 'decision-service') {
// modelUrl = FLOWABLE.APP_URL.getDgetCaseDefinitionModelJsonUrl(caseDefinitionId);
modelUrl = './app/rest/admin/decisions/decision-service/' + decisionDefinitionId + '/model-json';
} else if (modelType == 'design') {
if (historyModelId) {
modelUrl = FLOWABLE.APP_URL.getModelHistoryModelJsonUrl(modelId, historyModelId);
} else {
modelUrl = FLOWABLE.APP_URL.getModelModelJsonUrl(modelId);
}
}
var request = jQuery.ajax({
type: 'get',
url: modelUrl + '?nocaching=' + new Date().getTime()
});
request.success(function(data, textStatus, jqXHR) {
if ((!data.elements || data.elements.length == 0) && (!data.pools || data.pools.length == 0)) return;
INITIAL_CANVAS_WIDTH = data.diagramWidth;
if (modelType == 'design') {
INITIAL_CANVAS_WIDTH += 20;
} else {
INITIAL_CANVAS_WIDTH += 30;
}
INITIAL_CANVAS_HEIGHT = data.diagramHeight + 50;
canvasWidth = INITIAL_CANVAS_WIDTH;
canvasHeight = INITIAL_CANVAS_HEIGHT;
viewBoxWidth = INITIAL_CANVAS_WIDTH;
viewBoxHeight = INITIAL_CANVAS_HEIGHT;
if (modelType == 'design') {
var headerBarHeight = 170;
var offsetY = 0;
if (jQuery(window).height() > (canvasHeight + headerBarHeight))
{
offsetY = (jQuery(window).height() - headerBarHeight - canvasHeight) / 2;
}
if (offsetY > 50) {
offsetY = 50;
}
jQuery('#dmnModel').css('marginTop', offsetY);
}
jQuery('#dmnModel').width(INITIAL_CANVAS_WIDTH);
jQuery('#dmnModel').height('100%');
paper = Raphael(document.getElementById('dmnModel'), canvasWidth, canvasHeight);
paper.setViewBox(0, 0, viewBoxWidth, viewBoxHeight, false);
paper.renderfix();
var modelElements = data.elements;
for (var i = 0; i < modelElements.length; i++)
{
var element = modelElements[i];
//try {
var drawFunction = eval("_draw" + element.type);
drawFunction(element);
//} catch(err) {console.log(err);}
}
if (data.flows)
{
for (var i = 0; i < data.flows.length; i++)
{
var flow = data.flows[i];
_drawInformationRequirement(flow);
}
}
});
request.error(function(jqXHR, textStatus, errorThrown) {
alert("error");
});

206
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/dmn-draw.js

@ -1,206 +0,0 @@
function _dmnGetColor(element, defaultColor)
{
var strokeColor;
if (element.current) {
strokeColor = CURRENT_COLOR;
} else if (element.completed) {
strokeColor = COMPLETED_COLOR;
} else if (element.available) {
strokeColor = AVAILABLE_COLOR;
} else {
strokeColor = defaultColor;
}
return strokeColor;
}
function _drawDecisionService(element)
{
var rectAttrs = {};
// Stroke
var strokeColor = _dmnGetColor(element, ACTIVITY_STROKE_COLOR);
rectAttrs['stroke'] = strokeColor;
var strokeWidth = DECISION_SERVICE_STROKE;
var width = element.width - (strokeWidth / 2);
var height = element.height - (strokeWidth / 2);
var rect = paper.rect(element.x, element.y, width, height, 16);
rectAttrs['stroke-width'] = strokeWidth;
// Fill
rectAttrs['fill'] = WHITE_FILL_COLOR;
rect.attr(rectAttrs);
rect.id = element.id;
var dividerElement = element.divider;
var divider = new Polyline("divider_" + element.id, dividerElement.waypoints, ACTIVITY_STROKE_COLOR, paper);
divider.element = paper.path(divider.path);
divider.element.attr({"stroke-width": ASSOCIATION_STROKE});
divider.element.attr({"stroke":"#bbbbbb"});
divider.element.id = "divider_" + element.id;
if (element.name) {
this._drawMultilineText(element.name, element.x + 10, element.y + 5, element.width, element.height, "start", "top", 11);
}
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawDecision(element)
{
var rectAttrs = {};
// Stroke
var strokeColor = _dmnGetColor(element, ACTIVITY_STROKE_COLOR);
rectAttrs['stroke'] = strokeColor;
var strokeWidth;
if (strokeColor === ACTIVITY_STROKE_COLOR) {
strokeWidth = TASK_STROKE;
} else {
strokeWidth = TASK_HIGHLIGHT_STROKE;
}
var width = element.width - (strokeWidth / 2);
var height = element.height - (strokeWidth / 2);
var rect = paper.rect(element.x, element.y, width, height, 4);
rectAttrs['stroke-width'] = strokeWidth;
// Fill
rectAttrs['fill'] = ACTIVITY_FILL_COLOR;
rect.attr(rectAttrs);
rect.id = element.id;
if (element.name) {
this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11);
}
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawInformationRequirement(flow){
var polyline = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper);
var strokeColor = _dmnGetColor(flow, MAIN_STROKE_COLOR);
polyline.element = paper.path(polyline.path);
polyline.element.attr({"stroke-width": ASSOCIATION_STROKE});
polyline.element.attr({"stroke":strokeColor});
polyline.element.id = flow.id;
var lastLineIndex = polyline.getLinesCount() - 1;
var line = polyline.getLine(lastLineIndex);
var polylineInvisible = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper);
polylineInvisible.element = paper.path(polyline.path);
polylineInvisible.element.attr({
"opacity": 0,
"stroke-width": 8,
"stroke" : "#000000"
});
_showTip(jQuery(polylineInvisible.element.node), flow);
polylineInvisible.element.mouseover(function() {
paper.getById(polyline.element.id).attr({"stroke":HOVER_COLOR});
});
polylineInvisible.element.mouseout(function() {
paper.getById(polyline.element.id).attr({"stroke":strokeColor});
});
_drawArrowHead(line, strokeColor, paper);
}
function _drawMultilineText(text, x, y, boxWidth, boxHeight, horizontalAnchor, verticalAnchor, fontSize)
{
if (!text || text == "")
{
return;
}
var textBoxX, textBoxY;
var width = boxWidth - (2 * TEXT_PADDING);
if (horizontalAnchor === "middle")
{
textBoxX = x + (boxWidth / 2);
}
else if (horizontalAnchor === "start")
{
textBoxX = x;
}
textBoxY = y + (boxHeight / 2);
var t = paper.text(textBoxX + TEXT_PADDING, textBoxY + TEXT_PADDING).attr({
"text-anchor" : horizontalAnchor,
"font-family" : "Arial",
"font-size" : fontSize,
"fill" : "#373e48"
});
var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
t.attr({
"text" : abc
});
var letterWidth = t.getBBox().width / abc.length;
t.attr({
"text" : text
});
var removedLineBreaks = text.split("\n");
var x = 0, s = [];
for (var r = 0; r < removedLineBreaks.length; r++)
{
var words = removedLineBreaks[r].split(" ");
for ( var i = 0; i < words.length; i++) {
var l = words[i].length;
if (x + (l * letterWidth) > width) {
s.push("\n");
x = 0;
}
x += l * letterWidth;
s.push(words[i] + " ");
}
s.push("\n");
x = 0;
}
t.attr({
"text" : s.join("")
});
if (verticalAnchor && verticalAnchor === "top")
{
t.attr({"y": y + (t.getBBox().height / 2)});
}
}
function _drawArrowHead(line, connectionType)
{
var doubleArrowWidth = 2 * ARROW_WIDTH;
var arrowHead = paper.path("M0 0L-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2 + .5) + " -" + doubleArrowWidth + "z");
// anti smoothing
if (this.strokeWidth%2 == 1)
line.x2 += .5, line.y2 += .5;
arrowHead.transform("t" + line.x2 + "," + line.y2 + "");
arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0);
arrowHead.attr("fill", "#585858");
arrowHead.attr("stroke-width", ASSOCIATION_STROKE);
arrowHead.attr("stroke", "#585858");
return arrowHead;
}

182
io.sc.platform.flowable/src/main/resources/flowable-modeler/display-dmn/dmn-icons.js

@ -1,182 +0,0 @@
function _drawHumanTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#d1b575"
});
var userTaskIcon = paper.set();
userTaskIcon.push(path1);
userTaskIcon.transform("T" + startX + "," + startY);
}
function _drawServiceTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M 8,1 7.5,2.875 c 0,0 -0.02438,0.250763 -0.40625,0.4375 C 7.05724,3.330353 7.04387,3.358818 7,3.375 6.6676654,3.4929791 6.3336971,3.6092802 6.03125,3.78125 6.02349,3.78566 6.007733,3.77681 6,3.78125 5.8811373,3.761018 5.8125,3.71875 5.8125,3.71875 l -1.6875,-1 -1.40625,1.4375 0.96875,1.65625 c 0,0 0.065705,0.068637 0.09375,0.1875 0.002,0.00849 -0.00169,0.022138 0,0.03125 C 3.6092802,6.3336971 3.4929791,6.6676654 3.375,7 3.3629836,7.0338489 3.3239228,7.0596246 3.3125,7.09375 3.125763,7.4756184 2.875,7.5 2.875,7.5 L 1,8 l 0,2 1.875,0.5 c 0,0 0.250763,0.02438 0.4375,0.40625 0.017853,0.03651 0.046318,0.04988 0.0625,0.09375 0.1129372,0.318132 0.2124732,0.646641 0.375,0.9375 -0.00302,0.215512 -0.09375,0.34375 -0.09375,0.34375 L 2.6875,13.9375 4.09375,15.34375 5.78125,14.375 c 0,0 0.1229911,-0.09744 0.34375,-0.09375 0.2720511,0.147787 0.5795915,0.23888 0.875,0.34375 0.033849,0.01202 0.059625,0.05108 0.09375,0.0625 C 7.4756199,14.874237 7.5,15.125 7.5,15.125 L 8,17 l 2,0 0.5,-1.875 c 0,0 0.02438,-0.250763 0.40625,-0.4375 0.03651,-0.01785 0.04988,-0.04632 0.09375,-0.0625 0.332335,-0.117979 0.666303,-0.23428 0.96875,-0.40625 0.177303,0.0173 0.28125,0.09375 0.28125,0.09375 l 1.65625,0.96875 1.40625,-1.40625 -0.96875,-1.65625 c 0,0 -0.07645,-0.103947 -0.09375,-0.28125 0.162527,-0.290859 0.262063,-0.619368 0.375,-0.9375 0.01618,-0.04387 0.04465,-0.05724 0.0625,-0.09375 C 14.874237,10.52438 15.125,10.5 15.125,10.5 L 17,10 17,8 15.125,7.5 c 0,0 -0.250763,-0.024382 -0.4375,-0.40625 C 14.669647,7.0572406 14.641181,7.0438697 14.625,7 14.55912,6.8144282 14.520616,6.6141566 14.4375,6.4375 c -0.224363,-0.4866 0,-0.71875 0,-0.71875 L 15.40625,4.0625 14,2.625 l -1.65625,1 c 0,0 -0.253337,0.1695664 -0.71875,-0.03125 l -0.03125,0 C 11.405359,3.5035185 11.198648,3.4455201 11,3.375 10.95613,3.3588185 10.942759,3.3303534 10.90625,3.3125 10.524382,3.125763 10.5,2.875 10.5,2.875 L 10,1 8,1 z m 1,5 c 1.656854,0 3,1.3431458 3,3 0,1.656854 -1.343146,3 -3,3 C 7.3431458,12 6,10.656854 6,9 6,7.3431458 7.3431458,6 9,6 z");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#72a7d0"
});
var serviceTaskIcon = paper.set();
serviceTaskIcon.push(path1);
serviceTaskIcon.transform("T" + startX + "," + startY);
}
function _drawCaseTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M5 8 L9 4 L18 4 L 21 7");
path1.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#000000"
});
var path2 = paper.path("M1 23 L1 4 L30 4 L30 23z");
path2.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#F4F6F7"
});
var caseTaskIcon = paper.set();
caseTaskIcon.push(path1);
caseTaskIcon.push(path2);
caseTaskIcon.translate(startX, startY);
caseTaskIcon.scale(0.7, 0.7);
}
function _drawProcessTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M1 23 L7 11 L1 0 L30 0 L 35 11 L 30 23z");
path1.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#F4F6F7"
});
var processTaskIcon = paper.set();
processTaskIcon.push(path1);
processTaskIcon.translate(startX, startY);
processTaskIcon.scale(0.7, 0.7);
}
function _drawDecisionTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.9,2.4000386 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z");
path1.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#F4F6F7"
});
var decisionTaskIcon = paper.set();
decisionTaskIcon.push(path1);
decisionTaskIcon.translate(startX, startY);
decisionTaskIcon.scale(0.7, 0.7);
}
function _drawHttpTaskIcon(paper, startX, startY)
{
var path = paper.path("m 16.704699,5.9229055 q 0.358098,0 0.608767,0.2506681 0.250669,0.250668 0.250669,0.6087677 0,0.3580997 -0.250669,0.6087677 -0.250669,0.2506679 -0.608767,0.2506679 -0.358098,0 -0.608767,-0.2506679 -0.250669,-0.250668 -0.250669,-0.6087677 0,-0.3580997 0.250669,-0.6087677 0.250669,-0.2506681 0.608767,-0.2506681 z m 2.578308,-2.0053502 q -2.229162,0 -3.854034,0.6759125 -1.624871,0.6759067 -3.227361,2.2694472 -0.716197,0.725146 -1.575633,1.7457293 L 7.2329969,8.7876913 Q 7.0897576,8.8055849 7.000233,8.9309334 L 4.9948821,12.368677 q -0.035811,0.06267 -0.035811,0.143242 0,0.107426 0.080572,0.205905 l 0.5729577,0.572957 q 0.125334,0.116384 0.2864786,0.07162 l 2.4708789,-0.760963 2.5156417,2.515645 -0.76096,2.470876 q -0.009,0.02687 -0.009,0.08057 0,0.125338 0.08058,0.205905 l 0.572957,0.572958 q 0.170096,0.152194 0.349146,0.04476 l 3.437744,-2.005351 q 0.125335,-0.08953 0.143239,-0.232763 l 0.17905,-3.392986 q 1.02058,-0.859435 1.745729,-1.575629 1.67411,-1.6830612 2.309735,-3.2049805 0.635625,-1.5219191 0.635625,-3.8585111 0,-0.1253369 -0.08505,-0.2148575 -0.08505,-0.089526 -0.201431,-0.089526 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#16964d"
});
startX += -2;
startY += -2;
path.transform("T" + startX + "," + startY);
}
function _drawSendEventTaskIcon(paper, startX, startY)
{
var path = paper.path("m 0.5,2.5 0,13 17,0 0,-13 z M 2,4 6.5,8.5 2,13 z M 4,4 14,4 9,9 z m 12,0 0,9 -4.5,-4.5 z M 7.5,9.5 9,11 10.5,9.5 15,14 3,14 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#72a7d0"
});
var sendEventTaskIcon = paper.set();
sendEventTaskIcon.push(path);
sendEventTaskIcon.transform("T" + startX + "," + startY);
}
function _drawBusinessRuleTaskIcon(paper, startX, startY) {
var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.45458,5.6000386 2.90906,0 0,2.7999224 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.7999224 -8.72718,0 z m -4.36364,4.1998844 2.90906,0 0,2.800116 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.800116 -8.72718,0 z");
path1.attr({
"stroke": "none",
"fill": "#72a7d0"
});
var businessRuleTaskIcon = paper.set();
businessRuleTaskIcon.push(path1);
businessRuleTaskIcon.transform("T" + startX + "," + startY);
}
function _drawTimerEventListenerIcon(paper, element)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 10);
circle.attr({"stroke-width": 1,
"stroke": "black",
"fill": "none"
});
var path = paper.path("M 10 0 C 4.4771525 0 0 4.4771525 0 10 C 0 15.522847 4.4771525 20 10 20 C 15.522847 20 20 15.522847 20 10 C 20 4.4771525 15.522847 1.1842379e-15 10 0 z M 9.09375 1.03125 C 9.2292164 1.0174926 9.362825 1.0389311 9.5 1.03125 L 9.5 3.5 L 10.5 3.5 L 10.5 1.03125 C 15.063526 1.2867831 18.713217 4.9364738 18.96875 9.5 L 16.5 9.5 L 16.5 10.5 L 18.96875 10.5 C 18.713217 15.063526 15.063526 18.713217 10.5 18.96875 L 10.5 16.5 L 9.5 16.5 L 9.5 18.96875 C 4.9364738 18.713217 1.2867831 15.063526 1.03125 10.5 L 3.5 10.5 L 3.5 9.5 L 1.03125 9.5 C 1.279102 5.0736488 4.7225326 1.4751713 9.09375 1.03125 z M 9.5 5 L 9.5 8.0625 C 8.6373007 8.2844627 8 9.0680195 8 10 C 8 11.104569 8.8954305 12 10 12 C 10.931981 12 11.715537 11.362699 11.9375 10.5 L 14 10.5 L 14 9.5 L 11.9375 9.5 C 11.756642 8.7970599 11.20294 8.2433585 10.5 8.0625 L 10.5 5 L 9.5 5 z");
path.attr({
"stroke": "none",
"fill": "#585858"
});
path.transform("T" + (element.x + 5) + "," + (element.y + 5));
return path;
}
function _drawUserEventListenerIcon(paper, element) {
var userTaskIcon = paper.set();
var path1 = paper.path("M0.585,24.167h24.083v-7.833c0,0-2.333-3.917-7.083-5.167h-9.25 c-4.417,1.333-7.833,5.75-7.833,5.75L0.585,24.167z");
path1.attr({"opacity": 1, "stroke": "none", "fill": "#F4F6F7"});
userTaskIcon.push(path1);
var path2 = paper.path("M6,20L6,24");
path2.attr({"opacity": 1, "stroke": "white", "fill": "none"});
userTaskIcon.push(path2);
var path3 = paper.path("M20,20L20,24");
path3.attr({"opacity": 1, "stroke": "white", "fill": "none"});
userTaskIcon.push(path3);
var circle = paper.circle(13.002, 5.916, 5.417);
circle.attr({"stroke-width": 1, "stroke": "black", "fill": "#000000"});
userTaskIcon.push(circle);
var path4 = paper.path("M8.043,7.083c0,0,2.814-2.426,5.376-1.807s4.624-0.693,4.624-0.693 c0.25,1.688,0.042,3.75-1.458,5.584c0,0,1.083,0.75,1.083,1.5s0.125,1.875-1,3s-5.5,1.25-6.75,0S8.668,12.834,8.668,12 s0.583-1.25,1.25-1.917C8.835,9.5,7.419,7.708,8.043,7.083z");
path4.attr({"opacity": 1, "stroke": "none", "fill": "#F0EFF0"});
userTaskIcon.push(path4);
var x = (element.width / 2) - 2;
var y = (element.height / 2) - 2;
var circle2 = paper.circle(x, y, 17);
circle2.attr({"stroke-width": 1, "stroke": "#F0EFF0", "fill": "none"});
userTaskIcon.push(circle2);
userTaskIcon.transform("S0.7,0.7" + "T" + (element.x + 2) + "," + (element.y + 2));
return userTaskIcon;
}

3
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/.gitignore

@ -1,3 +0,0 @@
/dist
/node_modules
/displaymodel_temp.html

153
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/Gruntfile.js

@ -1,153 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
module.exports = function (grunt) {
require('load-grunt-tasks')(grunt);
require('time-grunt')(grunt);
grunt.initConfig({
yeoman: {
app: require('./package.json').appPath || 'app',
dist: 'dist'
},
clean: {
dist: {
files: [
{
dot: true,
src: [
'.tmp',
'<%= yeoman.dist %>/*',
'!<%= yeoman.dist %>/.git*'
]
}
]
},
server: '.tmp'
},
useminPrepare: {
html: 'displaymodel.html',
options: {
dest: '<%= yeoman.dist %>/'
}
},
usemin: {
html: ['<%= yeoman.dist %>/{,*/}*.html'],
css: ['<%= yeoman.dist %>/display/styles/{,*/}*.css'],
options: {
dirs: ['<%= yeoman.dist %>']
}
},
// Put files not handled in other tasks here
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: '.',
dest: '<%= yeoman.dist %>',
src: [
'fonts/*'
]
}, {
expand: true,
cwd: '.tmp/images',
dest: '<%= yeoman.dist %>/images',
src: [
'generated/*'
]
}]
},
styles: {
expand: true,
cwd: 'styles',
dest: '.tmp/styles/',
src: '{,*/}*.css'
},
index: {
expand: true,
cwd: './',
src: ['*.html', 'views/**/**.html'],
dest: '<%= yeoman.dist %>'
},
copyCss : {
files: [
{expand: true, cwd:'.tmp/concat/display/styles/', src:'*.css', dest:'<%= yeoman.dist %>/display/styles/', filter: 'isFile'}
]
},
copyJs : {
files: [
{expand: true, cwd:'.tmp/concat/display/scripts', src:'*.js', dest:'<%= yeoman.dist %>/display/scripts/', filter: 'isFile'}
]
},
},
ngAnnotate: {
dist: {
files: [
{
expand: true,
cwd: '.tmp/concat/display/scripts',
src: '*.js',
dest: '.tmp/concat/display/scripts'
}
]
}
},
uglify: {
dist: {
options: {
mangle: true
},
files: {
'<%= yeoman.dist %>/display/scripts/displaymodel-logic.js': [
'<%= yeoman.dist %>/display/scripts/displaymodel-logic.js'
]
}
}
},
rev: {
dist: {
files: {
src: [
'<%= yeoman.dist %>/display/{,*/}*.js',
'<%= yeoman.dist %>/display/{,*/}*.css',
'<%= yeoman.dist %>/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
]
}
}
}
});
grunt.registerTask('buildApp', [
'clean:dist',
'useminPrepare',
'copy:styles',
'concat',
'copy:dist',
'ngAnnotate',
'copy:copyCss',
'copy:copyJs',
'copy:index',
'uglify',
'rev',
'usemin'
]);
grunt.registerTask('default', [
'buildApp'
]);
};

387
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/Polyline.js

@ -1,387 +0,0 @@
/* Copyright 2005-2015 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Class to generate polyline
*
* @author Dmitry Farafonov
*/
var ANCHOR_TYPE= {
main: "main",
middle: "middle",
first: "first",
last: "last"
};
function Anchor(uuid, type, x, y) {
this.uuid = uuid;
this.x = x;
this.y = y;
this.type = (type == ANCHOR_TYPE.middle) ? ANCHOR_TYPE.middle : ANCHOR_TYPE.main;
};
Anchor.prototype = {
uuid: null,
x: 0,
y: 0,
type: ANCHOR_TYPE.main,
isFirst: false,
isLast: false,
ndex: 0,
typeIndex: 0
};
function Polyline(uuid, points, strokeWidth, paper) {
/* Array on coordinates:
* points: [{x: 410, y: 110}, 1
* {x: 570, y: 110}, 1 2
* {x: 620, y: 240}, 2 3
* {x: 750, y: 270}, 3 4
* {x: 650, y: 370}]; 4
*/
this.points = points;
/*
* path for graph
* [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]]
*/
this.path = [];
this.anchors = [];
if (strokeWidth) this.strokeWidth = strokeWidth;
this.paper = paper;
this.closePath = false;
this.init();
};
Polyline.prototype = {
id: null,
points: [],
path: [],
anchors: [],
strokeWidth: 1,
radius: 1,
showDetails: false,
paper: null,
element: null,
isDefaultConditionAvailable: false,
closePath: false,
init: function(points){
var linesCount = this.getLinesCount();
if (linesCount < 1)
return;
this.normalizeCoordinates();
// create anchors
this.pushAnchor(ANCHOR_TYPE.first, this.getLine(0).x1, this.getLine(0).y1);
for (var i = 1; i < linesCount; i++)
{
var line1 = this.getLine(i-1);
this.pushAnchor(ANCHOR_TYPE.main, line1.x2, line1.y2);
}
this.pushAnchor(ANCHOR_TYPE.last, this.getLine(linesCount-1).x2, this.getLine(linesCount-1).y2);
this.rebuildPath();
},
normalizeCoordinates: function(){
for(var i=0; i < this.points.length; i++){
this.points[i].x = parseFloat(this.points[i].x);
this.points[i].y = parseFloat(this.points[i].y);
}
},
getLinesCount: function(){
return this.points.length-1;
},
_getLine: function(i){
if (this.points.length > i && this.points[i]) {
return {x1: this.points[i].x, y1: this.points[i].y, x2: this.points[i+1].x, y2: this.points[i+1].y};
} else {
return undefined;
}
},
getLine: function(i){
var line = this._getLine(i);
if (line != undefined) {
line.angle = this.getLineAngle(i);
}
return line;
},
getLineAngle: function(i){
var line = this._getLine(i);
return Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
},
getLineLengthX: function(i){
var line = this.getLine(i);
return (line.x2 - line.x1);
},
getLineLengthY: function(i){
var line = this.getLine(i);
return (line.y2 - line.y1);
},
getLineLength: function(i){
return Math.sqrt(Math.pow(this.getLineLengthX(i), 2) + Math.pow(this.getLineLengthY(i), 2));
},
getAnchors: function(){
return this.anchors;
},
getAnchorsCount: function(type){
if (!type)
return this.anchors.length;
else {
var count = 0;
for(var i=0; i < this.getAnchorsCount(); i++){
var anchor = this.anchors[i];
if (anchor.getType() == type) {
count++;
}
}
return count;
}
},
pushAnchor: function(type, x, y, index){
if (type == ANCHOR_TYPE.first) {
index = 0;
typeIndex = 0;
} else if (type == ANCHOR_TYPE.last) {
index = this.getAnchorsCount();
typeIndex = 0;
} else if (!index) {
index = this.anchors.length;
} else {
for(var i=0; i < this.getAnchorsCount(); i++){
var anchor = this.anchors[i];
if (anchor.index > index) {
anchor.index++;
anchor.typeIndex++;
}
}
}
var anchor = new Anchor(this.id, ANCHOR_TYPE.main, x, y, index, typeIndex);
this.anchors.push(anchor);
},
getAnchor: function(position){
return this.anchors[position];
},
getAnchorByType: function(type, position){
if (type == ANCHOR_TYPE.first)
return this.anchors[0];
if (type == ANCHOR_TYPE.last)
return this.anchors[this.getAnchorsCount()-1];
for(var i=0; i < this.getAnchorsCount(); i++){
var anchor = this.anchors[i];
if (anchor.type == type) {
if( position == anchor.position)
return anchor;
}
}
return null;
},
addNewPoint: function(position, x, y){
//
for(var i = 0; i < this.getLinesCount(); i++){
var line = this.getLine(i);
if (x > line.x1 && x < line.x2 && y > line.y1 && y < line.y2) {
this.points.splice(i+1,0,{x: x, y: y});
break;
}
}
this.rebuildPath();
},
rebuildPath: function(){
var path = [];
for(var i = 0; i < this.getAnchorsCount(); i++){
var anchor = this.getAnchor(i);
var pathType = "";
if (i == 0)
pathType = "M";
else
pathType = "L";
// TODO: save previous points and calculate new path just if points are updated, and then save currents values as previous
var targetX = anchor.x, targetY = anchor.y;
if (i>0 && i < this.getAnchorsCount()-1) {
// get new x,y
var cx = anchor.x, cy = anchor.y;
// pivot point of prev line
var AO = this.getLineLength(i-1);
if (AO < this.radius) {
AO = this.radius;
}
this.isDefaultConditionAvailable = (this.isDefaultConditionAvailable || (i == 1 && AO > 10));
var ED = this.getLineLengthY(i-1) * this.radius / AO;
var OD = this.getLineLengthX(i-1) * this.radius / AO;
targetX = anchor.x - OD;
targetY = anchor.y - ED;
if (AO < 2*this.radius && i>1) {
targetX = anchor.x - this.getLineLengthX(i-1)/2;
targetY = anchor.y - this.getLineLengthY(i-1)/2;;
}
// pivot point of next line
var AO = this.getLineLength(i);
if (AO < this.radius) {
AO = this.radius;
}
var ED = this.getLineLengthY(i) * this.radius / AO;
var OD = this.getLineLengthX(i) * this.radius / AO;
var nextSrcX = anchor.x + OD;
var nextSrcY = anchor.y + ED;
if (AO < 2*this.radius && i<this.getAnchorsCount()-2) {
nextSrcX = anchor.x + this.getLineLengthX(i)/2;
nextSrcY = anchor.y + this.getLineLengthY(i)/2;;
}
var dx0 = (cx - targetX) / 3,
dy0 = (cy - targetY) / 3,
ax = cx - dx0,
ay = cy - dy0,
dx1 = (cx - nextSrcX) / 3,
dy1 = (cy - nextSrcY) / 3,
bx = cx - dx1,
by = cy - dy1,
zx=nextSrcX, zy=nextSrcY;
} else if (i==1 && this.getAnchorsCount() == 2){
var AO = this.getLineLength(i-1);
if (AO < this.radius) {
AO = this.radius;
}
this.isDefaultConditionAvailable = (this.isDefaultConditionAvailable || (i == 1 && AO > 10));
}
// anti smoothing
if (this.strokeWidth%2 == 1) {
targetX += 0.5;
targetY += 0.5;
}
path.push([pathType, targetX, targetY]);
if (i>0 && i < this.getAnchorsCount()-1) {
path.push(["C", ax, ay, bx, by, zx, zy]);
}
}
if (this.closePath)
{
path.push(["Z"]);
}
this.path = path;
},
transform: function(transformation)
{
this.element.transform(transformation);
},
attr: function(attrs)
{
// TODO: foreach and set each
this.element.attr(attrs);
}
};
function Polygone(points, strokeWidth) {
/* Array on coordinates:
* points: [{x: 410, y: 110}, 1
* {x: 570, y: 110}, 1 2
* {x: 620, y: 240}, 2 3
* {x: 750, y: 270}, 3 4
* {x: 650, y: 370}]; 4
*/
this.points = points;
/*
* path for graph
* [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]]
*/
this.path = [];
this.anchors = [];
if (strokeWidth) this.strokeWidth = strokeWidth;
this.closePath = true;
this.init();
};
/*
* Poligone is inherited from Poliline: draws closedPath of polyline
*/
var Foo = function () { };
Foo.prototype = Polyline.prototype;
Polygone.prototype = new Foo();
Polygone.prototype.rebuildPath = function(){
var path = [];
for(var i = 0; i < this.getAnchorsCount(); i++){
var anchor = this.getAnchor(i);
var pathType = "";
if (i == 0)
pathType = "M";
else
pathType = "L";
var targetX = anchor.x, targetY = anchor.y;
// anti smoothing
if (this.strokeWidth%2 == 1) {
targetX += 0.5;
targetY += 0.5;
}
path.push([pathType, targetX, targetY]);
}
if (this.closePath)
path.push(["Z"]);
this.path = path;
};

880
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/bpmn-draw.js

@ -1,880 +0,0 @@
/* Copyright 2005-2015 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function _bpmnGetColor(element, defaultColor)
{
var strokeColor;
if(element.current) {
strokeColor = CURRENT_COLOR;
} else if(element.completed) {
strokeColor = COMPLETED_COLOR;
} else {
strokeColor = defaultColor;
}
return strokeColor;
}
function _drawPool(pool)
{
var rect = paper.rect(pool.x, pool.y, pool.width, pool.height);
rect.attr({"stroke-width": 1,
"stroke": "#000000",
"fill": "white"
});
if (pool.name)
{
var poolName = paper.text(pool.x + 14, pool.y + (pool.height / 2), pool.name).attr({
"text-anchor" : "middle",
"font-family" : "Arial",
"font-size" : "12",
"fill" : "#000000"
});
poolName.transform("r270");
}
if (pool.lanes)
{
for (var i = 0; i < pool.lanes.length; i++)
{
var lane = pool.lanes[i];
_drawLane(lane);
}
}
}
function _drawLane(lane)
{
var rect = paper.rect(lane.x, lane.y, lane.width, lane.height);
rect.attr({"stroke-width": 1,
"stroke": "#000000",
"fill": "white"
});
if (lane.name)
{
var laneName = paper.text(lane.x + 10, lane.y + (lane.height / 2), lane.name).attr({
"text-anchor" : "middle",
"font-family" : "Arial",
"font-size" : "12",
"fill" : "#000000"
});
laneName.transform("r270");
}
}
function _drawSubProcess(element)
{
var rect = paper.rect(element.x, element.y, element.width, element.height, 4);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
rect.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "white"
});
}
function _drawTransaction(element)
{
var rect = paper.rect(element.x, element.y, element.width, element.height, 4);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
rect.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "white"
});
var borderRect = paper.rect(element.x + 2, element.y + 2, element.width - 4, element.height -4, 4);
borderRect.attr({"stroke-width": 1,
"stroke": "black",
"fill": "none"
});
}
function _drawEventSubProcess(element)
{
var rect = paper.rect(element.x, element.y, element.width, element.height, 4);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
rect.attr({"stroke-width": 1,
"stroke": strokeColor,
"stroke-dasharray": ".",
"fill": "white"
});
}
function _drawAdhocSubProcess(element)
{
var rect = paper.rect(element.x, element.y, element.width, element.height, 4);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
rect.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "white"
});
paper.text(element.x + (element.width / 2), element.y + element.height - 8).attr({
"text-anchor" : "middle",
"font-family" : "Arial",
"font-size" : 20,
"text" : "~",
"fill" : "#373e48"
});
}
function _drawStartEvent(element)
{
var startEvent = _drawEvent(element, NORMAL_STROKE, 15);
startEvent.click(function() {
_zoom(true);
});
_addHoverLogic(element, "circle", MAIN_STROKE_COLOR);
}
function _drawEndEvent(element)
{
var endEvent = _drawEvent(element, ENDEVENT_STROKE, 14);
endEvent.click(function() {
_zoom(false);
});
_addHoverLogic(element, "circle", MAIN_STROKE_COLOR);
}
function _drawEvent(element, strokeWidth, radius)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, radius);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
// Fill
var eventFillColor = _determineCustomFillColor(element, "#ffffff");
// Opacity
var eventOpacity = 1.0;
if (customActivityBackgroundOpacity) {
eventOpacity = customActivityBackgroundOpacity;
}
if (element.interrupting === undefined || element.interrupting) {
circle.attr({
"stroke-width": strokeWidth,
"stroke": strokeColor,
"fill": eventFillColor,
"fill-opacity": eventOpacity
});
} else {
circle.attr({
"stroke-width": strokeWidth,
"stroke": strokeColor,
"stroke-dasharray": ".",
"fill": eventFillColor,
"fill-opacity": eventOpacity
});
}
circle.id = element.id;
_drawEventIcon(paper, element);
return circle;
}
function _drawServiceTask(element)
{
_drawTask(element);
if (element.taskType === "mail")
{
_drawSendTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "camel")
{
_drawCamelTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "mule")
{
_drawMuleTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "http")
{
_drawHttpTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "shell")
{
_drawShellTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.taskType === "dmn") {
_drawDecisionTaskIcon(paper, element.x + 4, element.y + 4);
}
else if (element.stencilIconId)
{
paper.image("../service/stencilitem/" + element.stencilIconId + "/icon", element.x + 4, element.y + 4, 16, 16);
}
else
{
_drawServiceTaskIcon(paper, element.x + 4, element.y + 4);
}
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawSendEventServiceTask(element)
{
_drawTask(element);
_drawSendTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawExternalWorkerServiceTask(element)
{
_drawTask(element);
_drawServiceTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawHttpServiceTask(element)
{
_drawTask(element);
_drawHttpTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawCallActivity(element)
{
var width = element.width - (CALL_ACTIVITY_STROKE / 2);
var height = element.height - (CALL_ACTIVITY_STROKE / 2);
var rect = paper.rect(element.x, element.y, width, height, 4);
var strokeColor = _bpmnGetColor(element, ACTIVITY_STROKE_COLOR);
// Fill
var callActivityFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR);
// Opacity
var callActivityOpacity = 1.0;
if (customActivityBackgroundOpacity) {
callActivityOpacity = customActivityBackgroundOpacity;
}
rect.attr({"stroke-width": CALL_ACTIVITY_STROKE,
"stroke": strokeColor,
"fill": callActivityFillColor,
"fill-opacity": callActivityOpacity
});
rect.id = element.id;
if (element.name) {
this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11);
}
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawScriptTask(element)
{
_drawTask(element);
_drawScriptTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawUserTask(element)
{
_drawTask(element);
_drawUserTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawBusinessRuleTask(element)
{
_drawTask(element);
_drawBusinessRuleTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawManualTask(element)
{
_drawTask(element);
_drawManualTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawSendTask(element)
{
_drawTask(element);
_drawSendTaskIcon(paper, element.x + 4, element.y + 4);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawReceiveTask(element)
{
_drawTask(element);
_drawReceiveTaskIcon(paper, element.x, element.y);
_addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR);
}
function _drawTask(element)
{
var rectAttrs = {};
// Stroke
var strokeColor = _bpmnGetColor(element, ACTIVITY_STROKE_COLOR);
rectAttrs['stroke'] = strokeColor;
var strokeWidth;
if (strokeColor === ACTIVITY_STROKE_COLOR) {
strokeWidth = TASK_STROKE;
} else {
strokeWidth = TASK_HIGHLIGHT_STROKE;
}
var width = element.width - (strokeWidth / 2);
var height = element.height - (strokeWidth / 2);
var rect = paper.rect(element.x, element.y, width, height, 4);
rectAttrs['stroke-width'] = strokeWidth;
// Fill
var fillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR);
rectAttrs['fill'] = fillColor;
// Opacity
if (customActivityBackgroundOpacity) {
rectAttrs['fill-opacity'] = customActivityBackgroundOpacity;
}
rect.attr(rectAttrs);
rect.id = element.id;
if (element.name) {
this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11);
}
}
function _drawExclusiveGateway(element)
{
_drawGateway(element);
var quarterWidth = element.width / 4;
var quarterHeight = element.height / 4;
var iks = paper.path(
"M" + (element.x + quarterWidth + 3) + " " + (element.y + quarterHeight + 3) +
"L" + (element.x + 3 * quarterWidth - 3) + " " + (element.y + 3 * quarterHeight - 3) +
"M" + (element.x + quarterWidth + 3) + " " + (element.y + 3 * quarterHeight - 3) +
"L" + (element.x + 3 * quarterWidth - 3) + " " + (element.y + quarterHeight + 3)
);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
// Fill
var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR);
// Opacity
var gatewayOpacity = 1.0;
if (customActivityBackgroundOpacity) {
gatewayOpacity = customActivityBackgroundOpacity;
}
iks.attr({"stroke-width": 3, "stroke": strokeColor, "fill": gatewayFillColor, "fill-opacity": gatewayOpacity});
_addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR);
}
function _drawParallelGateway(element)
{
_drawGateway(element);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
var path1 = paper.path("M 6.75,16 L 25.75,16 M 16,6.75 L 16,25.75");
// Fill
var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR);
// Opacity
var gatewayOpacity = 1.0;
if (customActivityBackgroundOpacity) {
gatewayOpacity = customActivityBackgroundOpacity;
}
path1.attr({
"stroke-width": 3,
"stroke": strokeColor,
"fill": gatewayFillColor,
"fill-opacity": gatewayOpacity
});
path1.transform("T" + (element.x + 4) + "," + (element.y + 4));
_addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR);
}
function _drawInclusiveGateway(element)
{
_drawGateway(element);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
var circle1 = paper.circle(element.x + (element.width / 2), element.y + (element.height / 2), 9.75);
// Fill
var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR);
// Opacity
var gatewayOpacity = 1.0;
if (customActivityBackgroundOpacity) {
gatewayOpacity = customActivityBackgroundOpacity;
}
circle1.attr({
"stroke-width": 2.5,
"stroke": strokeColor,
"fill": gatewayFillColor,
"fill-opacity": gatewayOpacity
});
_addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR);
}
function _drawEventGateway(element)
{
_drawGateway(element);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
var circle1 = paper.circle(element.x + (element.width / 2), element.y + (element.height / 2), 10.4);
// Fill
var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR);
// Opacity
var gatewayOpacity = 1.0;
if (customActivityBackgroundOpacity) {
gatewayOpacity = customActivityBackgroundOpacity;
}
circle1.attr({
"stroke-width": 0.5,
"stroke": strokeColor,
"fill": gatewayFillColor,
"fill-opacity": gatewayOpacity
});
var circle2 = paper.circle(element.x + (element.width / 2), element.y + (element.height / 2), 11.7);
circle2.attr({
"stroke-width": 0.5,
"stroke": strokeColor,
"fill": gatewayFillColor,
"fill-opacity": gatewayOpacity
});
var path1 = paper.path("M 20.327514,22.344972 L 11.259248,22.344216 L 8.4577203,13.719549 L 15.794545,8.389969 L 23.130481,13.720774 L 20.327514,22.344972 z");
path1.attr({
"stroke-width": 1.39999998,
"stroke": strokeColor,
"fill": gatewayFillColor,
"fill-opacity": gatewayOpacity,
"stroke-linejoin": "bevel"
});
path1.transform("T" + (element.x + 4) + "," + (element.y + 4));
_addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR);
}
function _drawGateway(element)
{
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
var rhombus = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) +
"L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + element.y + "z"
);
// Fill
var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR);
// Opacity
var gatewayOpacity = 1.0;
if (customActivityBackgroundOpacity) {
gatewayOpacity = customActivityBackgroundOpacity;
}
rhombus.attr("stroke-width", 2);
rhombus.attr("stroke", strokeColor);
rhombus.attr("fill", gatewayFillColor);
rhombus.attr("fill-opacity", gatewayOpacity);
rhombus.id = element.id;
return rhombus;
}
function _drawBoundaryEvent(element)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 15);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
if (element.cancelActivity) {
circle.attr({
"stroke-width": 1,
"stroke": strokeColor,
"fill": "white"
});
} else {
circle.attr({
"stroke-width": 1,
"stroke-dasharray": ".",
"stroke": strokeColor,
"fill": "white"
});
}
var innerCircle = paper.circle(x, y, 12);
if (element.cancelActivity) {
innerCircle.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "none"
});
} else {
innerCircle.attr({
"stroke-width": 1,
"stroke-dasharray": ".",
"stroke": strokeColor,
"fill": "none"
});
}
_drawEventIcon(paper, element);
_addHoverLogic(element, "circle", MAIN_STROKE_COLOR);
circle.id = element.id;
innerCircle.id = element.id + "_inner";
}
function _drawIntermediateCatchEvent(element)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 15);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
circle.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "white"
});
var innerCircle = paper.circle(x, y, 12);
innerCircle.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "none"
});
_drawEventIcon(paper, element);
_addHoverLogic(element, "circle", MAIN_STROKE_COLOR);
circle.id = element.id;
innerCircle.id = element.id + "_inner";
}
function _drawThrowEvent(element)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 15);
var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR);
circle.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "white"
});
var innerCircle = paper.circle(x, y, 12);
innerCircle.attr({"stroke-width": 1,
"stroke": strokeColor,
"fill": "none"
});
_drawEventIcon(paper, element);
_addHoverLogic(element, "circle", MAIN_STROKE_COLOR);
circle.id = element.id;
innerCircle.id = element.id + "_inner";
}
function _drawMultilineText(text, x, y, boxWidth, boxHeight, horizontalAnchor, verticalAnchor, fontSize)
{
if (!text || text == "")
{
return;
}
var textBoxX, textBoxY;
var width = boxWidth - (2 * TEXT_PADDING);
if (horizontalAnchor === "middle")
{
textBoxX = x + (boxWidth / 2);
}
else if (horizontalAnchor === "start")
{
textBoxX = x;
}
textBoxY = y + (boxHeight / 2);
var t = paper.text(textBoxX + TEXT_PADDING, textBoxY + TEXT_PADDING).attr({
"text-anchor" : horizontalAnchor,
"font-family" : "Arial",
"font-size" : fontSize,
"fill" : "#373e48"
});
var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
t.attr({
"text" : abc
});
var letterWidth = t.getBBox().width / abc.length;
t.attr({
"text" : text
});
var removedLineBreaks = text.split("\n");
var x = 0, s = [];
for (var r = 0; r < removedLineBreaks.length; r++)
{
var words = removedLineBreaks[r].split(" ");
for ( var i = 0; i < words.length; i++) {
var l = words[i].length;
if (x + (l * letterWidth) > width) {
s.push("\n");
x = 0;
}
x += l * letterWidth;
s.push(words[i] + " ");
}
s.push("\n");
x = 0;
}
t.attr({
"text" : s.join("")
});
if (verticalAnchor && verticalAnchor === "top")
{
t.attr({"y": y + (t.getBBox().height / 2)});
}
}
function _drawTextAnnotation(element)
{
var path1 = paper.path("M20,1 L1,1 L1,50 L20,50");
path1.attr({
"stroke": "#585858",
"fill": "none"
});
var annotation = paper.set();
annotation.push(path1);
annotation.transform("T" + element.x + "," + element.y);
if (element.text) {
this._drawMultilineText(element.text, element.x + 2, element.y, element.width, element.height, "start", "middle", 11);
}
}
function _drawFlow(flow){
var polyline = new Polyline(flow.id, flow.waypoints, SEQUENCEFLOW_STROKE, paper);
var strokeColor = _bpmnGetColor(flow, MAIN_STROKE_COLOR);
polyline.element = paper.path(polyline.path);
polyline.element.attr({"stroke-width":SEQUENCEFLOW_STROKE});
polyline.element.attr({"stroke":strokeColor});
polyline.element.id = flow.id;
var lastLineIndex = polyline.getLinesCount() - 1;
var line = polyline.getLine(lastLineIndex);
if (line == undefined) return;
if (flow.type == "connection" && flow.conditions)
{
var middleX = (line.x1 + line.x2) / 2;
var middleY = (line.y1 + line.y2) / 2;
var image = paper.image("../editor/images/condition-flow.png", middleX - 8, middleY - 8, 16, 16);
}
var polylineInvisible = new Polyline(flow.id, flow.waypoints, SEQUENCEFLOW_STROKE, paper);
polylineInvisible.element = paper.path(polyline.path);
polylineInvisible.element.attr({
"opacity": 0,
"stroke-width": 8,
"stroke" : "#000000"
});
if (flow.name) {
var firstLine = polyline.getLine(0);
var angle;
if (firstLine.x1 !== firstLine.x2) {
angle = Math.atan((firstLine.y2 - firstLine.y1) / (firstLine.x2 - firstLine.x1));
} else if (firstLine.y1 < firstLine.y2) {
angle = Math.PI / 2;
} else {
angle = -Math.PI / 2;
}
var flowName = paper.text(firstLine.x1, firstLine.y1, flow.name).attr({
"text-anchor": "middle",
"font-family" : "Arial",
"font-size" : "12",
"fill" : "#000000"
});
var offsetX = (flowName.getBBox().width / 2 + 5);
var offsetY = -(flowName.getBBox().height / 2 + 5);
if (firstLine.x1 > firstLine.x2) {
offsetX = -offsetX;
}
var rotatedOffsetX = offsetX * Math.cos(angle) - offsetY * Math.sin(angle);
var rotatedOffsetY = offsetX * Math.sin(angle) + offsetY * Math.cos(angle);
flowName.attr({
x: firstLine.x1 + rotatedOffsetX,
y: firstLine.y1 + rotatedOffsetY
});
flowName.transform("r" + ((angle) * 180) / Math.PI);
}
_showTip(jQuery(polylineInvisible.element.node), flow);
polylineInvisible.element.mouseover(function() {
paper.getById(polyline.element.id).attr({"stroke":"blue"});
});
polylineInvisible.element.mouseout(function() {
paper.getById(polyline.element.id).attr({"stroke":"#585858"});
});
_drawArrowHead(line);
}
function _drawAssociation(flow){
var polyline = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper);
polyline.element = paper.path(polyline.path);
polyline.element.attr({"stroke-width": ASSOCIATION_STROKE});
polyline.element.attr({"stroke-dasharray": ". "});
polyline.element.attr({"stroke":"#585858"});
polyline.element.id = flow.id;
var polylineInvisible = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper);
polylineInvisible.element = paper.path(polyline.path);
polylineInvisible.element.attr({
"opacity": 0,
"stroke-width": 8,
"stroke" : "#000000"
});
_showTip(jQuery(polylineInvisible.element.node), flow);
polylineInvisible.element.mouseover(function() {
paper.getById(polyline.element.id).attr({"stroke":"blue"});
});
polylineInvisible.element.mouseout(function() {
paper.getById(polyline.element.id).attr({"stroke":"#585858"});
});
}
function _drawArrowHead(line, connectionType)
{
var doubleArrowWidth = 2 * ARROW_WIDTH;
var arrowHead = paper.path("M0 0L-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2 + .5) + " -" + doubleArrowWidth + "z");
// anti smoothing
if (this.strokeWidth%2 == 1)
line.x2 += .5, line.y2 += .5;
arrowHead.transform("t" + line.x2 + "," + line.y2 + "");
arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0);
arrowHead.attr("fill", "#585858");
arrowHead.attr("stroke-width", SEQUENCEFLOW_STROKE);
arrowHead.attr("stroke", "#585858");
return arrowHead;
}
function _determineCustomFillColor(element, defaultColor) {
var color;
// By name
if (customActivityColors && customActivityColors[element.name]) {
color = customActivityColors[element.name];
}
if (color !== null && color !== undefined) {
return color;
}
// By id
if (customActivityColors && customActivityColors[element.id]) {
color = customActivityColors[element.id];
}
if (color !== null && color !== undefined) {
return color;
}
return defaultColor;
}

395
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/bpmn-icons.js

@ -1,395 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function _drawUserTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#d1b575"
});
var userTaskIcon = paper.set();
userTaskIcon.push(path1);
userTaskIcon.transform("T" + startX + "," + startY);
}
function _drawServiceTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M 8,1 7.5,2.875 c 0,0 -0.02438,0.250763 -0.40625,0.4375 C 7.05724,3.330353 7.04387,3.358818 7,3.375 6.6676654,3.4929791 6.3336971,3.6092802 6.03125,3.78125 6.02349,3.78566 6.007733,3.77681 6,3.78125 5.8811373,3.761018 5.8125,3.71875 5.8125,3.71875 l -1.6875,-1 -1.40625,1.4375 0.96875,1.65625 c 0,0 0.065705,0.068637 0.09375,0.1875 0.002,0.00849 -0.00169,0.022138 0,0.03125 C 3.6092802,6.3336971 3.4929791,6.6676654 3.375,7 3.3629836,7.0338489 3.3239228,7.0596246 3.3125,7.09375 3.125763,7.4756184 2.875,7.5 2.875,7.5 L 1,8 l 0,2 1.875,0.5 c 0,0 0.250763,0.02438 0.4375,0.40625 0.017853,0.03651 0.046318,0.04988 0.0625,0.09375 0.1129372,0.318132 0.2124732,0.646641 0.375,0.9375 -0.00302,0.215512 -0.09375,0.34375 -0.09375,0.34375 L 2.6875,13.9375 4.09375,15.34375 5.78125,14.375 c 0,0 0.1229911,-0.09744 0.34375,-0.09375 0.2720511,0.147787 0.5795915,0.23888 0.875,0.34375 0.033849,0.01202 0.059625,0.05108 0.09375,0.0625 C 7.4756199,14.874237 7.5,15.125 7.5,15.125 L 8,17 l 2,0 0.5,-1.875 c 0,0 0.02438,-0.250763 0.40625,-0.4375 0.03651,-0.01785 0.04988,-0.04632 0.09375,-0.0625 0.332335,-0.117979 0.666303,-0.23428 0.96875,-0.40625 0.177303,0.0173 0.28125,0.09375 0.28125,0.09375 l 1.65625,0.96875 1.40625,-1.40625 -0.96875,-1.65625 c 0,0 -0.07645,-0.103947 -0.09375,-0.28125 0.162527,-0.290859 0.262063,-0.619368 0.375,-0.9375 0.01618,-0.04387 0.04465,-0.05724 0.0625,-0.09375 C 14.874237,10.52438 15.125,10.5 15.125,10.5 L 17,10 17,8 15.125,7.5 c 0,0 -0.250763,-0.024382 -0.4375,-0.40625 C 14.669647,7.0572406 14.641181,7.0438697 14.625,7 14.55912,6.8144282 14.520616,6.6141566 14.4375,6.4375 c -0.224363,-0.4866 0,-0.71875 0,-0.71875 L 15.40625,4.0625 14,2.625 l -1.65625,1 c 0,0 -0.253337,0.1695664 -0.71875,-0.03125 l -0.03125,0 C 11.405359,3.5035185 11.198648,3.4455201 11,3.375 10.95613,3.3588185 10.942759,3.3303534 10.90625,3.3125 10.524382,3.125763 10.5,2.875 10.5,2.875 L 10,1 8,1 z m 1,5 c 1.656854,0 3,1.3431458 3,3 0,1.656854 -1.343146,3 -3,3 C 7.3431458,12 6,10.656854 6,9 6,7.3431458 7.3431458,6 9,6 z");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#72a7d0"
});
var serviceTaskIcon = paper.set();
serviceTaskIcon.push(path1);
serviceTaskIcon.transform("T" + startX + "," + startY);
}
function _drawScriptTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 5,2 0,0.094 c 0.23706,0.064 0.53189,0.1645 0.8125,0.375 0.5582,0.4186 1.05109,1.228 1.15625,2.5312 l 8.03125,0 1,0 1,0 c 0,-3 -2,-3 -2,-3 l -10,0 z M 4,3 4,13 2,13 c 0,3 2,3 2,3 l 9,0 c 0,0 2,0 2,-3 L 15,6 6,6 6,5.5 C 6,4.1111 5.5595,3.529 5.1875,3.25 4.8155,2.971 4.5,3 4.5,3 L 4,3 z");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#72a7d0"
});
var scriptTaskIcon = paper.set();
scriptTaskIcon.push(path1);
scriptTaskIcon.transform("T" + startX + "," + startY);
}
function _drawBusinessRuleTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.45458,5.6000386 2.90906,0 0,2.7999224 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.7999224 -8.72718,0 z m -4.36364,4.1998844 2.90906,0 0,2.800116 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.800116 -8.72718,0 z");
path1.attr({
"stroke": "none",
"fill": "#72a7d0"
});
var businessRuleTaskIcon = paper.set();
businessRuleTaskIcon.push(path1);
businessRuleTaskIcon.transform("T" + startX + "," + startY);
}
function _drawSendTaskIcon(paper, startX, startY)
{
var path1 = paper.path("M 1 3 L 9 11 L 17 3 L 1 3 z M 1 5 L 1 13 L 5 9 L 1 5 z M 17 5 L 13 9 L 17 13 L 17 5 z M 6 10 L 1 15 L 17 15 L 12 10 L 9 13 L 6 10 z");
path1.attr({
"stroke": "none",
"fill": "#16964d"
});
var sendTaskIcon = paper.set();
sendTaskIcon.push(path1);
sendTaskIcon.transform("T" + startX + "," + startY);
}
function _drawManualTaskIcon(paper, startX, startY)
{
var path1 = paper.path("m 17,9.3290326 c -0.0069,0.5512461 -0.455166,1.0455894 -0.940778,1.0376604 l -5.792746,0 c 0.0053,0.119381 0.0026,0.237107 0.0061,0.355965 l 5.154918,0 c 0.482032,-0.0096 0.925529,0.49051 0.919525,1.037574 -0.0078,0.537128 -0.446283,1.017531 -0.919521,1.007683 l -5.245273,0 c -0.01507,0.104484 -0.03389,0.204081 -0.05316,0.301591 l 2.630175,0 c 0.454137,-0.0096 0.872112,0.461754 0.866386,0.977186 C 13.619526,14.554106 13.206293,15.009498 12.75924,15 L 3.7753054,15 C 3.6045812,15 3.433552,14.94423 3.2916363,14.837136 c -0.00174,0 -0.00436,0 -0.00609,0 C 1.7212035,14.367801 0.99998255,11.458641 1,11.458641 L 1,7.4588393 c 0,0 0.6623144,-1.316333 1.8390583,-2.0872584 1.1767614,-0.7711868 6.8053358,-2.40497 7.2587847,-2.8052901 0.453484,-0.40032 1.660213,1.4859942 0.04775,2.4010487 C 8.5332315,5.882394 8.507351,5.7996113 8.4370292,5.7936859 l 6.3569748,-0.00871 c 0.497046,-0.00958 0.952273,0.5097676 0.94612,1.0738232 -0.0053,0.556126 -0.456176,1.0566566 -0.94612,1.0496854 l -4.72435,0 c 0.01307,0.1149374 0.0244,0.2281319 0.03721,0.3498661 l 5.952195,0 c 0.494517,-0.00871 0.947906,0.5066305 0.940795,1.0679848 z");
path1.attr({
"opacity": 1,
"stroke": "none",
"fill": "#d1b575"
});
var manualTaskIcon = paper.set();
manualTaskIcon.push(path1);
manualTaskIcon.transform("T" + startX + "," + startY);
}
function _drawReceiveTaskIcon(paper, startX, startY)
{
var path = paper.path("m 0.5,2.5 0,13 17,0 0,-13 z M 2,4 6.5,8.5 2,13 z M 4,4 14,4 9,9 z m 12,0 0,9 -4.5,-4.5 z M 7.5,9.5 9,11 10.5,9.5 15,14 3,14 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#16964d"
});
startX += 4;
startY += 2;
path.transform("T" + startX + "," + startY);
}
function _drawCamelTaskIcon(paper, startX, startY)
{
var path = paper.path("m 8.1878027,15.383782 c -0.824818,-0.3427 0.375093,-1.1925 0.404055,-1.7743 0.230509,-0.8159 -0.217173,-1.5329 -0.550642,-2.2283 -0.106244,-0.5273 -0.03299,-1.8886005 -0.747194,-1.7818005 -0.712355,0.3776 -0.9225,1.2309005 -1.253911,1.9055005 -0.175574,1.0874 -0.630353,2.114 -0.775834,3.2123 -0.244009,0.4224 -1.741203,0.3888 -1.554386,-0.1397 0.651324,-0.3302 1.13227,-0.9222 1.180246,-1.6705 0.0082,-0.7042 -0.133578,-1.3681 0.302178,-2.0083 0.08617,-0.3202 0.356348,-1.0224005 -0.218996,-0.8051 -0.694517,0.2372 -1.651062,0.6128 -2.057645,-0.2959005 -0.696769,0.3057005 -1.102947,-0.611 -1.393127,-1.0565 -0.231079,-0.6218 -0.437041,-1.3041 -0.202103,-1.9476 -0.185217,-0.7514 -0.39751099,-1.5209 -0.35214999,-2.301 -0.243425,-0.7796 0.86000899,-1.2456 0.08581,-1.8855 -0.76078999,0.1964 -1.41630099,-0.7569 -0.79351899,-1.2877 0.58743,-0.52829998 1.49031699,-0.242 2.09856399,-0.77049998 0.816875,-0.3212 1.256619,0.65019998 1.923119,0.71939998 0.01194,0.7333 -0.0031,1.5042 -0.18417,2.2232 -0.194069,0.564 -0.811196,1.6968 0.06669,1.9398 0.738382,-0.173 1.095723,-0.9364 1.659041,-1.3729 0.727298,-0.3962 1.093982,-1.117 1.344137,-1.8675 0.400558,-0.8287 1.697676,-0.6854 1.955367,0.1758 0.103564,0.5511 0.9073983,1.7538 1.2472763,0.6846 0.121868,-0.6687 0.785541,-1.4454 1.518183,-1.0431 0.813587,0.4875 0.658233,1.6033 1.285504,2.2454 0.768715,0.8117 1.745394,1.4801 2.196633,2.5469 0.313781,0.8074 0.568552,1.707 0.496624,2.5733 -0.35485,0.8576005 -1.224508,-0.216 -0.64725,-0.7284 0.01868,-0.3794 -0.01834,-1.3264 -0.370249,-1.3272 -0.123187,0.7586 -0.152778,1.547 -0.10869,2.3154 0.270285,0.6662005 1.310741,0.7653005 1.060553,1.6763005 -0.03493,0.9801 0.294343,1.9505 0.148048,2.9272 -0.320479,0.2406 -0.79575,0.097 -1.185062,0.1512 -0.165725,0.3657 -0.40138,0.921 -1.020848,0.6744 -0.564671,0.1141 -1.246404,-0.266 -0.578559,-0.7715 0.679736,-0.5602 0.898618,-1.5362 0.687058,-2.3673 -0.529674,-1.108 -1.275984,-2.0954005 -1.839206,-3.1831005 -0.634619,-0.1004 -1.251945,0.6779 -1.956789,0.7408 -0.6065893,-0.038 -1.0354363,-0.06 -0.8495673,0.6969005 0.01681,0.711 0.152396,1.3997 0.157345,2.1104 0.07947,0.7464 0.171287,1.4944 0.238271,2.2351 0.237411,1.0076 -0.687542,1.1488 -1.414811,0.8598 z m 6.8675483,-1.8379 c 0.114364,-0.3658 0.206751,-1.2704 -0.114466,-1.3553 -0.152626,0.5835 -0.225018,1.1888 -0.227537,1.7919 0.147087,-0.1166 0.265559,-0.2643 0.342003,-0.4366 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#bd4848"
});
startX += 4;
startY += 2;
path.transform("T" + startX + "," + startY);
}
function _drawMuleTaskIcon(paper, startX, startY)
{
var path = paper.path("M 8,0 C 3.581722,0 0,3.5817 0,8 c 0,4.4183 3.581722,8 8,8 4.418278,0 8,-3.5817 8,-8 L 16,7.6562 C 15.813571,3.3775 12.282847,0 8,0 z M 5.1875,2.7812 8,7.3437 10.8125,2.7812 c 1.323522,0.4299 2.329453,1.5645 2.8125,2.8438 1.136151,2.8609 -0.380702,6.4569 -3.25,7.5937 -0.217837,-0.6102 -0.438416,-1.2022 -0.65625,-1.8125 0.701032,-0.2274 1.313373,-0.6949 1.71875,-1.3125 0.73624,-1.2317 0.939877,-2.6305 -0.03125,-4.3125 l -2.75,4.0625 -0.65625,0 -0.65625,0 -2.75,-4 C 3.5268433,7.6916 3.82626,8.862 4.5625,10.0937 4.967877,10.7113 5.580218,11.1788 6.28125,11.4062 6.063416,12.0165 5.842837,12.6085 5.625,13.2187 2.755702,12.0819 1.238849,8.4858 2.375,5.625 2.858047,4.3457 3.863978,3.2112 5.1875,2.7812 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#bd4848"
});
startX += 4;
startY += 2;
path.transform("T" + startX + "," + startY);
}
function _drawAlfrescoPublishTaskIcon(paper, startX, startY)
{
startX += 2;
startY += 2;
var path = paper.path("M4.11870968,2.12890323 L6.12954839,0.117935484 L3.10993548,0.118064516 L3.10270968,0.118064516 C1.42941935,0.118064516 0.0729032258,1.47458065 0.0729032258,3.14774194 C0.0729032258,4.82116129 1.42929032,6.17754839 3.10258065,6.17754839 C3.22967742,6.17754839 3.35470968,6.16877419 3.47767742,6.15354839 C2.8163871,4.85083871 3.02954839,3.21793548 4.11870968,2.12890323M6.57032258,3.144 L6.57032258,0.300258065 L4.43522581,2.4356129 L4.43006452,2.44064516 C3.24683871,3.62387097 3.24683871,5.54219355 4.43006452,6.72541935 C5.61329032,7.90864516 7.5316129,7.90864516 8.71483871,6.72541935 C8.80464516,6.6356129 8.88529032,6.54025806 8.96154839,6.44270968 C7.57341935,5.98864516 6.57045161,4.68387097 6.57032258,3.144");
path.attr({"fill": "#87C040"});
var startX1 = startX + 1.419355;
var startY1 = startY + 8.387097;
path.transform("T" + startX1 + "," + startY1);
path = paper.path("M10.4411613,10.5153548 L8.43032258,8.50451613 L8.43032258,11.5313548 C8.43032258,13.2047742 9.78683871,14.5611613 11.460129,14.5611613 C13.1334194,14.5611613 14.4899355,13.2047742 14.4899355,11.5314839 C14.4899355,11.4043871 14.4811613,11.2793548 14.4659355,11.1563871 C13.1632258,11.8178065 11.5303226,11.6045161 10.4411613,10.5153548M15.0376774,5.91935484 C14.947871,5.82954839 14.8526452,5.74890323 14.7550968,5.67264516 C14.3010323,7.06064516 12.996129,8.06374194 11.4563871,8.06374194 L8.61277419,8.06374194 L10.7529032,10.204 C11.936129,11.3872258 13.8545806,11.3872258 15.0376774,10.204 C16.2209032,9.02077419 16.2209032,7.10245161 15.0376774,5.91935484");
path.attr({"fill": "#87C040"});
path.transform("T" + startX + "," + startY);
path = paper.path("M5.9083871,1.5636129 C5.78129032,1.5636129 5.65625806,1.57225806 5.53329032,1.58748387 C6.19458065,2.89032258 5.98141935,4.52309677 4.89225806,5.61225806 L2.88154839,7.62309677 L5.9083871,7.62309677 C7.58154839,7.62309677 8.93806452,6.26658065 8.93806452,4.59329032 C8.93819355,2.92 7.58167742,1.5636129 5.9083871,1.5636129");
path.attr({"fill": "#ED9A2D"});
var startX2 = startX + 5.548387;
path.transform("T" + startX2 + "," + startY);
path = paper.path("M4.58090323,1.0156129 C3.39767742,-0.167483871 1.47935484,-0.167483871 0.296129032,1.01574194 C0.206451613,1.10554839 0.125806452,1.20077419 0.0495483871,1.29845161 C1.43754839,1.75251613 2.44064516,3.05729032 2.44064516,4.59703226 L2.44064516,7.44077419 L4.57574194,5.30554839 L4.58090323,5.30051613 C5.76412903,4.11729032 5.76412903,2.19896774 4.58090323,1.0156129");
path.attr({"fill": "#5698C6"});
path.transform("T" + startX2 + "," + startY);
path = paper.path("M5.54051613,5.61432258 L5.62670968,5.70425806 L7.54632258,7.62387097 L7.5483871,7.62387097 L7.5483871,4.604 L7.5483871,4.59677419 C7.5483871,2.92348387 6.19187097,1.56696774 4.51858065,1.56696774 C2.84529032,1.56696774 1.48877419,2.92335484 1.48890323,4.59664516 C1.48890323,4.72348387 1.49754839,4.84812903 1.51264516,4.97083871 C2.81625806,4.30993548 4.45122581,4.52503226 5.54051613,5.61432258M1.23251613,10.4292903 C1.25625806,10.3588387 1.28180645,10.2894194 1.30980645,10.2210323 C1.31329032,10.2123871 1.3163871,10.2036129 1.32,10.1952258 C1.35070968,10.1216774 1.38451613,10.0500645 1.42,9.97935484 C1.42774194,9.96374194 1.43574194,9.9483871 1.44387097,9.93277419 C1.4803871,9.86258065 1.51883871,9.79354839 1.55987097,9.72632258 C1.56425806,9.71909677 1.56903226,9.71225806 1.57341935,9.70529032 C1.6123871,9.64245161 1.65354839,9.58141935 1.6963871,9.52141935 C1.70516129,9.50903226 1.71380645,9.49651613 1.72283871,9.48425806 C1.76890323,9.42154839 1.81690323,9.36064516 1.86683871,9.30129032 C1.87703226,9.28916129 1.88735484,9.27741935 1.89780645,9.26567742 C1.94658065,9.20916129 1.99690323,9.15406452 2.04916129,9.10090323 C2.05380645,9.09625806 2.05806452,9.09135484 2.06270968,9.08670968 C2.11832258,9.03083871 2.17625806,8.97741935 2.23548387,8.92554839 C2.2483871,8.91419355 2.26129032,8.90296774 2.27432258,8.89187097 C2.33393548,8.84103226 2.39496774,8.79212903 2.45780645,8.74529032 C2.46606452,8.73922581 2.47470968,8.73354839 2.48296774,8.7276129 C2.54167742,8.68490323 2.60180645,8.64412903 2.66322581,8.60503226 C2.67535484,8.59729032 2.68735484,8.58929032 2.6996129,8.58167742 C2.76593548,8.54064516 2.83380645,8.50206452 2.90296774,8.46541935 C2.91754839,8.45780645 2.93225806,8.45045161 2.94696774,8.44296774 C3.016,8.40774194 3.08593548,8.37406452 3.15741935,8.34348387 C3.16090323,8.34206452 3.16425806,8.3403871 3.16774194,8.33883871 C3.24167742,8.30748387 3.31729032,8.27948387 3.39380645,8.25316129 C3.41032258,8.24748387 3.42670968,8.24180645 3.44335484,8.2363871 C3.51909677,8.21174194 3.59587097,8.18903226 3.67380645,8.16929032 C3.68567742,8.16645161 3.69793548,8.16387097 3.70980645,8.16116129 C3.78206452,8.14374194 3.85509677,8.12877419 3.92890323,8.116 C3.94270968,8.11367742 3.9563871,8.11083871 3.97019355,8.10877419 C4.05032258,8.09587097 4.13148387,8.08619355 4.21329032,8.07896774 C4.23096774,8.07741935 4.24877419,8.07625806 4.26645161,8.07483871 C4.35109677,8.06877419 4.43612903,8.06451613 4.52232258,8.06451613 L7.36606452,8.0643871 L5.22580645,5.92412903 C4.04258065,4.74103226 2.12412903,4.74090323 0.941032258,5.92412903 C-0.242193548,7.10735484 -0.242193548,9.02567742 0.941032258,10.2089032 C1.03070968,10.2985806 1.12464516,10.3814194 1.22206452,10.4575484 C1.22529032,10.448 1.22929032,10.4388387 1.23251613,10.4292903");
path.attr({"fill": "#5698C6"});
path.transform("T" + startX + "," + startY);
path = paper.path("M5.23290323,5.92412903 L6.92748387,7.61870968 L4.64980645,7.61870968 L4.52064516,7.62141935 C3.13354839,7.62141935 1.96425806,6.68929032 1.60477419,5.41729032 C2.75870968,4.77019355 4.24619355,4.93754839 5.22787097,5.91909677 L5.23290323,5.92412903M7.54722581,4.59612903 L7.54722581,6.99264516 L5.93664516,5.38206452 L5.84348387,5.29264516 C4.86258065,4.31187097 4.69483871,2.82580645 5.34012903,1.67225806 C6.61367742,2.03070968 7.54722581,3.20090323 7.54722581,4.58890323 L7.54722581,4.59612903M10.1385806,5.29819355 L8.444,6.99290323 L8.444,4.71522581 L8.44129032,4.58606452 C8.44129032,3.19896774 9.37341935,2.02954839 10.6454194,1.67019355 C11.2925161,2.82412903 11.1251613,4.3116129 10.1436129,5.29316129 L10.1385806,5.29819355");
path.attr({"fill": "#446BA5"});
path.transform("T" + startX + "," + startY);
path = paper.path("M11.4548387,7.61677419 L9.05832258,7.61677419 L10.6689032,6.00619355 L10.7583226,5.91303226 C11.7390968,4.93212903 13.2251613,4.7643871 14.3787097,5.40967742 C14.0202581,6.68322581 12.8500645,7.61677419 11.4620645,7.61677419 L11.4548387,7.61677419");
path.attr({"fill": "#FFF101"});
path.transform("T" + startX + "," + startY);
path = paper.path("M10.7470968,10.192 L9.05251613,8.49741935 L11.3301935,8.49741935 L11.4593548,8.49470968 C12.8464516,8.49483871 14.0157419,9.42696774 14.3752258,10.6989677 C13.2211613,11.3459355 11.7338065,11.1787097 10.752129,10.1970323 L10.7470968,10.192M8.43729032,11.5174194 L8.43729032,9.12090323 L10.047871,10.7314839 L10.1411613,10.8209032 C11.1219355,11.8018065 11.2896774,13.2876129 10.6443871,14.4412903 C9.37083871,14.0828387 8.43729032,12.9127742 8.43729032,11.5245161 L8.43729032,11.5174194M5.86193548,10.8296774 L7.55651613,9.13496774 L7.55651613,11.4126452 L7.55922581,11.5418065 C7.55922581,12.9289032 6.62709677,14.0983226 5.35509677,14.4578065 C4.708,13.3036129 4.87535484,11.8162581 5.85690323,10.8347097 L5.86193548,10.8296774M4.53251613,8.50993548 L6.92903226,8.50993548 L5.31845161,10.1205161 L5.22903226,10.2136774 C4.24812903,11.1945806 2.76219355,11.3623226 1.60851613,10.7170323 C1.96709677,9.44335484 3.13716129,8.50993548 4.52529032,8.50993548 L4.53251613,8.50993548");
path.attr({"fill": "#45AB47"});
path.transform("T" + startX + "," + startY);
}
function _drawHttpTaskIcon(paper, startX, startY)
{
var path = paper.path("m 16.704699,5.9229055 q 0.358098,0 0.608767,0.2506681 0.250669,0.250668 0.250669,0.6087677 0,0.3580997 -0.250669,0.6087677 -0.250669,0.2506679 -0.608767,0.2506679 -0.358098,0 -0.608767,-0.2506679 -0.250669,-0.250668 -0.250669,-0.6087677 0,-0.3580997 0.250669,-0.6087677 0.250669,-0.2506681 0.608767,-0.2506681 z m 2.578308,-2.0053502 q -2.229162,0 -3.854034,0.6759125 -1.624871,0.6759067 -3.227361,2.2694472 -0.716197,0.725146 -1.575633,1.7457293 L 7.2329969,8.7876913 Q 7.0897576,8.8055849 7.000233,8.9309334 L 4.9948821,12.368677 q -0.035811,0.06267 -0.035811,0.143242 0,0.107426 0.080572,0.205905 l 0.5729577,0.572957 q 0.125334,0.116384 0.2864786,0.07162 l 2.4708789,-0.760963 2.5156417,2.515645 -0.76096,2.470876 q -0.009,0.02687 -0.009,0.08057 0,0.125338 0.08058,0.205905 l 0.572957,0.572958 q 0.170096,0.152194 0.349146,0.04476 l 3.437744,-2.005351 q 0.125335,-0.08953 0.143239,-0.232763 l 0.17905,-3.392986 q 1.02058,-0.859435 1.745729,-1.575629 1.67411,-1.6830612 2.309735,-3.2049805 0.635625,-1.5219191 0.635625,-3.8585111 0,-0.1253369 -0.08505,-0.2148575 -0.08505,-0.089526 -0.201431,-0.089526 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#16964d"
});
startX += -2;
startY += -2;
path.transform("T" + startX + "," + startY);
}
function _drawShellTaskIcon(paper, startX, startY) {
var path = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.4,3 12.7,0 0,10 -12.7,0 z");
path.attr({
"opacity": 1,
"stroke": "none",
"fill": "#16964d"
});
var text = paper.text(3, 9, ">_").attr({
"font-size": "5px",
"fill": "#16964d"
});
startY += -2;
text.transform("T" + startX + "," + startY);
startX += -2;
path.transform("T" + startX + "," + startY);
}
function _drawDecisionTaskIcon(paper, startX, startY) {
var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.9,2.4000386 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z");
path1.attr({
"opacity": 1,
"stroke": "#000000",
"fill": "#F4F6F7"
});
var decisionTaskIcon = paper.set();
decisionTaskIcon.push(path1);
decisionTaskIcon.translate(startX, startY);
decisionTaskIcon.scale(0.7, 0.7);
}
function _drawEventIcon(paper, element)
{
if (element.eventDefinition && element.eventDefinition.type) {
if ("timer" === element.eventDefinition.type) {
_drawTimerIcon(paper, element);
} else if ("conditional" === element.eventDefinition.type) {
_drawConditionalIcon(paper, element);
} else if ("error" === element.eventDefinition.type) {
_drawErrorIcon(paper, element);
} else if ("escalation" === element.eventDefinition.type) {
_drawEscalationIcon(paper, element);
} else if ("signal" === element.eventDefinition.type) {
_drawSignalIcon(paper, element);
} else if ("message" === element.eventDefinition.type) {
_drawMessageIcon(paper, element);
} else if ("eventRegistry" === element.eventDefinition.type) {
_drawMessageIcon(paper, element);
} else if ("variable" === element.eventDefinition.type) {
_drawVariableListenerIcon(paper, element);
}
}
}
function _drawConditionalIcon(paper, element)
{
var fill = "none";
var path = paper.path("M 10 10 L 22 10 M 10 14 L 22 14 M 10 18 L 22 18 M 10 22 L 22 22");
path.attr({
"stroke": "black",
"stroke-width": 1,
"fill": fill
});
path.transform("T" + (element.x - 1) + "," + (element.y - 1));
return path;
}
function _drawVariableListenerIcon(paper, element)
{
var fill = "none";
var path = paper.path("M 20.834856,22.874369 L 10.762008,22.873529 L 7.650126,13.293421 L 15.799725,7.3734296 L 23.948336,13.294781 L 20.834856,22.874369 z");
path.attr({
"stroke": "black",
"stroke-width": 1,
"fill": fill
});
path.transform("T" + (element.x - 1) + "," + (element.y - 1));
return path;
}
function _drawTimerIcon(paper, element)
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
var circle = paper.circle(x, y, 10);
circle.attr({"stroke-width": 1,
"stroke": "black",
"fill": "none"
});
var path = paper.path("M 10 0 C 4.4771525 0 0 4.4771525 0 10 C 0 15.522847 4.4771525 20 10 20 C 15.522847 20 20 15.522847 20 10 C 20 4.4771525 15.522847 1.1842379e-15 10 0 z M 9.09375 1.03125 C 9.2292164 1.0174926 9.362825 1.0389311 9.5 1.03125 L 9.5 3.5 L 10.5 3.5 L 10.5 1.03125 C 15.063526 1.2867831 18.713217 4.9364738 18.96875 9.5 L 16.5 9.5 L 16.5 10.5 L 18.96875 10.5 C 18.713217 15.063526 15.063526 18.713217 10.5 18.96875 L 10.5 16.5 L 9.5 16.5 L 9.5 18.96875 C 4.9364738 18.713217 1.2867831 15.063526 1.03125 10.5 L 3.5 10.5 L 3.5 9.5 L 1.03125 9.5 C 1.279102 5.0736488 4.7225326 1.4751713 9.09375 1.03125 z M 9.5 5 L 9.5 8.0625 C 8.6373007 8.2844627 8 9.0680195 8 10 C 8 11.104569 8.8954305 12 10 12 C 10.931981 12 11.715537 11.362699 11.9375 10.5 L 14 10.5 L 14 9.5 L 11.9375 9.5 C 11.756642 8.7970599 11.20294 8.2433585 10.5 8.0625 L 10.5 5 L 9.5 5 z");
path.attr({
"stroke": "none",
"fill": "#585858"
});
path.transform("T" + (element.x + 5) + "," + (element.y + 5));
return path;
}
function _drawErrorIcon(paper, element)
{
var path = paper.path("M 22.820839,11.171502 L 19.36734,24.58992 L 13.54138,14.281819 L 9.3386512,20.071607 L 13.048949,6.8323057 L 18.996148,16.132659 L 22.820839,11.171502 z");
var fill = "none";
var x = element.x - 1;
var y = element.y - 1;
if (element.type === "EndEvent")
{
fill = "black";
x -= 1;
y -= 1;
}
path.attr({
"stroke": "black",
"stroke-width": 1,
"fill": fill
});
path.transform("T" + x + "," + y);
return path;
}
function _drawEscalationIcon(paper, element)
{
var fill = "none";
if (element.type === "ThrowEvent")
{
fill = "black";
}
var path = paper.path("M 16,8.75 L22,23.75 L16,17 L10,23.75z");
path.attr({
"stroke": "black",
"stroke-width": 1,
"fill": fill
});
path.transform("T" + (element.x - 1) + "," + (element.y - 1));
return path;
}
function _drawSignalIcon(paper, element)
{
var fill = "none";
if (element.type === "ThrowEvent")
{
fill = "black";
}
var path = paper.path("M 8.7124971,21.247342 L 23.333334,21.247342 L 16.022915,8.5759512 L 8.7124971,21.247342 z");
path.attr({
"stroke": "black",
"stroke-width": 1,
"fill": fill
});
path.transform("T" + (element.x - 1) + "," + (element.y - 1));
return path;
}
function _drawMessageIcon(paper, element)
{
var fill = "none";
if (element.type === "ThrowEvent")
{
fill = "black";
}
var path = paper.path("M 1 3 L 9 11 L 17 3 L 1 3 z M 1 5 L 1 13 L 5 9 L 1 5 z M 17 5 L 13 9 L 17 13 L 17 5 z M 6 10 L 1 15 L 17 15 L 12 10 L 9 13 L 6 10 z");
path.attr({
"stroke": "black",
"stroke-width": 1,
"fill": fill
});
path.transform("T" + (element.x + 6) + "," + (element.y + 6));
return path;
}

24
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/displaymodel.css

@ -1,24 +0,0 @@
div[class*='ui-tooltip-kisbpm-'] {
background-color: #ffffff;
border-color: #c5c5c5;
color: #4a4a4a;
font-family: Verdana;
font-size: 12px;
}
div[class*='ui-tooltip-kisbpm-'] .qtip-content {
color: #4a4a4a;
background-color: #ffffff;
font-family: Verdana;
font-size: 12px;
}
.ui-tooltip-kisbpm-bpmn .qtip-titlebar {
color: #FFFFFF;
font-size: 12px;
background: #2B414F;
}
.ui-tooltip-kisbpm-bpmn .qtip-tip {
background-color: #2B414F;
}

19
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/displaymodel.html

@ -1,19 +0,0 @@
<html>
<head>
<!-- build:css display/styles/displaymodel-style.css -->
<link type="text/css" rel="stylesheet" href="display/jquery.qtip.min.css" />
<link type="text/css" rel="stylesheet" href="display/displaymodel.css" />
<!-- endbuild -->
<!-- build:js display/scripts/displaymodel-logic.js -->
<script type="text/javascript" src="display/jquery.qtip.min.js"></script>
<script type="text/javascript" src="display/raphael.min.js"></script>
<script type="text/javascript" src="display/bpmn-draw.js"></script>
<script type="text/javascript" src="display/bpmn-icons.js"></script>
<script type="text/javascript" src="display/Polyline.js"></script>
<script type="text/javascript" src="display/displaymodel.js"></script>
<!-- endbuild -->
</head>
</html>

316
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/displaymodel.js

@ -1,316 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var NORMAL_STROKE = 1;
var SEQUENCEFLOW_STROKE = 1.5;
var ASSOCIATION_STROKE = 2;
var TASK_STROKE = 1;
var TASK_HIGHLIGHT_STROKE = 2;
var CALL_ACTIVITY_STROKE = 2;
var ENDEVENT_STROKE = 3;
var COMPLETED_COLOR= "#2632aa";
var TEXT_COLOR= "#373e48";
var CURRENT_COLOR= "#017501";
var HOVER_COLOR= "#666666";
var ACTIVITY_STROKE_COLOR = "#bbbbbb";
var ACTIVITY_FILL_COLOR = "#f9f9f9";
var MAIN_STROKE_COLOR = "#585858";
var TEXT_PADDING = 3;
var ARROW_WIDTH = 4;
var MARKER_WIDTH = 12;
var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Raphael.rgb(0, 0, 0)};
// icons
var ICON_SIZE = 16;
var ICON_PADDING = 4;
var INITIAL_CANVAS_WIDTH;
var INITIAL_CANVAS_HEIGHT;
var paper;
var viewBox;
var viewBoxWidth;
var viewBoxHeight;
var canvasWidth;
var canvasHeight;
var modelDiv = jQuery('#bpmnModel');
var modelId = modelDiv.attr('data-model-id');
var historyModelId = modelDiv.attr('data-history-id');
var processDefinitionId = modelDiv.attr('data-process-definition-id');
var modelType = modelDiv.attr('data-model-type');
// Support for custom background colors for activities
var customActivityColors = modelDiv.attr('data-activity-color-mapping');
if (customActivityColors !== null && customActivityColors !== undefined && customActivityColors.length > 0) {
// Stored on the attribute as a string
customActivityColors = JSON.parse(customActivityColors);
}
var customActivityToolTips = modelDiv.attr('data-activity-tooltips');
if (customActivityToolTips !== null && customActivityToolTips !== undefined && customActivityToolTips.length > 0) {
// Stored on the attribute as a string
customActivityToolTips = JSON.parse(customActivityToolTips);
}
// Support for custom opacity for activity backgrounds
var customActivityBackgroundOpacity = modelDiv.attr('data-activity-opacity');
var elementsAdded = new Array();
var elementsRemoved = new Array();
function _showTip(htmlNode, element)
{
// Custom tooltip
var documentation = undefined;
if (customActivityToolTips) {
if (customActivityToolTips[element.name]) {
documentation = customActivityToolTips[element.name];
} else if (customActivityToolTips[element.id]) {
documentation = customActivityToolTips[element.id];
} else {
documentation = ''; // Show nothing if custom tool tips are enabled
}
}
// Default tooltip, no custom tool tip set
if (documentation === undefined) {
var documentation = "";
if (element.name && element.name.length > 0) {
documentation += "<b>Name</b>: <i>" + element.name + "</i><br/><br/>";
}
if (element.properties) {
for (var i = 0; i < element.properties.length; i++) {
var propName = element.properties[i].name;
if (element.properties[i].type && element.properties[i].type === 'list') {
documentation += '<b>' + propName + '</b>:<br/>';
for (var j = 0; j < element.properties[i].value.length; j++) {
documentation += '<i>' + element.properties[i].value[j] + '</i><br/>';
}
}
else {
documentation += '<b>' + propName + '</b>: <i>' + element.properties[i].value + '</i><br/>';
}
}
}
}
var text = element.type + " ";
if (element.name && element.name.length > 0)
{
text += element.name;
}
else
{
text += element.id;
}
htmlNode.qtip({
content: {
text: documentation,
title: {
text: text
}
},
position: {
my: 'top left',
at: 'bottom center',
viewport: jQuery('#bpmnModel')
},
hide: {
fixed: true, delay: 500,
event: 'click mouseleave'
},
style: {
classes: 'ui-tooltip-kisbpm-bpmn'
}
});
}
function _addHoverLogic(element, type, defaultColor)
{
var strokeColor = _bpmnGetColor(element, defaultColor);
var topBodyRect = null;
if (type === "rect")
{
topBodyRect = paper.rect(element.x, element.y, element.width, element.height);
}
else if (type === "circle")
{
var x = element.x + (element.width / 2);
var y = element.y + (element.height / 2);
topBodyRect = paper.circle(x, y, 15);
}
else if (type === "rhombus")
{
topBodyRect = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) +
"L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) +
"L" + (element.x + (element.width / 2)) + " " + element.y + "z"
);
}
var opacity = 0;
var fillColor = "#ffffff";
if (jQuery.inArray(element.id, elementsAdded) >= 0)
{
opacity = 0.2;
fillColor = "green";
}
if (jQuery.inArray(element.id, elementsRemoved) >= 0)
{
opacity = 0.2;
fillColor = "red";
}
topBodyRect.attr({
"opacity": opacity,
"stroke" : "none",
"fill" : fillColor
});
_showTip(jQuery(topBodyRect.node), element);
topBodyRect.mouseover(function() {
paper.getById(element.id).attr({"stroke":HOVER_COLOR});
});
topBodyRect.mouseout(function() {
paper.getById(element.id).attr({"stroke":strokeColor});
});
}
function _zoom(zoomIn)
{
var tmpCanvasWidth, tmpCanvasHeight;
if (zoomIn)
{
tmpCanvasWidth = canvasWidth * (1.0/0.90);
tmpCanvasHeight = canvasHeight * (1.0/0.90);
}
else
{
tmpCanvasWidth = canvasWidth * (1.0/1.10);
tmpCanvasHeight = canvasHeight * (1.0/1.10);
}
if (tmpCanvasWidth != canvasWidth || tmpCanvasHeight != canvasHeight)
{
canvasWidth = tmpCanvasWidth;
canvasHeight = tmpCanvasHeight;
paper.setSize(canvasWidth, canvasHeight);
}
}
var modelUrl;
if (modelType == 'runtime') {
if (historyModelId) {
modelUrl = FLOWABLE.APP_URL.getProcessInstanceModelJsonHistoryUrl(historyModelId);
} else {
modelUrl = FLOWABLE.APP_URL.getProcessInstanceModelJsonUrl(modelId);
}
} else if (modelType == 'design') {
if (historyModelId) {
modelUrl = FLOWABLE.APP_URL.getModelHistoryModelJsonUrl(modelId, historyModelId);
} else {
modelUrl = FLOWABLE.APP_URL.getModelModelJsonUrl(modelId);
}
} else if (modelType == 'process-definition') {
modelUrl = FLOWABLE.APP_URL.getProcessDefinitionModelJsonUrl(processDefinitionId);
}
var request = jQuery.ajax({
type: 'get',
url: modelUrl + '?nocaching=' + new Date().getTime()
});
request.success(function(data, textStatus, jqXHR) {
if ((!data.elements || data.elements.length == 0) && (!data.pools || data.pools.length == 0)) return;
INITIAL_CANVAS_WIDTH = data.diagramWidth;
if (modelType == 'design') {
INITIAL_CANVAS_WIDTH += 20;
} else {
INITIAL_CANVAS_WIDTH += 30;
}
INITIAL_CANVAS_HEIGHT = data.diagramHeight + 50;
canvasWidth = INITIAL_CANVAS_WIDTH;
canvasHeight = INITIAL_CANVAS_HEIGHT;
viewBoxWidth = INITIAL_CANVAS_WIDTH;
viewBoxHeight = INITIAL_CANVAS_HEIGHT;
if (modelType == 'design') {
var headerBarHeight = 170;
var offsetY = 0;
if (jQuery(window).height() > (canvasHeight + headerBarHeight))
{
offsetY = (jQuery(window).height() - headerBarHeight - canvasHeight) / 2;
}
if (offsetY > 50) {
offsetY = 50;
}
jQuery('#bpmnModel').css('marginTop', offsetY);
}
jQuery('#bpmnModel').width(INITIAL_CANVAS_WIDTH);
jQuery('#bpmnModel').height(INITIAL_CANVAS_HEIGHT);
paper = Raphael(document.getElementById('bpmnModel'), canvasWidth, canvasHeight);
paper.setViewBox(0, 0, viewBoxWidth, viewBoxHeight, false);
paper.renderfix();
if (data.pools)
{
for (var i = 0; i < data.pools.length; i++)
{
var pool = data.pools[i];
_drawPool(pool);
}
}
var modelElements = data.elements;
for (var i = 0; i < modelElements.length; i++)
{
var element = modelElements[i];
//try {
var drawFunction = eval("_draw" + element.type);
drawFunction(element);
//} catch(err) {console.log(err);}
}
if (data.flows)
{
for (var i = 0; i < data.flows.length; i++)
{
var flow = data.flows[i];
if (flow.type === 'sequenceFlow') {
_drawFlow(flow);
} else if (flow.type === 'association') {
_drawAssociation(flow);
}
}
}
});
request.error(function(jqXHR, textStatus, errorThrown) {
alert("error");
});

2
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/jquery.qtip.min.css

File diff suppressed because one or more lines are too long

5
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/jquery.qtip.min.js

File diff suppressed because one or more lines are too long

37
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/package.json

@ -1,37 +0,0 @@
{
"name": "displaymodel",
"version": "1.0.0",
"dependencies": {},
"devDependencies": {
"grunt": "0.4.2",
"grunt-autoprefixer": "0.4.0",
"grunt-bower-install": "0.7.0",
"grunt-concurrent": "0.4.1",
"grunt-contrib-clean": "0.5.0",
"grunt-contrib-coffee": "0.7.0",
"grunt-contrib-compass": "0.6.0",
"grunt-contrib-concat": "0.3.0",
"grunt-contrib-connect": "0.5.0",
"grunt-contrib-copy": "0.4.1",
"grunt-contrib-cssmin": "0.7.0",
"grunt-contrib-htmlmin": "0.1.3",
"grunt-contrib-imagemin": "0.3.0",
"grunt-contrib-jshint": "0.7.1",
"grunt-contrib-uglify": "0.2.0",
"grunt-contrib-watch": "0.5.2",
"grunt-google-cdn": "0.2.0",
"grunt-newer": "0.5.4",
"grunt-ng-annotate": "0.5.0",
"grunt-rev": "0.1.0",
"grunt-svgmin": "0.2.0",
"grunt-usemin": "2.0.0",
"jshint-stylish": "0.1.3",
"load-grunt-tasks": "0.2.0",
"time-grunt": "0.2.1",
"grunt-text-replace": "0.3.11",
"grunt-contrib-rename": "0.0.3"
},
"engines": {
"node": ">=0.8.0"
}
}

1
io.sc.platform.flowable/src/main/resources/flowable-modeler/display/raphael.min.js

File diff suppressed because one or more lines are too long

19
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/flowable-header-custom.js

@ -1,19 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
FLOWABLE.HEADER_CONFIG.showAppTitle = false;
FLOWABLE.HEADER_CONFIG.showHeaderMenu = false;
FLOWABLE.HEADER_CONFIG.showMainNavigation = false;
FLOWABLE.HEADER_CONFIG.showPageHeader = false;

50
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/flowable-toolbar-custom-actions.js

@ -1,50 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Create custom functions for the FLOWABLE-editor
FLOWABLE.TOOLBAR.ACTIONS.closeEditor = function(services) {
if (services.editorManager && services.editorManager.getStencilData()) {
var stencilNameSpace = services.editorManager.getStencilData().namespace;
if (stencilNameSpace !== undefined && stencilNameSpace !== null && stencilNameSpace.indexOf('cmmn1.1') !== -1) {
services.$location.path("/casemodels");
return;
}
if (stencilNameSpace !== undefined && stencilNameSpace !== null && stencilNameSpace.indexOf('dmn1.2') !== -1) {
services.$location.path("/decision-services");
return;
}
}
services.$location.path("/processes");
};
FLOWABLE.TOOLBAR.ACTIONS.navigateToProcess = function(processId) {
var navigateEvent = {
type: FLOWABLE.eventBus.EVENT_TYPE_NAVIGATE_TO_PROCESS,
processId: processId
};
FLOWABLE.eventBus.dispatch(FLOWABLE.eventBus.EVENT_TYPE_NAVIGATE_TO_PROCESS, navigateEvent);
},
// Add custom buttons
FLOWABLE.TOOLBAR_CONFIG.secondaryItems.push(
{
"type" : "button",
"title" : "Close",
"cssClass" : "glyphicon glyphicon-remove",
"action" : "FLOWABLE.TOOLBAR.ACTIONS.closeEditor"
}
);

507
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-assignment-controller.js

@ -1,507 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Assignment
*/
'use strict';
angular.module('flowableModeler').controller('FlowableAssignmentCtrl', [ '$scope', '$modal', function($scope, $modal) {
// Config for the modal window
var opts = {
template: 'editor-app/configuration/properties/assignment-popup.html?version=' + Date.now(),
scope: $scope
};
// Open the dialog
_internalCreateModal(opts, $modal, $scope);
}]);
angular.module('flowableModeler').controller('FlowableAssignmentPopupCtrl',
[ '$rootScope', '$scope', '$translate', '$http', 'UserService', 'GroupService', function($rootScope, $scope, $translate, $http, UserService, GroupService) {
// Put json representing assignment on scope
if ($scope.property.value !== undefined && $scope.property.value !== null
&& $scope.property.value.assignment !== undefined
&& $scope.property.value.assignment !== null) {
$scope.assignment = $scope.property.value.assignment;
if (typeof $scope.assignment.type === 'undefined') {
$scope.assignment.type = 'static';
}
} else {
$scope.assignment = {type:'idm'};
}
$scope.popup = {
assignmentObject: {
type:$scope.assignment.type,
idm: {
type:undefined,
assignee: undefined,
candidateUsers: [],
candidateGroups: []
},
static: {
assignee: undefined,
candidateUsers: [],
candidateGroups: []
}
}
};
$scope.assignmentOptions = [
{id: "initiator", title: $translate.instant('PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR')},
{id: "user", title: $translate.instant('PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER')},
{id: "users", title: $translate.instant('PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS')},
{id: "groups", title: $translate.instant('PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS')}
];
if ($scope.assignment.idm && $scope.assignment.idm.type) {
for (var i = 0; i < $scope.assignmentOptions.length; i++) {
if ($scope.assignmentOptions[i].id == $scope.assignment.idm.type) {
$scope.assignmentOption = $scope.assignmentOptions[i];
break;
}
}
}
// fill the IDM area
if (!$scope.assignmentOption) {
// Default, first time opening the popup
$scope.assignmentOption = $scope.assignmentOptions[0];
} else {
// Values already filled
if ($scope.assignment.idm) { //fill the IDM tab
if ($scope.assignment.idm.assignee) {
if ($scope.assignment.idm.assignee.id) {
$scope.popup.assignmentObject.idm.assignee = $scope.assignment.idm.assignee;
} else {
$scope.popup.assignmentObject.idm.assignee = {email: $scope.assignment.idm.assignee.email};
}
}
if ($scope.assignment.idm.candidateUsers && $scope.assignment.idm.candidateUsers.length > 0) {
for (var i = 0; i < $scope.assignment.idm.candidateUsers.length; i++) {
$scope.popup.assignmentObject.idm.candidateUsers.push($scope.assignment.idm.candidateUsers[i]);
}
}
if ($scope.assignment.idm.candidateGroups && $scope.assignment.idm.candidateGroups.length > 0) {
for (var i = 0; i < $scope.assignment.idm.candidateGroups.length; i++) {
$scope.popup.assignmentObject.idm.candidateGroups.push($scope.assignment.idm.candidateGroups[i]);
}
}
}
}
//fill the static area
if ($scope.assignment.assignee) {
$scope.popup.assignmentObject.static.assignee = $scope.assignment.assignee;
}
if ($scope.assignment.candidateUsers && $scope.assignment.candidateUsers.length > 0) {
for (var i = 0; i < $scope.assignment.candidateUsers.length; i++) {
$scope.popup.assignmentObject.static.candidateUsers.push($scope.assignment.candidateUsers[i]);
}
}
if ($scope.assignment.candidateGroups && $scope.assignment.candidateGroups.length > 0) {
for (var i = 0; i < $scope.assignment.candidateGroups.length; i++) {
$scope.popup.assignmentObject.static.candidateGroups.push($scope.assignment.candidateGroups[i]);
}
}
initStaticContextForEditing($scope);
$scope.$watch('popup.groupFilter', function () {
$scope.updateGroupFilter();
});
$scope.$watch('popup.filter', function() {
$scope.updateFilter();
});
$scope.updateFilter = function() {
if ($scope.popup.oldFilter == undefined || $scope.popup.oldFilter != $scope.popup.filter) {
if (!$scope.popup.filter) {
$scope.popup.oldFilter = '';
} else {
$scope.popup.oldFilter = $scope.popup.filter;
}
if ($scope.popup.filter !== null && $scope.popup.filter !== undefined) {
UserService.getFilteredUsers($scope.popup.filter).then(function (result) {
var filteredUsers = [];
for (var i=0; i<result.data.length; i++) {
var filteredUser = result.data[i];
var foundCandidateUser = false;
if ($scope.popup.assignmentObject.idm.candidateUsers !== null && $scope.popup.assignmentObject.idm.candidateUsers !== undefined) {
for (var j=0; j<$scope.popup.assignmentObject.idm.candidateUsers.length; j++) {
var candidateUser = $scope.popup.assignmentObject.idm.candidateUsers[j];
if (candidateUser.id === filteredUser.id) {
foundCandidateUser = true;
break;
}
}
}
if (!foundCandidateUser) {
filteredUsers.push(filteredUser);
}
}
$scope.popup.userResults = filteredUsers;
$scope.resetSelection();
});
}
}
};
$scope.updateGroupFilter = function() {
if ($scope.popup.oldGroupFilter == undefined || $scope.popup.oldGroupFilter != $scope.popup.groupFilter) {
if (!$scope.popup.groupFilter) {
$scope.popup.oldGroupFilter = '';
} else {
$scope.popup.oldGroupFilter = $scope.popup.groupFilter;
}
GroupService.getFilteredGroups($scope.popup.groupFilter).then(function(result) {
$scope.popup.groupResults = result.data;
$scope.resetGroupSelection();
});
}
};
$scope.confirmUser = function(user) {
if (!user) {
// Selection is done with keyboard, use selection index
var users = $scope.popup.userResults;
if ($scope.popup.selectedIndex >= 0 && $scope.popup.selectedIndex < users.length) {
user = users[$scope.popup.selectedIndex];
}
}
if (user) {
if ("user" == $scope.assignmentOption.id) {
$scope.popup.assignmentObject.idm.assignee = user;
} else if ("users" == $scope.assignmentOption.id) {
// Only add if not yet part of candidate users
var found = false;
if ($scope.popup.assignmentObject.idm.candidateUsers) {
for (var i = 0; i < $scope.popup.assignmentObject.idm.candidateUsers.length; i++) {
if ($scope.popup.assignmentObject.idm.candidateUsers[i].id === user.id) {
found = true;
break;
}
}
}
if (!found) {
$scope.addCandidateUser(user);
}
}
}
};
$scope.confirmEmail = function() {
if ("user" == $scope.assignmentOption.id) {
$scope.popup.assignmentObject.idm.assignee = {email: $scope.popup.email};
} else if ("users" == $scope.assignmentOption.id) {
// Only add if not yet part of candidate users
var found = false;
if ($scope.popup.assignmentObject.idm.candidateUsers) {
for (var i = 0; i < $scope.popup.assignmentObject.idm.candidateUsers.length; i++) {
if ($scope.popup.assignmentObject.idm.candidateUsers[i].id) {
if ($scope.popup.assignmentObject.idm.candidateUsers[i].id === user.id) {
found = true;
break;
}
} else if ($scope.popup.assignmentObject.idm.candidateUsers[i].email) {
if ($scope.popup.assignmentObject.idm.candidateUsers[i].email === $scope.popup.email) {
found = true;
break;
}
}
}
}
if (!found) {
$scope.addCandidateUser({email: $scope.popup.email});
}
}
};
$scope.confirmGroup = function(group) {
if (!group) {
// Selection is done with keyboard, use selection index
var groups = $scope.popup.groupResults;
if ($scope.popup.selectedGroupIndex >= 0 && $scope.popup.selectedGroupIndex < groups.length) {
group = groups[$scope.popup.selectedGroupIndex];
}
}
if (group) {
// Only add if not yet part of candidate groups
var found = false;
if ($scope.popup.assignmentObject.idm.candidateGroups) {
for (var i = 0; i < $scope.popup.assignmentObject.idm.candidateGroups.length; i++) {
if ($scope.popup.assignmentObject.idm.candidateGroups[i].id === group.id) {
found = true;
break;
}
}
}
if (!found) {
$scope.addCandidateGroup(group);
}
}
};
$scope.addCandidateUser = function(user) {
$scope.popup.assignmentObject.idm.candidateUsers.push(user);
};
$scope.removeCandidateUser = function(user) {
var users = $scope.popup.assignmentObject.idm.candidateUsers;
var indexToRemove = -1;
for (var i = 0; i < users.length; i++) {
if (user.id) {
if (user.id === users[i].id) {
indexToRemove = i;
break;
}
} else {
if (user.email === users[i].email) {
indexToRemove = i;
break;
}
}
}
if (indexToRemove >= 0) {
users.splice(indexToRemove, 1);
}
};
$scope.addCandidateGroup = function(group) {
$scope.popup.assignmentObject.idm.candidateGroups.push(group);
};
$scope.removeCandidateGroup = function(group) {
var groups = $scope.popup.assignmentObject.idm.candidateGroups;
var indexToRemove = -1;
for (var i = 0; i < groups.length; i++) {
if (group.id == groups[i].id) {
indexToRemove = i;
break;
}
}
if (indexToRemove >= 0) {
groups.splice(indexToRemove, 1);
}
};
$scope.resetSelection = function() {
if ($scope.popup.userResults && $scope.popup.userResults.length > 0) {
$scope.popup.selectedIndex = 0;
} else {
$scope.popup.selectedIndex = -1;
}
};
$scope.nextUser = function() {
var users = $scope.popup.userResults;
if (users && users.length > 0 && $scope.popup.selectedIndex < users.length -1) {
$scope.popup.selectedIndex += 1;
}
};
$scope.previousUser = function() {
var users = $scope.popup.userResults;
if (users && users.length > 0 && $scope.popup.selectedIndex > 0) {
$scope.popup.selectedIndex -= 1;
}
};
$scope.resetGroupSelection = function() {
if ($scope.popup.groupResults && $scope.popup.groupResults.length > 0) {
$scope.popup.selectedGroupIndex = 0;
} else {
$scope.popup.selectedGroupIndex = -1;
}
};
$scope.nextGroup = function() {
var groups = $scope.popup.groupResults;
if (groups && groups.length > 0 && $scope.popup.selectedGroupIndex < groups.length -1) {
$scope.popup.selectedGroupIndex += 1;
}
};
$scope.previousGroup = function() {
var groups = $scope.popup.groupResults;
if (groups && groups.length > 0 && $scope.popup.selectedGroupIndex > 0) {
$scope.popup.selectedGroupIndex -= 1;
}
};
$scope.removeAssignee = function() {
$scope.popup.assignmentObject.idm.assignee = undefined;
};
// Click handler for + button after enum value
$scope.addCandidateUserValue = function(index) {
$scope.popup.assignmentObject.static.candidateUsers.splice(index + 1, 0, {value: ''});
};
// Click handler for - button after enum value
$scope.removeCandidateUserValue = function(index) {
$scope.popup.assignmentObject.static.candidateUsers.splice(index, 1);
};
// Click handler for + button after enum value
$scope.addCandidateGroupValue = function(index) {
$scope.popup.assignmentObject.static.candidateGroups.splice(index + 1, 0, {value: ''});
};
// Click handler for - button after enum value
$scope.removeCandidateGroupValue = function(index) {
$scope.popup.assignmentObject.static.candidateGroups.splice(index, 1);
};
$scope.setSearchType = function() {
$scope.popup.assignmentObject.assignmentSourceType = 'search';
};
$scope.allSteps = EDITOR.UTIL.collectSortedElementsFromPrecedingElements($scope.selectedShape);
$scope.save = function () {
handleAssignmentInput($scope.popup.assignmentObject.static);
$scope.assignment.type = $scope.popup.assignmentObject.type;
if ('idm' === $scope.popup.assignmentObject.type) { // IDM
$scope.popup.assignmentObject.static = undefined;
//Construct an IDM object to be saved to the process model.
var idm = {type: $scope.assignmentOption.id};
if ('user' == idm.type) {
if ($scope.popup.assignmentObject.idm.assignee) {
idm.assignee = $scope.popup.assignmentObject.idm.assignee;
}
} else if ('users' == idm.type) {
if ($scope.popup.assignmentObject.idm.candidateUsers && $scope.popup.assignmentObject.idm.candidateUsers.length > 0) {
idm.candidateUsers = $scope.popup.assignmentObject.idm.candidateUsers;
}
} else if ('groups' == idm.type) {
if ($scope.popup.assignmentObject.idm.candidateGroups && $scope.popup.assignmentObject.idm.candidateGroups.length > 0) {
idm.candidateGroups = $scope.popup.assignmentObject.idm.candidateGroups;
}
}
$scope.assignment.idm = idm;
$scope.assignment.assignee = undefined;
$scope.assignment.candidateUsers = undefined;
$scope.assignment.candidateGroups = undefined;
}
if ('static' === $scope.popup.assignmentObject.type) { // IDM
$scope.popup.assignmentObject.idm = undefined;
$scope.assignment.idm = undefined;
$scope.assignment.assignee = $scope.popup.assignmentObject.static.assignee;
$scope.assignment.candidateUsers = $scope.popup.assignmentObject.static.candidateUsers;
$scope.assignment.candidateGroups = $scope.popup.assignmentObject.static.candidateGroups;
}
$scope.property.value = {};
$scope.property.value.assignment = $scope.assignment;
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
// Close button handler
$scope.close = function() {
$scope.property.mode = 'read';
$scope.$hide();
};
var handleAssignmentInput = function ($assignment) {
function isEmptyString(value) {
return (value === undefined || value === null || value.trim().length === 0);
}
if (isEmptyString($assignment.assignee)){
$assignment.assignee = undefined;
}
var toRemoveIndexes;
var removedItems=0;
var i = 0;
if ($assignment.candidateUsers) {
toRemoveIndexes = [];
for (i = 0; i < $assignment.candidateUsers.length; i++) {
if (isEmptyString($assignment.candidateUsers[i].value)) {
toRemoveIndexes[toRemoveIndexes.length] = i;
}
}
if (toRemoveIndexes.length == $assignment.candidateUsers.length) {
$assignment.candidateUsers = undefined;
} else {
removedItems=0;
for (i = 0; i < toRemoveIndexes.length; i++) {
$assignment.candidateUsers.splice(toRemoveIndexes[i]-removedItems, 1);
removedItems++;
}
}
}
if ($assignment.candidateGroups) {
toRemoveIndexes = [];
for (i = 0; i < $assignment.candidateGroups.length; i++) {
if (isEmptyString($assignment.candidateGroups[i].value)) {
toRemoveIndexes[toRemoveIndexes.length] = i;
}
}
if (toRemoveIndexes.length == $assignment.candidateGroups.length) {
$assignment.candidateGroups = undefined;
} else {
removedItems=0;
for (i = 0; i < toRemoveIndexes.length; i++) {
$assignment.candidateGroups.splice(toRemoveIndexes[i]-removedItems, 1);
removedItems++;
}
}
}
};
function initStaticContextForEditing($scope) {
if (!$scope.popup.assignmentObject.static.candidateUsers || $scope.popup.assignmentObject.static.candidateUsers.length==0) {
$scope.popup.assignmentObject.static.candidateUsers = [{value: ''}];
}
if (!$scope.popup.assignmentObject.static.candidateGroups || $scope.popup.assignmentObject.static.candidateGroups.length==0) {
$scope.popup.assignmentObject.static.candidateGroups = [{value: ''}];
}
}
}]);

28
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-calledelementtype-controller.js

@ -1,28 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Call activity calledElement type property
*/
angular.module('flowableModeler').controller('FlowableCalledElementTypeCtrl', [ '$scope', function($scope) {
if ($scope.property.value == undefined && $scope.property.value == null)
{
$scope.property.value = 'key';
}
$scope.calledElementTypeChanged = function() {
$scope.updatePropertyInModel($scope.property);
};
}]);

86
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-case-reference-controller.js

@ -1,86 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
angular.module('flowableModeler').controller('FlowableCaseReferenceCtrl',
[ '$scope', '$modal', '$http', function($scope, $modal, $http) {
// Config for the modal window
var opts = {
template: 'editor-app/configuration/properties/case-reference-popup.html?version=' + Date.now(),
scope: $scope
};
// Open the dialog
_internalCreateModal(opts, $modal, $scope);
}]);
angular.module('flowableModeler').controller('FlowableCaseReferencePopupCtrl', [ '$scope', '$http', 'editorManager', '$location', function($scope, $http, editorManager, $location) {
$scope.state = {'loadingCases' : true, 'error' : false};
// Close button handler
$scope.close = function() {
$scope.property.mode = 'read';
$scope.$hide();
};
// Selecting/deselecting a case
$scope.selectCase = function(caseModel, $event) {
$event.stopPropagation();
if ($scope.selectedCase && $scope.selectedCase.id && caseModel.id == $scope.selectedCase.id) {
// un-select the current selection
$scope.selectedCase = null;
} else {
$scope.selectedCase = caseModel;
}
};
$scope.open = function() {
if ($scope.selectedCase) {
$location.path("/editor/" + $scope.selectedCase.id);
}
};
// Saving the selected value
$scope.save = function() {
if ($scope.selectedCase) {
$scope.property.value = {'id' : $scope.selectedCase.id, 'name' : $scope.selectedCase.name, 'key': $scope.selectedCase.key};
} else {
$scope.property.value = null;
}
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
$scope.loadCases = function() {
var modelMetaData = editorManager.getBaseModelData();
$http.get(FLOWABLE.APP_URL.getCaseModelsUrl('?excludeId=' + modelMetaData.modelId))
.success(
function(response) {
$scope.state.loadingCases = false;
$scope.state.caseError = false;
$scope.caseModels = response.data;
})
.error(
function(data, status, headers, config) {
$scope.state.loadingCases = false;
$scope.state.caseError = true;
});
};
if ($scope.property && $scope.property.value && $scope.property.value.id) {
$scope.selectedCase = $scope.property.value;
}
$scope.loadCases();
}]);

59
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-condition-expression-controller.js

@ -1,59 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Condition expression
*/
angular.module('flowableModeler').controller('FlowableConditionExpressionCtrl', [ '$scope', '$modal', function($scope, $modal) {
// Config for the modal window
var opts = {
template: 'editor-app/configuration/properties/condition-expression-popup.html?version=' + Date.now(),
scope: $scope
};
// Open the dialog
_internalCreateModal(opts, $modal, $scope);
}]);
angular.module('flowableModeler').controller('FlowableConditionExpressionPopupCtrl',
[ '$rootScope', '$scope', '$translate', 'FormBuilderService', function($rootScope, $scope, $translate, FormBuilderService) {
// Put json representing assignment on scope
if ($scope.property.value !== undefined && $scope.property.value !== null
&& $scope.property.value.expression !== undefined
&& $scope.property.value.expression !== null) {
$scope.expression = $scope.property.value.expression;
} else if ($scope.property.value !== undefined && $scope.property.value !== null) {
$scope.expression = {type: 'static', staticValue: $scope.property.value};
} else {
$scope.expression = {};
}
$scope.save = function() {
$scope.property.value = {expression: $scope.expression};
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
// Close button handler
$scope.close = function() {
$scope.property.mode = 'read';
$scope.$hide();
};
}]);

12
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-custom-controllers.js

@ -1,12 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

330
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-data-properties-controller.js

@ -1,330 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Data Properties
*/
angular.module('flowableModeler').controller('FlowableDataPropertiesCtrl',
['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) {
// Config for the modal window
var opts = {
template: 'editor-app/configuration/properties/data-properties-popup.html?version=' + Date.now(),
scope: $scope
};
// Open the dialog
_internalCreateModal(opts, $modal, $scope);
}]);
angular.module('flowableModeler').controller('FlowableDataPropertiesPopupCtrl',
['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) {
// Put json representing data properties on scope
if ($scope.property.value !== undefined && $scope.property.value !== null
&& $scope.property.value.items !== undefined
&& $scope.property.value.items !== null) {
// Note that we clone the json object rather then setting it directly,
// this to cope with the fact that the user can click the cancel button and no changes should have happened
$scope.dataProperties = angular.copy($scope.property.value.items);
for (var i = 0; i < $scope.dataProperties.length; i++) {
var dataProperty = $scope.dataProperties[i];
if (dataProperty.enumValues && dataProperty.enumValues.length > 0) {
for (var j = 0; j < dataProperty.enumValues.length; j++) {
var enumValue = dataProperty.enumValues[j];
if (!enumValue.id && !enumValue.name && enumValue.value) {
enumValue.id = enumValue.value;
enumValue.name = enumValue.value;
}
}
}
}
} else {
$scope.dataProperties = [];
}
$scope.enumValues = [];
$scope.translationsRetrieved = false;
$scope.labels = {};
var idPromise = $translate('PROPERTY.DATAPROPERTIES.ID');
var namePromise = $translate('PROPERTY.DATAPROPERTIES.NAME');
var typePromise = $translate('PROPERTY.DATAPROPERTIES.TYPE');
var valuePromise = $translate('PROPERTY.DATAPROPERTIES.VALUE');
$q.all([idPromise, namePromise, typePromise, valuePromise]).then(function (results) {
$scope.labels.idLabel = results[0];
$scope.labels.nameLabel = results[1];
$scope.labels.typeLabel = results[2];
$scope.labels.valueLabel = results[3];
$scope.translationsRetrieved = true;
// Config for grid
$scope.gridOptions = {
data: $scope.dataProperties,
headerRowHeight: 28,
enableRowSelection: true,
enableRowHeaderSelection: false,
multiSelect: false,
modifierKeysToMultiSelect: false,
enableHorizontalScrollbar: 0,
enableColumnMenus: false,
enableSorting: false,
columnDefs: [{field: 'dataproperty_id', displayName: $scope.labels.idLabel},
{field: 'dataproperty_name', displayName: $scope.labels.nameLabel},
{field: 'dataproperty_type', displayName: $scope.labels.typeLabel},
{field: 'dataproperty_value', displayName: $scope.labels.valueLabel}]
};
$scope.enumGridOptions = {
data: $scope.enumValues,
headerRowHeight: 28,
enableRowSelection: true,
enableRowHeaderSelection: false,
multiSelect: false,
modifierKeysToMultiSelect: false,
enableHorizontalScrollbar: 0,
enableColumnMenus: false,
enableSorting: false,
columnDefs: [{ field: 'id', displayName: $scope.labels.idLabel },
{ field: 'name', displayName: $scope.labels.nameLabel}]
}
$scope.gridOptions.onRegisterApi = function (gridApi) {
//set gridApi on scope
$scope.gridApi = gridApi;
gridApi.selection.on.rowSelectionChanged($scope, function (row) {
$scope.selectedProperty = row.entity;
$scope.selectedEnumValue = undefined;
if ($scope.selectedProperty && $scope.selectedProperty.enumValues) {
$scope.enumValues.length = 0;
for (var i = 0; i < $scope.selectedProperty.enumValues.length; i++) {
$scope.enumValues.push($scope.selectedProperty.enumValues[i]);
}
}
});
};
$scope.enumGridOptions.onRegisterApi = function (gridApi) {
//set gridApi on scope
$scope.enumGridApi = gridApi;
gridApi.selection.on.rowSelectionChanged($scope, function (row) {
$scope.selectedEnumValue = row.entity;
});
};
});
// Handler for when the value of the type dropdown changes
$scope.propertyTypeChanged = function () {
// Check date. If date, show date pattern
if ($scope.selectedProperty.type === 'date') {
$scope.selectedProperty.datePattern = 'MM-dd-yyyy hh:mm';
} else {
delete $scope.selectedProperty.datePattern;
}
// Check enum. If enum, show list of options
if ($scope.selectedProperty.type === 'enum') {
$scope.selectedProperty.enumValues = [ {id: 'value1', name: 'Value 1'}, {id: 'value2', name: 'Value 2'}];
$scope.enumValues.length = 0;
for (var i = 0; i < $scope.selectedProperty.enumValues.length; i++) {
$scope.enumValues.push($scope.selectedProperty.enumValues[i]);
}
} else {
delete $scope.selectedProperty.enumValues;
$scope.enumValues.length = 0;
}
};
// Click handler for add button
var propertyIndex = 1;
$scope.addNewProperty = function () {
var newProperty = {
dataproperty_id: 'new_data_object_' + propertyIndex++,
dataproperty_name: '',
dataproperty_type: 'string',
readable: true,
writable: true
};
$scope.dataProperties.push(newProperty);
$timeout(function () {
$scope.gridApi.selection.toggleRowSelection(newProperty);
});
};
// Click handler for remove button
$scope.removeProperty = function () {
var selectedItems = $scope.gridApi.selection.getSelectedRows();
if (selectedItems && selectedItems.length > 0) {
var index = $scope.dataProperties.indexOf(selectedItems[0]);
$scope.gridApi.selection.toggleRowSelection(selectedItems[0]);
$scope.dataProperties.splice(index, 1);
if ($scope.dataProperties.length == 0) {
$scope.selectedProperty = undefined;
}
$timeout(function() {
if ($scope.dataProperties.length > 0) {
$scope.gridApi.selection.toggleRowSelection($scope.dataProperties[0]);
}
});
}
};
// Click handler for up button
$scope.movePropertyUp = function () {
var selectedItems = $scope.gridApi.selection.getSelectedRows();
if (selectedItems && selectedItems.length > 0) {
var index = $scope.dataProperties.indexOf(selectedItems[0]);
if (index != 0) { // If it's the first, no moving up of course
var temp = $scope.dataProperties[index];
$scope.dataProperties.splice(index, 1);
$timeout(function(){
$scope.dataProperties.splice(index + -1, 0, temp);
$timeout(function() {
$scope.gridApi.selection.toggleRowSelection(temp);
});
});
}
}
};
// Click handler for down button
$scope.movePropertyDown = function () {
var selectedItems = $scope.gridApi.selection.getSelectedRows();
if (selectedItems && selectedItems.length > 0) {
var index = $scope.dataProperties.indexOf(selectedItems[0]);
if (index != $scope.dataProperties.length - 1) { // If it's the last element, no moving down of course
var temp = $scope.dataProperties[index];
$scope.dataProperties.splice(index, 1);
$timeout(function(){
$scope.dataProperties.splice(index + 1, 0, temp);
$timeout(function() {
$scope.gridApi.selection.toggleRowSelection(temp);
});
});
}
}
};
$scope.addNewEnumValue = function() {
if ($scope.selectedProperty) {
var newEnumValue = { id : '', name : ''};
$scope.selectedProperty.enumValues.push(newEnumValue);
$scope.enumValues.push(newEnumValue);
$timeout(function () {
$scope.enumGridApi.selection.toggleRowSelection(newEnumValue);
});
}
};
// Click handler for remove button
$scope.removeEnumValue = function() {
var selectedItems = $scope.enumGridApi.selection.getSelectedRows();
if (selectedItems && selectedItems.length > 0) {
var index = $scope.enumValues.indexOf(selectedItems[0]);
$scope.enumGridApi.selection.toggleRowSelection(selectedItems[0]);
$scope.enumValues.splice(index, 1);
$scope.selectedProperty.enumValues.splice(index, 1);
if ($scope.enumValues.length == 0) {
$scope.selectedEnumValue = undefined;
}
$timeout(function () {
if ($scope.enumValues.length > 0) {
$scope.enumGridApi.selection.toggleRowSelection($scope.enumValues[0]);
}
});
}
};
// Click handler for up button
$scope.moveEnumValueUp = function() {
var selectedItems = $scope.enumGridApi.selection.getSelectedRows();
if (selectedItems && selectedItems.length > 0) {
var index = $scope.enumValues.indexOf(selectedItems[0]);
if (index != 0) { // If it's the first, no moving up of course
var temp = $scope.enumValues[index];
$scope.enumValues.splice(index, 1);
$scope.selectedProperty.enumValues.splice(index, 1);
$timeout(function () {
$scope.enumValues.splice(index + -1, 0, temp);
$scope.selectedProperty.enumValues.splice(index + -1, 0, temp);
$timeout(function () {
$scope.enumGridApi.selection.toggleRowSelection(temp);
});
});
}
}
};
// Click handler for down button
$scope.moveEnumValueDown = function() {
var selectedItems = $scope.enumGridApi.selection.getSelectedRows();
if (selectedItems && selectedItems.length > 0) {
var index = $scope.enumValues.indexOf(selectedItems[0]);
if (index != $scope.enumValues.length - 1) { // If it's the last element, no moving down of course
var temp = $scope.enumValues[index];
$scope.enumValues.splice(index, 1);
$scope.selectedProperty.enumValues.splice(index, 1);
$timeout(function () {
$scope.enumValues.splice(index + 1, 0, temp);
$scope.selectedProperty.enumValues.splice(index + 1, 0, temp);
$timeout(function () {
$scope.enumGridApi.selection.toggleRowSelection(temp);
});
});
}
}
};
// Click handler for save button
$scope.save = function () {
if ($scope.dataProperties.length > 0) {
$scope.property.value = {};
$scope.property.value.items = $scope.dataProperties;
} else {
$scope.property.value = null;
}
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
$scope.cancel = function () {
$scope.$hide();
$scope.property.mode = 'read';
};
// Close button handler
$scope.close = function () {
$scope.$hide();
$scope.property.mode = 'read';
};
}])
;

288
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-decisionservice-reference-controller.js

@ -1,288 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
angular.module('flowableModeler').controller('FlowableDecisionServiceReferenceCtrl',
[ '$scope', '$modal', '$http', function($scope, $modal, $http) {
// Config for the modal window
var opts = {
template: 'editor-app/configuration/properties/decisionservice-reference-popup.html?version=' + Date.now(),
scope: $scope
};
// Open the dialog
_internalCreateModal(opts, $modal, $scope);
}]);
angular.module('flowableModeler').controller('FlowableDecisionServiceReferencePopupCtrl', ['$rootScope', '$scope', '$http', '$location', 'editorManager',
function($rootScope, $scope, $http, $location, editorManager) {
$scope.state = {
'loadingDecisionServices': true,
'decisionServiceError': false
};
$scope.popup = {
'state': 'decisionServiceReference'
};
$scope.foldersBreadCrumbs = [];
// Make click outside dialog also call close.
$scope.$parent.$on('modal.hide.before', function() {
$scope.close();
$scope.$parent.$apply();
});
// Close button handler
$scope.close = function() {
$scope.property.newVariablesMapping = undefined;
$scope.property.mode = 'read';
$scope.$hide();
};
// Selecting/deselecting a decision service
$scope.selectDecisionService = function(decisionService, $event) {
$event.stopPropagation();
if ($scope.selectedDecisionService && $scope.selectedDecisionService.id && decisionService.id == $scope.selectedDecisionService.id) {
// un-select the current selection
$scope.selectedDecisionService = null;
} else {
$scope.selectedDecisionService = decisionService;
}
};
$scope.isSelected = function () {
if ($scope.selectedDecisionService && $scope.selectedDecisionService.id) {
return true;
}
return false;
};
// Saving the selected value
$scope.save = function() {
if ($scope.selectedDecisionService) {
$scope.property.value = {
'id': $scope.selectedDecisionService.id,
'name': $scope.selectedDecisionService.name,
'key': $scope.selectedDecisionService.key
};
} else {
$scope.property.value = null;
}
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
// Open the selected value
$scope.open = function() {
if ($scope.selectedDecisionService) {
$scope.property.value = {
'id': $scope.selectedDecisionService.id,
'name': $scope.selectedDecisionService.name,
'key': $scope.selectedDecisionService.key
};
$scope.updatePropertyInModel($scope.property);
var modelMetaData = editorManager.getBaseModelData();
var json = editorManager.getModel();
json = JSON.stringify(json);
var params = {
modeltype: modelMetaData.model.modelType,
json_xml: json,
name: modelMetaData.name,
key: modelMetaData.key,
description: modelMetaData.description,
newversion: false,
lastUpdated: modelMetaData.lastUpdated
};
// Update
$http({
method: 'POST',
data: params,
ignoreErrors: true,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
transformRequest: function (obj) {
var str = [];
for (var p in obj) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
},
url: FLOWABLE.URL.putModel(modelMetaData.modelId)
})
.success(function(data, status, headers, config) {
editorManager.handleEvents({
type: ORYX.CONFIG.EVENT_SAVED
});
$rootScope.addHistoryItem($scope.selectedShape.resourceId);
$location.path('decision-service-editor/' + $scope.selectedDecisionService.id);
})
.error(function(data, status, headers, config) {
});
$scope.close();
}
};
$scope.newDecisionService = function() {
$scope.property.value.variablesmapping = [];
$scope.popup.state = 'newDecisionService';
var modelMetaData = editorManager.getBaseModelData();
$scope.model = {
loading: false,
decisionService: {
name: '',
key: '',
description: '',
modelType: 6
},
defaultStencilSet: undefined,
decisionTableStencilSets: []
};
};
$scope.createDecisionService = function() {
if (!$scope.model.decisionService.name || $scope.model.decisionService.name.length == 0 ||
!$scope.model.decisionService.key || $scope.model.decisionService.key.length == 0) {
return;
}
var stencilSetId = $scope.model.decisionService.stencilSet;
$scope.model.loading = true;
$http({
method: 'POST',
url: FLOWABLE.APP_URL.getModelsUrl(),
data: $scope.model.decisionService
}).
success(function(data, status, headers, config) {
var newDecisionTableId = data.id;
$scope.property.value = {
'id': newDecisionTableId,
'name': data.name,
'key': data.key
};
$scope.updatePropertyInModel($scope.property);
var modelMetaData = editorManager.getBaseModelData();
var json = editorManager.getModel();
json = JSON.stringify(json);
var params = {
modeltype: modelMetaData.model.modelType,
json_xml: json,
name: modelMetaData.name,
key: modelMetaData.key,
description: modelMetaData.description,
newversion: false,
lastUpdated: modelMetaData.lastUpdated,
stencilSet: stencilSetId
};
// Update
$http({
method: 'POST',
data: params,
ignoreErrors: true,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
transformRequest: function (obj) {
var str = [];
for (var p in obj) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
},
url: FLOWABLE.URL.putModel(modelMetaData.modelId)
})
.success(function(data, status, headers, config) {
editorManager.handleEvents({
type: ORYX.CONFIG.EVENT_SAVED
});
$scope.model.loading = false;
$scope.$hide();
$rootScope.addHistoryItem($scope.selectedShape.resourceId);
$location.path('decision-service-editor/' + newDecisionTableId);
})
.error(function(data, status, headers, config) {
$scope.model.loading = false;
$scope.$hide();
});
}).
error(function(data, status, headers, config) {
$scope.model.loading = false;
$scope.model.errorMessage = data.message;
});
};
$scope.cancel = function() {
$scope.close();
};
$scope.resetCurrent = function () {
for (var i = 0, found = false; i < $scope.decisionServices.length && found === false; i++) {
var decision = $scope.decisionServices[i];
if (decision.id === $scope.property.value.id) {
$scope.selectedDecisionService = decision;
found = true;
}
}
};
$scope.loadDecisionServices = function() {
var modelMetaData = editorManager.getBaseModelData();
$http.get(FLOWABLE.APP_URL.getDecisionServiceModelsUrl())
.success(
function(response) {
$scope.state.loadingDecisionServices = false;
$scope.state.decisionServiceError = false;
$scope.decisionServices = response.data;
$scope.resetCurrent();
})
.error(
function(data, status, headers, config) {
$scope.state.loadingDecisionServices = false;
$scope.state.decisionServiceError = true;
});
};
if ($scope.property && $scope.property.value && $scope.property.value.id) {
$scope.selectedDecisionService = $scope.property.value;
$scope.storedId = $scope.property.value.id;
}
$scope.loadDecisionServices();
}
]);

288
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-decisiontable-reference-controller.js

@ -1,288 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
angular.module('flowableModeler').controller('FlowableDecisionTableReferenceCtrl',
[ '$scope', '$modal', '$http', function($scope, $modal, $http) {
// Config for the modal window
var opts = {
template: 'editor-app/configuration/properties/decisiontable-reference-popup.html?version=' + Date.now(),
scope: $scope
};
// Open the dialog
_internalCreateModal(opts, $modal, $scope);
}]);
angular.module('flowableModeler').controller('FlowableDecisionTableReferencePopupCtrl', ['$rootScope', '$scope', '$http', '$location', 'editorManager',
function($rootScope, $scope, $http, $location, editorManager) {
$scope.state = {
'loadingDecisionTables': true,
'decisionTableError': false
};
$scope.popup = {
'state': 'decisionTableReference'
};
$scope.foldersBreadCrumbs = [];
// Make click outside dialog also call close.
$scope.$parent.$on('modal.hide.before', function() {
$scope.close();
$scope.$parent.$apply();
});
// Close button handler
$scope.close = function() {
$scope.property.newVariablesMapping = undefined;
$scope.property.mode = 'read';
$scope.$hide();
};
// Selecting/deselecting a decision table
$scope.selectDecisionTable = function(decisionTable, $event) {
$event.stopPropagation();
if ($scope.selectedDecisionTable && $scope.selectedDecisionTable.id && decisionTable.id == $scope.selectedDecisionTable.id) {
// un-select the current selection
$scope.selectedDecisionTable = null;
} else {
$scope.selectedDecisionTable = decisionTable;
}
};
$scope.isSelected = function () {
if ($scope.selectedDecisionTable && $scope.selectedDecisionTable.id) {
return true;
}
return false;
};
// Saving the selected value
$scope.save = function() {
if ($scope.selectedDecisionTable) {
$scope.property.value = {
'id': $scope.selectedDecisionTable.id,
'name': $scope.selectedDecisionTable.name,
'key': $scope.selectedDecisionTable.key
};
} else {
$scope.property.value = null;
}
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
// Open the selected value
$scope.open = function() {
if ($scope.selectedDecisionTable) {
$scope.property.value = {
'id': $scope.selectedDecisionTable.id,
'name': $scope.selectedDecisionTable.name,
'key': $scope.selectedDecisionTable.key
};
$scope.updatePropertyInModel($scope.property);
var modelMetaData = editorManager.getBaseModelData();
var json = editorManager.getModel();
json = JSON.stringify(json);
var params = {
modeltype: modelMetaData.model.modelType,
json_xml: json,
name: modelMetaData.name,
key: modelMetaData.key,
description: modelMetaData.description,
newversion: false,
lastUpdated: modelMetaData.lastUpdated
};
// Update
$http({
method: 'POST',
data: params,
ignoreErrors: true,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
transformRequest: function (obj) {
var str = [];
for (var p in obj) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
},
url: FLOWABLE.URL.putModel(modelMetaData.modelId)
})
.success(function(data, status, headers, config) {
editorManager.handleEvents({
type: ORYX.CONFIG.EVENT_SAVED
});
$rootScope.addHistoryItem($scope.selectedShape.resourceId);
$location.path('decision-table-editor/' + $scope.selectedDecisionTable.id);
})
.error(function(data, status, headers, config) {
});
$scope.close();
}
};
$scope.newDecisionTable = function() {
$scope.property.value.variablesmapping = [];
$scope.popup.state = 'newDecisionTable';
var modelMetaData = editorManager.getBaseModelData();
$scope.model = {
loading: false,
decisionTable: {
name: '',
key: '',
description: '',
modelType: 4
},
defaultStencilSet: undefined,
decisionTableStencilSets: []
};
};
$scope.createDecisionTable = function() {
if (!$scope.model.decisionTable.name || $scope.model.decisionTable.name.length == 0 ||
!$scope.model.decisionTable.key || $scope.model.decisionTable.key.length == 0) {
return;
}
var stencilSetId = $scope.model.decisionTable.stencilSet;
$scope.model.loading = true;
$http({
method: 'POST',
url: FLOWABLE.APP_URL.getModelsUrl(),
data: $scope.model.decisionTable
}).
success(function(data, status, headers, config) {
var newDecisionTableId = data.id;
$scope.property.value = {
'id': newDecisionTableId,
'name': data.name,
'key': data.key
};
$scope.updatePropertyInModel($scope.property);
var modelMetaData = editorManager.getBaseModelData();
var json = editorManager.getModel();
json = JSON.stringify(json);
var params = {
modeltype: modelMetaData.model.modelType,
json_xml: json,
name: modelMetaData.name,
key: modelMetaData.key,
description: modelMetaData.description,
newversion: false,
lastUpdated: modelMetaData.lastUpdated,
stencilSet: stencilSetId
};
// Update
$http({
method: 'POST',
data: params,
ignoreErrors: true,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
transformRequest: function (obj) {
var str = [];
for (var p in obj) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
},
url: FLOWABLE.URL.putModel(modelMetaData.modelId)
})
.success(function(data, status, headers, config) {
editorManager.handleEvents({
type: ORYX.CONFIG.EVENT_SAVED
});
$scope.model.loading = false;
$scope.$hide();
$rootScope.addHistoryItem($scope.selectedShape.resourceId);
$location.path('decision-table-editor/' + newDecisionTableId);
})
.error(function(data, status, headers, config) {
$scope.model.loading = false;
$scope.$hide();
});
}).
error(function(data, status, headers, config) {
$scope.model.loading = false;
$scope.model.errorMessage = data.message;
});
};
$scope.cancel = function() {
$scope.close();
};
$scope.resetCurrent = function () {
for (var i = 0, found = false; i < $scope.decisionTables.length && found === false; i++) {
var table = $scope.decisionTables[i];
if (table.id === $scope.property.value.id) {
$scope.selectedDecisionTable = table;
found = true;
}
}
};
$scope.loadDecisionTables = function() {
var modelMetaData = editorManager.getBaseModelData();
$http.get(FLOWABLE.APP_URL.getDecisionTableModelsUrl())
.success(
function(response) {
$scope.state.loadingDecisionTables = false;
$scope.state.decisionTableError = false;
$scope.decisionTables = response.data;
$scope.resetCurrent();
})
.error(
function(data, status, headers, config) {
$scope.state.loadingDecisionTables = false;
$scope.state.decisionTableError = true;
});
};
if ($scope.property && $scope.property.value && $scope.property.value.id) {
$scope.selectedDecisionTable = $scope.property.value;
$scope.storedId = $scope.property.value.id;
}
$scope.loadDecisionTables();
}
]);

118
io.sc.platform.flowable/src/main/resources/flowable-modeler/editor-app/configuration/properties-default-controllers.js

@ -1,118 +0,0 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* String controller
*/
angular.module('flowableModeler').controller('FlowableStringPropertyCtrl', [ '$scope', function ($scope) {
$scope.shapeId = $scope.selectedShape.id;
$scope.valueFlushed = false;
/** Handler called when input field is blurred */
$scope.inputBlurred = function() {
$scope.valueFlushed = true;
if ($scope.property.value) {
$scope.property.value = $scope.property.value.replace(/(<([^>]+)>)/ig,"");
}
$scope.updatePropertyInModel($scope.property);
};
$scope.enterPressed = function(keyEvent) {
// if enter is pressed
if (keyEvent && keyEvent.which === 13) {
keyEvent.preventDefault();
$scope.inputBlurred(); // we want to do the same as if the user would blur the input field
}
// else; do nothing
};
$scope.$on('$destroy', function controllerDestroyed() {
if(!$scope.valueFlushed) {
if ($scope.property.value) {
$scope.property.value = $scope.property.value.replace(/(<([^>]+)>)/ig,"");
}
$scope.updatePropertyInModel($scope.property, $scope.shapeId);
}
});
}]);
/*
* Boolean controller
*/
angular.module('flowableModeler').controller('FlowableBooleanPropertyCtrl', ['$scope', function ($scope) {
$scope.changeValue = function() {
if ($scope.property.key === 'oryx-defaultflow' && $scope.property.value) {
var selectedShape = $scope.selectedShape;
if (selectedShape) {
var incomingNodes = selectedShape.getIncomingShapes();
if (incomingNodes && incomingNodes.length > 0) {
// get first node, since there can be only one for a sequence flow
var rootNode = incomingNodes[0];
var flows = rootNode.getOutgoingShapes();
if (flows && flows.length > 1) {
// in case there are more flows, check if another flow is already defined as default
for (var i = 0; i < flows.length; i++) {
if (flows[i].resourceId != selectedShape.resourceId) {
var defaultFlowProp = flows[i].properties.get('oryx-defaultflow');
if (defaultFlowProp) {
flows[i].setProperty('oryx-defaultflow', false, true);
}
}
}
}
}
}
}
$scope.updatePropertyInModel($scope.property);
};
}]);
/*
* Text controller
*/
angular.module('flowableModeler').controller('FlowableTextPropertyCtrl', [ '$scope', '$modal', '$timeout', function($scope, $modal, $timeout) {
var opts = {
template: 'editor-app/configuration/properties/text-popup.html?version=' + Date.now(),
scope: $scope,
prefixEvent: 'textModalEvent'
};
$scope.$on('textModalEvent.hide.before', function() {
$timeout(function() {
$scope.property.mode = 'read';
}, 0);
});
// Open the dialog
_internalCreateModal(opts, $modal, $scope);
}]);
angular.module('flowableModeler').controller('FlowableTextPropertyPopupCtrl', ['$scope', function($scope) {
$scope.save = function() {
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
$scope.close = function() {
$scope.property.mode = 'read';
$scope.$hide();
};
}]);

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save