├── .gitattributes ├── .gitignore ├── AUTHORS.txt ├── CHANGES.txt ├── Gruntfile.js ├── LICENSE.txt ├── README.md ├── RELEASE-NOTES.md ├── TODO.txt ├── bower.json ├── cubesviewer ├── angular-bootstrap-submenu │ └── angular-bootstrap-submenu.js ├── core │ └── cubesviewer.js ├── cubes │ ├── cache.js │ ├── cubes-cvextensions.js │ ├── cubes-service.js │ └── cubes.js ├── cubesviewer.less ├── cubesviewer.templates.js ├── dialog │ ├── dialog.html │ └── dialog.js ├── ga │ └── googleanalytics.js ├── server │ └── reststore.js ├── studio │ ├── about.html │ ├── localeswitcher.js.old │ ├── panel.html │ ├── rename.html │ ├── serialize-add.html │ ├── serialize-view.html │ ├── serialize.js │ ├── serverinfo.html │ ├── studio.html │ └── studio.js └── views │ ├── cube │ ├── alerts.html │ ├── chart │ │ ├── chart-bars-horizontal.js │ │ ├── chart-bars-vertical.js │ │ ├── chart-common.html │ │ ├── chart-lines.js │ │ ├── chart-pie.js │ │ ├── chart-radar.js │ │ ├── chart-sunburst.js │ │ ├── chart.html │ │ └── chart.js │ ├── cube-menu-drilldown.html │ ├── cube-menu-filter.html │ ├── cube-menu-panel.html │ ├── cube-menu-view.html │ ├── cube.html │ ├── cube.js │ ├── explore │ │ ├── explore.html │ │ └── explore.js │ ├── export.js │ ├── facts │ │ ├── facts.html │ │ └── facts.js │ ├── filter │ │ ├── datefilter.html │ │ ├── datefilter.js │ │ ├── dimension.html │ │ ├── dimension.js │ │ └── rangefilter.js.old │ └── series │ │ ├── operations.js │ │ ├── series.html │ │ └── series.js │ ├── undo.js │ └── views.js ├── dist ├── cubesviewer.css ├── cubesviewer.js └── cubesviewer.min.js ├── doc ├── guide │ ├── cubesviewer-embed.md │ ├── cubesviewer-model.md │ ├── cubesviewer-quickstart.md │ ├── cubesviewer-server-installation.md │ ├── cubesviewer-user-main.md │ └── index.md ├── images │ ├── cubesviewer-logo.png │ ├── cubesviewer-logo.svg │ └── icon │ │ ├── android-chrome-144x144.png │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-36x36.png │ │ ├── android-chrome-48x48.png │ │ ├── android-chrome-72x72.png │ │ ├── android-chrome-96x96.png │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-180x180.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── apple-touch-icon-precomposed.png │ │ ├── apple-touch-icon.png │ │ ├── browserconfig.xml │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── manifest.json │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── mstile-70x70.png │ │ └── safari-pinned-tab.svg ├── jsdoc │ ├── jsdoc.conf.json │ └── layout.tmpl └── screenshots │ ├── view-chart-1.png │ ├── view-chart-2.png │ ├── view-embedded.png │ └── view-explore-1.png ├── html ├── cvapp.css ├── img │ ├── cubes-logo.png │ ├── cubesviewer-logo-embed.png │ ├── cubesviewer-logo.png │ └── favicon │ │ ├── favicon-16x16.png │ │ ├── favicon-194x194.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ └── favicon.ico ├── lib │ ├── angular-bootstrap-slider │ │ └── slider.js │ ├── angular-bootstrap │ │ └── ui-bootstrap-tpls.js │ ├── angular-cookies │ │ └── angular-cookies.js │ ├── angular-ui-grid │ │ ├── animation.less │ │ ├── body.less │ │ ├── bootstrap │ │ │ └── bootstrap.less │ │ ├── cell.less │ │ ├── cellnav │ │ │ └── less │ │ │ │ └── cellNav.less │ │ ├── edit │ │ │ └── less │ │ │ │ └── edit.less │ │ ├── elements.less │ │ ├── expandable │ │ │ └── less │ │ │ │ └── expandable.less │ │ ├── exporter │ │ │ └── less │ │ │ │ └── exporter.less │ │ ├── footer.less │ │ ├── goups.less │ │ ├── grid.less │ │ ├── grouping │ │ │ └── less │ │ │ │ └── grouping.less │ │ ├── header.less │ │ ├── icons.less │ │ ├── importer │ │ │ └── less │ │ │ │ └── importer.less │ │ ├── main.less │ │ ├── menu.less │ │ ├── move-columns │ │ │ └── less │ │ │ │ └── colMovable.less │ │ ├── pagination │ │ │ └── less │ │ │ │ └── pagination.less │ │ ├── pinning │ │ │ └── less │ │ │ │ └── pinning.less │ │ ├── resize-columns │ │ │ └── less │ │ │ │ └── column-resizer.less │ │ ├── row-edit │ │ │ └── less │ │ │ │ └── rowEdit.less │ │ ├── rtl.less │ │ ├── selection │ │ │ └── less │ │ │ │ └── selection.less │ │ ├── sorting.less │ │ ├── tree-base │ │ │ └── less │ │ │ │ └── tree-base.less │ │ ├── tree-view │ │ │ └── less │ │ │ │ └── tree-view.less │ │ ├── ui-grid.css │ │ ├── ui-grid.eot │ │ ├── ui-grid.js │ │ ├── ui-grid.svg │ │ ├── ui-grid.ttf │ │ ├── ui-grid.woff │ │ ├── validate │ │ │ └── less │ │ │ │ └── validate.less │ │ └── variables.less │ ├── angular │ │ └── angular.js │ ├── bootstrap-submenu │ │ ├── css │ │ │ ├── bootstrap-submenu.css │ │ │ ├── bootstrap-submenu.css.map │ │ │ └── bootstrap-submenu.min.css │ │ └── js │ │ │ ├── bootstrap-submenu.js │ │ │ └── bootstrap-submenu.min.js │ ├── bootstrap │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.js │ │ ├── bootstrap.min.css │ │ ├── bootstrap.min.css.map │ │ ├── bootstrap.min.js │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ ├── glyphicons-halflings-regular.woff2 │ │ └── npm.js │ ├── d3 │ │ └── d3.js │ ├── flotr2 │ │ ├── CONTRIBUTING.md │ │ ├── README.md │ │ ├── flotr2.amd.js │ │ ├── flotr2.examples.min.js │ │ ├── flotr2.examples.types.js │ │ ├── flotr2.ie.min.js │ │ ├── flotr2.js │ │ ├── flotr2.min.js │ │ ├── flotr2.nolibs.js │ │ └── package.json │ ├── font-awesome │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ ├── font-awesome.css.map │ │ │ └── font-awesome.min.css │ │ └── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ ├── fontawesome-webfont.woff2 │ │ │ └── index.html │ ├── jquery │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ ├── jquery.min.map │ │ ├── jquery.slim.js │ │ ├── jquery.slim.min.js │ │ └── jquery.slim.min.map │ ├── masonry │ │ └── masonry.pkgd.min.js │ ├── nvd3 │ │ ├── nv.d3.css │ │ └── nv.d3.js │ └── seiyria-bootstrap-slider │ │ ├── bootstrap-slider.css │ │ └── bootstrap-slider.js ├── studio.html ├── views-angular.html └── views.html └── package.json /.gitattributes: -------------------------------------------------------------------------------- 1 | dist/* merge=ours 2 | cubesviewer/cubesviewer.templates.js merge=ours 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | 3 | # C extensions 4 | *.so 5 | 6 | # Packages 7 | *.egg 8 | *.egg-info 9 | #dist 10 | build 11 | eggs 12 | parts 13 | bin 14 | var 15 | sdist 16 | develop-eggs 17 | .installed.cfg 18 | #lib 19 | #lib64 20 | node_modules 21 | bower_components 22 | 23 | # Installer logs 24 | pip-log.txt 25 | 26 | # Unit test / coverage reports 27 | .coverage 28 | .tox 29 | nosetests.xml 30 | 31 | # Translations 32 | *.mo 33 | 34 | # Mr Developer 35 | .mr.developer.cfg 36 | .project 37 | .pydevproject 38 | 39 | # SQLite databases 40 | *.sqlite 41 | 42 | # Eclipse 43 | .settings 44 | 45 | #/ROADMAP 46 | 47 | #/virtualenv 48 | /env 49 | 50 | *.log 51 | *.pyc 52 | local_settings.py 53 | .idea 54 | *.DS_Store 55 | 56 | 57 | /dist 58 | -------------------------------------------------------------------------------- /AUTHORS.txt: -------------------------------------------------------------------------------- 1 | Authors 2 | ======= 3 | 4 | CubesViewer by Jose Juan Montes. 5 | 6 | Development: 7 | 8 | * José Juan Montes 9 | https://twitter.com/jjmontes 10 | 11 | * Stefan Urbanek 12 | http://stiivi.com/ 13 | 14 | Other contributors: 15 | 16 | * Enrique Hernández 17 | * Alexander Bessonov 18 | * Nuno Khan 19 | * Devin Howard 20 | 21 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | grunt.initConfig({ 4 | pkg: grunt.file.readJSON('package.json'), 5 | 6 | concat: { 7 | options: { 8 | separator: ';' 9 | }, 10 | dist: { 11 | src: [ 12 | 'cubesviewer/angular-bootstrap-submenu/angular-bootstrap-submenu.js', 13 | 'cubesviewer/cubes/cubes.js', 14 | 'cubesviewer/cubes/cubes-cvextensions.js', 15 | 'cubesviewer/cubes/cubes-service.js', 16 | 'cubesviewer/cubes/cache.js', 17 | 'cubesviewer/core/cubesviewer.js', 18 | 'cubesviewer/views/views.js', 19 | 'cubesviewer/dialog/dialog.js', 20 | 'cubesviewer/views/cube/cube.js', 21 | 'cubesviewer/views/cube/explore/explore.js', 22 | 'cubesviewer/views/cube/filter/dimension.js', 23 | 'cubesviewer/views/cube/filter/datefilter.js', 24 | 'cubesviewer/views/cube/facts/facts.js', 25 | 'cubesviewer/views/cube/series/series.js', 26 | 'cubesviewer/views/cube/series/operations.js', 27 | 'cubesviewer/views/cube/chart/chart.js', 28 | 'cubesviewer/views/cube/chart/chart-bars-vertical.js', 29 | 'cubesviewer/views/cube/chart/chart-bars-horizontal.js', 30 | 'cubesviewer/views/cube/chart/chart-lines.js', 31 | 'cubesviewer/views/cube/chart/chart-pie.js', 32 | 'cubesviewer/views/cube/chart/chart-radar.js', 33 | 'cubesviewer/views/cube/chart/chart-sunburst.js', 34 | //'cubesviewer/cubesviewer.views.cube.rangefilter.js', 35 | 'cubesviewer/views/cube/export.js', 36 | 'cubesviewer/views/undo.js', 37 | 'cubesviewer/studio/studio.js', 38 | 'cubesviewer/studio/serialize.js', 39 | 40 | 'cubesviewer/server/reststore.js', 41 | 'cubesviewer/ga/googleanalytics.js', 42 | 43 | // The templates file is autogenerated by grunt-angular-templates 44 | 'cubesviewer/cubesviewer.templates.js' 45 | ], 46 | dest: 'dist/<%= pkg.name %>.js' 47 | } 48 | }, 49 | 50 | less: { 51 | options: { 52 | }, 53 | dist: { 54 | files: { 55 | 'dist/cubesviewer.css': 'cubesviewer/cubesviewer.less' 56 | } 57 | } 58 | }, 59 | uglify: { 60 | options: { 61 | banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' 62 | }, 63 | dist: { 64 | files: { 65 | 'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>'] 66 | } 67 | } 68 | }, 69 | copy: { 70 | dist: { 71 | files: [ 72 | { expand: true, cwd: 'dist', src: '*', dest: '../cubesviewer-page/lib/cubesviewer/' }, 73 | { expand: true, cwd: 'dist', src: '*', dest: '../cubesviewer-server/cvapp/cubesviewer/static/lib/cubesviewer/' } 74 | ] 75 | } 76 | }, 77 | qunit: { 78 | files: ['test/**/*.html'] 79 | }, 80 | bower: { 81 | install: { 82 | options: { 83 | targetDir: 'html/lib/', 84 | layout: 'byComponent', 85 | verbose: true 86 | } 87 | } 88 | }, 89 | /* 90 | wiredep: { 91 | dist: { 92 | src: [ 93 | 'html/*.html' 94 | ], 95 | options: { 96 | ignorePath: '../bower_components/', 97 | fileTypes: { 98 | html: { 99 | replace: { 100 | js: '', 101 | css: '' 102 | } 103 | } 104 | } 105 | } 106 | } 107 | }, 108 | */ 109 | jsdoc : { 110 | dist : { 111 | src: ['cubesviewer/**/*.js'], // 'test/*.js' 112 | options: { 113 | destination: 'build/doc', 114 | configure : 'doc/jsdoc/jsdoc.conf.json' 115 | } 116 | } 117 | }, 118 | jshint: { 119 | files: ['Gruntfile.js', 'bower,json', 'cubesviewer/**/*.js', 'cubesviewer/**/*.less', 'test/**/*.js'], 120 | options: { 121 | // options here to override JSHint defaults 122 | globals: { 123 | jQuery: true, 124 | console: true, 125 | module: true, 126 | document: true 127 | } 128 | } 129 | }, 130 | watch: { 131 | files: ['<%= jshint.files %>', 'bower.json', 'cubesviewer/**/**.*'], 132 | tasks: ['default'] // 'copy' 133 | }, 134 | ngtemplates: { 135 | app: { 136 | cwd: 'cubesviewer', 137 | src: '**/**.html', 138 | dest: 'cubesviewer/cubesviewer.templates.js', 139 | options: { 140 | module: "cv", 141 | } 142 | } 143 | } 144 | }); 145 | 146 | grunt.loadNpmTasks('grunt-contrib-uglify'); 147 | grunt.loadNpmTasks('grunt-contrib-jshint'); 148 | //grunt.loadNpmTasks('grunt-contrib-qunit'); 149 | grunt.loadNpmTasks('grunt-contrib-watch'); 150 | grunt.loadNpmTasks('grunt-contrib-copy'); 151 | grunt.loadNpmTasks('grunt-contrib-concat'); 152 | grunt.loadNpmTasks('grunt-contrib-less'); 153 | grunt.loadNpmTasks('grunt-bower-task') 154 | //grunt.loadNpmTasks('grunt-wiredep'); 155 | grunt.loadNpmTasks('grunt-angular-templates'); 156 | grunt.loadNpmTasks('grunt-jsdoc'); 157 | 158 | grunt.registerTask('test', ['jshint']); // 'qunit' 159 | 160 | grunt.registerTask('default', ['less', 'ngtemplates', 'concat', 'uglify', 'jsdoc']); // 'bower', 161 | 162 | }; 163 | 164 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | CubesViewer 2 | Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | -------------------------------------------------------------------------------- /RELEASE-NOTES.md: -------------------------------------------------------------------------------- 1 | 2 | CubesViewer 2.0 Release Notes 3 | ============================= 4 | 5 | CubesViewer is a visual, web-based tool application for exploring and analyzing 6 | OLAP databases served by the Cubes OLAP Framework. 7 | 8 | CubesViewer can be used for data exploration and data auditory, 9 | generation of reports, chart design and embedding, 10 | and as a (simple) company-wide analytics application. 11 | 12 | * [CubesViewer Official Site](http://www.cubesviewer.com) 13 | * [CubesViewer at GitHub](https://github.com/jjmontesl/cubesviewer) 14 | 15 | 16 | 2.0 Release Notes 17 | ----------------- 18 | 19 | This is a major release of CubesViewer featuring tons of improvements, new 20 | features, a rebranded look and feel as well as a new code architecture 21 | that greatly eases development and paves the way for following versions. 22 | 23 | CubesViewer has undergone a major upgrade. The code is now built upon 24 | *AngularJS*, and the UI framework has been migrated from jQueryUI to 25 | *Bootstrap* and *Angular Bootstrap* components. HTML has been rewritten 26 | and separated into easier to handle templates. 27 | 28 | The application is now more *responsive* and *mobile friendly* 29 | and looks more stylish overall. CSS has been reworked and namespaced, 30 | easing integration into other web documents. 31 | 32 | Migration to AngularJS has involved an comprehensive 33 | refactoring and review of every module, and we trust it's been for the better. 34 | Internally, the build pipeline now uses *Less*, *Grunt* and *Bower*, and a lot 35 | of dependencies have been removed. All together allow CubesViewer to now be 36 | distributed as a single `.js` file (minified version also available) and 37 | accompanying `.css` file. *JSDoc* has also been introduced. 38 | 39 | Other additions feature: 40 | 41 | * Printer friendly CSS. 42 | * Export charts as images. 43 | * New horizontal bars chart. 44 | * Line and area charts with curved lines. 45 | * Improved error reporting and user interface. 46 | * CubesViewer Server (optional) upgraded to Django 1.9. 47 | * Plugin for cube usage tracking via Google Analytics. 48 | * Improved documentation and tutorials. 49 | 50 | Make sure you read the [Changelog]() for the full list of changes. 51 | 52 | Special thanks to Stefan Urbanek, Devin Howard and all the other 53 | contributors and users for your support and collaboration. 54 | 55 | 56 | Requirements 57 | ------------ 58 | 59 | CubesViewer consists of two parts: 60 | 61 | **CubesViewer client** is a HTML5 application that runs on any modern browser. 62 | It can run without server side support. **Simply download the package and open** 63 | `html/studio.html` in your favorite browser. Views can also be embedded in other sites. 64 | 65 | CubesViewer also features an optional **server side application** 66 | which provides a full web application and supports features like sharing/saving views. 67 | This project lives on a separate repository: [CubesViewer Server](https://github.com/jjmontesl/cubesviewer-server) 68 | (not to be confused with Cubes Server itself). 69 | 70 | You need a configured and running [Cubes Server](http://databrewery.org/cubes.html) version 1.0.x or later. 71 | Your Cubes model may need some extra configuration if you wish to use features like date filters. 72 | 73 | 74 | Upgrading from 2.0.1 75 | -------------------- 76 | 77 | 1. A new Javascript dependency (masonry) has been added to the Studio application 78 | (this does not apply if you are using CubesViewer Server or embedding CubesViewer 79 | views: only if embedding CubesViewer Studio). Check the sample `html/studio.html` 80 | for an up to date list of dependencies. 81 | 82 | 83 | Upgrading from 0.10 or 0.11 84 | --------------------------- 85 | 86 | 1. If you are integrating CubesViewer in your HTML, note that the code needed for 87 | initializing CubesViewer has changed slightly. The list of Javascript and CSS 88 | dependencies has also changed. Refer to the [Embedding CubesViewer] for detailed 89 | instructions on integrating views and the full list of initialization options. 90 | 91 | 2. View definitions are (partially) backwards compatible, but some of the attributes 92 | have changed (ie. column width definition). If you or your users have stored view 93 | definitions, either via CubesViewer Server or any other JSON view definition, 94 | it is recommended to test drive your existing view definitions to check they 95 | show up as expected. 96 | 97 | 3. The "Range Filter" feature hasn't yet been upgraded from previous version and 98 | is not available. If you were using "Range Filter" these will not show up. 99 | 100 | 4. Column sorting now follows `order_attribute` from model. Depending on your 101 | model definition, you may find that some columns are not ordered as in 0.x. 102 | See documentation "CubesViewer Model options" for details. 103 | 104 | 5. For CubesViewer clients to connect to Cubes server ("slicer"), your Cubes server 105 | possibly needs to allow cross origin resource sharing (CORS). To enable it, 106 | add `allow_cors_origin: *` (or a more restrictive setting) 107 | under the `[server]` section of the `slicer.ini` file. 108 | 109 | 6. If you are using CubesViewer Server, you need to upgrade your database after 110 | upgrading the application package. As with any Django app, 111 | run `python manage.py migrate`. 112 | 113 | 114 | For complete installation instructions, see the 115 | [CubesViewer Documentation](http://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/index.md). 116 | 117 | 118 | Upgrading from 0.9 or earlier 119 | ----------------------------- 120 | 121 | CubesViewer 0.9 supported older Cubes 0.10.x. This version of Cubes is no longer supported 122 | by CubesViewer and thus you need to upgrade your Cubes Server installation first and 123 | reinstall CubesViewer. 124 | 125 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cubesviewer", 3 | "description": "CubesViewer JS client app", 4 | "main": "cubesviewer", 5 | "authors": [ 6 | "Jose Juan Montes " 7 | ], 8 | "license": "MIT", 9 | "keywords": [ 10 | "olap", 11 | "visualization", 12 | "cubes" 13 | ], 14 | "homepage": "https://github.com/jjmontesl/cubesviewer", 15 | "moduleType": [ 16 | "globals" 17 | ], 18 | "ignore": [ 19 | "**/.*", 20 | "node_modules", 21 | "bower_components", 22 | "test", 23 | "tests" 24 | ], 25 | "dependencies": { 26 | "jquery": "2.2.3", 27 | "nvd3": "1.8.2", 28 | "bootstrap": "3.3.6", 29 | "flotr2": "*", 30 | "font-awesome": "Font-Awesome#4.6.1", 31 | "bootstrap-submenu": "^2.0.4", 32 | "angular": "^1.5.5", 33 | "angular-bootstrap": "1.3.2", 34 | "angular-ui-grid": "^3.1.1", 35 | "angular-bootstrap-slider": "^0.1.27", 36 | "angular-cookies": "^1.5.5" 37 | }, 38 | "exportsOverride": { 39 | "jquery": { 40 | "/": "dist/**/*.*" 41 | }, 42 | "bootstrap": { 43 | "/": "dist/**/*.*" 44 | }, 45 | "bootstrap-submenu": { 46 | "css": "dist/css/*.*", 47 | "js": "dist/js/*.*" 48 | }, 49 | "font-awesome": { 50 | "css": "css/*.*", 51 | "fonts": "fonts/*.*" 52 | }, 53 | "flotr2": { 54 | "/": "*.*" 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /cubesviewer/angular-bootstrap-submenu/angular-bootstrap-submenu.js: -------------------------------------------------------------------------------- 1 | /* 2 | * angular-bootstrap-submenu 3 | * Copyright (c) 2016 Jose Juan Montes 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | "use strict"; 25 | 26 | 27 | angular.module('bootstrapSubmenu', []).directive("submenu", ['$timeout', function($timeout) { 28 | return { 29 | restrict: 'A', 30 | link: function(scope, iElement, iAttrs) { 31 | // FIXME: This is not a proper way of waiting for the menu to be constructed. 32 | $timeout(function() { 33 | $(iElement).submenupicker(); 34 | }, 500); 35 | } 36 | }; 37 | }]); 38 | 39 | -------------------------------------------------------------------------------- /cubesviewer/cubes/cache.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | "use strict"; 25 | 26 | angular.module('cv.cubes').service("cubesCacheService", ['$rootScope', '$log', 'cvOptions', 'cubesService', 'gaService', 27 | function ($rootScope, $log, cvOptions, cubesService, gaService) { 28 | 29 | var cubesCacheService = this; 30 | 31 | this.cache = {}; 32 | 33 | this._cacheOverridedCubesRequest = null; 34 | 35 | this.initialize = function() { 36 | if (this._cacheOverridedCubesRequest) { 37 | $log.warn("Error: tried to initialize CubesCacheService but it was already initialized.") 38 | return; 39 | } 40 | if (cvOptions.cacheEnabled) { 41 | // Replace request function 42 | $log.debug("Replacing Cubes request method with caching version.") 43 | cubesCacheService._cacheOverridedCubesRequest = cubesService.cubesRequest; 44 | cubesService.cubesRequest = cubesCacheService.cachedCubesRequest; 45 | } 46 | }; 47 | 48 | this.cachedCubesRequest = function(path, params, successCallback, errCallback) { 49 | 50 | cubesCacheService._cacheCleanup(); 51 | 52 | var requestHash = path + "?" + $.param(params); 53 | var jqxhr = null; 54 | if (requestHash in cubesCacheService.cache && cvOptions.cacheEnabled) { 55 | 56 | // Warn that data comes from cache (QTip can do this?) 57 | var timediff = Math.round ((new Date().getTime() - cubesCacheService.cache[requestHash].time) / 1000); 58 | if (timediff > cvOptions.cacheNotice) { 59 | //cubesviewer.showInfoMessage("Data loaded from cache
(" + timediff + " minutes old)", 1000); 60 | $log.debug("Data loaded from cache (" + Math.floor(timediff / 60, 2) + " minutes old)"); 61 | } 62 | 63 | jqxhr = $.Deferred(); 64 | jqxhr.error = function() { }; 65 | 66 | setTimeout(function() { 67 | // TODO: What is the correct ordering of success/complete callbacks? 68 | successCallback(cubesCacheService.cache[requestHash].data); 69 | jqxhr.resolve(); //.promise(); 70 | }, 0); 71 | 72 | gaService.trackRequest(path); 73 | 74 | } else { 75 | // Do request 76 | jqxhr = cubesCacheService._cacheOverridedCubesRequest(path, params, cubesCacheService._cacheCubesRequestSuccess(successCallback, requestHash), errCallback); 77 | } 78 | 79 | return jqxhr; 80 | }; 81 | 82 | /* 83 | * Reviews the cache and removes old elements and oldest if too many 84 | */ 85 | this._cacheCleanup = function() { 86 | 87 | var cacheDuration = cvOptions.cacheDuration; 88 | var cacheSize = cvOptions.cacheSize; 89 | 90 | var oldestTime = new Date().getTime() - (1000 * cacheDuration); 91 | 92 | var elements = []; 93 | for (var element in cubesCacheService.cache) { 94 | if (cubesCacheService.cache[element].time < oldestTime) { 95 | delete cubesCacheService.cache[element]; 96 | } else { 97 | elements.push (element); 98 | } 99 | } 100 | 101 | elements.sort(function(a, b) { 102 | return (cubesCacheService.cache[a].time - cubesCacheService.cache[b].time); 103 | }); 104 | if (elements.length >= cacheSize) { 105 | for (var i = 0; i < elements.length - cacheSize; i++) { 106 | delete cubesCacheService.cache[elements[i]]; 107 | } 108 | } 109 | 110 | } 111 | 112 | this._cacheCubesRequestSuccess = function(pCallback, pRequestHash) { 113 | var requestHash = pRequestHash; 114 | var callback = pCallback; 115 | return function(data) { 116 | // TODO: Check if cache is enabled 117 | cubesCacheService.cache[pRequestHash] = { 118 | "time": new Date().getTime(), 119 | "data": data 120 | }; 121 | pCallback(data); 122 | }; 123 | }; 124 | 125 | }]); 126 | 127 | -------------------------------------------------------------------------------- /cubesviewer/dialog/dialog.html: -------------------------------------------------------------------------------- 1 | 5 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /cubesviewer/dialog/dialog.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | "use strict"; 25 | 26 | angular.module('cv.views').service("dialogService", ['$rootScope', '$uibModal', 'cvOptions', 'cubesService', 27 | function ($rootScope, $uibModal, cvOptions, cubesService) { 28 | 29 | var dialogService = this; 30 | 31 | this.initialize = function() { 32 | $("body").append('
'); 33 | }; 34 | 35 | this.show = function(text) { 36 | 37 | var modalInstance = $uibModal.open({ 38 | animation: true, 39 | templateUrl: 'dialog/dialog.html', 40 | controller: 'CubesViewerViewsDialogController', 41 | appendTo: angular.element($("body").find('.cv-modals')[0]), 42 | resolve: { 43 | dialog: function() { return { 'text': text }; } 44 | }, 45 | /* 46 | size: size, 47 | */ 48 | }); 49 | 50 | modalInstance.result.then(function (selectedItem) { 51 | //$scope.selected = selectedItem; 52 | }, function () { 53 | //console.debug('Modal dismissed at: ' + new Date()); 54 | }); 55 | 56 | }; 57 | 58 | this.initialize(); 59 | 60 | }]); 61 | 62 | 63 | /** 64 | */ 65 | angular.module('cv.views').controller("CubesViewerViewsDialogController", ['$rootScope', '$scope', '$timeout', '$uibModalInstance', 'cvOptions', 'cubesService', 'viewsService', 'dialog', 66 | function ($rootScope, $scope, $timeout, $uibModalInstance, cvOptions, cubesService, viewsService, dialog) { 67 | 68 | $scope.$rootScope = $rootScope; 69 | 70 | $scope.dialog = dialog; 71 | 72 | $scope.close = function() { 73 | $uibModalInstance.dismiss('cancel'); 74 | }; 75 | 76 | 77 | }]); 78 | 79 | -------------------------------------------------------------------------------- /cubesviewer/ga/googleanalytics.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | 26 | /* 27 | * Google Analytics events tracking service. 28 | * 29 | * When enabled, it uses Google Analytics event system to 30 | * log CubesViewer operations. Model loading, Aggregations, Facts and Dimension queries 31 | * are registered as non-interactive events (and don't affect bounce rate). Each 32 | * view refresh is registered as an interactive event. 33 | * 34 | */ 35 | 36 | 37 | "use strict"; 38 | 39 | angular.module('cv.cubes').service("gaService", ['$rootScope', '$http', '$cookies', '$log', 'cvOptions', 40 | function ($rootScope, $http, $cookies, $log, cvOptions) { 41 | 42 | var gaService = this; 43 | 44 | this.ignorePeriod = 12; // 35 45 | 46 | this.initTime = new Date(); 47 | 48 | this.initialize = function() { 49 | if (cvOptions.gaTrackEvents) $log.debug("Google Analytics events tracking plugin enabled.") 50 | }; 51 | 52 | this.trackRequest = function(path) { 53 | 54 | if (! (cvOptions.gaTrackEvents)) return; 55 | if ((((new Date()) - this.initTime) / 1000) < this.ignorePeriod) return; 56 | 57 | // Track request, through Google Analytics events API 58 | var event = null; 59 | var pathParts = path.split("/"); 60 | var modelPos = pathParts.indexOf("cube"); 61 | 62 | if (modelPos >= 0) { 63 | pathParts = pathParts.slice(modelPos + 1); 64 | 65 | if (pathParts[1] == "model") { 66 | event = ['model', pathParts[0]]; 67 | } else if (pathParts[1] == "aggregate") { 68 | event = ['aggregate', pathParts[0]]; 69 | } else if (pathParts[1] == "facts") { 70 | event = ['facts', pathParts[0]]; 71 | } else if (pathParts[1] == "members") { 72 | event = ['dimension', pathParts[2]]; 73 | } 74 | } 75 | 76 | 77 | if (event) { 78 | if (typeof ga !== 'undefined') { 79 | ga('send', 'event', "CubesViewer", event[0], event[1]); 80 | $log.debug("Tracking GA event: " + event[0] + "/" + event[1]); 81 | } else { 82 | $log.debug("Cannot track CubesViewer events: GA object 'ga' not available.") 83 | } 84 | } else { 85 | $log.warn("Unknown cubes operation, cannot be tracked by GA service: " + path) 86 | } 87 | 88 | }; 89 | 90 | this.initialize(); 91 | 92 | }]); 93 | 94 | 95 | -------------------------------------------------------------------------------- /cubesviewer/studio/about.html: -------------------------------------------------------------------------------- 1 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /cubesviewer/studio/localeswitcher.js.old: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | /* 26 | * Locale switcher button. 27 | */ 28 | function cubesviewerGuiLocaleSwitcher() { 29 | 30 | this.cubesviewer = cubesviewer; 31 | 32 | /* 33 | * Draw GUI options 34 | */ 35 | this.onGuiDraw = function(event, gui) { 36 | 37 | $(gui.options.container).find('.cv-gui-tools').prepend( 38 | '
' + 39 | 'Language: ' + 40 | '' + 43 | '
' 44 | ); 45 | 46 | $('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).change(function() { 47 | cubesviewer.gui.localeswitcher.selectLocale(gui, $(this).val()); 48 | }); 49 | 50 | } 51 | 52 | /* 53 | * Draw languages from model 54 | */ 55 | this.onCubesviewerRefresh = function(event, data) { 56 | 57 | var gui = event.data.gui; 58 | var cubesviewer = gui.cubesviewer; 59 | 60 | // Add locales (clean list first) 61 | $('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).empty(); 62 | $('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).append( 63 | '' 64 | ); 65 | $(cubesviewer.model["locales"]).each( 66 | function(idx, locale) { 67 | $('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).append( 68 | '' 69 | ); 70 | } 71 | ); 72 | 73 | // Selected language 74 | $('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).val(gui.cubesviewer.options.cubesLang); 75 | 76 | } 77 | 78 | 79 | /* 80 | * Select cubes locale (at the time just changes . 81 | */ 82 | this.selectLocale = function(gui, locale) { 83 | 84 | gui.cubesviewer.changeCubesLang (locale); 85 | 86 | }; 87 | 88 | }; 89 | 90 | /* 91 | * Create object. 92 | */ 93 | cubesviewer.gui.localeswitcher = new cubesviewerGuiLocaleSwitcher(); 94 | 95 | /* 96 | * Bind events. 97 | */ 98 | $(document).bind("cubesviewerGuiDraw", { }, cubesviewer.gui.localeswitcher.onGuiDraw); 99 | $(document).bind("cubesviewerRefresh", { "gui": cubesviewer.gui }, cubesviewer.gui.localeswitcher.onCubesviewerRefresh); 100 | -------------------------------------------------------------------------------- /cubesviewer/studio/panel.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 | 7 | 8 | 9 | {{ view.params.name }} 10 | 11 | Modified 12 | Saved 13 | Shared 14 | 15 | 16 | 17 |
18 |
19 |
20 | 21 |
22 | 23 |
24 |
25 |
26 | 27 |
28 | -------------------------------------------------------------------------------- /cubesviewer/studio/rename.html: -------------------------------------------------------------------------------- 1 | 5 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /cubesviewer/studio/serialize-add.html: -------------------------------------------------------------------------------- 1 | 5 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /cubesviewer/studio/serialize.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | "use strict"; 25 | 26 | /** 27 | * View serialization inteface. This is an optional component. 28 | * Provides visual assistance for serializing views and instancing of views from 29 | * serialized data. Note that only the view parameters are serialized, 30 | * but not data. The Cubes Server still needs to be available to serve data. 31 | * This serialized strings can also be used to initialize different views from code, 32 | * which is handy when these are going to be instantiated from code later on 33 | * (ie. when embedding views on a web site). 34 | */ 35 | angular.module('cv.studio').controller("CubesViewerSerializeViewController", ['$rootScope', '$scope', '$timeout', '$uibModalInstance', 'element', 'cvOptions', 'cubesService', 'studioViewsService', 'viewsService', 'view', 36 | function ($rootScope, $scope, $timeout, $uibModalInstance, element, cvOptions, cubesService, studioViewsService, viewsService, view) { 37 | 38 | $scope.cvVersion = cubesviewer.version; 39 | $scope.cvOptions = cvOptions; 40 | $scope.cubesService = cubesService; 41 | $scope.studioViewsService = studioViewsService; 42 | 43 | $scope.serializedView = ""; 44 | 45 | $scope.initialize = function() { 46 | 47 | $scope.serializedView = viewsService.serializeView(view); 48 | console.log("Serialized view: " + $scope.serializedView); 49 | 50 | $timeout(function() { 51 | window.getSelection().removeAllRanges(); 52 | var range = document.createRange(); 53 | range.selectNodeContents($(element).find(".cv-serialized-view")[0]); 54 | window.getSelection().addRange(range); 55 | } , 0); 56 | 57 | }; 58 | 59 | $scope.close = function() { 60 | $uibModalInstance.dismiss('cancel'); 61 | }; 62 | 63 | $scope.initialize(); 64 | 65 | }]); 66 | 67 | 68 | angular.module('cv.studio').controller("CubesViewerSerializeAddController", ['$rootScope', '$scope', '$uibModalInstance', 'cvOptions', 'cubesService', 'studioViewsService', 69 | function ($rootScope, $scope, $uibModalInstance, cvOptions, cubesService, studioViewsService) { 70 | 71 | $scope.cvVersion = cubesviewer.version; 72 | $scope.cvOptions = cvOptions; 73 | $scope.cubesService = cubesService; 74 | $scope.studioViewsService = studioViewsService; 75 | 76 | $scope.serializedView = null; 77 | 78 | /* 79 | * Add a serialized view. 80 | */ 81 | $scope.addSerializedView = function (serialized) { 82 | if (serialized != null) { 83 | var view = studioViewsService.addViewObject(serialized); 84 | } 85 | $uibModalInstance.close(serialized); 86 | }; 87 | 88 | $scope.close = function() { 89 | $uibModalInstance.dismiss('cancel'); 90 | }; 91 | 92 | }]); 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /cubesviewer/studio/serverinfo.html: -------------------------------------------------------------------------------- 1 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/alerts.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 | An error has occurred. Cannot present view.
7 | Please try again and contact your administrator if the problem persists. 8 |
9 |
10 | 11 |
12 | 13 |
14 |
15 | Limit of {{ cubesService.cubesserver.info.json_record_limit }} items has been hit. Results are incomplete.
16 | Tip: reduce level of drilldown or filter your selection to reduce the number of items in the result. 17 |
18 |
19 | 20 |
21 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/chart/chart-bars-vertical.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | /* 25 | * Series chart object. Contains view functions for the 'chart' mode. 26 | * This is an optional component, part of the cube view. 27 | */ 28 | 29 | "use strict"; 30 | 31 | angular.module('cv.views.cube').controller("CubesViewerViewsCubeChartBarsVerticalController", ['$rootScope', '$scope', '$element', '$timeout', 'cvOptions', 'cubesService', 'viewsService', 32 | function ($rootScope, $scope, $element, $timeout, cvOptions, cubesService, viewsService) { 33 | 34 | $scope.chart = null; 35 | 36 | $scope.initialize = function() { 37 | }; 38 | 39 | $scope.$on('gridDataUpdated', function() { 40 | $scope.chartCtrl.cleanupNvd3(); 41 | $timeout(function() { 42 | $scope.drawChartBarsVertical(); 43 | }, 0); 44 | }); 45 | 46 | /** 47 | * Draws a vertical bars chart. 48 | */ 49 | $scope.drawChartBarsVertical = function () { 50 | 51 | var view = $scope.view; 52 | var dataRows = $scope.view.grid.data; 53 | var columnDefs = view.grid.columnDefs; 54 | 55 | var container = $($element).find("svg").get(0); 56 | var xAxisLabel = ( (view.params.xaxis != null) ? view.cube.dimensionParts(view.params.xaxis).label : "None") 57 | 58 | var d = []; 59 | 60 | var numRows = dataRows.length; 61 | var serieCount = 0; 62 | $(dataRows).each(function(idx, e) { 63 | var serie = []; 64 | for (var i = 1; i < columnDefs.length; i++) { 65 | var value = e[columnDefs[i].name]; 66 | serie.push( { "x": columnDefs[i].name, "y": (value != undefined) ? value : 0 } ); 67 | } 68 | var series = { "values": serie, "key": e["key"] != "" ? e["key"] : view.params.yaxis }; 69 | if (view.params["chart-disabledseries"]) { 70 | if (view.params["chart-disabledseries"]["key"] == (view.params.drilldown.join(","))) { 71 | series.disabled = !! view.params["chart-disabledseries"]["disabled"][series.key]; 72 | } 73 | } 74 | d.push(series); 75 | serieCount++; 76 | }); 77 | d.sort(function(a,b) { return a.key < b.key ? -1 : (a.key > b.key ? +1 : 0) }); 78 | 79 | /* 80 | xticks = []; 81 | for (var i = 1; i < colNames.length; i++) { 82 | xticks.push([ i * 10, colNames[i] ]); 83 | } 84 | */ 85 | 86 | var chartOptions = { 87 | //barColor: d3.scale.category20().range(), 88 | delay: 1200, 89 | groupSpacing: 0.1, 90 | //reduceXTicks: false, 91 | //staggerLabels: true 92 | }; 93 | 94 | var ag = $.grep(view.cube.aggregates, function(ag) { return ag.ref == view.params.yaxis })[0]; 95 | var colFormatter = $scope.columnFormatFunction(ag); 96 | 97 | nv.addGraph(function() { 98 | var chart = nv.models.multiBarChart() 99 | //.margin({bottom: 100}) 100 | .showLegend(!!view.params.chartoptions.showLegend) 101 | .margin({left: 120}); 102 | 103 | if (view.params["chart-barsvertical-stacked"]) { 104 | chart.stacked ( view.params["chart-barsvertical-stacked"] ); 105 | } 106 | 107 | chart.options(chartOptions); 108 | chart.multibar.hideable(true); 109 | 110 | //chart.xAxis.axisLabel(xAxisLabel).showMaxMin(true).tickFormat(d3.format(',0f')); 111 | chart.xAxis.axisLabel(xAxisLabel); 112 | 113 | //chart.yAxis.tickFormat(d3.format(',.2f')); 114 | chart.yAxis.tickFormat(function(d,i) { 115 | return colFormatter(d); 116 | }); 117 | 118 | d3.select(container) 119 | .datum(d) 120 | .call(chart); 121 | 122 | //nv.utils.windowResize(chart.update); 123 | 124 | // Handler for state change 125 | chart.dispatch.on('stateChange', function(newState) { 126 | view.params["chart-barsvertical-stacked"] = newState.stacked; 127 | view.params["chart-disabledseries"] = { 128 | "key": view.params.drilldown.join(","), 129 | "disabled": {} 130 | }; 131 | for (var i = 0; i < newState.disabled.length; i++) { 132 | view.params["chart-disabledseries"]["disabled"][d[i]["key"]] = newState.disabled[i]; 133 | } 134 | view.updateUndo(); 135 | }); 136 | 137 | //chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); }); 138 | 139 | $scope.chartCtrl.chart = chart; 140 | 141 | return chart; 142 | 143 | }); 144 | 145 | } 146 | 147 | $scope.initialize(); 148 | 149 | }]); 150 | 151 | 152 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/chart/chart-common.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 | Small 8 | Medium 9 | Tall 10 |
11 |
12 |
13 | 14 |
15 |

16 | Cannot present chart: no measure has been selected. 17 |

18 |

19 | Tip: use the View > Measure menu. 20 |

21 |
22 | 23 |
24 |

25 | Cannot present chart: no rows returned by the current filtering, horizontal dimension, and drilldown combination. 26 |

27 |

28 | Tip: use the View menu to select an horizontal dimension. 29 |

30 |
31 | 32 |
33 |

34 | Cannot present a pie chart when more than one column is present.
35 |

36 |

37 | Tip: review chart data and columns in series mode, 38 | or remove horizontal dimension. 39 |

40 |
41 | 42 |
43 | Cannot present a radar chart when less than 3 columns are present.
44 | Tip: review chart data and columns in series mode. 45 |
46 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/chart/chart-pie.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | /* 25 | * Series chart object. Contains view functions for the 'chart' mode. 26 | * This is an optional component, part of the cube view. 27 | */ 28 | 29 | "use strict"; 30 | 31 | angular.module('cv.views.cube').controller("CubesViewerViewsCubeChartPieController", ['$rootScope', '$scope', '$element', '$timeout', 'cvOptions', 'cubesService', 'viewsService', 32 | function ($rootScope, $scope, $element, $timeout, cvOptions, cubesService, viewsService) { 33 | 34 | $scope.chart = null; 35 | 36 | $scope.initialize = function() { 37 | }; 38 | 39 | $scope.$on('gridDataUpdated', function() { 40 | $scope.chartCtrl.cleanupNvd3(); 41 | $timeout(function() { 42 | $scope.drawChartPie(); 43 | }, 0); 44 | }); 45 | 46 | /** 47 | */ 48 | $scope.drawChartPie = function () { 49 | 50 | var view = $scope.view; 51 | var dataRows = $scope.view.grid.data; 52 | var columnDefs = view.grid.columnDefs; 53 | 54 | var container = $($element).find("svg").get(0); 55 | 56 | var xAxisLabel = ( (view.params.xaxis != null) ? view.cube.dimensionParts(view.params.xaxis).label : "None") 57 | 58 | var d = []; 59 | 60 | var numRows = dataRows.length; 61 | var serieCount = 0; 62 | $(dataRows).each(function(idx, e) { 63 | var serie = []; 64 | var value = e[columnDefs[1].field]; 65 | if ((value != undefined) && (value > 0)) { 66 | 67 | var series = { "y": value, "key": e["key"] != "" ? e["key"] : columnDefs[0].name }; 68 | if (view.params["chart-disabledseries"]) { 69 | if (view.params["chart-disabledseries"]["key"] == (view.params.drilldown.join(","))) { 70 | series.disabled = !! view.params["chart-disabledseries"]["disabled"][series.key]; 71 | } 72 | } 73 | 74 | d.push(series); 75 | serieCount++; 76 | 77 | } 78 | 79 | }); 80 | d.sort(function(a,b) { return a.y < b.y ? -1 : (a.y > b.y ? +1 : 0) }); 81 | 82 | var xticks = []; 83 | for (var i = 1; i < columnDefs.length; i++) { 84 | xticks.push([ i - 1, columnDefs[i].name ]); 85 | } 86 | 87 | var ag = $.grep(view.cube.aggregates, function(ag) { return ag.ref == view.params.yaxis })[0]; 88 | var colFormatter = $scope.columnFormatFunction(ag); 89 | 90 | nv.addGraph(function() { 91 | 92 | var chart = nv.models.pieChart() 93 | .x(function(d) { return d.key }) 94 | .y(function(d) { return d.y }) 95 | .showLegend(!!view.params.chartoptions.showLegend) 96 | .margin({bottom: 20, top: 20}) 97 | //.color(d3.scale.category20().range()) 98 | //.width(width) 99 | //.height(height) 100 | .labelType("percent"); 101 | //.donut(true); 102 | 103 | /* 104 | chart.pie 105 | .startAngle(function(d) { return d.startAngle/2 -Math.PI/2 }) 106 | .endAngle(function(d) { return d.endAngle/2 -Math.PI/2 }); 107 | */ 108 | 109 | chart.valueFormat(function(d,i) { 110 | return colFormatter(d); 111 | }); 112 | 113 | d3.select(container) 114 | .datum(d) 115 | //.attr('width', width) 116 | //.attr('height', height) 117 | .call(chart); 118 | 119 | //nv.utils.windowResize(chart.update); 120 | 121 | // Handler for state change 122 | chart.dispatch.on('stateChange', function(newState) { 123 | view.params["chart-disabledseries"] = { 124 | "key": view.params.drilldown.join(","), 125 | "disabled": {} 126 | }; 127 | for (var i = 0; i < newState.disabled.length; i++) { 128 | view.params["chart-disabledseries"]["disabled"][d[i]["key"]] = newState.disabled[i]; 129 | } 130 | view.updateUndo(); 131 | }); 132 | 133 | $scope.chartCtrl.chart = chart; 134 | return chart; 135 | }); 136 | 137 | }; 138 | 139 | $scope.initialize(); 140 | 141 | }]); 142 | 143 | 144 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/chart/chart-radar.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | /* 25 | * Series chart object. Contains view functions for the 'chart' mode. 26 | * This is an optional component, part of the cube view. 27 | */ 28 | 29 | "use strict"; 30 | 31 | angular.module('cv.views.cube').controller("CubesViewerViewsCubeChartRadarController", ['$rootScope', '$scope', '$element', '$timeout', 'cvOptions', 'cubesService', 'viewsService', 32 | function ($rootScope, $scope, $element, $timeout, cvOptions, cubesService, viewsService) { 33 | 34 | $scope.chart = null; 35 | 36 | $scope.initialize = function() { 37 | }; 38 | 39 | $scope.$on('gridDataUpdated', function() { 40 | $timeout(function() { 41 | $scope.drawChartRadar(); 42 | }, 2000); 43 | }); 44 | $scope.$watch('cvOptions.studioTwoColumn', function() { 45 | $timeout(function() { 46 | $scope.drawChartRadar(); 47 | }, 2000); 48 | }); 49 | 50 | $scope.$on("ViewResize", function (){ 51 | $scope.$apply(function(){ 52 | $scope.drawChartRadar(); 53 | }); 54 | }); 55 | 56 | 57 | /** 58 | */ 59 | $scope.drawChartRadar = function () { 60 | 61 | var view = $scope.view; 62 | var dataRows = $scope.view.grid.data; 63 | var columnDefs = view.grid.columnDefs; 64 | 65 | var container = $($element).find(".cv-chart-container")[0]; 66 | $(container).empty(); 67 | $(container).height(400); 68 | 69 | var d = []; 70 | 71 | var numRows = dataRows.length; 72 | $(dataRows).each(function(idx, e) { 73 | var serie = []; 74 | for (var i = 1; i < columnDefs.length; i++) { 75 | var value = e[columnDefs[i].field]; 76 | if (value != undefined) { 77 | serie.push( [i-1, value] ); 78 | } else { 79 | serie.push( [i-1, 0] ); 80 | } 81 | } 82 | d.push({ data: serie, label: e["key"] != "" ? e["key"] : view.params.yaxis }); 83 | }); 84 | d.sort(function(a,b) { return a.label < b.label ? -1 : (a.label > b.label ? +1 : 0) }); 85 | 86 | var xticks = []; 87 | for (var i = 1; i < columnDefs.length; i++) { 88 | xticks.push([ i - 1, columnDefs[i].name ]); 89 | } 90 | 91 | var flotrOptions = { 92 | //HtmlText: ! view.doExport, 93 | HtmlText: false, 94 | shadowSize: 2, 95 | height: 350, 96 | radar: { 97 | show: true, 98 | fill: numRows < 4, 99 | fillOpacity: 0.2 100 | }, 101 | mouse: { 102 | track: false, 103 | relative: true 104 | }, 105 | grid: { 106 | circular: true, 107 | minorHorizontalLines: true 108 | }, 109 | xaxis: { 110 | ticks: xticks 111 | }, 112 | yaxis: { 113 | }, 114 | legend: { 115 | show: (!!view.params.chartoptions.showLegend), 116 | position: "se", 117 | backgroundColor: "#D2E8FF" 118 | } 119 | }; 120 | $scope.flotrDraw = Flotr.draw(container, d, flotrOptions); 121 | 122 | }; 123 | 124 | $scope.initialize(); 125 | 126 | }]); 127 | 128 | 129 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/chart/chart.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |

Chart 5 | 6 |

7 |
8 | 9 |
10 |
11 |
12 |
13 |
14 | 15 |
16 |

Chart 17 | 18 |

19 |
20 | 21 |
22 |
23 |
24 |
25 |
26 | 27 |
28 |

Chart 29 | 30 |

31 |
32 | 33 |
34 |
35 |
36 |
37 |
38 | 39 |
40 |

Chart 41 | 42 |

43 |
44 | 45 |
46 |
47 |
48 |
49 |
50 | 51 |
52 |

Chart 53 | 54 |

55 |
56 | 57 |
58 |
59 |
60 |
61 |
62 | 63 |
64 |

Chart 65 | 66 |

67 |
68 | 69 |
70 |
71 |
72 |
73 |
74 | 75 |
76 |

Chart 77 | 78 |

79 |
80 | 81 |
82 |
83 |
84 |
85 |
86 | 87 |
88 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/cube-menu-drilldown.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 34 | 35 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/cube-menu-filter.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 90 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/cube-menu-panel.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/explore/explore.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |

Aggregated data 5 | 6 |

7 | 8 |
9 | 10 |
11 | 12 |
16 |
17 |
 
18 | 19 |
20 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/export.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | /* 25 | * This addon adds export to CSV capability to CubesViewer cube view. 26 | * It offers an "export facts" menu option for all cube view modes, 27 | * and a "export table" option in Explore and Series mode. 28 | */ 29 | 30 | "use strict"; 31 | 32 | /** 33 | * Provides methods to export data from "cube" views. 34 | * 35 | * @class exportService 36 | * @memberof cv.views.cube 37 | */ 38 | angular.module('cv.views.cube').service("exportService", ['$rootScope', '$timeout', 'cvOptions', 'cubesService', 'viewsService', 'seriesOperationsService', 39 | function ($rootScope, $timeout, cvOptions, cubesService, viewsService, seriesOperationsService) { 40 | 41 | /** 42 | * Download facts in CSV format from Cubes Server 43 | * 44 | * @memberof cv.views.cube.exportService 45 | */ 46 | this.exportFacts = function(view) { 47 | 48 | var args = cubesService.buildBrowserArgs(view, false, true); 49 | 50 | var http_args = {}; 51 | http_args["format"] = "csv"; 52 | 53 | if (args.cut) http_args.cut = args.cut.toString(); 54 | if (args.order) http_args.order = args.order.toString(); 55 | 56 | 57 | var url = cvOptions.cubesUrl + "/cube/" + view.cube.name + "/facts?" + $.param(http_args); 58 | window.open(url, '_blank'); 59 | window.focus(); 60 | 61 | }; 62 | 63 | /** 64 | * Export a view (either in "explore" or "series" mode) in CSV format. 65 | * 66 | * @memberof cv.views.cube.exportService 67 | */ 68 | this.exportGridAsCsv = function (view) { 69 | 70 | if (!view.grid) { 71 | console.debug("View has no grid that can be exported."); 72 | return; 73 | } 74 | 75 | var gridOptions = view.grid; 76 | var dataRows = view.grid.data; 77 | 78 | var content = ""; 79 | var values = []; 80 | 81 | $(view.grid.columnDefs).each(function(idx, e) { 82 | values.push ('"' + e.name + '"'); 83 | }); 84 | content = content + (values.join(",")) + "\n"; 85 | 86 | $(dataRows).each(function(idxr, r) { 87 | values = []; 88 | $(view.grid.columnDefs).each(function(idx, e) { 89 | if (r[e.field] && r[e.field].title) { 90 | // Explore view uses objects as values, where "title" is the label 91 | values.push('"' + r[e.field].title + '"'); 92 | } else { 93 | // 94 | values.push('"' + r[e.field] + '"'); 95 | } 96 | }); 97 | content = content + (values.join(",")) + "\n"; 98 | }); 99 | 100 | 101 | //window.open (url, "_blank"); 102 | this.saveAs(content, "text/csv", view.cube.name + "-summary.csv") 103 | }; 104 | 105 | /** 106 | * Delivers a data URI to the client with a given filename. 107 | * 108 | * @memberof cv.views.cube.exportService 109 | */ 110 | this.saveAs = function(content, mime, filename) { 111 | 112 | // Method 1 113 | //var uri = "data:" + mime + ";charset=utf-8," + encodeURIComponent(content); 114 | 115 | // Method 2 116 | var csvData = new Blob([content], { type: mime }); 117 | var uri = URL.createObjectURL(csvData); 118 | 119 | var link = document.createElement('a'); 120 | if (typeof link.download === 'string') { 121 | document.body.appendChild(link); // Firefox requires the link to be in the body 122 | link.download = filename; 123 | link.href = uri; 124 | link.click(); 125 | document.body.removeChild(link); // remove the link when done 126 | } else { 127 | location.replace(uri); 128 | } 129 | }; 130 | 131 | /** 132 | * Grab page styles as a string to embed them into the SVG source 133 | * From: https://github.com/NYTimes/svg-crowbar/blob/gh-pages/svg-crowbar.js 134 | */ 135 | this.getDocumentStyles = function() { 136 | 137 | var doc = window.document; 138 | 139 | var styles = "", styleSheets = doc.styleSheets; 140 | 141 | if (styleSheets) { 142 | for ( var i = 0; i < styleSheets.length; i++) { 143 | processStyleSheet(styleSheets[i]); 144 | } 145 | } 146 | 147 | function processStyleSheet(ss) { 148 | try { 149 | if (ss.cssRules) { 150 | console.debug(ss); 151 | for ( var i = 0; i < ss.cssRules.length; i++) { 152 | var rule = ss.cssRules[i]; 153 | if (rule.type === 3) { 154 | // Import Rule 155 | processStyleSheet(rule.styleSheet); 156 | } else { 157 | // hack for illustrator crashing 158 | // on descendent selectors 159 | if (rule.selectorText) { 160 | if (rule.selectorText 161 | .indexOf(">") === -1) { 162 | styles += "\n" 163 | + rule.cssText; 164 | } 165 | } 166 | } 167 | } 168 | } 169 | } catch (err) { 170 | console.debug("Could not access document stylesheet.") 171 | } 172 | } 173 | 174 | return styles; 175 | } 176 | 177 | }]); 178 | 179 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/facts/facts.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |

Facts data 5 | 6 |

7 | 8 |
9 | 10 |
11 | 12 |
17 |
18 |
 
19 | 20 |
No facts are returned by the current filtering combination.
21 | 22 |
23 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/filter/datefilter.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ dimparts.labelNoLevel }}: 4 | 5 | 9 | 10 |
11 | 12 |
13 | 14 |
15 | 33 |
34 | 35 |
36 | 37 | ⇒ 38 | 39 |
40 |

41 | 42 | 43 | 44 | 45 |

46 |
47 | 48 | - 49 | - 50 | 51 |
52 |

53 | 54 | 55 | 56 | 57 |

58 |
59 | 60 |
61 | 62 |
63 | 64 |
65 | 66 | 67 | 68 | 69 | 70 |
71 |
72 | 73 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/filter/datefilter.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | /** 25 | * Adds support for datefilters. 26 | * 27 | * This module requires that the model is configured 28 | * to declare which dimensions may use a datefilter, 29 | * and which fields of the dimension correspond to 30 | * calendar fields (year, quarter, month, day, week...). 31 | * (see integrator documentation for more information). 32 | * 33 | */ 34 | 35 | "use strict"; 36 | 37 | angular.module('cv.views.cube').filter("datefilterMode", ['$rootScope', 'cvOptions', 38 | function ($rootScope, cvOptions) { 39 | return function(val) { 40 | var text = "None"; 41 | switch (val) { 42 | case "custom": text = "Custom"; break; 43 | case "auto-last1m": text = "Last month"; break; 44 | case "auto-last3m": text = "Last 3 months"; break; 45 | case "auto-last6m": text = "Last 6 months"; break; 46 | case "auto-last12m": text = "Last year"; break; 47 | case "auto-last24m": text = "Last 2 years"; break; 48 | case "auto-january1st": text = "From January 1st"; break; 49 | case "auto-yesterday": text = "Yesterday"; break; 50 | } 51 | return text; 52 | }; 53 | }]); 54 | 55 | angular.module('cv.views.cube').controller("CubesViewerViewsCubeFilterDateController", ['$rootScope', '$scope', '$filter', 'cvOptions', 'cubesService', 'viewsService', 56 | function ($rootScope, $scope, $filter, cvOptions, cubesService, viewsService) { 57 | $scope.initialize = function() { 58 | $scope.dateStart.value = $scope.datefilter.date_from ? new Date($scope.datefilter.date_from) : null; 59 | $scope.dateEnd.value = $scope.datefilter.date_to ? new Date($scope.datefilter.date_to) : null; 60 | }; 61 | 62 | $scope.dateStart = { 63 | opened: false, 64 | value: null, 65 | options: { 66 | //dateDisabled: disabled, 67 | formatYear: 'yyyy', 68 | //maxDate: new Date(2020, 12, 31), 69 | //minDate: new Date(1970, 1, 1), 70 | startingDay: cvOptions.datepickerFirstDay, 71 | showWeeks: cvOptions.datepickerShowWeeks 72 | } 73 | }; 74 | $scope.dateEnd = { 75 | opened: false, 76 | value: null, 77 | options: { 78 | //dateDisabled: disabled, 79 | formatYear: 'yyyy', 80 | //maxDate: new Date(2020, 12, 31), 81 | //minDate: new Date(1970, 1, 1), 82 | startingDay: cvOptions.datepickerFirstDay, 83 | showWeeks: cvOptions.datepickerShowWeeks 84 | } 85 | }; 86 | 87 | $scope.dateStartOpen = function() { 88 | $scope.dateStart.opened = true; 89 | } 90 | $scope.dateEndOpen = function() { 91 | $scope.dateEnd.opened = true; 92 | } 93 | 94 | $scope.setMode = function(mode) { 95 | $scope.datefilter.mode = mode; 96 | }; 97 | 98 | $scope.updateDateFilter = function() { 99 | $scope.datefilter.date_from = $scope.dateStart.value ? $filter('date')($scope.dateStart.value, "yyyy-MM-dd") : null; 100 | $scope.datefilter.date_to = $scope.dateEnd.value? $filter('date')($scope.dateEnd.value, "yyyy-MM-dd") : null; 101 | $scope.refreshView(); 102 | } 103 | 104 | $scope.$watch("dateStart.value", $scope.updateDateFilter); 105 | $scope.$watch("dateEnd.value", $scope.updateDateFilter); 106 | $scope.$watch("datefilter.mode", $scope.updateDateFilter); 107 | 108 | $scope.initialize(); 109 | 110 | }]); 111 | 112 | 113 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/series/operations.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Sof tware, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | 26 | /** 27 | * Manipulates series. 28 | */ 29 | 30 | "use strict"; 31 | 32 | angular.module('cv.views').service("seriesOperationsService", ['$rootScope', 'cvOptions', 'cubesService', 33 | function ($rootScope, cvOptions, cubesService) { 34 | 35 | this.calculateDifferentials = function(view, rows, columnDefs) { 36 | 37 | console.debug("FIXME: Differentials are ignoring drilldown.length columns, but fails in some cases."); 38 | 39 | $(rows).each(function(idx, e) { 40 | var lastValue = null; 41 | for (var i = view.params.drilldown.length; i < columnDefs.length; i++) { 42 | var value = e[columnDefs[i].field]; 43 | var diff = null; 44 | if ((lastValue != null) && (value != null)) { 45 | var diff = value - lastValue; 46 | e[columnDefs[i].field] = diff; 47 | } else { 48 | delete e[columnDefs[i].field]; 49 | //e[columnDefs[i].field] = null; 50 | } 51 | lastValue = value; 52 | } 53 | }); 54 | 55 | }; 56 | 57 | this.calculateDifferentialsPercent = function(view, rows, columnDefs) { 58 | 59 | console.debug("FIXME: Differentials are ignoring drilldown.length columns, but fails in some cases."); 60 | 61 | $(rows).each(function(idx, e) { 62 | var lastValue = null; 63 | for (var i = view.params.drilldown.length; i < columnDefs.length; i++) { 64 | var value = e[columnDefs[i].field]; 65 | var diff = null; 66 | if ((lastValue != null) && (value != null)) { 67 | var diff = (value - lastValue) / lastValue; 68 | e[columnDefs[i].field] = diff; 69 | } else { 70 | delete e[columnDefs[i].field]; 71 | //e[columnDefs[i].field] = null; 72 | } 73 | lastValue = value; 74 | } 75 | }); 76 | 77 | }; 78 | 79 | this.calculateAccum = function(view, rows, columnDefs) { 80 | 81 | }; 82 | 83 | this.applyCalculations = function(view, rows, columnDefs) { 84 | if (view.params.calculation == "difference") { 85 | this.calculateDifferentials(view, rows, columnDefs); 86 | } 87 | if (view.params.calculation == "percentage") { 88 | this.calculateDifferentialsPercent(view, rows, columnDefs); 89 | } 90 | }; 91 | 92 | 93 | }]); 94 | 95 | 96 | -------------------------------------------------------------------------------- /cubesviewer/views/cube/series/series.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |

Series table 5 | 6 |

7 | 8 |
9 | 10 |
11 | 12 |
17 |
18 |
 
19 | 20 |
21 |

22 | Cannot present series table: no measure has been selected. 23 |

24 |

25 | Tip: use the View > Measure menu. 26 |

27 |
28 | 29 |
30 |

31 | Cannot present series table: no rows are returned by the current horizontal dimension, drilldown or filtering combination. 32 |

33 |

34 | Tip: use the View menu to select an horizontal dimension. 35 |

36 |
37 | 38 |
39 | -------------------------------------------------------------------------------- /cubesviewer/views/undo.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | /* 25 | * Undo/Redo plugin. 26 | */ 27 | 28 | "use strict"; 29 | 30 | 31 | angular.module('cv.views.cube').controller("CubesViewerViewsUndoController", ['$rootScope', '$scope', '$timeout', '$element', 'cvOptions', 'cubesService', 'viewsService', 32 | function ($rootScope, $scope, $timeout, $element, cvOptions, cubesService, viewsService) { 33 | 34 | $scope.initialize = function() { 35 | // Add chart view parameters to view definition 36 | $scope.view.undoList = []; 37 | $scope.view.undoPos = -1; 38 | }; 39 | 40 | $scope.initialize(); 41 | 42 | $scope.$on('ViewRefresh', function(view) { $scope._processState(view); }); 43 | 44 | $scope._processState = function() { 45 | 46 | var drawn = viewsService.serializeView($scope.view); 47 | var current = $scope.getCurrentUndoState(); 48 | 49 | if (drawn != current) { 50 | $scope.pushUndo(drawn); 51 | } 52 | 53 | } 54 | 55 | $scope.pushUndo = function (state) { 56 | 57 | var view = $scope.view; 58 | 59 | view.undoPos = view.undoPos + 1; 60 | if (view.undoPos + 1 <= view.undoList.length) { 61 | view.undoList.splice(view.undoPos, view.undoList.length - view.undoPos); 62 | } 63 | view.undoList.push(state); 64 | 65 | if (view.undoList.length > cvOptions.undoSize) { 66 | view.undoList.splice(0, view.undoList.length - cvOptions.undoSize); 67 | view.undoPos = view.undoList.length - 1; 68 | } 69 | }; 70 | 71 | $scope.view.updateUndo = function() { 72 | var view = $scope.view; 73 | var state = viewsService.serializeView(view); 74 | 75 | if (view.undoList[view.undoPos]) { 76 | view.undoList[view.undoPos] = state; 77 | } 78 | }; 79 | 80 | $scope.getCurrentUndoState = function () { 81 | if ($scope.view.undoList.length == 0) return "{}"; 82 | return $scope.view.undoList[$scope.view.undoPos]; 83 | }; 84 | 85 | $scope.undo = function () { 86 | $scope.view.undoPos = $scope.view.undoPos - 1; 87 | if ($scope.view.undoPos < 0) $scope.view.undoPos = 0; 88 | $scope.applyCurrentUndoState(); 89 | }; 90 | 91 | $scope.redo = function () { 92 | $scope.view.undoPos = $scope.view.undoPos + 1; 93 | $scope.applyCurrentUndoState (); 94 | }; 95 | 96 | $scope.applyCurrentUndoState = function() { 97 | var current = $scope.getCurrentUndoState(); 98 | $scope.view.params = $.parseJSON(current); 99 | $scope.refreshView(); 100 | }; 101 | 102 | 103 | }]); 104 | 105 | 106 | -------------------------------------------------------------------------------- /cubesviewer/views/views.js: -------------------------------------------------------------------------------- 1 | /* 2 | * CubesViewer 3 | * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy 6 | * of this software and associated documentation files (the "Software"), to deal 7 | * in the Software without restriction, including without limitation the rights 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | * copies of the Software, and to permit persons to whom the Software is 10 | * furnished to do so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | "use strict"; 26 | 27 | 28 | /** 29 | * View class, which contains view definition (params), view state, 30 | * and provides the view API. 31 | * 32 | * This is the generic base View class definition. 33 | * Specific views (ie. CubeView) enrich this model. 34 | * 35 | * @param cvOptions The cv options object. 36 | * @param id The numeric id of the view to be created. 37 | * @param type The view type (ie. 'cube'). 38 | * @returns The new view object. 39 | * 40 | * @namespace cubesviewer 41 | */ 42 | cubesviewer.View = function(cvOptions, id, type) { 43 | 44 | var view = {}; 45 | 46 | view.id = "_cv-view-" + id; 47 | view.type = type; 48 | view.cvOptions = cvOptions; 49 | 50 | view.state = cubesviewer.VIEW_STATE_INITIALIZING; 51 | view.error = ""; 52 | 53 | view.params = {}; 54 | 55 | view.savedId = 0; 56 | view.owner = cvOptions.user; 57 | view.shared = false; 58 | 59 | 60 | /** 61 | * Returns a boolean indicating whether controls are hidden for this view. 62 | * 63 | * @returns boolean indicating whether controls are hidden for this view. 64 | */ 65 | view.getControlsHidden = function() { 66 | return !!view.params.controlsHidden || !!view.cvOptions.hideControls; 67 | }; 68 | 69 | view.setControlsHidden = function(controlsHidden) { 70 | view.params.controlsHidden = controlsHidden; 71 | }; 72 | 73 | return view; 74 | 75 | }; 76 | 77 | 78 | 79 | /** 80 | * The views module manages different views in CubesViewer. 81 | * 82 | * @namespace cv.views 83 | */ 84 | angular.module('cv.views', ['cv.views.cube']); 85 | 86 | 87 | /** 88 | * This service manages CubesViewer views in the application. 89 | * 90 | * @class viewsService 91 | * @memberof cv.views 92 | */ 93 | angular.module('cv.views').service("viewsService", ['$rootScope', '$window', 'cvOptions', 'cubesService', 'dialogService', 94 | function ($rootScope, $window, cvOptions, cubesService, dialogService) { 95 | 96 | this.views = []; 97 | 98 | this.lastViewId = 0; 99 | 100 | this.studioViewsService = null; 101 | 102 | /** 103 | * Adds a new clean view for a cube. 104 | * 105 | * @param type Type of view to create. Currently only "cube" is available. 106 | * @param data View parameters, as an object or as a serialized JSON string. 107 | * @returns CubesViewer view object. 108 | * 109 | * @memberOf cv.views.viewsService 110 | */ 111 | this.createView = function(type, data) { 112 | 113 | // Create view 114 | 115 | this.lastViewId++; 116 | 117 | var params = {}; 118 | 119 | if (typeof data == "string") { 120 | try { 121 | params = $.parseJSON(data); 122 | } catch (err) { 123 | console.debug('Error: could not process serialized data (JSON parse error)'); 124 | dialogService.show('Error: could not process serialized data (JSON parse error).') 125 | params["name"] = "Undefined view"; 126 | } 127 | } else { 128 | params = data; 129 | } 130 | 131 | // FIXME: cvOptions shall not be passed, and getControlsHidden() shall possibly be part of this view service 132 | var view = cubesviewer.CubeView(cvOptions, this.lastViewId, type); 133 | $.extend(view.params, params); 134 | 135 | return view; 136 | }; 137 | 138 | /** 139 | * Serialize view data. 140 | * 141 | * @param view The view object for which definition will be serialized. 142 | * @returns A string with the definition of the view (view.params) serialized in JSON. 143 | */ 144 | this.serializeView = function(view) { 145 | //return JSON.stringify(view.params); 146 | return angular.toJson(view.params); // Ignores $$ attributes 147 | }; 148 | 149 | 150 | }]); 151 | 152 | 153 | -------------------------------------------------------------------------------- /doc/guide/cubesviewer-quickstart.md: -------------------------------------------------------------------------------- 1 | CubesViewer - Quickstart 2 | ======================== 3 | 4 | Hello Cubes! 5 | ------------ 6 | 7 | CubesViewer is a client-side HTML5 application. You can test it by simply downloading 8 | the package and opening the HTML file in your browser. 9 | 10 | 1. Download the latest cubesviewer: 11 | 12 | `git clone https://github.com/jjmontesl/cubesviewer.git` 13 | 14 | (You can also download a zipped package). 15 | 16 | 2. Open `html/views.html` in your browser. When prompted, 17 | accept the default server URL (`http://cubesdemo.cubesviewer.com/`). 18 | 19 | 3. Done! You are running your own copy of CubesViewer connecting to data 20 | from CubesViewer public demo server. 21 | 22 | 23 | CubesViewer family 24 | ------------------ 25 | 26 | * *Cubes* is the OLAP Cubes Server by DataBrewery. 27 | * *CubesViewer* is the client-side HTML5 viewer library for Cubes. 28 | * *CubesViewer Studio* is the client-side HTML5 exploring solution for Cubes. 29 | * *CubesViewer Server* is the server-side backend for CubesViewer Studio (optional). 30 | 31 | 32 | Setting up Cubes and CubesViewer example data 33 | --------------------------------------------- 34 | 35 | The example above uses data from CubesViewer public demo server. But in order to serve your 36 | own data, you need to run your own Cubes installation. 37 | 38 | We'll download the example data and install it locally along with Cubes. This example 39 | needs *Python*, *PIP* and *virtualenv* installed: 40 | 41 | 1. Clone the CubesViewer cubes-examples repository which contains this example: 42 | 43 | `git clone https://github.com/jjmontesl/cubes-examples` 44 | 45 | 2. Enter the directory. Create a virtual environment and activate it (this is optional, 46 | but helps keeping your Python installation clean): 47 | 48 | ``` 49 | cd cubes-examples 50 | virtualenv env 51 | . env/bin/activate 52 | ``` 53 | 54 | 3. Install Cubes package via PIP: 55 | 56 | `pip install -r requirements.txt` 57 | 58 | This will install dependencies: Cubes, Flask and SQLAlchemy. 59 | 60 | 4. Enter the "webshop" dir and run Cubes OLAP server (the tool is called `slicer`): 61 | 62 | ``` 63 | cd webshop 64 | slicer serve slicer.ini 65 | ``` 66 | 67 | This will use the `slicer.ini` file and `model.json` config files to 68 | initialize Cubes server. The database is a SQLite database included in 69 | the same directory. 70 | 71 | 5. Visit `http://localhost:5000` and check the server response. Cubes should reply 72 | with a short web page describing its configuration. 73 | 74 | 75 | Refer to [Cubes](https://pythonhosted.org/cubes/index.html) site for download 76 | and installation instructions. 77 | 78 | Note: If you are on Windows and you get an error (_Your platform does not support forking_), 79 | you may need to remove or comment the `processes: 6` line from the `slicer.ini` file. 80 | 81 | Put it all together 82 | ------------------- 83 | 84 | 1. Make sure your Cubes *slicer* service is running (from the section above). 85 | 86 | 2. Use your browser to load `html/studio.html` in the `cubesviewer` package. 87 | 88 | 3. When prompted, accept the default Cubes location: `http://localhost:5000`. 89 | 90 | 4. Done! You are now using your copy of CubesViewer to access your local 91 | Cubes server. 92 | 93 | 94 | CubesViewer Studio and Server 95 | ----------------------------- 96 | 97 | If you wish to install the full CubesViewer Studio Server environment, which 98 | allows several users to save / share views, check the 99 | [Installing CubesViewer Server](cubesviewer-server-installation.md) section. 100 | 101 | You can also embed the CubesViewer views you design into other web applications. 102 | Check [Integrating CubesViewer views in other web applications](cubesviewer-embed.md) 103 | for further information. 104 | 105 | 106 | Further information 107 | ------------------- 108 | 109 | * [Configuring your Cubes model](cubesviewer-model.md) 110 | * [Documentation index](index.md) 111 | 112 | -------------------------------------------------------------------------------- /doc/guide/cubesviewer-user-main.md: -------------------------------------------------------------------------------- 1 | CubesViewer - OLAP Visual Viewer and Explore Tool 2 | ================================================= 3 | 4 | User Guide 5 | ---------- 6 | 7 | CubesViewer is a data exploration and visualization tool. It helps you exploring and understanding 8 | data and to present it in a way that is meaningful. 9 | 10 | Call for help 11 | ------------- 12 | 13 | This section of CubesViewer documentation has not yet been created. Please consider collaborating with 14 | the project by writing it! Get in touch with jjmontes@gmail.com if you wish to take over this task: 15 | 16 | * Introduction 17 | * Facts and dimensions 18 | * Explore view 19 | * Drilldown 20 | * Filtering 21 | * Series view 22 | * Operations on series 23 | * Facts view 24 | * Charts view 25 | * Exporting data 26 | * Saving and sharing 27 | 28 | 29 | * [Documentation index](index.md) 30 | 31 | 32 | ![CubesViewer Explore Screenshot](https://raw.github.com/jjmontesl/cubesviewer/master/doc/screenshots/view-explore-1.png "CubesViewer Explore") 33 | 34 | -------------------------------------------------------------------------------- /doc/guide/index.md: -------------------------------------------------------------------------------- 1 | CubesViewer - OLAP Visual Viewer and Explore Tool 2 | ================================================= 3 | 4 | [CubesViewer](https://github.com/jjmontesl/cubesviewer) is a visual, web-based tool application 5 | for exploring and analyzing OLAP databases served by the Cubes OLAP Framework. 6 | 7 | 8 | CubesViewer Documentation 9 | ------------------------- 10 | 11 | **For developers and integrators**: 12 | 13 | * [Quick Start](cubesviewer-quickstart.md) 14 | * [Configuring your Cubes data model](cubesviewer-model.md) 15 | * [Installing CubesViewer Server](cubesviewer-server-installation.md) 16 | * [Integrating CubesViewer views in other web applications](cubesviewer-embed.md) 17 | 18 | **For end users**: 19 | 20 | * [CubesViewer User Guide](cubesviewer-user-main.md) - Work in progress 21 | 22 | **Links**: 23 | 24 | * [CubesViewer Demo](http://jjmontesl.github.io/cubesviewer/) 25 | * [CubesViewer](https://github.com/jjmontesl/cubesviewer) at Github 26 | * [CubesViewer Server](https://github.com/jjmontesl/cubesviewer-server) at Github 27 | 28 | 29 | Please see the README.md file for information on collaborating with CubesViewer project! 30 | 31 | ![CubesViewer Chart Screenshot](https://raw.github.com/jjmontesl/cubesviewer/master/doc/screenshots/view-chart-1.png "CubesViewer Chart") 32 | 33 | -------------------------------------------------------------------------------- /doc/images/cubesviewer-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/cubesviewer-logo.png -------------------------------------------------------------------------------- /doc/images/icon/android-chrome-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/android-chrome-144x144.png -------------------------------------------------------------------------------- /doc/images/icon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/android-chrome-192x192.png -------------------------------------------------------------------------------- /doc/images/icon/android-chrome-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/android-chrome-36x36.png -------------------------------------------------------------------------------- /doc/images/icon/android-chrome-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/android-chrome-48x48.png -------------------------------------------------------------------------------- /doc/images/icon/android-chrome-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/android-chrome-72x72.png -------------------------------------------------------------------------------- /doc/images/icon/android-chrome-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/android-chrome-96x96.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /doc/images/icon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/apple-touch-icon.png -------------------------------------------------------------------------------- /doc/images/icon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | #da532c 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /doc/images/icon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/favicon-16x16.png -------------------------------------------------------------------------------- /doc/images/icon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/favicon-32x32.png -------------------------------------------------------------------------------- /doc/images/icon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/favicon-96x96.png -------------------------------------------------------------------------------- /doc/images/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/favicon.ico -------------------------------------------------------------------------------- /doc/images/icon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CubesViewer", 3 | "icons": [ 4 | { 5 | "src": "\/android-chrome-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": 0.75 9 | }, 10 | { 11 | "src": "\/android-chrome-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": 1 15 | }, 16 | { 17 | "src": "\/android-chrome-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": 1.5 21 | }, 22 | { 23 | "src": "\/android-chrome-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": 2 27 | }, 28 | { 29 | "src": "\/android-chrome-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": 3 33 | }, 34 | { 35 | "src": "\/android-chrome-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": 4 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /doc/images/icon/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/mstile-144x144.png -------------------------------------------------------------------------------- /doc/images/icon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/mstile-150x150.png -------------------------------------------------------------------------------- /doc/images/icon/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/mstile-310x150.png -------------------------------------------------------------------------------- /doc/images/icon/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/mstile-310x310.png -------------------------------------------------------------------------------- /doc/images/icon/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/images/icon/mstile-70x70.png -------------------------------------------------------------------------------- /doc/images/icon/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /doc/jsdoc/jsdoc.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "templates": { 3 | "default": { 4 | "outputSourceFiles": true, 5 | "includeDate": false, 6 | "layoutFile": "doc/jsdoc/layout.tmpl", 7 | "staticFiles": { 8 | "include": [ ] 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /doc/jsdoc/layout.tmpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CubesViewer Doc: <?js= title ?> 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 |

21 | 22 | 23 |
24 | 25 | 28 | 29 |
30 | 31 |
32 | Documentation generated by JSDoc on 33 |
34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /doc/screenshots/view-chart-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/screenshots/view-chart-1.png -------------------------------------------------------------------------------- /doc/screenshots/view-chart-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/screenshots/view-chart-2.png -------------------------------------------------------------------------------- /doc/screenshots/view-embedded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/screenshots/view-embedded.png -------------------------------------------------------------------------------- /doc/screenshots/view-explore-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/doc/screenshots/view-explore-1.png -------------------------------------------------------------------------------- /html/cvapp.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Cubesviewer sites CSS 3 | * This file must not be included needed if you are embedding cubesviewer in your site, as it 4 | * contains global CSS selectors. 5 | */ 6 | 7 | html { 8 | font-size: 13px; 9 | font-family: Helvetica, Arial, sans-serif; 10 | } 11 | 12 | img.cv-logo { 13 | margin: 0px; 14 | height: 40px; 15 | width: 85px; 16 | } 17 | 18 | .header h1 { 19 | margin-bottom: 5px; 20 | } 21 | 22 | #cubesviewer { 23 | margin-top: 10px; 24 | } 25 | 26 | .cv-gui-panel { 27 | /* 28 | position: fixed; 29 | border-bottom: 2px solid black; 30 | background-color: #ffffff; 31 | left: 0px; 32 | right: 0px; 33 | padding: 3px 5px 3px 5px; 34 | margin-bottom: 10px; 35 | */ 36 | 37 | } 38 | -------------------------------------------------------------------------------- /html/img/cubes-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/cubes-logo.png -------------------------------------------------------------------------------- /html/img/cubesviewer-logo-embed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/cubesviewer-logo-embed.png -------------------------------------------------------------------------------- /html/img/cubesviewer-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/cubesviewer-logo.png -------------------------------------------------------------------------------- /html/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /html/img/favicon/favicon-194x194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/favicon/favicon-194x194.png -------------------------------------------------------------------------------- /html/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /html/img/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /html/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/img/favicon/favicon.ico -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/animation.less: -------------------------------------------------------------------------------- 1 | /* 2 | Animation example, for spinners 3 | */ 4 | .ui-grid-animate-spin { 5 | -moz-animation: ui-grid-spin 2s infinite linear; 6 | -o-animation: ui-grid-spin 2s infinite linear; 7 | -webkit-animation: ui-grid-spin 2s infinite linear; 8 | animation: ui-grid-spin 2s infinite linear; 9 | display: inline-block; 10 | } 11 | @-moz-keyframes ui-grid-spin { 12 | 0% { 13 | -moz-transform: rotate(0deg); 14 | -o-transform: rotate(0deg); 15 | -webkit-transform: rotate(0deg); 16 | transform: rotate(0deg); 17 | } 18 | 19 | 100% { 20 | -moz-transform: rotate(359deg); 21 | -o-transform: rotate(359deg); 22 | -webkit-transform: rotate(359deg); 23 | transform: rotate(359deg); 24 | } 25 | } 26 | @-webkit-keyframes ui-grid-spin { 27 | 0% { 28 | -moz-transform: rotate(0deg); 29 | -o-transform: rotate(0deg); 30 | -webkit-transform: rotate(0deg); 31 | transform: rotate(0deg); 32 | } 33 | 34 | 100% { 35 | -moz-transform: rotate(359deg); 36 | -o-transform: rotate(359deg); 37 | -webkit-transform: rotate(359deg); 38 | transform: rotate(359deg); 39 | } 40 | } 41 | @-o-keyframes ui-grid-spin { 42 | 0% { 43 | -moz-transform: rotate(0deg); 44 | -o-transform: rotate(0deg); 45 | -webkit-transform: rotate(0deg); 46 | transform: rotate(0deg); 47 | } 48 | 49 | 100% { 50 | -moz-transform: rotate(359deg); 51 | -o-transform: rotate(359deg); 52 | -webkit-transform: rotate(359deg); 53 | transform: rotate(359deg); 54 | } 55 | } 56 | @-ms-keyframes ui-grid-spin { 57 | 0% { 58 | -moz-transform: rotate(0deg); 59 | -o-transform: rotate(0deg); 60 | -webkit-transform: rotate(0deg); 61 | transform: rotate(0deg); 62 | } 63 | 64 | 100% { 65 | -moz-transform: rotate(359deg); 66 | -o-transform: rotate(359deg); 67 | -webkit-transform: rotate(359deg); 68 | transform: rotate(359deg); 69 | } 70 | } 71 | @keyframes ui-grid-spin { 72 | 0% { 73 | -moz-transform: rotate(0deg); 74 | -o-transform: rotate(0deg); 75 | -webkit-transform: rotate(0deg); 76 | transform: rotate(0deg); 77 | } 78 | 79 | 100% { 80 | -moz-transform: rotate(359deg); 81 | -o-transform: rotate(359deg); 82 | -webkit-transform: rotate(359deg); 83 | transform: rotate(359deg); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/body.less: -------------------------------------------------------------------------------- 1 | 2 | .ui-grid-render-container { 3 | position: inherit; 4 | // overflow: hidden; 5 | 6 | .border-radius(0, @gridBorderRadius, @gridBorderRadius, 0); 7 | 8 | // Prevent an outline from showing if we focus the render container element 9 | &:focus { 10 | outline: none; 11 | } 12 | } 13 | 14 | .ui-grid-viewport { 15 | // overflow: auto; // TODO(c0bra): turn back on when virtual repeater is hooked up 16 | min-height: 20px; 17 | position: relative; 18 | overflow-y: scroll; 19 | -webkit-overflow-scrolling: touch; 20 | 21 | &:focus { 22 | outline: none !important; 23 | } 24 | } 25 | 26 | .ui-grid-canvas { 27 | position: relative; 28 | padding-top:1px; //to prevent canvas from absorbing the 1st rendered row's margin 29 | } 30 | 31 | .ui-grid-row { 32 | //position: absolute; 33 | // border-bottom: 1px solid @borderColor; 34 | 35 | &:nth-child(odd) .ui-grid-cell { 36 | background-color: @rowColorOdd; //rgb(253, 253, 253); 37 | } 38 | 39 | &:nth-child(even) .ui-grid-cell { 40 | background-color: @rowColorEven; 41 | } 42 | 43 | &:last-child .ui-grid-cell { 44 | border-bottom-color: @borderColor; 45 | border-bottom-style: solid; 46 | 47 | } 48 | } 49 | 50 | .ui-grid-no-row-overlay { 51 | position: absolute; 52 | top: 0; 53 | bottom: 0; 54 | left: 0; 55 | right: 0; 56 | margin: 10%; 57 | 58 | .ui-grid-top-panel-background; 59 | .border-radius(@gridBorderRadius); 60 | border: @gridBorderWidth solid @borderColor; 61 | 62 | font-size: 2em; 63 | text-align: center; 64 | 65 | > * { 66 | position: absolute; 67 | display: table; 68 | margin: auto 0; 69 | width: 100%; 70 | top: 0; 71 | bottom: 0; 72 | left: 0; 73 | right: 0; 74 | opacity: 0.66; 75 | } 76 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/bootstrap/bootstrap.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.5 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /****** NOTE: IMPORTANT INFORMATION ABOUT USING THIS FILE *********\ 8 | * If you are importing this file then use `@import (reference) '..../bootstrap'` 9 | * ENSURE that you use the (refrerence) 10 | * WHY? Because otherwise you will import the entire contents of less bootstrap 11 | * 12 | * How does this work? 13 | * All of the bootstrap less elements are namespaced under `#ui-grid-twbs` 14 | * This prevents the CSS generated using this file from conflicting with a project's 15 | * import of bootstrap. 16 | * 17 | * XXX: Why are so many of these imports commented out? 18 | * There are several issues with the `extend` function in less. 19 | * Using extend, even within an import that only has a reference will import that 20 | * css element. This causes bloat in the distributed css files. 21 | * Related Issues: 22 | * https://github.com/less/less.js/issues/1968 23 | * https://github.com/less/less.js/issues/1851 24 | * 25 | * If you comment in one of these files you may get much more than css then you want. 26 | * Only do this sparingly. 27 | */ 28 | #ui-grid-twbs { 29 | // Core variables and mixins 30 | @import (reference) "@{bootstrapDirectory}/less/variables.less"; 31 | @import (reference) "@{bootstrapDirectory}/less/mixins.less"; 32 | 33 | // Reset and dependencies 34 | @import (reference) "@{bootstrapDirectory}/less/normalize.less"; 35 | @import (reference) "@{bootstrapDirectory}/less/print.less"; 36 | @import (reference) "@{bootstrapDirectory}/less/glyphicons.less"; 37 | 38 | // Core CSS 39 | @import (reference) "@{bootstrapDirectory}/less/scaffolding.less"; 40 | @import (reference) "@{bootstrapDirectory}/less/code.less"; 41 | @import (reference) "@{bootstrapDirectory}/less/tables.less"; 42 | @import (reference) "@{bootstrapDirectory}/less/forms.less"; 43 | @import (reference) "@{bootstrapDirectory}/less/buttons.less"; 44 | //@import (reference) "@{bootstrapDirectory}/less/type.less"; 45 | //@import (reference) "@{bootstrapDirectory}/less/grid.less"; 46 | 47 | // Components 48 | @import (reference) "@{bootstrapDirectory}/less/component-animations.less"; 49 | @import (reference) "@{bootstrapDirectory}/less/dropdowns.less"; 50 | @import (reference) "@{bootstrapDirectory}/less/button-groups.less"; 51 | @import (reference) "@{bootstrapDirectory}/less/input-groups.less"; 52 | @import (reference) "@{bootstrapDirectory}/less/breadcrumbs.less"; 53 | @import (reference) "@{bootstrapDirectory}/less/pagination.less"; 54 | @import (reference) "@{bootstrapDirectory}/less/labels.less"; 55 | @import (reference) "@{bootstrapDirectory}/less/badges.less"; 56 | @import (reference) "@{bootstrapDirectory}/less/jumbotron.less"; 57 | @import (reference) "@{bootstrapDirectory}/less/alerts.less"; 58 | @import (reference) "@{bootstrapDirectory}/less/progress-bars.less"; 59 | @import (reference) "@{bootstrapDirectory}/less/media.less"; 60 | @import (reference) "@{bootstrapDirectory}/less/list-group.less"; 61 | @import (reference) "@{bootstrapDirectory}/less/responsive-embed.less"; 62 | @import (reference) "@{bootstrapDirectory}/less/wells.less"; 63 | @import (reference) "@{bootstrapDirectory}/less/close.less"; 64 | //@import (reference) "@{bootstrapDirectory}/less/navs.less"; 65 | //@import (reference) "@{bootstrapDirectory}/less/navbar.less"; 66 | //@import (reference) "@{bootstrapDirectory}/less/pager.less"; 67 | //@import (reference) "@{bootstrapDirectory}/less/thumbnails.less"; 68 | //@import (reference) "@{bootstrapDirectory}/less/panels.less"; 69 | 70 | // Components w/ JavaScript 71 | @import (reference) "@{bootstrapDirectory}/less/tooltip.less"; 72 | //@import (reference) "@{bootstrapDirectory}/less/modals.less"; 73 | //@import (reference) "@{bootstrapDirectory}/less/popovers.less"; 74 | 75 | // Utility classes 76 | @import (reference) "@{bootstrapDirectory}/less/utilities.less"; 77 | //@import (reference) "@{bootstrapDirectory}/less/responsive-utilities.less"; 78 | } 79 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/cell.less: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | 3 | .ui-grid-cell { 4 | overflow: hidden; 5 | // position: absolute; 6 | // position: relative; // NOTE: removing so border is visible 7 | float: left; 8 | background-color: inherit; 9 | border-right: @gridBorderWidth solid; 10 | border-color: @borderColor; 11 | box-sizing: border-box; 12 | 13 | &:last-child { 14 | border-right: 0; 15 | } 16 | } 17 | 18 | .ui-grid-cell-contents { 19 | padding: 5px; 20 | -moz-box-sizing: border-box; 21 | -webkit-box-sizing: border-box; 22 | box-sizing: border-box; 23 | white-space: nowrap; 24 | -ms-text-overflow: ellipsis; 25 | -o-text-overflow: ellipsis; 26 | text-overflow: ellipsis; 27 | overflow: hidden; 28 | height: 100%; 29 | // width: 100%; 30 | } 31 | 32 | .ui-grid-cell-contents-hidden { 33 | visibility: hidden; 34 | width: 0; 35 | height:0; 36 | display: none; 37 | } 38 | 39 | .ui-grid-row .ui-grid-cell.ui-grid-row-header-cell { 40 | background-color: @rowHeaderCell; 41 | border-bottom: solid @gridBorderWidth @borderColor; 42 | } 43 | 44 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/cellnav/less/cellNav.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | @import (reference) '../../../less/bootstrap/bootstrap'; 3 | 4 | // .ui-grid-cell-contents:focus { 5 | // outline: 0; 6 | // background-color: @focusedCell; 7 | // } 8 | 9 | .ui-grid-cell-focus { 10 | outline: 0; 11 | background-color: @focusedCell; 12 | } 13 | 14 | .ui-grid-focuser { 15 | position: absolute; 16 | left: 0px; 17 | top: 0px; 18 | z-index: -1; 19 | width:100%; 20 | height:100%; 21 | #ui-grid-twbs > .form-control-focus(); 22 | } 23 | 24 | .ui-grid-offscreen{ 25 | display: block; 26 | position: absolute; 27 | left: -10000px; 28 | top: -10000px; 29 | clip:rect(0px,0px,0px,0px); 30 | } 31 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/edit/less/edit.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | div.ui-grid-cell { 4 | input { 5 | border-radius: inherit; 6 | padding: 0; 7 | width: 100%; 8 | color: inherit; 9 | height: auto; 10 | font: inherit; 11 | outline: none; 12 | } 13 | input:focus { 14 | color: inherit; 15 | outline: none; 16 | } 17 | input[type="checkbox"] { 18 | margin: 9px 0 0 6px; 19 | width: auto; 20 | } 21 | input.ng-invalid { 22 | border: @invalidValueBorder; 23 | } 24 | input.ng-valid { 25 | border: @validValueBorder; 26 | } 27 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/expandable/less/expandable.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .expandableRow { 4 | .ui-grid-row { 5 | 6 | &:nth-child(odd) .ui-grid-cell { 7 | background-color: @rowColorOdd; 8 | } 9 | 10 | &:nth-child(even) .ui-grid-cell { 11 | background-color: @rowColorEven; 12 | } 13 | 14 | } 15 | } 16 | 17 | 18 | .ui-grid-cell.ui-grid-disable-selection.ui-grid-row-header-cell{ 19 | pointer-events: none; 20 | } 21 | .ui-grid-expandable-buttons-cell i{ 22 | pointer-events: all; 23 | } 24 | 25 | .scrollFiller { 26 | float:left; 27 | border:1px solid @borderColor; 28 | } 29 | 30 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/exporter/less/exporter.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-exporter-header { 4 | } 5 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/footer.less: -------------------------------------------------------------------------------- 1 | 2 | .ui-grid-footer-panel-background { 3 | .gradient(@headerBackgroundColor, @headerGradientStart, @headerGradientStop); 4 | } 5 | 6 | @topPanelRadius: @gridBorderRadius - @gridBorderWidth; 7 | .ui-grid-footer-panel { 8 | position: relative; 9 | // z-index: 1; 10 | // background-color: @darkGray; // #EAEAEA 11 | border-bottom: 1px solid @borderColor; // #D4D4D4 12 | border-top: 1px solid @borderColor; 13 | overflow: hidden; // Disable so menus show up 14 | font-weight: bold; 15 | 16 | // .gradient(@headerBackgroundColor, @headerGradientStart, @headerGradientStop); 17 | .ui-grid-footer-panel-background; 18 | 19 | .border-radius(@topPanelRadius, 0, 0, @topPanelRadius); 20 | } 21 | 22 | .ui-grid-grid-footer { 23 | float: left; 24 | width: 100%; 25 | } 26 | 27 | .ui-grid-footer-viewport { 28 | overflow: hidden; // Disable so menus show up 29 | } 30 | 31 | .ui-grid-footer-canvas { 32 | position: relative; 33 | 34 | // Clearfix for floating header cells 35 | &:before, &:after { 36 | content: ""; 37 | display: table; 38 | line-height: 0; 39 | } 40 | 41 | &:after { 42 | clear:both; 43 | } 44 | 45 | // .border-radius(@gridBorderRadius, 0, 0, @gridBorderRadius); 46 | } 47 | 48 | .ui-grid-footer-cell-wrapper { 49 | position: relative; 50 | display: table; 51 | box-sizing: border-box; 52 | height: 100%; 53 | } 54 | 55 | .ui-grid-footer-cell-row { 56 | display: table-row; 57 | } 58 | 59 | .ui-grid-footer-cell { 60 | overflow: hidden; 61 | // position: relative; // NOTE: removing so border is visible 62 | background-color: inherit; 63 | border-right: @gridBorderWidth solid; 64 | border-color: @borderColor; 65 | box-sizing: border-box; 66 | display: table-cell; 67 | 68 | &:last-child { 69 | border-right: 0; 70 | } 71 | } 72 | 73 | input[type="text"].ui-grid-filter-input { 74 | padding: 0; 75 | margin: 0; 76 | border: 0; 77 | width: 100%; 78 | 79 | border: @gridBorderWidth solid @borderColor; 80 | .border-radius(@gridBorderRadius); 81 | 82 | &:hover { 83 | border: @gridBorderWidth solid @borderColor; 84 | } 85 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/goups.less: -------------------------------------------------------------------------------- 1 | 2 | @topPanelRadius: @gridBorderRadius - @gridBorderWidth; 3 | 4 | .ui-grid-group-panel { 5 | .gradient(@headerBackgroundColor, @headerGradientStart, @headerGradientStop); 6 | border-bottom: 1px solid @borderColor; // #D4D4D4 7 | .border-radius(@topPanelRadius, 0, 0, @topPanelRadius); 8 | min-height: 30px; 9 | } 10 | .ui-grid-group-panel .hidden { 11 | display: none; 12 | } 13 | .ui-grid-group-panel .description { 14 | margin-top: 5px; 15 | margin-left: 5px; 16 | } 17 | 18 | .ui-grid-group-list { 19 | list-style-type: none; 20 | margin: 0; 21 | padding: 0; 22 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/grid.less: -------------------------------------------------------------------------------- 1 | 2 | .ui-grid { 3 | border: @gridBorderWidth solid @borderColor; 4 | box-sizing: content-box; // If bootstrap (or another included library) makes the default sizing on element "border-box", then calculations get messed up 5 | 6 | .rounded(@gridBorderRadius); 7 | 8 | .transform(translateZ(0)); 9 | 10 | } 11 | 12 | .ui-grid-vertical-bar { 13 | position: absolute; 14 | right: 0; 15 | width: 0; 16 | } 17 | 18 | .ui-grid-header-cell:not(:last-child) .ui-grid-vertical-bar, .ui-grid-cell:not(:last-child) .ui-grid-vertical-bar { 19 | width: @gridBorderWidth; 20 | } 21 | 22 | .ui-grid-scrollbar-placeholder{ 23 | background-color: transparent; 24 | } 25 | 26 | .ui-grid-header-cell:not(:last-child) .ui-grid-vertical-bar { 27 | background-color: @headerVerticalBarColor; 28 | } 29 | 30 | .ui-grid-cell:not(:last-child) .ui-grid-vertical-bar { 31 | background-color: @verticalBarColor; 32 | } 33 | 34 | .ui-grid-header-cell:last-child .ui-grid-vertical-bar { 35 | right: -1px; // TODO(c0bra): Should this be grid width? Test column resizing with custom grid border width 36 | width: @gridBorderWidth; 37 | background-color: @headerVerticalBarColor; 38 | } 39 | 40 | // .ui-grid-vertical-bar-visible { 41 | // width: 1px; 42 | // background-color: @borderColor; 43 | // } 44 | 45 | .ui-grid-clearfix { 46 | &:before, &:after { 47 | content: ""; 48 | display: table; 49 | } 50 | 51 | &:after { 52 | clear:both; 53 | } 54 | } 55 | 56 | .ui-grid-invisible { 57 | visibility: hidden;; 58 | } 59 | 60 | // Wraps the contents inside the grid directive with a relatively-positioned element so that all absolute elements are positioned relative to the grid, and not the page 61 | .ui-grid-contents-wrapper { 62 | position: relative; 63 | height: 100%; 64 | width: 100%; 65 | } 66 | 67 | // Only display content to screen readers 68 | // 69 | // See: http://a11yproject.com/posts/how-to-hide-content/ 70 | 71 | .ui-grid-sr-only { 72 | position: absolute; 73 | width: 1px; 74 | height: 1px; 75 | margin: -1px; 76 | padding: 0; 77 | overflow: hidden; 78 | clip: rect(0,0,0,0); 79 | border: 0; 80 | } 81 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/grouping/less/grouping.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-tree-header-row { 4 | font-weight: bold !important; 5 | } 6 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/header.less: -------------------------------------------------------------------------------- 1 | 2 | .ui-grid-top-panel-background { 3 | .gradient(@headerBackgroundColor, @headerGradientStart, @headerGradientStop); 4 | } 5 | 6 | @topPanelRadius: @gridBorderRadius - @gridBorderWidth; 7 | 8 | .ui-grid-header { 9 | border-bottom: 1px solid @borderColor; 10 | box-sizing: border-box; 11 | } 12 | 13 | .ui-grid-top-panel { 14 | position: relative; 15 | // border-bottom: 1px solid @borderColor; // #D4D4D4 16 | 17 | overflow: hidden; // Disable so menus show up 18 | font-weight: bold; 19 | 20 | // .gradient(@headerBackgroundColor, @headerGradientStart, @headerGradientStop); 21 | .ui-grid-top-panel-background; 22 | 23 | .border-radius(@topPanelRadius, 0, 0, @topPanelRadius); 24 | } 25 | 26 | 27 | .ui-grid-header-viewport { 28 | overflow: hidden; // Disable so menus show up 29 | } 30 | 31 | .ui-grid-header-canvas { 32 | 33 | // Clearfix for floating header cells 34 | &:before, &:after { 35 | content: ""; 36 | display: table; 37 | line-height: 0; 38 | } 39 | 40 | &:after { 41 | clear:both; 42 | } 43 | 44 | // .border-radius(@gridBorderRadius, 0, 0, @gridBorderRadius); 45 | } 46 | 47 | .ui-grid-header-cell-wrapper { 48 | position: relative; 49 | display: table; 50 | box-sizing: border-box; 51 | height: 100%; 52 | } 53 | 54 | .ui-grid-header-cell-row { 55 | display: table-row; 56 | position: relative 57 | } 58 | 59 | .ui-grid-header-cell { 60 | position: relative; 61 | box-sizing: border-box; 62 | background-color: inherit; 63 | border-right: @gridBorderWidth solid; 64 | border-color: @headerVerticalBarColor; 65 | display: table-cell; 66 | 67 | &:last-child { 68 | border-right: 0; 69 | } 70 | 71 | .user-select(none); 72 | 73 | // Default to width 0 so header height can calculate right. Otherwise 74 | // the header cells will flow onto the next line of the header container 75 | // and cause the header height to be calculated as twice the height 76 | // it should be. The column widths are calculated dynamically 77 | width: 0; 78 | 79 | .sortable { 80 | cursor: pointer; 81 | } 82 | 83 | // Moves the sort priority number closer to the icon 84 | .ui-grid-sort-priority-number { 85 | margin-left: -8px; 86 | } 87 | } 88 | 89 | // Make vertical bar in header row fill the height of the cell completely 90 | .ui-grid-header .ui-grid-vertical-bar { 91 | top: 0; 92 | bottom: 0; 93 | } 94 | 95 | .ui-grid-column-menu-button { 96 | position: absolute; 97 | right: @gridBorderWidth; // So it doesn't overlay the vertical bar 98 | top: 0; 99 | // bottom: 0; 100 | // .ui-grid-top-panel-background; 101 | 102 | .ui-grid-icon-angle-down { 103 | vertical-align: sub; 104 | } 105 | } 106 | 107 | .ui-grid-column-menu-button-last-col { 108 | margin-right: 25px; 109 | } 110 | 111 | .ui-grid-column-menu { 112 | position: absolute; 113 | } 114 | 115 | /* Slide up/down animations */ 116 | .ui-grid-column-menu .ui-grid-menu .ui-grid-menu-mid { 117 | &.ng-hide-add, &.ng-hide-remove { 118 | .transition(all, 0.05s, linear); 119 | display: block !important; 120 | } 121 | 122 | &.ng-hide-add.ng-hide-add-active, 123 | &.ng-hide-remove { 124 | .transform(translateY(-100%)); 125 | } 126 | 127 | &.ng-hide-add, 128 | &.ng-hide-remove.ng-hide-remove-active { 129 | .transform(translateY(0)); 130 | } 131 | } 132 | 133 | /* Slide up/down animations */ 134 | .ui-grid-menu-button .ui-grid-menu .ui-grid-menu-mid { 135 | &.ng-hide-add, &.ng-hide-remove { 136 | .transition(all, 0.05s, linear); 137 | display: block !important; 138 | } 139 | 140 | &.ng-hide-add.ng-hide-add-active, 141 | &.ng-hide-remove { 142 | .transform(translateY(-100%)); 143 | } 144 | 145 | &.ng-hide-add, 146 | &.ng-hide-remove.ng-hide-remove-active { 147 | .transform(translateY(0)); 148 | } 149 | } 150 | 151 | 152 | .ui-grid-filter-container { 153 | padding: 4px 10px; 154 | position: relative; 155 | 156 | .ui-grid-filter-button { 157 | position: absolute; 158 | top: 0; 159 | bottom: 0; 160 | right: 0; 161 | 162 | [class^="ui-grid-icon"] { 163 | position: absolute; 164 | top: 50%; 165 | line-height: 32px; 166 | margin-top: -16px; 167 | right: 10px; 168 | opacity: 0.66; 169 | 170 | &:hover { 171 | opacity: 1; 172 | } 173 | } 174 | } 175 | 176 | .ui-grid-filter-button-select { 177 | position: absolute; 178 | top: 0; 179 | bottom: 0; 180 | right: 0; 181 | 182 | [class^="ui-grid-icon"] { 183 | position: absolute; 184 | top: 50%; 185 | line-height: 32px; 186 | margin-top: -16px; 187 | right: 0px; 188 | opacity: 0.66; 189 | 190 | &:hover { 191 | opacity: 1; 192 | } 193 | } 194 | } 195 | } 196 | 197 | input[type="text"].ui-grid-filter-input { 198 | padding: 0; 199 | margin: 0; 200 | border: 0; 201 | width: 100%; 202 | 203 | border: @gridBorderWidth solid @borderColor; 204 | .border-radius(@gridBorderRadius); 205 | 206 | &:hover { 207 | border: @gridBorderWidth solid @borderColor; 208 | } 209 | } 210 | 211 | select.ui-grid-filter-select { 212 | padding: 0; 213 | margin: 0; 214 | border: 0; 215 | width: 90%; 216 | 217 | border: @gridBorderWidth solid @borderColor; 218 | .border-radius(@gridBorderRadius); 219 | 220 | &:hover { 221 | border: @gridBorderWidth solid @borderColor; 222 | } 223 | 224 | .ui-grid-filter-cancel-button-hidden & { 225 | width: 100%; 226 | } 227 | } 228 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/icons.less: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'ui-grid'; 3 | src: url('@{font-path}ui-grid.eot'); 4 | src: url('@{font-path}ui-grid.eot#iefix') format('embedded-opentype'), 5 | url('@{font-path}ui-grid.woff') format('woff'), 6 | url('@{font-path}ui-grid.ttf') format('truetype'), 7 | url('@{font-path}ui-grid.svg?#ui-grid') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 12 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 13 | /* 14 | @media screen and (-webkit-min-device-pixel-ratio:0) { 15 | @font-face { 16 | font-family: 'ui-grid'; 17 | src: url('@{font-path}ui-grid.svg?12312827#ui-grid') format('svg'); 18 | } 19 | } 20 | */ 21 | 22 | [class^="ui-grid-icon"]:before, [class*=" ui-grid-icon"]:before { 23 | font-family: "ui-grid"; 24 | font-style: normal; 25 | font-weight: normal; 26 | speak: none; 27 | 28 | display: inline-block; 29 | text-decoration: inherit; 30 | width: 1em; 31 | margin-right: .2em; 32 | text-align: center; 33 | /* opacity: .8; */ 34 | 35 | /* For safety - reset parent styles, that can break glyph codes*/ 36 | font-variant: normal; 37 | text-transform: none; 38 | 39 | /* fix buttons height, for twitter bootstrap */ 40 | line-height: 1em; 41 | 42 | /* Animation center compensation - margins should be symmetric */ 43 | /* remove if not needed */ 44 | margin-left: .2em; 45 | 46 | /* you can be more comfortable with increased icons size */ 47 | /* font-size: 120%; */ 48 | 49 | /* Uncomment for 3D effect */ 50 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 51 | } 52 | 53 | .ui-grid-icon-blank::before { 54 | width: 1em; 55 | content: ' '; 56 | } 57 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/importer/less/importer.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-importer-header { 4 | } 5 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/main.less: -------------------------------------------------------------------------------- 1 | @import (once, reference) 'bootstrap/bootstrap'; 2 | @import 'grid'; 3 | @import 'header'; 4 | @import 'body'; 5 | @import 'cell'; 6 | @import 'footer'; 7 | @import 'menu'; 8 | @import 'sorting'; 9 | @import 'icons'; 10 | @import 'rtl'; 11 | @import 'animation'; 12 | @import 'elements'; 13 | @import 'variables'; -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/menu.less: -------------------------------------------------------------------------------- 1 | .ui-grid-menu-button { 2 | z-index: 2; 3 | position: absolute; 4 | right: 0; 5 | top: 0; 6 | background: @headerBackgroundColor; 7 | border: @gridBorderWidth solid @borderColor; 8 | cursor: pointer; 9 | height: 31px; 10 | font-weight: normal; 11 | } 12 | 13 | .ui-grid-menu-button .ui-grid-icon-container { 14 | margin-top: 3px; 15 | } 16 | 17 | .ui-grid-menu-button .ui-grid-menu { 18 | right: 0; 19 | .ui-grid-menu-mid { 20 | overflow: scroll; 21 | border: @gridBorderWidth solid @borderColor; 22 | } 23 | } 24 | 25 | .ui-grid-menu { 26 | z-index: 2; // So it shows up over grid canvas 27 | position: absolute; 28 | padding: 0 10px 20px 10px; 29 | cursor: pointer; 30 | box-sizing: border-box; 31 | } 32 | 33 | .ui-grid-menu .ui-grid-menu-inner { 34 | background: @headerBackgroundColor; 35 | border: @gridBorderWidth solid @borderColor; 36 | position: relative; 37 | white-space: nowrap; 38 | 39 | .rounded(@gridBorderRadius); 40 | .box-shadow(e("0 10px 20px rgba(0, 0, 0, 0.2), inset 0 12px 12px -14px rgba(0, 0, 0, 0.2)")); 41 | 42 | // Small hidden close button that only appears when focused. 43 | .ui-grid-menu-close-button { 44 | position: absolute; 45 | right: 0px; 46 | top: 0px; 47 | #ui-grid-twbs > .btn(); 48 | #ui-grid-twbs > .button-size(1px; 1px; 10px; 1; 2px); 49 | #ui-grid-twbs > .button-variant(transparent, transparent, transparent); 50 | > i { 51 | opacity: 0.75; 52 | color: black; 53 | } 54 | } 55 | } 56 | 57 | .ui-grid-menu .ui-grid-menu-inner ul { 58 | margin: 0; 59 | padding: 0; 60 | list-style-type: none; 61 | 62 | li { 63 | padding: 0px; 64 | button { 65 | min-width: 100%; 66 | padding: 8px; 67 | text-align: left; 68 | background: transparent; 69 | border: none; 70 | 71 | // Show a shadow when hovering over a menu item 72 | &:hover, 73 | &:focus { 74 | // background-color: negation(@headerBackgroundColor, #fff); 75 | .inner-shadow(@vertical: 0, @blur: 14px, @alpha: 0.2); 76 | } 77 | &.ui-grid-menu-item-active { 78 | .inner-shadow(@vertical: 0, @blur: 14px, @alpha: 0.2); 79 | background-color: @selectedColor; 80 | } 81 | } 82 | } 83 | 84 | // Show a bottom border on all but the last menu item 85 | li:not(:last-child) > button { 86 | border-bottom: @gridBorderWidth solid @borderColor; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/move-columns/less/colMovable.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .movingColumn { 4 | position: absolute; 5 | top: 0; 6 | border: 1px solid @borderColor; 7 | box-shadow: inset 0 0 14px rgba(0, 0, 0, 0.2); 8 | 9 | .ui-grid-icon-angle-down { 10 | display: none; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/pagination/less/pagination.less: -------------------------------------------------------------------------------- 1 | @import "../../../less/variables"; 2 | @import "../../../less/elements"; 3 | @import (reference) "../../../less/bootstrap/bootstrap"; 4 | 5 | .ui-grid-pager-panel { 6 | position: absolute; 7 | left: 0; 8 | bottom: 0; 9 | width: 100%; 10 | padding-top: 3px; 11 | padding-bottom: 3px; 12 | box-sizing: content-box; 13 | } 14 | 15 | .ui-grid-pager-container { 16 | float: left; 17 | } 18 | 19 | .ui-grid-pager-control { 20 | margin-right: 10px; 21 | margin-left: 10px; 22 | min-width: 135px; 23 | float: left; 24 | 25 | button { 26 | height: 25px; 27 | min-width: 26px; 28 | #ui-grid-twbs > .btn; 29 | #ui-grid-twbs > .button-variant(@paginationButtonColor, @paginationButtonBackgroundColor, @paginationButtonBorderColor); 30 | } 31 | 32 | input { 33 | #ui-grid-twbs > .form-control(); 34 | #ui-grid-twbs > .input-sm (); 35 | display: inline; 36 | height: 26px; 37 | width: 50px; 38 | vertical-align: top; 39 | } 40 | 41 | .ui-grid-pager-max-pages-number{ 42 | vertical-align: bottom; 43 | > * { 44 | vertical-align: middle; 45 | } 46 | } 47 | 48 | .first-bar { 49 | width: 10px; 50 | border-left: 2px solid #4d4d4d; 51 | margin-top: -6px; 52 | height: 12px; 53 | margin-left: -3px; 54 | } 55 | 56 | .first-bar-rtl { 57 | width: 10px; 58 | border-left: 2px solid #4d4d4d; 59 | margin-top: -6px; 60 | height: 12px; 61 | margin-right: -7px; 62 | } 63 | 64 | .first-triangle { 65 | width: 0; 66 | height: 0; 67 | border-style: solid; 68 | border-width: 5px 8.7px 5px 0; 69 | border-color: transparent #4d4d4d transparent transparent; 70 | margin-left: 2px; 71 | } 72 | 73 | .next-triangle { 74 | margin-left: 1px; 75 | } 76 | 77 | .prev-triangle { 78 | margin-left: 0; 79 | } 80 | 81 | .last-triangle { 82 | width: 0; 83 | height: 0; 84 | border-style: solid; 85 | border-width: 5px 0 5px 8.7px; 86 | border-color: transparent transparent transparent #4d4d4d; 87 | margin-left: -1px; 88 | } 89 | 90 | .last-bar { 91 | width: 10px; 92 | border-left: 2px solid #4d4d4d; 93 | margin-top: -6px; 94 | height: 12px; 95 | margin-left: 1px; 96 | } 97 | 98 | .last-bar-rtl { 99 | width: 10px; 100 | border-left: 2px solid #4d4d4d; 101 | margin-top: -6px; 102 | height: 12px; 103 | margin-right: -11px; 104 | } 105 | 106 | 107 | } 108 | 109 | .ui-grid-pager-row-count-picker { 110 | float: left; 111 | 112 | select { 113 | #ui-grid-twbs > .form-control; 114 | #ui-grid-twbs > .input-sm (); 115 | height: 26px; 116 | width: 67px; 117 | display: inline; 118 | } 119 | 120 | .ui-grid-pager-row-count-label { 121 | margin-top: 3px; 122 | } 123 | } 124 | 125 | .ui-grid-pager-count-container { 126 | float: right; 127 | margin-top: 4px; 128 | min-width: 50px; 129 | 130 | .ui-grid-pager-count { 131 | margin-right: 10px; 132 | margin-left: 10px; 133 | float: right; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/pinning/less/pinning.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-pinned-container { 4 | position: absolute; 5 | display: inline; 6 | top: 0; 7 | 8 | &.ui-grid-pinned-container-left { 9 | float: left; 10 | left: 0; 11 | } 12 | 13 | &.ui-grid-pinned-container-right { 14 | float: right; 15 | right: 0; 16 | } 17 | 18 | &.ui-grid-pinned-container-left .ui-grid-header-cell:last-child { 19 | box-sizing: border-box; 20 | border-right: @gridBorderWidth solid; 21 | border-width: @gridBorderWidth; 22 | border-right-color: darken(@headerVerticalBarColor, 15%); 23 | } 24 | 25 | &.ui-grid-pinned-container-left .ui-grid-cell:last-child { 26 | box-sizing: border-box; 27 | border-right: @gridBorderWidth solid; 28 | border-width: @gridBorderWidth; 29 | border-right-color: darken(@verticalBarColor, 15%); 30 | } 31 | 32 | &.ui-grid-pinned-container-left .ui-grid-header-cell:not(:last-child) .ui-grid-vertical-bar, .ui-grid-cell:not(:last-child) .ui-grid-vertical-bar { 33 | width: @gridBorderWidth; 34 | } 35 | 36 | &.ui-grid-pinned-container-left .ui-grid-header-cell:not(:last-child) .ui-grid-vertical-bar { 37 | background-color: @headerVerticalBarColor; 38 | } 39 | 40 | &.ui-grid-pinned-container-left .ui-grid-cell:not(:last-child) .ui-grid-vertical-bar { 41 | background-color: darken(@verticalBarColor, 15%); 42 | } 43 | 44 | &.ui-grid-pinned-container-left .ui-grid-header-cell:last-child .ui-grid-vertical-bar { 45 | right: -1px; // TODO(c0bra): Should this be grid width? Test column resizing with custom grid border width 46 | width: @gridBorderWidth; 47 | background-color: darken(@headerVerticalBarColor, 15%); 48 | } 49 | 50 | 51 | &.ui-grid-pinned-container-right .ui-grid-header-cell:first-child { 52 | box-sizing: border-box; 53 | border-left: @gridBorderWidth solid; 54 | border-width: @gridBorderWidth; 55 | border-left-color: darken(@headerVerticalBarColor, 15%); 56 | } 57 | 58 | &.ui-grid-pinned-container-right .ui-grid-cell:first-child { 59 | box-sizing: border-box; 60 | border-left: @gridBorderWidth solid; 61 | border-width: @gridBorderWidth; 62 | border-left-color: darken(@verticalBarColor, 15%); 63 | } 64 | 65 | &.ui-grid-pinned-container-right .ui-grid-header-cell:not(:first-child) .ui-grid-vertical-bar, .ui-grid-cell:not(:first-child) .ui-grid-vertical-bar { 66 | width: @gridBorderWidth; 67 | } 68 | 69 | &.ui-grid-pinned-container-right .ui-grid-header-cell:not(:first-child) .ui-grid-vertical-bar { 70 | background-color: @headerVerticalBarColor; 71 | } 72 | 73 | &.ui-grid-pinned-container-right .ui-grid-cell:not(:last-child) .ui-grid-vertical-bar { 74 | background-color: darken(@verticalBarColor, 15%); 75 | } 76 | 77 | &.ui-grid-pinned-container-first .ui-grid-header-cell:first-child .ui-grid-vertical-bar { 78 | left: -1px; // TODO(c0bra): Should this be grid width? Test column resizing with custom grid border width 79 | width: @gridBorderWidth; 80 | background-color: darken(@headerVerticalBarColor, 15%); 81 | } 82 | } 83 | 84 | .ui-grid-render-container-body { 85 | // float: left; 86 | } 87 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/resize-columns/less/column-resizer.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-column-resizer { 4 | top: 0; 5 | bottom: 0; 6 | width: 5px; 7 | position: absolute; 8 | cursor: col-resize; 9 | 10 | &.left { 11 | left: 0; 12 | } 13 | 14 | &.right { 15 | right: 0; 16 | } 17 | } 18 | 19 | // Add a visual border for final column's resizer element 20 | .ui-grid-header-cell:last-child .ui-grid-column-resizer.right { 21 | border-right: @gridBorderWidth solid @borderColor; 22 | } 23 | 24 | // Put visual border on left of last header cell when direction is rtl 25 | .ui-grid[dir=rtl] .ui-grid-header-cell:last-child { 26 | .ui-grid-column-resizer.right { 27 | border-right: 0; 28 | } 29 | 30 | .ui-grid-column-resizer.left { 31 | border-left: @gridBorderWidth solid @borderColor; 32 | } 33 | } 34 | 35 | .ui-grid { 36 | &.column-resizing { 37 | cursor: col-resize; 38 | } 39 | } 40 | 41 | .ui-grid.column-resizing .ui-grid-resize-overlay { 42 | position: absolute; 43 | top: 0; 44 | height: 100%; 45 | width: @gridBorderWidth; 46 | background-color: darken(@verticalBarColor, 15%); 47 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/row-edit/less/rowEdit.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-row-saving { 4 | .ui-grid-cell { 5 | color: @rowSavingForeground !important; 6 | } 7 | } 8 | 9 | .ui-grid-row-dirty { 10 | .ui-grid-cell { 11 | color: @rowDirtyForeground; 12 | } 13 | } 14 | 15 | .ui-grid-row-error { 16 | .ui-grid-cell { 17 | color: @rowErrorForeground !important; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/rtl.less: -------------------------------------------------------------------------------- 1 | /* 2 | * RTL Styles 3 | */ 4 | 5 | .ui-grid[dir=rtl] { 6 | 7 | .ui-grid-header-cell, 8 | .ui-grid-footer-cell, 9 | .ui-grid-cell { 10 | float: right !important; 11 | } 12 | 13 | .ui-grid-column-menu-button { 14 | position: absolute; 15 | left: 1px; 16 | top: 0; 17 | right: inherit; 18 | } 19 | 20 | .ui-grid-cell:first-child, 21 | .ui-grid-header-cell:first-child, 22 | .ui-grid-footer-cell:first-child { 23 | border-right: 0; 24 | } 25 | 26 | .ui-grid-cell:last-child, .ui-grid-header-cell:last-child { 27 | border-right: @gridBorderWidth solid @borderColor; 28 | border-left: 0; 29 | } 30 | 31 | .ui-grid-header-cell:first-child .ui-grid-vertical-bar, 32 | .ui-grid-footer-cell:first-child .ui-grid-vertical-bar, 33 | .ui-grid-cell:first-child .ui-grid-vertical-bar { 34 | width: 0; 35 | } 36 | 37 | .ui-grid-menu-button { 38 | z-index: 2; 39 | position: absolute; 40 | left: 0; 41 | right: auto; 42 | background: @headerBackgroundColor; 43 | border: @gridBorderWidth solid @borderColor; 44 | cursor: pointer; 45 | min-height: 27px; 46 | font-weight: normal; 47 | } 48 | 49 | .ui-grid-menu-button .ui-grid-menu { 50 | left: 0; 51 | right: auto; 52 | } 53 | 54 | // Position filter-cancel button on the left for rtl grids 55 | .ui-grid-filter-container .ui-grid-filter-button { 56 | right: initial; 57 | left: 0; 58 | 59 | [class^="ui-grid-icon"] { 60 | right: initial; 61 | left: 10px; 62 | } 63 | } 64 | 65 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/selection/less/selection.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell { 4 | background-color: @rowSelected; 5 | } 6 | 7 | .ui-grid-disable-selection { 8 | -webkit-touch-callout: none; 9 | -webkit-user-select: none; 10 | -khtml-user-select: none; 11 | -moz-user-select: none; 12 | -ms-user-select: none; 13 | user-select: none; 14 | cursor: default; 15 | } 16 | 17 | .ui-grid-selection-row-header-buttons { 18 | cursor: pointer; 19 | opacity: 0.1; 20 | 21 | &.ui-grid-row-selected { 22 | opacity: 1; 23 | } 24 | 25 | &.ui-grid-all-selected { 26 | opacity: 1; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/sorting.less: -------------------------------------------------------------------------------- 1 | // .ui-grid-sortarrow { 2 | // fill: @sortArrowBackgroundColor; 3 | // stroke: @sortArrowBorderColor; 4 | // stroke-linejoin:miter; 5 | // } 6 | 7 | // .ui-grid-sortarrow.down { 8 | // -webkit-transform: rotate(180deg); 9 | // -moz-transform: rotate(180deg); 10 | // -ms-transform: rotate(180deg); 11 | // -o-transform: rotate(180deg); 12 | // transform: rotate(180deg); 13 | // } 14 | 15 | 16 | @sortArrowWidth: 20px; 17 | 18 | .ui-grid-sortarrow { 19 | right: 5px; 20 | position: absolute; 21 | width: @sortArrowWidth; 22 | top: 0; 23 | bottom: 0; 24 | background-position: center; 25 | 26 | &.down { 27 | .transform(rotate(180deg)); 28 | } 29 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/tree-base/less/tree-base.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-tree-row-header-buttons.ui-grid-tree-header { 4 | cursor: pointer; 5 | opacity: 1; 6 | } 7 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/tree-view/less/tree-view.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | .ui-grid-tree-header-row { 4 | font-weight: bold !important; 5 | } 6 | .ui-grid-tree-header-row .ui-grid-cell.ui-grid-disable-selection.ui-grid-row-header-cell { 7 | pointer-events: all; 8 | } 9 | -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/ui-grid.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/angular-ui-grid/ui-grid.eot -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/ui-grid.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/angular-ui-grid/ui-grid.ttf -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/ui-grid.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/angular-ui-grid/ui-grid.woff -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/validate/less/validate.less: -------------------------------------------------------------------------------- 1 | @import '../../../less/variables'; 2 | 3 | div.ui-grid-cell-contents.invalid { 4 | border: @invalidValueBorder; 5 | } -------------------------------------------------------------------------------- /html/lib/angular-ui-grid/variables.less: -------------------------------------------------------------------------------- 1 | 2 | /* This file contains variable declarations (do not remove this line) */ 3 | 4 | /*-- VARIABLES (DO NOT REMOVE THESE COMMENTS) --*/ 5 | 6 | @bootstrapDirectory: "../../../node_modules/bootstrap"; 7 | 8 | /** 9 | * @section Grid styles 10 | */ 11 | @gridBorderWidth: 1px; 12 | @gridBorderRadius: 0px; 13 | @borderColor: #d4d4d4; 14 | 15 | 16 | /** 17 | * @section Header styles 18 | */ 19 | 20 | /** @description Colors for header gradient */ 21 | @headerBackgroundColor: #f3f3f3; 22 | @headerGradientStart: #eee; 23 | @headerGradientStop: #fff; 24 | @headerVerticalBarColor: @borderColor; 25 | 26 | /** 27 | * @section Grid body styles 28 | */ 29 | 30 | /** @description Colors used for row alternation */ 31 | @verticalBarColor: @borderColor; 32 | @rowColorEven: #f3f3f3; 33 | @rowColorOdd: #fdfdfd; 34 | 35 | // TODO: colors for buttons 36 | 37 | /** 38 | * @section Sort arrow colors 39 | */ 40 | 41 | @sortArrowBackgroundColor: #aaaaaa; 42 | @sortArrowBorderColor: #777777; 43 | 44 | 45 | // TODO: color for menu background 46 | @rowHeaderCell: #F0F0EE; 47 | @rowSelected: #C9DDE1; 48 | @rowSavingForeground: #848484; 49 | @rowErrorForeground: #FF0000; 50 | @rowDirtyForeground: #610B38; 51 | 52 | // TODO: color for cell selections 53 | @focusedCell: #b3c4c7; 54 | 55 | // Color to use for enabled or selected settings/items/cells, etc. Should probably override the one above 56 | @selectedColor: #cecece; 57 | 58 | /** 59 | * @section Scrollbar styles 60 | */ 61 | @scrollbarBackground: darken(@rowColorEven, 15%); 62 | @scrollbarBackgroundHover: darken(@scrollbarBackground, 15%); 63 | @scrollbarBackgroundScrolling: darken(@scrollbarBackgroundHover, 15%); 64 | @scrollbarWidth: 10px; 65 | @scrollbarBorderRadius: 2px; 66 | @scrollbarShadow: 0 0 0px #fff; 67 | @scrollbarBorder: 1px solid darken(@scrollbarBackground, 15%); 68 | @scrollbarBorderScrolling: 1px solid darken(@scrollbarBackgroundScrolling, 15%); 69 | 70 | //Border to be applied to editors when the input value or invalid 71 | @invalidValueBorder: 1px solid rgb(252, 143, 143); 72 | @validValueBorder: 1px solid @borderColor; 73 | 74 | //Pagination controls 75 | @paginationButtonColor: @headerGradientStart; 76 | @paginationButtonBackgroundColor: @headerBackgroundColor; 77 | @paginationButtonBorderColor: #ccc; 78 | 79 | 80 | /** 81 | * @section font library path 82 | */ 83 | @font-path: ''; 84 | 85 | /*-- END VARIABLES (DO NOT REMOVE THESE COMMENTS) --*/ 86 | -------------------------------------------------------------------------------- /html/lib/bootstrap-submenu/css/bootstrap-submenu.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["less/bootstrap-submenu.less","less/mixins.less"],"names":[],"mappings":"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","sourcesContent":["// :after: friends with IE8. Use ::after in future.\n\n@import \"../node_modules/bootstrap/less/variables.less\";\n@import \"mixins.less\";\n\n// Variables\n@caret-margin: -@caret-width-base * 2 - 2;\n\n//\n// Sub-Menus\n// --------------------------------------------------\n\n.dropdown-submenu > a:after {\n content: \"\";\n}\n\n@media (min-width: @grid-float-breakpoint) {\n .dropdown-submenu {\n position: relative;\n\n .dropdown-menu {\n top: 0;\n left: 100%;\n margin-top: -6px;\n border-top-left-radius: 0;\n\n // Strictly before .dropdown-menu-right\n .dropup &,\n .navbar-fixed-bottom & {\n top: auto;\n bottom: 0;\n margin-top: 0;\n margin-bottom: -6px;\n border-top-left-radius: @border-radius-base;\n border-bottom-left-radius: 0;\n }\n\n .dropdown-menu-right &,\n .navbar-right & {\n left: auto;\n right: 100%;\n\n border-top-left-radius: @border-radius-base;\n border-top-right-radius: 0;\n\n .dropup &,\n .navbar-fixed-bottom & {\n border-radius: @border-radius-base @border-radius-base 0;\n }\n }\n }\n\n > a:after {\n float: right;\n margin-top: @line-height-computed / 2 - @caret-width-base;\n margin-right: @caret-margin;\n\n .make-caret(left, top, bottom);\n\n .dropdown-menu-right &,\n .navbar-right & {\n float: left;\n border-left: none;\n margin-left: @caret-margin;\n margin-right: 0;\n\n .make-caret(right, top, bottom);\n }\n }\n }\n}\n\n@media (max-width: @grid-float-breakpoint-max) {\n .dropdown-submenu {\n .dropdown-menu {\n position: static;\n margin-top: 0;\n border: 0;\n box-shadow: none;\n }\n\n > a:after {\n margin-left: 6px;\n display: inline-block;\n vertical-align: middle;\n\n .make-caret(top, left, right);\n }\n }\n\n .dropdown-menu > .dropdown-submenu {\n .dropdown > &,\n .dropup > &,\n .btn-group > & {\n .make-nested-list(30px, 0, 4);\n }\n\n .navbar-nav > .dropdown > & {\n .make-nested-list(35px, 0, 4);\n }\n }\n}\n",".make-caret(@base, @left, @right) {\n // dashed: fix caret size for Mozilla Firefox\n border-@{base}: @caret-width-base dashed;\n\n border-@{left}: @caret-width-base solid transparent;\n border-@{right}: @caret-width-base solid transparent;\n}\n\n.make-nested-list(@offset, @i, @n) when (@i < @n) {\n > .dropdown-menu > li {\n &.dropdown-header,\n > a {\n padding-left: @offset + (10 * @i);\n }\n\n .make-nested-list(@offset, @i + 1, @n);\n }\n}\n"]} -------------------------------------------------------------------------------- /html/lib/bootstrap-submenu/css/bootstrap-submenu.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap-submenu v2.0.4 (https://vsn4ik.github.io/bootstrap-submenu/) 3 | * Copyright 2014-2016 Vasily A. (https://github.com/vsn4ik) 4 | * Licensed under the MIT license 5 | */ 6 | 7 | .dropdown-submenu>a:after{content:""}@media (min-width:768px){.dropdown-submenu{position:relative}.dropdown-submenu .dropdown-menu{top:0;left:100%;margin-top:-6px;border-top-left-radius:0}.dropup .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .dropdown-submenu .dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-6px;border-top-left-radius:4px;border-bottom-left-radius:0}.dropdown-menu-right .dropdown-submenu .dropdown-menu,.navbar-right .dropdown-submenu .dropdown-menu{left:auto;right:100%;border-top-left-radius:4px;border-top-right-radius:0}.dropup .dropdown-menu-right .dropdown-submenu .dropdown-menu,.dropup .navbar-right .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .dropdown-menu-right .dropdown-submenu .dropdown-menu,.navbar-fixed-bottom .navbar-right .dropdown-submenu .dropdown-menu{border-radius:4px 4px 0}.dropdown-submenu>a:after{float:right;margin-top:6px;margin-right:-10px;border-left:4px dashed;border-top:4px solid transparent;border-bottom:4px solid transparent}.dropdown-menu-right .dropdown-submenu>a:after,.navbar-right .dropdown-submenu>a:after{float:left;border-left:none;margin-left:-10px;margin-right:0;border-right:4px dashed;border-top:4px solid transparent;border-bottom:4px solid transparent}}@media (max-width:767px){.dropdown-submenu .dropdown-menu{position:static;margin-top:0;border:0;box-shadow:none}.dropdown-submenu>a:after{margin-left:6px;display:inline-block;vertical-align:middle;border-top:4px dashed;border-left:4px solid transparent;border-right:4px solid transparent}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a{padding-left:30px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:40px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:50px}.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.btn-group>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.dropup>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:60px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>a{padding-left:35px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:45px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:55px}.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li.dropdown-header,.navbar-nav>.dropdown>.dropdown-menu>.dropdown-submenu>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>.dropdown-menu>li>a{padding-left:65px}} -------------------------------------------------------------------------------- /html/lib/bootstrap-submenu/js/bootstrap-submenu.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap-submenu v2.0.4 (https://vsn4ik.github.io/bootstrap-submenu/) 3 | * Copyright 2014-2016 Vasily A. (https://github.com/vsn4ik) 4 | * Licensed under the MIT license 5 | */ 6 | 7 | /** 8 | * $.inArray: friends with IE8. Use Array.prototype.indexOf in future. 9 | * $.proxy: friends with IE8. Use Function.prototype.bind in future. 10 | */ 11 | 12 | 'use strict'; 13 | 14 | (function(factory) { 15 | if (typeof define == 'function' && define.amd) { 16 | // AMD. Register as an anonymous module 17 | define(['jquery'], factory); 18 | } 19 | else if (typeof exports == 'object') { 20 | // Node/CommonJS 21 | module.exports = factory(require('jquery')); 22 | } 23 | else { 24 | // Browser globals 25 | factory(jQuery); 26 | } 27 | })(function($) { 28 | function Item(element) { 29 | this.$element = $(element); 30 | this.$menu = this.$element.closest('.dropdown-menu'); 31 | this.$main = this.$menu.parent(); 32 | this.$items = this.$menu.children('.dropdown-submenu'); 33 | 34 | this.init(); 35 | } 36 | 37 | Item.prototype = { 38 | init: function() { 39 | this.$element.on('keydown', $.proxy(this, 'keydown')); 40 | }, 41 | close: function() { 42 | this.$main.removeClass('open'); 43 | this.$items.trigger('hide.bs.submenu'); 44 | }, 45 | keydown: function(event) { 46 | // 27: Esc 47 | 48 | if (event.keyCode == 27) { 49 | event.stopPropagation(); 50 | 51 | this.close(); 52 | this.$main.children('a, button').trigger('focus'); 53 | } 54 | } 55 | }; 56 | 57 | function SubmenuItem(element) { 58 | this.$element = $(element); 59 | this.$main = this.$element.parent(); 60 | this.$menu = this.$main.children('.dropdown-menu'); 61 | this.$subs = this.$main.siblings('.dropdown-submenu'); 62 | this.$items = this.$menu.children('.dropdown-submenu'); 63 | 64 | this.init(); 65 | } 66 | 67 | $.extend(SubmenuItem.prototype, Item.prototype, { 68 | init: function() { 69 | this.$element.on({ 70 | click: $.proxy(this, 'click'), 71 | keydown: $.proxy(this, 'keydown') 72 | }); 73 | 74 | this.$main.on('hide.bs.submenu', $.proxy(this, 'hide')); 75 | }, 76 | click: function(event) { 77 | // Fix a[href="#"]. For community 78 | event.preventDefault(); 79 | 80 | event.stopPropagation(); 81 | 82 | this.toggle(); 83 | }, 84 | hide: function(event) { 85 | // Stop event bubbling 86 | event.stopPropagation(); 87 | 88 | this.close(); 89 | }, 90 | open: function() { 91 | this.$main.addClass('open'); 92 | this.$subs.trigger('hide.bs.submenu'); 93 | }, 94 | toggle: function() { 95 | if (this.$main.hasClass('open')) { 96 | this.close(); 97 | } 98 | else { 99 | this.open(); 100 | } 101 | }, 102 | keydown: function(event) { 103 | // 13: Return, 32: Spacebar 104 | 105 | if (event.keyCode == 32) { 106 | // Off vertical scrolling 107 | event.preventDefault(); 108 | } 109 | 110 | if ($.inArray(event.keyCode, [13, 32]) != -1) { 111 | this.toggle(); 112 | } 113 | } 114 | }); 115 | 116 | function Submenupicker(element) { 117 | this.$element = $(element); 118 | this.$main = this.$element.parent(); 119 | this.$menu = this.$main.children('.dropdown-menu'); 120 | this.$items = this.$menu.children('.dropdown-submenu'); 121 | 122 | this.init(); 123 | } 124 | 125 | Submenupicker.prototype = { 126 | init: function() { 127 | this.$menu.off('keydown.bs.dropdown.data-api'); 128 | this.$menu.on('keydown', $.proxy(this, 'itemKeydown')); 129 | 130 | this.$menu.find('li > a').each(function() { 131 | new Item(this); 132 | }); 133 | 134 | this.$menu.find('.dropdown-submenu > a').each(function() { 135 | new SubmenuItem(this); 136 | }); 137 | 138 | this.$main.on('hidden.bs.dropdown', $.proxy(this, 'hidden')); 139 | }, 140 | hidden: function() { 141 | this.$items.trigger('hide.bs.submenu'); 142 | }, 143 | itemKeydown: function(event) { 144 | // 38: Arrow up, 40: Arrow down 145 | 146 | if ($.inArray(event.keyCode, [38, 40]) != -1) { 147 | // Off vertical scrolling 148 | event.preventDefault(); 149 | 150 | event.stopPropagation(); 151 | 152 | var $items = this.$menu.find('li:not(.disabled):visible > a'); 153 | var index = $items.index(event.target); 154 | 155 | if (event.keyCode == 38 && index !== 0) { 156 | index--; 157 | } 158 | else if (event.keyCode == 40 && index !== $items.length - 1) { 159 | index++; 160 | } 161 | else { 162 | return; 163 | } 164 | 165 | $items.eq(index).trigger('focus'); 166 | } 167 | } 168 | }; 169 | 170 | var old = $.fn.submenupicker; 171 | 172 | // For AMD/Node/CommonJS used elements (optional) 173 | // http://learn.jquery.com/jquery-ui/environments/amd/ 174 | $.fn.submenupicker = function(elements) { 175 | var $elements = this instanceof $ ? this : $(elements); 176 | 177 | return $elements.each(function() { 178 | var data = $.data(this, 'bs.submenu'); 179 | 180 | if (!data) { 181 | data = new Submenupicker(this); 182 | 183 | $.data(this, 'bs.submenu', data); 184 | } 185 | }); 186 | }; 187 | 188 | $.fn.submenupicker.Constructor = Submenupicker; 189 | $.fn.submenupicker.noConflict = function() { 190 | $.fn.submenupicker = old; 191 | return this; 192 | }; 193 | 194 | return $.fn.submenupicker; 195 | }); 196 | -------------------------------------------------------------------------------- /html/lib/bootstrap-submenu/js/bootstrap-submenu.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap-submenu v2.0.4 (https://vsn4ik.github.io/bootstrap-submenu/) 3 | * Copyright 2014-2016 Vasily A. (https://github.com/vsn4ik) 4 | * Licensed under the MIT license 5 | */ 6 | 7 | "use strict";!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){function b(b){this.$element=a(b),this.$menu=this.$element.closest(".dropdown-menu"),this.$main=this.$menu.parent(),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}function c(b){this.$element=a(b),this.$main=this.$element.parent(),this.$menu=this.$main.children(".dropdown-menu"),this.$subs=this.$main.siblings(".dropdown-submenu"),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}function d(b){this.$element=a(b),this.$main=this.$element.parent(),this.$menu=this.$main.children(".dropdown-menu"),this.$items=this.$menu.children(".dropdown-submenu"),this.init()}b.prototype={init:function(){this.$element.on("keydown",a.proxy(this,"keydown"))},close:function(){this.$main.removeClass("open"),this.$items.trigger("hide.bs.submenu")},keydown:function(a){27==a.keyCode&&(a.stopPropagation(),this.close(),this.$main.children("a, button").trigger("focus"))}},a.extend(c.prototype,b.prototype,{init:function(){this.$element.on({click:a.proxy(this,"click"),keydown:a.proxy(this,"keydown")}),this.$main.on("hide.bs.submenu",a.proxy(this,"hide"))},click:function(a){a.preventDefault(),a.stopPropagation(),this.toggle()},hide:function(a){a.stopPropagation(),this.close()},open:function(){this.$main.addClass("open"),this.$subs.trigger("hide.bs.submenu")},toggle:function(){this.$main.hasClass("open")?this.close():this.open()},keydown:function(b){32==b.keyCode&&b.preventDefault(),-1!=a.inArray(b.keyCode,[13,32])&&this.toggle()}}),d.prototype={init:function(){this.$menu.off("keydown.bs.dropdown.data-api"),this.$menu.on("keydown",a.proxy(this,"itemKeydown")),this.$menu.find("li > a").each(function(){new b(this)}),this.$menu.find(".dropdown-submenu > a").each(function(){new c(this)}),this.$main.on("hidden.bs.dropdown",a.proxy(this,"hidden"))},hidden:function(){this.$items.trigger("hide.bs.submenu")},itemKeydown:function(b){if(-1!=a.inArray(b.keyCode,[38,40])){b.preventDefault(),b.stopPropagation();var c=this.$menu.find("li:not(.disabled):visible > a"),d=c.index(b.target);if(38==b.keyCode&&0!==d)d--;else{if(40!=b.keyCode||d===c.length-1)return;d++}c.eq(d).trigger("focus")}}};var e=a.fn.submenupicker;return a.fn.submenupicker=function(b){var c=this instanceof a?this:a(b);return c.each(function(){var b=a.data(this,"bs.submenu");b||(b=new d(this),a.data(this,"bs.submenu",b))})},a.fn.submenupicker.Constructor=d,a.fn.submenupicker.noConflict=function(){return a.fn.submenupicker=e,this},a.fn.submenupicker}); -------------------------------------------------------------------------------- /html/lib/bootstrap/bootstrap-theme.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /html/lib/bootstrap/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/bootstrap/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /html/lib/bootstrap/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/bootstrap/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /html/lib/bootstrap/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/bootstrap/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /html/lib/bootstrap/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/bootstrap/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /html/lib/bootstrap/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /html/lib/flotr2/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Flotr2 Contribution Guidelines 2 | 3 | Flotr2 requires community involvement to be a successful project. Please 4 | reach out via the community or http://humblesoftware.com/ if you are 5 | interested in contributing. 6 | 7 | ## Help 8 | 9 | For questions about the usage of Flotr2, please visit the Google Group at 10 | https://groups.google.com/group/flotr2/. If appropriate, please include a fork of http://jsfiddle.net/cesutherland/ZFBj5/ with your 11 | question. 12 | 13 | ## Bugs 14 | 15 | * Create an example of your issue in a fork of http://jsfiddle.net/cesutherland/ZFBj5/ 16 | * File a ticket at https://github.com/HumbleSoftware/Flotr2/issues 17 | 18 | ## Submitting Changes 19 | 20 | * Push changes to a topic branch in your fork of Flotr2 21 | * Submit a pull request to https://github.com/HumbleSoftware/Flotr2 22 | -------------------------------------------------------------------------------- /html/lib/flotr2/README.md: -------------------------------------------------------------------------------- 1 | Flotr2 2 | ====== 3 | 4 | The Canvas graphing library. 5 | 6 | ![Google Groups](http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif) 7 | 8 | http://groups.google.com/group/flotr2/ 9 | 10 | Please fork http://jsfiddle.net/cesutherland/ZFBj5/ with your question or bug reproduction case. 11 | 12 | 13 | API 14 | --- 15 | 16 | The API consists of a primary draw method which accepts a configuration object, helper methods, and several microlibs. 17 | 18 | ### Example 19 | 20 | ```javascript 21 | var 22 | // Container div: 23 | container = document.getElementById("flotr-example-graph"), 24 | // First data series: 25 | d1 = [[0, 3], [4, 8], [8, 5], [9, 13]], 26 | // Second data series: 27 | d2 = [], 28 | // A couple flotr configuration options: 29 | options = { 30 | xaxis: { 31 | minorTickFreq: 4 32 | }, 33 | grid: { 34 | minorVerticalLines: true 35 | } 36 | }, 37 | i, graph; 38 | 39 | // Generated second data set: 40 | for (i = 0; i < 14; i += 0.5) { 41 | d2.push([i, Math.sin(i)]); 42 | } 43 | 44 | // Draw the graph: 45 | graph = Flotr.draw( 46 | container, // Container element 47 | [ d1, d2 ], // Array of data series 48 | options // Configuration options 49 | ); 50 | ``` 51 | 52 | ### Microlibs 53 | 54 | * [underscore.js](http://documentcloud.github.com/underscore/) 55 | * [bean.js](https://github.com/fat/bean) 56 | 57 | Extending 58 | --------- 59 | 60 | Flotr may be extended by adding new plugins and graph types. 61 | 62 | ### Graph Types 63 | 64 | Graph types define how a particular chart is rendered. Examples include line, bar, pie. 65 | 66 | Existing graph types are found in `js/types/`. 67 | 68 | ### Plugins 69 | 70 | Plugins extend the core of flotr with new functionality. They can add interactions, new decorations, etc. Examples 71 | include titles, labels and selection. 72 | 73 | The plugins included are found in `js/plugins/`. 74 | 75 | Development 76 | ----------- 77 | 78 | This project uses [smoosh](https://github.com/fat/smoosh) to build and [jasmine](http://pivotal.github.com/jasmine/) 79 | with [js-imagediff](https://github.com/HumbleSoftware/js-imagediff) to test. Tests may be executed by 80 | [jasmine-headless-webkit](http://johnbintz.github.com/jasmine-headless-webkit/) with 81 | `cd spec; jasmine-headless-webkit -j jasmine.yml -c` or by a browser by navigating to 82 | `flotr2/spec/SpecRunner.html`. 83 | 84 | Shoutouts 85 | --------- 86 | 87 | Thanks to Bas Wenneker, Fabien Ménager and others for all the work on the original Flotr. 88 | Thanks to Jochen Berger and Jordan Santell for their contributions to Flotr2. 89 | 90 | -------------------------------------------------------------------------------- /html/lib/flotr2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flotr2", 3 | "version": "0.1.0", 4 | "description": "A library for drawing HTML5 charts and graphs.", 5 | "homepage": "http://www.humblesoftware.com/flotr2", 6 | 7 | "bugs": { 8 | "url": "https://github.com/HumbleSoftware/Flotr2/issues" 9 | }, 10 | 11 | "license": "MIT", 12 | 13 | "author": { 14 | "name": "Carl Sutherland", 15 | "email": "carl@humblesoftware.com", 16 | "url": "https://github.com/cesutherland" 17 | }, 18 | 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/HumbleSoftware/Flotr2.git" 22 | }, 23 | 24 | "devDependencies": { 25 | "smoosh": "0.4.1" 26 | }, 27 | 28 | "private": true 29 | } 30 | -------------------------------------------------------------------------------- /html/lib/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /html/lib/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /html/lib/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /html/lib/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /html/lib/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjmontesl/cubesviewer/5ffdbf0c0f25ba48030ccba20315d150294e971b/html/lib/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /html/lib/font-awesome/fonts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

4.4.0

9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /html/studio.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CubesViewer Studio (Local) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 57 | 58 |
59 | 60 |
61 |
62 | 63 |
64 | 65 |

CubesViewer Studio

66 | Local HTML version (server-side features are not available) 67 | 68 |
69 | 70 |
71 | 72 | 73 | 74 |
75 |
76 | 77 | 78 | 90 | 91 |
92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /html/views-angular.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CubesViewer Embedded View in AngularJS Example 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 | 40 |
41 |
42 | 43 |
44 | 45 |

CubesViewer Static Views example

46 | Shows how CubesViewer views can be embedded within an AngularJS app. 47 | 48 |
49 | 50 |
51 | 52 |
53 |

CubesViewer View integrated in AngularJS app

54 | 55 |

56 | The view below is a CubesViewer view naturally loaded as an angular directive in this page (with data 57 | from the Cubes example webshop project). 58 |

59 | 60 |
61 | 62 | 63 |
64 |
Loading...
65 |
66 |
The view can be scripted from AngularJS: Toggle Controls
67 | 68 |
69 | 70 |

Code

71 | 72 |

Check the source code of this page to see how this CubesViewer view is initialized.

73 | 74 |

More information can be found in the documentation page 75 | Embedding CubesViewer static views. 76 |

77 |
78 | 79 | 80 | 92 | 93 |
94 | 95 | 96 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cubesviewer", 3 | "version": "2.0.3-devel", 4 | "devDependencies": { 5 | "bower": "^1.7.9", 6 | "grunt": "^0.4.5", 7 | "grunt-angular-templates": "^1.0.3", 8 | "grunt-bower-task": "^0.4.0", 9 | "grunt-contrib-concat": "^1.0.0", 10 | "grunt-contrib-copy": "^1.0.0", 11 | "grunt-contrib-jshint": "~0.6.3", 12 | "grunt-contrib-less": "^1.3.0", 13 | "grunt-contrib-nodeunit": "~0.2.0", 14 | "grunt-contrib-requirejs": "^1.0.0", 15 | "grunt-contrib-uglify": "~0.2.2", 16 | "grunt-contrib-watch": "^1.0.0", 17 | "grunt-jsdoc": "^2.0.0", 18 | "grunt-wiredep": "^3.0.1" 19 | } 20 | } 21 | --------------------------------------------------------------------------------