From 71a47352b8476a0c1945dc127e9414bf0a7b555c Mon Sep 17 00:00:00 2001 From: Li Ling Date: Tue, 27 Dec 2016 18:48:44 +0800 Subject: [PATCH 01/17] Remove resource requirement in hard coded plugin gsp template --- grails-app/views/commons/_global.gsp | 2 +- grails-app/views/userRole/listGroups.gsp | 1 + grails-app/views/userRole/listRoles.gsp | 1 + grails-app/views/userRole/listUsers.gsp | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/grails-app/views/commons/_global.gsp b/grails-app/views/commons/_global.gsp index cb4b388d..435e0729 100644 --- a/grails-app/views/commons/_global.gsp +++ b/grails-app/views/commons/_global.gsp @@ -1,5 +1,5 @@ - +%{----}% diff --git a/grails-app/views/userRole/listGroups.gsp b/grails-app/views/userRole/listGroups.gsp index bc674348..61090794 100644 --- a/grails-app/views/userRole/listGroups.gsp +++ b/grails-app/views/userRole/listGroups.gsp @@ -18,6 +18,7 @@ <g:message code="plugin.grailsflow.title.groups"/> + function addGroup(group) { opener.addGroups(group) diff --git a/grails-app/views/userRole/listRoles.gsp b/grails-app/views/userRole/listRoles.gsp index 4a69ffa7..7196f500 100644 --- a/grails-app/views/userRole/listRoles.gsp +++ b/grails-app/views/userRole/listRoles.gsp @@ -18,6 +18,7 @@ <g:message code="plugin.grailsflow.title.roles"/> + function addRole(role) { opener.addRoles(role) diff --git a/grails-app/views/userRole/listUsers.gsp b/grails-app/views/userRole/listUsers.gsp index a575c89b..9187be27 100644 --- a/grails-app/views/userRole/listUsers.gsp +++ b/grails-app/views/userRole/listUsers.gsp @@ -18,6 +18,7 @@ <g:message code="plugin.grailsflow.title.users"/> + function addUser(user) { opener.addUsers(user) From a5ba0d4c648883a62e8e82502be88f64a093d69b Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 13:02:10 +0800 Subject: [PATCH 02/17] Allow define a ui plugin that override view templates in grailsflow plugin --- GrailsflowGrailsPlugin.groovy | 3 +++ grails-app/taglib/GrailsflowTagLib.groovy | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/GrailsflowGrailsPlugin.groovy b/GrailsflowGrailsPlugin.groovy index 73a06c09..552aa3cc 100644 --- a/GrailsflowGrailsPlugin.groovy +++ b/GrailsflowGrailsPlugin.groovy @@ -241,6 +241,9 @@ class GrailsflowGrailsPlugin { processManagerService = ref('processManagerService') } + // A plugin that override grailsflow ui + grailsflowUiPlugin(java.lang.String, '') + if(!application.config.grails.converters.json.circular.reference.behaviour) { def jsonConverterConfig = new ConfigObject() jsonConverterConfig.grails.converters.json.circular.reference.behaviour = "INSERT_NULL" diff --git a/grails-app/taglib/GrailsflowTagLib.groovy b/grails-app/taglib/GrailsflowTagLib.groovy index 0b54cc1a..88f9b209 100644 --- a/grails-app/taglib/GrailsflowTagLib.groovy +++ b/grails-app/taglib/GrailsflowTagLib.groovy @@ -31,6 +31,7 @@ class GrailsflowTagLib { static namespace = "gf" def processManagerService def workareaPathProvider + def grailsflowUiPlugin /** * TODO: use g:sortableColumn instead as soos @@ -374,16 +375,22 @@ class GrailsflowTagLib { def template = attrs.template def defaultTemplate = attrs.defaultTemplate def notFoundMessage = attrs.notFoundMessage - + def uiPlugin = grailsApplication.config.plugin.grailsflow.uiPlugin ?: false // Paths to look for template. Sorted by priority of searching. List parameters = new ArrayList() if (template) { parameters.add([contextPath: "", template: template]) + if (grailsflowUiPlugin) { + parameters.add([contextPath: "", template: template, plugin: grailsflowUiPlugin]) + } parameters.add([contextPath: "", template: template, plugin: 'grailsflow']) } if (defaultTemplate) { parameters.add([contextPath: "", template: defaultTemplate]) + if (grailsflowUiPlugin) { + parameters.add([contextPath: "", template: defaultTemplate, plugin: grailsflowUiPlugin]) + } parameters.add([contextPath: "", template: defaultTemplate, plugin: 'grailsflow']) } From bdec4891a4d807567230d96956b157178de7c124 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 13:54:19 +0800 Subject: [PATCH 03/17] remove unused code --- grails-app/taglib/GrailsflowTagLib.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/grails-app/taglib/GrailsflowTagLib.groovy b/grails-app/taglib/GrailsflowTagLib.groovy index 88f9b209..d4d17d5a 100644 --- a/grails-app/taglib/GrailsflowTagLib.groovy +++ b/grails-app/taglib/GrailsflowTagLib.groovy @@ -375,7 +375,6 @@ class GrailsflowTagLib { def template = attrs.template def defaultTemplate = attrs.defaultTemplate def notFoundMessage = attrs.notFoundMessage - def uiPlugin = grailsApplication.config.plugin.grailsflow.uiPlugin ?: false // Paths to look for template. Sorted by priority of searching. List parameters = new ArrayList() From 3a595a848cdcb90fbf9c1573ac22e8b529e4d47d Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 16:52:45 +0800 Subject: [PATCH 04/17] Change lang field length to 5 to support zh_CN --- .../jcatalog/grailsflow/model/definition/ProcessDef.groovy | 4 ++-- .../grailsflow/model/definition/ProcessNodeDef.groovy | 4 ++-- .../grailsflow/model/definition/ProcessTransitionDef.groovy | 2 +- .../grailsflow/model/definition/ProcessVariableDef.groovy | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy index 372ff5fa..a2f2e6ed 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy @@ -52,8 +52,8 @@ class ProcessDef { nodes cascade: "all,delete-orphan" variables cascade: "all,delete-orphan" assignees cascade: "all,delete-orphan" - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_def_id' ,column:'label'],length:255 - description indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_def_id' ,column:'description'],length:255 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_def_id' ,column:'label'],length:255 + description indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_def_id' ,column:'description'],length:255 } static transients = [ "startNode", "processAssignees" ] diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy index 702d431c..eebbd7ce 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy @@ -65,8 +65,8 @@ class ProcessNodeDef { static mapping = { processDef index: 'IDX_PROCESS_NODE_DEF_2' assignees cascade: "all,delete-orphan" - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_node_def_id' ,column:'label'],length:255 - description indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_node_def_id' ,column:'description'],length:255 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_node_def_id' ,column:'label'],length:255 + description indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_node_def_id' ,column:'description'],length:255 actionStatements cascade: "all,delete-orphan" transitions cascade: "all,delete-orphan" transitions2DestinationNode: cascade: "all,delete-orphan" diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy index 92e8f71f..ba1a77ea 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy @@ -40,7 +40,7 @@ class ProcessTransitionDef { static mapping = { transition2DestinationNodes cascade: "all,delete-orphan" - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_transition_def_id', column:'label'],length:20 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_transition_def_id', column:'label'],length:20 } // Used to write and parse process class diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy index 7ba246b9..742f973f 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy @@ -102,10 +102,10 @@ class ProcessVariableDef { isProcessIdentifier type:YesNoType required type:YesNoType } - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_variable_def_id', column:'label'],length:255 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_variable_def_id', column:'label'],length:255 // TODO: enable when table name generation will work - //description indexColumn:[name:"language", type:String, length:2],joinTable:[name:'process_variable_def_desc', key:'process_variable_def_id', column:'description'],length:255 - desc indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_variable_def_id', column:'description'],length:255 + //description indexColumn:[name:"language", type:String, length:5],joinTable:[name:'process_variable_def_desc', key:'process_variable_def_id', column:'description'],length:255 + desc indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_variable_def_id', column:'description'],length:255 variable2NodesVisibility cascade: "all,delete-orphan" items cascade: "all,delete-orphan" } From 7fa22a1230039d3ab022670744f1e935458ff975 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 17:13:05 +0800 Subject: [PATCH 05/17] Hacking chinese support --- grails-app/taglib/GrailsflowTagLib.groovy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/grails-app/taglib/GrailsflowTagLib.groovy b/grails-app/taglib/GrailsflowTagLib.groovy index d4d17d5a..aef9e8a0 100644 --- a/grails-app/taglib/GrailsflowTagLib.groovy +++ b/grails-app/taglib/GrailsflowTagLib.groovy @@ -439,7 +439,10 @@ class GrailsflowTagLib { def translations = attrs.translations def defaultValue = attrs.default def lang = attrs.lang ? attrs.lang : RCU.getLocale(request)?.language.toString() - + + // this is an ugly hack, which change zh to zh_CN or zh_TW + if (lang == 'zh') lang = RCU.getLocale(request)?.toString() + out << TranslationUtils.getTranslatedValue(translations, defaultValue, lang) } From c8fde3046844b640bdebbb1e21d70dbf34c64508 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 17:19:46 +0800 Subject: [PATCH 06/17] Add language zh_CN to suppported languages list --- grails-app/views/common/_translationsEditor.gsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/views/common/_translationsEditor.gsp b/grails-app/views/common/_translationsEditor.gsp index 4e0e4c59..4a6881d1 100644 --- a/grails-app/views/common/_translationsEditor.gsp +++ b/grails-app/views/common/_translationsEditor.gsp @@ -108,7 +108,7 @@ - + From 169038b17a07fbdd539f8fffda573545179ac648 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 20:34:52 +0800 Subject: [PATCH 07/17] Add more chinese support hacking --- GrailsflowGrailsPlugin.groovy | 8 ++++---- grails-app/taglib/GrailsflowFormatTagLib.groovy | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/GrailsflowGrailsPlugin.groovy b/GrailsflowGrailsPlugin.groovy index 552aa3cc..aa3d7124 100644 --- a/GrailsflowGrailsPlugin.groovy +++ b/GrailsflowGrailsPlugin.groovy @@ -45,10 +45,10 @@ class GrailsflowGrailsPlugin { } // format patterns - datePatterns(java.util.HashMap, ['en':'MM/dd/yyyy', 'de':'dd.MM.yyyy']) - dateTimePatterns(java.util.HashMap, ['en':'MM/dd/yy HH:mm', 'de':'dd.MM.yy HH:mm']) - numberPatterns(java.util.HashMap, ['en':'0.00', 'de':'0.00']) - decimalSeparators(java.util.HashMap, ['en':'.', 'de':',']) + datePatterns(java.util.HashMap, ['en':'MM/dd/yyyy', 'de':'dd.MM.yyyy', 'zh_CN': 'yyyy-MM-dd']) + dateTimePatterns(java.util.HashMap, ['en':'MM/dd/yy HH:mm', 'de':'dd.MM.yy HH:mm', 'zh_CN': 'yyyy-MM-dd HH:mm']) + numberPatterns(java.util.HashMap, ['en':'0.00', 'de':'0.00', 'zh_CN': '0.00']) + decimalSeparators(java.util.HashMap, ['en':'.', 'de':',', 'zh_CN': '.']) defaultLocale(java.lang.String, "en") // default workarea configuration diff --git a/grails-app/taglib/GrailsflowFormatTagLib.groovy b/grails-app/taglib/GrailsflowFormatTagLib.groovy index e89b8d4c..14773eb0 100644 --- a/grails-app/taglib/GrailsflowFormatTagLib.groovy +++ b/grails-app/taglib/GrailsflowFormatTagLib.groovy @@ -123,7 +123,7 @@ class GrailsflowFormatTagLib { */ def dateTimePattern = { attrs -> def locale = attrs.locale ? attrs.locale : RCU.getLocale(request) - def pattern = dateTimePatterns?.get(locale.language) + def pattern = dateTimePatterns?.get(locale.language == 'zh' ? locale.toString() : locale.language) // if no pattern for specified locale, then use default if (pattern == null && defaultLocale) { From 141ae44e3b3137d6de749150b225110a7cc575df Mon Sep 17 00:00:00 2001 From: Li Ling Date: Thu, 29 Dec 2016 11:54:49 +0800 Subject: [PATCH 08/17] Customize JSON data for process node list --- .../controllers/ProcessController.groovy | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/grails-app/controllers/ProcessController.groovy b/grails-app/controllers/ProcessController.groovy index 929fe20f..5099592a 100644 --- a/grails-app/controllers/ProcessController.groovy +++ b/grails-app/controllers/ProcessController.groovy @@ -70,6 +70,10 @@ class ProcessController extends GrailsFlowSecureController { forward(action: "list", params: params) } + static processNodeJsonProperties = [ + 'id', 'branchID', 'caller', 'description', 'dueOn', 'event', 'exception', + 'finishedOn', 'nodeID', 'protocolGroup', 'startedExecutionOn', 'startedOn', 'status', 'type'] + /** * ProcessList UI */ @@ -224,6 +228,7 @@ class ProcessController extends GrailsFlowSecureController { // Build nodes Details def processNodes = [] + def worklistNodeDetails = [:] worklist?.each { processNode -> def process = processNode.process def processInstance = processManagerService.getRunningProcessInstance(process.id) @@ -237,6 +242,7 @@ class ProcessController extends GrailsFlowSecureController { additionalColumns[name] += varDetails.label } } + worklistNodeDetails.put(processNode, nodeDetails) } } if (params.sort == "nodeLabel") { @@ -270,7 +276,23 @@ class ProcessController extends GrailsFlowSecureController { withFormat { html { render(view: 'showWorklist',model: model, params: params) } json { - model.processNodeList = worklist + model.processNodeList = [] + // Customize JSON data for process node + worklist.each { ProcessNode processNode -> + def nodeDetails = worklistNodeDetails.get(processNode) + + def jsonNode = [:] + processNodeJsonProperties.each { jsonNode.put(it, processNode."${it}") } + jsonNode.label = gf.translatedValue(translations: nodeDetails.label, default: nodeDetails.nodeID) + jsonNode.description = gf.translatedValue(translations: nodeDetails.description, default: '') + jsonNode.status = processNode?.status?.statusID + jsonNode.process = [ + id: processNode.process.id, + label: gf.translatedValue(translations: nodeDetails.process.label, default: nodeDetails.process.type), + description: gf.translatedValue(translations: nodeDetails.process.description, default: '')] + + model.processNodeList << jsonNode + } render model as JSON } } From 9ad7a82aceaf7c66db215c2379a7acfe39cd110f Mon Sep 17 00:00:00 2001 From: Li Ling Date: Tue, 27 Dec 2016 18:48:44 +0800 Subject: [PATCH 09/17] Remove resource requirement in hard coded plugin gsp template --- grails-app/views/commons/_global.gsp | 2 +- grails-app/views/userRole/listGroups.gsp | 1 + grails-app/views/userRole/listRoles.gsp | 1 + grails-app/views/userRole/listUsers.gsp | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/grails-app/views/commons/_global.gsp b/grails-app/views/commons/_global.gsp index cb4b388d..435e0729 100644 --- a/grails-app/views/commons/_global.gsp +++ b/grails-app/views/commons/_global.gsp @@ -1,5 +1,5 @@ - +%{----}% diff --git a/grails-app/views/userRole/listGroups.gsp b/grails-app/views/userRole/listGroups.gsp index bc674348..61090794 100644 --- a/grails-app/views/userRole/listGroups.gsp +++ b/grails-app/views/userRole/listGroups.gsp @@ -18,6 +18,7 @@ <g:message code="plugin.grailsflow.title.groups"/> + function addGroup(group) { opener.addGroups(group) diff --git a/grails-app/views/userRole/listRoles.gsp b/grails-app/views/userRole/listRoles.gsp index 4a69ffa7..7196f500 100644 --- a/grails-app/views/userRole/listRoles.gsp +++ b/grails-app/views/userRole/listRoles.gsp @@ -18,6 +18,7 @@ <g:message code="plugin.grailsflow.title.roles"/> + function addRole(role) { opener.addRoles(role) diff --git a/grails-app/views/userRole/listUsers.gsp b/grails-app/views/userRole/listUsers.gsp index a575c89b..9187be27 100644 --- a/grails-app/views/userRole/listUsers.gsp +++ b/grails-app/views/userRole/listUsers.gsp @@ -18,6 +18,7 @@ <g:message code="plugin.grailsflow.title.users"/> + function addUser(user) { opener.addUsers(user) From e121cfc14afec681b6280b89c6ea58760aec7f7e Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 13:02:10 +0800 Subject: [PATCH 10/17] Allow define a ui plugin that override view templates in grailsflow plugin --- GrailsflowGrailsPlugin.groovy | 3 +++ grails-app/taglib/GrailsflowTagLib.groovy | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/GrailsflowGrailsPlugin.groovy b/GrailsflowGrailsPlugin.groovy index b3ae1bab..a821b495 100644 --- a/GrailsflowGrailsPlugin.groovy +++ b/GrailsflowGrailsPlugin.groovy @@ -241,6 +241,9 @@ class GrailsflowGrailsPlugin { processManagerService = ref('processManagerService') } + // A plugin that override grailsflow ui + grailsflowUiPlugin(java.lang.String, '') + if(!application.config.grails.converters.json.circular.reference.behaviour) { def jsonConverterConfig = new ConfigObject() jsonConverterConfig.grails.converters.json.circular.reference.behaviour = "INSERT_NULL" diff --git a/grails-app/taglib/GrailsflowTagLib.groovy b/grails-app/taglib/GrailsflowTagLib.groovy index 0b54cc1a..88f9b209 100644 --- a/grails-app/taglib/GrailsflowTagLib.groovy +++ b/grails-app/taglib/GrailsflowTagLib.groovy @@ -31,6 +31,7 @@ class GrailsflowTagLib { static namespace = "gf" def processManagerService def workareaPathProvider + def grailsflowUiPlugin /** * TODO: use g:sortableColumn instead as soos @@ -374,16 +375,22 @@ class GrailsflowTagLib { def template = attrs.template def defaultTemplate = attrs.defaultTemplate def notFoundMessage = attrs.notFoundMessage - + def uiPlugin = grailsApplication.config.plugin.grailsflow.uiPlugin ?: false // Paths to look for template. Sorted by priority of searching. List parameters = new ArrayList() if (template) { parameters.add([contextPath: "", template: template]) + if (grailsflowUiPlugin) { + parameters.add([contextPath: "", template: template, plugin: grailsflowUiPlugin]) + } parameters.add([contextPath: "", template: template, plugin: 'grailsflow']) } if (defaultTemplate) { parameters.add([contextPath: "", template: defaultTemplate]) + if (grailsflowUiPlugin) { + parameters.add([contextPath: "", template: defaultTemplate, plugin: grailsflowUiPlugin]) + } parameters.add([contextPath: "", template: defaultTemplate, plugin: 'grailsflow']) } From 69dd8146a8d28523351d30261a46fa8c3f6efc8f Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 13:54:19 +0800 Subject: [PATCH 11/17] remove unused code --- grails-app/taglib/GrailsflowTagLib.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/grails-app/taglib/GrailsflowTagLib.groovy b/grails-app/taglib/GrailsflowTagLib.groovy index 88f9b209..d4d17d5a 100644 --- a/grails-app/taglib/GrailsflowTagLib.groovy +++ b/grails-app/taglib/GrailsflowTagLib.groovy @@ -375,7 +375,6 @@ class GrailsflowTagLib { def template = attrs.template def defaultTemplate = attrs.defaultTemplate def notFoundMessage = attrs.notFoundMessage - def uiPlugin = grailsApplication.config.plugin.grailsflow.uiPlugin ?: false // Paths to look for template. Sorted by priority of searching. List parameters = new ArrayList() From 73c23b4a02b90a1677d854b7c26c1322e02e36c4 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 16:52:45 +0800 Subject: [PATCH 12/17] Change lang field length to 5 to support zh_CN --- .../jcatalog/grailsflow/model/definition/ProcessDef.groovy | 4 ++-- .../grailsflow/model/definition/ProcessNodeDef.groovy | 4 ++-- .../grailsflow/model/definition/ProcessTransitionDef.groovy | 2 +- .../grailsflow/model/definition/ProcessVariableDef.groovy | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy index 372ff5fa..a2f2e6ed 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessDef.groovy @@ -52,8 +52,8 @@ class ProcessDef { nodes cascade: "all,delete-orphan" variables cascade: "all,delete-orphan" assignees cascade: "all,delete-orphan" - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_def_id' ,column:'label'],length:255 - description indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_def_id' ,column:'description'],length:255 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_def_id' ,column:'label'],length:255 + description indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_def_id' ,column:'description'],length:255 } static transients = [ "startNode", "processAssignees" ] diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy index 702d431c..eebbd7ce 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessNodeDef.groovy @@ -65,8 +65,8 @@ class ProcessNodeDef { static mapping = { processDef index: 'IDX_PROCESS_NODE_DEF_2' assignees cascade: "all,delete-orphan" - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_node_def_id' ,column:'label'],length:255 - description indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_node_def_id' ,column:'description'],length:255 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_node_def_id' ,column:'label'],length:255 + description indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_node_def_id' ,column:'description'],length:255 actionStatements cascade: "all,delete-orphan" transitions cascade: "all,delete-orphan" transitions2DestinationNode: cascade: "all,delete-orphan" diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy index 92e8f71f..ba1a77ea 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessTransitionDef.groovy @@ -40,7 +40,7 @@ class ProcessTransitionDef { static mapping = { transition2DestinationNodes cascade: "all,delete-orphan" - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_transition_def_id', column:'label'],length:20 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_transition_def_id', column:'label'],length:20 } // Used to write and parse process class diff --git a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy index 7ba246b9..742f973f 100644 --- a/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy +++ b/grails-app/domain/com/jcatalog/grailsflow/model/definition/ProcessVariableDef.groovy @@ -102,10 +102,10 @@ class ProcessVariableDef { isProcessIdentifier type:YesNoType required type:YesNoType } - label indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_variable_def_id', column:'label'],length:255 + label indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_variable_def_id', column:'label'],length:255 // TODO: enable when table name generation will work - //description indexColumn:[name:"language", type:String, length:2],joinTable:[name:'process_variable_def_desc', key:'process_variable_def_id', column:'description'],length:255 - desc indexColumn:[name:"language", type:String, length:2],joinTable:[key:'process_variable_def_id', column:'description'],length:255 + //description indexColumn:[name:"language", type:String, length:5],joinTable:[name:'process_variable_def_desc', key:'process_variable_def_id', column:'description'],length:255 + desc indexColumn:[name:"language", type:String, length:5],joinTable:[key:'process_variable_def_id', column:'description'],length:255 variable2NodesVisibility cascade: "all,delete-orphan" items cascade: "all,delete-orphan" } From b2e1a8d93c1bb7142d48dfa3c32c464231913b29 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 17:13:05 +0800 Subject: [PATCH 13/17] Hacking chinese support --- grails-app/taglib/GrailsflowTagLib.groovy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/grails-app/taglib/GrailsflowTagLib.groovy b/grails-app/taglib/GrailsflowTagLib.groovy index d4d17d5a..aef9e8a0 100644 --- a/grails-app/taglib/GrailsflowTagLib.groovy +++ b/grails-app/taglib/GrailsflowTagLib.groovy @@ -439,7 +439,10 @@ class GrailsflowTagLib { def translations = attrs.translations def defaultValue = attrs.default def lang = attrs.lang ? attrs.lang : RCU.getLocale(request)?.language.toString() - + + // this is an ugly hack, which change zh to zh_CN or zh_TW + if (lang == 'zh') lang = RCU.getLocale(request)?.toString() + out << TranslationUtils.getTranslatedValue(translations, defaultValue, lang) } From 61601ca72a75ebadd01f4ae80cc01dbfcb4725fa Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 17:19:46 +0800 Subject: [PATCH 14/17] Add language zh_CN to suppported languages list --- grails-app/views/common/_translationsEditor.gsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/views/common/_translationsEditor.gsp b/grails-app/views/common/_translationsEditor.gsp index 4e0e4c59..4a6881d1 100644 --- a/grails-app/views/common/_translationsEditor.gsp +++ b/grails-app/views/common/_translationsEditor.gsp @@ -108,7 +108,7 @@ - + From c0f9e178f4d14ed7c2becda79d13d4671ad2f5ba Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 28 Dec 2016 20:34:52 +0800 Subject: [PATCH 15/17] Add more chinese support hacking --- GrailsflowGrailsPlugin.groovy | 8 ++++---- grails-app/taglib/GrailsflowFormatTagLib.groovy | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/GrailsflowGrailsPlugin.groovy b/GrailsflowGrailsPlugin.groovy index a821b495..109c022a 100644 --- a/GrailsflowGrailsPlugin.groovy +++ b/GrailsflowGrailsPlugin.groovy @@ -45,10 +45,10 @@ class GrailsflowGrailsPlugin { } // format patterns - datePatterns(java.util.HashMap, ['en':'MM/dd/yyyy', 'de':'dd.MM.yyyy']) - dateTimePatterns(java.util.HashMap, ['en':'MM/dd/yy HH:mm', 'de':'dd.MM.yy HH:mm']) - numberPatterns(java.util.HashMap, ['en':'0.00', 'de':'0.00']) - decimalSeparators(java.util.HashMap, ['en':'.', 'de':',']) + datePatterns(java.util.HashMap, ['en':'MM/dd/yyyy', 'de':'dd.MM.yyyy', 'zh_CN': 'yyyy-MM-dd']) + dateTimePatterns(java.util.HashMap, ['en':'MM/dd/yy HH:mm', 'de':'dd.MM.yy HH:mm', 'zh_CN': 'yyyy-MM-dd HH:mm']) + numberPatterns(java.util.HashMap, ['en':'0.00', 'de':'0.00', 'zh_CN': '0.00']) + decimalSeparators(java.util.HashMap, ['en':'.', 'de':',', 'zh_CN': '.']) defaultLocale(java.lang.String, "en") // default workarea configuration diff --git a/grails-app/taglib/GrailsflowFormatTagLib.groovy b/grails-app/taglib/GrailsflowFormatTagLib.groovy index e89b8d4c..14773eb0 100644 --- a/grails-app/taglib/GrailsflowFormatTagLib.groovy +++ b/grails-app/taglib/GrailsflowFormatTagLib.groovy @@ -123,7 +123,7 @@ class GrailsflowFormatTagLib { */ def dateTimePattern = { attrs -> def locale = attrs.locale ? attrs.locale : RCU.getLocale(request) - def pattern = dateTimePatterns?.get(locale.language) + def pattern = dateTimePatterns?.get(locale.language == 'zh' ? locale.toString() : locale.language) // if no pattern for specified locale, then use default if (pattern == null && defaultLocale) { From f5740f15fea4f0bb97dc4e2de8ee28d87c74edf9 Mon Sep 17 00:00:00 2001 From: Ling Li Date: Wed, 28 Dec 2016 23:29:12 +0800 Subject: [PATCH 16/17] Node assignees should be read from database Since node assignees can be changed dynamically, when checking permission of current node, the allowed assignees list should be read from database instead of static process class. --- grails-app/controllers/ProcessManagementController.groovy | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/grails-app/controllers/ProcessManagementController.groovy b/grails-app/controllers/ProcessManagementController.groovy index aa79b843..834bb275 100644 --- a/grails-app/controllers/ProcessManagementController.groovy +++ b/grails-app/controllers/ProcessManagementController.groovy @@ -225,7 +225,13 @@ class ProcessManagementController extends GrailsFlowSecureController { // checking process node assignees and user authorities def authorities = getUserAuthorities(session) - def nodeAssignees = processClass.nodes[nodeID]?.assignees?.collect() { it.assigneeID.trim() } + def nodeAssignees = [] + node?.process?.assignees?.each { + if (it.nodeID == nodeID) nodeAssignees << it.assigneeID.trim() + } + if (nodeAssignees.isEmpty()) { + nodeAssignees = processClass.nodes[nodeID]?.assignees?.collect() { it.assigneeID.trim() } + } if (nodeAssignees && !nodeAssignees.isEmpty() && nodeAssignees.intersect(authorities).isEmpty()) { flash.errors << g.message(code: "plugin.grailsflow.message.nodeAuthorities.invalid") withFormat { From 1736201e9d9341a615d770e7f4b9fa0a97b42076 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Thu, 29 Dec 2016 11:54:49 +0800 Subject: [PATCH 17/17] Customize JSON data for process node list --- .../controllers/ProcessController.groovy | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/grails-app/controllers/ProcessController.groovy b/grails-app/controllers/ProcessController.groovy index 929fe20f..5099592a 100644 --- a/grails-app/controllers/ProcessController.groovy +++ b/grails-app/controllers/ProcessController.groovy @@ -70,6 +70,10 @@ class ProcessController extends GrailsFlowSecureController { forward(action: "list", params: params) } + static processNodeJsonProperties = [ + 'id', 'branchID', 'caller', 'description', 'dueOn', 'event', 'exception', + 'finishedOn', 'nodeID', 'protocolGroup', 'startedExecutionOn', 'startedOn', 'status', 'type'] + /** * ProcessList UI */ @@ -224,6 +228,7 @@ class ProcessController extends GrailsFlowSecureController { // Build nodes Details def processNodes = [] + def worklistNodeDetails = [:] worklist?.each { processNode -> def process = processNode.process def processInstance = processManagerService.getRunningProcessInstance(process.id) @@ -237,6 +242,7 @@ class ProcessController extends GrailsFlowSecureController { additionalColumns[name] += varDetails.label } } + worklistNodeDetails.put(processNode, nodeDetails) } } if (params.sort == "nodeLabel") { @@ -270,7 +276,23 @@ class ProcessController extends GrailsFlowSecureController { withFormat { html { render(view: 'showWorklist',model: model, params: params) } json { - model.processNodeList = worklist + model.processNodeList = [] + // Customize JSON data for process node + worklist.each { ProcessNode processNode -> + def nodeDetails = worklistNodeDetails.get(processNode) + + def jsonNode = [:] + processNodeJsonProperties.each { jsonNode.put(it, processNode."${it}") } + jsonNode.label = gf.translatedValue(translations: nodeDetails.label, default: nodeDetails.nodeID) + jsonNode.description = gf.translatedValue(translations: nodeDetails.description, default: '') + jsonNode.status = processNode?.status?.statusID + jsonNode.process = [ + id: processNode.process.id, + label: gf.translatedValue(translations: nodeDetails.process.label, default: nodeDetails.process.type), + description: gf.translatedValue(translations: nodeDetails.process.description, default: '')] + + model.processNodeList << jsonNode + } render model as JSON } }