git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 8 Mar 2018 21:59:30 +0000 (21:59 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 8 Mar 2018 21:59:30 +0000 (21:59 +0000)
13 files changed:
server/user.jobengine.executors/src/user/jobengine/server/steps/ImportStatisticsStep.java
server/user.jobengine.osgi.server/js/chart_formatters.js [new file with mode: 0644]
server/user.jobengine.osgi.server/pages/newshistory.zul
server/user.jobengine.osgi.server/pages/statistics.zul
server/user.jobengine.osgi.server/pages/statistics2.zul [deleted file]
server/user.jobengine.osgi.server/pages/statisticsdetails.zul [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MetadataTypeDetector.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsHistoryCharts.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsHistoryModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsMaterialTypeChart.java [deleted file]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsChartComposer.java [deleted file]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsDetailsModel.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsModel.java [moved from server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsComposer.java with 76% similarity]

index 63e3f7e86d256fa44cdec1572aa3dd4f422baa28..547929fff6addd50307e84b3c84867b93cca3a13 100644 (file)
@@ -98,6 +98,10 @@ public class ImportStatisticsStep extends JobStep {
                BasicDBObject typeStatRawData = new BasicDBObject();\r
                typeStat.put("rawData", typeStatRawData);\r
                long sumduration = 0;\r
+               long sumIngestDuration = 0;\r
+               long sumIngestCount = 0;\r
+               long sumArchiveDuration = 0;\r
+               long sumArchiveCount = 0;\r
 \r
                List<BasicDBObject> rawData = new ArrayList<>();\r
                for (BasicDBObject story : stories.values()) {\r
@@ -128,6 +132,8 @@ public class ImportStatisticsStep extends JobStep {
                                        ingestDuration = ingestInfo.getLong("duration");\r
                                        raw.put("ingest_count", ingestCount);\r
                                        raw.put("ingest_duration", ingestDuration);\r
+                                       sumIngestCount += ingestCount;\r
+                                       sumIngestDuration += ingestDuration;\r
                                }\r
 \r
                                long archiveCount = 0;\r
@@ -138,6 +144,8 @@ public class ImportStatisticsStep extends JobStep {
                                        archiveDuration = ingestInfo.getLong("duration");\r
                                        raw.put("archive_count", archiveCount);\r
                                        raw.put("archive_duration", archiveDuration);\r
+                                       sumArchiveCount += archiveCount;\r
+                                       sumArchiveDuration += archiveDuration;\r
                                }\r
 \r
                                rawData.add(raw);\r
@@ -171,6 +179,10 @@ public class ImportStatisticsStep extends JobStep {
 \r
                planStat.put("all_count", rawData.size());\r
                planStat.put("all_duration", sumduration);\r
+               planStat.put("archive_count", sumArchiveCount);\r
+               planStat.put("archive_duration", sumArchiveDuration);\r
+               planStat.put("ingest_count", sumIngestCount);\r
+               planStat.put("ingest_duration", sumIngestDuration);\r
 \r
                store(scheduledDate, rawData, typeStat, planStat);\r
                return null;\r
diff --git a/server/user.jobengine.osgi.server/js/chart_formatters.js b/server/user.jobengine.osgi.server/js/chart_formatters.js
new file mode 100644 (file)
index 0000000..1e87bf0
--- /dev/null
@@ -0,0 +1,36 @@
+function statisticsXValue(value) {\r
+       var hour = Math.floor(value / 60);\r
+       var minute = value % 60;\r
+       if (hour == 0)\r
+               if (minute == 0)\r
+                       return "";\r
+       hour = ("" + hour).length == 1 ? '0' + hour : hour;\r
+       minute = ("" + minute).length == 1 ? '0' + minute : minute;\r
+       return hour + ':' + minute;\r
+}\r
+\r
+function statisticsYValue(value, series) {\r
+       var options = series[value - 1];\r
+       console.log("statisticsYValue", series.name, value, series);\r
+       return options == null ? "" : options.userOptions.name;\r
+}\r
+\r
+if (!String.format) {\r
+       String.format = function(format) {\r
+               var args = Array.prototype.slice.call(arguments, 1);\r
+               return format.replace(/{(\d+)}/g, function(match, number) {\r
+                       return typeof args[number] != 'undefined' ? args[number]\r
+                                       : match;\r
+               });\r
+       };\r
+}\r
+\r
+function statistics(value) {\r
+       //                      console.log("statistics", value, series);\r
+       var obj = eval("(" + value.name + ')');\r
+       return String\r
+       .format(\r
+                       'Kézbesítve . {0}  <br/> Elkezdve . {1}  <br/>  Befejezve . {2} <br/> Azonosító . {3} <br/> Forrás . {4} <br/> Cél . {5} <br/> Cimke . <span style="background:{6}">{7}</span> <br/> Sikeres . {8} <br/> Felhasználó . {9}',\r
+                       obj.Touched, obj.Started, obj.Finished, obj.HouseId, obj.Source, obj.Destination,\r
+                       obj.Tag, obj.Tag, obj.Successful, obj.UserName);\r
+}\r
index 3fd4ecaf5813e21daa075b5606f773213bb94363..85cde7dbbe65b5090fdfea3056300b0ac3c34efa 100644 (file)
@@ -1,14 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <zk xmlns="http://www.zkoss.org/2005/zul">\r
        <vlayout hflex="1" vflex="1" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.NewsHistoryModel')">\r
-               <hbox height="10px" hflex="1" />\r
-               <hlayout hflex="1">\r
+               <hbox height="40px" align="center">\r
                        <space bar="false" />\r
-                       <datebox value="@bind(vm.selectedDate)" width="150px" format="yyyy.MM.dd" lenient="false" compact="false" buttonVisible="true"\r
+                       <datebox value="@bind(vm.selectedDate)" width="150px" format="yyyy.MM.dd" mold="rounded" weekOfYear="true" showTodayLink="true" lenient="false" compact="false" buttonVisible="true"\r
                                constraint="no empty, no future: now or never" />\r
-               </hlayout>\r
-               <hbox height="10px" hflex="1" />\r
-               <hlayout hflex="1" vflex="1">\r
+               </hbox>\r
+<!--           <hlayout hflex="1" vflex="1"> -->\r
                        <tabbox hflex="1" vflex="1">\r
                                <tabs>\r
                                        <tab label="Grafikonok" closable="false" />\r
                                                                                <charts id="typeChartSumDuration" type="pie" />\r
                                                                        </div>\r
                                                                        <div width="100%" onAfterSize='planChart.setWidth(new Integer(event.getWidth()))'>\r
-                                                                               <charts id="planChart" type="pie" />\r
+                                                                               <charts id="planChart" type="column" />\r
                                                                        </div>\r
                                                                </row>\r
                                                        </rows>\r
                                                </grid>\r
-                                               <!--                                            <vlayout style="overflow:auto;text-align:center;" height="100%" width="100%"> -->\r
-                                               <!--                                                    <hlayout width="100%"> -->\r
-                                               <!--                                                    </hlayout> -->\r
-                                               <!--                                            </vlayout> -->\r
                                        </tabpanel>\r
                                        <tabpanel>\r
-                                               <grid model="@load(vm.dataList)" mold="paging" sizedByContent="default" vflex="1" hflex="1" emptyMessage="Nincs adat!">\r
+                                               <grid model="@load(vm.dataList)" mold="paging" autopaging="true" sizedByContent="false" vflex="true" hflex="true" emptyMessage="Nincs adat!">\r
                                                        <auxhead>\r
                                                <auxheader colspan="11" align="right">\r
                                                                        <a href="javascript:void(0);" label="letöltés" onClick="@command('downloadRawData')" disabled="@load(vm.downloadDisabled)" />\r
@@ -63,6 +57,6 @@
                                        </tabpanel>\r
                                </tabpanels>\r
                        </tabbox>\r
-               </hlayout>\r
+<!--           </hlayout> -->\r
        </vlayout>\r
 </zk>
\ No newline at end of file
index d6879d5b2cdc16dff88eaba345639b5c08b0fa31..2a90328bdcbbba60e1c1abf9ff2fc7cff7d21231 100644 (file)
@@ -1,58 +1,36 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <?init class="user.jobengine.zk.util.AdminAuthInitiator"?>\r
-<window apply="user.jobengine.zk.model.StatisticsComposer" width="100%" height="100%">\r
-\r
-<div width="100%" height="5%">\r
-       <label value="Dátum:" />\r
-       <datebox id="chartDateSelector" width="150px" format="yyyy.MM.dd"\r
-               lenient="false" compact="false" buttonVisible="true" disabled="false" />\r
-       <radiogroup>\r
-        <radio label="Híranyagok" />\r
-        <radio label="Műsorok" />\r
-       </radiogroup>           \r
-       <space bar="false" />\r
-       <button id="btnShowChart" label="Megjelenít" />\r
-</div>\r
-\r
-<script>\r
-       function statisticsXValue(value) {\r
-               var hour = Math.floor(value / 60);\r
-               var minute = value % 60;\r
-               if (hour == 0)\r
-                       if (minute == 0)\r
-                               return "";\r
-               hour = ("" + hour).length == 1 ? '0' + hour : hour;\r
-               minute = ("" + minute).length == 1 ? '0' + minute : minute;\r
-               return hour + ':' + minute;\r
-       }\r
-\r
-       function statisticsYValue(value, series) {\r
-               var options = series[value - 1];\r
-               console.log("statisticsYValue", series.name, value, series);\r
-               return options == null ? "" : options.userOptions.name;\r
-       }\r
-\r
-       if (!String.format) {\r
-               String.format = function(format) {\r
-                       var args = Array.prototype.slice.call(arguments, 1);\r
-                       return format.replace(/{(\d+)}/g, function(match, number) {\r
-                               return typeof args[number] != 'undefined' ? args[number]\r
-                                               : match;\r
-                       });\r
-               };\r
-       }\r
-\r
-       function statistics(value) {\r
-               //                      console.log("statistics", value, series);\r
-               var obj = eval("(" + value.name + ')');\r
-               return String\r
-               .format(\r
-                               'Kézbesítve . {0}  <br/> Elkezdve . {1}  <br/>  Befejezve . {2} <br/> Azonosító . {3} <br/> Forrás . {4} <br/> Cél . {5} <br/> Cimke . <span style="background:{6}">{7}</span> <br/> Sikeres . {8} <br/> Felhasználó . {9}',\r
-                               obj.Touched, obj.Started, obj.Finished, obj.HouseId, obj.Source, obj.Destination,\r
-                               obj.Tag, obj.Tag, obj.Successful, obj.UserName);\r
-       }\r
-</script> \r
-       <div width="100%" height="95%" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth()-20))'>\r
-                       <charts id="chart" type="spline" zoomType="x" /> \r
-       </div>\r
-</window>\r
+<zk>\r
+       <script>\r
+               function statisticsXValue(value) {\r
+                       var hour = Math.floor(value / 60);\r
+                       var minute = value % 60;\r
+                       if (hour == 0)\r
+                               if (minute == 0)\r
+                                       return "";\r
+                       hour = ("" + hour).length == 1 ? '0' + hour : hour;\r
+                       minute = ("" + minute).length == 1 ? '0' + minute : minute;\r
+                       return hour + ':' + minute;\r
+               }\r
+               \r
+               function statisticsYValue(value, series) {\r
+                       var options = series[value - 1];\r
+                       console.log("statisticsYValue", series.name, value, series);\r
+                       return options == null ? "" : options.userOptions.name;\r
+               }\r
+       </script>\r
+       <vlayout vflex="1" hflex="1" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsModel')">\r
+               <hbox height="40px" align="center">\r
+                       <space bar="false" />\r
+                       <datebox value="@bind(vm.selectedDate)" width="150px" format="yyyy.MM.dd" lenient="false" compact="false" buttonVisible="true"\r
+                               constraint="no empty, no future: now or never" />\r
+                       <radiogroup selectedIndex="@bind(vm.selectedType)">\r
+                               <radio label="Híranyagok" />\r
+                               <radio label="Műsorok" />\r
+                       </radiogroup>\r
+               </hbox>\r
+               <div vflex="1" hflex="1" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth() - 20))'>\r
+                       <charts id="chart" type="spline" zoomType="x" />\r
+               </div>\r
+       </vlayout>\r
+</zk>\r
diff --git a/server/user.jobengine.osgi.server/pages/statistics2.zul b/server/user.jobengine.osgi.server/pages/statistics2.zul
deleted file mode 100644 (file)
index 3220569..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-2"?>\r
-<window apply="user.jobengine.zk.model.StatisticsChartComposer">\r
-\r
-       <div width="100%" height="5%">\r
-               <label value="Dátum:"/>\r
-               <datebox id="chartDateFrom" width="150px" format="yyyy.MM.dd" disabled="false" />\r
-               <space bar="false"/>\r
-               <button id="btnShowChart" label="Megjelenít" />\r
-       </div>\r
-               \r
-       <div width="100%" height="95%">\r
-               <charts id="chart" type="arearange" height="1000" title="Octopus lista"/>\r
-       </div>\r
-       \r
-</window>\r
-\r
-\r
-\r
-\r
diff --git a/server/user.jobengine.osgi.server/pages/statisticsdetails.zul b/server/user.jobengine.osgi.server/pages/statisticsdetails.zul
new file mode 100644 (file)
index 0000000..6e224cc
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<window id="wnd" title="Anyag életút" width="900px" sizable="true" border="normal" apply="org.zkoss.bind.BindComposer"\r
+       viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsDetailsModel')" forward="onCancel=closeButton.onClick">\r
+       <hlayout height="450px">\r
+               <grid sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true" style="border: none; background: #e3e3e3 !important;">\r
+                       <columns sizable="true">\r
+                               <column forEach="${vm.columnList}" label="${each}"></column>\r
+                       </columns>\r
+                       <rows>\r
+                               <template name="model" var="r">\r
+                                       <row>\r
+                                               <label forEach="${vm.columnList}" value="${r.get(each)}">\r
+                                                       <attribute name="style" if="${vm.isSelected(r)}">\r
+                                                               color: green;\r
+                                                       </attribute>                                            \r
+                                               </label>\r
+                                       </row>\r
+                               </template>\r
+                       </rows>\r
+               </grid>\r
+       </hlayout>\r
+       <hbox width="100%" height="40px" pack="center" align="center">\r
+               <button id="closeButton" label="Bezár" onClick="@command('close')" />\r
+       </hbox>\r
+</window>\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MetadataTypeDetector.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MetadataTypeDetector.java
new file mode 100644 (file)
index 0000000..5164257
--- /dev/null
@@ -0,0 +1,29 @@
+package user.jobengine.zk.model;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+\r
+public class MetadataTypeDetector {\r
+       public enum MetadataType {\r
+               TRAFFIC, OCTOPUS, GENERIC\r
+       }\r
+\r
+       private static final String REGEXP_TRAFFIC = "^[MRP]{1}[0-9]{6}[A-Z]{1}$";\r
+       private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+$";\r
+       private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+$";\r
+       private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}$";\r
+\r
+       public static MetadataType GuessMetadataType(String id) {\r
+               if (StringUtils.isBlank(id))\r
+                       return MetadataType.GENERIC;\r
+               if (id.matches(REGEXP_TRAFFIC))\r
+                       return MetadataType.TRAFFIC;\r
+               if (id.matches(REGEXP_OCTOPUSSTORYID))\r
+                       return MetadataType.OCTOPUS;\r
+               if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
+                       return MetadataType.OCTOPUS;\r
+               if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
+                       return MetadataType.OCTOPUS;\r
+               return MetadataType.GENERIC;\r
+       }\r
+\r
+}\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsHistoryCharts.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsHistoryCharts.java
new file mode 100644 (file)
index 0000000..84d0acd
--- /dev/null
@@ -0,0 +1,89 @@
+package user.jobengine.zk.model;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.zkoss.chart.Charts;\r
+import org.zkoss.chart.Point;\r
+import org.zkoss.chart.Series;\r
+import org.zkoss.chart.YAxis;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.nosql.NoSQLUtils;\r
+\r
+public class NewsHistoryCharts {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private static void fill(Charts charts, BasicDBObject datas, String member) {\r
+               Point maxPoint = null;\r
+               BasicDBObject rawData = (BasicDBObject) datas.get("rawData");\r
+               for (String name : rawData.keySet()) {\r
+                       BasicDBObject dbo = NoSQLUtils.asDBObject(rawData, name);\r
+                       Number y = dbo.getLong(member);\r
+                       Point point = new Point(name, y);\r
+                       charts.getSeries().addPoint(point);\r
+                       if (maxPoint == null || y.longValue() > maxPoint.getY().longValue())\r
+                               maxPoint = point;\r
+               }\r
+\r
+               if (maxPoint != null) {\r
+                       maxPoint.setSliced(true);\r
+                       maxPoint.setSelected(true);\r
+               }\r
+       }\r
+\r
+       private static void init(Charts charts) {\r
+               charts.getChart().setPlotBorderWidth(0);\r
+               charts.getChart().setPlotShadow(false);\r
+               charts.getPlotOptions().getSeries().setAnimation(false);\r
+               charts.getPlotOptions().getSeries().setAllowPointSelect(false);\r
+               charts.getPlotOptions().getSeries().setEnableMouseTracking(false);\r
+               charts.getPlotOptions().getSeries().setShowInLegend(true);\r
+       }\r
+\r
+       public static void initMultiAxis(Charts charts, BasicDBObject planStat) {\r
+               init(charts);\r
+               charts.getXAxis().setCategories("Összes", "Betöltve", "Adásban", "Kihagyva", "Archivált");\r
+               YAxis yAxis1 = charts.getYAxis();\r
+               yAxis1.getLabels().setFormat("{value} db");\r
+               yAxis1.getLabels().setStyle("color: " + charts.getColors().get(1).stringValue());\r
+               yAxis1.setTitle("Darab");\r
+               yAxis1.getTitle().setStyle("color: " + charts.getColors().get(1).stringValue());\r
+\r
+               // Secondary y axis\r
+               YAxis yAxis2 = charts.getYAxis(1);\r
+               yAxis2.setTitle("Hossz");\r
+               yAxis2.getTitle().setStyle("color: " + charts.getColors().get(0).stringValue());\r
+               yAxis2.getLabels().setFormat("{value} kocka");\r
+               yAxis2.getLabels().setStyle("color: " + charts.getColors().get(0).stringValue());\r
+               yAxis2.setOpposite(true);\r
+\r
+               Series s1 = charts.getSeries(0);\r
+               s1.setName("Darab");\r
+               s1.setType("column");\r
+               s1.setYAxis(1);\r
+               s1.setData(new Double[] { 49.9, 71.5, 106.4, 129.2, 144.0 });\r
+               charts.getPlotOptions().getColumn().getTooltip().setValueSuffix(" db");\r
+\r
+               Series s2 = charts.getSeries(1);\r
+               s2.setName("Hossz");\r
+               s2.setType("column");\r
+               s2.setData(new Double[] { 7.0, 6.9, 9.5, 14.5, 18.2 });\r
+               charts.getPlotOptions().getSpline().getTooltip().setValueSuffix(" képkocka");\r
+       }\r
+\r
+       static public void initTypeCount(Charts charts, BasicDBObject datas) {\r
+               init(charts);\r
+               charts.setTitle("Adásbejátszók száma típus szerint");\r
+               charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} db");\r
+               fill(charts, datas, "count");\r
+       }\r
+\r
+       static public void initTypeDuration(Charts charts, BasicDBObject datas) {\r
+               init(charts);\r
+               charts.setTitle("Adásbejátszók hossza típus szerint");\r
+               charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} képkocka");\r
+               fill(charts, datas, "duration");\r
+       }\r
+\r
+}\r
index 3b4a71690c38703da89f8b866ff3f5dfc04c476b..bc5abd2fc47e2c17b9a682bf42db40eb14d9a43e 100644 (file)
@@ -1,9 +1,10 @@
 package user.jobengine.zk.model;\r
 \r
+import java.io.UnsupportedEncodingException;\r
 import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.Calendar;\r
+import java.util.Collections;\r
 import java.util.Date;\r
 import java.util.List;\r
 \r
@@ -23,8 +24,8 @@ import org.zkoss.zhtml.Filedownload;
 import org.zkoss.zk.ui.Component;\r
 import org.zkoss.zk.ui.select.Selectors;\r
 import org.zkoss.zk.ui.select.annotation.Wire;\r
+import org.zkoss.zul.Messagebox;\r
 \r
-import com.ibm.nosql.json.api.BasicDBList;\r
 import com.ibm.nosql.json.api.BasicDBObject;\r
 import com.ibm.nosql.json.api.DB;\r
 import com.ibm.nosql.json.api.DBCollection;\r
@@ -50,42 +51,53 @@ public class NewsHistoryModel {
        Charts typeChartSumDuration;\r
        @Wire\r
        Charts planChart;\r
-       private BasicDBList currentRawData;\r
 \r
        @AfterCompose\r
        public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
                Selectors.wireComponents(view, this, false);\r
-\r
                setSelectedDate(new Date());\r
        }\r
 \r
        private void clearChart(Charts charts) {\r
-               int size = charts.getSeriesSize();\r
-               for (int i = 0; i < size; i++)\r
-                       charts.getSeries(i).setData(new ArrayList<Integer>());\r
-\r
-               Options options = charts.getOptions();\r
-               if (options == null)\r
-                       options = new Options();\r
+               int seriesSize = charts.getSeriesSize();\r
+               for (int i = 0; i < seriesSize; i++) {\r
+                       charts.getSeries(0).remove();\r
+               }\r
 \r
-               Lang lang = options.getLang();\r
-               if (lang == null)\r
-                       lang = new Lang();\r
+               int axisSize = charts.getyAxisSize();\r
+               for (int i = 0; i < axisSize; i++) {\r
+                       charts.getYAxis(i).remove();\r
+               }\r
 \r
-               options.setLang(lang);\r
-               charts.setOptions(options);\r
                charts.setTitle("");\r
                charts.setSubtitle("");\r
-               lang.setNoData("Nincs adat!");\r
-               charts.getTooltip().setEnabled(false);\r
-               charts.getExporting().setEnabled(false);\r
        }\r
 \r
        @Command\r
        public void downloadRawData() {\r
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");\r
-               byte[] content = currentRawData.toJSON().getBytes();\r
-               Filedownload.save(content, "text/csv", String.format("%s-news-stat.csv", dateFormat.format(selectedDate)));\r
+               StringBuilder data = new StringBuilder();\r
+\r
+               boolean headeradded = false;\r
+               for (BasicDBObject o : dataList) {\r
+                       if (!headeradded) {\r
+                               for (String key : o.keySet())\r
+                                       data.append(key).append(";");\r
+                               data.append("\r\n");\r
+                               headeradded = true;\r
+                       }\r
+                       for (String key : o.keySet())\r
+                               data.append(o.getString(key)).append(";");\r
+                       data.append("\r\n");\r
+               }\r
+\r
+               byte[] content;\r
+               try {\r
+                       content = data.toString().getBytes("ISO-8859-2");\r
+                       Filedownload.save(content, "text/csv", String.format("%s-news-stat.csv", dateFormat.format(selectedDate)));\r
+               } catch (UnsupportedEncodingException e) {\r
+                       Messagebox.show("Sikertelen tranfszormáció. A rendszer üzenete: " + e.getMessage());\r
+               }\r
        }\r
 \r
        public List<String> getColumnList() {\r
@@ -106,6 +118,22 @@ public class NewsHistoryModel {
                collection = db.getCollection("daily_news_history");\r
        }\r
 \r
+       private void initChart(Charts charts) {\r
+               Options options = charts.getOptions();\r
+               if (options == null)\r
+                       options = new Options();\r
+               charts.setOptions(options);\r
+\r
+               Lang lang = options.getLang();\r
+               if (lang == null)\r
+                       lang = new Lang();\r
+\r
+               options.setLang(lang);\r
+               lang.setNoData("Nincs adat!");\r
+               charts.getTooltip().setEnabled(false);\r
+               charts.getExporting().setEnabled(false);\r
+       }\r
+\r
        public boolean isDownloadDisabled() {\r
                return downloadDisabled;\r
        }\r
@@ -117,6 +145,11 @@ public class NewsHistoryModel {
 \r
                clearChart(typeChartCount);\r
                clearChart(typeChartSumDuration);\r
+               clearChart(planChart);\r
+\r
+               initChart(typeChartCount);\r
+               initChart(typeChartSumDuration);\r
+               initChart(planChart);\r
 \r
                Calendar scheduledDate = CalendarUtils.createZeroCalendar(selectedDate);\r
                BasicDBObject dateFilter = new BasicDBObject("dateTime", scheduledDate.getTime());\r
@@ -124,19 +157,24 @@ public class NewsHistoryModel {
                if (dailyData == null) {\r
                        return;\r
                }\r
-               currentRawData = NoSQLUtils.asDBList(dailyData, "rawData");\r
 \r
-               setDataList(NoSQLUtils.asList(dailyData, "rawData"));\r
+               dataList = NoSQLUtils.asList(dailyData, "rawData");\r
                if (dataList == null || dataList.size() == 0) {\r
                        return;\r
                }\r
 \r
+               Collections.sort(dataList, (o1, o2) -> {\r
+                       return o1.getString(IOctopusAPI.NAME).compareTo(o2.getString(IOctopusAPI.NAME));\r
+               });\r
+\r
                BindUtils.postNotifyChange(null, null, this, "dataList");\r
 \r
                BasicDBObject typeStat = NoSQLUtils.asDBObject(dailyData, "typeStat");\r
+               NewsHistoryCharts.initTypeCount(typeChartCount, typeStat);\r
+               NewsHistoryCharts.initTypeDuration(typeChartSumDuration, typeStat);\r
 \r
-               NewsMaterialTypeChart.initTypeCount(typeChartCount, typeStat);\r
-               NewsMaterialTypeChart.initDurationDuration(typeChartSumDuration, typeStat);\r
+               BasicDBObject planStat = NoSQLUtils.asDBObject(dailyData, "planStat");\r
+               NewsHistoryCharts.initMultiAxis(planChart, planStat);\r
                setDownloadDisabled(false);\r
        }\r
 \r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsMaterialTypeChart.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsMaterialTypeChart.java
deleted file mode 100644 (file)
index 2095950..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-package user.jobengine.zk.model;\r
-\r
-import org.apache.logging.log4j.LogManager;\r
-import org.apache.logging.log4j.Logger;\r
-import org.zkoss.chart.Charts;\r
-import org.zkoss.chart.Point;\r
-\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-import user.commons.nosql.NoSQLUtils;\r
-\r
-public class NewsMaterialTypeChart {\r
-       private static final Logger logger = LogManager.getLogger();\r
-\r
-       private static void fill(Charts charts, BasicDBObject datas, String member) {\r
-               Point maxPoint = null;\r
-               BasicDBObject rawData = (BasicDBObject) datas.get("rawData");\r
-               for (String name : rawData.keySet()) {\r
-                       BasicDBObject dbo = NoSQLUtils.asDBObject(rawData, name);\r
-                       Number y = dbo.getLong(member);\r
-                       Point point = new Point(name, y);\r
-                       charts.getSeries().addPoint(point);\r
-                       if (maxPoint == null || y.longValue() > maxPoint.getY().longValue())\r
-                               maxPoint = point;\r
-               }\r
-\r
-               if (maxPoint != null) {\r
-                       maxPoint.setSliced(true);\r
-                       maxPoint.setSelected(true);\r
-               }\r
-       }\r
-\r
-       private static void init(Charts charts) {\r
-               charts.getChart().setPlotBorderWidth(0);\r
-               charts.getChart().setPlotShadow(false);\r
-               charts.getPlotOptions().getPie().setAllowPointSelect(false);\r
-               charts.getPlotOptions().getPie().setEnableMouseTracking(false);\r
-               charts.getPlotOptions().getPie().setShowInLegend(true);\r
-               charts.getPlotOptions().getPie().setAnimation(false);\r
-       }\r
-\r
-       static public void initTypeCount(Charts charts, BasicDBObject datas) {\r
-               init(charts);\r
-               charts.setTitle("Adásbejátszók száma típus szerint");\r
-               charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} db");\r
-               fill(charts, datas, "count");\r
-       }\r
-\r
-       static public void initDurationDuration(Charts charts, BasicDBObject datas) {\r
-               init(charts);\r
-               charts.setTitle("Adásbejátszók hossza típus szerint");\r
-               charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} képkocka");\r
-               fill(charts, datas, "duration");\r
-       }\r
-\r
-}\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsChartComposer.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsChartComposer.java
deleted file mode 100644 (file)
index a3cd7d3..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-package user.jobengine.zk.model;\r
-\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.Calendar;\r
-import java.util.Date;\r
-import java.util.Hashtable;\r
-import java.util.List;\r
-import java.util.Random;\r
-import java.util.TimeZone;\r
-\r
-import org.zkoss.chart.Charts;\r
-import org.zkoss.chart.PlotBand;\r
-import org.zkoss.chart.Series;\r
-import org.zkoss.chart.YAxis;\r
-import org.zkoss.chart.model.DefaultXYZModel;\r
-import org.zkoss.chart.model.XYZModel;\r
-import org.zkoss.zk.ui.select.SelectorComposer;\r
-import org.zkoss.zk.ui.select.annotation.Listen;\r
-import org.zkoss.zk.ui.select.annotation.Wire;\r
-import org.zkoss.zul.Datebox;\r
-import org.zkoss.zul.Window;\r
-\r
-public class StatisticsChartComposer extends SelectorComposer<Window> {\r
-\r
-       private SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm");\r
-\r
-       @Wire\r
-    private Datebox chartDateFrom;\r
-       \r
-    @Wire\r
-    private Charts chart;\r
-    //private CategoryModel model;\r
-    \r
-    private Date chartDate = new Date();\r
-    \r
-    //KONSTRUKTOR\r
-    public void doAfterCompose(Window comp) throws Exception {\r
-        super.doAfterCompose(comp);\r
-        initModel(chartDate);\r
-    }    \r
-    \r
-\r
-       @Listen("onChange = #chartDateFrom")\r
-    public void changeDate(){\r
-               chartDate = chartDateFrom.getValue();\r
-       }                \r
-\r
-       @Listen("onClick = #btnShowChart")\r
-    public void generateChart(){\r
-       if(chartDateFrom.getValue() != null){\r
-               initModel(chartDate);\r
-       }\r
-       }\r
-               \r
-       \r
-    \r
-    private void initModel(Date chartDate){\r
-\r
-        chart.setReflow(true);\r
-        chart.getChart().setReflow(true);\r
-        chart.getLegend().setEnabled(false);   //also series folsorolas\r
-       //chart.setSubtitle((Subtitle)null);\r
-       \r
-       XYZModel model = generateModel(chartDate);\r
-\r
-       //GENERATE FAKE System names, colors, titles (tobb series is ugyanaz a system, csak igy tudja felrajzolni a chartot normalisan) \r
-       String[] sysNames = new String[10];\r
-       Hashtable<String, String> colorMap = new Hashtable<String, String>();\r
-       Hashtable<String, String> titleMap = new Hashtable<String, String>();\r
-       for(int s=0; s<10; s++){\r
-               sysNames[s] = "sys" + s;\r
-               colorMap.put(sysNames[s], getRNDColor());\r
-       }\r
-       colorMap.put("syswhite", "#FFFFFF");\r
-       \r
-       \r
-       //CONFIG SERIES\r
-       //model series csak stringet ad vissza.\r
-       Object[] seriesNames = model.getSeries().toArray();\r
-       for(int s=0; s<seriesNames.length; s++){\r
-               \r
-                       String[] sysNameParts = seriesNames[s].toString().split("_");\r
-                       Series ret = chart.getSeries(s);\r
-                       ret.setColor(colorMap.get(sysNameParts[0]));    //"#FF00FF"     series szinet beallitani system name alapjan\r
-                       ret.getMarker().setEnabled(false);\r
-                       ret.setYAxis(0);\r
-                       \r
-                       if(!sysNameParts[0].equals("syswhite")){\r
-                               ret.getPlotOptions().getTooltip().setHeaderFormat("<b>{point.x:%Y.%m.%d %H:%M:%S}</b><br/>");\r
-                               ret.getPlotOptions().getTooltip().setPointFormat(sysNameParts[0] + " on " + sysNameParts[1] + " object.");\r
-                               //ret.getPlotOptions().getTooltip().setValueSuffix(""); //valueSuffix es value resz eltuntetese Y coord                 \r
-                               //ret.getPlotOptions().getTooltip().setFooterFormat("<br><b>footerFormat</b>");\r
-                               //System.out.println("format: " + ret.getPlotOptions().getTooltip().getFormat());\r
-                               //ret.setName("title");\r
-                       }else{\r
-                               ret.getPlotOptions().getTooltip().setHeaderFormat("");\r
-                               ret.getPlotOptions().getTooltip().setPointFormat("");\r
-                       }\r
-       }\r
-       \r
-       //config Y axis\r
-       YAxis yaxis = chart.getYAxis();\r
-       yaxis.getLabels().setEnabled(false);\r
-       yaxis.setTitle(" ");\r
-//        yaxis.getLabels().setFormat("{value}°C");                                    //"{value}°C"\r
-//        yaxis.getLabels().setStyle("color: '#0000FF'");                              //"color: '#89A54E'"\r
-//        yaxis.getTitle().setStyle("color: '#FF0000'");                               //"color: '#89A54E'"\r
-//        yaxis.setOpposite(true);\r
-       yaxis.setMinPadding(0);\r
-       yaxis.setMaxPadding(0);\r
-        yaxis.setMin(1);\r
-        yaxis.setMax(50);\r
-        yaxis.setGridLineWidth(0);\r
-        \r
-        yaxis.setMinorGridLineWidth(0);\r
-        yaxis.setAlternateGridColor((String) null);\r
-\r
-/*\r
-        XAxis xAxis = chart.getXAxis();\r
-        xAxis.setTickInterval(new Long(3000000000000L));       //ez azert van, hogy alul egyetlen datum se jelenjen meg.\r
-        xAxis.setTickWidth(0);\r
-        xAxis.setGridLineWidth(1);\r
-        xAxis.setEndOnTick(false);\r
-        xAxis.setStartOnTick(false);\r
-//        xAxis.setCategories(timeList);\r
-//        xAxis.setType("datetime");\r
-//        chart.getTooltip().setHeaderFormat("<b>{point.x:%Y.%m.%d %H:%M:%S}</b><br/>");\r
-*/\r
-        \r
-        chart.setModel(model);\r
-    }  \r
-\r
-    \r
-    \r
-    \r
-    private XYZModel generateModel(Date pDate){\r
-       XYZModel model = new DefaultXYZModel();\r
-\r
-        //set values\r
-       double rowHeight = 1.5;\r
-       double rowGap = 0.5;\r
-       double rowY = 0;\r
-       \r
-       YAxis yaxis = chart.getYAxis();\r
-\r
-       List<OctopusObject> objectList = generateFakeList(pDate);\r
-       for(OctopusObject oo : objectList){\r
-               \r
-               PlotBand plotBand = new PlotBand(rowY, rowY+rowHeight, "rgba(0, 0, 0, 0.0)");\r
-            plotBand.getLabel().setText("Object: " + oo.id);\r
-            //plotBand1.getLabel().setStyle("color: '#000000'; font-size: 12px; font-weight: bold;");\r
-            plotBand.getLabel().setStyle("color: rgba(0, 0, 0, 1.0); font-size: 12px; font-weight: bold;");\r
-            yaxis.addPlotBand(plotBand);\r
-               \r
-               for(OctopusEvent oe : oo.eventList){\r
-                       //system, sx, sy, ey\r
-                       //oe.systemName + oo.id\r
-//                             model.addValue(oe.systemName, (Number)oe.startTime.getTime(), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-//                             model.addValue(oe.systemName, (Number)oe.endTime.getTime(), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-\r
-                       //ugyelni kell ra, hogy a zk az azonos nevu sorozatokat osszekoti egymassal.\r
-                       long s = oe.startTime.getTime();\r
-                       for(long i=0; i<10; i++){\r
-                               model.addValue(oe.systemName, (Number)s, (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-                               model.addValue(oe.systemName, (Number)(s+50000), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-                               s+=50000;\r
-                               model.addValue("syswhite_" + oo.id + "_" + s, (Number)s, (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-                               model.addValue("syswhite_" + oo.id + "_" + s, (Number)(s+30000), (Number)new Double(rowY), (Number)new Double(rowY+rowHeight));\r
-                               s+=30000;\r
-                       }\r
-                       \r
-               }\r
-               rowY+=(rowHeight + rowGap);\r
-       }\r
-       \r
-       \r
-       return model;\r
-    } \r
-    \r
-    \r
-    private List<OctopusObject> generateFakeList(Date paramDate){\r
-       List<OctopusObject> ret = new ArrayList<OctopusObject>();\r
-       Random r = new Random();\r
-       \r
-       Calendar calendar =  Calendar.getInstance();\r
-       calendar.setTimeZone(TimeZone.getDefault());\r
-       \r
-       //create objects\r
-       for(int o=0;o<10;o++){\r
-               \r
-            calendar.setTime(paramDate);\r
-               calendar.set(Calendar.MILLISECOND, 0);\r
-               calendar.set(Calendar.MINUTE, 0);\r
-               calendar.set(Calendar.SECOND , 0);\r
-               calendar.set(Calendar.HOUR_OF_DAY, 0);\r
-\r
-//time patch                   \r
-calendar.add(Calendar.HOUR_OF_DAY, 1);\r
-//nyari idoszamitaskor ket orát kell hozzaadnom\r
-if(calendar.get(Calendar.DST_OFFSET) > 0){\r
-       calendar.add(Calendar.HOUR_OF_DAY, 1);\r
-}\r
-               \r
-               OctopusObject oo = new OctopusObject();\r
-               oo.id = o;\r
-               //create events\r
-               for(int e=0; e<6; e++){\r
-                       int rndMins = 15 + r.nextInt(60);\r
-                       OctopusEvent oe = new OctopusEvent();\r
-\r
-                       oe.systemName = "sys" + e + "_" + oo.id;                                                                //kulon nev minden object sorhoz\r
-                       oe.startTime = new Date(calendar.getTimeInMillis());\r
-                       //System.out.print("start time: " + sdf.format(new Date(calendar.getTimeInMillis())));                          \r
-                       calendar.add(Calendar.MINUTE, rndMins);\r
-                       oe.endTime = new Date(calendar.getTimeInMillis());\r
-                       //System.out.println(" end time: " + sdf.format(new Date(calendar.getTimeInMillis())));                         \r
-\r
-                       oo.eventList.add(oe);\r
-               }\r
-               ret.add(oo);\r
-       }\r
-       return ret;\r
-    }\r
-    \r
-    \r
-    class OctopusObject{\r
-       public int id = 0;\r
-       public List<OctopusEvent> eventList = new ArrayList<OctopusEvent>();\r
-    }\r
-    \r
-    class OctopusEvent{\r
-       public String systemName = null;\r
-       public Date startTime = null;\r
-       public Date endTime = null;\r
-       \r
-    }\r
\r
-       static private String getRNDColor(){\r
-               Random rand = new Random();\r
-               String ret = "";\r
-               for(int c=0; c<3; c++){\r
-                       int myRandomNumber = rand.nextInt(0xFF);\r
-                       String part = Integer.toHexString(myRandomNumber);\r
-                       if(part.length() == 1) part = "0" + part;\r
-                       ret += part;\r
-               }\r
-               ret = "#"+ret;\r
-               return ret.toUpperCase();\r
-       }\r
-\r
-       //rgba(0, 0, 0, 0.0)\r
-/*     \r
-       static private String getRGBARNDColor(){\r
-               Random rand = new Random();\r
-               String ret = "";\r
-               for(int c=0; c<3; c++){\r
-                       int myRandomNumber = rand.nextInt(0xFF);\r
-                       String part = Integer.toHexString(myRandomNumber);\r
-                       if(part.length() == 1) part = "0" + part;\r
-                       ret += (part + ",");\r
-               }\r
-               ret = "rgba(" + ret + "0.5)";\r
-               return ret.toUpperCase();\r
-       }\r
-*/     \r
-       \r
-}
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsDetailsModel.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsDetailsModel.java
new file mode 100644 (file)
index 0000000..95bbcd3
--- /dev/null
@@ -0,0 +1,81 @@
+package user.jobengine.zk.model;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.Command;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
+import org.zkoss.bind.annotation.Init;\r
+import org.zkoss.chart.Point;\r
+import org.zkoss.chart.Series;\r
+import org.zkoss.zk.ui.Component;\r
+import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.select.Selectors;\r
+import org.zkoss.zk.ui.select.annotation.Wire;\r
+import org.zkoss.zul.Window;\r
+\r
+import com.ibm.nosql.json.JSONUtil;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class StatisticsDetailsModel extends BaseModel {\r
+       @Wire("#wnd")\r
+       private Window wnd;\r
+       private List<BasicDBObject> events;\r
+       private List<String> columnList = Arrays.asList("Touched", "Started", "Finished", "Tag", "Successful", "UserName", "Source", "Destination");\r
+       private BasicDBObject selectedEvent;\r
+\r
+       @AfterCompose\r
+       public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+               Selectors.wireComponents(view, this, false);\r
+               Series series = (Series) Executions.getCurrent().getArg().get("series");\r
+               wnd.setTitle(series.getName());\r
+               Point selectedPoint = (Point) Executions.getCurrent().getArg().get("point");\r
+               selectedEvent = (BasicDBObject) JSONUtil.jsonToDbObject(selectedPoint.getName());\r
+               events = new ArrayList<>();\r
+               for (Point point : series.getData()) {\r
+                       BasicDBObject obj = (BasicDBObject) JSONUtil.jsonToDbObject(point.getName());\r
+                       events.add(obj);\r
+               }\r
+       }\r
+\r
+       @Command\r
+       public void close() {\r
+               wnd.detach();\r
+       }\r
+\r
+       public List<String> getColumnList() {\r
+               return columnList;\r
+       }\r
+\r
+       public List<BasicDBObject> getEvents() {\r
+               return events;\r
+       }\r
+\r
+       public BasicDBObject getSelectedEvent() {\r
+               return selectedEvent;\r
+       }\r
+\r
+       @Init\r
+       public void init() {\r
+       }\r
+\r
+       public boolean isSelected(BasicDBObject event) {\r
+               return event.equals(selectedEvent);\r
+       }\r
+\r
+       public void setColumnList(List<String> columnList) {\r
+               this.columnList = columnList;\r
+       }\r
+\r
+       public void setEvents(List<BasicDBObject> events) {\r
+               this.events = events;\r
+       }\r
+\r
+       public void setSelectedEvent(BasicDBObject selectedEvent) {\r
+               this.selectedEvent = selectedEvent;\r
+       }\r
+\r
+}
\ No newline at end of file
similarity index 76%
rename from server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsComposer.java
rename to server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsModel.java
index 36a27119a189800a1b12f89a02f38b6c06cf2035..aa21702b14848dcdaa6f0fa0b44b6dd71ff26868 100644 (file)
@@ -10,6 +10,9 @@ import java.util.Map;
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
 import org.zkoss.chart.AxisLabels;\r
 import org.zkoss.chart.Charts;\r
 import org.zkoss.chart.ChartsEvent;\r
@@ -24,21 +27,23 @@ import org.zkoss.chart.YAxis;
 import org.zkoss.chart.plotOptions.PlotOptions;\r
 import org.zkoss.chart.plotOptions.SplinePlotOptions;\r
 import org.zkoss.json.JavaScriptValue;\r
-import org.zkoss.zk.ui.select.SelectorComposer;\r
+import org.zkoss.zk.ui.Component;\r
+import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.select.Selectors;\r
 import org.zkoss.zk.ui.select.annotation.Listen;\r
 import org.zkoss.zk.ui.select.annotation.Wire;\r
-import org.zkoss.zul.Datebox;\r
 import org.zkoss.zul.Window;\r
 \r
 import com.ibm.nosql.json.api.BasicDBObject;\r
 \r
 import user.commons.CalendarUtils;\r
+import user.commons.ListUtils;\r
 import user.jobengine.db.IItemManager;\r
 import user.jobengine.db.WorkflowAction;\r
 import user.jobengine.server.JobEngine;\r
+import user.jobengine.zk.model.MetadataTypeDetector.MetadataType;\r
 \r
-@SuppressWarnings("serial")\r
-public class StatisticsComposer extends SelectorComposer<Window> {\r
+public class StatisticsModel {\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final int XCOUNT = 60 * 24;\r
        private static Map<String, Color> colors = new HashMap<>();\r
@@ -51,14 +56,13 @@ public class StatisticsComposer extends SelectorComposer<Window> {
        }\r
 \r
        private IItemManager itemManager = null;\r
-\r
-       @Wire\r
-       private Datebox chartDateSelector;\r
+       private Date selectedDate;\r
+       private int selectedType;\r
 \r
        @Wire\r
        Charts chart;\r
 \r
-       public StatisticsComposer() {\r
+       public StatisticsModel() {\r
                this.itemManager = JobEngine.getStaticItemManager();\r
        }\r
 \r
@@ -90,9 +94,11 @@ public class StatisticsComposer extends SelectorComposer<Window> {
                addPoint(series, x, y, data.toString(), color);\r
        }\r
 \r
-       @Listen("onChange = #chartDateSelector")\r
-       public void changeDate() {\r
-               //ha elhgynánk a gombot\r
+       @AfterCompose\r
+       public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+               Selectors.wireComponents(view, this, false);\r
+               Selectors.wireEventListeners(view, this);\r
+               setSelectedDate(new Date());\r
        }\r
 \r
        private void clearChart() {\r
@@ -119,9 +125,8 @@ public class StatisticsComposer extends SelectorComposer<Window> {
                chart.getExporting().setEnabled(false);\r
 \r
                chart.setTitle("Anyagok élettörténete");\r
-               chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(chartDateSelector.getValue()), new Locale("hu")));\r
+               chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
                chart.getLegend().setEnabled(false);\r
-               //chart.setWidth(1024);\r
                PlotOptions plotOptions = chart.getPlotOptions();\r
                plotOptions.getSeries().setAllowPointSelect(true);\r
                SplinePlotOptions soptions = plotOptions.getSpline();\r
@@ -131,26 +136,9 @@ public class StatisticsComposer extends SelectorComposer<Window> {
                soptions.setCursor("pointer");\r
 \r
                Marker marker = soptions.getMarker();\r
-               marker.setRadius(4);\r
+               marker.setRadius(3);\r
                marker.setLineWidth(1);\r
                marker.setSymbol("square");\r
-               marker.setFillColor(new Color("black"));\r
-\r
-               //              Tooltip tooltip = chart.getTooltip();\r
-               //              tooltip.setHeaderFormat("");\r
-               //              tooltip.setFormat("");\r
-               //              tooltip.setPointFormat("");\r
-               //              tooltip.setUseHTML(true);\r
-               //              tooltip.setBorderWidth(0);\r
-               //              tooltip.addExtraAttr("formatter", new JavaScriptValue("function () { return statistics(this.point); }"));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void doAfterCompose(Window comp) throws Exception {\r
-               super.doAfterCompose(comp);\r
-               chartDateSelector.setValue(new Date());\r
-               showChart();\r
        }\r
 \r
        private int fillData(List<WorkflowAction> actions) {\r
@@ -159,8 +147,15 @@ public class StatisticsComposer extends SelectorComposer<Window> {
                Series series = null;\r
                for (WorkflowAction action : actions) {\r
                        String houseId = action.getHouseId();\r
+\r
                        if (houseId == null)\r
                                continue;\r
+                       if (selectedType == 0 && !MetadataType.OCTOPUS.equals(MetadataTypeDetector.GuessMetadataType(houseId)))\r
+                               continue;\r
+\r
+                       if (selectedType == 1 && !MetadataType.TRAFFIC.equals(MetadataTypeDetector.GuessMetadataType(houseId)))\r
+                               continue;\r
+\r
                        if (houseId.equals(lastHouseId)) {\r
                                addPoint(series, action, result);\r
                                continue;\r
@@ -174,6 +169,34 @@ public class StatisticsComposer extends SelectorComposer<Window> {
                return result;\r
        }\r
 \r
+       public Date getSelectedDate() {\r
+               return selectedDate;\r
+       }\r
+\r
+       public int getSelectedType() {\r
+               return selectedType;\r
+       }\r
+\r
+       @Listen("onPlotSelect = #chart")\r
+       public void onPlotSelect(ChartsEvent event) {\r
+               Point point = event.getPoint();\r
+               point.setSelected(false);\r
+               Series series = event.getSeries();\r
+               String template = "/pages/statisticsdetails.zul";\r
+               Window window = (Window) Executions.createComponents(template, null, ListUtils.asMap("point", point, "series", series));\r
+               window.doModal();\r
+       }\r
+\r
+       public void setSelectedDate(Date selectedDate) {\r
+               this.selectedDate = selectedDate;\r
+               showChart();\r
+       }\r
+\r
+       public void setSelectedType(int selectedType) {\r
+               this.selectedType = selectedType;\r
+               showChart();\r
+       }\r
+\r
        private void setupXAxis() {\r
                XAxis xAxis = chart.getXAxis();\r
                xAxis.setTickInterval(30);\r
@@ -202,21 +225,11 @@ public class StatisticsComposer extends SelectorComposer<Window> {
                yAxis.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsYValue(this.value, this.chart.series); }"));\r
        }\r
 \r
-       @Listen("onPlotSelect = #chart")\r
-       public void shiftPoint(ChartsEvent event) {\r
-               // retrieve the point object.\r
-               Point point = event.getPoint();\r
-               // shift the point by updating its x value.\r
-               //point.setX(point.getX().intValue() + random() / 10);\r
-               logger.info(point);\r
-       }\r
-\r
-       @Listen("onClick = #btnShowChart")\r
        public void showChart() {\r
                clearChart();\r
                configureChart();\r
                setupXAxis();\r
-               List<WorkflowAction> actions = itemManager.getWorkflowActions(chartDateSelector.getValue());\r
+               List<WorkflowAction> actions = itemManager.getWorkflowActions(selectedDate);\r
                if (actions == null || actions.size() == 0) {\r
                        setupYAxis(0);\r
                        return;\r