reportbuilder 1.2.5 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/History.txt +6 -0
- data/Manifest.txt +377 -0
- data/data/flot/API.txt +1024 -0
- data/data/flot/FAQ.txt +71 -0
- data/data/flot/LICENSE.txt +22 -0
- data/data/flot/Makefile +15 -0
- data/data/flot/NEWS.txt +340 -0
- data/data/flot/PLUGINS.txt +105 -0
- data/data/flot/README.txt +81 -0
- data/data/flot/examples/ajax.html +143 -0
- data/data/flot/examples/annotating.html +75 -0
- data/data/flot/examples/arrow-down.gif +0 -0
- data/data/flot/examples/arrow-left.gif +0 -0
- data/data/flot/examples/arrow-right.gif +0 -0
- data/data/flot/examples/arrow-up.gif +0 -0
- data/data/flot/examples/basic.html +38 -0
- data/data/flot/examples/data-eu-gdp-growth-1.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-2.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-3.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-4.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth-5.json +4 -0
- data/data/flot/examples/data-eu-gdp-growth.json +4 -0
- data/data/flot/examples/data-japan-gdp-growth.json +4 -0
- data/data/flot/examples/data-usa-gdp-growth.json +4 -0
- data/data/flot/examples/dual-axis.html +39 -0
- data/data/flot/examples/graph-types.html +75 -0
- data/data/flot/examples/hs-2004-27-a-large_web.jpg +0 -0
- data/data/flot/examples/image.html +45 -0
- data/data/flot/examples/index.html +43 -0
- data/data/flot/examples/interacting.html +93 -0
- data/data/flot/examples/layout.css +6 -0
- data/data/flot/examples/navigate.html +118 -0
- data/data/flot/examples/selection.html +114 -0
- data/data/flot/examples/setting-options.html +65 -0
- data/data/flot/examples/stacking.html +77 -0
- data/data/flot/examples/thresholding.html +54 -0
- data/data/flot/examples/time.html +71 -0
- data/data/flot/examples/tracking.html +95 -0
- data/data/flot/examples/turning-series.html +98 -0
- data/data/flot/examples/visitors.html +90 -0
- data/data/flot/examples/zooming.html +98 -0
- data/data/flot/excanvas.js +1427 -0
- data/data/flot/excanvas.min.js +1 -0
- data/data/flot/jquery.colorhelpers.js +174 -0
- data/data/flot/jquery.colorhelpers.min.js +1 -0
- data/data/flot/jquery.flot.crosshair.js +156 -0
- data/data/flot/jquery.flot.crosshair.min.js +1 -0
- data/data/flot/jquery.flot.image.js +237 -0
- data/data/flot/jquery.flot.image.min.js +1 -0
- data/data/flot/jquery.flot.js +2119 -0
- data/data/flot/jquery.flot.min.js +1 -0
- data/data/flot/jquery.flot.navigate.js +272 -0
- data/data/flot/jquery.flot.navigate.min.js +1 -0
- data/data/flot/jquery.flot.selection.js +299 -0
- data/data/flot/jquery.flot.selection.min.js +1 -0
- data/data/flot/jquery.flot.stack.js +152 -0
- data/data/flot/jquery.flot.stack.min.js +1 -0
- data/data/flot/jquery.flot.threshold.js +103 -0
- data/data/flot/jquery.flot.threshold.min.js +1 -0
- data/data/flot/jquery.js +4376 -0
- data/data/flot/jquery.min.js +19 -0
- data/data/jqplot/MIT-LICENSE.txt +21 -0
- data/data/jqplot/README.txt +73 -0
- data/data/jqplot/changes.txt +261 -0
- data/data/jqplot/copyright.txt +33 -0
- data/data/jqplot/docs/files/MIT-LICENSE-txt.html +39 -0
- data/data/jqplot/docs/files/changes-txt.html +39 -0
- data/data/jqplot/docs/files/gpl-2-0-txt.html +39 -0
- data/data/jqplot/docs/files/images/background.jpg +0 -0
- data/data/jqplot/docs/files/images/basicline.png +0 -0
- data/data/jqplot/docs/files/images/basiclogaxis.png +0 -0
- data/data/jqplot/docs/files/images/basiclogoptions.png +0 -0
- data/data/jqplot/docs/files/images/basicoptions.png +0 -0
- data/data/jqplot/docs/files/images/dualaxis.png +0 -0
- data/data/jqplot/docs/files/images/logo.jpg +0 -0
- data/data/jqplot/docs/files/images/navdocs.png +0 -0
- data/data/jqplot/docs/files/images/navdocsover.png +0 -0
- data/data/jqplot/docs/files/images/navdownload.png +0 -0
- data/data/jqplot/docs/files/images/navdownloadover.png +0 -0
- data/data/jqplot/docs/files/images/navexamples.png +0 -0
- data/data/jqplot/docs/files/images/navexamplesover.png +0 -0
- data/data/jqplot/docs/files/images/navhome.png +0 -0
- data/data/jqplot/docs/files/images/navhomeover.png +0 -0
- data/data/jqplot/docs/files/images/new.png +0 -0
- data/data/jqplot/docs/files/images/sample3.png +0 -0
- data/data/jqplot/docs/files/images/samplesm.png +0 -0
- data/data/jqplot/docs/files/jqPlotCssStyling-txt.html +39 -0
- data/data/jqplot/docs/files/jqPlotOptions-txt.html +292 -0
- data/data/jqplot/docs/files/jqplot-axisLabelRenderer-js.html +47 -0
- data/data/jqplot/docs/files/jqplot-axisTickRenderer-js.html +69 -0
- data/data/jqplot/docs/files/jqplot-canvasGridRenderer-js.html +39 -0
- data/data/jqplot/docs/files/jqplot-core-js.html +353 -0
- data/data/jqplot/docs/files/jqplot-divTitleRenderer-js.html +39 -0
- data/data/jqplot/docs/files/jqplot-lineRenderer-js.html +53 -0
- data/data/jqplot/docs/files/jqplot-linearAxisRenderer-js.html +39 -0
- data/data/jqplot/docs/files/jqplot-markerRenderer-js.html +65 -0
- data/data/jqplot/docs/files/jqplot-shadowRenderer-js.html +61 -0
- data/data/jqplot/docs/files/jqplot-shapeRenderer-js.html +63 -0
- data/data/jqplot/docs/files/jqplot-themeEngine-js.html +190 -0
- data/data/jqplot/docs/files/optionsTutorial-txt.html +119 -0
- data/data/jqplot/docs/files/plugins/jqplot-BezierCurveRenderer-js.html +45 -0
- data/data/jqplot/docs/files/plugins/jqplot-barRenderer-js.html +67 -0
- data/data/jqplot/docs/files/plugins/jqplot-blockRenderer-js.html +53 -0
- data/data/jqplot/docs/files/plugins/jqplot-bubbleRenderer-js.html +71 -0
- data/data/jqplot/docs/files/plugins/jqplot-canvasAxisLabelRenderer-js.html +63 -0
- data/data/jqplot/docs/files/plugins/jqplot-canvasAxisTickRenderer-js.html +79 -0
- data/data/jqplot/docs/files/plugins/jqplot-categoryAxisRenderer-js.html +46 -0
- data/data/jqplot/docs/files/plugins/jqplot-cursor-js.html +91 -0
- data/data/jqplot/docs/files/plugins/jqplot-dateAxisRenderer-js.html +93 -0
- data/data/jqplot/docs/files/plugins/jqplot-donutRenderer-js.html +98 -0
- data/data/jqplot/docs/files/plugins/jqplot-dragable-js.html +45 -0
- data/data/jqplot/docs/files/plugins/jqplot-enhancedLegendRenderer-js.html +49 -0
- data/data/jqplot/docs/files/plugins/jqplot-funnelRenderer-js.html +87 -0
- data/data/jqplot/docs/files/plugins/jqplot-highlighter-js.html +80 -0
- data/data/jqplot/docs/files/plugins/jqplot-logAxisRenderer-js.html +45 -0
- data/data/jqplot/docs/files/plugins/jqplot-mekkoAxisRenderer-js.html +49 -0
- data/data/jqplot/docs/files/plugins/jqplot-mekkoRenderer-js.html +62 -0
- data/data/jqplot/docs/files/plugins/jqplot-meterGaugeRenderer-js.html +103 -0
- data/data/jqplot/docs/files/plugins/jqplot-ohlcRenderer-js.html +65 -0
- data/data/jqplot/docs/files/plugins/jqplot-pieRenderer-js.html +93 -0
- data/data/jqplot/docs/files/plugins/jqplot-pointLabels-js.html +72 -0
- data/data/jqplot/docs/files/plugins/jqplot-trendline-js.html +67 -0
- data/data/jqplot/docs/files/usage-txt.html +58 -0
- data/data/jqplot/docs/index.html +1 -0
- data/data/jqplot/docs/index/Classes.html +58 -0
- data/data/jqplot/docs/index/Files.html +34 -0
- data/data/jqplot/docs/index/Functions.html +66 -0
- data/data/jqplot/docs/index/General.html +46 -0
- data/data/jqplot/docs/index/General2.html +46 -0
- data/data/jqplot/docs/index/General3.html +46 -0
- data/data/jqplot/docs/index/General4.html +50 -0
- data/data/jqplot/docs/index/General5.html +34 -0
- data/data/jqplot/docs/index/General6.html +58 -0
- data/data/jqplot/docs/index/Hooks.html +46 -0
- data/data/jqplot/docs/index/Properties.html +50 -0
- data/data/jqplot/docs/index/Properties2.html +50 -0
- data/data/jqplot/docs/index/Properties3.html +50 -0
- data/data/jqplot/docs/index/Properties4.html +34 -0
- data/data/jqplot/docs/index/Properties5.html +58 -0
- data/data/jqplot/docs/javascript/main.js +836 -0
- data/data/jqplot/docs/javascript/searchdata.js +182 -0
- data/data/jqplot/docs/search/ClassesA.html +20 -0
- data/data/jqplot/docs/search/ClassesG.html +20 -0
- data/data/jqplot/docs/search/ClassesJ.html +20 -0
- data/data/jqplot/docs/search/ClassesL.html +20 -0
- data/data/jqplot/docs/search/ClassesS.html +20 -0
- data/data/jqplot/docs/search/ClassesSymbols.html +20 -0
- data/data/jqplot/docs/search/ClassesT.html +20 -0
- data/data/jqplot/docs/search/FilesJ.html +20 -0
- data/data/jqplot/docs/search/FunctionsC.html +20 -0
- data/data/jqplot/docs/search/FunctionsD.html +20 -0
- data/data/jqplot/docs/search/FunctionsG.html +20 -0
- data/data/jqplot/docs/search/FunctionsI.html +20 -0
- data/data/jqplot/docs/search/FunctionsM.html +20 -0
- data/data/jqplot/docs/search/FunctionsN.html +20 -0
- data/data/jqplot/docs/search/FunctionsR.html +20 -0
- data/data/jqplot/docs/search/FunctionsS.html +20 -0
- data/data/jqplot/docs/search/FunctionsZ.html +20 -0
- data/data/jqplot/docs/search/GeneralA.html +20 -0
- data/data/jqplot/docs/search/GeneralB.html +20 -0
- data/data/jqplot/docs/search/GeneralC.html +20 -0
- data/data/jqplot/docs/search/GeneralD.html +20 -0
- data/data/jqplot/docs/search/GeneralE.html +20 -0
- data/data/jqplot/docs/search/GeneralF.html +20 -0
- data/data/jqplot/docs/search/GeneralG.html +20 -0
- data/data/jqplot/docs/search/GeneralH.html +20 -0
- data/data/jqplot/docs/search/GeneralI.html +20 -0
- data/data/jqplot/docs/search/GeneralJ.html +20 -0
- data/data/jqplot/docs/search/GeneralL.html +20 -0
- data/data/jqplot/docs/search/GeneralM.html +20 -0
- data/data/jqplot/docs/search/GeneralN.html +20 -0
- data/data/jqplot/docs/search/GeneralO.html +20 -0
- data/data/jqplot/docs/search/GeneralP.html +20 -0
- data/data/jqplot/docs/search/GeneralR.html +20 -0
- data/data/jqplot/docs/search/GeneralS.html +20 -0
- data/data/jqplot/docs/search/GeneralSymbols.html +20 -0
- data/data/jqplot/docs/search/GeneralT.html +20 -0
- data/data/jqplot/docs/search/GeneralU.html +20 -0
- data/data/jqplot/docs/search/GeneralV.html +20 -0
- data/data/jqplot/docs/search/GeneralW.html +20 -0
- data/data/jqplot/docs/search/GeneralX.html +20 -0
- data/data/jqplot/docs/search/GeneralY.html +20 -0
- data/data/jqplot/docs/search/GeneralZ.html +20 -0
- data/data/jqplot/docs/search/HooksA.html +20 -0
- data/data/jqplot/docs/search/HooksE.html +20 -0
- data/data/jqplot/docs/search/HooksJ.html +20 -0
- data/data/jqplot/docs/search/HooksP.html +20 -0
- data/data/jqplot/docs/search/NoResults.html +15 -0
- data/data/jqplot/docs/search/PropertiesA.html +20 -0
- data/data/jqplot/docs/search/PropertiesB.html +20 -0
- data/data/jqplot/docs/search/PropertiesC.html +20 -0
- data/data/jqplot/docs/search/PropertiesD.html +20 -0
- data/data/jqplot/docs/search/PropertiesE.html +20 -0
- data/data/jqplot/docs/search/PropertiesF.html +20 -0
- data/data/jqplot/docs/search/PropertiesG.html +20 -0
- data/data/jqplot/docs/search/PropertiesH.html +20 -0
- data/data/jqplot/docs/search/PropertiesI.html +20 -0
- data/data/jqplot/docs/search/PropertiesL.html +20 -0
- data/data/jqplot/docs/search/PropertiesM.html +20 -0
- data/data/jqplot/docs/search/PropertiesN.html +20 -0
- data/data/jqplot/docs/search/PropertiesO.html +20 -0
- data/data/jqplot/docs/search/PropertiesP.html +20 -0
- data/data/jqplot/docs/search/PropertiesR.html +20 -0
- data/data/jqplot/docs/search/PropertiesS.html +20 -0
- data/data/jqplot/docs/search/PropertiesT.html +20 -0
- data/data/jqplot/docs/search/PropertiesU.html +20 -0
- data/data/jqplot/docs/search/PropertiesV.html +20 -0
- data/data/jqplot/docs/search/PropertiesW.html +20 -0
- data/data/jqplot/docs/search/PropertiesX.html +20 -0
- data/data/jqplot/docs/search/PropertiesY.html +20 -0
- data/data/jqplot/docs/search/PropertiesZ.html +20 -0
- data/data/jqplot/docs/styles/1.css +767 -0
- data/data/jqplot/docs/styles/2.css +174 -0
- data/data/jqplot/docs/styles/main.css +2 -0
- data/data/jqplot/examples/.htaccess +1 -0
- data/data/jqplot/examples/OHLC.html +333 -0
- data/data/jqplot/examples/OHLC2.html +193 -0
- data/data/jqplot/examples/area.html +107 -0
- data/data/jqplot/examples/axisLabel.html +117 -0
- data/data/jqplot/examples/axisLabelsRotatedText.html +131 -0
- data/data/jqplot/examples/axisLabelsRotatedText2.html +155 -0
- data/data/jqplot/examples/barLinePieStack.html +198 -0
- data/data/jqplot/examples/barMissingValues.html +64 -0
- data/data/jqplot/examples/barTest.html +283 -0
- data/data/jqplot/examples/barTest2.html +74 -0
- data/data/jqplot/examples/bezierCurve.html +96 -0
- data/data/jqplot/examples/blockPlot.html +149 -0
- data/data/jqplot/examples/bubbleChart2.html +253 -0
- data/data/jqplot/examples/bubblechart.html +69 -0
- data/data/jqplot/examples/catchError.html +53 -0
- data/data/jqplot/examples/categoryHorizontalBar.html +81 -0
- data/data/jqplot/examples/categoryVsLinearAxes.html +74 -0
- data/data/jqplot/examples/chartInTable.html +33 -0
- data/data/jqplot/examples/customHighlighterCursorTrendline.html +72 -0
- data/data/jqplot/examples/customPieTests.html +73 -0
- data/data/jqplot/examples/dataLabels.html +192 -0
- data/data/jqplot/examples/dataTracking.html +91 -0
- data/data/jqplot/examples/donutTest.html +89 -0
- data/data/jqplot/examples/donutTest.js +96 -0
- data/data/jqplot/examples/examples.css +19 -0
- data/data/jqplot/examples/fillToZero.html +126 -0
- data/data/jqplot/examples/filledLine.html +78 -0
- data/data/jqplot/examples/filledLineCategoryAxis.html +80 -0
- data/data/jqplot/examples/funnelTest.html +82 -0
- data/data/jqplot/examples/funnelTest.js +74 -0
- data/data/jqplot/examples/gridCustomization.html +56 -0
- data/data/jqplot/examples/hiddenPlot.html +216 -0
- data/data/jqplot/examples/highlighter.html +95 -0
- data/data/jqplot/examples/highlighter2.html +63 -0
- data/data/jqplot/examples/horizontalLine.html +51 -0
- data/data/jqplot/examples/intticks.html +178 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
- data/data/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
- data/data/jqplot/examples/jquery-ui/js/jquery-1.4.2.min.js +154 -0
- data/data/jqplot/examples/jquery-ui/js/jquery-ui-1.8.1.custom.min.js +756 -0
- data/data/jqplot/examples/legendLabels.html +205 -0
- data/data/jqplot/examples/legendLabels2.html +228 -0
- data/data/jqplot/examples/liz.zip +0 -0
- data/data/jqplot/examples/markerStyles.html +44 -0
- data/data/jqplot/examples/mekkoChart.html +217 -0
- data/data/jqplot/examples/meterGauge.html +132 -0
- data/data/jqplot/examples/meterGauge2.html +158 -0
- data/data/jqplot/examples/minMaxLines.html +61 -0
- data/data/jqplot/examples/missingValues.html +119 -0
- data/data/jqplot/examples/multiAxesRotatedText.html +70 -0
- data/data/jqplot/examples/multipleBarColors.html +149 -0
- data/data/jqplot/examples/multipleLines.html +47 -0
- data/data/jqplot/examples/multipleYAxes.html +85 -0
- data/data/jqplot/examples/nav.inc +35 -0
- data/data/jqplot/examples/pieTest.html +77 -0
- data/data/jqplot/examples/pieTest2.html +87 -0
- data/data/jqplot/examples/pieTest2.js +80 -0
- data/data/jqplot/examples/pieTest3.html +100 -0
- data/data/jqplot/examples/pointLabels.html +94 -0
- data/data/jqplot/examples/pointLabels2.html +47 -0
- data/data/jqplot/examples/prefix.html +90 -0
- data/data/jqplot/examples/resizablePlot.html +150 -0
- data/data/jqplot/examples/rotatedTickLabels.html +61 -0
- data/data/jqplot/examples/rotatedTickLabelsZoom.html +68 -0
- data/data/jqplot/examples/seriesCanvasReorder.html +93 -0
- data/data/jqplot/examples/seriesUpdate.html +123 -0
- data/data/jqplot/examples/shadowTests.html +133 -0
- data/data/jqplot/examples/singlePoint.html +70 -0
- data/data/jqplot/examples/sparkLine.html +48 -0
- data/data/jqplot/examples/stackedBar2.html +104 -0
- data/data/jqplot/examples/stackedBar3.html +76 -0
- data/data/jqplot/examples/stackedBarCategoryVsLinearAxes.html +121 -0
- data/data/jqplot/examples/stackedCategoryAxis.html +89 -0
- data/data/jqplot/examples/stackedFilledLine.html +77 -0
- data/data/jqplot/examples/stackedLine.html +56 -0
- data/data/jqplot/examples/test2.html +64 -0
- data/data/jqplot/examples/theming.html +483 -0
- data/data/jqplot/examples/trendlineDragableCustomization.html +79 -0
- data/data/jqplot/examples/verticalLine.html +52 -0
- data/data/jqplot/examples/waterfall.html +135 -0
- data/data/jqplot/examples/zoom1.html +125 -0
- data/data/jqplot/examples/zoom2.html +73 -0
- data/data/jqplot/examples/zoom3.html +69 -0
- data/data/jqplot/examples/zoomOptions.html +101 -0
- data/data/jqplot/examples/zoomProxy.html +108 -0
- data/data/jqplot/excanvas.js +1416 -0
- data/data/jqplot/excanvas.min.js +35 -0
- data/data/jqplot/gpl-2.0.txt +280 -0
- data/data/jqplot/jqPlotCssStyling.txt +53 -0
- data/data/jqplot/jqPlotOptions.txt +276 -0
- data/data/jqplot/jquery-1.4.1.min.js +152 -0
- data/data/jqplot/jquery-1.4.2.min.js +154 -0
- data/data/jqplot/jquery.jqplot.css +212 -0
- data/data/jqplot/jquery.jqplot.js +7004 -0
- data/data/jqplot/jquery.jqplot.min.css +1 -0
- data/data/jqplot/jquery.jqplot.min.js +34 -0
- data/data/jqplot/optionsTutorial.txt +239 -0
- data/data/jqplot/plugins/jqplot.BezierCurveRenderer.js +300 -0
- data/data/jqplot/plugins/jqplot.BezierCurveRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.barRenderer.js +629 -0
- data/data/jqplot/plugins/jqplot.barRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.blockRenderer.js +221 -0
- data/data/jqplot/plugins/jqplot.blockRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.bubbleRenderer.js +724 -0
- data/data/jqplot/plugins/jqplot.bubbleRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.canvasAxisLabelRenderer.js +187 -0
- data/data/jqplot/plugins/jqplot.canvasAxisLabelRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.canvasAxisTickRenderer.js +226 -0
- data/data/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.canvasTextRenderer.js +408 -0
- data/data/jqplot/plugins/jqplot.canvasTextRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.categoryAxisRenderer.js +630 -0
- data/data/jqplot/plugins/jqplot.categoryAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.cursor.js +952 -0
- data/data/jqplot/plugins/jqplot.cursor.min.js +34 -0
- data/data/jqplot/plugins/jqplot.dateAxisRenderer.js +313 -0
- data/data/jqplot/plugins/jqplot.dateAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.donutRenderer.js +876 -0
- data/data/jqplot/plugins/jqplot.donutRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.dragable.js +206 -0
- data/data/jqplot/plugins/jqplot.dragable.min.js +34 -0
- data/data/jqplot/plugins/jqplot.enhancedLegendRenderer.js +186 -0
- data/data/jqplot/plugins/jqplot.enhancedLegendRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.funnelRenderer.js +918 -0
- data/data/jqplot/plugins/jqplot.funnelRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.highlighter.js +374 -0
- data/data/jqplot/plugins/jqplot.highlighter.min.js +34 -0
- data/data/jqplot/plugins/jqplot.logAxisRenderer.js +434 -0
- data/data/jqplot/plugins/jqplot.logAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.mekkoAxisRenderer.js +595 -0
- data/data/jqplot/plugins/jqplot.mekkoAxisRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.mekkoRenderer.js +419 -0
- data/data/jqplot/plugins/jqplot.mekkoRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.meterGaugeRenderer.js +1112 -0
- data/data/jqplot/plugins/jqplot.meterGaugeRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.ohlcRenderer.js +343 -0
- data/data/jqplot/plugins/jqplot.ohlcRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.pieRenderer.js +749 -0
- data/data/jqplot/plugins/jqplot.pieRenderer.min.js +34 -0
- data/data/jqplot/plugins/jqplot.pointLabels.js +325 -0
- data/data/jqplot/plugins/jqplot.pointLabels.min.js +34 -0
- data/data/jqplot/plugins/jqplot.trendline.js +208 -0
- data/data/jqplot/plugins/jqplot.trendline.min.js +34 -0
- data/data/jqplot/usage.txt +119 -0
- data/examples/graph.rb +17 -0
- data/lib/reportbuilder.rb +21 -2
- data/lib/reportbuilder/builder.rb +31 -3
- data/lib/reportbuilder/builder/html.rb +39 -5
- data/lib/reportbuilder/graph.rb +252 -0
- data/lib/reportbuilder/graph/html_flot.rb +149 -0
- data/lib/reportbuilder/graph/html_jqplot.rb +145 -0
- data/lib/reportbuilder/image.rb +178 -78
- data/lib/reportbuilder/table/rtfbuilder.rb +2 -2
- data/test/helper_test.rb +6 -7
- data/test/test_graph.rb +44 -0
- data/test/test_graph_html_flot.rb +36 -0
- data/test/test_graph_html_jqplot.rb +36 -0
- data/test/test_html.rb +4 -7
- data/test/test_image.rb +35 -7
- data/test/test_reportbuilder.rb +4 -6
- data/test/test_table.rb +0 -2
- metadata +402 -7
- metadata.gz.sig +4 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2009 - 2010 Chris Leonello
|
|
3
|
+
* jqPlot is currently available for use in all personal or commercial projects
|
|
4
|
+
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
|
5
|
+
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
|
6
|
+
* choose the license that best suits your project and use it accordingly.
|
|
7
|
+
*
|
|
8
|
+
* Although not required, the author would appreciate an email letting him
|
|
9
|
+
* know of any substantial use of jqPlot. You can reach the author at:
|
|
10
|
+
* chris at jqplot or see http://www.jqplot.com/info.php .
|
|
11
|
+
*
|
|
12
|
+
* If you are feeling kind and generous, consider supporting the project by
|
|
13
|
+
* making a donation at: http://www.jqplot.com/donate.php .
|
|
14
|
+
*
|
|
15
|
+
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
|
|
16
|
+
*
|
|
17
|
+
* Date instance methods contained in jqplot.dateMethods.js:
|
|
18
|
+
*
|
|
19
|
+
* author Ken Snyder (ken d snyder at gmail dot com)
|
|
20
|
+
* date 2008-09-10
|
|
21
|
+
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
|
|
22
|
+
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
|
|
23
|
+
*
|
|
24
|
+
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
|
|
25
|
+
*
|
|
26
|
+
* version 2007.04.27
|
|
27
|
+
* author Ash Searle
|
|
28
|
+
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
|
29
|
+
* http://hexmen.com/js/sprintf.js
|
|
30
|
+
* The author (Ash Searle) has placed this code in the public domain:
|
|
31
|
+
* "This code is unrestricted: you are free to use it however you like."
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
(function(f){f.jqplot.Trendline=function(){this.show=f.jqplot.config.enablePlugins;this.color="#666666";this.renderer=new f.jqplot.LineRenderer();this.rendererOptions={marker:{show:false}};this.label="";this.type="linear";this.shadow=true;this.markerRenderer={show:false};this.lineWidth=1.5;this.shadowAngle=45;this.shadowOffset=1;this.shadowAlpha=0.07;this.shadowDepth=3;this.isTrendline=true};f.jqplot.postSeriesInitHooks.push(e);f.jqplot.postDrawSeriesHooks.push(g);f.jqplot.addLegendRowHooks.push(a);function a(k){var i=k.trendline.label.toString();var j=null;if(this.renderer.constructor!=f.jqplot.PieRenderer&&k.trendline.show&&i){j={label:i,color:k.trendline.color}}return j}function e(m,k,j,i,l){if(this.renderer.constructor==f.jqplot.LineRenderer){this.trendline=new f.jqplot.Trendline();i=i||{};f.extend(true,this.trendline,{color:this.color},j.trendline,i.trendline);this.trendline.renderer.init.call(this.trendline,null)}}function g(m,i){i=f.extend(true,{},this.trendline,i);if(i.show&&this.renderer.constructor!=f.jqplot.PieRenderer){var k;var l=i.data||this.data;k=c(l,this.trendline.type);var j=i.gridData||this.renderer.makeGridData.call(this,k.data);this.trendline.renderer.draw.call(this.trendline,m,j,{showLine:true,shadow:this.trendline.shadow})}}function b(w,v,n){var u=(n==null)?"linear":n;var s=w.length;var t;var z;var o=0;var m=0;var r=0;var q=0;var l=0;var j=[];var k=[];if(u=="linear"){k=w;j=v}else{if(u=="exp"||u=="exponential"){for(var p=0;p<v.length;p++){if(v[p]<=0){s--}else{k.push(w[p]);j.push(Math.log(v[p]))}}}}for(var p=0;p<s;p++){o=o+k[p];m=m+j[p];q=q+k[p]*j[p];r=r+k[p]*k[p];l=l+j[p]*j[p]}t=(s*q-o*m)/(s*r-o*o);z=(m-t*o)/s;return[t,z]}function h(k,j){var i;i=b(k,j,"linear");return[i[0],i[1]]}function d(o,m){var k;var i=o;var n=m;k=b(i,n,"exp");var l=Math.exp(k[0]);var j=Math.exp(k[1]);return[l,j]}function c(l,j){var p=(j==null)?"linear":j;var n;var o;var r=[];var q=[];var m=[];for(k=0;k<l.length;k++){if(l[k]!=null&&l[k][0]!=null&&l[k][1]!=null){r.push(l[k][0]);q.push(l[k][1])}}if(p=="linear"){n=h(r,q);for(var k=0;k<r.length;k++){o=n[0]*r[k]+n[1];m.push([r[k],o])}}else{if(p=="exp"||p=="exponential"){n=d(r,q);for(var k=0;k<r.length;k++){o=n[1]*Math.pow(n[0],r[k]);m.push([r[k],o])}}}return{data:m,slope:n[0],intercept:n[1]}}})(jQuery);
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Title: jqPlot Usage
|
|
2
|
+
|
|
3
|
+
Usage Documentation:
|
|
4
|
+
|
|
5
|
+
Introduction:
|
|
6
|
+
|
|
7
|
+
jqPlot is a jQuery plugin to generate pure client-side javascript charts in your web pages.
|
|
8
|
+
|
|
9
|
+
The jqPlot home page is at <http://www.jqplot.com/>.
|
|
10
|
+
|
|
11
|
+
The project page and downloads are at <http://www.bitbucket.org/cleonello/jqplot/>.
|
|
12
|
+
|
|
13
|
+
Below are a few examples to demonstrate jqPlot usage. These plots are shown as static images.
|
|
14
|
+
Many more examples of dynamically rendered plots can be seen on the test and examples pages here: <../../tests/>.
|
|
15
|
+
|
|
16
|
+
Include the Files:
|
|
17
|
+
|
|
18
|
+
jqPlot requires jQuery (1.4+ required for certain features). jQuery 1.4.1 is included in the distribution.
|
|
19
|
+
To use jqPlot include jquery, the jqPlot jQuery plugin, jqPlot css file and optionally the excanvas
|
|
20
|
+
script for IE support in your web page:
|
|
21
|
+
|
|
22
|
+
> <!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
|
|
23
|
+
> <script language="javascript" type="text/javascript" src="jquery-1.4.2.min.js"></script>
|
|
24
|
+
> <script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script>
|
|
25
|
+
> <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />
|
|
26
|
+
|
|
27
|
+
Add a plot container:
|
|
28
|
+
|
|
29
|
+
Add a container (target) to your web page where you want your plot to show up.
|
|
30
|
+
Be sure to give your target a width and a height:
|
|
31
|
+
|
|
32
|
+
> <div id="chartdiv" style="height:400px;width:300px; "></div>
|
|
33
|
+
|
|
34
|
+
Create a plot:
|
|
35
|
+
|
|
36
|
+
Then, create the actual plot by calling the
|
|
37
|
+
$.jqplot plugin with the id of your target and some data:
|
|
38
|
+
|
|
39
|
+
> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);
|
|
40
|
+
|
|
41
|
+
Which will produce a
|
|
42
|
+
chart like:
|
|
43
|
+
|
|
44
|
+
(see images/basicline.png)
|
|
45
|
+
|
|
46
|
+
Plot Options:
|
|
47
|
+
|
|
48
|
+
You can customize the plot by passing options to the $.jqplot function. Options are described in
|
|
49
|
+
<jqPlot Options> in the jqPlotOptions.txt file. An example of options usage:
|
|
50
|
+
|
|
51
|
+
> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]],
|
|
52
|
+
> { title:'Exponential Line',
|
|
53
|
+
> axes:{yaxis:{min:-10, max:240}},
|
|
54
|
+
> series:[{color:'#5FAB78'}]
|
|
55
|
+
> });
|
|
56
|
+
|
|
57
|
+
Which will produce
|
|
58
|
+
a plot like:
|
|
59
|
+
|
|
60
|
+
(see images/basicoptions.png)
|
|
61
|
+
|
|
62
|
+
Using Plugins:
|
|
63
|
+
|
|
64
|
+
You can use jqPlot plugins (that is, plugins to the jqPlot plugin) by including them in your html
|
|
65
|
+
after you include the jqPlot plugin. Here is how to include the log axis plugin:
|
|
66
|
+
|
|
67
|
+
> <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />
|
|
68
|
+
> <!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
|
|
69
|
+
> <script language="javascript" type="text/javascript" src="jquery-1.4.2.min.js"></script>
|
|
70
|
+
> <script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script>
|
|
71
|
+
> <script language="javascript" type="text/javascript" src="jqplot.logAxisRenderer.js"></script>
|
|
72
|
+
|
|
73
|
+
Here is a the same $.jqplot call
|
|
74
|
+
but with a log y axis:
|
|
75
|
+
|
|
76
|
+
> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]],
|
|
77
|
+
> { title:'Exponential Line',
|
|
78
|
+
> axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer}},
|
|
79
|
+
> series:[{color:'#5FAB78'}]
|
|
80
|
+
> });
|
|
81
|
+
|
|
82
|
+
Which produces
|
|
83
|
+
a plot like:
|
|
84
|
+
|
|
85
|
+
(see images/basiclogaxis.png)
|
|
86
|
+
|
|
87
|
+
You can further customize with options specific
|
|
88
|
+
to the log axis plugin:
|
|
89
|
+
|
|
90
|
+
> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]],
|
|
91
|
+
> { title:'Exponential Line',
|
|
92
|
+
> axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer, tickDistribution:'power'}},
|
|
93
|
+
> series:[{color:'#5FAB78'}]
|
|
94
|
+
> });
|
|
95
|
+
|
|
96
|
+
Which makes a
|
|
97
|
+
plot like:
|
|
98
|
+
|
|
99
|
+
(see images/basiclogoptions.png)
|
|
100
|
+
|
|
101
|
+
For a full list of options, see <jqPlot Options> in the jqPlotOptions.txt file.
|
|
102
|
+
|
|
103
|
+
You can add as many plugins as you wish. Order is generally not important.
|
|
104
|
+
Some plugins, like the highlighter plugin which highlights data points near the
|
|
105
|
+
mouse, don't need any extra options or setup to function. Highlighter does have
|
|
106
|
+
additional options which the user can set.
|
|
107
|
+
|
|
108
|
+
Other plugins, the barRenderer for example, provide functionality the must be specified
|
|
109
|
+
in the chart options object. To render a series as a bar graph with the bar renderer,
|
|
110
|
+
you would first include the plugin after jqPlot:
|
|
111
|
+
|
|
112
|
+
> <script language="javascript" type="text/javascript" src="plugins/jqplot.barRenderer.min.js"></script>
|
|
113
|
+
|
|
114
|
+
Then you would create
|
|
115
|
+
a chart like:
|
|
116
|
+
|
|
117
|
+
> $.jqplot('chartdiv', [[34.53, 56.32, 25.1, 18.6]], series:[{renderer:$.jqplot.BarRenderer}]);
|
|
118
|
+
|
|
119
|
+
Here the default LineRenderer is replaced by a BarRenderer to generate a bar graph for the first (an only) series.
|
data/examples/graph.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
|
2
|
+
require "reportbuilder"
|
|
3
|
+
$base_dirname=File.dirname(__FILE__)
|
|
4
|
+
rb=ReportBuilder.new(:directory=>$base_dirname) do |rb|
|
|
5
|
+
rb.graph(:name=>"Graph", :html_engine=>:ploticus) do |g|
|
|
6
|
+
g.series_defaults :color=>'red', :bars=>{:width=>5}
|
|
7
|
+
g.legend :show=>true, :position=>'nw', :background_color=>'purple'
|
|
8
|
+
g.xaxis :min=>-2, :max=>10, :ticks=>2
|
|
9
|
+
g.grid :show=>true, :color=>'#cccccc', :background_color=>'#eeeeee'
|
|
10
|
+
g.serie :x1, :label=>'d1', :data=>10.times.map{|i| rand(10)+i}, :type=>:bar, :bars=>{:width=>5, :color=>'blue'}
|
|
11
|
+
g.serie :x2, :label=>'d2', :data=>10.times.map{|i| rand(10)+i}, :type=>:scatter, :lines=>{:color=>'orange'}
|
|
12
|
+
g.serie :x3, :label=>'d3', :data=>10.times.map{|i| rand(10)+i}, :type=>:line, :lines=>{:color=>'yellow', :width=>3, :shadow_depth=>20}, :markers=>{:show=>true, :color=>'red', :diameter=>10}
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
rb.name="Graph"
|
|
16
|
+
puts rb.to_html
|
|
17
|
+
rb.save_html($base_dirname+'/graph.html')
|
data/lib/reportbuilder.rb
CHANGED
|
@@ -2,6 +2,7 @@ require 'reportbuilder/builder'
|
|
|
2
2
|
require 'reportbuilder/table'
|
|
3
3
|
require 'reportbuilder/section'
|
|
4
4
|
require 'reportbuilder/image'
|
|
5
|
+
require 'reportbuilder/graph'
|
|
5
6
|
|
|
6
7
|
# = Report Abstract Interface.
|
|
7
8
|
# Creates text, html and rtf output, based on a common framework.
|
|
@@ -51,15 +52,28 @@ class ReportBuilder
|
|
|
51
52
|
# Doesn't print a title if set to true
|
|
52
53
|
attr_accessor :no_title
|
|
53
54
|
# ReportBuilder version
|
|
54
|
-
VERSION = '1.
|
|
55
|
-
|
|
55
|
+
VERSION = '1.3.0'
|
|
56
|
+
DATA_DIR=File.dirname(__FILE__)+"/../data"
|
|
56
57
|
FormatNotFound=Class.new(Exception)
|
|
57
58
|
# Available formats
|
|
58
59
|
def self.builder_for(format)
|
|
59
60
|
format=format.to_s.downcase
|
|
60
61
|
Builder.inherited_classes.find {|m| m.code.include? format}
|
|
61
62
|
end
|
|
63
|
+
def self.has_rmagick?
|
|
64
|
+
begin
|
|
65
|
+
require 'RMagick'
|
|
66
|
+
true
|
|
67
|
+
rescue LoadError
|
|
68
|
+
false
|
|
69
|
+
end
|
|
70
|
+
end
|
|
62
71
|
# Generates and optionally save the report on one function
|
|
72
|
+
#
|
|
73
|
+
# * options= Hash of options
|
|
74
|
+
# * :filename => name of file. If not provided, returns output
|
|
75
|
+
# * :format => format of output. See Builder subclasses
|
|
76
|
+
# * &block: block executed inside builder
|
|
63
77
|
def self.generate(options=Hash.new, &block)
|
|
64
78
|
options[:filename]||=nil
|
|
65
79
|
options[:format]||="text"
|
|
@@ -135,5 +149,10 @@ class ReportBuilder
|
|
|
135
149
|
gen.parse
|
|
136
150
|
gen.out
|
|
137
151
|
end
|
|
152
|
+
def save_text(file)
|
|
153
|
+
gen=Builder::Text.new(self, @options)
|
|
154
|
+
gen.parse
|
|
155
|
+
gen.save(file)
|
|
156
|
+
end
|
|
138
157
|
alias_method :to_s, :to_text
|
|
139
158
|
end
|
|
@@ -28,8 +28,10 @@ class ReportBuilder
|
|
|
28
28
|
@options=default_options.merge(options)
|
|
29
29
|
@toc=[]
|
|
30
30
|
@table_n=1
|
|
31
|
+
@graph_n=1
|
|
31
32
|
@entry_n=1
|
|
32
33
|
@list_tables=[]
|
|
34
|
+
@list_graphs=[]
|
|
33
35
|
|
|
34
36
|
end
|
|
35
37
|
# Parse the output. Could be reimplemented on subclasses
|
|
@@ -78,10 +80,28 @@ class ReportBuilder
|
|
|
78
80
|
def table(opt=Hash.new, &block)
|
|
79
81
|
parse_element(ReportBuilder::Table.new(opt,&block))
|
|
80
82
|
end
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
parse_element(ReportBuilder::Image.new(filename,opt))
|
|
83
|
+
def graph(opt=Hash.new, &block)
|
|
84
|
+
parse_element(ReportBuilder::Graph.new(opt,&block))
|
|
84
85
|
end
|
|
86
|
+
# Create and parse an image, using a string or IO
|
|
87
|
+
def image_blob(blob, opt=Hash.new)
|
|
88
|
+
parse_element(ReportBuilder::ImageBlob.new(blob,opt))
|
|
89
|
+
end
|
|
90
|
+
# Create and parse an image, using a string or IO
|
|
91
|
+
def image_filename(filename, opt=Hash.new)
|
|
92
|
+
parse_element(ReportBuilder::ImageFilename.new(filename,opt))
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Create and parse an image, detecting if is a Filename or a
|
|
96
|
+
# blob
|
|
97
|
+
def image(img, opt=Hash.new)
|
|
98
|
+
if img.is_a? String and File.exists? img
|
|
99
|
+
parse_element(ReportBuilder::ImageFilename.new(img,opt))
|
|
100
|
+
else
|
|
101
|
+
parse_element(ReportBuilder::ImageBlob.new(img,opt))
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
85
105
|
# Create and parse an image. Use a block to insert element inside the block
|
|
86
106
|
def section(opt=Hash.new, &block)
|
|
87
107
|
parse_element(ReportBuilder::Section.new(opt,&block))
|
|
@@ -116,6 +136,14 @@ class ReportBuilder
|
|
|
116
136
|
@list_tables.push([anchor,name])
|
|
117
137
|
anchor
|
|
118
138
|
end
|
|
139
|
+
# Add an entry for graph index.
|
|
140
|
+
# Returns the name of the anchor
|
|
141
|
+
def graph_entry(name)
|
|
142
|
+
anchor="graph_#{@graph_n}"
|
|
143
|
+
@graph_n+=1
|
|
144
|
+
@list_graphs.push([anchor,name])
|
|
145
|
+
anchor
|
|
146
|
+
end
|
|
119
147
|
end
|
|
120
148
|
|
|
121
149
|
class ElementBuilder
|
|
@@ -5,7 +5,7 @@ class ReportBuilder
|
|
|
5
5
|
attr_reader :directory
|
|
6
6
|
def initialize(builder, options)
|
|
7
7
|
super
|
|
8
|
-
@directory
|
|
8
|
+
@directory = @options.delete :directory
|
|
9
9
|
@body=""
|
|
10
10
|
@headers=[]
|
|
11
11
|
@footers=[]
|
|
@@ -85,9 +85,11 @@ class ReportBuilder
|
|
|
85
85
|
end
|
|
86
86
|
def js(js)
|
|
87
87
|
if(File.exists? js)
|
|
88
|
-
if(!File.exists? @directory+"/js
|
|
88
|
+
if(!File.exists? @directory+"/js")
|
|
89
89
|
FileUtils.mkdir @directory+"/js"
|
|
90
|
-
|
|
90
|
+
end
|
|
91
|
+
if(!File.exists? @directory+"/js/"+File.basename(js))
|
|
92
|
+
FileUtils.cp js, @directory+"/js/"+File.basename(js)
|
|
91
93
|
end
|
|
92
94
|
@headers.push("<script type='text/javascript' src='js/#{File.basename(js)}'></script>")
|
|
93
95
|
end
|
|
@@ -95,15 +97,47 @@ class ReportBuilder
|
|
|
95
97
|
|
|
96
98
|
def css(css)
|
|
97
99
|
if(File.exists? css)
|
|
98
|
-
if(!File.exists? @directory+"/css
|
|
100
|
+
if(!File.exists? @directory+"/css")
|
|
99
101
|
FileUtils.mkdir @directory+"/css"
|
|
102
|
+
end
|
|
103
|
+
if(!File.exists? @directory+"/css/"+File.basename(css))
|
|
100
104
|
FileUtils.cp css, @directory+"/css/"+File.basename(css)
|
|
101
105
|
end
|
|
102
106
|
@headers.push("<link rel='stylesheet' type='text/css' href='css/#{File.basename(css)}' />")
|
|
103
107
|
end
|
|
104
108
|
end
|
|
105
109
|
|
|
106
|
-
|
|
110
|
+
def parse_js(d, level=0)
|
|
111
|
+
ei=5
|
|
112
|
+
indent=" "*(level*2)
|
|
113
|
+
case d
|
|
114
|
+
when String
|
|
115
|
+
"\"#{d}\""
|
|
116
|
+
when TrueClass
|
|
117
|
+
'true'
|
|
118
|
+
when FalseClass
|
|
119
|
+
'false'
|
|
120
|
+
when Numeric
|
|
121
|
+
d.to_s
|
|
122
|
+
when Array
|
|
123
|
+
if d.size>ei
|
|
124
|
+
sep,pre=",\n"+indent, "\n"+indent
|
|
125
|
+
else
|
|
126
|
+
sep, pre=", ", ""
|
|
127
|
+
end
|
|
128
|
+
pre+"["+d.map {|i| parse_js(i, level+1)}.join(sep)+pre+"]"
|
|
129
|
+
when Hash
|
|
130
|
+
if d.size>ei
|
|
131
|
+
sep, pre=",\n"+indent, "\n"+indent
|
|
132
|
+
else
|
|
133
|
+
sep, pre=", ", ""
|
|
134
|
+
end
|
|
135
|
+
pre+"{ "+d.map {|k,v| parse_js(k)+" : "+parse_js(v, level+1)}.join(sep)+pre+"}"
|
|
136
|
+
|
|
137
|
+
else
|
|
138
|
+
d.to_s
|
|
139
|
+
end
|
|
140
|
+
end
|
|
107
141
|
def text(t)
|
|
108
142
|
ws=(" "*parse_level*2)
|
|
109
143
|
@body << ws << "<p>#{t}</p>\n"
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
class ReportBuilder
|
|
2
|
+
# Creates a Graph. API based on:
|
|
3
|
+
# * jqPlot: [http://www.jqplot.com/]
|
|
4
|
+
#
|
|
5
|
+
# == API Reference
|
|
6
|
+
# All options could be not available on specifics builder.
|
|
7
|
+
# See documentation and source code for specific information
|
|
8
|
+
# * height
|
|
9
|
+
# * width
|
|
10
|
+
# * data: Array for a specific data serie. The first parameter
|
|
11
|
+
# should be the id, and the next elements could be single values,
|
|
12
|
+
# with automatic
|
|
13
|
+
# asignation on x axis (from 1 to n), or an array of values. Normally,
|
|
14
|
+
# they correspond to x, y and z axis, but may change according to specific
|
|
15
|
+
# series type
|
|
16
|
+
# * series_defaults: Options for all series. The options are:
|
|
17
|
+
# * type: could be :line, :bar, :scatter, :pie. Depending on engine,
|
|
18
|
+
# is a shorthand designed to set several options at once or set
|
|
19
|
+
# the 'real' type of plot
|
|
20
|
+
# * label: String
|
|
21
|
+
# * color: String
|
|
22
|
+
# * lines: Hash
|
|
23
|
+
# * show: boolean
|
|
24
|
+
# * color: String
|
|
25
|
+
# * width: integer
|
|
26
|
+
# * fill: boolean
|
|
27
|
+
# * fill_color: string
|
|
28
|
+
# * shadow: boolean
|
|
29
|
+
# * shadow_angle
|
|
30
|
+
# * shadow_offset
|
|
31
|
+
# * shadow_depth
|
|
32
|
+
# * shadow_alpha
|
|
33
|
+
# * markers: Hash
|
|
34
|
+
# * show: boolean
|
|
35
|
+
# * color: boolean
|
|
36
|
+
# * style: style
|
|
37
|
+
# * line_width
|
|
38
|
+
# * size: integer (diameter)
|
|
39
|
+
# * diameter:
|
|
40
|
+
# * radius:
|
|
41
|
+
# * shadow: boolean
|
|
42
|
+
# * shadow_angle
|
|
43
|
+
# * shadow_offset
|
|
44
|
+
# * shadow_depth
|
|
45
|
+
# * shadow_alpha
|
|
46
|
+
# * bars: Hash
|
|
47
|
+
# * color
|
|
48
|
+
# * width
|
|
49
|
+
# * padding
|
|
50
|
+
# * margin
|
|
51
|
+
# * direction
|
|
52
|
+
# * align: 'left' or 'center'
|
|
53
|
+
# * serie_options: Options for a specific serie. The first argument should
|
|
54
|
+
# be the id of serie, and the second parameter should be a hash with
|
|
55
|
+
# options according to series_options
|
|
56
|
+
# * serie: Shorthand for :data and :serie_options. The first element is the
|
|
57
|
+
# id, the second a hash with options for serie, including :data key to
|
|
58
|
+
# assign data to a serie.
|
|
59
|
+
# * legend: hash of options
|
|
60
|
+
# * show
|
|
61
|
+
# * position:
|
|
62
|
+
# * margin
|
|
63
|
+
# * background_color
|
|
64
|
+
# * title
|
|
65
|
+
# * show
|
|
66
|
+
# * text: by default, equal to name of element
|
|
67
|
+
# * axes_defaults: hash of options
|
|
68
|
+
# * show
|
|
69
|
+
# * min
|
|
70
|
+
# * max
|
|
71
|
+
# * autoscale
|
|
72
|
+
# * label_width
|
|
73
|
+
# * label_height
|
|
74
|
+
# * ticks: number of ticks or array
|
|
75
|
+
# * xaxes: Same as axes_defaults
|
|
76
|
+
# * yaxes: Same as axes_defaults
|
|
77
|
+
# * grid
|
|
78
|
+
# * show
|
|
79
|
+
# * color
|
|
80
|
+
# * background_color
|
|
81
|
+
# * tick_color
|
|
82
|
+
# * border_width
|
|
83
|
+
# * border_color
|
|
84
|
+
# * shadow: boolean
|
|
85
|
+
# * shadow_angleel
|
|
86
|
+
# * shadow_offset
|
|
87
|
+
# * shadow_depth
|
|
88
|
+
# * shadow_alpha
|
|
89
|
+
|
|
90
|
+
# == Usage
|
|
91
|
+
# graph=ReportBuilder::Graph.new(:name=>"Graph", ) do |g|
|
|
92
|
+
# g.serie :x1, :data=>[1,2,3,4], :label=>"Data 1" # Automatic asignation of x axis
|
|
93
|
+
# g.data :x2, :data=>[[1,2],[2,3],[4,5]], :label=>"Data 2" # Manual asignation of x axis
|
|
94
|
+
# g.xaxis :label=>"X axis", :autoscale=>true # jqPlot like asignation
|
|
95
|
+
# end
|
|
96
|
+
class Graph
|
|
97
|
+
# Allows to define an reader/writer function
|
|
98
|
+
# Without parameters, retrieve the value for a instance variable
|
|
99
|
+
# With parameters, set the value for instance variable
|
|
100
|
+
def self.attr_accessor_dsl(*attr)
|
|
101
|
+
attr.each do |sym|
|
|
102
|
+
sym_w_sm=sym.to_s.gsub(":","")
|
|
103
|
+
define_method(sym) do |*args|
|
|
104
|
+
if args.size==0
|
|
105
|
+
instance_variable_get("@#{sym_w_sm}")
|
|
106
|
+
else
|
|
107
|
+
instance_variable_set("@#{sym_w_sm}", args[0])
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
define_method(sym.to_s+"=") do |*args|
|
|
112
|
+
instance_variable_set("@#{sym_w_sm}", args[0])
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
@@n=1 # :nodoc:
|
|
118
|
+
attr_reader :name
|
|
119
|
+
attr_reader :number, :series_data_hash, :series_options_hash
|
|
120
|
+
|
|
121
|
+
attr_accessor_dsl :height, :width, :series_defaults, :title, :xaxis, :yaxis, :grid, :html_engine, :generic_engine, :legend, :axes_defaults
|
|
122
|
+
attr_reader :xmin,:xmax,:ymin, :ymax
|
|
123
|
+
def initialize(options=Hash.new, &block)
|
|
124
|
+
@number=@@n
|
|
125
|
+
@@n+=1
|
|
126
|
+
if !options.has_key? :name
|
|
127
|
+
@name="Graph #{@@n}"
|
|
128
|
+
else
|
|
129
|
+
@name=options.delete(:name)
|
|
130
|
+
end
|
|
131
|
+
@series_data_hash=Hash.new
|
|
132
|
+
@series_options_hash=Hash.new
|
|
133
|
+
@series_defaults=Hash.new
|
|
134
|
+
@xaxis=Hash.new
|
|
135
|
+
@yaxis=Hash.new
|
|
136
|
+
@grid=Hash.new
|
|
137
|
+
@legend=Hash.new
|
|
138
|
+
@axes_defaults=Hash.new
|
|
139
|
+
@title={:text=>@name}
|
|
140
|
+
default_options={
|
|
141
|
+
:width=>600,
|
|
142
|
+
:height=>400,
|
|
143
|
+
:html_engine=>:jqplot,
|
|
144
|
+
:generic_engine=>:rchart
|
|
145
|
+
}
|
|
146
|
+
@options=default_options.merge(options)
|
|
147
|
+
@options.each {|k,v|
|
|
148
|
+
self.send("#{k}=",v) if self.respond_to? k
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if block
|
|
152
|
+
block.arity<1 ? self.instance_eval(&block) : block.call(self)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
def name=(v)
|
|
156
|
+
@name=v
|
|
157
|
+
@title[:text]=v unless @title[:text]
|
|
158
|
+
end
|
|
159
|
+
def series_id
|
|
160
|
+
@series_data_hash.keys.sort {|a,b| a.to_s<=>b.to_s}
|
|
161
|
+
end
|
|
162
|
+
def series_data
|
|
163
|
+
series_id.map {|v|
|
|
164
|
+
@series_data_hash[v]
|
|
165
|
+
}
|
|
166
|
+
end
|
|
167
|
+
def series_options
|
|
168
|
+
series_id.map {|v|
|
|
169
|
+
@series_options_hash[v]
|
|
170
|
+
}
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def data(name, *d)
|
|
174
|
+
i=0
|
|
175
|
+
if d.size==0
|
|
176
|
+
@series_data_hash[name]
|
|
177
|
+
else
|
|
178
|
+
@series_data_hash[name]=d.map {|v|
|
|
179
|
+
i+=1
|
|
180
|
+
if v.is_a? Array
|
|
181
|
+
v
|
|
182
|
+
else
|
|
183
|
+
[i,v]
|
|
184
|
+
end
|
|
185
|
+
}
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
def set_marker_size(h)
|
|
189
|
+
d=h[:markers][:diameter] if h[:markers][:diameter]
|
|
190
|
+
d=h[:markers][:size] if h[:markers][:size]
|
|
191
|
+
d=2*h[:markers][:radius] if h[:markers][:radius]
|
|
192
|
+
h[:markers][:diameter]=d
|
|
193
|
+
h[:markers][:radius]=d/2.0
|
|
194
|
+
h[:markers][:size]=d
|
|
195
|
+
end
|
|
196
|
+
def serie_options(name, h)
|
|
197
|
+
set_marker_size(h) if h[:markers] and (h[:markers].keys & [:size, :radius, :diameter]).size > 0
|
|
198
|
+
@series_options_hash[name]=h
|
|
199
|
+
end
|
|
200
|
+
def serie(name,d)
|
|
201
|
+
raise "You should define :data key" unless d[:data]
|
|
202
|
+
da=d.delete(:data)
|
|
203
|
+
data(name,*da)
|
|
204
|
+
serie_options(name,d)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def actuals_minmax
|
|
208
|
+
if @actuals_minmax.nil?
|
|
209
|
+
@actuals_minmax=Hash.new
|
|
210
|
+
series_data.each do |data|
|
|
211
|
+
data.each do |v|
|
|
212
|
+
@actuals_minmax[:xmin]||=v[0]
|
|
213
|
+
@actuals_minmax[:xmax]||=v[0]
|
|
214
|
+
@actuals_minmax[:ymin]||=v[1]
|
|
215
|
+
@actuals_minmax[:ymax]||=v[1]
|
|
216
|
+
@actuals_minmax[:xmin]=v[0] if @actuals_minmax[:xmin]>v[0]
|
|
217
|
+
@actuals_minmax[:xmax]=v[0] if @actuals_minmax[:xmax]<v[0]
|
|
218
|
+
@actuals_minmax[:ymin]=v[1] if @actuals_minmax[:ymin]>v[1]
|
|
219
|
+
@actuals_minmax[:ymax]=v[1] if @actuals_minmax[:ymax]<v[1]
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
@actuals_minmax
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def define_xy_ranges
|
|
227
|
+
@xmin=xaxis[:min] if xaxis[:min]
|
|
228
|
+
@xmax=xaxis[:max] if xaxis[:max]
|
|
229
|
+
@ymin=yaxis[:min] if yaxis[:min]
|
|
230
|
+
@ymin=yaxis[:max] if yaxis[:max]
|
|
231
|
+
@xmin||=actuals_minmax[:xmin]
|
|
232
|
+
@xmax||=actuals_minmax[:xmax]
|
|
233
|
+
@ymin||=actuals_minmax[:ymin]
|
|
234
|
+
@ymax||=actuals_minmax[:ymax]
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def report_building_html(builder)
|
|
240
|
+
require "reportbuilder/graph/html_#{html_engine}"
|
|
241
|
+
klass=("Html"+html_engine.to_s.capitalize).to_sym
|
|
242
|
+
graph_builder=ReportBuilder::Graph.const_get(klass).new(builder, self)
|
|
243
|
+
graph_builder.generate
|
|
244
|
+
end
|
|
245
|
+
def report_building(builder)
|
|
246
|
+
require "reportbuilder/graph/#{generic_engine}"
|
|
247
|
+
klass=(generic_engine.capitalize).to_sym
|
|
248
|
+
graph_builder = ReportBuilder::Graph.const_get(klass).new(builder, self)
|
|
249
|
+
graph_builder.generate
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|