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 @@
+
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 @@
+
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 @@
+
function addUser(user) {
opener.addUsers(user)