diff --git a/grails/symmetricds/grails-app/controllers/org/jumpmind/symmetric/server/ChannelController.groovy b/grails/symmetricds/grails-app/controllers/org/jumpmind/symmetric/server/ChannelController.groovy index 792bcbd2bc..c0c3fdbf76 100644 --- a/grails/symmetricds/grails-app/controllers/org/jumpmind/symmetric/server/ChannelController.groovy +++ b/grails/symmetricds/grails-app/controllers/org/jumpmind/symmetric/server/ChannelController.groovy @@ -42,7 +42,9 @@ class ChannelController { } def show = { - def channelInstance = org.jumpmind.symmetric.grails.Channel.get(params.id) + session.menu="control-channels" + + def channelInstance = org.jumpmind.symmetric.grails.Channel.get(params.id) if (!channelInstance) { flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'channel.label', default: 'Channel'), params.id])}" redirect(action: "list") diff --git a/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/Data.groovy b/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/Data.groovy index ae46eb617d..4f86bd1fc1 100644 --- a/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/Data.groovy +++ b/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/Data.groovy @@ -8,7 +8,7 @@ import org.jumpmind.symmetric.model.DataEventType; import org.jumpmind.symmetric.model.TriggerReBuildReason; class Data implements Serializable { - static transients = [ 'triggerHistory', 'eventType'] + static transients = [ 'triggerHistory', 'eventType', 'htmlRowData', 'htmlOldData'] static hasMany = [ dataEvents : DataEvent ] TriggerHistory triggerHist String strEventType @@ -16,6 +16,8 @@ class Data implements Serializable { private @Delegate org.jumpmind.symmetric.model.Data delegate = new org.jumpmind.symmetric.model.Data() static mapping = { + triggerHist ignoreNotFound:true + def config = ConfigurationHolder.config table config.symmetric.sync.table.prefix + '_data' version false @@ -32,4 +34,30 @@ class Data implements Serializable { public DataEventType getEventType() { return DataEventType.getEventType(strEventType) } + + public String getHtmlRowData() { + StringBuffer html = new StringBuffer() + html.append("\n
") + def columns = toParsedRowData() + columns.each { + html.append("\n\t
").append(it).append("
") + + } + html.append("\n\t
 
") + html.append("\n
") + + } + + public String getHtmlOldData() { + StringBuffer html = new StringBuffer() + html.append("\n
") + def columns = toParsedOldData() + columns.each { + html.append("\n\t
").append(it).append("
") + + } + html.append("\n\t
 
") + html.append("\n
") + + } } diff --git a/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/TriggerHistory.groovy b/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/TriggerHistory.groovy index 6fbbcb534f..b9e424c836 100644 --- a/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/TriggerHistory.groovy +++ b/grails/symmetricds/grails-app/domain/org/jumpmind/symmetric/grails/TriggerHistory.groovy @@ -4,7 +4,7 @@ import org.codehaus.groovy.grails.commons.ConfigurationHolder import org.jumpmind.symmetric.model.TriggerReBuildReason class TriggerHistory implements Serializable { - static transients = [ 'parsedColumnNames', 'parsedPkColumnNames', 'triggerHistoryId', 'lastTriggerBuildReason'] + static transients = [ 'parsedColumnNames', 'parsedPkColumnNames', 'triggerHistoryId', 'lastTriggerBuildReason', 'htmlColumnNames'] String strLastTriggerBuildReason private @Delegate org.jumpmind.symmetric.model.TriggerHistory delegate = new org.jumpmind.symmetric.model.TriggerHistory() @@ -47,6 +47,19 @@ class TriggerHistory implements Serializable { return html.toString() } + public String getHtmlColumnNames() { + StringBuffer html = new StringBuffer() + html.append("\n
") + def columns = columnNames.split(",") + columns.each { + html.append("\n\t
").append(it).append("
") + + } + html.append("\n\t
 
") + html.append("\n
") + + } + public TriggerReBuildReason getLastTriggerBuildReason() { return TriggerReBuildReason.fromCode(strLastTriggerBuildReason) } diff --git a/grails/symmetricds/grails-app/views/common/_listMenu.gsp b/grails/symmetricds/grails-app/views/common/_listMenu.gsp index bb33772832..c264cac0d6 100644 --- a/grails/symmetricds/grails-app/views/common/_listMenu.gsp +++ b/grails/symmetricds/grails-app/views/common/_listMenu.gsp @@ -1,7 +1,9 @@
+
\ No newline at end of file diff --git a/grails/symmetricds/grails-app/views/common/_overview.gsp b/grails/symmetricds/grails-app/views/common/_overview.gsp index 5cbc5f1183..a053edf9a0 100644 --- a/grails/symmetricds/grails-app/views/common/_overview.gsp +++ b/grails/symmetricds/grails-app/views/common/_overview.gsp @@ -4,7 +4,7 @@ ${session.overview?.nodeId} - + diff --git a/grails/symmetricds/grails-app/views/data/show.gsp b/grails/symmetricds/grails-app/views/data/show.gsp index 4aa1138d3d..38fd921d60 100644 --- a/grails/symmetricds/grails-app/views/data/show.gsp +++ b/grails/symmetricds/grails-app/views/data/show.gsp @@ -15,7 +15,7 @@
${flash.message}
- +
@@ -59,19 +59,56 @@ - + - - - - - - - - - - - + + + @@ -80,29 +117,9 @@ + - - - - - - - - - - - - - - - - - - - - - - + diff --git a/grails/symmetricds/grails-app/views/dataEvent/list.gsp b/grails/symmetricds/grails-app/views/dataEvent/list.gsp index d39442ede8..af30fb616c 100644 --- a/grails/symmetricds/grails-app/views/dataEvent/list.gsp +++ b/grails/symmetricds/grails-app/views/dataEvent/list.gsp @@ -4,7 +4,7 @@ - + <g:message code="default.list.label" args="[entityName]" /> @@ -14,26 +14,90 @@
${flash.message}
-
${fieldValue(bean: dataInstance, field: "sourceNodeId")}
${fieldValue(bean: dataInstance, field: "rowData")}
${fieldValue(bean: dataInstance, field: "oldData")} +
+ + <% + columns = dataInstance.triggerHist?.columnNames.split(",") + old = dataInstance.toParsedOldData() + rows = dataInstance.toParsedRowData() + pk = dataInstance.toParsedPkData() + %> + + + + + + + + + + + + <%pkCounter = 0%> + + <%pkCounter = i%> + + + <%pkLength = pk != null ? pk.length : 0%> + + <%pkLength++ + pkCounter++%> + + + + + + + + + + + + + +
${dataInstance.tableName} (${dataInstance.eventType?.encodeAsHTML()})
 ${c}
PK${p} 
New${r}
Old${o}
+
+ +
${fieldValue(bean: dataInstance, field: "externalData")}
${fieldValue(bean: dataInstance, field: "tableName")}
${fieldValue(bean: dataInstance, field: "pkData")}
${dataInstance?.eventType?.encodeAsHTML()}
${dataInstance.triggerHist?.toHtmlString()}
+
+ + - - - + + + - - - + + + + + - - - + + + diff --git a/grails/symmetricds/grails-app/views/incomingBatch/list.gsp b/grails/symmetricds/grails-app/views/incomingBatch/list.gsp index f08b448d64..e98bfb3d5b 100644 --- a/grails/symmetricds/grails-app/views/incomingBatch/list.gsp +++ b/grails/symmetricds/grails-app/views/incomingBatch/list.gsp @@ -17,25 +17,29 @@
${dataEventInstance?.data?.dataId}
+ + + + + ${dataEventInstance?.data?.channelId}${dataEventInstance?.data?.createTime} ${dataEventInstance?.data?.tableName} ${dataEventInstance?.data?.eventType}${dataEventInstance?.data?.rowData}${dataEventInstance?.data?.pkData}${dataEventInstance?.data?.oldData}${dataEventInstance?.data?.transactionId}${dataEventInstance?.data?.sourceNodeId}${dataEventInstance?.data?.externalData}
- + + + - + + + diff --git a/grails/symmetricds/grails-app/views/layouts/main.gsp b/grails/symmetricds/grails-app/views/layouts/main.gsp index 8e4198f7b6..fb02c12ceb 100644 --- a/grails/symmetricds/grails-app/views/layouts/main.gsp +++ b/grails/symmetricds/grails-app/views/layouts/main.gsp @@ -6,6 +6,7 @@ +
diff --git a/grails/symmetricds/web-app/css/symmetric.css b/grails/symmetricds/web-app/css/symmetric.css index eee5b4b064..2982e91276 100644 --- a/grails/symmetricds/web-app/css/symmetric.css +++ b/grails/symmetricds/web-app/css/symmetric.css @@ -571,9 +571,10 @@ font-weight: normal; margin: 0.8em 0px 0.3em; } -div.dialog table { - width:30%; +div.dialog { + width:99%; margin-left:10px; + margin-right:10px; border: thin solid #bbb; } @@ -583,6 +584,7 @@ div.dialog table { .prop .name { font-weight:bold; text-align:left; + width:150px; } @@ -815,3 +817,63 @@ td.errors input { white-space: normal; } +trigger-history-column-name { + float:left; +} + +.data-column-alt { + +} + +.data-panel { + font-size:.75em; + overflow:auto; +} + +#popup-container .data-panel { + width:90%; +} + +.popup { + display:none; + position: absolute; + z-index: 2; + background-color: #FFFFee; + padding: 1.5em; + border: medium double #006DBA; +} + +.data-panel table { + width:100%; +} + +.data-table-columns td { + font-weight:bold; + border-bottom: thin solid #006DBA; +} +.data-label { + font-weight:bold; +} + +.data-table td { + padding-left: 5px; + padding-right: 5px; +} + +.diff { + background-color: #FFFF55; +} +.data-table-name { + color: #006DBA; + text-align:center; + font-size:1.2em; + margin-top: 10px; + margin-bottom: 10px; + +} + +.data-table-popup { + +} + + diff --git a/grails/symmetricds/web-app/js/symmetric.js b/grails/symmetricds/web-app/js/symmetric.js new file mode 100644 index 0000000000..c9bf4eec22 --- /dev/null +++ b/grails/symmetricds/web-app/js/symmetric.js @@ -0,0 +1,8 @@ +function showPopup(obj) { + obj.getElementsByTagName("div")[0].style.display="inline"; +} + +function hidePopup(obj) { + + obj.getElementsByTagName("div")[0].style.display="none"; +}
Show Data
view ${incomingBatchInstance.batchId} ${fieldValue(bean: incomingBatchInstance, field: "nodeId")} ${fieldValue(bean: incomingBatchInstance, field: "channelId")} ${fieldValue(bean: incomingBatchInstance, field: "status")}
${fieldValue(bean: incomingBatchInstance, field: "networkMillis")} ${fieldValue(bean: incomingBatchInstance, field: "filterMillis")}${fieldValue(bean: incomingBatchInstance, field: "databaseMillis")}${fieldValue(bean: incomingBatchInstance, field: "statementCount")}${fieldValue(bean: incomingBatchInstance, field: "fallbackInsertCount")}