diff --git a/GrailsflowGrailsPlugin.groovy b/GrailsflowGrailsPlugin.groovy index b3ae1bab..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 @@ -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/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 } } 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" } 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) { diff --git a/grails-app/taglib/GrailsflowTagLib.groovy b/grails-app/taglib/GrailsflowTagLib.groovy index 0b54cc1a..aef9e8a0 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 @@ -375,15 +376,20 @@ class GrailsflowTagLib { def defaultTemplate = attrs.defaultTemplate def notFoundMessage = attrs.notFoundMessage - // 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']) } @@ -433,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) } 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 @@ - + 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)