Showing preview only (5,442K chars total). Download the full file or copy to clipboard to get everything.
Repository: jjmontesl/cubesviewer
Branch: master
Commit: 5ffdbf0c0f25
Files: 137
Total size: 5.2 MB
Directory structure:
gitextract_twb7_k0p/
├── .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
├── doc/
│ ├── guide/
│ │ ├── cubesviewer-embed.md
│ │ ├── cubesviewer-model.md
│ │ ├── cubesviewer-quickstart.md
│ │ ├── cubesviewer-server-installation.md
│ │ ├── cubesviewer-user-main.md
│ │ └── index.md
│ ├── images/
│ │ └── icon/
│ │ ├── browserconfig.xml
│ │ └── manifest.json
│ └── jsdoc/
│ ├── jsdoc.conf.json
│ └── layout.tmpl
├── html/
│ ├── cvapp.css
│ ├── lib/
│ │ ├── angular/
│ │ │ └── angular.js
│ │ ├── angular-bootstrap/
│ │ │ └── ui-bootstrap-tpls.js
│ │ ├── angular-bootstrap-slider/
│ │ │ └── slider.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.js
│ │ │ ├── validate/
│ │ │ │ └── less/
│ │ │ │ └── validate.less
│ │ │ └── variables.less
│ │ ├── bootstrap/
│ │ │ ├── bootstrap-theme.css
│ │ │ ├── bootstrap.css
│ │ │ ├── bootstrap.js
│ │ │ └── npm.js
│ │ ├── bootstrap-submenu/
│ │ │ ├── css/
│ │ │ │ └── bootstrap-submenu.css
│ │ │ └── js/
│ │ │ └── bootstrap-submenu.js
│ │ ├── d3/
│ │ │ └── d3.js
│ │ ├── flotr2/
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── README.md
│ │ │ ├── flotr2.amd.js
│ │ │ ├── flotr2.examples.types.js
│ │ │ ├── flotr2.js
│ │ │ ├── flotr2.nolibs.js
│ │ │ └── package.json
│ │ ├── font-awesome/
│ │ │ ├── css/
│ │ │ │ └── font-awesome.css
│ │ │ └── fonts/
│ │ │ ├── FontAwesome.otf
│ │ │ └── index.html
│ │ ├── jquery/
│ │ │ ├── jquery.js
│ │ │ └── jquery.slim.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
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
dist/* merge=ours
cubesviewer/cubesviewer.templates.js merge=ours
================================================
FILE: .gitignore
================================================
*.py[cod]
# C extensions
*.so
# Packages
*.egg
*.egg-info
#dist
build
eggs
parts
bin
var
sdist
develop-eggs
.installed.cfg
#lib
#lib64
node_modules
bower_components
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
nosetests.xml
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# SQLite databases
*.sqlite
# Eclipse
.settings
#/ROADMAP
#/virtualenv
/env
*.log
*.pyc
local_settings.py
.idea
*.DS_Store
/dist
================================================
FILE: AUTHORS.txt
================================================
Authors
=======
CubesViewer by Jose Juan Montes.
Development:
* José Juan Montes <jjmontes@gmail.com>
https://twitter.com/jjmontes
* Stefan Urbanek <stefan@stiivi.com>
http://stiivi.com/
Other contributors:
* Enrique Hernández
* Alexander Bessonov
* Nuno Khan
* Devin Howard
================================================
FILE: CHANGES.txt
================================================
[2.0.3]
* Fixed chart figure export (was not working). Chart images can again be exported as PNG.
* Fixed series missing data with same label but different key value.
[2.0.2]
* Fixed export bug causing table not to be exported if dataset was too large.
* Facts view now shows attribute details (#76).
* Fixed 'apply already in progress' bug when loading a cube after first time.
* Added masonry library to show improve alignment of Studio views.
* Added drill more/less buttons to drilldown, horizontal dimension tags and dimension filter.
* Added dimension filter item filtering based on current view cut.
* Fixed dimension filter empty list if dimension members contains repeated values.
* Select next drill level (if available) when clicking on an item in explore mode.
* Fixed dimension sorting when grid was reused or multiple grids on screen (fixes #71).
* Fixed CSV export in explore mode (#72).
[2.0.1]
* Column sorting now follows order_attribute from model.
* Added AngularJS integration example.
* Added chart image export support.
* Line charts now allow various curve types.
* Google Analytics plugin restored (events tracking).
* Added warning if server result limit has been hit.
* Added server information dialog.
* Added new horizontal columns chart.
* Added two columns mode and hide controls mode.
* New icon library and revamped UI.
* Added automatic content-based column resize feature.
* Added support for negated cuts (inverse filters).
* Added support for custom column formatting functions.
* Added cube metadata option to set view default params.
* Option to show/hide chart legend.
* Pie charts are now sorted by size of slice.
* Serializing now shows JSON in a modal dialog and is easier to copy.
* Responsive design.
* More printer-friendly CSS.
* UI is now refreshed in-place instead of blocking whole UI.
* Using templating for HTML views (no more HTML/JavaScript spaguetti code).
* Moved from jQGrid to more versatile Angular ui-grid.
* Refactored to Angular. Dropped jQueryUI.
* Now using Bootstrap embedded (no global CSS selectors) for styling, without
impacting page styles and better avoiding being impacted by container page styling.
* Introduced Grunt and Bower build toolchain. Also JSDoc.
* Separated CubesViewer server and client into two different projects.
* License changed to pure MIT (removed extra clause).
[0.0.11]
* Fixed bug causing datefilter to unnecessarily require 'cv-datefilter: true'.
* Moved GUI interface to top sticky menu (warning: could break existing
integrations of the interface).
* Changed chart resize method to a fixed set of height choices.
* Using less technical menu and button labels (cut = filter).
* Facts table now includes fact details.
* Fixed export facts feature.
[0.0.10]
* Updated to work with Cubes 1.0 (note: dropped support for Cubes 0.10.x).
* Upgraded to Django 1.7.3 (your settings.py may need updating).
* Datefilter now uses dimension role "time" in Cubes 1.0.
* First version using Django migrations.
* Use cubes.js official client library (altered).
* Modified jQueryUI theme.
* Updated to latest jQuery version 1.10.2.
* Switched from django-piston to django-rest-framework.
* Dropped notes system.
[0.0.9]
* Last version supporting cubes 0.10.x.
* Fix dimensionfilter bug causing wrong values to
be selected when updating from the current filter.
* Added Google Analityics events plugin.
[0.0.8]
* Charts now save view configuration (status and disabledseries).
* New rangefilter plugin (closes #21).
* Added support for a cv-ignore option in the model for dimensions.
* Separated datefilter as a plugin (closes #8).
* Cutting over a drilled dimension no longer removes the drill.
* Added shortcuts (select all) and drilldown from filters.
* Menus now open on hover if already open.
* Charts now using nvd3.js.
[0.0.7]
* Always send dimension level for drilldown (solves
issue about single-point cut * drilldown combination)
* Updated the pure-html examples (embedded views).
* Ajax global error handler is no longer used.
* More user friendly error handling if server not available.
* Fixed table resizing not fitting parent.
* Added week information to datepickers.
* Added measures to facts view.
[0.0.6]
* Added facts view (and support for column size saving).
* Added dimension filter icons (shortcuts) to info pieces.
* Fixed bug causing wrong hierarchy name to be displayed
* Added the dimensionfilter plugin, which introduces a
more advanced filtering interface.
* Sort order in tables is now preserved.
* Added column chooser for Explore mode, saved with view.
* Column widths saved with view via new plugin.
* Added tooltips to table values.
* Added wiki plugin for public notes for cubes and views.
* Menu buttons now require click to activate.
* Fixed a few UI glitches.
[0.0.5]
* Removed the "global shared views" concept.
* Experimental Cubes proxy (with ACLs).
* Initial version of cache system.
* Measure aggregations are now shown in submenus.
* Fixed bug causing drilldowns to incorrectly drill to latest level.
* Changed "loading" approach, now blocks the interface where appropriate.
* Changed redraw strategy trying to minimize size changes.
* Fixed wrong extra columns in some charts.
* Fixed multiple drill dimensions that were ignored in charts.
[0.0.4]
* Added a locale switcher plugin.
* Added documentation and examples for embedding views
in other web applications.
* Added the serialization plugin.
[0.0.3]
* Added undo/redo plugin.
* Improved export plugin (now exports all pages of tables).
* Updated Flotr2 library to support stacked lines.
* Date dimensions are now correctly configured at model level.
* Added support for dimension hierarchies.
* Added some Cubes model javascript support classes.
* Added support for labels and label attributes.
* Added (draft) examples of local HTML usage.
* Added installation documentation.
* Application settings now have default values that work out of the box.
* Added support for measures with no aggregations.
[0.0.2]
* Initial import into repository.
* Added basic saving/sharing capabilities.
* Initial separation of components.
* Refactored Javascript code to be more object-oriented.
* Finished functional application prototype (exploration, tables and charts).
[0.0.1]
* Application prototype and proof of concept.
================================================
FILE: Gruntfile.js
================================================
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
separator: ';'
},
dist: {
src: [
'cubesviewer/angular-bootstrap-submenu/angular-bootstrap-submenu.js',
'cubesviewer/cubes/cubes.js',
'cubesviewer/cubes/cubes-cvextensions.js',
'cubesviewer/cubes/cubes-service.js',
'cubesviewer/cubes/cache.js',
'cubesviewer/core/cubesviewer.js',
'cubesviewer/views/views.js',
'cubesviewer/dialog/dialog.js',
'cubesviewer/views/cube/cube.js',
'cubesviewer/views/cube/explore/explore.js',
'cubesviewer/views/cube/filter/dimension.js',
'cubesviewer/views/cube/filter/datefilter.js',
'cubesviewer/views/cube/facts/facts.js',
'cubesviewer/views/cube/series/series.js',
'cubesviewer/views/cube/series/operations.js',
'cubesviewer/views/cube/chart/chart.js',
'cubesviewer/views/cube/chart/chart-bars-vertical.js',
'cubesviewer/views/cube/chart/chart-bars-horizontal.js',
'cubesviewer/views/cube/chart/chart-lines.js',
'cubesviewer/views/cube/chart/chart-pie.js',
'cubesviewer/views/cube/chart/chart-radar.js',
'cubesviewer/views/cube/chart/chart-sunburst.js',
//'cubesviewer/cubesviewer.views.cube.rangefilter.js',
'cubesviewer/views/cube/export.js',
'cubesviewer/views/undo.js',
'cubesviewer/studio/studio.js',
'cubesviewer/studio/serialize.js',
'cubesviewer/server/reststore.js',
'cubesviewer/ga/googleanalytics.js',
// The templates file is autogenerated by grunt-angular-templates
'cubesviewer/cubesviewer.templates.js'
],
dest: 'dist/<%= pkg.name %>.js'
}
},
less: {
options: {
},
dist: {
files: {
'dist/cubesviewer.css': 'cubesviewer/cubesviewer.less'
}
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
},
copy: {
dist: {
files: [
{ expand: true, cwd: 'dist', src: '*', dest: '../cubesviewer-page/lib/cubesviewer/' },
{ expand: true, cwd: 'dist', src: '*', dest: '../cubesviewer-server/cvapp/cubesviewer/static/lib/cubesviewer/' }
]
}
},
qunit: {
files: ['test/**/*.html']
},
bower: {
install: {
options: {
targetDir: 'html/lib/',
layout: 'byComponent',
verbose: true
}
}
},
/*
wiredep: {
dist: {
src: [
'html/*.html'
],
options: {
ignorePath: '../bower_components/',
fileTypes: {
html: {
replace: {
js: '<script src="../lib/{{filePath}}"></script>',
css: '<link rel="stylesheet" href="../lib/{{filePath}}" />'
}
}
}
}
}
},
*/
jsdoc : {
dist : {
src: ['cubesviewer/**/*.js'], // 'test/*.js'
options: {
destination: 'build/doc',
configure : 'doc/jsdoc/jsdoc.conf.json'
}
}
},
jshint: {
files: ['Gruntfile.js', 'bower,json', 'cubesviewer/**/*.js', 'cubesviewer/**/*.less', 'test/**/*.js'],
options: {
// options here to override JSHint defaults
globals: {
jQuery: true,
console: true,
module: true,
document: true
}
}
},
watch: {
files: ['<%= jshint.files %>', 'bower.json', 'cubesviewer/**/**.*'],
tasks: ['default'] // 'copy'
},
ngtemplates: {
app: {
cwd: 'cubesviewer',
src: '**/**.html',
dest: 'cubesviewer/cubesviewer.templates.js',
options: {
module: "cv",
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
//grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-bower-task')
//grunt.loadNpmTasks('grunt-wiredep');
grunt.loadNpmTasks('grunt-angular-templates');
grunt.loadNpmTasks('grunt-jsdoc');
grunt.registerTask('test', ['jshint']); // 'qunit'
grunt.registerTask('default', ['less', 'ngtemplates', 'concat', 'uglify', 'jsdoc']); // 'bower',
};
================================================
FILE: LICENSE.txt
================================================
CubesViewer
Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
CubesViewer - OLAP Visual Viewer and Explore Tool
=================================================
About
-----
CubesViewer is a visual, web-based tool for exploring and analyzing
OLAP databases served by the Cubes OLAP Framework.
CubesViewer can be used for data exploration and auditory,
generation of reports, chart designing and embedding,
and as a (simple) company-wide analytics application.
CubesViewer is a visual interface for the
open source [Cubes server](http://databrewery.org/cubes.html) (an OLAP server in Python).
Purpose is to keep it simple while leveraging the web services provided by Cubes.
See it live: [CubesViewer site](http://www.cubesviewer.com/).
Features:
* Dimension hierarchies, date filtering
* Several charts and diagrams can be created
* Explore, create data series, draw charts, see raw facts
* Export data and images
* Responsive design, tablet friendly
* Undo / redo
* Views can be embedded in other web sites
* User Interface allows for multiple views on-screen
* Optional multi-user server-side backend for saving/sharing views
Online Demos
------------
* [CubesViewer Site](http://www.cubesviewer.com)
* [CubesViewer Studio](http://www.cubesviewer.com/studio.html) with the full application
<!---
* [CubesViewer Embedded Views](http://jjmontesl.github.io/cubesviewer/views.html) showing embedded views
-->
Download
--------
Latest CubesViewer stable release is 2.0.2:
* CubesViewer 2.0.2
* [cubesviewer-v2.0.2.zip](https://github.com/jjmontesl/cubesviewer/archive/v2.0.2.zip)
* [cubesviewer-server-v2.0.2.zip](https://github.com/jjmontesl/cubesviewer-server/archive/v2.0.2.zip)
* [Changelog](http://github.com/jjmontesl/cubesviewer/blob/v2.0.2/CHANGES.txt)
* [Release Notes](http://github.com/jjmontesl/cubesviewer/blob/v2.0.2/RELEASE-NOTES.txt)
* Works with *Cubes 1.0.x* and *Cubes 1.1.x*
CubesViewer Server already includes the CubesViewer library so you just need that package
if you plan to deploy the server-side application.
If you do modifications to the project, cloning both repositories via `git` is encouraged, so you can
easily contribute your fixes and improvements back.
Requirements
------------
CubesViewer consists of two parts:
**CubesViewer client** is an HTML5 application that runs on any modern browser.
It can run without server side support. **Simply download the package and open**
`html/studio.html` in your favorite browser. Views can also be embedded in other sites.
CubesViewer also features an optional **server side application**
which provides a full web application and supports features like sharing/saving views.
This project lives on a separate repository: [CubesViewer Server](http://github.com/jjmontesl/cubesviewer-server)
(not to be confused with Cubes Server itself).
You need a configured and running [Cubes Server](http://databrewery.org/cubes.html) version 1.0.x or later.
Your Cubes model may use some extra configuration if you wish to use features like date
filters and range filters (see Documentation below).
For CubesViewer clients to connect to Cubes server ("slicer"), your Cubes server possibly needs to allow
cross origin resource sharing (CORS). To enable it, add `allow_cors_origin: *`
(or a more restrictive setting) under the `[server]` section of the `slicer.ini` file.
For further information, see the Documentation section below.
Documentation
-------------
This tool allows users to inspect the different dimensions, measures and
aggregated data in different ways, allowing you to build tables and charts
based on the analytical data available from the server.
* [CubesViewer Quick Start](http://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/cubesviewer-quickstart.md)
* [CubesViewer Documentation](http://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/index.md)
* [CubesViewer 2.0 Release Notes](http://github.com/jjmontesl/cubesviewer/blob/master/RELEASE-NOTES.md)
Screenshots
-----------


Support
=======
You can use the Cubes discuss group for CubesViewer related questions,
and report bugs or features via CubesViewer issue tracker:
* User group: http://groups.google.com/group/cubes-discuss
* Report bugs: http://github.com/jjmontesl/cubesviewer/issues
Source
======
Github source repository:
* http://github.com/jjmontesl/cubesviewer
* http://github.com/jjmontesl/cubesviewer-server
About versioning:
* Tagged versions (ie. v2.0.x) are stable releases.
* The "master" branch may be ahead the latest stable version, but is meant to be stable (fixes and documentation improvements).
* Development and latest changes happen in the "devel" branch and others.
Collaborate!
------------
Using CubesViewer or interested in data engineering / data visualization? CubesViewer
is an open source project and could grow up best with the help of fellow coders.
You can collaborate:
* If you find bugs, please [file an issue](http://github.com/jjmontesl/cubesviewer/issues).
* If you have a feature request, also file an issue.
* If you fix bugs, please do send a pull request.
* If you make reusable changes, please document those and send a pull request.
* If you wish to take over a larger feature, get in touch through the Cubes discuss group above
in order to plan for it collectively. Check the TODO.txt file if you need some inspiration.
* You can also help improving the documentation or writing about Cubes/CubesViewer, and spreading the love.
If you are using or trying CubesViewer, we'd love to hear from you (please tweet #cubesviewer !).
Development
-----------
Run:
grunt watch
This is the `grunt` task that watches the cubesviewer directory and generates the built
library in the `dist` directory.
Can be tested using the `html/studio.html` application.
Authors
=======
CubesViewer is written and maintained by Jose Juan Montes
and other contributors.
See AUTHORS file for more information.
License
=======
CubesViewer is published under MIT license.
For full license see the LICENSE file.
================================================
FILE: RELEASE-NOTES.md
================================================
CubesViewer 2.0 Release Notes
=============================
CubesViewer is a visual, web-based tool application for exploring and analyzing
OLAP databases served by the Cubes OLAP Framework.
CubesViewer can be used for data exploration and data auditory,
generation of reports, chart design and embedding,
and as a (simple) company-wide analytics application.
* [CubesViewer Official Site](http://www.cubesviewer.com)
* [CubesViewer at GitHub](https://github.com/jjmontesl/cubesviewer)
2.0 Release Notes
-----------------
This is a major release of CubesViewer featuring tons of improvements, new
features, a rebranded look and feel as well as a new code architecture
that greatly eases development and paves the way for following versions.
CubesViewer has undergone a major upgrade. The code is now built upon
*AngularJS*, and the UI framework has been migrated from jQueryUI to
*Bootstrap* and *Angular Bootstrap* components. HTML has been rewritten
and separated into easier to handle templates.
The application is now more *responsive* and *mobile friendly*
and looks more stylish overall. CSS has been reworked and namespaced,
easing integration into other web documents.
Migration to AngularJS has involved an comprehensive
refactoring and review of every module, and we trust it's been for the better.
Internally, the build pipeline now uses *Less*, *Grunt* and *Bower*, and a lot
of dependencies have been removed. All together allow CubesViewer to now be
distributed as a single `.js` file (minified version also available) and
accompanying `.css` file. *JSDoc* has also been introduced.
Other additions feature:
* Printer friendly CSS.
* Export charts as images.
* New horizontal bars chart.
* Line and area charts with curved lines.
* Improved error reporting and user interface.
* CubesViewer Server (optional) upgraded to Django 1.9.
* Plugin for cube usage tracking via Google Analytics.
* Improved documentation and tutorials.
Make sure you read the [Changelog]() for the full list of changes.
Special thanks to Stefan Urbanek, Devin Howard and all the other
contributors and users for your support and collaboration.
Requirements
------------
CubesViewer consists of two parts:
**CubesViewer client** is a HTML5 application that runs on any modern browser.
It can run without server side support. **Simply download the package and open**
`html/studio.html` in your favorite browser. Views can also be embedded in other sites.
CubesViewer also features an optional **server side application**
which provides a full web application and supports features like sharing/saving views.
This project lives on a separate repository: [CubesViewer Server](https://github.com/jjmontesl/cubesviewer-server)
(not to be confused with Cubes Server itself).
You need a configured and running [Cubes Server](http://databrewery.org/cubes.html) version 1.0.x or later.
Your Cubes model may need some extra configuration if you wish to use features like date filters.
Upgrading from 2.0.1
--------------------
1. A new Javascript dependency (masonry) has been added to the Studio application
(this does not apply if you are using CubesViewer Server or embedding CubesViewer
views: only if embedding CubesViewer Studio). Check the sample `html/studio.html`
for an up to date list of dependencies.
Upgrading from 0.10 or 0.11
---------------------------
1. If you are integrating CubesViewer in your HTML, note that the code needed for
initializing CubesViewer has changed slightly. The list of Javascript and CSS
dependencies has also changed. Refer to the [Embedding CubesViewer] for detailed
instructions on integrating views and the full list of initialization options.
2. View definitions are (partially) backwards compatible, but some of the attributes
have changed (ie. column width definition). If you or your users have stored view
definitions, either via CubesViewer Server or any other JSON view definition,
it is recommended to test drive your existing view definitions to check they
show up as expected.
3. The "Range Filter" feature hasn't yet been upgraded from previous version and
is not available. If you were using "Range Filter" these will not show up.
4. Column sorting now follows `order_attribute` from model. Depending on your
model definition, you may find that some columns are not ordered as in 0.x.
See documentation "CubesViewer Model options" for details.
5. For CubesViewer clients to connect to Cubes server ("slicer"), your Cubes server
possibly needs to allow cross origin resource sharing (CORS). To enable it,
add `allow_cors_origin: *` (or a more restrictive setting)
under the `[server]` section of the `slicer.ini` file.
6. If you are using CubesViewer Server, you need to upgrade your database after
upgrading the application package. As with any Django app,
run `python manage.py migrate`.
For complete installation instructions, see the
[CubesViewer Documentation](http://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/index.md).
Upgrading from 0.9 or earlier
-----------------------------
CubesViewer 0.9 supported older Cubes 0.10.x. This version of Cubes is no longer supported
by CubesViewer and thus you need to upgrade your Cubes Server installation first and
reinstall CubesViewer.
================================================
FILE: TODO.txt
================================================
Consider contributing to CubesViewer! This is a possible roadmap (reverse order).
[ROADMAP]
* Support multiple servers and multiple versions (use adaptors, and own data dictionary).
* Translation site / tool / ask for help.
* Interface available in English and one more language.
* Implement i18n.
* Bring back locale support!
* Support more authentication scenarios for embedded views / IFRAME,
via CubesViewer server app (note upcoming Cubes auth framework).
* App support for IFRAME embedding.
* GUI support for browser back button, correct URL usage, links to GUI.
* Support dimension attributes, and fact details in fact view etc..
* Support better exploration of facts
* GUI options (and all other plugin options) now as cubesviewer options
(with plugin namespace?).
* Hide interface mode (also, make these programmable options for the views)
* Fix too many series in legend issue (limit? alternate legend?).
* Avoid leaving the page inadvertedely (also make back/forward/url_links work?)
* Jump to added view when creating a view (also make back/forward/url_links work?)
* Separate in directives appropriately, restore "puggability", move cube "globals" to directive scopes.
* Add anonymous-save service to backend and client (dedup).
* Print feature (open tables and charts with appropriate height/width, hide most interface buttons).
* X/Y/size bubble charts.
* 3rd dimension scrollbar and play mode (for charts and series)
* Time filter dynamic (zoomable, etc) when is horizontal dimension in appropriate chart mode (nvd3 does this ootb)
* Make charts more interactive (allow cut from chart, etc).
* Series annotation system: markers for annotations in time or other dimension.
* Better loading bar (account for pending requests, etc).
* Default cube settings (cv-info) feature bug? it should only be applied if the view is not otherwise configured (ie loaded or json). Check.
* Architecture improvements:
* Abstract backend?? Create CV objects for dimensions, levels, etc... Plug cubes as one more adaptor???
* Abstract data/grid in cubeview? -> Add own data dictionary (<->CubETL).
* Make cubesviewer-studio an angular app.
* Save filters (segments). Info pieces shall be made directives first.
[2.4]
* Data alerts (server-backed, depending on criteria, with triggers (use cubetl?)).
* http://bl.ocks.org/mbostock/4063269 (Bubble chart: categories/sizes)
* https://mbostock.github.io/d3/talk/20111018/treemap.html (zoomable treemap)
* Scatter charts (allow to use a second measure for one of the axis)
[2.3]
* Fulltext search (facts, dimension values/info, extra external data (refs), metadata) ?
* Filter from chart filter / synchronize filter and chart filter (?)
* Synchronize view to other view (one way/two way, attributes to synchronize)
[2.2]
* Info metadata (html/url), etc...
* Django views admin -> include CubesViewer
* Scroll to recently open view on GUI (also provide function to do it from code for standalone views).
* Fact Viewer and fact templates (html/url/angular template?), i.e. including links to documents or etc...
* Data formatters (color, decimals, abbreviations, units, etc...). Allow client side changes?
* Implement limits to items shown in charts or dimension filters...?
* Show filter icon from "horizontal dimension". Also show its detail level (and perhaps not the hierarchy).
* Abandon page warning?
* Datepicker to show only to correct level (year, month, day)
* Try reoder columns + pin columns again
* Add fullscreen mode for a view (in this case, stretch grid and chart as appropriate?)
* Drop notes system 2: use metadata for info and add a comments system
* Allow direct link to URL (cubesviewer GUI reading configuration/anonymous-id from URL)
* Drill more/drill less. Same for horizontal dimension, and dimension filter (???)
* Reviewed and improved doc (JSDoc).
* Comments system.
[2.1]
* Site, demos and data:
* Update screenshots showing map chart (ie from views.html).
* Create views.html page for site, showing a full story w/ source code ("start with a blank cube", "exploration", "series", "chart", "map"...)
* Site (second iteration). Show a couple of charts view, a table, and an enabled-controls view.
SAME views to be automatically opened in the explorer sample.
* Add product subcategory to demo data. Add some formatters (correctly from dims via CubeETL).
* Update & simplify demo views JSON.
* Review site and doc links.
* Mention Python, jQuery+Angular, database agnostic / systems
* Chart series view/hide selection is serialized using label instead of key. Normalize.
* Issue #55 (chart shows measure name, not measure label).
* Fix submenu timer hack: is causing issues already. Watch contents and perhaps debounce menu activation?
* Add "accumulated", "difference" and other operations to series and charts.
* Add "grouping", allowing to group drilled down items (custom groups) using an aggregation of choice...
Ability to save groups.
* Add "reduce to N items" operation on series (allows to represent charts adding "Others" for the rest),
reducing using some criteria -> uses grouping.
* Finish calculations: show infos, mark which ones are enabled, order, add series colorize (positive/negative) | move "invert 2nd serie -> mirror 2nd serie" as a calculation?
* Operations. Design. Possible error: operations shall be applied after series but before flatennign cols for charts. Ensure this is correct.
* Restore cached content notice (is missing, commented out).
* Automatically hide legend if too many results.
* Colors get incorrectly drawn when series are deselected from legend, and view changed back/forth.
* Divide in reusable angular directives (ie. start with fact viewer). JS doc. Make views
proper objects.
* Move to a more object oriented API, directives for widgets for model and cubeview.
Keep drilldown and cuts as objects in API, serialize only as
needed (and so introduce the ability optionally include column widths, etc).
* (Use controllerAs).
* Range filter.
* Flag icons support OOTB.
* Map representations from facts, including segments from individual points in facts (plot paths, with metrics and filtering!)
* Map charts. Design already available.
[2.0.3]
* Remove -devel from version, -beta from doc, package.json version cubesviewer version, generate files, copy to web and server, same on server.
Release notes, Tag repo (release), Announcement, Move this todo item to next release top.
* Submenu loading issue.
* Tooltip columns: column=val remove columnTooltipAttr, enable tooltips?
* Regression: tooltips (column label = formatted value), and row highlighting. Also row selection odd/even issue.
* Fix: toggling legend does not redraw chart (just moves legend?). Redrawing the chart (ie switching view mode) actually works.
Same for sometimes drilling down or changing a filter, grid doens't get correct size.
* Size change when switching views is irritating. Hack that (fix height during changes/reloads?).
* Fix to grid sort function cache was incorrect? If two grids are loaded, clicking on a column in grid A could affect sorting in grid B (#71).
* Error: [$parse:lexerr] Lexer Error: Unexpected next character at columns 45-45 [Í] in expression [entity['SECRETARÍA XERAL TÉCNICA '](CONSELLERÍA DE CULTURA, EDUCACIÓN E ORDENACIÓN UNIVERSITARIA)].
* Possible repeated data load / events?
* Refresh: use watches to trigger invalidation? (also check for repeated events). Example: drilldown with click on item
now triggers refresh twice: cut and drilldown. Also causes incorrect Undo/Redo tracking.
================================================
FILE: bower.json
================================================
{
"name": "cubesviewer",
"description": "CubesViewer JS client app",
"main": "cubesviewer",
"authors": [
"Jose Juan Montes <jjmontes@gmail.com>"
],
"license": "MIT",
"keywords": [
"olap",
"visualization",
"cubes"
],
"homepage": "https://github.com/jjmontesl/cubesviewer",
"moduleType": [
"globals"
],
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"jquery": "2.2.3",
"nvd3": "1.8.2",
"bootstrap": "3.3.6",
"flotr2": "*",
"font-awesome": "Font-Awesome#4.6.1",
"bootstrap-submenu": "^2.0.4",
"angular": "^1.5.5",
"angular-bootstrap": "1.3.2",
"angular-ui-grid": "^3.1.1",
"angular-bootstrap-slider": "^0.1.27",
"angular-cookies": "^1.5.5"
},
"exportsOverride": {
"jquery": {
"/": "dist/**/*.*"
},
"bootstrap": {
"/": "dist/**/*.*"
},
"bootstrap-submenu": {
"css": "dist/css/*.*",
"js": "dist/js/*.*"
},
"font-awesome": {
"css": "css/*.*",
"fonts": "fonts/*.*"
},
"flotr2": {
"/": "*.*"
}
}
}
================================================
FILE: cubesviewer/angular-bootstrap-submenu/angular-bootstrap-submenu.js
================================================
/*
* angular-bootstrap-submenu
* Copyright (c) 2016 Jose Juan Montes
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
angular.module('bootstrapSubmenu', []).directive("submenu", ['$timeout', function($timeout) {
return {
restrict: 'A',
link: function(scope, iElement, iAttrs) {
// FIXME: This is not a proper way of waiting for the menu to be constructed.
$timeout(function() {
$(iElement).submenupicker();
}, 500);
}
};
}]);
================================================
FILE: cubesviewer/core/cubesviewer.js
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
/**
* CubesViewer namespace.
*
* @namespace cv
*/
// Main CubesViewer angular module
angular.module('cv', ['ui.bootstrap', 'bootstrapSubmenu',
'ui.grid', 'ui.grid.resizeColumns', 'ui.grid.selection', 'ui.grid.autoResize',
'ui.grid.pagination', 'ui.grid.pinning', /*'ui.grid.exporter',*/
'ngCookies',
'cv.cubes', 'cv.views']);
// Configure moment.js
/*
angular.module('cv').constant('angularMomentConfig', {
// preprocess: 'unix', // optional
// timezone: 'Europe/London' // optional
});
*/
/*
* Configures cv application (cvOptions, log provider...).
*/
angular.module('cv').config([ '$logProvider', 'cvOptions', /* 'editableOptions', 'editableThemes', */
function($logProvider, cvOptions /*, editableOptions, editableThemes */) {
//console.debug("Bootstrapping CubesViewer.");
var defaultOptions = {
cubesUrl : null,
//cubesLang : null,
jsonRequestType: "json", // "json | jsonp"
pagingOptions: [15, 30, 100, 250],
cacheEnabled: true,
cacheDuration: 30 * 60,
cacheNotice: 10 * 60,
cacheSize: 32,
datepickerShowWeeks: true,
datepickerFirstDay: 1, // Starting day of the week from 0-6 (0=Sunday, ..., 6=Saturday).
undoEnabled: true,
undoSize: 32,
seriesOperationsEnabled: false,
hideControls: false,
gaTrackEvents: false,
debug: false
};
$.extend(defaultOptions, cvOptions);
$.extend(cvOptions, defaultOptions);
$logProvider.debugEnabled(cvOptions.debug);
// Avoid square brackets in serialized array params
// TODO: Shall be done for $http instead?
/*
$.ajaxSetup({
traditional : true
});
*/
// XEditable bootstrap3 theme. Can be also 'bs2', 'default'
/*
editableThemes.bs3.inputClass = 'input-sm';
editableThemes.bs3.buttonsClass = 'btn-sm';
editableOptions.theme = 'bs3';
*/
}]);
/*
*
*/
angular.module('cv').run([ '$timeout', '$log', 'cvOptions', 'cubesService', 'cubesCacheService', /* 'editableOptions', 'editableThemes', */
function($timeout, $log, cvOptions, cubesService, cubesCacheService /*, editableOptions, editableThemes */) {
$log.debug("CubesViewer debug mode is enabled.");
// Initialize cache service
cubesCacheService.initialize();
// Initialize Cubes service
cubesService.connect();
}]);
/**
* CubesViewer class, used to initialize CubesViewer and
* create views. Note that the initialization method varies depending
* on whether your application uses Angular 1.x or not.
*
* An instance of this class is available as the global `cubesviewer`
* variable. This class must not be instantiated.
*
* @class
*/
function CubesViewer() {
// CubesViewer version
this.version = "2.0.3-devel";
/**
* State of a view that has not yet been fully initialized, and cannot be interacted with.
* @const
*/
this.VIEW_STATE_INITIALIZING = 1;
/**
* State of a view that has been correctly initialized.
* @const
*/
this.VIEW_STATE_INITIALIZED = 2;
/**
* State of a view that has failed initialization, and cannot be used.
* @const
*/
this.VIEW_STATE_ERROR = 3;
this._configure = function(options) {
$('.cv-version').html(cubesviewer.version);
angular.module('cv').constant('cvOptions', options);
};
/**
* Initializes CubesViewer system.
*
* If you are using CubesViewer in an Angular application, you don't
* need to call this method. Instead, use your application Angular `config`
* block to initialize the cvOptions constant with your settings,
* and add the 'cv' module as a dependency to your application.
*/
this.init = function(options) {
this._configure(options);
angular.element(document).ready(function() {
angular.bootstrap(document, ['cv']);
});
};
/**
* Creates a CubesViewer view object and interface, and attaches it
* to the specified DOM element.
*
* If you are embedding CubesViewer in an Angular application, you can
* avoid this method and use the {@link viewsService} and the
* {@link cvViewCube} directive instead.
*
* @param container A selector, jQuery object or DOM element where the view will be attached.
* @param type View type (currently only "cube" is available).
* @param viewData An object or JSON string with the view parameters.
* @returns The created view object.
*/
this.createView = function(container, type, viewData) {
//console.debug("Creating view: " + viewData);
var $compile = angular.element(document).injector().get('$compile');
var viewsService = angular.element(document).injector().get('viewsService');
var view = viewsService.createView("cube", viewData);
var viewDirective = '<div class="cv-bootstrap"><div cv-view-cube view="view"></div></div>';
$(container).first().html(viewDirective);
var scope = angular.element(document).scope().$root;
var templateScope = scope.$new();
templateScope.view = view;
//templateCtrl = $controller("CubesViewerStudioController", { $scope: templateScope } );
//$(cvOptions.container).children().data('$ngControllerController', templateCtrl);
$compile($(container).first().contents())(templateScope);
return view;
};
/**
* Performs changes within CubesViewer scope. If are not using CubesViewer from
* Angular, you need to wrap all your CubesViewer client code within this
* method in order for changes to be observed.
*
* @param routine Function that will be executed within CubesViewer Angular context.
*/
this.apply = function(routine) {
if (! angular.element(document).scope()) {
console.debug("Delaying");
setTimeout(function() { cubesviewer.apply(routine); }, 1000);
} else {
angular.element(document).scope().$apply(routine);
}
};
};
/**
* This is Cubesviewer main entry point. Please see {@link CubesViewer}
* documentation for further information.
*
* @global
*/
var cubesviewer = new CubesViewer();
================================================
FILE: cubesviewer/cubes/cache.js
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
angular.module('cv.cubes').service("cubesCacheService", ['$rootScope', '$log', 'cvOptions', 'cubesService', 'gaService',
function ($rootScope, $log, cvOptions, cubesService, gaService) {
var cubesCacheService = this;
this.cache = {};
this._cacheOverridedCubesRequest = null;
this.initialize = function() {
if (this._cacheOverridedCubesRequest) {
$log.warn("Error: tried to initialize CubesCacheService but it was already initialized.")
return;
}
if (cvOptions.cacheEnabled) {
// Replace request function
$log.debug("Replacing Cubes request method with caching version.")
cubesCacheService._cacheOverridedCubesRequest = cubesService.cubesRequest;
cubesService.cubesRequest = cubesCacheService.cachedCubesRequest;
}
};
this.cachedCubesRequest = function(path, params, successCallback, errCallback) {
cubesCacheService._cacheCleanup();
var requestHash = path + "?" + $.param(params);
var jqxhr = null;
if (requestHash in cubesCacheService.cache && cvOptions.cacheEnabled) {
// Warn that data comes from cache (QTip can do this?)
var timediff = Math.round ((new Date().getTime() - cubesCacheService.cache[requestHash].time) / 1000);
if (timediff > cvOptions.cacheNotice) {
//cubesviewer.showInfoMessage("Data loaded from cache<br/>(" + timediff + " minutes old)", 1000);
$log.debug("Data loaded from cache (" + Math.floor(timediff / 60, 2) + " minutes old)");
}
jqxhr = $.Deferred();
jqxhr.error = function() { };
setTimeout(function() {
// TODO: What is the correct ordering of success/complete callbacks?
successCallback(cubesCacheService.cache[requestHash].data);
jqxhr.resolve(); //.promise();
}, 0);
gaService.trackRequest(path);
} else {
// Do request
jqxhr = cubesCacheService._cacheOverridedCubesRequest(path, params, cubesCacheService._cacheCubesRequestSuccess(successCallback, requestHash), errCallback);
}
return jqxhr;
};
/*
* Reviews the cache and removes old elements and oldest if too many
*/
this._cacheCleanup = function() {
var cacheDuration = cvOptions.cacheDuration;
var cacheSize = cvOptions.cacheSize;
var oldestTime = new Date().getTime() - (1000 * cacheDuration);
var elements = [];
for (var element in cubesCacheService.cache) {
if (cubesCacheService.cache[element].time < oldestTime) {
delete cubesCacheService.cache[element];
} else {
elements.push (element);
}
}
elements.sort(function(a, b) {
return (cubesCacheService.cache[a].time - cubesCacheService.cache[b].time);
});
if (elements.length >= cacheSize) {
for (var i = 0; i < elements.length - cacheSize; i++) {
delete cubesCacheService.cache[elements[i]];
}
}
}
this._cacheCubesRequestSuccess = function(pCallback, pRequestHash) {
var requestHash = pRequestHash;
var callback = pCallback;
return function(data) {
// TODO: Check if cache is enabled
cubesCacheService.cache[pRequestHash] = {
"time": new Date().getTime(),
"data": data
};
pCallback(data);
};
};
}]);
================================================
FILE: cubesviewer/cubes/cubes-cvextensions.js
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
/* Extensions to cubesviewer client lib */
cubes.Dimension.prototype.hierarchies_count = function() {
var count = 0;
for (var hiename in this.hierarchies) {
if (this.hierarchies.hasOwnProperty(hiename)) {
count++;
}
}
return count;
};
cubes.Dimension.prototype.default_hierarchy = function() {
return this.hierarchies[this.default_hierarchy_name];
};
/*
* Extend model prototype to support datefilter dimensions.
*/
cubes.Dimension.prototype.isDateDimension = function() {
// Inform if a dimension is a date dimension and can be used as a date
// filter (i.e. with date selection tool).
return ((this.role == "time") &&
((! ("cv-datefilter" in this.info)) || (this.info["cv-datefilter"] == true)) );
};
/**
* List date dimensions.
*
* @returns An array with the dimensions that are date dimensions (role: time).
*/
cubes.Cube.prototype.dateDimensions = function() {
var result = [];
for (var index in this.dimensions) {
var dimension = this.dimensions[index];
if (dimension.isDateDimension()) result.push(dimension);
}
return result;
};
cubes.Cube.prototype.cvdim_dim = function(dimensionString) {
// Get a dimension by name. Accepts dimension hierarchy and level in the input string.
var dimname = dimensionString;
if (dimensionString.indexOf('@') > 0) {
dimname = dimensionString.split("@")[0];
} else if (dimensionString.indexOf(':') > 0) {
dimname = dimensionString.split(":")[0];
}
return this.dimension(dimname);
};
cubes.Cube.prototype.dimensionPartsFromCut = function(cut) {
var parts = this.dimensionParts(cut.dimension);
var depth = (cut.value.split(';')[0].match(/,/g) || []).length + 1;
var dimstring = parts.dimension.name + '@' + parts.hierarchy.name + ':' + parts.hierarchy.levels[depth - 1].name;
return this.dimensionParts(dimstring);
};
cubes.Cube.prototype.dimensionParts = function(dimensionString) {
// Get a dimension info by name. Accepts dimension hierarchy and level in the input string.
if (!dimensionString) return null;
var dim = this.cvdim_dim(dimensionString);
var hie = dim.default_hierarchy();
if (dimensionString.indexOf("@") > 0) {
var hierarchyName = dimensionString.split("@")[1].split(":")[0];
hie = dim.hierarchy(hierarchyName);
}
var lev = null;
var levelIndex = 0;
if (dimensionString.indexOf(":") > 0) {
var levelname = dimensionString.split(":")[1];
lev = dim.level(levelname);
for (levelIndex = 0; levelIndex < hie.levels.length && hie.levels[levelIndex] != lev; levelIndex++);
} else {
lev = dim.level(hie.levels[0]);
}
var depth = null;
for (var i = 0; i < hie.levels.length; i++) {
if (lev.name == hie.levels[i]) {
depth = i + 1;
break;
}
}
return {
dimension: dim,
level: lev,
levelIndex: levelIndex,
depth: depth,
hierarchy: hie,
label: dim.label + ( hie.name != "default" ? (" - " + hie.label) : "" ) + ( hie.levels.length > 1 ? (" / " + lev.label) : "" ),
labelShort: (dim.label + ( hie.levels.length > 1 ? (" / " + lev.label) : "" )),
labelNoLevel: dim.label + ( hie.name != "default" ? (" - " + hie.label) : "" ),
fullDrilldownValue: dim.name + ( hie.name != "default" ? ("@" + hie.name) : "" ) + ":" + lev.name,
drilldownDimension: dim.name + '@' + hie.name + ':' + lev.name,
drilldownDimensionPlus: (hie.levels.length > 1 && levelIndex < hie.levels.length - 1) ? (dim.name + '@' + hie.name + ':' + hie.levels[levelIndex + 1].name) : null,
drilldownDimensionMinus: (hie.levels.length > 1 && levelIndex > 0) ? (dim.name + '@' + hie.name + ':' + hie.levels[levelIndex - 1].name) : null,
cutDimension: dim.name + ( hie.name != "default" ? "@" + hie.name : "" )
};
};
/**
* Returns the aggregates for the given measure, by name.
* If passed null, returns aggregates with no measure.
*
* @returns The list of aggregates of a measure.
*/
cubes.Cube.prototype.measureAggregates = function(measureName) {
var aggregates = $.grep(this.aggregates, function(ia) { return measureName ? ia.measure == measureName : !ia.measure; } );
return aggregates;
};
cubes.Cube.prototype.aggregateFromName = function(aggregateName) {
var aggregates = $.grep(this.aggregates, function(ia) { return aggregateName ? ia.name == aggregateName : !ia.measure; } );
return aggregates.length == 1 ? aggregates[0] : null;
};
/*
* Processes a cell and returns an object with consistent information:
* o.key
* o.label
* o.info[]
*/
cubes.Level.prototype.readCell = function(cell) {
if (!(this.key().ref in cell)) return null;
var result = {};
result.key = cell[this.key().ref];
result.label = cell[this.label_attribute().ref];
result.orderValue = cell[this.order_attribute().ref];
result.info = {};
$(this.attributes).each(function(idx, attribute) {
result.info[attribute.ref] = cell[attribute.ref];
});
return result;
};
cubes.Hierarchy.prototype.readCell = function(cell, level_limit) {
var result = [];
var hie = this;
for (var i = 0; i < this.levels.length; i ++) {
var level = this.levels[i];
var info = level.readCell(cell);
if (info != null) result.push(info);
// Stop if we reach level_limit
if ((level_limit != undefined) && (level_limit != null)) {
if (level_limit.name == level.name) break;
}
}
return result;
};
================================================
FILE: cubesviewer/cubes/cubes-service.js
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
/**
* CubesViewer Cubes module. Provides an interface to the Cubes client.
*
* @namespace cv.cubes
*/
angular.module('cv.cubes', []);
/**
* This service manages the Cubes client instance and provides methods to
* connect to and query the Cubes server.
*
* @class cubesService
* @memberof cv.cubes
*/
angular.module('cv.cubes').service("cubesService", ['$rootScope', '$log', 'cvOptions', 'gaService',
function ($rootScope, $log, cvOptions, gaService) {
var cubesService = this;
this.cubesserver = null;
this.state = cubesviewer.VIEW_STATE_INITIALIZING;
this.stateText = "";
this.initialize = function() {
};
/**
* Connects this service to the Cubes server, using the parameters
* defined by the configured {@link cvOptions}.
*
* @memberOf cv.cubes.cubesService
*/
this.connect = function() {
// Initialize Cubes client library
this.cubesserver = new cubes.Server(cubesService._cubesAjaxHandler);
console.debug("Cubes client connecting to: " + cvOptions.cubesUrl);
this.cubesserver.connect (cvOptions.cubesUrl, function() {
$log.debug('Cubes client initialized (server version: ' + cubesService.cubesserver.server_version + ')');
cubesService.state = cubesviewer.VIEW_STATE_INITIALIZED;
$rootScope.$apply();
}, function(xhr) {
console.debug(xhr);
console.debug('Could not connect to Cubes server [code=' + xhr.status + "]");
cubesService.state = cubesviewer.VIEW_STATE_ERROR;
if (xhr.status == 401) {
cubesService.stateText = "Unauthorized.";
} else if (xhr.status == 403) {
cubesService.stateText = "Forbidden.";
} else if (xhr.status == 400) {
cubesService.stateText = "Bad request: " + ($.parseJSON(xhr.responseText).message);
} else {
cubesService.stateText = "Unknown error.";
}
$rootScope.$apply();
} );
};
/*
* Ajax handler for cubes library
*/
this._cubesAjaxHandler = function (settings) {
return cubesService.cubesRequest(settings.url, settings.data || [], settings.success, settings.error);
};
/**
* Sends a request to the Cubes server.
*
* @memberOf cv.cubes.cubesService
* @returns The jQuery XHR object.
*/
this.cubesRequest = function(path, params, successCallback, errCallback) {
// TODO: normalize how URLs are used (full URL shall come from client code)
if (path.charAt(0) == '/') path = cvOptions.cubesUrl + path;
if (cvOptions.debug) {
$log.debug("Cubes request: " + path + " (" + JSON.stringify(params) + ")");
}
var jqxhr = $.get(path, params, cubesService._cubesRequestCallback(successCallback), cvOptions.jsonRequestType);
jqxhr.fail(errCallback || cubesService.defaultRequestErrorHandler);
try {
gaService.trackRequest(path);
} catch(e) {
$log.error("An error happened during CubesViewer event tracking: " + e)
}
return jqxhr;
}
this._cubesRequestCallback = function(pCallback) {
var callback = pCallback;
return function(data, status) {
pCallback(data);
}
};
/*
* Default XHR error handler for CubesRequests
*/
this.defaultRequestErrorHandler = function(xhr, textStatus, errorThrown) {
$log.error("Cubes request error: " + xhr)
};
/*
* Builds Cubes Server query parameters based on current view values.
*/
this.buildBrowserArgs = function(view, includeXAxis, onlyCuts) {
// "lang": view.cubesviewer.options.cubesLang
//console.debug(view);
var args = {};
if (!onlyCuts) {
var drilldowns = view.params.drilldown.slice(0);
// Include X Axis if necessary
if (includeXAxis) {
drilldowns.splice(0, 0, view.params.xaxis);
}
// Preprocess
for (var i = 0; i < drilldowns.length; i++) {
drilldowns[i] = cubes.drilldown_from_string(view.cube, view.cube.dimensionParts(drilldowns[i]).fullDrilldownValue);
}
// Include drilldown array
if (drilldowns.length > 0)
args.drilldown = cubes.drilldowns_to_string(drilldowns);
}
// Cuts
var cuts = this.buildQueryCuts(view);
if (cuts.length > 0) args.cut = new cubes.Cell(view.cube, cuts);
return args;
};
/*
* Builds Query Cuts
*/
this.buildQueryCutsStrings = function(view) {
var cuts = [];
// Cuts
$(view.params.cuts).each(function(idx, e) {
var invert = e.invert ? "!" : "";
var dimParts = view.cube.dimensionParts(e.dimension);
var cutDim = dimParts.dimension.name + ( dimParts.hierarchy.name != "default" ? "@" + dimParts.hierarchy.name : "" );
cuts.push(invert + cutDim + ":" + e.value.replace("-", "\\-"));
});
// Date filters
$(view.params.datefilters).each(function(idx, e) {
var datefilterval = cubesService.datefilterValue(view, e);
if (datefilterval != null) {
cuts.push(e.dimension + ":" + datefilterval);
}
});
return cuts;
};
this.buildQueryCuts = function(view) {
var cuts = [];
var cutsStrings = cubesService.buildQueryCutsStrings(view);
$(cutsStrings).each(function(idx, e) {
cuts.push(cubes.cut_from_string(view.cube, e));
});
return cuts;
};
/*
* Composes a filter with appropriate syntax and time grain from a
* datefilter
*/
this.datefilterValue = function(view, datefilter) {
var date_from = null;
var date_to = null;
if (datefilter.mode.indexOf("auto-") == 0) {
if (datefilter.mode == "auto-last1m") {
date_from = new Date();
date_from.setMonth(date_from.getMonth() - 1);
} else if (datefilter.mode == "auto-last3m") {
date_from = new Date();
date_from.setMonth(date_from.getMonth() - 3);
} else if (datefilter.mode == "auto-last6m") {
date_from = new Date();
date_from.setMonth(date_from.getMonth() - 6);
} else if (datefilter.mode == "auto-last12m") {
date_from = new Date();
date_from.setMonth(date_from.getMonth() - 12);
} else if (datefilter.mode == "auto-last24m") {
date_from = new Date();
date_from.setMonth(date_from.getMonth() - 24);
} else if (datefilter.mode == "auto-january1st") {
date_from = new Date();
date_from.setMonth(0);
date_from.setDate(1);
} else if (datefilter.mode == "auto-yesterday") {
date_from = new Date();
date_from.setDate(date_from.getDate() - 1);
date_to = new Date();
date_to.setDate(date_from.getDate() - 1);
}
} else if (datefilter.mode == "custom") {
if ((datefilter.date_from != null) && (datefilter.date_from != "")) {
date_from = new Date(datefilter.date_from);
}
if ((datefilter.date_to != null) && (datefilter.date_to != "")) {
date_to = new Date(datefilter.date_to);
}
}
if ((date_from != null) || (date_to != null)) {
var datefiltervalue = "";
if (date_from != null)
datefiltervalue = datefiltervalue + cubesService._datefiltercell(view, datefilter, date_from);
datefiltervalue = datefiltervalue + "-";
if (date_to != null)
datefiltervalue = datefiltervalue + cubesService._datefiltercell(view, datefilter, date_to);
return datefiltervalue;
} else {
return null;
}
};
this._datefiltercell = function(view, datefilter, tdate) {
var values = [];
var dimensionparts = view.cube.dimensionParts(datefilter.dimension);
for (var i = 0; i < dimensionparts.hierarchy.levels.length; i++) {
var level = dimensionparts.hierarchy.levels[i];
var field = level.role;
if (field == "year") {
values.push(tdate.getFullYear());
} else if (field == "month") {
values.push(tdate.getMonth() + 1);
} else if (field == "quarter") {
values.push((Math.floor(tdate.getMonth() / 3) + 1));
} else if (field == "week") {
values.push(this._weekNumber(tdate));
} else if (field == "day") {
values.push(tdate.getDate());
} else {
dialogService.show("Wrong configuration of model: time role of level '" + level.name + "' is invalid.");
}
}
return values.join(',');
/*return tdate.getFullYear() + ","
+ (Math.floor(tdate.getMonth() / 3) + 1) + ","
+ (tdate.getMonth() + 1); */
};
this._weekNumber = function(d) {
// Copy date so don't modify original
d = new Date(d);
d.setHours(0,0,0);
// Get first day of year
var yearStart = new Date(d.getFullYear(),0,1);
// Calculate full weeks to nearest Thursday
var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7)
// Return array of year and week number
return weekNo;
};
this.initialize();
}]);
================================================
FILE: cubesviewer/cubes/cubes.js
================================================
/* Cubes.js
*
* JavaScript library for Cubes OLAP.
*
*/
(function(){
// Light-weight "underscore" replacements
var _ = {};
_.map = function(ary, f) {
var ret = [];
for (var i = 0; i < ary.length; i++) {
ret.push(f(ary[i]));
}
return ret;
};
_.filter = function(ary, f) {
var ret = [];
for (var i = 0; i < ary.length; i++) {
if ( f(ary[i]) ) ret.push(ary[i]);
}
return ret;
};
_.find = function(ary, f) {
var i;
if (Object.prototype.toString.call(ary) === '[object Array]') {
for (i = 0; i < ary.length; i++) {
if ( f(ary[i]) ) return ary[i];
}
} else {
for (i in ary) {
if ( f(ary[i]) ) return ary[i];
}
}
return null;
};
_.indexOf = function(ary, f) {
var i;
if (Object.prototype.toString.call(ary) === '[object Array]') {
for (i = 0; i < ary.length; i++) {
if ( f(ary[i]) ) return i;
}
} else {
for (i in ary) {
if ( f(ary[i]) ) return i;
}
}
return -1;
};
_.isObject = function(o) {
return Object.prototype.toString.call(o) === '[object Object]';
};
_.isString = function(o) {
return Object.prototype.toString.call(o) === '[object String]';
};
// Variables and functions go here.
var root = this;
var cubes = { };
/*
* Server
* ======
*/
cubes.Server = function(ajaxHandler){
// Represents Cubes Slicer Server connection.
//
// Attributes:
//
// * `ajaxHandler`: a function accepting jquery-style settings object as in $.ajax(settings)
//
if(ajaxHandler)
{
this.ajaxRequest = ajaxHandler;
}
else
{
this.ajaxRequest = $.ajax;
}
this._cube_list = [];
this._cubes = {}
};
cubes.Server.prototype.cubeinfo = function(cubename) {
var cubeinfos = $.grep(this._cube_list, function (ci) { return ci.name == cubename });
if (cubeinfos.length != 1) throw "Found " + cubeinfos.length + " cubes with name '" + cubename + "' in the cube list";
return cubeinfos[0];
};
cubes.Server.prototype.ajaxRequest = function(settings) {
throw "Must implement ajaxRequest for server to process jquery-style $.ajax settings object";
};
cubes.Server.prototype.query = function(query, cube, args, callback, errCallback, completeCallback) {
var params = {dataType : 'json', type : "GET"};
var cube_name = null;
if(cube.hasOwnProperty("name"))
cube_name = cube.name;
else
cube_name = cube;
params.url = this.url + "cube/" + cube_name + "/" + query;
params.data = args;
if(args && args.cut)
params.data.cut = params.data.cut.toString();
if(args && args.drilldown)
params.data.drilldown = params.data.drilldown.toString();
params.success = function(obj) {
callback(obj);
};
params.error = function(obj) {
// FIXME: Some error handler here
if (errCallback) errCallback(obj);
};
params.complete = function(obj) {
if (completeCallback) completeCallback(obj);
};
return this.ajaxRequest(params);
};
/**
* Connect to the Slicer server.
*
* @param {url} Slicer server URL
* @param {callback} Function called on successfull connect
* @param {errCallback} Function called on error
* one line.
*/
cubes.Server.prototype.connect = function(url, callback, errCallback) {
var self = this;
self.url = self._normalize_url(url);
var options = {dataType : 'json', type : "GET"};
options.url = self.url + 'info';
options.success = function(resp, status, xhr) {
self.server_version = resp.cubes_version;
self.cubes_version = resp.cubes_version;
self.api_version = resp.api_version;
self.info = resp;
self.load_cube_list(callback, errCallback);
};
options.error = function(resp, status, xhr) {
if (errCallback)
errCallback(resp);
};
this.ajaxRequest(options);
};
cubes.Server.prototype._normalize_url = function(url) {
if(url[url.length-1] != '/')
return url + '/';
return url;
};
cubes.Server.prototype.load_cube_list = function(callback, errCallback) {
var self = this;
var options = {dataType : 'json', type : "GET"};
options.url = self.url + 'cubes';
options.success = function(resp, status, xhr) {
self._cube_list = resp;
if (callback)
callback(self._cube_list);
};
options.error = function(resp, status, xhr) {
if (errCallback)
errCallback(resp);
};
return this.ajaxRequest(options);
};
cubes.Server.prototype.get_cube = function(name, callback, errCallback) {
var self = this;
// Return the cube if already loaded
if((name in this._cubes) && callback){
var jqxhr = $.Deferred();
jqxhr.error = function() { };
setTimeout(function() {
// TODO: What is the correct ordering of success/complete callbacks?
callback(self._cubes[name]);
jqxhr.resolve(); //.promise();
}, 0);
return jqxhr;
}
var options = {dataType : 'json', type : "GET"};
options.url = self.url + 'cube/' + encodeURI(name) + '/model';
options.success = function(resp, status, xhr) {
// must parse dimensions first into a "fake" model
var cube = new cubes.Cube(resp);
self._cubes[name] = cube;
// FIXME: handle model parse failure
if (callback)
callback(cube);
};
options.error = function(resp, status, xhr) {
if (errCallback)
errCallback(resp);
};
return this.ajaxRequest(options);
};
/*
* The Cube
* ========
*/
cubes.Cube = function(metadata) {
var i, obj;
this.name = metadata.name;
!metadata.label || (this.label = metadata.label);
!metadata.description || (this.description = metadata.description);
!metadata.key || (this.key = metadata.key);
!metadata.info || (this.info = metadata.info);
!metadata.category || (this.category = metadata.category);
!metadata.features || (this.features = metadata.features);
this.measures = _.map(metadata.measures || [], function(m) { return new cubes.Measure(m); });
this.aggregates = _.map(metadata.aggregates || [], function(m) { return new cubes.MeasureAggregate(m); });
this.details = _.map(metadata.details || [], function(m) { return new cubes.Attribute(m); });
this.dimensions = _.map(metadata.dimensions || [], function(dim) {return new cubes.Dimension(dim);} );
};
cubes.Cube.prototype.dimension = function(name) {
if ( _.isObject(name) )
return name;
// Return a dimension with given name
return _.find(this.dimensions, function(obj){return obj.name === name;});
};
/*
* Dimension
* =========
*/
cubes.Dimension = function(md){
var dim = this;
var i;
dim.name = md.name;
dim.label = md.name;
!md.label || (dim.label = md.label);
!md.description || (dim.description = md.description);
!md.default_hierarchy_name || (dim.default_hierarchy_name = md.default_hierarchy_name);
!md.info || (dim.info = md.info);
!md.role || (dim.role = md.role);
!md.cardinality || (dim.cardinality = md.cardinality);
!md.nonadditive || (dim.nonadditive = md.nonadditive);
dim.levels = [];
if(md.levels) {
for(i in md.levels) {
var level = new cubes.Level(dim.name, md.levels[i]);
dim.levels.push(level);
}
}
this.hierarchies = {};
if(md.hierarchies) {
for(i in md.hierarchies) {
var hier = new cubes.Hierarchy(md.hierarchies[i], this);
dim.hierarchies[hier.name] = hier;
}
}
// if no default_hierarchy_name defined, use first hierarchy's name.
if ( ! dim.default_hierarchy_name && md.hierarchies
&& md.hierarchies.length > 0 ) {
dim.default_hierarchy_name = md.hierarchies[0].name;
}
};
cubes.Dimension.prototype.hierarchy = function(name) {
if ( _.isObject(name) )
return name;
if ( ! name ) {
return this.hierarchies[this.default_hierarchy_name];
}
// Return a hierarchy with given name
return this.hierarchies[name];
}
cubes.Dimension.prototype.level = function(name) {
if ( _.isObject(name) )
return name;
// Return a level with given name
return _.find(this.levels, function(obj) {return obj.name == name;});
};
cubes.Dimension.prototype.toString = function(desc) {
return this.name;
};
cubes.Dimension.prototype.display_label = function() {
return this.label || this.name;
};
cubes.Dimension.prototype.hierarchy = function(name) {
if ( _.isObject(name) )
return name;
else if(name != null)
return this.hierarchies[name];
else
return this.hierarchies[this.default_hierarchy_name];
};
/*
* Hierarchy
* ---------
*/
cubes.Hierarchy = function(obj, dim) {
this.parse(obj, dim);
};
cubes.Hierarchy.prototype.parse = function(desc, dim) {
var hier = this;
var i;
hier.name = desc.name;
hier.label = hier.name;
!desc.label || (hier.label = desc.label)
!desc.description || (hier.description = desc.description)
!desc.info || (hier.info = desc.info);
var level_names = desc.levels || [];
hier.levels = _.map(level_names, function(name) {return dim.level(name);} );
};
cubes.Hierarchy.prototype.toString = function() {
return cubes.HIERARCHY_PREFIX_CHAR + this.name;
};
cubes.Hierarchy.prototype.display_label = function() {
return this.label || this.name;
};
/*
* Level
* -----
*/
cubes.Level = function(dimension_name, obj){
this.parse(dimension_name, obj);
};
cubes.Level.prototype.parse = function(dimension_name, desc) {
var level = this;
var i;
level.dimension_name = dimension_name;
level.name = desc.name;
!desc.label || (level.label = desc.label);
!desc.description || (level.description = desc.description);
!desc.info || (level.info = desc.info);
level._key = desc.key;
level._label_attribute = desc.label_attribute;
level._order_attribute = desc.order_attribute;
!desc.role || (level.role = desc.role);
!desc.cardinality || (level.cardinality = desc.cardinality);
level.nonadditive = desc.nonadditive;
level.attributes = [];
if(desc.attributes) {
for(i in desc.attributes) {
var attr = new cubes.Attribute(desc.attributes[i]);
level.attributes.push(attr);
}
}
};
cubes.Level.prototype.key = function() {
// Key attribute is either explicitly specified or it is first attribute in the list
var key = this._key;
var the_attr = _.find(this.attributes, function(a) { return a.name === key; });
return the_attr || this.attributes[0];
};
cubes.Level.prototype.label_attribute = function() {
// Label attribute is either explicitly specified or it is second attribute if there are more
// than one, otherwise it is first
var the_attr = null;
if ( this._label_attribute ) {
var label_attribute = this._label_attribute;
the_attr = _.find(this.attributes, function(a) { return a.name === label_attribute; });
}
return the_attr || this.key();
};
cubes.Level.prototype.order_attribute = function() {
var the_attr = null;
var order_attribute = this._order_attribute;
if (order_attribute ) {
the_attr = _.find(this.attributes, function(a) { return a.name === order_attribute; });
}
return the_attr || this.label_attribute();
};
cubes.Level.prototype.toString = function() {
return this.name;
};
cubes.Level.prototype.display_name = function() {
return this.label || this.name;
};
cubes.Level.prototype.full_name = function() {
return this.dimension_name + cubes.ATTRIBUTE_STRING_SEPARATOR_CHAR + this.name;
};
cubes.Level.prototype.full_name_for_drilldown = function() {
return this.dimension_name + cubes.DIMENSION_STRING_SEPARATOR_CHAR + this.name;
};
/*
* Attributes, measures and measure aggregates
* -------------------------------------------
* */
cubes.Attribute = function(obj){
this.ref = obj.ref;
this.name = obj.name;
this.label = obj.label;
this.order = obj.order;
this.info = (obj.info || {});
this.description = obj.description;
this.format = obj.format;
this.missing_value = obj.missing_value;
this.locales = obj.locales;
};
cubes.Measure = function(obj){
this.ref = obj.ref;
this.name = obj.name;
this.label = obj.label;
this.order = obj.order;
this.info = (obj.info || {});
this.description = obj.description;
this.format = obj.format;
this.missing_value = obj.missing_value;
this.nonadditive = obj.nonadditive;
if (obj.aggregates) {
this.aggregates = obj.aggregates;
}
};
cubes.MeasureAggregate = function(obj){
this.ref = obj.ref;
this.name = obj.name;
this.label = obj.label;
this.order = obj.order;
this.locales = obj.locales;
this.info = (obj.info || {});
this.description = obj.description;
this.format = obj.format;
this.missing_value = obj.missing_value;
this.nonadditive = obj.nonadditive;
this["function"] = obj["function"];
this.measure = obj.measure;
};
/*
* Browser
* =======
* */
cubes.Browser = function(server, cube){
this.cube = cube;
this.server = server;
};
cubes.Browser.prototype.full_cube = function() {
return new cubes.Cell(this.cube);
};
cubes.Browser.prototype.aggregate = function(args, callback) {
if ( ! args )
args = {};
var http_args = {};
if (args.cut) http_args.cut = args.cut.toString();
if (args.measure) http_args.measure = args.measure.toString();
if (args.drilldown) http_args.drilldown = args.drilldown.toString();
if (args.split) http_args.split = args.split.toString();
if (args.order) http_args.order = args.order.toString();
if (args.page) http_args.page = args.page;
if (args.pagesize) http_args.pagesize = args.pagesize;
return this.server.query("aggregate", this.cube, args, callback);
};
cubes.Browser.prototype.facts = function(args, callback) {
if ( ! args )
args = {};
var http_args = {};
if (args.cut) http_args.cut = args.cut.toString();
if (args.order) http_args.order = args.order.toString();
if (args.page) http_args.page = args.page;
if (args.pagesize) http_args.pagesize = args.pagesize;
return this.server.query("facts", this.cube, args, callback);
};
cubes.Drilldown = function(dimension, hierarchy, level) {
if ( ! _.isObject(dimension) )
throw "Drilldown requires a Dimension object as first argument";
this.dimension = dimension;
this.hierarchy = dimension.hierarchy(hierarchy);
this.level = dimension.level(level) || this.hierarchy.levels[0];
if ( ! this.hierarchy )
throw "Drilldown cannot recognize hierarchy " + hierarchy + " for dimension " + dimension;
if ( ! this.level )
throw "Drilldown cannot recognize level " + level + " for dimension " + dimension;
};
cubes.Drilldown.prototype.toString = function() {
return "" + this.dimension + this.hierarchy + cubes.DIMENSION_STRING_SEPARATOR_CHAR + this.level;
};
cubes.Drilldown.prototype.keysInResultCell = function() {
var drill = this;
var saw_this_level = false;
var levels_to_look_for = _.filter(drill.hierarchy.levels, function(lvl) { return ( lvl.key() === drill.level.key() && (saw_this_level = true) ) || ( ! saw_this_level ); });
return _.map(levels_to_look_for, function(lvl) { return lvl.key().ref });
}
cubes.Drilldown.prototype.labelsInResultCell = function() {
var drill = this;
var saw_this_level = false;
var levels_to_look_for = _.filter(drill.hierarchy.levels, function(lvl) { return ( lvl.key() === drill.level.key() && (saw_this_level = true) ) || ( ! saw_this_level ); });
return _.map(levels_to_look_for, function(lvl) { return lvl.label_attribute().ref });
}
cubes.Cell = function(cube, cuts) {
this.cube = cube;
this.cuts = _.map((cuts || []), function(i) { return i; });
};
cubes.Cell.prototype.slice = function(new_cut) {
var cuts = [];
var new_cut_pushed = false;
for (var i = 0; i < this.cuts.length; i++) {
var c = this.cuts[i];
if ( c.dimension == new_cut.dimension ){
cuts.push(new_cut);
new_cut_pushed = true;
}
else {
cuts.push(c);
}
}
if ( ! new_cut_pushed ) {
cuts.push(new_cut);
}
var cell = new cubes.Cell(this.cube, cuts);
return cell;
};
cubes.Cell.prototype.toString = function() {
return _.map(this.cuts || [], function(cut) { return cut.toString(); }).join(cubes.CUT_STRING_SEPARATOR_CHAR);
};
cubes.Cell.prototype.cut_for_dimension = function(name) {
return _.find(this.cuts, function(cut) {
return cut.dimension.name == name;
});
};
cubes.PointCut = function(dimension, hierarchy, path, invert) {
this.type = 'point';
this.dimension = dimension;
this.hierarchy = dimension.hierarchy(hierarchy);
this.path = path;
this.invert = !!invert;
};
cubes.PointCut.prototype.toString = function() {
var path_str = cubes.string_from_path(this.path);
return (this.invert ? cubes.CUT_INVERSION_CHAR : "") +
this.dimension +
( this.hierarchy || '' ) +
cubes.DIMENSION_STRING_SEPARATOR_CHAR +
path_str;
};
cubes.SetCut = function(dimension, hierarchy, paths, invert) {
this.type = 'set';
this.dimension = dimension;
this.hierarchy = dimension.hierarchy(hierarchy);
this.paths = paths;
this.invert = !!invert;
};
cubes.SetCut.prototype.toString = function() {
var path_str = _.map(this.paths, cubes.string_from_path).join(cubes.SET_CUT_SEPARATOR_CHAR);
return (this.invert ? cubes.CUT_INVERSION_CHAR : "") +
this.dimension +
( this.hierarchy || '' ) +
cubes.DIMENSION_STRING_SEPARATOR_CHAR +
path_str;
};
cubes.RangeCut = function(dimension, hierarchy, from_path, to_path, invert){
this.type = 'range';
this.dimension = dimension;
this.hierarchy = dimension.hierarchy(hierarchy);
if ( from_path === null && to_path === null ) {
throw "Either from_path or to_path must be defined for RangeCut";
}
this.from_path = from_path;
this.to_path = to_path;
this.invert = !!invert;
};
cubes.RangeCut.prototype.toString = function() {
var path_str = cubes.string_from_path(this.from_path) + cubes.RANGE_CUT_SEPARATOR_CHAR + cubes.string_from_path(this.to_path);
return (this.invert ? cubes.CUT_INVERSION_CHAR : "") +
this.dimension +
( this.hierarchy || '' ) +
cubes.DIMENSION_STRING_SEPARATOR_CHAR +
path_str;
};
cubes.CUT_INVERSION_CHAR = "!";
cubes.CUT_STRING_SEPARATOR_CHAR = "|";
cubes.DIMENSION_STRING_SEPARATOR_CHAR = ":";
cubes.ATTRIBUTE_STRING_SEPARATOR_CHAR = ".";
cubes.HIERARCHY_PREFIX_CHAR = "@";
cubes.PATH_STRING_SEPARATOR_CHAR = ",";
cubes.RANGE_CUT_SEPARATOR_CHAR = "-";
cubes.SET_CUT_SEPARATOR_CHAR = ";";
cubes.CUT_STRING_SEPARATOR = /\|/g;
cubes.DIMENSION_STRING_SEPARATOR = /:/g;
cubes.PATH_STRING_SEPARATOR = /,/g;
cubes.RANGE_CUT_SEPARATOR = /-/g;
cubes.SET_CUT_SEPARATOR = /;/g;
cubes.PATH_PART_ESCAPE_PATTERN = /([\\!|:;,-])/g;
cubes.PATH_PART_UNESCAPE_PATTERN = /\\([\\!|:;,-])/g;
cubes.CUT_PARSE_REGEXP = new RegExp("^(" + cubes.CUT_INVERSION_CHAR + "?)(\\w+)(?:" + cubes.HIERARCHY_PREFIX_CHAR + "(\\w+))?" + cubes.DIMENSION_STRING_SEPARATOR_CHAR + "(.*)$")
cubes.DRILLDOWN_PARSE_REGEXP = new RegExp("^(\\w+)(?:" + cubes.HIERARCHY_PREFIX_CHAR + "(\\w+))?(?:" + cubes.DIMENSION_STRING_SEPARATOR_CHAR + "(\\w+))?$")
cubes.NULL_PART_STRING = '__null__';
cubes.SPLIT_DIMENSION_STRING = '__within_split__';
cubes.SPLIT_DIMENSION = new cubes.Dimension({
name: cubes.SPLIT_DIMENSION_STRING,
label: 'Matches Filters',
hierarchies: [ { name: 'default', levels: [ cubes.SPLIT_DIMENSION_STRING ] } ],
levels: [ { name: cubes.SPLIT_DIMENSION_STRING, attributes: [{name: cubes.SPLIT_DIMENSION_STRING}], label: 'Matches Filters' } ]
});
cubes._split_with_negative_lookbehind = function(input, regex, lb) {
var string = input;
var match;
var splits = [];
while ((match = regex.exec(string)) != null) {
if ( string.substr(match.index - lb.length, lb.length) != lb ) {
splits.push(string.substring(0, match.index));
string = string.substring(Math.min(match.index + match[0].length, string.length));
regex.lastIndex = 0;
}
else {
// match has the lookbehind, must exclude
// TODO: I suspect an infinite loop on this branch as the string is not modified
}
}
splits.push(string);
return splits;
}
cubes._escape_path_part = function(part) {
if ( part == null ) {
return cubes.NULL_PART_STRING;
}
return part.toString().replace(cubes.PATH_PART_ESCAPE_PATTERN, function(match, b1) { return "\\" + b1; });
};
cubes._unescape_path_part = function(part) {
if ( part === cubes.NULL_PART_STRING ) {
return null;
}
return part.replace(cubes.PATH_PART_UNESCAPE_PATTERN, function(match, b1) { return b1; });
};
cubes.string_from_path = function(path){
var fixed_path = _.map(path || [], function(element) {return cubes._escape_path_part(element);}).join(cubes.PATH_STRING_SEPARATOR_CHAR);
return fixed_path;
};
cubes.path_from_string = function(path_string) {
var paths = cubes._split_with_negative_lookbehind(path_string, cubes.PATH_STRING_SEPARATOR, '\\');
var parsed = _.map(paths || [], function(e) { return cubes._unescape_path_part(e); });
return parsed;
};
cubes.cut_from_string = function(cube_or_model, cut_string) {
// parse out invert, dim_name, hierarchy, and path thingy
var match = cubes.CUT_PARSE_REGEXP.exec(cut_string);
if (!match) {
return null;
}
var invert = !!(match[1]),
dim_name = match[2],
hierarchy = match[3] || null,
path_thingy = match[4];
var dimension = cube_or_model.dimension(dim_name);
// if path thingy splits on set separator, make a SetCut.
var splits = cubes._split_with_negative_lookbehind(path_thingy, cubes.SET_CUT_SEPARATOR, '\\');
if ( splits.length > 1 ) {
return new cubes.SetCut(dimension, hierarchy, _.map(splits, function(ss) { return cubes.path_from_string(ss); }), invert);
}
// else if path thingy splits into two on range separator, make a RangeCut.
splits = cubes._split_with_negative_lookbehind(path_thingy, cubes.RANGE_CUT_SEPARATOR, '\\');
if ( splits.length == 2 ) {
var from_path = splits[0] ? cubes.path_from_string(splits[0]) : null;
var to_path = splits[1] ? cubes.path_from_string(splits[1]) : null;
return new cubes.RangeCut(dimension, hierarchy, from_path, to_path, invert);
}
// else it's a PointCut.
return new cubes.PointCut(dimension, hierarchy, cubes.path_from_string(path_thingy), invert);
};
cubes.cuts_from_string = function(cube_or_model, cut_param_value) {
var cut_strings = cubes._split_with_negative_lookbehind(cut_param_value, cubes.CUT_STRING_SEPARATOR, '\\');
return _.map(cut_strings || [], function(e) { return cubes.cut_from_string(cube_or_model, e); });
};
cubes.cell_from_string = function(cube, cut_param_value) {
return new cubes.Cell(cube, cubes.cuts_from_string(cube, cut_param_value));
};
cubes.drilldown_from_string = function(cube_or_model, drilldown_string) {
var match = cubes.DRILLDOWN_PARSE_REGEXP.exec(drilldown_string);
if (!match) {
return null;
}
var dim_name = match[1],
hierarchy = match[2] || null,
level = match[3] || null;
var dimension = cube_or_model.dimension(dim_name);
if ( ! dimension )
if ( dim_name === cubes.SPLIT_DIMENSION_STRING )
dimension = cubes.SPLIT_DIMENSION;
else
return null;
return new cubes.Drilldown(dimension, hierarchy, level);
};
cubes.drilldowns_from_string = function(cube_or_model, drilldown_param_value) {
var dd_strings = cubes._split_with_negative_lookbehind(drilldown_param_value, cubes.CUT_STRING_SEPARATOR, '\\');
return _.map(dd_strings || [], function(e) { return cubes.drilldown_from_string(cube_or_model, e); });
};
cubes.drilldowns_to_string = function(drilldowns) {
return _.map(drilldowns, function(d) { return d.toString(); }).join(cubes.CUT_STRING_SEPARATOR_CHAR);
};
root['cubes'] = cubes;
}).call(this);
================================================
FILE: cubesviewer/cubesviewer.less
================================================
/*
* Cubesviewer CSS
*/
.cv-bootstrap {
@import "bower_components/bootstrap/less/bootstrap.less";
@import "bower_components/bootstrap/less/responsive-embed.less";
/*@import "bower_components/bootstrap-submenu/less/bootstrap-submenu.less";*/
@font-family-sans-serif: Helvetica, Arial, sans-serif;
@font-family-serif: Georgia, "Times New Roman", Times, serif;
@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace;
@font-family-base: @font-family-sans-serif;
@font-size-base: 12px;
@panel-heading-padding: 5px 5px;
@panel-body-padding: 5px;
@grid-gutter-width: 10px;
font-size: 12px;
font-family: Arial, Helvetica, sans-serif;
.panel {
margin-bottom: 10px;
}
h3 {
margin-top: 0px;
margin-bottom: 5px;
}
/* UI grid hacks */
.ui-grid-pager-panel {
margin-bottom: -32px;
}
.ui-grid-pager-control-input {
width: 70px;
}
.ui-grid-pager-max-pages-number {
vertical-align: middle;
}
.ui-grid-selection-row-header-buttons {
margin-left: -2px;
}
.ui-grid-column-menu-button:focus {
outline: none;
}
.ui-grid-menu-button {
height: 24px;
width: 13px;
top: 0px;
right: 0px;
text-align: center;
}
.ui-grid-menu-button i::before {
margin: 0px;
}
.ui-grid-menu-mid {
max-height: 200px !important;
width: 190px;
overflow-x: hidden !important;
}
.ui-grid-menu .ui-grid-menu-inner ul li button {
padding: 6px;
}
div.ui-grid-pager-panel {
height: 32px;
white-space: nowrap;
overflow: hidden;
}
.ui-grid-canvas {
-webkit-touch-callout: initial;
-webkit-user-select: initial;
-khtml-user-select: initial;
-moz-user-select: initial;
-ms-user-select: initial;
user-select: initial;
}
.ui-grid-row:nth-child(even) .ui-grid-cell {
background-color: #F1F4FF;
}
.ui-grid-row .ui-grid-cell.ui-grid-row-header-cell {
background-color: #f0f0ee;
}
/* Datepicker popup hack */
div ul.uib-datepicker-popup.dropdown-menu {
display: block;
font-size: 12px;
padding: 0px 0px 10px 0px;
}
.cv-infopiece .uib-datepicker-popup.dropdown-menu button {
line-height: 1.5;
padding: 4px 8px;
}
/* Override glyphicon and use fontawesome */
.cv-view-panel .glyphicon {
display: inline-block;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
}
.glyphicon.glyphicon-chevron-left:before {
content: "\f053";
}
.glyphicon.glyphicon-chevron-right:before {
content: "\f054";
}
}
/*
*/
.cv-view-panel, .cv-gui-viewcontainer {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.cv-gui-panel .dropdown-menu li {
cursor: pointer;
}
.cv-view-panel .dropdown-menu li {
cursor: pointer;
}
.cv-gui-title {
font-weight: bold;
}
.cv-alerts {
position: fixed;
bottom: 10px;
right: 10px;
z-index: 5000;
}
/*
.cv-view-panel a:link {
text-decoration: none;
}
*/
.cv-grid-header-dimension {
color: #004400;
}
.cv-grid-header-dimensionattribute {
color: #666666;
}
.cv-grid-header-measure {
color: #444477;
}
/*
.ui-slider-range {
background-color: red;
background-image: none;
}
.cv-view-panel div {
margin: 0px;
padding: 0px;
}
*/
/*
.cv-view-panel td, th {
vertical-align: middle;
text-align: inherit;
padding: 2px 2px 2px 2px;
}
.cv-view-panel input[type=checkbox] {
margin: 0px !important;
}
*/
/* Override blueprint highlight */
/*
.cv-view-panel .highlight {background: inherit;}
*/
/*
Custom Cubesviewer styles
*/
/*
.cv-view-panel input {
vertical-align: middle;
}
.cv-view-panel input {
border: 1px solid #d0d0d0;
padding: 0px 2px 0px 2px;
}
.cv-view-panel h1 {
font-variant: small-caps;
font-weight: bold;
margin: 0px 0px 10px 0px;
color: #8686BF;
font-size: 20pt;
}
.cv-view-panel h2 {f
font-variant: small-caps;
font-weight: bold;
margin: 0px 0px 10px 0px;
color: #8686BF;
font-size: 16pt;
}
.cv-view-panel h3, .nvtooltip h3 {
font-variant: small-caps;
font-weight: bold;
margin: 0px 0px 10px 0px;
color: #8686BF;
font-size: 12pt;
}
.cv-view-panel label {
font-weight: inherit;
}
*/
.cv-view-panel th {
white-space: nowrap;
}
.nobreak {
overflow: hidden;
white-space: nowrap;
}
.ui-jqgrid tr.jqgrow td {
white-space: nowrap !important;
/*overflow: hidden;*/
}
/* GUI Elements */
.cv-gui-panel {
z-index: 9999;
margin-bottom: 10px;
}
.cv-gui-workspace {
/*margin-left: 230px;*/
min-height: 320px;
}
div.cv-gui-viewcontainer {
margin-bottom: 10px;
}
div.cv-gui-panelsection {
margin-bottom: 10px;
}
div.cv-view-viewinfo {
margin-top: 5px;
margin-bottom: 10px;
}
div.cv-infopiece {
display: inline-block;
}
div.cv-infopiece>span {
vertical-align: middle;
display: inline-block;
text-overflow: ellipsis;
overflow: hidden;
}
div.label.cv-infopiece {
font-size: inherit;
margin-bottom: 5px;
margin-right: 5px;
display: inline-block;
}
div.label.cv-infopiece button {
line-height: 1.0;
padding: 1px;
}
.fixed {
position: fixed;
}
.nvtooltip table {
margin: 0px ;
}
.nvtooltip table td {
border: none;
}
div.nvtooltip {
background-color : rgba(255,255,255,0.9);
}
/*
.ui-grid .ui-grid-render-container-body .ui-grid-viewport {
overflow-x: auto !important;
}
*/
/* Loading bar */
.loadingbar-content {
width: 100%;
/* Full Width */
height: 3px;
margin: -4px 0px 1px 0px;
//position: fixed;
position: relative;
overflow-x: hidden;
}
.loadingbar-expand {
width: 99%;
height: 1px;
margin: 1px 0;
background: #2187e7;
position: absolute;
box-shadow: 0px 0px 6px 1px rgba(0,198,255,0.8);
-moz-animation: fullexpand 60s ease-out;
-webkit-animation: fullexpand 60s ease-out;
}
@-moz-keyframes fullexpand {
0% { width: 0px; }
20% { width: 50%; }
40% { width: 75%; }
60% { width: 85%; }
80% { width: 95%; }
100% { width: 99%; }
}
@-webkit-keyframes fullexpand {
0% { width: 0px; }
20% { width: 50%; }
40% { width: 75%; }
60% { width: 90%; }
80% { width: 95%; }
100% { width: 99%; }
}
/*
CV Logo
*/
.cv-logo-embedded {
background:
url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAYAAACIeIa4AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4AUIAQ8FIfSUygAABKVJREFUWMPtmE9MHFUYwH9vWRYoQiuFoKE1kGBDXzlosbFeuEClakxjTNrYYkyLKaniQaMmcjAeqknFYE1EUiMxNPGgHAwR1IQ0aaE1RY1iUr9tqYm0B638EdYCLt0/42FmYXachV0YDk36JZvd/d68N/Ob9/17H9yR21PUWhcwtPYDXwNPKpEFmx4lgqF1N9ChRL53zEOJJH7XAgeAaqAIyAMiwCzwB/CtEul0zltXOEPrTcAvwH3ANKCVyA1D68TaXwL7rMtrlciQDVoBzwDvAmVp3vJDoF2J/J4OpFoDWAHwl/WWEzID3KtEwobW3wB7HdPqlcgZQ+ty4Fdgwypv/7oSaVuXnTO0vgu4CtzjMjwNXAMecBmLA+8DLwGBRW00CpEI7NoFO3dCYSHE4zA6CoODMD0N+fnOtQaUyKPL7aDKAChhTuXAKJC9Zo+PRqG4GA4dgqNHwe93v254GE6ehJER8PnsIz8BDwNRN0CV4Y4VA+NeBCLTC2uhszP968+cgeZmyMmxa99TIq+5Xe5LZ8es7/uBMU/AwmFobMwMDKCuDvr6nNpXDa33ZGyWNlOsAX70LAHt3g1dXaufPzQETU2QvegZVwHtNE+Vxs5VWZHN5wnY/DxcvAilpUnqyOQk/4yMELt5E+X3s6Gykvzt21Ov09oKvb12TbkSubaiWdpM8TEg6BlYPG4GDztYPM7MhQv8fe4csdlZUAojFmMuGGSyv5/Y3Jz7WgcPQixm17Ss6HM2U3zCqjy8lWPHkv7OBoPcGh9HZWU5nsxHPBJhamAAIxnClOpqyLOnWJ5dEc4Cexz4ynOwjRuhoGDpRUYizAWDoJb3jvD16+4D9fX23StdFs7QGkPrl4F+z8K9XXJzk3LZrakpZ95yT4ehkPvAtm2mqS89f9FyO5cFNKxbmW4YyVbi8/1Pl3ERkLzrsZRwSiSmRPYCPesCFw6bZZYlgZKStOCyi4rcBy5dSoJTIqF0Asp+4DPP4WZmYGLC9jYVhTU1qQENA18gQO7Wre7jg4OwFIh+SzegoEQagY89hfP5oC25mM+rqCC3vNwEtH2MWAx/YSGbGxrcA87wcJIVAKczri0NrTuAFzwDXFgwk++OHckpMBxm7vJloqEQvkCAvMpK02xTSXMznD9v97UtSuTGasqvd4A3PAOsrHRWF5lJdzccPw6BxVPTz8BDSiSeduFsM9FW4E3P4IJBOHzYWWGkJ2fPwokTdjCARifYao48rcDbnkGWlZlVfvKDppb2djh1ynnua1EiHV4dVo8AXWvEMgCFYZjRrr7e9KGqKvdc1t0NPT0wNmaPjgCnlchzqU7jq20zPG9FUrf5bUCT1cVySg/wAdAHbEpK7vPzZnvB3ma4csVsNeTk2I83CflIibzoSZvBBXA/8LlDfUSJfGpoXQL8aVU8CelQIi3W3DzguxR9lhXjLbBHiQytmHlW3fAU+QKos5o+APssMJTIBFABzNtaAS2Jo5QS+VeJPAg8ksHJYwZotrprQ4m11qu1l/DBp4DNSuQTp4kYWhcCryiRt1zG7E3Zu4GngVpgC5ALRIGQ1RftVSI/ZNqUvSO3q/wHjjvb2rWTZoYAAAAASUVORK5CYII=)
no-repeat
left center;
width: 55px;
height: 30px;
display: inline-block;
vertical-align: middle;
}
================================================
FILE: cubesviewer/cubesviewer.templates.js
================================================
angular.module('cv').run(['$templateCache', function($templateCache) {
'use strict';
$templateCache.put('dialog/dialog.html',
" <div class=\"modal-header\">\n" +
" <button type=\"button\" ng-click=\"close()\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\"><i class=\"fa fa-fw fa-close\"></i></span></button>\n" +
" <h4 class=\"modal-title\" id=\"myModalLabel\"><i class=\"fa fa-fw fa-exclamation\"></i> CubesViewer</h4>\n" +
" </div>\n" +
" <div class=\"modal-body\">\n" +
" <p>{{ dialog.text }}</p>\n" +
" </div>\n" +
" <div class=\"modal-footer\">\n" +
" <!-- <button type=\"button\" ng-click=\"close()\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Cancel</button> -->\n" +
" <button type=\"button\" ng-click=\"close()\" class=\"btn btn-primary\" data-dismiss=\"modal\">Close</button>\n" +
" </div>\n" +
"\n"
);
$templateCache.put('studio/about.html',
"<div class=\"modal fade\" id=\"cvAboutModal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"\">\n" +
" <div class=\"modal-dialog\" role=\"document\">\n" +
" <div class=\"modal-content\">\n" +
" <div class=\"modal-header\">\n" +
" <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\"><i class=\"fa fa-fw fa-close\"></i></span></button>\n" +
" <h4 class=\"modal-title\" id=\"myModalLabel\"><i class=\"cv-logo-embedded\"></i> CubesViewer</h4>\n" +
" </div>\n" +
" <div class=\"modal-body\">\n" +
"\n" +
" <p><a href=\"http://jjmontesl.github.io/cubesviewer/\" target=\"_blank\">CubesViewer</a> is a visual, web-based application for exploring and analyzing\n" +
" OLAP databases served by the <a href=\"http://cubes.databrewery.org/\" target=\"_blank\">Cubes OLAP Framework</a>.</p>\n" +
" <hr />\n" +
"\n" +
" <p>Version {{ cvVersion }}<br />\n" +
" <a href=\"https://github.com/jjmontesl/cubesviewer/\" target=\"_blank\">https://github.com/jjmontesl/cubesviewer/</a></p>\n" +
"\n" +
" <p>by José Juan Montes and others (see AUTHORS)<br />\n" +
" 2012 - 2016</p>\n" +
"\n" +
" <p>\n" +
" <a href=\"http://github.com/jjmontesl/cubesviewer/blob/master/LICENSE.txt\" target=\"_blank\">LICENSE</a>\n" +
" </p>\n" +
"\n" +
" </div>\n" +
" <div class=\"modal-footer\">\n" +
" <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"><i class=\"fa fa-cube\"></i> Close</button>\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
"</div>\n" +
"\n" +
"\n"
);
$templateCache.put('studio/panel.html',
"<div class=\"cv-bootstrap cv-gui-viewcontainer\" ng-controller=\"CubesViewerStudioViewController\">\n" +
"\n" +
" <div class=\"panel panel-primary\">\n" +
" <div ng-if=\"! cvOptions.hideControls\" class=\"panel-heading\">\n" +
"\n" +
" <button type=\"button\" ng-click=\"studioViewsService.closeView(view)\" class=\"btn btn-danger btn-xs pull-right hidden-print\" style=\"margin-left: 10px;\"><i class=\"fa fa-fw fa-close\"></i></button>\n" +
" <button type=\"button\" ng-click=\"studioViewsService.toggleCollapseView(view)\" class=\"btn btn-primary btn-xs pull-right hidden-print\" style=\"margin-left: 5px;\"><i class=\"fa fa-fw\" ng-class=\"{'fa-caret-up': !view.collapsed, 'fa-caret-down': view.collapsed }\"></i></button>\n" +
"\n" +
" <i class=\"fa fa-fw fa-file\"></i> <span class=\"cv-gui-title\" style=\"cursor: pointer;\" ng-dblclick=\"studioViewsService.studioScope.showRenameView(view)\"><a name=\"cvView{{ view.id }}\"></a>{{ view.params.name }}</span>\n" +
"\n" +
" <span ng-if=\"view.savedId > 0 && reststoreService.isViewChanged(view)\" class=\"badge cv-gui-container-state\" style=\"margin-left: 15px; font-size: 80%;\">Modified</span>\n" +
" <span ng-if=\"view.savedId > 0 && !reststoreService.isViewChanged(view)\" class=\"badge cv-gui-container-state\" style=\"margin-left: 15px; font-size: 80%;\">Saved</span>\n" +
" <span ng-if=\"view.shared\" class=\"badge cv-gui-container-state\" style=\"margin-left: 5px; font-size: 80%;\">Shared</span>\n" +
"\n" +
" <button type=\"button\" class=\"btn btn-danger btn-xs\" style=\"visibility: hidden;\"><i class=\"fa fa-fw fa-info\"></i></button>\n" +
"\n" +
" </div>\n" +
" <div class=\"panel-body\" ng-hide=\"view.collapsed\">\n" +
" <div class=\"cv-gui-viewcontent\">\n" +
"\n" +
" <div cv-view-cube view=\"view\"></div>\n" +
"\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
"</div>\n"
);
$templateCache.put('studio/rename.html',
" <div class=\"modal-header\">\n" +
" <button type=\"button\" ng-click=\"close();\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\"><i class=\"fa fa-fw fa-close\"></i></span></button>\n" +
" <h4 class=\"modal-title\" id=\"myModalLabel\"><i class=\"fa fa-pencil\"></i> Rename view</h4>\n" +
" </div>\n" +
" <div class=\"modal-body\">\n" +
"\n" +
" <form class=\"form\" ng-submit=\"renameView(viewName);\">\n" +
" <div class=\"form-group\">\n" +
" <label for=\"serializedView\">Name:</label>\n" +
" <input class=\"form-control\" ng-model=\"viewName\" />\n" +
" </div>\n" +
" </form>\n" +
"\n" +
" </div>\n" +
" <div class=\"modal-footer\">\n" +
" <button type=\"button\" ng-click=\"close();\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Cancel</button>\n" +
" <button type=\"button\" ng-click=\"renameView(viewName);\" class=\"btn btn-primary\" data-dismiss=\"modal\">Rename</button>\n" +
" </div>\n" +
"\n"
);
$templateCache.put('studio/serialize-add.html',
" <div class=\"modal-header\">\n" +
" <button type=\"button\" ng-click=\"close()\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\"><i class=\"fa fa-fw fa-close\"></i></span></button>\n" +
" <h4 class=\"modal-title\" id=\"myModalLabel\"><i class=\"fa fa-code\"></i> Add view from serialized JSON</h4>\n" +
" </div>\n" +
" <div class=\"modal-body\">\n" +
"\n" +
" <div class=\"form\">\n" +
" <label for=\"serializedView\">Code:</label>\n" +
" <textarea class=\"form-control\" ng-model=\"serializedView\" style=\"width: 100%; height: 12em;\" />\n" +
" </div>\n" +
"\n" +
" </div>\n" +
" <div class=\"modal-footer\">\n" +
" <button type=\"button\" ng-click=\"close()\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Cancel</button>\n" +
" <button type=\"button\" ng-click=\"addSerializedView(serializedView)\" class=\"btn btn-primary\" data-dismiss=\"modal\">Add View</button>\n" +
" </div>\n" +
"\n"
);
$templateCache.put('studio/serialize-view.html',
" <div class=\"modal-header\">\n" +
" <button type=\"button\" ng-click=\"close()\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\"><i class=\"fa fa-fw fa-close\"></i></span></button>\n" +
" <h4 class=\"modal-title\" id=\"myModalLabel\"><i class=\"fa fa-code\"></i> Serialized View</h4>\n" +
" </div>\n" +
" <div class=\"modal-body\">\n" +
"\n" +
" <div class=\"form\">\n" +
" <label for=\"serializedView\">View definition JSON:</label>\n" +
" <textarea class=\"form-control cv-serialized-view\" ng-bind=\"serializedView\" style=\"width: 100%; height: 12em;\" readonly></textarea>\n" +
" </div>\n" +
"\n" +
" </div>\n" +
" <div class=\"modal-footer\">\n" +
" <button type=\"button\" ng-click=\"close()\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\n" +
" </div>\n" +
"\n"
);
$templateCache.put('studio/serverinfo.html',
"<div class=\"modal fade\" id=\"cvServerInfo\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"\">\n" +
" <div class=\"modal-dialog\" role=\"document\">\n" +
" <div class=\"modal-content\">\n" +
" <div class=\"modal-header\">\n" +
" <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\"><i class=\"fa fa-fw fa-close\"></i></span></button>\n" +
" <h4 class=\"modal-title\" id=\"myModalLabel\"><i class=\"fa fa-fw fa-database\"></i> Server info</h4>\n" +
" </div>\n" +
" <div class=\"modal-body\">\n" +
"\n" +
" <p>\n" +
" <i>This CubesViewer version supports Cubes Server version 1.0.x and 1.1.x</i><br />\n" +
" <br />\n" +
" <b>Server version:</b> {{ cubesService.cubesserver.server_version }} <br />\n" +
" <b>Cubes version:</b> {{ cubesService.cubesserver.cubes_version }} <br />\n" +
" <b>API version:</b> {{ cubesService.cubesserver.api_version }} <br />\n" +
" </p>\n" +
" <p>\n" +
" <b>Timezone:</b> {{ cubesService.cubesserver.info.timezone }} <br />\n" +
" <b>Week start:</b> {{ cubesService.cubesserver.info.first_weekday }} <br />\n" +
" </p>\n" +
" <p>\n" +
" <b>Result limit:</b> <strong class=\"text-warning\">{{ cubesService.cubesserver.info.json_record_limit }}</strong> items<br />\n" +
" </p>\n" +
"\n" +
" </div>\n" +
" <div class=\"modal-footer\">\n" +
" <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\"> Close</button>\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
"</div>\n" +
"\n" +
"\n"
);
$templateCache.put('studio/studio.html',
"<div class=\"cv-bootstrap\" ng-controller=\"CubesViewerStudioController\">\n" +
"\n" +
" <div class=\"cv-gui-panel hidden-print\">\n" +
"\n" +
" <div class=\"dropdown m-b\" style=\"display: inline-block;\">\n" +
" <button class=\"btn btn-primary dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-cube\"></i> Cubes <span class=\"caret\"></span>\n" +
" </button>\n" +
"\n" +
" <ul class=\"dropdown-menu cv-gui-cubeslist-menu\">\n" +
"\n" +
" <li ng-show=\"cubesService.state === 1\" class=\"disabled\"><a>Loading...</a></li>\n" +
" <li ng-show=\"cubesService.state === 2 && cubesService.cubesserver._cube_list.length === 0\" class=\"disabled\"><a>No cubes found</a></li>\n" +
" <li ng-show=\"cubesService.state === 3\" class=\"disabled text-danger\"><a>Loading failed</a></li>\n" +
"\n" +
" <li ng-repeat=\"cube in cubesService.cubesserver._cube_list | orderBy:'label'\" ng-click=\"studioViewsService.addViewCube(cube.name)\"><a>{{ cube.label }}</a></li>\n" +
"\n" +
" </ul>\n" +
" </div>\n" +
"\n" +
"\n" +
" <div ng-if=\"cvOptions.backendUrl\" class=\"dropdown m-b\" style=\"display: inline-block; \">\n" +
" <button class=\"btn btn-primary dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-file\"></i> Saved views <span class=\"caret\"></span>\n" +
" </button>\n" +
"\n" +
" <ul class=\"dropdown-menu cv-gui-catalog-menu\">\n" +
"\n" +
" <li class=\"dropdown-header\">Personal views</li>\n" +
"\n" +
" <!-- <li ng-show=\"true\" class=\"disabled\"><a>Loading...</a></li> -->\n" +
" <li ng-repeat=\"sv in reststoreService.savedViews | orderBy:'sv.name'\" ng-if=\"sv.owner == cvOptions.user\" ng-click=\"reststoreService.addSavedView(sv.id)\"><a style=\"max-width: 360px; overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap;\"><i class=\"fa fa-fw\"></i> {{ sv.name }}</a></li>\n" +
"\n" +
" <li class=\"dropdown-header\">Shared by others</li>\n" +
"\n" +
" <!-- <li ng-show=\"true\" class=\"disabled\"><a>Loading...</a></li> -->\n" +
" <li ng-repeat=\"sv in reststoreService.savedViews | orderBy:'sv.name'\" ng-if=\"sv.shared && sv.owner != cvOptions.user\" ng-click=\"reststoreService.addSavedView(sv.id)\"><a style=\"max-width: 360px; overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap;\"><i class=\"fa fa-fw\"></i> {{ sv.name }}</a></li>\n" +
"\n" +
" </ul>\n" +
" </div>\n" +
"\n" +
"\n" +
" <div class=\"dropdown m-b\" style=\"display: inline-block; margin-left: 5px;\">\n" +
" <button class=\"btn btn-primary dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-wrench\"></i> Tools <span class=\"caret\"></span>\n" +
" </button>\n" +
"\n" +
" <ul class=\"dropdown-menu\">\n" +
"\n" +
" <li ng-click=\"showSerializeAdd()\"><a tabindex=\"0\"><i class=\"fa fa-fw fa-code\"></i> Add view from JSON...</a></li>\n" +
"\n" +
" <div class=\"divider\"></div>\n" +
"\n" +
" <li ng-click=\"toggleTwoColumn()\" ng-class=\"{ 'hidden-xs': ! cvOptions.studioTwoColumn, 'disabled': studioViewsService.views.length == 0 }\"><a tabindex=\"0\"><i class=\"fa fa-fw fa-columns\"></i> 2 column\n" +
" <span class=\"label label-default\" style=\"margin-left: 10px;\" ng-class=\"{ 'label-success': cvOptions.studioTwoColumn }\">{{ cvOptions.studioTwoColumn ? \"ON\" : \"OFF\" }}</span></a>\n" +
" </li>\n" +
" <li ng-click=\"toggleHideControls()\" ng-class=\"{ 'disabled': studioViewsService.views.length == 0 }\"><a tabindex=\"0\"><i class=\"fa fa-fw fa-unlock-alt\"></i> Hide controls\n" +
" <span class=\"label label-default\" style=\"margin-left: 10px;\" ng-class=\"{ 'label-success': cvOptions.hideControls }\">{{ cvOptions.hideControls ? \"ON\" : \"OFF\" }}</span></a>\n" +
" </li>\n" +
"\n" +
" <div class=\"divider\"></div>\n" +
"\n" +
"\n" +
" <!-- <li class=\"\"><a data-toggle=\"modal\" data-target=\"#cvServerInfo\"><i class=\"fa fa-fw fa-server\"></i> Data model</a></li> -->\n" +
" <li class=\"\" ng-class=\"{ 'disabled': cubesService.state != 2 }\"><a data-toggle=\"modal\" data-target=\"#cvServerInfo\" ><i class=\"fa fa-fw fa-database\"></i> Server info</a></li>\n" +
"\n" +
" <div class=\"divider\"></div>\n" +
"\n" +
" <li class=\"\"><a href=\"http://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/cubesviewer-user-main.md\" target=\"_blank\"><i class=\"fa fa-fw fa-question\"></i> User guide</a></li>\n" +
" <li class=\"\"><a data-toggle=\"modal\" data-target=\"#cvAboutModal\"><i class=\"fa fa-fw fa-info\"></i> About CubesViewer...</a></li>\n" +
"\n" +
" </ul>\n" +
" </div>\n" +
"\n" +
" <div style=\"display: inline-block; margin-left: 10px; margin-bottom: 0px;\">\n" +
"\n" +
" <div class=\"form-group hidden-xs\" style=\"display: inline-block; margin-bottom: 0px;\">\n" +
" <button class=\"btn\" type=\"button\" title=\"2 column\" ng-disabled=\"studioViewsService.views.length == 0\" ng-class=\"cvOptions.studioTwoColumn ? 'btn-active btn-success' : 'btn-primary'\" ng-click=\"toggleTwoColumn()\"><i class=\"fa fa-fw fa-columns\"></i></button>\n" +
" </div>\n" +
" <div class=\"form-group\" style=\"display: inline-block; margin-bottom: 0px;\">\n" +
" <button class=\"btn\" type=\"button\" title=\"Hide controls\" ng-disabled=\"studioViewsService.views.length == 0\" ng-class=\"cvOptions.hideControls ? 'btn-active btn-success' : 'btn-primary'\" ng-click=\"toggleHideControls()\"><i class=\"fa fa-fw fa-unlock-alt\"></i></button>\n" +
" </div>\n" +
"\n" +
" </div>\n" +
"\n" +
" <div class=\"cv-gui-modals\">\n" +
" <div ng-include=\"'studio/about.html'\"></div>\n" +
" <div ng-include=\"'studio/serverinfo.html'\"></div>\n" +
" </div>\n" +
"\n" +
" </div>\n" +
"\n" +
" <div class=\"cv-gui-workspace\">\n" +
"\n" +
" <div class=\"row\">\n" +
" <div ng-if=\"cubesService.state == 3\" class=\"col-xs-12\" style=\"margin-bottom: 10px;\">\n" +
" <div class=\"alert alert-danger\" style=\"margin: 0px;\">\n" +
" <p>Could not connect to server: {{ cubesService.stateText }}</p>\n" +
" <p>Please try again and contact your administrator if the problem persists.</p>\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div class=\"row cv-views-container\" data-masonry='{ \"itemSelector\": \".cv-view-container\", \"columnWidth\": \".cv-views-gridsizer\", \"percentPosition\": true }'>\n" +
"\n" +
" <div class=\"col-xs-1 cv-views-gridsizer\"></div>\n" +
"\n" +
" <div ng-repeat=\"studioView in studioViewsService.views\" style=\"display: none;\" class=\"col-xs-12 cv-view-container sv{{ studioView.id }}\" ng-class=\"(cvOptions.studioTwoColumn ? 'col-sm-6' : 'col-sm-12')\">\n" +
" <div >\n" +
" <div cv-studio-view view=\"studioView\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" </div>\n" +
"\n" +
" </div>\n" +
"\n" +
"</div>\n" +
"\n" +
"\n"
);
$templateCache.put('views/cube/alerts.html',
"<div>\n" +
"\n" +
" <div ng-if=\"view.requestFailed\" class=\"alert alert-dismissable alert-danger\" style=\"margin-bottom: 5px;\">\n" +
" <div style=\"display: inline-block;\"><i class=\"fa fa-exclamation\"></i></div>\n" +
" <div style=\"display: inline-block; margin-left: 20px;\">\n" +
" An error has occurred. Cannot present view.<br />\n" +
" Please try again and contact your administrator if the problem persists.\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.resultLimitHit\" class=\"alert alert-dismissable alert-warning\" style=\"margin-bottom: 5px;\">\n" +
" <button type=\"button\" class=\"close\" ng-click=\"view._resultLimitHit = false;\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button>\n" +
" <div style=\"display: inline-block; vertical-align: top;\"><i class=\"fa fa-exclamation\"></i></div>\n" +
" <div style=\"display: inline-block; margin-left: 20px;\">\n" +
" Limit of {{ cubesService.cubesserver.info.json_record_limit }} items has been hit. <b>Results are incomplete.</b><br />\n" +
" <i>Tip</i>: reduce level of drilldown or filter your selection to reduce the number of items in the result.\n" +
" </div>\n" +
" </div>\n" +
"\n" +
"</div>\n"
);
$templateCache.put('views/cube/chart/chart-common.html',
"<div ng-show=\"(view.grid.data.length > 0 && view.params.yaxis != null) && (!(view.params.charttype == 'pie' && view.grid.columnDefs.length > 2)) && (!(view.params.charttype == 'radar' && view.grid.columnDefs.length < 4))\" style=\"width: 99%;\">\n" +
" <div>\n" +
" <div class=\"cv-chart-container\">\n" +
" <svg style=\"height: 400px;\" />\n" +
" </div>\n" +
" <div ng-hide=\"view.getControlsHidden() || view.params.charttype == 'radar'\" style=\"font-size: 8px; float: right;\">\n" +
" <a href=\"\" class=\"cv-chart-height\" ng-click=\"chartCtrl.resizeChart(400);\">Small</a>\n" +
" <a href=\"\" class=\"cv-chart-height\" ng-click=\"chartCtrl.resizeChart(550);\">Medium</a>\n" +
" <a href=\"\" class=\"cv-chart-height\" ng-click=\"chartCtrl.resizeChart(700);\">Tall</a>\n" +
" </div>\n" +
" </div>\n" +
"</div>\n" +
"\n" +
"<div ng-if=\"view.params.yaxis == null\" class=\"alert alert-info\" style=\"margin-bottom: 0px;\">\n" +
" <p>\n" +
" Cannot present chart: no <b>measure</b> has been selected.\n" +
" </p>\n" +
" <p>\n" +
" Tip: use the <kbd><i class=\"fa fa-fw fa-cogs\"></i> View > <i class=\"fa fa-fw fa-crosshairs\"></i> Measure</kbd> menu.\n" +
" </p>\n" +
"</div>\n" +
"\n" +
"<div ng-if=\"view.pendingRequests == 0 && view.params.yaxis != null && view.grid.data.length == 0\" class=\"alert alert-info\" style=\"margin-bottom: 0px;\">\n" +
" <p>\n" +
" Cannot present chart: <b>no rows returned</b> by the current filtering, horizontal dimension, and drilldown combination.\n" +
" </p>\n" +
" <p>\n" +
" Tip: use the <kbd><i class=\"fa fa-fw fa-cogs\"></i> View</kbd> menu to select an horizontal dimension.\n" +
" </p>\n" +
"</div>\n" +
"\n" +
"<div ng-if=\"view.pendingRequests == 0 && view.params.charttype == 'pie' && view.grid.columnDefs.length > 2\" class=\"alert alert-info\" style=\"margin-bottom: 0px;\">\n" +
" <p>\n" +
" Cannot present a <b>pie chart</b> when <b>more than one column</b> is present.<br />\n" +
" </p>\n" +
" <p>\n" +
" Tip: review chart data and columns in <a href=\"\" ng-click=\"setViewMode('series')\" class=\"alert-link\">series mode</a>,\n" +
" or <a href=\"\" ng-click=\"selectXAxis(null);\" class=\"alert-link\">remove horizontal dimension</a>.\n" +
" </p>\n" +
"</div>\n" +
"\n" +
"<div ng-if=\"view.pendingRequests == 0 && view.params.yaxis != null && view.params.charttype == 'radar' && view.grid.columnDefs.length < 4\" class=\"alert alert-info\" style=\"margin-bottom: 0px;\">\n" +
" Cannot present a <b>radar chart</b> when <b>less than 3 columns</b> are present.<br />\n" +
" Tip: review chart data and columns in <a href=\"\" ng-click=\"setViewMode('series')\" class=\"alert-link\">series mode</a>.\n" +
"</div>\n"
);
$templateCache.put('views/cube/chart/chart.html',
"<div ng-controller=\"CubesViewerViewsCubeChartController as chartCtrl\">\n" +
"\n" +
" <div ng-if=\"view.params.charttype == 'pie'\">\n" +
" <h3><i class=\"fa fa-fw fa-pie-chart\"></i> Chart\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
" <div ng-controller=\"CubesViewerViewsCubeChartPieController\">\n" +
" <div ng-include=\"'views/cube/chart/chart-common.html'\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.params.charttype == 'bars-vertical'\">\n" +
" <h3><i class=\"fa fa-fw fa-bar-chart\"></i> Chart\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
" <div ng-controller=\"CubesViewerViewsCubeChartBarsVerticalController\">\n" +
" <div ng-include=\"'views/cube/chart/chart-common.html'\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.params.charttype == 'bars-horizontal'\">\n" +
" <h3><i class=\"fa fa-fw fa-bar-chart fa-rotate-270\"></i> Chart\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
" <div ng-controller=\"CubesViewerViewsCubeChartBarsHorizontalController\">\n" +
" <div ng-include=\"'views/cube/chart/chart-common.html'\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.params.charttype == 'lines'\">\n" +
" <h3><i class=\"fa fa-fw fa-line-chart\"></i> Chart\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
" <div ng-controller=\"CubesViewerViewsCubeChartLinesController\">\n" +
" <div ng-include=\"'views/cube/chart/chart-common.html'\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.params.charttype == 'lines-stacked'\">\n" +
" <h3><i class=\"fa fa-fw fa-area-chart\"></i> Chart\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
" <div ng-controller=\"CubesViewerViewsCubeChartLinesController\">\n" +
" <div ng-include=\"'views/cube/chart/chart-common.html'\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.params.charttype == 'radar'\">\n" +
" <h3><i class=\"fa fa-fw fa-bullseye\"></i> Chart\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
" <div ng-controller=\"CubesViewerViewsCubeChartRadarController\">\n" +
" <div ng-include=\"'views/cube/chart/chart-common.html'\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.params.charttype == 'sunburst'\">\n" +
" <h3><i class=\"fa fa-fw fa-sun-o\"></i> Chart\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
" <div ng-controller=\"CubesViewerViewsCubeChartSunburstController\">\n" +
" <div ng-include=\"'views/cube/chart/chart-common.html'\"></div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
"</div>\n"
);
$templateCache.put('views/cube/cube-menu-drilldown.html',
" <button class=\"btn btn-primary btn-sm dropdown-toggle drilldownbutton\" ng-disabled=\"view.params.mode == 'facts'\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-arrow-down\"></i> <span class=\"hidden-xs\" ng-class=\"{ 'hidden-sm hidden-md': cvOptions.studioTwoColumn }\">Drilldown</span> <span class=\"caret\"></span>\n" +
" </button>\n" +
"\n" +
" <ul class=\"dropdown-menu dropdown-menu-right cv-view-menu-drilldown\">\n" +
"\n" +
" <!-- if ((grayout_drill) && ((($.grep(view.params.drilldown, function(ed) { return ed == dimension.name; })).length > 0))) { -->\n" +
" <li on-repeat-done ng-repeat-start=\"dimension in view.cube.dimensions\" ng-if=\"dimension.levels.length == 1\" ng-click=\"selectDrill(dimension.name, true);\">\n" +
" <a href=\"\">{{ dimension.label }}</a>\n" +
" </li>\n" +
" <li ng-repeat-end ng-if=\"dimension.levels.length != 1\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\">{{ dimension.label }}</a>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() != 1\" class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"(hikey,hi) in dimension.hierarchies\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\" href=\"\" onclick=\"return false;\">{{ hi.label }}</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"level in hi.levels\" ng-click=\"selectDrill(dimension.name + '@' + hi.name + ':' + level.name, true)\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
" </li>\n" +
" </ul>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() == 1\" class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"level in dimension.default_hierarchy().levels\" ng-click=\"selectDrill(dimension.name + '@' + dimension.default_hierarchy().name + ':' + level.name, true)\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
"\n" +
" </li>\n" +
"\n" +
" <div class=\"divider\"></div>\n" +
"\n" +
" <li ng-class=\"{ 'disabled': view.params.drilldown.length == 0 }\" ng-click=\"selectDrill('')\"><a href=\"\"><i class=\"fa fa-fw fa-close\"></i> None</a></li>\n" +
"\n" +
" </ul>\n" +
"\n"
);
$templateCache.put('views/cube/cube-menu-filter.html',
" <button class=\"btn btn-primary btn-sm dropdown-toggle cutbutton\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-filter\"></i> <span class=\"hidden-xs\" ng-class=\"{ 'hidden-sm hidden-md': cvOptions.studioTwoColumn }\">Filter</span> <span class=\"caret\"></span>\n" +
" </button>\n" +
"\n" +
" <ul class=\"dropdown-menu dropdown-menu-right cv-view-menu cv-view-menu-cut\">\n" +
"\n" +
" <li ng-show=\"view.params.mode == 'explore'\" ng-click=\"filterSelected()\" ng-class=\"{ 'disabled': view.params.drilldown.length != 1 }\"><a href=\"\"><i class=\"fa fa-fw fa-filter\"></i> Filter selected rows</a></li>\n" +
" <div ng-show=\"view.params.mode == 'explore'\" class=\"divider\"></div>\n" +
"\n" +
" <li class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\"><i class=\"fa fa-fw fa-bars\"></i> Dimension filter</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
"\n" +
" <li on-repeat-done ng-repeat-start=\"dimension in view.cube.dimensions\" ng-if=\"dimension.levels.length == 1\" ng-click=\"showDimensionFilter(dimension.name);\">\n" +
" <a href=\"\">{{ dimension.label }}</a>\n" +
" </li>\n" +
" <li ng-repeat-end ng-if=\"dimension.levels.length != 1\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\">{{ dimension.label }}</a>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() != 1\" class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"(hikey,hi) in dimension.hierarchies\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\" href=\"\" onclick=\"return false;\">{{ hi.label }}</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <!-- ng-click=\"selectDrill(dimension.name + '@' + hi.name + ':' + level.name, true)\" -->\n" +
" <li ng-repeat=\"level in hi.levels\" ng-click=\"showDimensionFilter(dimension.name + '@' + hi.name + ':' + level.name )\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
" </li>\n" +
" </ul>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() == 1\" class=\"dropdown-menu\">\n" +
" <!-- selectDrill(dimension.name + ':' + level.name, true) -->\n" +
" <li ng-repeat=\"level in dimension.default_hierarchy().levels\" ng-click=\"showDimensionFilter(dimension.name + '@' + dimension.default_hierarchy().name + ':' + level.name);\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
"\n" +
" </li>\n" +
"\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <li class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\"><i class=\"fa fa-fw fa-calendar\"></i> Date filter</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"dimension in view.cube.dimensions\" ng-if=\"dimension.isDateDimension()\">\n" +
" <a href=\"\" ng-click=\"selectDateFilter(dimension.name + ((dimension.info['cv-datefilter-hierarchy']) ? '@' + dimension.info['cv-datefilter-hierarchy'] : ''), true)\">\n" +
" {{ dimension.label + ((dimension.hierarchy(dimension.info[\"cv-datefilter-hierarchy\"])) ? \" / \" + dimension.hierarchy(dimension.info[\"cv-datefilter-hierarchy\"]).label : \"\") }}\n" +
" </a>\n" +
" </li>\n" +
" <li ng-if=\"view.cube.dateDimensions().length == 0\" class=\"disabled\">\n" +
" <a href=\"\" ng-click=\"\"><i>No date filters defined for this cube.</i></a>\n" +
" </li>\n" +
"\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <!--\n" +
" <li class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\"><i class=\"fa fa-fw fa-arrows-h\"></i> Range filter</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
"\n" +
" <li on-repeat-done ng-repeat-start=\"dimension in view.cube.dimensions\" ng-if=\"dimension.levels.length == 1\" ng-click=\"showDimensionFilter(dimension.name);\">\n" +
" <a href=\"\">{{ dimension.label }}</a>\n" +
" </li>\n" +
" <li ng-repeat-end ng-if=\"dimension.levels.length != 1\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\">{{ dimension.label }}</a>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() != 1\" class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"(hikey,hi) in dimension.hierarchies\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\" href=\"\" onclick=\"return false;\">{{ hi.label }}</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"level in hi.levels\" ng-click=\"showDimensionFilter(dimension.name + '@' + hi.name + ':' + level.name )\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
" </li>\n" +
" </ul>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() == 1\" class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"level in dimension.default_hierarchy().levels\" ng-click=\"showDimensionFilter(level);\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
"\n" +
" </li>\n" +
"\n" +
" </ul>\n" +
" </li>\n" +
" -->\n" +
"\n" +
" <div class=\"divider\"></div>\n" +
"\n" +
" <li ng-class=\"{ 'disabled': view.params.cuts.length == 0 && view.params.datefilters.length == 0 }\" ng-click=\"clearFilters()\"><a href=\"\"><i class=\"fa fa-fw fa-trash\"></i> Clear filters</a></li>\n" +
"\n" +
" </ul>\n"
);
$templateCache.put('views/cube/cube-menu-panel.html',
" <button class=\"btn btn-primary btn-sm dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-file\"></i> <span class=\"hidden-xs\" ng-class=\"{ 'hidden-sm hidden-md': cvOptions.studioTwoColumn }\">Panel</span> <span class=\"caret\"></span>\n" +
" </button>\n" +
"\n" +
" <ul class=\"dropdown-menu dropdown-menu-right cv-view-menu cv-view-menu-view\">\n" +
"\n" +
" <li ng-click=\"viewsService.studioViewsService.studioScope.showRenameView(view)\"><a><i class=\"fa fa-fw fa-pencil\"></i> Rename...</a></li>\n" +
" <li ng-click=\"viewsService.studioViewsService.studioScope.cloneView(view)\"><a><i class=\"fa fa-fw fa-clone\"></i> Clone</a></li>\n" +
"\n" +
" <div ng-if=\"cvOptions.backendUrl\" class=\"divider\"></div>\n" +
" <li ng-if=\"cvOptions.backendUrl\" ng-click=\"reststoreService.saveView(view)\"><a><i class=\"fa fa-fw fa-save\"></i> Save</a></li>\n" +
" <li ng-if=\"cvOptions.backendUrl\" ng-click=\"reststoreService.shareView(view, ! view.shared)\"><a><i class=\"fa fa-fw fa-share\"></i> {{ view.shared ? \"Unshare\" : \"Share\" }}</a></li>\n" +
" <li ng-if=\"cvOptions.backendUrl\" ng-click=\"reststoreService.deleteView(view)\"><a><i class=\"fa fa-fw fa-trash-o\"></i> Delete...</a></li>\n" +
"\n" +
" <div class=\"divider\"></div>\n" +
" <li ng-click=\"viewsService.studioViewsService.studioScope.showSerializeView(view)\"><a><i class=\"fa fa-fw fa-code\"></i> Serialize...</a></li>\n" +
" <div class=\"divider\"></div>\n" +
" <li ng-click=\"viewsService.studioViewsService.closeView(view)\"><a><i class=\"fa fa-fw fa-close\"></i> Close</a></li>\n" +
" </ul>\n"
);
$templateCache.put('views/cube/cube-menu-view.html',
" <button class=\"btn btn-primary btn-sm dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-cogs\"></i> <span class=\"hidden-xs\" ng-class=\"{ 'hidden-sm hidden-md': cvOptions.studioTwoColumn }\">View</span> <span class=\"caret\"></span>\n" +
" </button>\n" +
"\n" +
" <ul class=\"dropdown-menu dropdown-menu-right cv-view-menu cv-view-menu-view\">\n" +
"\n" +
" <li ng-show=\"view.params.mode == 'chart'\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\" ><i class=\"fa fa-fw fa-area-chart\"></i> Chart type</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <li ng-click=\"selectChartType('pie')\"><a href=\"\"><i class=\"fa fa-fw fa-pie-chart\"></i> Pie</a></li>\n" +
" <li ng-click=\"selectChartType('bars-vertical')\"><a href=\"\"><i class=\"fa fa-fw fa-bar-chart\"></i> Bars Vertical</a></li>\n" +
" <li ng-click=\"selectChartType('bars-horizontal')\"><a href=\"\"><i class=\"fa fa-fw fa-rotate-270 fa-bar-chart\"></i> Bars Horizontal</a></li>\n" +
" <li ng-click=\"selectChartType('lines')\"><a href=\"\"><i class=\"fa fa-fw fa-line-chart\"></i> Lines</a></li>\n" +
" <li ng-click=\"selectChartType('lines-stacked')\"><a href=\"\"><i class=\"fa fa-fw fa-area-chart\"></i> Areas</a></li>\n" +
" <li ng-click=\"selectChartType('radar')\"><a href=\"\"><i class=\"fa fa-fw fa-bullseye\"></i> Radar</a></li>\n" +
"\n" +
" <!-- <div class=\"divider\"></div> -->\n" +
"\n" +
" <!--\n" +
" <li><a href=\"\"><i class=\"fa fa-fw fa-dot-circle-o\"></i> Bubbles</a></li>\n" +
" <li><a href=\"\"><i class=\"fa fa-fw fa-square\"></i> Treemap</a></li>\n" +
" <li ng-click=\"selectChartType('sunburst')\"><a href=\"\"><i class=\"fa fa-fw fa-sun-o\"></i> Sunburst</a></li>\n" +
" -->\n" +
"\n" +
" <!--\n" +
" <div class=\"divider\"></div>\n" +
"\n" +
" <li><a href=\"\"><i class=\"fa fa-fw fa-globe\"></i> Map</a></li>\n" +
" -->\n" +
"\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <!--\n" +
" <li ng-show=\"view.params.mode == 'chart' && (view.params.charttype == 'lines-stacked' || view.params.charttype == 'lines' || view.params.charttype == 'bars-horizontal')\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\" ><i class=\"fa fa-fw fa-sliders\"></i> Chart options</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" -->\n" +
" <li class=\"dropdown-submenu\" ng-show=\"view.params.mode == 'chart' && (view.params.charttype == 'lines-stacked' || view.params.charttype == 'lines')\">\n" +
" <a href=\"\"><i class=\"fa fa-fw fa-angle-up\"></i> Curve type</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <li ng-class=\"{'active': view.params.chartoptions.lineInterpolation == 'linear'}\" ng-click=\"view.params.chartoptions.lineInterpolation = 'linear'; refreshView();\"><a href=\"\"> Linear</a></li>\n" +
" <li ng-class=\"{'active': view.params.chartoptions.lineInterpolation == 'monotone'}\" ng-click=\"view.params.chartoptions.lineInterpolation = 'monotone'; refreshView();\"><a href=\"\"> Smooth</a></li>\n" +
" <!-- <li ng-class=\"{'active': view.params.chartoptions.lineInterpolation == 'cardinal'}\" ng-click=\"view.params.chartoptions.lineInterpolation = 'cardinal'; refreshView();\"><a href=\"\"> Smooth (Cardinal)</a></li> -->\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <li ng-class=\"{'disabled': view.grid.data.length != 2 }\" ng-show=\"view.params.mode == 'chart' && view.params.charttype == 'bars-horizontal'\" ng-click=\"view.params.chartoptions.mirrorSerie2 = !view.params.chartoptions.mirrorSerie2; refreshView();\">\n" +
" <a><i class=\"fa fa-fw fa-arrows-h\"></i> Invert 2nd series\n" +
" <span style=\"margin-left: 5px;\" class=\"label label-default\" ng-class=\"{ 'label-success': view.params.chartoptions.mirrorSerie2 }\">{{ view.params.chartoptions.mirrorSerie2 ? \"ON\" : \"OFF\" }}</span>\n" +
" </a>\n" +
" </li>\n" +
"\n" +
" <!--\n" +
" </ul>\n" +
" </li>\n" +
" -->\n" +
"\n" +
" <li ng-show=\"view.params.mode == 'chart'\" ng-click=\"view.params.chartoptions.showLegend = !view.params.chartoptions.showLegend; refreshView();\">\n" +
" <a><i class=\"fa fa-fw\" ng-class=\"{'fa-toggle-on': view.params.chartoptions.showLegend, 'fa-toggle-off': ! view.params.chartoptions.showLegend }\"></i> Toggle legend\n" +
" <span style=\"margin-left: 5px;\" class=\"label label-default\" ng-class=\"{ 'label-success': view.params.chartoptions.showLegend }\">{{ view.params.chartoptions.showLegend ? \"ON\" : \"OFF\" }}</span>\n" +
" </a>\n" +
" </li>\n" +
"\n" +
" <div ng-show=\"view.params.mode == 'chart'\" class=\"divider\"></div>\n" +
"\n" +
" <li ng-show=\"view.params.mode == 'series' || view.params.mode == 'chart'\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\"><i class=\"fa fa-fw fa-long-arrow-right\"></i> Horizontal dimension</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
"\n" +
" <li on-repeat-done ng-repeat-start=\"dimension in view.cube.dimensions\" ng-if=\"dimension.levels.length == 1\" ng-click=\"selectXAxis(dimension.name)\">\n" +
" <a href=\"\">{{ dimension.label }}</a>\n" +
" </li>\n" +
" <li ng-repeat-end ng-if=\"dimension.levels.length != 1\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\">{{ dimension.label }}</a>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() != 1\" class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"(hikey,hi) in dimension.hierarchies\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\" href=\"\" onclick=\"return false;\">{{ hi.label }}</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <!-- ng-click=\"selectDrill(dimension.name + '@' + hi.name + ':' + level.name, true)\" -->\n" +
" <li ng-repeat=\"level in hi.levels\" ng-click=\"selectXAxis(dimension.name + '@' + hi.name + ':' + level.name )\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
" </li>\n" +
" </ul>\n" +
"\n" +
" <ul ng-if=\"dimension.hierarchies_count() == 1\" class=\"dropdown-menu\">\n" +
" <!-- selectDrill(dimension.name + ':' + level.name, true) -->\n" +
" <li ng-repeat=\"level in dimension.default_hierarchy().levels\" ng-click=\"selectXAxis(dimension.name + ':' + level.name);\"><a href=\"\">{{ level.label }}</a></li>\n" +
" </ul>\n" +
"\n" +
" </li>\n" +
"\n" +
" <div class=\"divider\"></div>\n" +
"\n" +
" <li ng-click=\"selectXAxis(null);\"><a href=\"\"><i class=\"fa fa-fw fa-close\"></i> None</a></li>\n" +
"\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <li ng-show=\"view.params.mode == 'series' || view.params.mode == 'chart'\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\"><i class=\"fa fa-fw fa-crosshairs\"></i> Measure</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
"\n" +
" <li ng-repeat=\"measure in view.cube.measures\" ng-if=\"view.cube.measureAggregates(measure.name).length > 0\" class=\"dropdown-submenu\">\n" +
" <a href=\"\">{{ measure.label }}</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <li ng-repeat=\"aggregate in view.cube.measureAggregates(measure.name)\" >\n" +
" <a href=\"\" ng-click=\"selectMeasure(aggregate.ref)\">{{ aggregate.label }}</a>\n" +
" </li>\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <div class=\"divider\" ng-if=\"view.cube.measureAggregates(null).length > 0\"></div>\n" +
" <li ng-repeat=\"aggregate in view.cube.measureAggregates(null)\" ng-if=\"view.cube.measureAggregates(null).length > 0\" >\n" +
" <a href=\"\" ng-click=\"selectMeasure(aggregate.ref)\">{{ aggregate.label }}</a>\n" +
" </li>\n" +
"\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <div ng-show=\"cvOptions.seriesOperationsEnabled && (view.params.mode == 'series' || view.params.mode == 'chart')\" class=\"divider\"></div>\n" +
"\n" +
" <li ng-show=\"cvOptions.seriesOperationsEnabled && (view.params.mode == 'series' || view.params.mode == 'chart')\" class=\"dropdown-submenu\">\n" +
" <a tabindex=\"0\" ><i class=\"fa fa-fw fa-calculator\"></i> Series operations</a>\n" +
" <ul class=\"dropdown-menu\">\n" +
" <li ng-click=\"selectOperation('difference')\"><a href=\"\"><i class=\"fa fa-fw fa-line-chart\"></i> Difference</a></li>\n" +
" <li ng-click=\"selectOperation('percentage')\"><a href=\"\"><i class=\"fa fa-fw fa-percent\"></i> Change rate</a></li>\n" +
" <!--\n" +
" <li ng-click=\"selectOperation('accum')\"><a href=\"\"><i class=\"fa fa-fw\">∑</i> Accumulated</a></li>\n" +
" <div class=\"divider\"></div>\n" +
" <li ng-click=\"selectOperation('fill-zeros')\"><a href=\"\"><i class=\"fa fa-fw\">0</i> Replace blanks with zeroes</a></li>\n" +
" -->\n" +
" <div class=\"divider\"></div>\n" +
" <li ng-click=\"selectOperation(null)\"><a href=\"\"><i class=\"fa fa-fw fa-times\"></i> Clear operations</a></li>\n" +
" </ul>\n" +
" </li>\n" +
"\n" +
" <div ng-show=\"view.params.mode == 'series' || view.params.mode == 'chart'\" class=\"divider\"></div>\n" +
"\n" +
" <li ng-show=\"view.params.mode != 'chart'\" ng-click=\"exportService.exportGridAsCsv(view)\"><a><i class=\"fa fa-fw fa-table\"></i> Export table</a></li>\n" +
" <li ng-show=\"view.params.mode == 'chart' && view.params.charttype != 'radar' \" ng-click=\"view.exportChartAsPNG()\"><a><i class=\"fa fa-fw fa-picture-o\"></i> Export figure</a></li>\n" +
" <li ng-click=\"exportService.exportFacts(view)\"><a><i class=\"fa fa-fw fa-th\"></i> Export facts</a></li>\n" +
"\n" +
" </ul>\n" +
"\n"
);
$templateCache.put('views/cube/cube.html',
"<div class=\"cv-view-panel\" ng-controller=\"CubesViewerViewsCubeController as cubeView\" >\n" +
"\n" +
" <div ng-if=\"view.state == 3\">\n" +
" <div class=\"alert alert-danger\" style=\"margin: 0px;\">\n" +
" <p>An error occurred. Cannot present view.</p>\n" +
" <p ng-if=\"cubesService.state != 3\">{{ view.error }}</p>\n" +
" <p ng-if=\"cubesService.state == 3\">Could not connect to data server: {{ cubesService.stateText }}</p>\n" +
" <p>Please try again and contact your administrator if the problem persists.</p>\n" +
" <p class=\"text-right\">\n" +
" <a class=\"alert-link\" href=\"http://jjmontesl.github.io/cubesviewer/\" target=\"_blank\">CubesViewer Data Visualizer</a>\n" +
" </p>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div>\n" +
" <h2 ng-show=\"view.getControlsHidden()\" style=\"margin-top: 5px;\">\n" +
" <i class=\"fa fa-fw fa-file-o\"></i> {{ view.params.name }}\n" +
" </h2>\n" +
"\n" +
" <div ng-include=\"'views/cube/alerts.html'\"></div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.state == 2\" style=\"min-height: 80px;\">\n" +
"\n" +
" <div class=\"cv-view-viewmenu hidden-print\" ng-hide=\"view.getControlsHidden()\">\n" +
"\n" +
" <div class=\"panel panel-primary pull-right\" style=\"padding: 3px; white-space: nowrap; margin-bottom: 6px; margin-left: 6px;\">\n" +
"\n" +
" <div ng-if=\"cvOptions.undoEnabled\" class=\"btn-group\" role=\"group\" ng-controller=\"CubesViewerViewsUndoController\">\n" +
" <button type=\"button\" ng-click=\"undo()\" ng-disabled=\"view.undoPos <= 0\" class=\"btn btn-default btn-sm\" title=\"Undo\"><i class=\"fa fa-fw fa-undo\"></i></button>\n" +
" <button type=\"button\" ng-click=\"redo()\" ng-disabled=\"view.undoPos >= view.undoList.length - 1\" class=\"btn btn-default btn-sm\" title=\"Redo\"><i class=\"fa fa-fw fa-undo fa-flip-horizontal\"></i></button>\n" +
" </div>\n" +
"\n" +
" <div class=\"btn-group\" role=\"group\" aria-label=\"...\" style=\"margin-left: 5px;\">\n" +
" <button type=\"button\" ng-click=\"setViewMode('explore')\" ng-class=\"{'active': view.params.mode == 'explore'}\" class=\"btn btn-primary btn-sm explorebutton\" title=\"Explore\"><i class=\"fa fa-fw fa-arrow-circle-down\"></i></button>\n" +
" <button type=\"button\" ng-click=\"setViewMode('facts')\" ng-class=\"{'active': view.params.mode == 'facts'}\" class=\"btn btn-primary btn-sm \" title=\"Facts\"><i class=\"fa fa-fw fa-th\"></i></button>\n" +
" <button type=\"button\" ng-click=\"setViewMode('series')\" ng-class=\"{'active': view.params.mode == 'series'}\" class=\"btn btn-primary btn-sm \" title=\"Series\"><i class=\"fa fa-fw fa-clock-o\"></i></button>\n" +
" <button type=\"button\" ng-click=\"setViewMode('chart')\" ng-class=\"{'active': view.params.mode == 'chart'}\" class=\"btn btn-primary btn-sm \" title=\"Charts\"><i class=\"fa fa-fw fa-area-chart\"></i></button>\n" +
" </div>\n" +
"\n" +
" <div ng-include=\"'views/cube/cube-menu-drilldown.html'\" class=\"dropdown m-b\" style=\"display: inline-block; margin-left: 5px;\"></div>\n" +
"\n" +
" <div ng-include=\"'views/cube/cube-menu-filter.html'\" class=\"dropdown m-b\" style=\"display: inline-block; margin-left: 2px;\"></div>\n" +
"\n" +
" <div ng-include=\"'views/cube/cube-menu-view.html'\" class=\"dropdown m-b\" style=\"display: inline-block; margin-left: 5px;\"></div>\n" +
"\n" +
" <div ng-if=\"cvOptions.container\" ng-include=\"'views/cube/cube-menu-panel.html'\" class=\"dropdown m-b\" style=\"display: inline-block; margin-left: 5px;\"></div>\n" +
"\n" +
" </div>\n" +
"\n" +
" <div class=\"pull-right\" style=\"white-space: nowrap; padding-top: 4px; padding-bottom: 4px; margin-left: 6px; margin-bottom: 6px;\">\n" +
"\n" +
" </div>\n" +
"\n" +
" </div>\n" +
"\n" +
" <div class=\"cv-view-viewinfo\">\n" +
" <div>\n" +
" <div class=\"label label-secondary cv-infopiece cv-view-viewinfo-cubename\" style=\"color: white; background-color: black;\">\n" +
" <span><i class=\"fa fa-fw fa-cube\" title=\"Cube\"></i> <b class=\"hidden-xs hidden-sm\">Cube:</b> {{ view.cube.label }}</span>\n" +
" <button type=\"button\" class=\"btn btn-info btn-xs\" style=\"visibility: hidden;\"><i class=\"fa fa-fw fa-info\"></i></button>\n" +
" </div>\n" +
"\n" +
" <div class=\"cv-view-viewinfo-drill\">\n" +
"\n" +
"\n" +
" <div ng-repeat=\"drilldown in view.params.drilldown\" ng-init=\"parts = view.cube.dimensionParts(drilldown);\" ng-if=\"view.params.mode != 'facts'\" class=\"label label-secondary cv-infopiece cv-view-viewinfo-drill\" style=\"color: black; background-color: #ccffcc;\">\n" +
" <span><i class=\"fa fa-fw fa-arrow-down\" title=\"Drilldown\"></i> <b class=\"hidden-xs hidden-sm\">Drilldown:</b> <span title=\"{{ view.cube.dimensionParts(drilldown).label }}\">{{ parts.labelShort }}</span></span>\n" +
" <button type=\"button\" class=\"btn btn-info btn-xs\" style=\"visibility: hidden; margin-left: -20px;\"><i class=\"fa fa-fw fa-info\"></i></button>\n" +
"\n" +
" <button ng-hide=\"view.getControlsHidden() || parts.hierarchy.levels.length < 2\" ng-disabled=\"! parts.drilldownDimensionMinus\" type=\"button\" ng-click=\"selectDrill(parts.drilldownDimensionMinus, true)\" class=\"btn btn-secondary btn-xs hidden-print\" style=\"margin-left: 3px;\"><i class=\"fa fa-fw fa-minus\"></i></button>\n" +
" <button ng-hide=\"view.getControlsHidden() || parts.hierarchy.levels.length < 2\" ng-disabled=\"! parts.drilldownDimensionPlus\" type=\"button\" ng-click=\"selectDrill(parts.drilldownDimensionPlus, true)\" class=\"btn btn-secondary btn-xs hidden-print\" style=\"margin-left: 0px;\"><i class=\"fa fa-fw fa-plus\"></i></button>\n" +
"\n" +
" <button ng-hide=\"view.getControlsHidden()\" type=\"button\" ng-click=\"showDimensionFilter(drilldown)\" class=\"btn btn-secondary btn-xs hidden-print\" style=\"margin-left: 3px;\"><i class=\"fa fa-fw fa-search\"></i></button>\n" +
" <button ng-hide=\"view.getControlsHidden()\" type=\"button\" ng-click=\"selectDrill(drilldown, '')\" class=\"btn btn-danger btn-xs hidden-print\" style=\"margin-left: 1px;\"><i class=\"fa fa-fw fa-trash\"></i></button>\n" +
" </div>\n" +
"\n" +
" </div>\n" +
" <div class=\"cv-view-viewinfo-cut\">\n" +
" <!--\n" +
" var dimensionString = $(this).parents('.cv-view-infopiece-cut').first().attr('data-dimension');\n" +
" var parts = view.cube.dimensionParts(dimensionString);\n" +
" var depth = $(this).parents('.cv-view-infopiece-cut').first().attr('data-value').split(';')[0].split(\",\").length;\n" +
" cubesviewer.views.cube.dimensionfilter.drawDimensionFilter(view, dimensionString + \":\" + parts.hierarchy.levels[depth - 1] );\n" +
" -->\n" +
" <div ng-repeat=\"cut in view.params.cuts\" ng-init=\"equality = cut.invert ? ' ≠ ' : ' = ';\" class=\"label label-secondary cv-infopiece cv-view-viewinfo-cut\" style=\"color: black; background-color: #ffcccc;\">\n" +
" <span style=\"max-width: 480px;\"><i class=\"fa fa-fw fa-filter\" title=\"Filter\"></i> <b class=\"hidden-xs hidden-sm\">Filter:</b> <span title=\"{{ view.cube.dimensionPartsFromCut(cut).label }}\">{{ view.cube.dimensionPartsFromCut(cut).labelShort }}</span> <span ng-class=\"{ 'text-danger': cut.invert }\">{{ equality }}</span> <span title=\"{{ cut.value }}\">{{ cut.value }}</span></span>\n" +
" <button type=\"button\" class=\"btn btn-info btn-xs\" style=\"visibility: hidden; margin-left: -20px;\"><i class=\"fa fa-fw fa-info\"></i></button>\n" +
" <button ng-hide=\"view.getControlsHidden()\" type=\"button\" ng-click=\"showDimensionFilter(view.cube.dimensionPartsFromCut(cut).drilldownDimension)\" class=\"btn btn-secondary btn-xs hidden-print\" style=\"margin-left: 3px;\"><i class=\"fa fa-fw fa-search\"></i></button>\n" +
" <button ng-hide=\"view.getControlsHidden()\" type=\"button\" ng-click=\"selectCut(cut.dimension, '', cut.invert)\" class=\"btn btn-danger btn-xs hidden-print\" style=\"margin-left: 1px;\"><i class=\"fa fa-fw fa-trash\"></i></button>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-include=\"'views/cube/filter/datefilter.html'\"></div>\n" +
"\n" +
" <div class=\"cv-view-viewinfo-extra\">\n" +
"\n" +
" <div ng-if=\"view.params.mode == 'series' || view.params.mode == 'chart'\" class=\"label label-secondary cv-infopiece cv-view-viewinfo-extra\" style=\"color: black; background-color: #ccccff;\">\n" +
" <span style=\"max-width: 350px;\"><i class=\"fa fa-fw fa-crosshairs\" title=\"Measure\"></i> <b class=\"hidden-xs hidden-sm\">Measure:</b> {{ (view.params.yaxis != null) ? view.cube.aggregateFromName(view.params.yaxis).label : \"None\" }}</span>\n" +
" <button type=\"button\" class=\"btn btn-info btn-xs\" style=\"visibility: hidden; margin-left: -20px;\"><i class=\"fa fa-fw fa-info\"></i></button>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.params.mode == 'series' || view.params.mode == 'chart'\" class=\"label label-secondary cv-infopiece cv-view-viewinfo-extra\" style=\"color: black; background-color: #ccddff;\">\n" +
" <span style=\"max-width: 350px;\"><i class=\"fa fa-fw fa-long-arrow-right\" title=\"Horizontal dimension\"></i> <b class=\"hidden-xs hidden-sm\">Horizontal dimension:</b> {{ (view.params.xaxis != null) ? view.cube.dimensionParts(view.params.xaxis).labelShort : \"None\" }}</span>\n" +
" <button type=\"button\" class=\"btn btn-info btn-xs\" style=\"visibility: hidden; margin-left: -20px;\"><i class=\"fa fa-fw fa-info\"></i></button>\n" +
"\n" +
" <button ng-hide=\"view.getControlsHidden() || !view.params.xaxis || view.cube.dimensionParts(view.params.xaxis).hierarchy.levels.length < 2\" ng-disabled=\"! view.cube.dimensionParts(view.params.xaxis).drilldownDimensionMinus\" type=\"button\" ng-click=\"selectXAxis(view.cube.dimensionParts(view.params.xaxis).drilldownDimensionMinus, true)\" class=\"btn btn-secondary btn-xs hidden-print\" style=\"margin-left: 3px;\"><i class=\"fa fa-fw fa-minus\"></i></button>\n" +
" <button ng-hide=\"view.getControlsHidden() || !view.params.xaxis || view.cube.dimensionParts(view.params.xaxis).hierarchy.levels.length < 2\" ng-disabled=\"! view.cube.dimensionParts(view.params.xaxis).drilldownDimensionPlus\" type=\"button\" ng-click=\"selectXAxis(view.cube.dimensionParts(view.params.xaxis).drilldownDimensionPlus, true)\" class=\"btn btn-secondary btn-xs hidden-print\" style=\"margin-left: 0px;\"><i class=\"fa fa-fw fa-plus\"></i></button>\n" +
"\n" +
" <!-- <button type=\"button\" ng-click=\"showDimensionFilter(view.params.xaxis)\" class=\"btn btn-secondary btn-xs\" style=\"margin-left: 3px;\"><i class=\"fa fa-fw fa-search\"></i></button> -->\n" +
" <!-- <button type=\"button\" ng-click=\"selectXAxis(null)\" class=\"btn btn-danger btn-xs\" style=\"margin-left: 1px;\"><i class=\"fa fa-fw fa-trash\"></i></button> -->\n" +
" </div>\n" +
"\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
" <div class=\"clearfix\"></div>\n" +
"\n" +
" <div class=\"cv-view-viewdialogs\">\n" +
" <div ng-if=\"view.dimensionFilter\" ng-include=\"'views/cube/filter/dimension.html'\"></div>\n" +
" </div>\n" +
"\n" +
" <div class=\"cv-view-viewdata\">\n" +
"\n" +
" <div ng-if=\"view.params.mode == 'explore'\" ng-include=\"'views/cube/explore/explore.html'\"></div>\n" +
" <div ng-if=\"view.params.mode == 'facts'\" ng-include=\"'views/cube/facts/facts.html'\"></div>\n" +
" <div ng-if=\"view.params.mode == 'series'\" ng-include=\"'views/cube/series/series.html'\"></div>\n" +
" <div ng-if=\"view.params.mode == 'chart'\" ng-include=\"'views/cube/chart/chart.html'\"></div>\n" +
"\n" +
" </div>\n" +
" <div class=\"clearfix\"></div>\n" +
"\n" +
" <div class=\"cv-view-viewfooter\"></div>\n" +
"\n" +
" </div>\n" +
"\n" +
"</div>\n"
);
$templateCache.put('views/cube/explore/explore.html',
"<div ng-controller=\"CubesViewerViewsCubeExploreController\">\n" +
"\n" +
" <!-- ($(view.container).find('.cv-view-viewdata').children().size() == 0) -->\n" +
" <h3><i class=\"fa fa-fw fa-arrow-circle-down\"></i> Aggregated data\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
"\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
"\n" +
" <div ui-grid=\"view.grid\"\n" +
" ui-grid-resize-columns ui-grid-move-columns ui-grid-selection ui-grid-auto-resize\n" +
" ui-grid-pagination ui-grid-pinning\n" +
" style=\"width: 100%;\" ng-style=\"{height: ((view.grid.data.length < 15 ? view.grid.data.length : 15) * 24) + 44 + 30 + 'px'}\">\n" +
" </div>\n" +
" <div style=\"height: 30px;\"> </div>\n" +
"\n" +
"</div>\n"
);
$templateCache.put('views/cube/facts/facts.html',
"<div ng-controller=\"CubesViewerViewsCubeFactsController\">\n" +
"\n" +
" <!-- ($(view.container).find('.cv-view-viewdata').children().size() == 0) -->\n" +
" <h3><i class=\"fa fa-fw fa-th\"></i> Facts data\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
"\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.grid.data.length > 0\"\n" +
" ui-grid=\"view.grid\"\n" +
" ui-grid-resize-columns ui-grid-move-columns ui-grid-selection ui-grid-auto-resize\n" +
" ui-grid-pagination ui-grid-pinning\n" +
" style=\"width: 100%;\" ng-style=\"{height: ((view.grid.data.length < 15 ? view.grid.data.length : 15) * 24) + 44 + 30 + 'px'}\">\n" +
" </div>\n" +
" <div ng-if=\"view.grid.data.length > 0\" style=\"height: 30px;\"> </div>\n" +
"\n" +
" <div ng-if=\"viewController.view.pendingRequests == 0 && view.grid.data.length == 0\">No facts are returned by the current filtering combination.</div>\n" +
"\n" +
"</div>\n"
);
$templateCache.put('views/cube/filter/datefilter.html',
"<div class=\"cv-view-viewinfo-date\">\n" +
" <div ng-repeat=\"datefilter in view.params.datefilters\" ng-controller=\"CubesViewerViewsCubeFilterDateController\" ng-init=\"dimparts = view.cube.dimensionParts(datefilter.dimension);\" class=\"label label-secondary cv-infopiece cv-view-viewinfo-cut text-left\" style=\"color: black; background-color: #ffdddd; text-align: left;\">\n" +
" <span style=\"max-width: 280px; white-space: nowrap;\"><i class=\"fa fa-fw fa-filter\"></i> <b class=\"hidden-xs hidden-sm\">Filter:</b> {{ dimparts.labelNoLevel }}:</span>\n" +
"\n" +
" <!--\n" +
" <br class=\"hidden-sm hidden-md hidden-lg\" />\n" +
" <i class=\"fa fa-fw hidden-sm hidden-md hidden-lg\" />\n" +
" -->\n" +
"\n" +
" <div class=\"cv-datefilter\" style=\"overflow: visible; display: inline-block;\">\n" +
"\n" +
" <form class=\"form-inline\">\n" +
"\n" +
" <div class=\"form-group\" style=\"display: inline-block; margin: 0px;\">\n" +
" <div class=\"dropdown\" style=\"display: inline-block;\">\n" +
" <button ng-hide=\"view.getControlsHidden()\" style=\"height: 20px;\" class=\"btn btn-default btn-sm dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n" +
" <i class=\"fa fa-fw fa-calendar\"></i> {{ datefilter.mode | datefilterMode }} <span class=\"caret\"></span>\n" +
" </button>\n" +
" <span ng-show=\"view.getControlsHidden()\"><i class=\"fa fa-fw fa-calendar\"></i> {{ datefilter.mode | datefilterMode }}</span>\n" +
"\n" +
" <ul class=\"dropdown-menu cv-view-menu cv-view-menu-view\">\n" +
" <li ng-click=\"setMode('custom')\"><a><i class=\"fa fa-fw\"></i> Custom</a></li>\n" +
" <div class=\"divider\"></div>\n" +
" <li ng-click=\"setMode('auto-last1m')\"><a><i class=\"fa fa-fw\"></i> Last month</a></li>\n" +
" <li ng-click=\"setMode('auto-last3m')\"><a><i class=\"fa fa-fw\"></i> Last 3 months</a></li>\n" +
" <li ng-click=\"setMode('auto-last6m')\"><a><i class=\"fa fa-fw\"></i> Last 6 months</a></li>\n" +
" <li ng-click=\"setMode('auto-last12m')\"><a><i class=\"fa fa-fw\"></i> Last year</a></li>\n" +
" <li ng-click=\"setMode('auto-last24m')\"><a><i class=\"fa fa-fw\"></i> Last 2 years</a></li>\n" +
" <li ng-click=\"setMode('auto-january1st')\"><a><i class=\"fa fa-fw\"></i> From January 1st</a></li>\n" +
" <li ng-click=\"setMode('auto-yesterday')\"><a><i class=\"fa fa-fw\"></i> Yesterday</a></li>\n" +
" </ul>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-show=\"datefilter.mode == 'custom'\" style=\"display: inline-block; margin: 0px;\">\n" +
"\n" +
" ⇒\n" +
"\n" +
" <div class=\"form-group\" style=\"display: inline-block; margin: 0px;\">\n" +
" <p class=\"input-group disabled\" style=\"margin: 0px; display: inline-block;\">\n" +
" <input ng-disabled=\"view.getControlsHidden()\" autocomplete=\"off\" type=\"text\" style=\"height: 20px; width: 80px; display: inline-block;\" class=\"form-control input-sm\" uib-datepicker-popup=\"yyyy-MM-dd\" ng-model=\"dateStart.value\" is-open=\"dateStart.opened\" datepicker-options=\"dateStart.options\" ng-required=\"true\" close-text=\"Close\" />\n" +
" <span ng-hide=\"view.getControlsHidden()\" class=\"input-group-btn\" style=\"display: inline-block;\">\n" +
" <button type=\"button\" style=\"height: 20px;\" class=\"btn btn-default\" ng-click=\"dateStartOpen()\"><i class=\"fa fa-fw fa-calendar\"></i></button>\n" +
" </span>\n" +
" </p>\n" +
" </div>\n" +
"\n" +
" <span ng-hide=\"view.getControlsHidden()\" style=\"margin-left: 17px; margin-right: 0px;\">-</span>\n" +
" <span ng-show=\"view.getControlsHidden()\" style=\"margin-left: 0px; margin-right: 0px;\">-</span>\n" +
"\n" +
" <div class=\"form-group\" style=\"display: inline-block; margin: 0px;\">\n" +
" <p class=\"input-group\" style=\"margin: 0px; display: inline-block;\">\n" +
" <input ng-disabled=\"view.getControlsHidden()\" autocomplete=\"off\" type=\"text\" style=\"height: 20px; width: 80px; display: inline-block;\" class=\"form-control input-sm\" uib-datepicker-popup=\"yyyy-MM-dd\" ng-model=\"dateEnd.value\" is-open=\"dateEnd.opened\" datepicker-options=\"dateEnd.options\" ng-required=\"true\" close-text=\"Close\" />\n" +
" <span ng-hide=\"view.getControlsHidden()\" class=\"input-group-btn\" style=\"display: inline-block;\">\n" +
" <button type=\"button\" style=\"height: 20px;\" class=\"btn btn-default\" ng-click=\"dateEndOpen()\"><i class=\"fa fa-fw fa-calendar\"></i></button>\n" +
" </span>\n" +
" </p>\n" +
" </div>\n" +
"\n" +
" </div>\n" +
"\n" +
" </form>\n" +
"\n" +
" </div>\n" +
"\n" +
" <button type=\"button\" ng-hide=\"view.getControlsHidden()\" ng-click=\"selectDateFilter(datefilter.dimension, false)\" class=\"btn btn-danger btn-xs\" style=\"margin-left: 20px;\"><i class=\"fa fa-fw fa-trash\"></i></button>\n" +
" <button type=\"button\" class=\"btn btn-info btn-xs\" style=\"visibility: hidden; margin-left: -20px;\"><i class=\"fa fa-fw fa-info\"></i></button>\n" +
"\n" +
"\n" +
" </div>\n" +
"</div>\n" +
"\n"
);
$templateCache.put('views/cube/filter/dimension.html',
"<div ng-controller=\"CubesViewerViewsCubeFilterDimensionController\">\n" +
"\n" +
" <div class=\"panel panel-default panel-outline hidden-print\" ng-hide=\"view.getControlsHidden()\" style=\"border-color: #ffcccc;\">\n" +
" <div class=\"panel-heading clearfix\" style=\"border-color: #ffcccc;\">\n" +
" <button class=\"btn btn-xs btn-danger pull-right\" ng-click=\"closeDimensionFilter()\"><i class=\"fa fa-fw fa-close\"></i></button>\n" +
" <h4 style=\"margin: 2px 0px 0px 0px;\"><i class=\"fa fa-fw fa-filter\"></i> Dimension filter: <b>{{ parts.label }}</b></h4>\n" +
" </div>\n" +
" <div class=\"panel-body\">\n" +
"\n" +
" <div >\n" +
" <form >\n" +
"\n" +
" <div class=\"form-group has-feedback\" style=\"display: inline-block; margin-bottom: 0; vertical-align: middle; margin-bottom: 2px;\">\n" +
" <!-- <label for=\"search\">Search:</label> -->\n" +
" <input type=\"text\" class=\"form-control\" ng-model=\"searchString\" ng-model-options=\"{ debounce: 300 }\" placeholder=\"Search...\" style=\"width: 16em;\">\n" +
" <i class=\"fa fa-fw fa-times-circle form-control-feedback\" ng-click=\"searchString = ''\" style=\"cursor: pointer; pointer-events: inherit;\"></i>\n" +
" </div>\n" +
"\n" +
" <div class=\"btn-group\" style=\"margin-left: 10px; display: inline-block; vertical-align: middle; margin-bottom: 2px; margin-right: 5px;\">\n" +
" <button class=\"btn btn-default\" ng-click=\"selectAll();\" type=\"button\" title=\"Select all\"><i class=\"fa fa-fw fa-check-square-o\"></i></button>\n" +
" <button class=\"btn btn-default\" ng-click=\"selectNone();\" type=\"button\" title=\"Select none\"><i class=\"fa fa-fw fa-square-o\"></i></button>\n" +
" </div>\n" +
"\n" +
"<!-- <div class=\"form-group\" style=\"display: inline-block; margin-bottom: 0; vertical-align: middle; margin-bottom: 2px;\"> -->\n" +
" <div class=\"btn-group\" style=\"display: inline-block; vertical-align: middle; margin-bottom: 2px; margin-right: 5px;\">\n" +
" <button ng-hide=\"parts.hierarchy.levels.length < 2\" ng-disabled=\"! parts.drilldownDimensionMinus\" class=\"btn btn-default\" ng-click=\"showDimensionFilter(parts.drilldownDimensionMinus)\" type=\"button\" title=\"Drilldown less\"><i class=\"fa fa-fw fa-minus\"></i></button>\n" +
" <button ng-hide=\"parts.hierarchy.levels.length < 2\" ng-disabled=\"! parts.drilldownDimensionPlus\" class=\"btn btn-default\" ng-click=\"showDimensionFilter(parts.drilldownDimensionPlus)\" type=\"button\" title=\"Drilldown more\"><i class=\"fa fa-fw fa-plus\"></i></button>\n" +
" <button class=\"btn btn-default\" type=\"button\" title=\"Drilldown this\" ng-click=\"selectDrill(parts.drilldownDimension, true)\"><i class=\"fa fa-fw fa-arrow-down\"></i></button>\n" +
" </div>\n" +
"\n" +
" <div class=\"form-group\" style=\"display: inline-block; margin-bottom: 0; vertical-align: middle; margin-bottom: 2px; margin-right: 5px;\">\n" +
" <div class=\"btn btn-default\" ng-click=\"filterShowAll = ! filterShowAll\" ng-class=\"{ 'active': filterShowAll, 'btn-info': filterShowAll }\">\n" +
" <i class=\"fa fa-fw fa-filter fa-rotate-180\"></i> Show all\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div class=\"form-group\" style=\"display: inline-block; margin-bottom: 0; vertical-align: middle; margin-bottom: 2px; \">\n" +
"\n" +
" <div class=\"btn btn-default\" ng-click=\"filterInverted = !filterInverted\" ng-class=\"{ 'active': filterInverted, 'btn-danger': filterInverted }\">\n" +
" <input type=\"checkbox\" ng-model=\"filterInverted\" style=\"pointer-events: none; margin: 0px; vertical-align: middle;\" ></input>\n" +
" <b>≠</b> Invert\n" +
" </div>\n" +
"\n" +
" </div>\n" +
"\n" +
" <div class=\"form-group\" style=\"display: inline-block; margin-bottom: 0; vertical-align: middle; margin-bottom: 2px;\">\n" +
" <button ng-click=\"applyFilter()\" class=\"btn btn-success\" type=\"button\"><i class=\"fa fa-fw fa-filter\"></i> Apply</button>\n" +
" </div>\n" +
" </form>\n" +
" </div>\n" +
"\n" +
" <div class=\"clearfix\"></div>\n" +
"\n" +
" <div class=\"row\">\n" +
" <div class=\"col-xs-9 col-sm-6\">\n" +
" <div style=\"margin-top: 5px;\">\n" +
" <div class=\"panel panel-default panel-outline\" style=\"margin-bottom: 0px; \"><div class=\"panel-body\" style=\"max-height: 180px; overflow-y: auto; overflow-x: hidden;\">\n" +
" <div ng-show=\"loadingDimensionValues\" ><i class=\"fa fa-circle-o-notch fa-spin fa-fw\"></i> Loading...</div>\n" +
"\n" +
" <div ng-if=\"!loadingDimensionValues\">\n" +
" <div ng-repeat=\"val in dimensionValues | filter:filterDimensionValue(searchString)\" style=\"overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap;\">\n" +
" <label style=\"font-weight: normal; margin-bottom: 2px;\">\n" +
" <input type=\"checkbox\" name=\"selectedValues[]\" ng-model=\"val.selected\" value=\"{{ ::val.value }}\" style=\"vertical-align: bottom;\" />\n" +
" <span title=\"{{ val.label }}\">{{ ::val.label }}</span>\n" +
" </label>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" </div></div>\n" +
"\n" +
" <div ng-if=\"!loadingDimensionValues\" class=\"\" style=\"margin-bottom: 0px; \">\n" +
" <div class=\"text-right\">\n" +
" {{ dimensionValues.length }} items\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"!loadingDimensionValues && dimensionValues.length >= cubesService.cubesserver.info.json_record_limit\" class=\"alert alert-warning\" style=\"margin-bottom: 0px;\">\n" +
" <div style=\"display: inline-block;\"><i class=\"fa fa-exclamation\"></i></div>\n" +
" <div style=\"display: inline-block; margin-left: 20px;\">\n" +
" Limit of {{ cubesService.cubesserver.info.json_record_limit }} items has been hit. Dimension value list is <b>incomplete</b>.<br />\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
"\n" +
" <div class=\"clearfix\"></div>\n" +
"\n" +
" </div>\n" +
" </div>\n" +
"\n" +
"\n" +
"</div>\n"
);
$templateCache.put('views/cube/series/series.html',
"<div ng-controller=\"CubesViewerViewsCubeSeriesController\">\n" +
"\n" +
" <!-- ($(view.container).find('.cv-view-viewdata').children().size() == 0) -->\n" +
" <h3><i class=\"fa fa-fw fa-clock-o\"></i> Series table\n" +
" <i ng-show=\"view.pendingRequests > 0\" class=\"fa fa-circle-o-notch fa-spin fa-fw margin-bottom text-info pull-right\"></i>\n" +
" </h3>\n" +
"\n" +
" <div ng-if=\"view.pendingRequests > 0\" class=\"loadingbar-content\">\n" +
" <span class=\"loadingbar-expand\"></span>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.grid.data.length > 0\"\n" +
" ui-grid=\"view.grid\"\n" +
" ui-grid-resize-columns ui-grid-move-columns ui-grid-selection ui-grid-auto-resize\n" +
" ui-grid-pagination ui-grid-pinning\n" +
" style=\"width: 100%;\" ng-style=\"{height: ((view.grid.data.length < 15 ? view.grid.data.length : 15) * 24) + 44 + 30 + 'px'}\">\n" +
" </div>\n" +
" <div ng-if=\"view.grid.data.length > 0\" style=\"height: 30px;\"> </div>\n" +
"\n" +
" <div ng-if=\"view.pendingRequests == 0 && view.params.yaxis == null\" class=\"alert alert-info\" style=\"margin-bottom: 0px;\">\n" +
" <p>\n" +
" Cannot present series table: no <b>measure</b> has been selected.\n" +
" </p>\n" +
" <p>\n" +
" Tip: use the <kbd><i class=\"fa fa-fw fa-cogs\"></i> View > <i class=\"fa fa-fw fa-crosshairs\"></i> Measure</kbd> menu.\n" +
" </p>\n" +
" </div>\n" +
"\n" +
" <div ng-if=\"view.pendingRequests == 0 && view.params.yaxis != null && view.grid.data.length == 0\" class=\"alert alert-info\" style=\"margin-bottom: 0px;\">\n" +
" <p>\n" +
" Cannot present series table: <b>no rows</b> are returned by the current horizontal dimension, drilldown or filtering combination.\n" +
" </p>\n" +
" <p>\n" +
" Tip: use the <kbd><i class=\"fa fa-fw fa-cogs\"></i> View</kbd> menu to select an horizontal dimension.\n" +
" </p>\n" +
" </div>\n" +
"\n" +
"</div>\n"
);
}]);
================================================
FILE: cubesviewer/dialog/dialog.html
================================================
<div class="modal-header">
<button type="button" ng-click="close()" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true"><i class="fa fa-fw fa-close"></i></span></button>
<h4 class="modal-title" id="myModalLabel"><i class="fa fa-fw fa-exclamation"></i> CubesViewer</h4>
</div>
<div class="modal-body">
<p>{{ dialog.text }}</p>
</div>
<div class="modal-footer">
<!-- <button type="button" ng-click="close()" class="btn btn-secondary" data-dismiss="modal">Cancel</button> -->
<button type="button" ng-click="close()" class="btn btn-primary" data-dismiss="modal">Close</button>
</div>
================================================
FILE: cubesviewer/dialog/dialog.js
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
angular.module('cv.views').service("dialogService", ['$rootScope', '$uibModal', 'cvOptions', 'cubesService',
function ($rootScope, $uibModal, cvOptions, cubesService) {
var dialogService = this;
this.initialize = function() {
$("body").append('<div class="cv-modals cv-bootstrap"></div>');
};
this.show = function(text) {
var modalInstance = $uibModal.open({
animation: true,
templateUrl: 'dialog/dialog.html',
controller: 'CubesViewerViewsDialogController',
appendTo: angular.element($("body").find('.cv-modals')[0]),
resolve: {
dialog: function() { return { 'text': text }; }
},
/*
size: size,
*/
});
modalInstance.result.then(function (selectedItem) {
//$scope.selected = selectedItem;
}, function () {
//console.debug('Modal dismissed at: ' + new Date());
});
};
this.initialize();
}]);
/**
*/
angular.module('cv.views').controller("CubesViewerViewsDialogController", ['$rootScope', '$scope', '$timeout', '$uibModalInstance', 'cvOptions', 'cubesService', 'viewsService', 'dialog',
function ($rootScope, $scope, $timeout, $uibModalInstance, cvOptions, cubesService, viewsService, dialog) {
$scope.$rootScope = $rootScope;
$scope.dialog = dialog;
$scope.close = function() {
$uibModalInstance.dismiss('cancel');
};
}]);
================================================
FILE: cubesviewer/ga/googleanalytics.js
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/*
* Google Analytics events tracking service.
*
* When enabled, it uses Google Analytics event system to
* log CubesViewer operations. Model loading, Aggregations, Facts and Dimension queries
* are registered as non-interactive events (and don't affect bounce rate). Each
* view refresh is registered as an interactive event.
*
*/
"use strict";
angular.module('cv.cubes').service("gaService", ['$rootScope', '$http', '$cookies', '$log', 'cvOptions',
function ($rootScope, $http, $cookies, $log, cvOptions) {
var gaService = this;
this.ignorePeriod = 12; // 35
this.initTime = new Date();
this.initialize = function() {
if (cvOptions.gaTrackEvents) $log.debug("Google Analytics events tracking plugin enabled.")
};
this.trackRequest = function(path) {
if (! (cvOptions.gaTrackEvents)) return;
if ((((new Date()) - this.initTime) / 1000) < this.ignorePeriod) return;
// Track request, through Google Analytics events API
var event = null;
var pathParts = path.split("/");
var modelPos = pathParts.indexOf("cube");
if (modelPos >= 0) {
pathParts = pathParts.slice(modelPos + 1);
if (pathParts[1] == "model") {
event = ['model', pathParts[0]];
} else if (pathParts[1] == "aggregate") {
event = ['aggregate', pathParts[0]];
} else if (pathParts[1] == "facts") {
event = ['facts', pathParts[0]];
} else if (pathParts[1] == "members") {
event = ['dimension', pathParts[2]];
}
}
if (event) {
if (typeof ga !== 'undefined') {
ga('send', 'event', "CubesViewer", event[0], event[1]);
$log.debug("Tracking GA event: " + event[0] + "/" + event[1]);
} else {
$log.debug("Cannot track CubesViewer events: GA object 'ga' not available.")
}
} else {
$log.warn("Unknown cubes operation, cannot be tracked by GA service: " + path)
}
};
this.initialize();
}]);
================================================
FILE: cubesviewer/server/reststore.js
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
"use strict";
angular.module('cv.studio').service("reststoreService", ['$rootScope', '$http', '$cookies', 'cvOptions', 'cubesService', 'viewsService', 'dialogService', 'studioViewsService',
function ($rootScope, $http, $cookies, cvOptions, cubesService, viewsService, dialogService, studioViewsService) {
var reststoreService = this;
reststoreService.savedViews = [];
reststoreService.initialize = function() {
if (! cvOptions.backendUrl) return;
reststoreService.viewList();
};
/**
* Returns a stored view from memory.
*/
reststoreService.getSavedView = function(savedId) {
var view = $.grep(reststoreService.savedViews, function(ed) { return ed.id == savedId; });
if (view.length > 0) {
return view[0];
} else {
return null;
}
};
/**
* Save a view.
*/
reststoreService.saveView = function (view) {
if (view.owner != cvOptions.user) {
dialogService.show('Cannot save a view that belongs to other user (try cloning the view).');
return;
}
var data = {
"id": view.savedId,
"name": view.params.name,
"shared": view.shared,
"data": viewsService.serializeView(view)
};
$http({
"method": "POST",
"url": cvOptions.backendUrl + "/view/save/",
"data": JSON.stringify(data),
"headers": {"X-CSRFToken": $cookies.get('csrftoken')},
}).then(reststoreService._viewSaveCallback(view), cubesService.defaultRequestErrorHandler);
};
/**
* Save callback
*/
reststoreService._viewSaveCallback = function(view) {
var view = view;
return function(data, status) {
data = data.data;
if (view != null) {
view.savedId = data.id;
// Manually update saved list to avoid detecting differences as the list hasn't been reloaded
var sview = reststoreService.getSavedView(view.savedId);
if (sview != null) {
sview.name = view.params.name;
sview.shared = view.shared;
sview.data = viewsService.serializeView(view)
}
}
reststoreService.viewList();
dialogService.show("View saved.");
}
};
/**
* Delete a view.
*/
reststoreService.deleteView = function (view) {
if (view.savedId == 0) {
dialogService.show("Cannot delete this view as it hasn't been saved.");
return;
}
if (view.owner != cvOptions.user) {
dialogService.show('Cannot delete a view that belongs to other user.');
return;
}
if (! confirm('Are you sure you want to delete and close this view?')) {
return;
}
var data = {
"id": view.savedId,
"data": ""
};
studioViewsService.closeView(view);
$http({
"method": "POST",
"url": cvOptions.backendUrl + "/view/save/",
"data": JSON.stringify(data),
"headers": {"X-CSRFToken": $cookies.get('csrftoken')}
}).then(reststoreService._viewDeleteCallback, cubesviewer.defaultRequestErrorHandler);
};
/*
* Delete callback
*/
reststoreService._viewDeleteCallback = function() {
reststoreService.viewList();
};
/*
* Get view list.
*/
reststoreService.viewList = function () {
$http.get(cvOptions.backendUrl + "/view/list/").then(
reststoreService._viewListCallback, cubesService.defaultRequestErrorHandler);
};
reststoreService._viewListCallback = function(data, status) {
reststoreService.savedViews = data.data;
};
reststoreService.isViewChanged = function(view) {
if (view.savedId == 0) return false;
// Find saved copy
var sview = reststoreService.getSavedView(view.savedId);
// Find differences
if (sview != null) {
if (view.params.name != sview.name) return true;
if (view.shared != sview.shared) return true;
if (viewsService.serializeView(view) != sview.data) return true;
}
return false;
};
/**
* Change shared mode
*/
reststoreService.shareView = function(view, sharedstate) {
if (view.owner != cvOptions.user) {
dialogService.show('Cannot share/unshare a view that belongs to other user (try cloning the view).');
return;
}
view.shared = ( sharedstate == 1 ? true : false );
reststoreService.saveView(view);
};
/**
* Loads a view from the backend.
* This is equivalent to other view adding methods in the cubesviewer.gui namespace,
* like "addViewCube" or "addViewObject", but thisloads the view definition from
* the storage backend.
*/
reststoreService.addSavedView = function(savedViewId) {
// TODO: Check whether the server model is loaded, etc
var savedview = reststoreService.getSavedView(savedViewId);
var viewobject = $.parseJSON(savedview.data);
var view = studioViewsService.addViewObject(viewobject);
if (savedview.owner == cvOptions.user) {
view.savedId = savedview.id;
view.owner = savedview.owner;
view.shared = savedview.shared;
} else {
view.savedId = 0;
view.owner = cvOptions.user;
view.shared = false;
}
};
reststoreService.initialize();
}]);
================================================
FILE: cubesviewer/studio/about.html
================================================
<div class="modal fade" id="cvAboutModal" tabindex="-1" role="dialog" aria-labelledby="">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true"><i class="fa fa-fw fa-close"></i></span></button>
<h4 class="modal-title" id="myModalLabel"><i class="cv-logo-embedded"></i> CubesViewer</h4>
</div>
<div class="modal-body">
<p><a href="http://jjmontesl.github.io/cubesviewer/" target="_blank">CubesViewer</a> is a visual, web-based application for exploring and analyzing
OLAP databases served by the <a href="http://cubes.databrewery.org/" target="_blank">Cubes OLAP Framework</a>.</p>
<hr />
<p>Version {{ cvVersion }}<br />
<a href="https://github.com/jjmontesl/cubesviewer/" target="_blank">https://github.com/jjmontesl/cubesviewer/</a></p>
<p>by José Juan Montes and others (see AUTHORS)<br />
2012 - 2016</p>
<p>
<a href="http://github.com/jjmontesl/cubesviewer/blob/master/LICENSE.txt" target="_blank">LICENSE</a>
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><i class="fa fa-cube"></i> Close</button>
</div>
</div>
</div>
</div>
================================================
FILE: cubesviewer/studio/localeswitcher.js.old
================================================
/*
* CubesViewer
* Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/*
* Locale switcher button.
*/
function cubesviewerGuiLocaleSwitcher() {
this.cubesviewer = cubesviewer;
/*
* Draw GUI options
*/
this.onGuiDraw = function(event, gui) {
$(gui.options.container).find('.cv-gui-tools').prepend(
'<div style="margin-bottom: 4px;">' +
'Language: ' +
'<select name="cv-gui-localeswitcher">' +
'<option value="">Default</option>' +
'</select>' +
'</div>'
);
$('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).change(function() {
cubesviewer.gui.localeswitcher.selectLocale(gui, $(this).val());
});
}
/*
* Draw languages from model
*/
this.onCubesviewerRefresh = function(event, data) {
var gui = event.data.gui;
var cubesviewer = gui.cubesviewer;
// Add locales (clean list first)
$('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).empty();
$('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.options.container)).append(
'<option value="">Default</option>'
);
$(cubesviewer.model["locales"]).each(
function(idx, locale) {
$('[name=cv-gui-localeswitcher]', $(cubesviewer.gui.op
gitextract_twb7_k0p/ ├── .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 ├── doc/ │ ├── guide/ │ │ ├── cubesviewer-embed.md │ │ ├── cubesviewer-model.md │ │ ├── cubesviewer-quickstart.md │ │ ├── cubesviewer-server-installation.md │ │ ├── cubesviewer-user-main.md │ │ └── index.md │ ├── images/ │ │ └── icon/ │ │ ├── browserconfig.xml │ │ └── manifest.json │ └── jsdoc/ │ ├── jsdoc.conf.json │ └── layout.tmpl ├── html/ │ ├── cvapp.css │ ├── lib/ │ │ ├── angular/ │ │ │ └── angular.js │ │ ├── angular-bootstrap/ │ │ │ └── ui-bootstrap-tpls.js │ │ ├── angular-bootstrap-slider/ │ │ │ └── slider.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.js │ │ │ ├── validate/ │ │ │ │ └── less/ │ │ │ │ └── validate.less │ │ │ └── variables.less │ │ ├── bootstrap/ │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.js │ │ │ └── npm.js │ │ ├── bootstrap-submenu/ │ │ │ ├── css/ │ │ │ │ └── bootstrap-submenu.css │ │ │ └── js/ │ │ │ └── bootstrap-submenu.js │ │ ├── d3/ │ │ │ └── d3.js │ │ ├── flotr2/ │ │ │ ├── CONTRIBUTING.md │ │ │ ├── README.md │ │ │ ├── flotr2.amd.js │ │ │ ├── flotr2.examples.types.js │ │ │ ├── flotr2.js │ │ │ ├── flotr2.nolibs.js │ │ │ └── package.json │ │ ├── font-awesome/ │ │ │ ├── css/ │ │ │ │ └── font-awesome.css │ │ │ └── fonts/ │ │ │ ├── FontAwesome.otf │ │ │ └── index.html │ │ ├── jquery/ │ │ │ ├── jquery.js │ │ │ └── jquery.slim.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
SYMBOL INDEX (1229 symbols across 21 files)
FILE: cubesviewer/core/cubesviewer.js
function CubesViewer (line 133) | function CubesViewer() {
FILE: cubesviewer/studio/studio.js
function CubesViewerStudio (line 392) | function CubesViewerStudio() {
FILE: cubesviewer/views/cube/chart/chart-sunburst.js
function isParentOf (line 174) | function isParentOf(p, c) {
function colour (line 185) | function colour(d) {
function arcTween (line 213) | function arcTween(d) {
function maxY (line 229) | function maxY(d) {
function brightness (line 235) | function brightness(rgb) {
function textPart (line 239) | function textPart(text, part) {
function updateText (line 372) | function updateText(d) {
function click (line 422) | function click(d) {
function cubesviewerViewCubeDynamicChart (line 437) | function cubesviewerViewCubeDynamicChart() {
FILE: cubesviewer/views/cube/explore/explore.js
function cubesviewerViewCubeExplore (line 287) | function cubesviewerViewCubeExplore() {
FILE: cubesviewer/views/cube/export.js
function processStyleSheet (line 147) | function processStyleSheet(ss) {
FILE: html/lib/angular-bootstrap-slider/slider.js
function initSlider (line 43) | function initSlider() {
FILE: html/lib/angular-bootstrap/ui-bootstrap-tpls.js
function expand (line 28) | function expand() {
function expandDone (line 54) | function expandDone() {
function collapse (line 61) | function collapse() {
function collapseDone (line 93) | function collapseDone() {
function getTrueValue (line 340) | function getTrueValue() {
function getFalseValue (line 344) | function getFalseValue() {
function getCheckboxValue (line 348) | function getCheckboxValue(attribute, defaultValue) {
function clearBufferedTransitions (line 550) | function clearBufferedTransitions() {
function getSlideByIndex (line 556) | function getSlideByIndex(index) {
function setActive (line 564) | function setActive(index) {
function goNext (line 570) | function goNext(slide, index, direction) {
function findSlideIndex (line 611) | function findSlideIndex(slide) {
function resetTimer (line 619) | function resetTimer() {
function resetTransition (line 626) | function resetTransition(slides) {
function restartTimer (line 633) | function restartTimer() {
function timerFn (line 641) | function timerFn() {
function removeClass (line 696) | function removeClass(element, className, callback) {
function createParser (line 979) | function createParser(format, func) {
function isValid (line 1153) | function isValid(year, month, date) {
function toInt (line 1169) | function toInt(str) {
function toTimezone (line 1179) | function toTimezone(date, timezone) {
function fromTimezone (line 1183) | function fromTimezone(date, timezone) {
function timezoneToOffset (line 1188) | function timezoneToOffset(timezone, fallback) {
function addDateMinutes (line 1193) | function addDateMinutes(date, minutes) {
function convertTimezoneToLocal (line 1199) | function convertTimezoneToLocal(date, timezone, reverse) {
function linkFn (line 1233) | function linkFn(scope, element, attrs) {
function addForExp (line 1247) | function addForExp(exp, scope) {
function removeScope (line 1283) | function removeScope(e) {
function setMode (line 1639) | function setMode(mode) {
function getDaysInMonth (line 1650) | function getDaysInMonth(year, month) {
function getISO8601WeekNumber (line 1726) | function getISO8601WeekNumber(date) {
function getStartingYear (line 1820) | function getStartingYear(year) {
function isStaticPositioned (line 2013) | function isStaticPositioned(el) {
function cameltoDash (line 2857) | function cameltoDash(string) {
function parseDateString (line 2861) | function parseDateString(viewValue) {
function parseDate (line 2874) | function parseDate(viewValue) {
function validator (line 2898) | function validator(modelValue, viewValue) {
function documentClickBind (line 2924) | function documentClickBind(event) {
function inputKeydownBind (line 2941) | function inputKeydownBind(evt) {
function positionPopup (line 2958) | function positionPopup() {
function linkFn (line 3539) | function linkFn(scope, element, attrs) {
function isVisible (line 3691) | function isVisible(element) {
function backdropIndex (line 3697) | function backdropIndex() {
function removeModalWindow (line 3720) | function removeModalWindow(modalInstance, elementToReceiveFocus) {
function toggleTopWindowClass (line 3757) | function toggleTopWindowClass(toggleSwitch) {
function checkRemoveBackdrop (line 3766) | function checkRemoveBackdrop() {
function removeAfterAnimate (line 3778) | function removeAfterAnimate(domEl, scope, done, closedDeferred) {
function keydownListener (line 3824) | function keydownListener(evt) {
function broadcastClosing (line 3936) | function broadcastClosing(modalWindow, resultOrReason, closing) {
function getTemplatePromise (line 4047) | function getTemplatePromise(options) {
function resolveWithTemplate (line 4091) | function resolveWithTemplate() {
function makePage (line 4345) | function makePage(number, text, isActive) {
function getPages (line 4353) | function getPages(currentPage, totalPages) {
function snake_case (line 4534) | function snake_case(name) {
function keypressListener (line 4554) | function keypressListener(e) {
function getTriggers (line 4582) | function getTriggers(trigger) {
function toggleTooltipBind (line 4678) | function toggleTooltipBind() {
function showTooltipBind (line 4687) | function showTooltipBind() {
function hideTooltipBind (line 4706) | function hideTooltipBind() {
function show (line 4719) | function show() {
function cancelShow (line 4738) | function cancelShow() {
function hide (line 4751) | function hide() {
function cancelHide (line 4776) | function cancelHide() {
function createTooltip (line 4788) | function createTooltip() {
function removeTooltip (line 4806) | function removeTooltip() {
function prepareTooltip (line 4826) | function prepareTooltip() {
function assignIsOpen (line 4845) | function assignIsOpen(isOpen) {
function prepObservers (line 4876) | function prepObservers() {
function unregisterObservers (line 4934) | function unregisterObservers() {
function bodyHideTooltipBind (line 4944) | function bodyHideTooltipBind(e) {
function prepTriggers (line 4972) | function prepTriggers() {
function getMaxOrDefault (line 5277) | function getMaxOrDefault () {
function findTabIndex (line 5523) | function findTabIndex(index) {
function isTabHeading (line 5661) | function isTabHeading(node) {
function getHoursFromTemplate (line 5838) | function getHoursFromTemplate() {
function getMinutesFromTemplate (line 5857) | function getMinutesFromTemplate() {
function getSecondsFromTemplate (line 5866) | function getSecondsFromTemplate() {
function pad (line 5871) | function pad(value, noPad) {
function refresh (line 6094) | function refresh(keyboardChange) {
function makeValid (line 6100) | function makeValid() {
function updateTemplate (line 6107) | function updateTemplate(keyboardChange) {
function addSecondsToSelected (line 6135) | function addSecondsToSelected(seconds) {
function addMinutes (line 6140) | function addMinutes(selected, minutes) {
function addSeconds (line 6144) | function addSeconds(date, seconds) {
function modelIsEmpty (line 6151) | function modelIsEmpty() {
function fireRecalculating (line 6537) | function fireRecalculating() {
function recalculatePosition (line 6548) | function recalculatePosition() {
function escapeRegexp (line 6880) | function escapeRegexp(queryToEscape) {
function containsHtml (line 6886) | function containsHtml(matchItem) {
FILE: html/lib/angular-cookies/angular-cookies.js
function calcOptions (line 57) | function calcOptions(options) {
function $$CookieWriter (line 273) | function $$CookieWriter($document, $log, $browser) {
FILE: html/lib/angular-ui-grid/ui-grid.js
function compileTemplate (line 134) | function compileTemplate() {
function updateHeaderReferences (line 1468) | function updateHeaderReferences() {
function scrollHandler (line 1481) | function scrollHandler(evt) {
function updateColumnWidths (line 1509) | function updateColumnWidths() {
function update (line 2739) | function update() {
function compileTemplate (line 2827) | function compileTemplate() {
function scrollHandler (line 2989) | function scrollHandler(evt) {
function syncVerticalScroll (line 3031) | function syncVerticalScroll(scrollEvent){
function syncHorizontalScroll (line 3038) | function syncHorizontalScroll(scrollEvent){
function syncHorizontalHeader (line 3044) | function syncHorizontalHeader(scrollEvent){
function syncHorizontalFooter (line 3051) | function syncHorizontalFooter(scrollEvent){
function columnDefsWatchFunction (line 3173) | function columnDefsWatchFunction(n, o) {
function dataWatchFunction (line 3188) | function dataWatchFunction(newData) {
function uiGridDirective (line 3305) | function uiGridDirective($compile, $templateCache, $timeout, $window, gr...
function monkeyPatchedGetViewportWidth (line 3489) | function monkeyPatchedGetViewportWidth() {
function updateContainerWidth (line 3505) | function updateContainerWidth() {
function updateContainerDimensions (line 3518) | function updateContainerDimensions() {
function vertical (line 3692) | function vertical (scrollEvent) {
function horizontal (line 3701) | function horizontal (scrollEvent) {
function startProcessor (line 4867) | function startProcessor(i, renderedRowsToProcess) {
function startProcessor (line 4994) | function startProcessor(i, renderedColumnsToProcess) {
function RowHashMap (line 6059) | function RowHashMap() {}
function registerEventWithAngular (line 6369) | function registerEventWithAngular(eventId, handler, grid, _this) {
function GridColumn (line 6563) | function GridColumn(colDef, uid, grid) {
function GridRenderContainer (line 7950) | function GridRenderContainer(name, grid, options) {
function GridRow (line 8740) | function GridRow(entity, index, grid) {
function ScrollEvent (line 9046) | function ScrollEvent(grid, sourceRowContainer, sourceColContainer, sourc...
function escapeRegExp (line 9433) | function escapeRegExp(str) {
function getStyles (line 10336) | function getStyles (elem) {
function augmentWidthOrHeight (line 10351) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight (line 10418) | function getWidthOrHeight( elem, name, extra ) {
function getLineHeight (line 10464) | function getLineHeight(elm) {
function debounce (line 11476) | function debounce() {
function runFunc (line 11537) | function runFunc(endDate){
function mousewheelHandler (line 11615) | function mousewheelHandler(fn, event) {
function nullLowestDelta (line 11722) | function nullLowestDelta() {
function shouldAdjustOldDeltas (line 11726) | function shouldAdjustOldDeltas(orgEvent, absDelta) {
function getDimensions (line 14255) | function getDimensions() {
function startTimeout (line 14264) | function startTimeout() {
function addAriaLiveRegion (line 15064) | function addAriaLiveRegion(){
function preventMouseDown (line 15371) | function preventMouseDown(evt) {
function setFocused (line 15396) | function setFocused() {
function clearFocus (line 15406) | function clearFocus() {
function registerBeginEditEvents (line 15938) | function registerBeginEditEvents() {
function touchStart (line 15974) | function touchStart(event) {
function touchEnd (line 15997) | function touchEnd(event) {
function cancelBeginEditEvents (line 16002) | function cancelBeginEditEvents() {
function beginEditKeyDown (line 16011) | function beginEditKeyDown(evt) {
function shouldEdit (line 16017) | function shouldEdit(col, row) {
function beginEdit (line 16025) | function beginEdit(triggerEvent) {
function beginEditAfterScroll (line 16151) | function beginEditAfterScroll(triggerEvent) {
function endEdit (line 16269) | function endEdit() {
function cancelEdit (line 16292) | function cancelEdit() {
function resolveObjectFromPath (line 16307) | function resolveObjectFromPath(object, path) {
function parseDateString (line 16480) | function parseDateString(dateString) {
function refreshCanvas (line 22668) | function refreshCanvas(xDiff) {
function constrainWidth (line 22677) | function constrainWidth(col, width){
function moveFunction (line 22700) | function moveFunction(event, args) {
function upFunction (line 22735) | function upFunction(event, args) {
function selectButtonClick (line 25160) | function selectButtonClick(row, evt) {
function selectButtonMouseDown (line 25174) | function selectButtonMouseDown(evt) {
function registerRowSelectionEvents (line 25341) | function registerRowSelectionEvents() {
function deregisterRowSelectionEvents (line 25352) | function deregisterRowSelectionEvents() {
FILE: html/lib/angular/angular.js
function minErr (line 38) | function minErr(module, ErrorConstructor) {
function isArrayLike (line 250) | function isArrayLike(obj) {
function forEach (line 307) | function forEach(obj, iterator, context) {
function forEachSorted (line 351) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 365) | function reverseParams(iteratorFn) {
function nextUid (line 379) | function nextUid() {
function setHashKey (line 389) | function setHashKey(obj, h) {
function baseExtend (line 398) | function baseExtend(dst, objs, deep) {
function extend (line 450) | function extend(dst) {
function merge (line 473) | function merge(dst) {
function toInt (line 479) | function toInt(str) {
function inherit (line 484) | function inherit(parent, extra) {
function noop (line 504) | function noop() {}
function identity (line 526) | function identity($) {return $;}
function valueFn (line 530) | function valueFn(value) {return function valueRef() {return value;};}
function hasCustomToString (line 532) | function hasCustomToString(obj) {
function isUndefined (line 549) | function isUndefined(value) {return typeof value === 'undefined';}
function isDefined (line 564) | function isDefined(value) {return typeof value !== 'undefined';}
function isObject (line 580) | function isObject(value) {
function isBlankObject (line 591) | function isBlankObject(value) {
function isString (line 608) | function isString(value) {return typeof value === 'string';}
function isNumber (line 629) | function isNumber(value) {return typeof value === 'number';}
function isDate (line 644) | function isDate(value) {
function isFunction (line 675) | function isFunction(value) {return typeof value === 'function';}
function isRegExp (line 685) | function isRegExp(value) {
function isWindow (line 697) | function isWindow(obj) {
function isScope (line 702) | function isScope(obj) {
function isFile (line 707) | function isFile(obj) {
function isFormData (line 712) | function isFormData(obj) {
function isBlob (line 717) | function isBlob(obj) {
function isBoolean (line 722) | function isBoolean(value) {
function isPromiseLike (line 727) | function isPromiseLike(obj) {
function isTypedArray (line 733) | function isTypedArray(value) {
function isArrayBuffer (line 737) | function isArrayBuffer(obj) {
function isElement (line 767) | function isElement(node) {
function makeMap (line 777) | function makeMap(str) {
function nodeName_ (line 786) | function nodeName_(element) {
function includes (line 790) | function includes(array, obj) {
function arrayRemove (line 794) | function arrayRemove(array, value) {
function copy (line 860) | function copy(source, destination) {
function shallowCopy (line 1002) | function shallowCopy(src, dst) {
function equals (line 1087) | function equals(o1, o2) {
function noUnsafeEval (line 1152) | function noUnsafeEval() {
function concat (line 1217) | function concat(array1, array2, index) {
function sliceArgs (line 1221) | function sliceArgs(args, startIndex) {
function bind (line 1245) | function bind(self, fn) {
function toJsonReplacer (line 1266) | function toJsonReplacer(key, value) {
function toJson (line 1298) | function toJson(obj, pretty) {
function fromJson (line 1319) | function fromJson(json) {
function timezoneToOffset (line 1327) | function timezoneToOffset(timezone, fallback) {
function addDateMinutes (line 1335) | function addDateMinutes(date, minutes) {
function convertTimezoneToLocal (line 1342) | function convertTimezoneToLocal(date, timezone, reverse) {
function startingTag (line 1353) | function startingTag(element) {
function tryDecodeURIComponent (line 1383) | function tryDecodeURIComponent(value) {
function parseKeyValue (line 1396) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 1423) | function toKeyValue(obj) {
function encodeUriSegment (line 1451) | function encodeUriSegment(val) {
function encodeUriQuery (line 1470) | function encodeUriQuery(val, pctEncodeSpaces) {
function getNgAttribute (line 1482) | function getNgAttribute(element, ngAttr) {
function angularInit (line 1627) | function angularInit(element, bootstrap) {
function bootstrap (line 1715) | function bootstrap(element, modules, config) {
function reloadWithDebugInfo (line 1793) | function reloadWithDebugInfo() {
function getTestability (line 1806) | function getTestability(rootElement) {
function snake_case (line 1816) | function snake_case(name, separator) {
function bindJQuery (line 1824) | function bindJQuery() {
function assertArg (line 1878) | function assertArg(arg, name, reason) {
function assertArgFn (line 1885) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function assertNotHasOwnProperty (line 1900) | function assertNotHasOwnProperty(name, context) {
function getter (line 1914) | function getter(obj, path, bindFnToScope) {
function getBlockNodes (line 1938) | function getBlockNodes(nodes) {
function createMap (line 1968) | function createMap() {
function setupModuleLoader (line 1988) | function setupModuleLoader(window) {
function serializeObject (line 2343) | function serializeObject(obj) {
function toDebugString (line 2358) | function toDebugString(obj) {
function publishExternalAPI (line 2490) | function publishExternalAPI(angular) {
function jqNextId (line 2769) | function jqNextId() { return ++jqId; }
function camelCase (line 2782) | function camelCase(name) {
function jqLiteIsTextNode (line 2810) | function jqLiteIsTextNode(html) {
function jqLiteAcceptsData (line 2814) | function jqLiteAcceptsData(node) {
function jqLiteHasData (line 2821) | function jqLiteHasData(node) {
function jqLiteCleanData (line 2828) | function jqLiteCleanData(nodes) {
function jqLiteBuildFragment (line 2834) | function jqLiteBuildFragment(html, context) {
function jqLiteParseHTML (line 2871) | function jqLiteParseHTML(html, context) {
function jqLiteWrapNode (line 2886) | function jqLiteWrapNode(node, wrapper) {
function JQLite (line 2905) | function JQLite(element) {
function jqLiteClone (line 2930) | function jqLiteClone(element) {
function jqLiteDealoc (line 2934) | function jqLiteDealoc(element, onlyDescendants) {
function jqLiteOff (line 2945) | function jqLiteOff(element, type, fn, unsupported) {
function jqLiteRemoveData (line 2983) | function jqLiteRemoveData(element, name) {
function jqLiteExpandoStore (line 3005) | function jqLiteExpandoStore(element, createIfNecessary) {
function jqLiteData (line 3018) | function jqLiteData(element, key, value) {
function jqLiteHasClass (line 3044) | function jqLiteHasClass(element, selector) {
function jqLiteRemoveClass (line 3050) | function jqLiteRemoveClass(element, cssClasses) {
function jqLiteAddClass (line 3062) | function jqLiteAddClass(element, cssClasses) {
function jqLiteAddNodes (line 3079) | function jqLiteAddNodes(root, elements) {
function jqLiteController (line 3105) | function jqLiteController(element, name) {
function jqLiteInheritedData (line 3109) | function jqLiteInheritedData(element, name, value) {
function jqLiteEmpty (line 3129) | function jqLiteEmpty(element) {
function jqLiteRemove (line 3136) | function jqLiteRemove(element, keepData) {
function jqLiteDocumentLoaded (line 3143) | function jqLiteDocumentLoaded(action, win) {
function trigger (line 3163) | function trigger() {
function getBooleanAttrName (line 3217) | function getBooleanAttrName(element, name) {
function getAliasedAttrName (line 3225) | function getAliasedAttrName(name) {
function getText (line 3318) | function getText(element, value) {
function createEventHandler (line 3403) | function createEventHandler(element, events) {
function defaultHandlerWrapper (line 3455) | function defaultHandlerWrapper(element, event, handler) {
function specialMouseHandlerWrapper (line 3459) | function specialMouseHandlerWrapper(target, event, handler) {
function $$jqLiteProvider (line 3706) | function $$jqLiteProvider() {
function hashKey (line 3737) | function hashKey(obj, nextUidFn) {
function HashMap (line 3760) | function HashMap(array, isolatedUid) {
function extractArgs (line 3874) | function extractArgs(fn) {
function anonFn (line 3880) | function anonFn(fn) {
function annotate (line 3890) | function annotate(fn, strictDi, name) {
function createInjector (line 4437) | function createInjector(modulesToLoad, strictDi) {
function $AnchorScrollProvider (line 4706) | function $AnchorScrollProvider() {
function mergeClasses (line 4973) | function mergeClasses(a,b) {
function extractElementNode (line 4982) | function extractElementNode(element) {
function splitClasses (line 4991) | function splitClasses(classes) {
function prepareAnimateOptions (line 5016) | function prepareAnimateOptions(options) {
function updateData (line 5061) | function updateData(data, classes, value) {
function handleCSSClassChanges (line 5076) | function handleCSSClassChanges() {
function addRemoveClassesPostDigest (line 5105) | function addRemoveClassesPostDigest(element, add, remove) {
function domInsert (line 5219) | function domInsert(element, parentElement, afterElement) {
function waitForTick (line 5571) | function waitForTick(fn) {
function next (line 5606) | function next() {
function onProgress (line 5630) | function onProgress(response) {
function AnimateRunner (line 5638) | function AnimateRunner(host) {
function run (line 5794) | function run() {
function applyAnimationContents (line 5805) | function applyAnimationContents() {
function Browser (line 5846) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 6174) | function $BrowserProvider() {
function $CacheFactoryProvider (line 6262) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 6577) | function $TemplateCacheProvider() {
function UNINITIALIZED_VALUE (line 7429) | function UNINITIALIZED_VALUE() {}
function $CompileProvider (line 7439) | function $CompileProvider($provide, $$sanitizeUriProvider) {
function SimpleChange (line 9862) | function SimpleChange(previous, current) {
function directiveNormalize (line 9874) | function directiveNormalize(name) {
function nodesetLinkingFn (line 9923) | function nodesetLinkingFn(
function directiveLinkingFn (line 9930) | function directiveLinkingFn(
function tokenDifference (line 9938) | function tokenDifference(str1, str2) {
function removeComments (line 9954) | function removeComments(jqNodes) {
function identifierForController (line 9975) | function identifierForController(controller, ident) {
function $ControllerProvider (line 9994) | function $ControllerProvider() {
function $DocumentProvider (line 10176) | function $DocumentProvider() {
function $ExceptionHandlerProvider (line 10222) | function $ExceptionHandlerProvider() {
function serializeValue (line 10268) | function serializeValue(v) {
function $HttpParamSerializerProvider (line 10276) | function $HttpParamSerializerProvider() {
function $HttpParamSerializerJQLikeProvider (line 10313) | function $HttpParamSerializerJQLikeProvider() {
function defaultHttpResponseTransform (line 10385) | function defaultHttpResponseTransform(data, headers) {
function isJsonLike (line 10401) | function isJsonLike(str) {
function parseHeaders (line 10412) | function parseHeaders(headers) {
function headersGetter (line 10448) | function headersGetter(headers) {
function transformData (line 10478) | function transformData(data, headers, status, fns) {
function isSuccess (line 10491) | function isSuccess(status) {
function $HttpProvider (line 10502) | function $HttpProvider() {
function $xhrFactoryProvider (line 11634) | function $xhrFactoryProvider() {
function $HttpBackendProvider (line 11659) | function $HttpBackendProvider() {
function createHttpBackend (line 11665) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
function $InterpolateProvider (line 11875) | function $InterpolateProvider() {
function $IntervalProvider (line 12200) | function $IntervalProvider() {
function encodePath (line 12421) | function encodePath(path) {
function parseAbsoluteUrl (line 12432) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
function parseAppUrl (line 12441) | function parseAppUrl(relativeUrl, locationObj) {
function beginsWith (line 12466) | function beginsWith(begin, whole) {
function stripHash (line 12473) | function stripHash(url) {
function trimEmptyHash (line 12478) | function trimEmptyHash(url) {
function stripFile (line 12483) | function stripFile(url) {
function serverBase (line 12488) | function serverBase(url) {
function LocationHtml5Url (line 12502) | function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
function LocationHashbangUrl (line 12581) | function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
function LocationHashbangInHtml5Url (line 12693) | function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
function locationGetter (line 13057) | function locationGetter(property) {
function locationGetterSetter (line 13064) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 13110) | function $LocationProvider() {
function $LogProvider (line 13444) | function $LogProvider() {
function ensureSafeMemberName (line 13600) | function ensureSafeMemberName(name, fullExpression) {
function getStringValue (line 13611) | function getStringValue(name) {
function ensureSafeObject (line 13629) | function ensureSafeObject(obj, fullExpression) {
function ensureSafeFunction (line 13660) | function ensureSafeFunction(obj, fullExpression) {
function ensureSafeAssignContext (line 13674) | function ensureSafeAssignContext(obj, fullExpression) {
function ifDefined (line 14225) | function ifDefined(v, d) {
function plusFn (line 14229) | function plusFn(l, r) {
function isStateless (line 14235) | function isStateless($filter, filterName) {
function findConstantAndWatchExpressions (line 14240) | function findConstantAndWatchExpressions(ast, $filter) {
function getInputs (line 14348) | function getInputs(body) {
function isAssignable (line 14356) | function isAssignable(ast) {
function assignableAST (line 14360) | function assignableAST(ast) {
function isLiteral (line 14366) | function isLiteral(ast) {
function isConstant (line 14374) | function isConstant(ast) {
function ASTCompiler (line 14378) | function ASTCompiler(astBuilder, $filter) {
function ASTInterpreter (line 14883) | function ASTInterpreter(astBuilder, $filter) {
function isPossiblyDangerousMemberName (line 15283) | function isPossiblyDangerousMemberName(name) {
function getValueOf (line 15289) | function getValueOf(value) {
function $ParseProvider (line 15344) | function $ParseProvider() {
function $QProvider (line 15865) | function $QProvider() {
function $$QProvider (line 15874) | function $$QProvider() {
function qFactory (line 15890) | function qFactory(nextTick, exceptionHandler) {
function $$RAFProvider (line 16243) | function $$RAFProvider() { //rAF
function $RootScopeProvider (line 16340) | function $RootScopeProvider() {
function $$SanitizeUriProvider (line 17659) | function $$SanitizeUriProvider() {
function adjustMatcher (line 17750) | function adjustMatcher(matcher) {
function adjustMatchers (line 17778) | function adjustMatchers(matchers) {
function $SceDelegateProvider (line 17856) | function $SceDelegateProvider() {
function $SceProvider (line 18393) | function $SceProvider() {
function $SnifferProvider (line 18805) | function $SnifferProvider() {
function $TemplateRequestProvider (line 18893) | function $TemplateRequestProvider() {
function $$TestabilityProvider (line 18991) | function $$TestabilityProvider() {
function $TimeoutProvider (line 19106) | function $TimeoutProvider() {
function urlResolve (line 19257) | function urlResolve(url) {
function urlIsSameOrigin (line 19291) | function urlIsSameOrigin(requestUrl) {
function $WindowProvider (line 19338) | function $WindowProvider() {
function $$CookieReader (line 19351) | function $$CookieReader($document) {
function $$CookieReaderProvider (line 19393) | function $$CookieReaderProvider() {
function $FilterProvider (line 19497) | function $FilterProvider($provide) {
function filterFilter (line 19687) | function filterFilter() {
function createPredicateFn (line 19724) | function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
function deepCompare (line 19761) | function deepCompare(actual, expected, comparator, matchAgainstAnyProp, ...
function getTypeForFilter (line 19811) | function getTypeForFilter(val) {
function currencyFilter (line 19872) | function currencyFilter($locale) {
function numberFilter (line 19946) | function numberFilter($locale) {
function parse (line 19971) | function parse(numStr) {
function roundNumber (line 20026) | function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
function formatNumber (line 20101) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 20167) | function padNumber(num, digits, trim, negWrap) {
function dateGetter (line 20186) | function dateGetter(name, size, offset, trim, negWrap) {
function dateStrGetter (line 20198) | function dateStrGetter(name, shortForm, standAlone) {
function timeZoneGetter (line 20208) | function timeZoneGetter(date, formats, offset) {
function getFirstThursdayOfYear (line 20218) | function getFirstThursdayOfYear(year) {
function getThursdayThisWeek (line 20226) | function getThursdayThisWeek(datetime) {
function weekGetter (line 20232) | function weekGetter(size) {
function ampmGetter (line 20244) | function ampmGetter(date, formats) {
function eraGetter (line 20248) | function eraGetter(date, formats) {
function longEraGetter (line 20252) | function longEraGetter(date, formats) {
function dateFilter (line 20388) | function dateFilter($locale) {
function jsonFilter (line 20495) | function jsonFilter() {
function limitToFilter (line 20624) | function limitToFilter() {
function orderByFilter (line 20846) | function orderByFilter($parse) {
function ngDirective (line 20967) | function ngDirective(directive) {
function defaultLinkFn (line 21346) | function defaultLinkFn(scope, element, attr) {
function nullFormRenameControl (line 21448) | function nullFormRenameControl(control, name) {
function FormController (line 21496) | function FormController(element, attrs, $scope, $animate, $interpolate) {
function getSetter (line 21970) | function getSetter(expression) {
function stringBasedInputType (line 23077) | function stringBasedInputType(ctrl) {
function textInputType (line 23083) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function baseInputType (line 23088) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function weekParser (line 23198) | function weekParser(isoWeek, existingDate) {
function createDateParser (line 23230) | function createDateParser(regexp, mapping) {
function createDateInputType (line 23280) | function createDateInputType(type, regexp, parseDate, format) {
function badInputChecker (line 23352) | function badInputChecker(scope, element, attr, ctrl) {
function numberInputType (line 23363) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 23417) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 23430) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 23443) | function radioInputType(scope, element, attr, ctrl) {
function parseConstantExpr (line 23465) | function parseConstantExpr($parse, context, name, expression, fallback) {
function checkboxInputType (line 23478) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
function classDirective (line 24061) | function classDirective(name, selector) {
function processParseErrors (line 26665) | function processParseErrors() {
function processSyncValidators (line 26685) | function processSyncValidators() {
function processAsyncValidators (line 26701) | function processAsyncValidators() {
function setValidity (line 26727) | function setValidity(name, isValid) {
function validationDone (line 26733) | function validationDone(allValid) {
function writeToModelIfNeeded (line 26813) | function writeToModelIfNeeded() {
function addSetValidityMethod (line 27389) | function addSetValidityMethod(context) {
function isObjectEmpty (line 27483) | function isObjectEmpty(obj) {
function parseOptionsExpression (line 27775) | function parseOptionsExpression(optionsExp, selectElement, scope) {
function ngOptionsPostLink (line 27937) | function ngOptionsPostLink(scope, selectElement, attr, ctrls) {
function updateElementText (line 28469) | function updateElementText(newText) {
function ngTranscludeCloneAttachFn (line 29795) | function ngTranscludeCloneAttachFn(clone) {
function chromeHack (line 29867) | function chromeHack(optionElement) {
function selectPreLink (line 30229) | function selectPreLink(scope, element, attr, ctrls) {
function selectPostLink (line 30293) | function selectPostLink(scope, element, attrs, ctrls) {
function getDecimals (line 30721) | function getDecimals(n) {
function getVF (line 30727) | function getVF(n, opt_precision) {
FILE: html/lib/bootstrap-submenu/js/bootstrap-submenu.js
function Item (line 28) | function Item(element) {
function SubmenuItem (line 57) | function SubmenuItem(element) {
function Submenupicker (line 116) | function Submenupicker(element) {
FILE: html/lib/bootstrap/bootstrap.js
function transitionEnd (line 34) | function transitionEnd() {
function removeElement (line 126) | function removeElement() {
function Plugin (line 142) | function Plugin(option) {
function Plugin (line 251) | function Plugin(option) {
function Plugin (line 470) | function Plugin(option) {
function getTargetFromTrigger (line 689) | function getTargetFromTrigger($trigger) {
function Plugin (line 701) | function Plugin(option) {
function getParent (line 768) | function getParent($this) {
function clearMenus (line 781) | function clearMenus(e) {
function Plugin (line 874) | function Plugin(option) {
function Plugin (line 1200) | function Plugin(option, _relatedTarget) {
function complete (line 1566) | function complete() {
function Plugin (line 1736) | function Plugin(option) {
function Plugin (line 1845) | function Plugin(option) {
function ScrollSpy (line 1888) | function ScrollSpy(element, options) {
function Plugin (line 2008) | function Plugin(option) {
function next (line 2117) | function next() {
function Plugin (line 2163) | function Plugin(option) {
function Plugin (line 2320) | function Plugin(option) {
FILE: html/lib/d3/d3.js
function d3_documentElement (line 9) | function d3_documentElement(node) {
function d3_window (line 12) | function d3_window(node) {
function d3_ascending (line 46) | function d3_ascending(a, b) {
function d3_number (line 109) | function d3_number(x) {
function d3_numeric (line 112) | function d3_numeric(x) {
function d3_bisector (line 171) | function d3_bisector(compare) {
function d3_transposeLength (line 232) | function d3_transposeLength(d) {
function d3_range_integerScale (line 284) | function d3_range_integerScale(x) {
function d3_class (line 289) | function d3_class(ctor, properties) {
function d3_Map (line 311) | function d3_Map() {
function d3_map_escape (line 344) | function d3_map_escape(key) {
function d3_map_unescape (line 347) | function d3_map_unescape(key) {
function d3_map_has (line 350) | function d3_map_has(key) {
function d3_map_remove (line 353) | function d3_map_remove(key) {
function d3_map_keys (line 356) | function d3_map_keys() {
function d3_map_size (line 361) | function d3_map_size() {
function d3_map_empty (line 366) | function d3_map_empty() {
function map (line 372) | function map(mapType, array, depth) {
function entries (line 396) | function entries(map, depth) {
function d3_Set (line 438) | function d3_Set() {
function d3_identity (line 456) | function d3_identity(d) {
function d3_rebind (line 464) | function d3_rebind(target, source, method) {
function d3_vendorSymbol (line 470) | function d3_vendorSymbol(object, name) {
function d3_noop (line 479) | function d3_noop() {}
function d3_dispatch (line 485) | function d3_dispatch() {}
function d3_dispatch_event (line 500) | function d3_dispatch_event(dispatch) {
function d3_eventPreventDefault (line 523) | function d3_eventPreventDefault() {
function d3_eventSource (line 526) | function d3_eventSource() {
function d3_eventDispatch (line 531) | function d3_eventDispatch(target) {
function d3_selection (line 557) | function d3_selection(groups) {
function d3_selection_selector (line 600) | function d3_selection_selector(selector) {
function d3_selection_selectorAll (line 618) | function d3_selection_selectorAll(selector) {
function d3_selection_attr (line 654) | function d3_selection_attr(name, value) {
function d3_collapse (line 678) | function d3_collapse(s) {
function d3_selection_classedRe (line 698) | function d3_selection_classedRe(name) {
function d3_selection_classes (line 701) | function d3_selection_classes(name) {
function d3_selection_classed (line 704) | function d3_selection_classed(name, value) {
function d3_selection_classedName (line 717) | function d3_selection_classedName(name) {
function d3_selection_style (line 746) | function d3_selection_style(name, value, priority) {
function d3_selection_property (line 767) | function d3_selection_property(name, value) {
function d3_selection_creator (line 806) | function d3_selection_creator(name) {
function d3_selectionRemove (line 826) | function d3_selectionRemove() {
function bind (line 841) | function bind(group, groupData) {
function d3_selection_dataNode (line 911) | function d3_selection_dataNode(data) {
function d3_selection_filter (line 933) | function d3_selection_filter(selector) {
function d3_selection_sortComparator (line 954) | function d3_selection_sortComparator(comparator) {
function d3_selection_each (line 965) | function d3_selection_each(groups, callback) {
function d3_selection_enter (line 997) | function d3_selection_enter(selection) {
function d3_selection_enterInsertBefore (line 1030) | function d3_selection_enterInsertBefore(enter) {
function d3_selection_on (line 1075) | function d3_selection_on(type, listener, capture) {
function d3_selection_onListener (line 1114) | function d3_selection_onListener(listener, argumentz) {
function d3_selection_onFilter (line 1126) | function d3_selection_onFilter(listener, argumentz) {
function d3_event_dragSuppress (line 1136) | function d3_event_dragSuppress(node) {
function d3_mousePoint (line 1164) | function d3_mousePoint(container, e) {
function drag (line 1203) | function drag() {
function dragstart (line 1206) | function dragstart(id, position, subject, move, end) {
function d3_behavior_dragTouchId (line 1250) | function d3_behavior_dragTouchId() {
function d3_sgn (line 1262) | function d3_sgn(x) {
function d3_cross2d (line 1265) | function d3_cross2d(a, b, c) {
function d3_acos (line 1268) | function d3_acos(x) {
function d3_asin (line 1271) | function d3_asin(x) {
function d3_sinh (line 1274) | function d3_sinh(x) {
function d3_cosh (line 1277) | function d3_cosh(x) {
function d3_tanh (line 1280) | function d3_tanh(x) {
function d3_haversin (line 1283) | function d3_haversin(x) {
function zoom (line 1320) | function zoom(g) {
function location (line 1421) | function location(p) {
function point (line 1424) | function point(l) {
function scaleTo (line 1427) | function scaleTo(s) {
function translateTo (line 1430) | function translateTo(p, l) {
function zoomTo (line 1435) | function zoomTo(that, p, l, k) {
function rescale (line 1447) | function rescale() {
function zoomstarted (line 1455) | function zoomstarted(dispatch) {
function zoomed (line 1460) | function zoomed(dispatch) {
function zoomended (line 1468) | function zoomended(dispatch) {
function mousedowned (line 1473) | function mousedowned() {
function touchstarted (line 1488) | function touchstarted() {
function mousewheeled (line 1558) | function mousewheeled() {
function dblclicked (line 1571) | function dblclicked() {
function d3_color (line 1579) | function d3_color() {}
function d3_hsl (line 1584) | function d3_hsl(h, s, l) {
function d3_hsl_rgb (line 1599) | function d3_hsl_rgb(h, s, l) {
function d3_hcl (line 1619) | function d3_hcl(h, c, l) {
function d3_hcl_lab (line 1632) | function d3_hcl_lab(h, c, l) {
function d3_lab (line 1638) | function d3_lab(l, a, b) {
function d3_lab_rgb (line 1653) | function d3_lab_rgb(l, a, b) {
function d3_lab_hcl (line 1660) | function d3_lab_hcl(l, a, b) {
function d3_lab_xyz (line 1663) | function d3_lab_xyz(x) {
function d3_xyz_lab (line 1666) | function d3_xyz_lab(x) {
function d3_xyz_rgb (line 1669) | function d3_xyz_rgb(r) {
function d3_rgb (line 1673) | function d3_rgb(r, g, b) {
function d3_rgbNumber (line 1676) | function d3_rgbNumber(value) {
function d3_rgbString (line 1679) | function d3_rgbString(value) {
function d3_rgb_hex (line 1702) | function d3_rgb_hex(v) {
function d3_rgb_parse (line 1705) | function d3_rgb_parse(format, rgb, hsl) {
function d3_rgb_hsl (line 1741) | function d3_rgb_hsl(r, g, b) {
function d3_rgb_lab (line 1753) | function d3_rgb_lab(r, g, b) {
function d3_rgb_xyz (line 1760) | function d3_rgb_xyz(r) {
function d3_rgb_parseNumber (line 1763) | function d3_rgb_parseNumber(c) {
function d3_functor (line 1920) | function d3_functor(v) {
function d3_xhrType (line 1927) | function d3_xhrType(response) {
function d3_xhr (line 1934) | function d3_xhr(url, mimeType, response, callback) {
function d3_xhr_fixCallback (line 2009) | function d3_xhr_fixCallback(callback) {
function d3_xhrHasResponse (line 2014) | function d3_xhrHasResponse(request) {
function dsv (line 2020) | function dsv(url, row, callback) {
function response (line 2028) | function response(request) {
function typedResponse (line 2031) | function typedResponse(f) {
function token (line 2050) | function token() {
function formatRow (line 2112) | function formatRow(row) {
function formatValue (line 2115) | function formatValue(text) {
function d3_timer (line 2128) | function d3_timer(callback, delay, then) {
function d3_timer_step (line 2146) | function d3_timer_step() {
function d3_timer_mark (line 2163) | function d3_timer_mark() {
function d3_timer_sweep (line 2171) | function d3_timer_sweep() {
function d3_format_precision (line 2184) | function d3_format_precision(x, p) {
function d3_formatPrefix (line 2201) | function d3_formatPrefix(d, i) {
function d3_locale_numberFormat (line 2212) | function d3_locale_numberFormat(locale) {
function d3_format_typeDefault (line 2333) | function d3_format_typeDefault(x) {
function d3_date_utc (line 2337) | function d3_date_utc() {
function d3_time_interval (line 2403) | function d3_time_interval(local, step, number) {
function d3_time_interval_utc (line 2451) | function d3_time_interval_utc(method) {
function d3_locale_timeFormat (line 2511) | function d3_locale_timeFormat(locale) {
function d3_time_formatPad (line 2732) | function d3_time_formatPad(value, fill, width) {
function d3_time_formatRe (line 2736) | function d3_time_formatRe(names) {
function d3_time_formatLookup (line 2739) | function d3_time_formatLookup(names) {
function d3_time_parseWeekdayNumber (line 2744) | function d3_time_parseWeekdayNumber(date, string, i) {
function d3_time_parseWeekNumberSunday (line 2749) | function d3_time_parseWeekNumberSunday(date, string, i) {
function d3_time_parseWeekNumberMonday (line 2754) | function d3_time_parseWeekNumberMonday(date, string, i) {
function d3_time_parseFullYear (line 2759) | function d3_time_parseFullYear(date, string, i) {
function d3_time_parseYear (line 2764) | function d3_time_parseYear(date, string, i) {
function d3_time_parseZone (line 2769) | function d3_time_parseZone(date, string, i) {
function d3_time_expandYear (line 2773) | function d3_time_expandYear(d) {
function d3_time_parseMonthNumber (line 2776) | function d3_time_parseMonthNumber(date, string, i) {
function d3_time_parseDay (line 2781) | function d3_time_parseDay(date, string, i) {
function d3_time_parseDayOfYear (line 2786) | function d3_time_parseDayOfYear(date, string, i) {
function d3_time_parseHour24 (line 2791) | function d3_time_parseHour24(date, string, i) {
function d3_time_parseMinutes (line 2796) | function d3_time_parseMinutes(date, string, i) {
function d3_time_parseSeconds (line 2801) | function d3_time_parseSeconds(date, string, i) {
function d3_time_parseMilliseconds (line 2806) | function d3_time_parseMilliseconds(date, string, i) {
function d3_time_zone (line 2811) | function d3_time_zone(d) {
function d3_time_parseLiteralPercent (line 2815) | function d3_time_parseLiteralPercent(date, string, i) {
function d3_time_formatMulti (line 2820) | function d3_time_formatMulti(formats) {
function d3_adder (line 2851) | function d3_adder() {}
function d3_adderSum (line 2868) | function d3_adderSum(a, b, o) {
function d3_geo_streamGeometry (line 2879) | function d3_geo_streamGeometry(geometry, listener) {
function d3_geo_streamLine (line 2924) | function d3_geo_streamLine(coordinates, listener, closed) {
function d3_geo_streamPolygon (line 2930) | function d3_geo_streamPolygon(coordinates, listener) {
function d3_geo_areaRingStart (line 2959) | function d3_geo_areaRingStart() {
function d3_geo_cartesian (line 2977) | function d3_geo_cartesian(spherical) {
function d3_geo_cartesianDot (line 2981) | function d3_geo_cartesianDot(a, b) {
function d3_geo_cartesianCross (line 2984) | function d3_geo_cartesianCross(a, b) {
function d3_geo_cartesianAdd (line 2987) | function d3_geo_cartesianAdd(a, b) {
function d3_geo_cartesianScale (line 2992) | function d3_geo_cartesianScale(vector, k) {
function d3_geo_cartesianNormalize (line 2995) | function d3_geo_cartesianNormalize(d) {
function d3_geo_spherical (line 3001) | function d3_geo_spherical(cartesian) {
function d3_geo_sphericalEqual (line 3004) | function d3_geo_sphericalEqual(a, b) {
function point (line 3029) | function point(λ, φ) {
function linePoint (line 3034) | function linePoint(λ, φ) {
function lineStart (line 3074) | function lineStart() {
function lineEnd (line 3077) | function lineEnd() {
function ringPoint (line 3082) | function ringPoint(λ, φ) {
function ringStart (line 3090) | function ringStart() {
function ringEnd (line 3093) | function ringEnd() {
function angle (line 3100) | function angle(λ0, λ1) {
function compareRanges (line 3103) | function compareRanges(a, b) {
function withinRange (line 3106) | function withinRange(x, range) {
function d3_geo_centroidPoint (line 3160) | function d3_geo_centroidPoint(λ, φ) {
function d3_geo_centroidPointXYZ (line 3165) | function d3_geo_centroidPointXYZ(x, y, z) {
function d3_geo_centroidLineStart (line 3171) | function d3_geo_centroidLineStart() {
function d3_geo_centroidLineEnd (line 3192) | function d3_geo_centroidLineEnd() {
function d3_geo_centroidRingStart (line 3195) | function d3_geo_centroidRingStart() {
function d3_geo_compose (line 3225) | function d3_geo_compose(a, b) {
function d3_true (line 3234) | function d3_true() {
function d3_geo_clipPolygon (line 3237) | function d3_geo_clipPolygon(segments, compare, clipStartInside, interpol...
function d3_geo_clipPolygonLinkCircular (line 3296) | function d3_geo_clipPolygonLinkCircular(array) {
function d3_geo_clipPolygonIntersection (line 3307) | function d3_geo_clipPolygonIntersection(point, points, other, entry) {
function d3_geo_clip (line 3315) | function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
function d3_geo_clipSegmentLength1 (line 3407) | function d3_geo_clipSegmentLength1(segment) {
function d3_geo_clipBufferListener (line 3410) | function d3_geo_clipBufferListener() {
function d3_geo_clipSort (line 3431) | function d3_geo_clipSort(a, b) {
function d3_geo_clipAntimeridianLine (line 3435) | function d3_geo_clipAntimeridianLine(listener) {
function d3_geo_clipAntimeridianIntersect (line 3474) | function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
function d3_geo_clipAntimeridianInterpolate (line 3478) | function d3_geo_clipAntimeridianInterpolate(from, to, direction, listene...
function d3_geo_pointInPolygon (line 3501) | function d3_geo_pointInPolygon(point, polygon) {
function d3_geo_clipCircle (line 3530) | function d3_geo_clipCircle(radius) {
function d3_geom_clipLine (line 3626) | function d3_geom_clipLine(x0, y0, x1, y1) {
function d3_geo_clipExtent (line 3698) | function d3_geo_clipExtent(x0, y0, x1, y1) {
function d3_geo_conic (line 3832) | function d3_geo_conic(projectAt) {
function d3_geo_conicEqualArea (line 3840) | function d3_geo_conicEqualArea(φ0, φ1) {
function albersUsa (line 3867) | function albersUsa(coordinates) {
function d3_geo_pathAreaRingStart (line 3949) | function d3_geo_pathAreaRingStart() {
function d3_geo_pathBoundsPoint (line 3971) | function d3_geo_pathBoundsPoint(x, y) {
function d3_geo_pathBuffer (line 3977) | function d3_geo_pathBuffer() {
function d3_geo_pathBufferCircle (line 4022) | function d3_geo_pathBufferCircle(radius) {
function d3_geo_pathCentroidPoint (line 4038) | function d3_geo_pathCentroidPoint(x, y) {
function d3_geo_pathCentroidLineStart (line 4043) | function d3_geo_pathCentroidLineStart() {
function d3_geo_pathCentroidLineEnd (line 4057) | function d3_geo_pathCentroidLineEnd() {
function d3_geo_pathCentroidRingStart (line 4060) | function d3_geo_pathCentroidRingStart() {
function d3_geo_pathContext (line 4081) | function d3_geo_pathContext(context) {
function d3_geo_resample (line 4121) | function d3_geo_resample(project) {
function path (line 4201) | function path(object) {
function reset (line 4240) | function reset() {
function d3_geo_pathProjectStream (line 4246) | function d3_geo_pathProjectStream(project) {
function d3_geo_transform (line 4263) | function d3_geo_transform(stream) {
function d3_geo_transformPoint (line 4286) | function d3_geo_transformPoint(stream, point) {
function d3_geo_projection (line 4308) | function d3_geo_projection(project) {
function d3_geo_projectionMutator (line 4313) | function d3_geo_projectionMutator(projectAt) {
function d3_geo_projectionRadians (line 4385) | function d3_geo_projectionRadians(stream) {
function d3_geo_equirectangular (line 4390) | function d3_geo_equirectangular(λ, φ) {
function forward (line 4398) | function forward(coordinates) {
function d3_geo_identityRotation (line 4408) | function d3_geo_identityRotation(λ, φ) {
function d3_geo_rotation (line 4412) | function d3_geo_rotation(δλ, δφ, δγ) {
function d3_geo_forwardRotationλ (line 4415) | function d3_geo_forwardRotationλ(δλ) {
function d3_geo_rotationλ (line 4420) | function d3_geo_rotationλ(δλ) {
function d3_geo_rotationφγ (line 4425) | function d3_geo_rotationφγ(δφ, δγ) {
function circle (line 4439) | function circle() {
function d3_geo_circleInterpolate (line 4469) | function d3_geo_circleInterpolate(radius, precision) {
function d3_geo_circleAngle (line 4486) | function d3_geo_circleAngle(cr, point) {
function graticule (line 4499) | function graticule() {
function lines (line 4505) | function lines() {
function d3_geo_graticuleX (line 4571) | function d3_geo_graticuleX(y0, y1, dy) {
function d3_geo_graticuleY (line 4579) | function d3_geo_graticuleY(x0, x1, dx) {
function d3_source (line 4587) | function d3_source(d) {
function d3_target (line 4590) | function d3_target(d) {
function greatArc (line 4595) | function greatArc() {
function d3_geo_interpolate (line 4622) | function d3_geo_interpolate(x0, y0, x1, y1) {
function d3_geo_lengthLineStart (line 4647) | function d3_geo_lengthLineStart() {
function d3_geo_azimuthal (line 4662) | function d3_geo_azimuthal(scale, angle) {
function d3_geo_conicConformal (line 4688) | function d3_geo_conicConformal(φ0, φ1) {
function d3_geo_conicEquidistant (line 4711) | function d3_geo_conicEquidistant(φ0, φ1) {
function d3_geo_mercator (line 4733) | function d3_geo_mercator(λ, φ) {
function d3_geo_mercatorProjection (line 4739) | function d3_geo_mercatorProjection(project) {
function d3_geo_transverseMercator (line 4780) | function d3_geo_transverseMercator(λ, φ) {
function d3_geom_pointX (line 4798) | function d3_geom_pointX(d) {
function d3_geom_pointY (line 4801) | function d3_geom_pointY(d) {
function hull (line 4807) | function hull(data) {
function d3_geom_hullUpper (line 4829) | function d3_geom_hullUpper(points) {
function d3_geom_hullOrder (line 4837) | function d3_geom_hullOrder(a, b) {
function d3_geom_polygonInside (line 4891) | function d3_geom_polygonInside(p, a, b) {
function d3_geom_polygonIntersect (line 4894) | function d3_geom_polygonIntersect(c, d, a, b) {
function d3_geom_polygonClosed (line 4898) | function d3_geom_polygonClosed(coordinates) {
function d3_geom_voronoiBeach (line 4903) | function d3_geom_voronoiBeach() {
function d3_geom_voronoiCreateBeach (line 4907) | function d3_geom_voronoiCreateBeach(site) {
function d3_geom_voronoiDetachBeach (line 4912) | function d3_geom_voronoiDetachBeach(beach) {
function d3_geom_voronoiRemoveBeach (line 4918) | function d3_geom_voronoiRemoveBeach(beach) {
function d3_geom_voronoiAddBeach (line 4954) | function d3_geom_voronoiAddBeach(site) {
function d3_geom_voronoiLeftBreakPoint (line 5008) | function d3_geom_voronoiLeftBreakPoint(arc, directrix) {
function d3_geom_voronoiRightBreakPoint (line 5020) | function d3_geom_voronoiRightBreakPoint(arc, directrix) {
function d3_geom_voronoiCell (line 5026) | function d3_geom_voronoiCell(site) {
function d3_geom_voronoiCloseCells (line 5039) | function d3_geom_voronoiCloseCells(extent) {
function d3_geom_voronoiHalfEdgeOrder (line 5069) | function d3_geom_voronoiHalfEdgeOrder(a, b) {
function d3_geom_voronoiCircle (line 5072) | function d3_geom_voronoiCircle() {
function d3_geom_voronoiAttachCircle (line 5076) | function d3_geom_voronoiAttachCircle(arc) {
function d3_geom_voronoiDetachCircle (line 5109) | function d3_geom_voronoiDetachCircle(arc) {
function d3_geom_voronoiClipEdges (line 5119) | function d3_geom_voronoiClipEdges(extent) {
function d3_geom_voronoiConnectEdge (line 5129) | function d3_geom_voronoiConnectEdge(edge, extent) {
function d3_geom_voronoiEdge (line 5203) | function d3_geom_voronoiEdge(lSite, rSite) {
function d3_geom_voronoiCreateEdge (line 5208) | function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {
function d3_geom_voronoiCreateBorderEdge (line 5217) | function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {
function d3_geom_voronoiSetEdgeEnd (line 5224) | function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {
function d3_geom_voronoiHalfEdge (line 5235) | function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {
function d3_geom_voronoiRedBlackTree (line 5249) | function d3_geom_voronoiRedBlackTree() {
function d3_geom_voronoiRedBlackNode (line 5252) | function d3_geom_voronoiRedBlackNode(node) {
function d3_geom_voronoiRedBlackRotateLeft (line 5415) | function d3_geom_voronoiRedBlackRotateLeft(tree, node) {
function d3_geom_voronoiRedBlackRotateRight (line 5428) | function d3_geom_voronoiRedBlackRotateRight(tree, node) {
function d3_geom_voronoiRedBlackFirst (line 5441) | function d3_geom_voronoiRedBlackFirst(node) {
function d3_geom_voronoi (line 5445) | function d3_geom_voronoi(sites, bbox) {
function d3_geom_voronoiVertexOrder (line 5474) | function d3_geom_voronoiVertexOrder(a, b) {
function voronoi (line 5480) | function voronoi(data) {
function sites (line 5491) | function sites(data) {
function d3_geom_voronoiTriangleArea (line 5544) | function d3_geom_voronoiTriangleArea(a, b, c) {
function quadtree (line 5562) | function quadtree(data) {
function d3_geom_quadtreeCompatX (line 5657) | function d3_geom_quadtreeCompatX(d) {
function d3_geom_quadtreeCompatY (line 5660) | function d3_geom_quadtreeCompatY(d) {
function d3_geom_quadtreeNode (line 5663) | function d3_geom_quadtreeNode() {
function d3_geom_quadtreeVisit (line 5672) | function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
function d3_geom_quadtreeFind (line 5681) | function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {
function d3_interpolateRgb (line 5718) | function d3_interpolateRgb(a, b) {
function d3_interpolateObject (line 5727) | function d3_interpolateObject(a, b) {
function d3_interpolateNumber (line 5747) | function d3_interpolateNumber(a, b) {
function d3_interpolateString (line 5754) | function d3_interpolateString(a, b) {
function d3_interpolate (line 5788) | function d3_interpolate(a, b) {
function d3_interpolateArray (line 5798) | function d3_interpolateArray(a, b) {
function d3_ease_clamp (line 5849) | function d3_ease_clamp(f) {
function d3_ease_reverse (line 5854) | function d3_ease_reverse(f) {
function d3_ease_reflect (line 5859) | function d3_ease_reflect(f) {
function d3_ease_quad (line 5864) | function d3_ease_quad(t) {
function d3_ease_cubic (line 5867) | function d3_ease_cubic(t) {
function d3_ease_cubicInOut (line 5870) | function d3_ease_cubicInOut(t) {
function d3_ease_poly (line 5876) | function d3_ease_poly(e) {
function d3_ease_sin (line 5881) | function d3_ease_sin(t) {
function d3_ease_exp (line 5884) | function d3_ease_exp(t) {
function d3_ease_circle (line 5887) | function d3_ease_circle(t) {
function d3_ease_elastic (line 5890) | function d3_ease_elastic(a, p) {
function d3_ease_back (line 5898) | function d3_ease_back(s) {
function d3_ease_bounce (line 5904) | function d3_ease_bounce(t) {
function d3_interpolateHcl (line 5908) | function d3_interpolateHcl(a, b) {
function d3_interpolateHsl (line 5919) | function d3_interpolateHsl(a, b) {
function d3_interpolateLab (line 5930) | function d3_interpolateLab(a, b) {
function d3_interpolateRound (line 5939) | function d3_interpolateRound(a, b) {
function d3_transform (line 5955) | function d3_transform(m) {
function d3_transformDot (line 5971) | function d3_transformDot(a, b) {
function d3_transformNormalize (line 5974) | function d3_transformNormalize(a) {
function d3_transformCombine (line 5982) | function d3_transformCombine(a, b, k) {
function d3_interpolateTransformPop (line 5996) | function d3_interpolateTransformPop(s) {
function d3_interpolateTranslate (line 5999) | function d3_interpolateTranslate(ta, tb, s, q) {
function d3_interpolateRotate (line 6013) | function d3_interpolateRotate(ra, rb, s, q) {
function d3_interpolateSkew (line 6024) | function d3_interpolateSkew(wa, wb, s, q) {
function d3_interpolateScale (line 6034) | function d3_interpolateScale(ka, kb, s, q) {
function d3_interpolateTransform (line 6048) | function d3_interpolateTransform(a, b) {
function d3_uninterpolateNumber (line 6062) | function d3_uninterpolateNumber(a, b) {
function d3_uninterpolateClamp (line 6068) | function d3_uninterpolateClamp(a, b) {
function d3_layout_bundlePath (line 6082) | function d3_layout_bundlePath(link) {
function d3_layout_bundleAncestors (line 6095) | function d3_layout_bundleAncestors(node) {
function d3_layout_bundleLeastCommonAncestor (line 6105) | function d3_layout_bundleLeastCommonAncestor(a, b) {
function relayout (line 6117) | function relayout() {
function resort (line 6183) | function resort() {
function repulse (line 6230) | function repulse(node) {
function position (line 6411) | function position(dimension, size) {
function dragmove (line 6440) | function dragmove(d) {
function d3_layout_forceDragstart (line 6446) | function d3_layout_forceDragstart(d) {
function d3_layout_forceDragend (line 6449) | function d3_layout_forceDragend(d) {
function d3_layout_forceMouseover (line 6452) | function d3_layout_forceMouseover(d) {
function d3_layout_forceMouseout (line 6456) | function d3_layout_forceMouseout(d) {
function d3_layout_forceAccumulate (line 6459) | function d3_layout_forceAccumulate(quad, alpha, charges) {
function hierarchy (line 6489) | function hierarchy(root) {
function d3_layout_hierarchyRebind (line 6545) | function d3_layout_hierarchyRebind(object, hierarchy) {
function d3_layout_hierarchyVisitBefore (line 6551) | function d3_layout_hierarchyVisitBefore(node, callback) {
function d3_layout_hierarchyVisitAfter (line 6561) | function d3_layout_hierarchyVisitAfter(node, callback) {
function d3_layout_hierarchyChildren (line 6574) | function d3_layout_hierarchyChildren(d) {
function d3_layout_hierarchyValue (line 6577) | function d3_layout_hierarchyValue(d) {
function d3_layout_hierarchySort (line 6580) | function d3_layout_hierarchySort(a, b) {
function d3_layout_hierarchyLinks (line 6583) | function d3_layout_hierarchyLinks(nodes) {
function position (line 6595) | function position(node, x, dx, dy) {
function depth (line 6610) | function depth(node) {
function partition (line 6618) | function partition(d, i) {
function pie (line 6632) | function pie(data) {
function stack (line 6682) | function stack(data, index) {
function d3_layout_stackX (line 6737) | function d3_layout_stackX(d) {
function d3_layout_stackY (line 6740) | function d3_layout_stackY(d) {
function d3_layout_stackOut (line 6743) | function d3_layout_stackOut(d, y0, y) {
function d3_layout_stackOrderDefault (line 6810) | function d3_layout_stackOrderDefault(data) {
function d3_layout_stackOffsetZero (line 6813) | function d3_layout_stackOffsetZero(data) {
function d3_layout_stackMaxIndex (line 6818) | function d3_layout_stackMaxIndex(array) {
function d3_layout_stackReduceSum (line 6828) | function d3_layout_stackReduceSum(d) {
function d3_layout_stackSum (line 6831) | function d3_layout_stackSum(p, d) {
function histogram (line 6836) | function histogram(data, i) {
function d3_layout_histogramBinSturges (line 6880) | function d3_layout_histogramBinSturges(range, values) {
function d3_layout_histogramBinFixed (line 6883) | function d3_layout_histogramBinFixed(range, n) {
function d3_layout_histogramRange (line 6888) | function d3_layout_histogramRange(values) {
function pack (line 6893) | function pack(d, i) {
function d3_layout_packSort (line 6932) | function d3_layout_packSort(a, b) {
function d3_layout_packInsert (line 6935) | function d3_layout_packInsert(a, b) {
function d3_layout_packSplice (line 6942) | function d3_layout_packSplice(a, b) {
function d3_layout_packIntersects (line 6946) | function d3_layout_packIntersects(a, b) {
function d3_layout_packSiblings (line 6950) | function d3_layout_packSiblings(node) {
function d3_layout_packLink (line 7014) | function d3_layout_packLink(node) {
function d3_layout_packUnlink (line 7017) | function d3_layout_packUnlink(node) {
function d3_layout_packTransform (line 7021) | function d3_layout_packTransform(node, x, y, k) {
function d3_layout_packPlace (line 7031) | function d3_layout_packPlace(a, b, c) {
function tree (line 7047) | function tree(d, i) {
function wrapTree (line 7066) | function wrapTree(root0) {
function firstWalk (line 7090) | function firstWalk(v) {
function secondWalk (line 7106) | function secondWalk(v) {
function apportion (line 7110) | function apportion(v, w, ancestor) {
function sizeNode (line 7140) | function sizeNode(node) {
function d3_layout_treeSeparation (line 7161) | function d3_layout_treeSeparation(a, b) {
function d3_layout_treeLeft (line 7164) | function d3_layout_treeLeft(v) {
function d3_layout_treeRight (line 7168) | function d3_layout_treeRight(v) {
function d3_layout_treeMove (line 7172) | function d3_layout_treeMove(wm, wp, shift) {
function d3_layout_treeShift (line 7180) | function d3_layout_treeShift(v) {
function d3_layout_treeAncestor (line 7189) | function d3_layout_treeAncestor(vim, v, ancestor) {
function cluster (line 7194) | function cluster(d, i) {
function d3_layout_clusterY (line 7234) | function d3_layout_clusterY(children) {
function d3_layout_clusterX (line 7239) | function d3_layout_clusterX(children) {
function d3_layout_clusterLeft (line 7244) | function d3_layout_clusterLeft(node) {
function d3_layout_clusterRight (line 7248) | function d3_layout_clusterRight(node) {
function scale (line 7254) | function scale(children, k) {
function squarify (line 7261) | function squarify(node) {
function stickify (line 7288) | function stickify(node) {
function worst (line 7305) | function worst(row, u) {
function position (line 7316) | function position(row, u, rect, flush) {
function treemap (line 7346) | function treemap(d) {
function padFunction (line 7363) | function padFunction(node) {
function padConstant (line 7367) | function padConstant(node) {
function d3_layout_treemapPadNull (line 7398) | function d3_layout_treemapPadNull(node) {
function d3_layout_treemapPad (line 7406) | function d3_layout_treemapPad(node, padding) {
function d3_scaleExtent (line 7458) | function d3_scaleExtent(domain) {
function d3_scaleRange (line 7462) | function d3_scaleRange(scale) {
function d3_scale_bilinear (line 7465) | function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
function d3_scale_nice (line 7471) | function d3_scale_nice(domain, nice) {
function d3_scale_niceStep (line 7481) | function d3_scale_niceStep(step) {
function d3_scale_polylinear (line 7495) | function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
function d3_scale_linear (line 7513) | function d3_scale_linear(domain, range, interpolate, clamp) {
function d3_scale_linearRebind (line 7565) | function d3_scale_linearRebind(scale, linear) {
function d3_scale_linearNice (line 7568) | function d3_scale_linearNice(domain, m) {
function d3_scale_linearTickRange (line 7573) | function d3_scale_linearTickRange(domain, m) {
function d3_scale_linearTicks (line 7582) | function d3_scale_linearTicks(domain, m) {
function d3_scale_linearTickFormat (line 7585) | function d3_scale_linearTickFormat(domain, m, format) {
function d3_scale_linearPrecision (line 7613) | function d3_scale_linearPrecision(value) {
function d3_scale_linearFormatPrecision (line 7616) | function d3_scale_linearFormatPrecision(type, range) {
function d3_scale_log (line 7623) | function d3_scale_log(linear, base, positive, domain) {
function d3_scale_pow (line 7696) | function d3_scale_pow(linear, exponent, domain) {
function d3_scale_powPow (line 7730) | function d3_scale_powPow(e) {
function d3_scale_ordinal (line 7744) | function d3_scale_ordinal(domain, ranger) {
function d3_scale_quantile (line 7852) | function d3_scale_quantile(domain, range) {
function d3_scale_quantize (line 7888) | function d3_scale_quantize(x0, x1, range) {
function d3_scale_threshold (line 7922) | function d3_scale_threshold(domain, range) {
function d3_scale_identity (line 7948) | function d3_scale_identity(domain) {
function d3_zero (line 7970) | function d3_zero() {
function arc (line 7975) | function arc() {
function circleSegment (line 8053) | function circleSegment(r1, cw) {
function d3_svg_arcInnerRadius (line 8098) | function d3_svg_arcInnerRadius(d) {
function d3_svg_arcOuterRadius (line 8101) | function d3_svg_arcOuterRadius(d) {
function d3_svg_arcStartAngle (line 8104) | function d3_svg_arcStartAngle(d) {
function d3_svg_arcEndAngle (line 8107) | function d3_svg_arcEndAngle(d) {
function d3_svg_arcPadAngle (line 8110) | function d3_svg_arcPadAngle(d) {
function d3_svg_arcSweep (line 8113) | function d3_svg_arcSweep(x0, y0, x1, y1) {
function d3_svg_arcCornerTangents (line 8116) | function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {
function d3_svg_line (line 8121) | function d3_svg_line(projection) {
function d3_svg_lineLinear (line 8188) | function d3_svg_lineLinear(points) {
function d3_svg_lineLinearClosed (line 8191) | function d3_svg_lineLinearClosed(points) {
function d3_svg_lineStep (line 8194) | function d3_svg_lineStep(points) {
function d3_svg_lineStepBefore (line 8200) | function d3_svg_lineStepBefore(points) {
function d3_svg_lineStepAfter (line 8205) | function d3_svg_lineStepAfter(points) {
function d3_svg_lineCardinalOpen (line 8210) | function d3_svg_lineCardinalOpen(points, tension) {
function d3_svg_lineCardinalClosed (line 8213) | function d3_svg_lineCardinalClosed(points, tension) {
function d3_svg_lineCardinal (line 8217) | function d3_svg_lineCardinal(points, tension) {
function d3_svg_lineHermite (line 8220) | function d3_svg_lineHermite(points, tangents) {
function d3_svg_lineCardinalTangents (line 8247) | function d3_svg_lineCardinalTangents(points, tension) {
function d3_svg_lineBasis (line 8257) | function d3_svg_lineBasis(points) {
function d3_svg_lineBasisOpen (line 8273) | function d3_svg_lineBasisOpen(points) {
function d3_svg_lineBasisClosed (line 8293) | function d3_svg_lineBasisClosed(points) {
function d3_svg_lineBundle (line 8312) | function d3_svg_lineBundle(points, tension) {
function d3_svg_lineDot4 (line 8325) | function d3_svg_lineDot4(a, b) {
function d3_svg_lineBasisBezier (line 8329) | function d3_svg_lineBasisBezier(path, x, y) {
function d3_svg_lineSlope (line 8332) | function d3_svg_lineSlope(p0, p1) {
function d3_svg_lineFiniteDifferences (line 8335) | function d3_svg_lineFiniteDifferences(points) {
function d3_svg_lineMonotoneTangents (line 8343) | function d3_svg_lineMonotoneTangents(points) {
function d3_svg_lineMonotone (line 8367) | function d3_svg_lineMonotone(points) {
function d3_svg_lineRadial (line 8376) | function d3_svg_lineRadial(points) {
function d3_svg_area (line 8387) | function d3_svg_area(projection) {
function chord (line 8477) | function chord(d, i) {
function subgroup (line 8481) | function subgroup(self, f, d, i) {
function equals (line 8491) | function equals(a, b) {
function arc (line 8494) | function arc(r, p, a) {
function curve (line 8497) | function curve(r0, p0, r1, p1) {
function d3_svg_chordRadius (line 8527) | function d3_svg_chordRadius(d) {
function diagonal (line 8532) | function diagonal(d, i) {
function d3_svg_diagonalProjection (line 8560) | function d3_svg_diagonalProjection(d) {
function d3_svg_diagonalRadialProjection (line 8570) | function d3_svg_diagonalRadialProjection(projection) {
function symbol (line 8578) | function symbol(d, i) {
function d3_svg_symbolSize (line 8593) | function d3_svg_symbolSize() {
function d3_svg_symbolType (line 8596) | function d3_svg_symbolType() {
function d3_svg_symbolCircle (line 8599) | function d3_svg_symbolCircle(size) {
function d3_selection_interruptNS (line 8648) | function d3_selection_interruptNS(ns) {
function d3_transition (line 8660) | function d3_transition(groups, ns, id) {
function d3_transition_tween (line 8732) | function d3_transition_tween(groups, name, value, tween) {
function attrNull (line 8746) | function attrNull() {
function attrNullNS (line 8749) | function attrNullNS() {
function attrTween (line 8752) | function attrTween(b) {
function attrTweenNS (line 8760) | function attrTweenNS(b) {
function attrTween (line 8772) | function attrTween(d, i) {
function attrTweenNS (line 8778) | function attrTweenNS(d, i) {
function styleNull (line 8796) | function styleNull() {
function styleString (line 8799) | function styleString(b) {
function styleTween (line 8811) | function styleTween(d, i) {
function d3_transition_text (line 8822) | function d3_transition_text(b) {
function d3_transitionNamespace (line 8902) | function d3_transitionNamespace(name) {
function d3_transitionNode (line 8905) | function d3_transitionNode(node, i, ns, id, inherit) {
function axis (line 8982) | function axis(g) {
function d3_svg_axisX (line 9077) | function d3_svg_axisX(selection, x0, x1) {
function d3_svg_axisY (line 9083) | function d3_svg_axisY(selection, y0, y1) {
function brush (line 9091) | function brush(g) {
function redraw (line 9177) | function redraw(g) {
function redrawX (line 9182) | function redrawX(g) {
function redrawY (line 9186) | function redrawY(g) {
function brushstart (line 9190) | function brushstart() {
function d3_time_formatIsoNative (line 9383) | function d3_time_formatIsoNative(date) {
function d3_time_scale (line 9430) | function d3_time_scale(linear, methods, format) {
function d3_time_scaleDate (line 9480) | function d3_time_scaleDate(t) {
function d3_json (line 9539) | function d3_json(request) {
function d3_html (line 9545) | function d3_html(request) {
FILE: html/lib/flotr2/flotr2.amd.js
function Color (line 377) | function Color (r, g, b, a) {
function leftPad (line 568) | function leftPad(n){
function setTick (line 662) | function setTick (name) {
function observe (line 1022) | function observe (object, name, callback) {
function drawChart (line 1222) | function drawChart (series, typeKey) {
function getCanvas (line 1566) | function getCanvas(canvas, name){
function getContext (line 1588) | function getContext(canvas){
function Axis (line 1731) | function Axis (o) {
function log (line 2019) | function log (value, base) {
function exp (line 2026) | function exp (value, base) {
function Series (line 2043) | function Series (o) {
function fill (line 2257) | function fill () {
function stackPos (line 3244) | function stackPos (a, b) {
function isImage (line 3324) | function isImage (i) {
function getImage (line 3858) | function getImage (type, canvas, width, height) {
function circularHorizontalTicks (line 3942) | function circularHorizontalTicks (ticks) {
function drawGridLines (line 3953) | function drawGridLines (ticks, callback) {
function drawVerticalLines (line 3962) | function drawVerticalLines (x) {
function drawHorizontalLines (line 3966) | function drawHorizontalLines (y) {
function e (line 4157) | function e(s, index) {
function setClosest (line 4332) | function setClosest (o) {
function isLeftClick (line 4484) | function isLeftClick (e, type) {
function boundX (line 4488) | function boundX(x, graph) {
function boundY (line 4492) | function boundY(y, graph) {
function drawLabelCircular (line 4830) | function drawLabelCircular (graph, axis, minorTicks) {
function drawLabelNoHtmlText (line 4863) | function drawLabelNoHtmlText (graph, axis, textAlign, textBaseline) {
function drawLabelHtml (line 4922) | function drawLabelHtml (graph, axis) {
function getRowLabel (line 5168) | function getRowLabel(value){
FILE: html/lib/flotr2/flotr2.examples.types.js
function basic (line 39) | function basic (container) {
function basic_stacked (line 73) | function basic_stacked (container) {
function basic_stepped (line 106) | function basic_stepped (container) {
function basic_axis (line 150) | function basic_axis (container) {
function basic_bars (line 227) | function basic_bars (container, horizontal) {
function bars_stacked (line 296) | function bars_stacked (container, horizontal) {
function basic_pie (line 349) | function basic_pie (container) {
function basic_radar (line 397) | function basic_radar (container) {
function basic_bubble (line 435) | function basic_bubble (container) {
function basic_candle (line 468) | function basic_candle (container) {
function basic_candle (line 502) | function basic_candle (container) {
function basic_legend (line 542) | function basic_legend (container) {
function mouse_tracking (line 591) | function mouse_tracking (container) {
function mouse_zoom (line 644) | function mouse_zoom (container) {
function mouse_drag (line 707) | function mouse_drag (container) {
function basic_time (line 782) | function basic_time (container) {
function negative_values (line 846) | function negative_values (container) {
function click_example (line 911) | function click_example (container) {
function download_image (line 962) | function download_image (container) {
function download_data (line 1051) | function download_data (container) {
function advanced_titles (line 1116) | function advanced_titles (container) {
function color_gradients (line 1183) | function color_gradients (container) {
function profile_bars (line 1268) | function profile_bars (container, horizontal) {
function basic_timeline (line 1328) | function basic_timeline (container) {
function advanced_markers (line 1396) | function advanced_markers (container) {
FILE: html/lib/flotr2/flotr2.js
function isDescendant (line 67) | function isDescendant(parent, node) {
function check (line 74) | function check(event) {
function entry (line 172) | function entry(element, type, handler, original, namespaces) {
function Color (line 1708) | function Color (r, g, b, a) {
function leftPad (line 1899) | function leftPad(n){
function setTick (line 1993) | function setTick (name) {
function getEl (line 2072) | function getEl (el) {
function observe (line 2371) | function observe (object, name, callback) {
function drawChart (line 2579) | function drawChart (series, typeKey) {
function getCanvas (line 2933) | function getCanvas(canvas, name){
function getContext (line 2956) | function getContext(canvas){
function Axis (line 3099) | function Axis (o) {
function log (line 3387) | function log (value, base) {
function exp (line 3394) | function exp (value, base) {
function Series (line 3411) | function Series (o) {
function fill (line 3624) | function fill () {
function stackPos (line 4670) | function stackPos (a, b) {
function isImage (line 4750) | function isImage (i) {
function getImage (line 5368) | function getImage (type, canvas, context, width, height, background) {
function circularHorizontalTicks (line 5469) | function circularHorizontalTicks (ticks) {
function drawGridLines (line 5480) | function drawGridLines (ticks, callback) {
function drawVerticalLines (line 5489) | function drawVerticalLines (x) {
function drawHorizontalLines (line 5493) | function drawHorizontalLines (y) {
function e (line 5689) | function e(s, index) {
function setClosest (line 5865) | function setClosest (o) {
function isLeftClick (line 6045) | function isLeftClick (e, type) {
function boundX (line 6049) | function boundX(x, graph) {
function boundY (line 6053) | function boundY(y, graph) {
function drawLabelCircular (line 6391) | function drawLabelCircular (graph, axis, minorTicks) {
function drawLabelNoHtmlText (line 6424) | function drawLabelNoHtmlText (graph, axis, textAlign, textBaseline) {
function drawLabelHtml (line 6483) | function drawLabelHtml (graph, axis) {
function getRowLabel (line 6737) | function getRowLabel(value){
FILE: html/lib/flotr2/flotr2.nolibs.js
function Color (line 366) | function Color (r, g, b, a) {
function leftPad (line 557) | function leftPad(n){
function setTick (line 651) | function setTick (name) {
function getEl (line 730) | function getEl (el) {
function observe (line 1029) | function observe (object, name, callback) {
function drawChart (line 1237) | function drawChart (series, typeKey) {
function getCanvas (line 1591) | function getCanvas(canvas, name){
function getContext (line 1614) | function getContext(canvas){
function Axis (line 1757) | function Axis (o) {
function log (line 2045) | function log (value, base) {
function exp (line 2052) | function exp (value, base) {
function Series (line 2069) | function Series (o) {
function fill (line 2282) | function fill () {
function stackPos (line 3328) | function stackPos (a, b) {
function isImage (line 3408) | function isImage (i) {
function getImage (line 4026) | function getImage (type, canvas, context, width, height, background) {
function circularHorizontalTicks (line 4127) | function circularHorizontalTicks (ticks) {
function drawGridLines (line 4138) | function drawGridLines (ticks, callback) {
function drawVerticalLines (line 4147) | function drawVerticalLines (x) {
function drawHorizontalLines (line 4151) | function drawHorizontalLines (y) {
function e (line 4347) | function e(s, index) {
function setClosest (line 4523) | function setClosest (o) {
function isLeftClick (line 4703) | function isLeftClick (e, type) {
function boundX (line 4707) | function boundX(x, graph) {
function boundY (line 4711) | function boundY(y, graph) {
function drawLabelCircular (line 5049) | function drawLabelCircular (graph, axis, minorTicks) {
function drawLabelNoHtmlText (line 5082) | function drawLabelNoHtmlText (graph, axis, textAlign, textBaseline) {
function drawLabelHtml (line 5141) | function drawLabelHtml (graph, axis) {
function getRowLabel (line 5395) | function getRowLabel(value){
FILE: html/lib/jquery/jquery.js
function isArrayLike (line 529) | function isArrayLike( obj ) {
function Sizzle (line 738) | function Sizzle( selector, context, results, seed ) {
function createCache (line 878) | function createCache() {
function markFunction (line 896) | function markFunction( fn ) {
function assert (line 905) | function assert( fn ) {
function addHandle (line 927) | function addHandle( attrs, handler ) {
function siblingCheck (line 942) | function siblingCheck( a, b ) {
function createInputPseudo (line 969) | function createInputPseudo( type ) {
function createButtonPseudo (line 980) | function createButtonPseudo( type ) {
function createPositionalPseudo (line 991) | function createPositionalPseudo( fn ) {
function testContext (line 1014) | function testContext( context ) {
function setFilters (line 2059) | function setFilters() {}
function toSelector (line 2130) | function toSelector( tokens ) {
function addCombinator (line 2140) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2198) | function elementMatcher( matchers ) {
function multipleContexts (line 2212) | function multipleContexts( selector, contexts, results ) {
function condense (line 2221) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2242) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2335) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2393) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function winnow (line 2731) | function winnow( elements, qualifier, not ) {
function sibling (line 3038) | function sibling( cur, dir ) {
function createOptions (line 3114) | function createOptions( options ) {
function completed (line 3549) | function completed() {
function Data (line 3660) | function Data() {
function dataAttr (line 3870) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4187) | function adjustCSS( elem, prop, valueParts, tween ) {
function getAll (line 4276) | function getAll( context, tag ) {
function setGlobalEval (line 4293) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 4309) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 4430) | function returnTrue() {
function returnFalse (line 4434) | function returnFalse() {
function safeActiveElement (line 4440) | function safeActiveElement() {
function on (line 4446) | function on( elem, types, selector, data, fn, one ) {
function manipulationTarget (line 5137) | function manipulationTarget( elem, content ) {
function disableScript (line 5147) | function disableScript( elem ) {
function restoreScript (line 5151) | function restoreScript( elem ) {
function cloneCopyEvent (line 5163) | function cloneCopyEvent( src, dest ) {
function fixInput (line 5198) | function fixInput( src, dest ) {
function domManip (line 5211) | function domManip( collection, args, callback, ignored ) {
function remove (line 5301) | function remove( elem, selector, keepData ) {
function actualDisplay (line 5592) | function actualDisplay( name, doc ) {
function defaultDisplay (line 5608) | function defaultDisplay( nodeName ) {
function computeStyleTests (line 5704) | function computeStyleTests() {
function curCSS (line 5794) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 5844) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 5881) | function vendorPropName( name ) {
function setPositiveNumber (line 5900) | function setPositiveNumber( elem, value, subtract ) {
function augmentWidthOrHeight (line 5912) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight (line 5956) | function getWidthOrHeight( elem, name, extra ) {
function showHide (line 6014) | function showHide( elements, show ) {
function Tween (line 6353) | function Tween( elem, options, prop, end, easing ) {
function createFxNow (line 6477) | function createFxNow() {
function genFx (line 6485) | function genFx( type, includeWidth ) {
function createTween (line 6505) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 6519) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 6655) | function propFilter( props, specialEasing ) {
function Animation (line 6692) | function Animation( elem, properties, options ) {
function getClass (line 7381) | function getClass( elem ) {
function addToPrefiltersOrTransports (line 8053) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 8087) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 8116) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 8136) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 8194) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 8699) | function done( status, nativeStatusText, responses, headers ) {
function buildParams (line 8952) | function buildParams( prefix, obj, traditional, add ) {
function getWindow (line 9518) | function getWindow( elem ) {
FILE: html/lib/jquery/jquery.slim.js
function DOMEval (line 66) | function DOMEval( code, doc ) {
function isArrayLike (line 510) | function isArrayLike( obj ) {
function Sizzle (line 742) | function Sizzle( selector, context, results, seed ) {
function createCache (line 881) | function createCache() {
function markFunction (line 899) | function markFunction( fn ) {
function assert (line 908) | function assert( fn ) {
function addHandle (line 930) | function addHandle( attrs, handler ) {
function siblingCheck (line 945) | function siblingCheck( a, b ) {
function createInputPseudo (line 971) | function createInputPseudo( type ) {
function createButtonPseudo (line 982) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 993) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1021) | function createPositionalPseudo( fn ) {
function testContext (line 1044) | function testContext( context ) {
function setFilters (line 2100) | function setFilters() {}
function toSelector (line 2171) | function toSelector( tokens ) {
function addCombinator (line 2181) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2243) | function elementMatcher( matchers ) {
function multipleContexts (line 2257) | function multipleContexts( selector, contexts, results ) {
function condense (line 2266) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2287) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2380) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2438) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function winnow (line 2776) | function winnow( elements, qualifier, not ) {
function sibling (line 3072) | function sibling( cur, dir ) {
function createOptions (line 3148) | function createOptions( options ) {
function Identity (line 3373) | function Identity( v ) {
function Thrower (line 3376) | function Thrower( ex ) {
function resolve (line 3440) | function resolve( depth, deferred, handler, special ) {
function completed (line 3806) | function completed() {
function Data (line 3917) | function Data() {
function dataAttr (line 4086) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4396) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4457) | function getDefaultDisplay( elem ) {
function showHide (line 4480) | function showHide( elements, show ) {
function getAll (line 4586) | function getAll( context, tag ) {
function setGlobalEval (line 4603) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 4619) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 4740) | function returnTrue() {
function returnFalse (line 4744) | function returnFalse() {
function safeActiveElement (line 4750) | function safeActiveElement() {
function on (line 4756) | function on( elem, types, selector, data, fn, one ) {
function manipulationTarget (line 5439) | function manipulationTarget( elem, content ) {
function disableScript (line 5450) | function disableScript( elem ) {
function restoreScript (line 5454) | function restoreScript( elem ) {
function cloneCopyEvent (line 5466) | function cloneCopyEvent( src, dest ) {
function fixInput (line 5501) | function fixInput( src, dest ) {
function domManip (line 5514) | function domManip( collection, args, callback, ignored ) {
function remove (line 5604) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 5917) | function computeStyleTests() {
function curCSS (line 5976) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6023) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6059) | function vendorPropName( name ) {
function setPositiveNumber (line 6078) | function setPositiveNumber( elem, value, subtract ) {
function augmentWidthOrHeight (line 6090) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight (line 6134) | function getWidthOrHeight( elem, name, extra ) {
function getClass (line 6730) | function getClass( elem ) {
function buildParams (line 7407) | function buildParams( prefix, obj, traditional, add ) {
function getWindow (line 7569) | function getWindow( elem ) {
FILE: html/lib/nvd3/nv.d3.js
function layer (line 203) | function layer(selection) {
function initTooltip (line 756) | function initTooltip() {
function nvtooltip (line 773) | function nvtooltip() {
function symbol (line 1376) | function symbol(d,i) {
function chart (line 1579) | function chart(selection) {
function chart (line 1958) | function chart(selection) {
function chart (line 2283) | function chart(selection) {
function chart (line 2509) | function chart(selection) {
function chart (line 2749) | function chart(selection) {
function chart (line 2967) | function chart(selection) {
function chart (line 3242) | function chart(selection) {
function indexify (line 3704) | function indexify(idx, data) {
function chart (line 3839) | function chart(selection) {
function chart (line 4115) | function chart(selection) {
function chart (line 4369) | function chart(selection) {
function chart (line 4520) | function chart(selection) {
function chart (line 4876) | function chart(selection) {
function chart (line 5129) | function chart(selection) {
function chart (line 5497) | function chart(selection) {
function chart (line 5900) | function chart(selection) {
function chart (line 6175) | function chart(selection) {
function chart (line 6859) | function chart(selection) {
function chart (line 7439) | function chart(selection) {
function chart (line 7915) | function chart(selection) {
function chart (line 8346) | function chart(selection) {
function chart (line 8747) | function chart(selection) {
function chart (line 9084) | function chart(selection) {
function chart (line 9633) | function chart(selection) {
function chart (line 9865) | function chart(selection) {
function chart (line 10365) | function chart(selection) {
function chart (line 10633) | function chart(selection) {
function chart (line 11072) | function chart(selection) {
function chart (line 11305) | function chart(selection) {
function chart (line 11871) | function chart(selection) {
function chart (line 12209) | function chart(selection) {
function chart (line 12348) | function chart(selection) {
function chart (line 12581) | function chart(selection) {
function chart (line 12960) | function chart(selection) {
function chart (line 13462) | function chart(selection) {
function chart (line 13680) | function chart(selection) {
FILE: html/lib/seiyria-bootstrap-slider/bootstrap-slider.js
function _typeof (line 6) | function _typeof(obj) { return obj && typeof Symbol !== "undefined" && o...
function noop (line 66) | function noop() {}
function defineBridget (line 70) | function defineBridget($) {
function createNewSlider (line 302) | function createNewSlider(element, options) {
Condensed preview — 137 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,671K chars).
[
{
"path": ".gitattributes",
"chars": 67,
"preview": "dist/*\tmerge=ours\ncubesviewer/cubesviewer.templates.js merge=ours\n"
},
{
"path": ".gitignore",
"chars": 472,
"preview": "*.py[cod]\n\n# C extensions\n*.so\n\n# Packages\n*.egg\n*.egg-info\n#dist\nbuild\neggs\nparts\nbin\nvar\nsdist\ndevelop-eggs\n.installed"
},
{
"path": "AUTHORS.txt",
"chars": 286,
"preview": "Authors\n=======\n\nCubesViewer by Jose Juan Montes.\n\nDevelopment:\n\n* José Juan Montes <jjmontes@gmail.com>\n https://twitt"
},
{
"path": "CHANGES.txt",
"chars": 6803,
"preview": "[2.0.3]\n\n * Fixed chart figure export (was not working). Chart images can again be exported as PNG.\n * Fixed serie"
},
{
"path": "Gruntfile.js",
"chars": 4926,
"preview": "module.exports = function(grunt) {\n\n grunt.initConfig({\n pkg: grunt.file.readJSON('package.json'),\n\n concat: {\n "
},
{
"path": "LICENSE.txt",
"chars": 1107,
"preview": "CubesViewer\nCopyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n\nPermission is hereby granted, free o"
},
{
"path": "README.md",
"chars": 6270,
"preview": "CubesViewer - OLAP Visual Viewer and Explore Tool\n=================================================\n\nAbout\n-----\n\nCubesV"
},
{
"path": "RELEASE-NOTES.md",
"chars": 5323,
"preview": "\nCubesViewer 2.0 Release Notes\n=============================\n\nCubesViewer is a visual, web-based tool application for ex"
},
{
"path": "TODO.txt",
"chars": 8032,
"preview": "Consider contributing to CubesViewer! This is a possible roadmap (reverse order).\n\n[ROADMAP]\n\n * Support multiple ser"
},
{
"path": "bower.json",
"chars": 1139,
"preview": "{\n \"name\": \"cubesviewer\",\n \"description\": \"CubesViewer JS client app\",\n \"main\": \"cubesviewer\",\n \"authors\": [\n \"Jo"
},
{
"path": "cubesviewer/angular-bootstrap-submenu/angular-bootstrap-submenu.js",
"chars": 1497,
"preview": "/*\n * angular-bootstrap-submenu\n * Copyright (c) 2016 Jose Juan Montes\n *\n * Permission is hereby granted, free of charg"
},
{
"path": "cubesviewer/core/cubesviewer.js",
"chars": 7221,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/cubes/cache.js",
"chars": 4296,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/cubes/cubes-cvextensions.js",
"chars": 6421,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/cubes/cubes-service.js",
"chars": 9527,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/cubes/cubes.js",
"chars": 27003,
"preview": "/* Cubes.js\n *\n * JavaScript library for Cubes OLAP.\n *\n */\n\n(function(){\n\n // Light-weight \"underscore\" replacements"
},
{
"path": "cubesviewer/cubesviewer.less",
"chars": 8642,
"preview": "/*\n * Cubesviewer CSS\n */\n\n.cv-bootstrap {\n\n @import \"bower_components/bootstrap/less/bootstrap.less\";\n @import \"b"
},
{
"path": "cubesviewer/cubesviewer.templates.js",
"chars": 80818,
"preview": "angular.module('cv').run(['$templateCache', function($templateCache) {\n 'use strict';\n\n $templateCache.put('dialog/dia"
},
{
"path": "cubesviewer/dialog/dialog.html",
"chars": 646,
"preview": " <div class=\"modal-header\">\n <button type=\"button\" ng-click=\"close()\" class=\"close\" data-dismiss=\"modal\" aria-label="
},
{
"path": "cubesviewer/dialog/dialog.js",
"chars": 2669,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/ga/googleanalytics.js",
"chars": 3083,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/server/reststore.js",
"chars": 6840,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/studio/about.html",
"chars": 1435,
"preview": "<div class=\"modal fade\" id=\"cvAboutModal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"\">\n <div class=\"modal-dialog\" ro"
},
{
"path": "cubesviewer/studio/localeswitcher.js.old",
"chars": 3070,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/studio/panel.html",
"chars": 1769,
"preview": "<div class=\"cv-bootstrap cv-gui-viewcontainer\" ng-controller=\"CubesViewerStudioViewController\">\n\n <div class=\"panel p"
},
{
"path": "cubesviewer/studio/rename.html",
"chars": 870,
"preview": " <div class=\"modal-header\">\n <button type=\"button\" ng-click=\"close();\" class=\"close\" data-dismiss=\"modal\" aria-label"
},
{
"path": "cubesviewer/studio/serialize-add.html",
"chars": 842,
"preview": " <div class=\"modal-header\">\n <button type=\"button\" ng-click=\"close()\" class=\"close\" data-dismiss=\"modal\" aria-label="
},
{
"path": "cubesviewer/studio/serialize-view.html",
"chars": 743,
"preview": " <div class=\"modal-header\">\n <button type=\"button\" ng-click=\"close()\" class=\"close\" data-dismiss=\"modal\" aria-label="
},
{
"path": "cubesviewer/studio/serialize.js",
"chars": 3657,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/studio/serverinfo.html",
"chars": 1496,
"preview": "<div class=\"modal fade\" id=\"cvServerInfo\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"\">\n <div class=\"modal-dialog\" ro"
},
{
"path": "cubesviewer/studio/studio.html",
"chars": 6616,
"preview": "<div class=\"cv-bootstrap\" ng-controller=\"CubesViewerStudioController\">\n\n <div class=\"cv-gui-panel hidden-print\">\n\n "
},
{
"path": "cubesviewer/studio/studio.js",
"chars": 12981,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/alerts.html",
"chars": 1148,
"preview": "<div>\n\n <div ng-if=\"view.requestFailed\" class=\"alert alert-dismissable alert-danger\" style=\"margin-bottom: 5px;\">\n "
},
{
"path": "cubesviewer/views/cube/chart/chart-bars-horizontal.js",
"chars": 5820,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/chart/chart-bars-vertical.js",
"chars": 5144,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/chart/chart-common.html",
"chars": 2500,
"preview": "<div ng-show=\"(view.grid.data.length > 0 && view.params.yaxis != null) && (!(view.params.charttype == 'pie' && view.grid"
},
{
"path": "cubesviewer/views/cube/chart/chart-lines.js",
"chars": 8748,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/chart/chart-pie.js",
"chars": 4703,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/chart/chart-radar.js",
"chars": 3771,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/chart/chart-sunburst.js",
"chars": 15721,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2013 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/chart/chart.html",
"chars": 4103,
"preview": "<div ng-controller=\"CubesViewerViewsCubeChartController as chartCtrl\">\n\n <div ng-if=\"view.params.charttype == 'pie'\">"
},
{
"path": "cubesviewer/views/cube/chart/chart.js",
"chars": 8130,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/cube-menu-drilldown.html",
"chars": 1968,
"preview": " <button class=\"btn btn-primary btn-sm dropdown-toggle drilldownbutton\" ng-disabled=\"view.params.mode == 'facts'\" type="
},
{
"path": "cubesviewer/views/cube/cube-menu-filter.html",
"chars": 4799,
"preview": " <button class=\"btn btn-primary btn-sm dropdown-toggle cutbutton\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n "
},
{
"path": "cubesviewer/views/cube/cube-menu-panel.html",
"chars": 1491,
"preview": " <button class=\"btn btn-primary btn-sm dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n <i class"
},
{
"path": "cubesviewer/views/cube/cube-menu-view.html",
"chars": 8874,
"preview": " <button class=\"btn btn-primary btn-sm dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\" data-submenu>\n <i class"
},
{
"path": "cubesviewer/views/cube/cube.html",
"chars": 11684,
"preview": "<div class=\"cv-view-panel\" ng-controller=\"CubesViewerViewsCubeController as cubeView\" >\n\n <div ng-if=\"view.state == 3"
},
{
"path": "cubesviewer/views/cube/cube.js",
"chars": 17097,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/explore/explore.html",
"chars": 845,
"preview": "<div ng-controller=\"CubesViewerViewsCubeExploreController\">\n\n <!-- ($(view.container).find('.cv-view-viewdata').child"
},
{
"path": "cubesviewer/views/cube/explore/explore.js",
"chars": 10689,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/export.js",
"chars": 5235,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/facts/facts.html",
"chars": 1055,
"preview": "<div ng-controller=\"CubesViewerViewsCubeFactsController\">\n\n <!-- ($(view.container).find('.cv-view-viewdata').childre"
},
{
"path": "cubesviewer/views/cube/facts/facts.js",
"chars": 9471,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/filter/datefilter.html",
"chars": 5141,
"preview": "<div class=\"cv-view-viewinfo-date\">\n <div ng-repeat=\"datefilter in view.params.datefilters\" ng-controller=\"CubesViewe"
},
{
"path": "cubesviewer/views/cube/filter/datefilter.js",
"chars": 4112,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/filter/dimension.html",
"chars": 6249,
"preview": "<div ng-controller=\"CubesViewerViewsCubeFilterDimensionController\">\n\n <div class=\"panel panel-default panel-outline h"
},
{
"path": "cubesviewer/views/cube/filter/dimension.js",
"chars": 7026,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/filter/rangefilter.js.old",
"chars": 9182,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/series/operations.js",
"chars": 3137,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/cube/series/series.html",
"chars": 1780,
"preview": "<div ng-controller=\"CubesViewerViewsCubeSeriesController\">\n\n <!-- ($(view.container).find('.cv-view-viewdata').childr"
},
{
"path": "cubesviewer/views/cube/series/series.js",
"chars": 9660,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/undo.js",
"chars": 3279,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "cubesviewer/views/views.js",
"chars": 4227,
"preview": "/*\n * CubesViewer\n * Copyright (c) 2012-2016 Jose Juan Montes, see AUTHORS for more details\n *\n * Permission is hereby g"
},
{
"path": "doc/guide/cubesviewer-embed.md",
"chars": 5906,
"preview": "CubesViewer - OLAP Visual Viewer and Explore Tool\n=================================================\n\nEmbedding CubesView"
},
{
"path": "doc/guide/cubesviewer-model.md",
"chars": 6583,
"preview": "CubesViewer - OLAP Visual Viewer and Explore Tool\n=================================================\n\nCubesViewer model o"
},
{
"path": "doc/guide/cubesviewer-quickstart.md",
"chars": 3513,
"preview": "CubesViewer - Quickstart\n========================\n\nHello Cubes!\n------------\n\nCubesViewer is a client-side HTML5 applica"
},
{
"path": "doc/guide/cubesviewer-server-installation.md",
"chars": 7944,
"preview": "CubesViewer - OLAP Visual Viewer and Explore Tool\n=================================================\n\nInstalling the full"
},
{
"path": "doc/guide/cubesviewer-user-main.md",
"chars": 877,
"preview": "CubesViewer - OLAP Visual Viewer and Explore Tool\n=================================================\n\nUser Guide\n--------"
},
{
"path": "doc/guide/index.md",
"chars": 1172,
"preview": "CubesViewer - OLAP Visual Viewer and Explore Tool\n=================================================\n\n[CubesViewer](https"
},
{
"path": "doc/images/icon/browserconfig.xml",
"chars": 387,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<browserconfig>\r\n <msapplication>\r\n <tile>\r\n <square70x70logo src=\"/mst"
},
{
"path": "doc/images/icon/manifest.json",
"chars": 721,
"preview": "{\n\t\"name\": \"CubesViewer\",\n\t\"icons\": [\n\t\t{\n\t\t\t\"src\": \"\\/android-chrome-36x36.png\",\n\t\t\t\"sizes\": \"36x36\",\n\t\t\t\"type\": \"image"
},
{
"path": "doc/jsdoc/jsdoc.conf.json",
"chars": 208,
"preview": "{\n \"templates\": {\n \"default\": {\n \"outputSourceFiles\": true,\n \"includeDate\": false,\n \"layoutFile\": \"do"
},
{
"path": "doc/jsdoc/layout.tmpl",
"chars": 1049,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <title>CubesViewer Doc: <?js= title ?></title>\n\n "
},
{
"path": "html/cvapp.css",
"chars": 583,
"preview": "/*\n * Cubesviewer sites CSS\n * This file must not be included needed if you are embedding cubesviewer in your site, as i"
},
{
"path": "html/lib/angular/angular.js",
"chars": 1148253,
"preview": "/**\n * @license AngularJS v1.5.5\n * (c) 2010-2016 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "html/lib/angular-bootstrap/ui-bootstrap-tpls.js",
"chars": 260011,
"preview": "/*\n * angular-ui-bootstrap\n * http://angular-ui.github.io/bootstrap/\n\n * Version: 1.3.2 - 2016-04-14\n * License: MIT\n */"
},
{
"path": "html/lib/angular-bootstrap-slider/slider.js",
"chars": 10353,
"preview": "(function(factory) {\n if (typeof define === 'function' && define.amd) {\n define(['angular', 'bootstrapSlider']"
},
{
"path": "html/lib/angular-cookies/angular-cookies.js",
"chars": 9739,
"preview": "/**\n * @license AngularJS v1.5.5\n * (c) 2010-2016 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window"
},
{
"path": "html/lib/angular-ui-grid/animation.less",
"chars": 1937,
"preview": "/*\n Animation example, for spinners\n*/\n.ui-grid-animate-spin {\n -moz-animation: ui-grid-spin 2s infinite linear;\n -o"
},
{
"path": "html/lib/angular-ui-grid/body.less",
"chars": 1442,
"preview": "\n.ui-grid-render-container {\n position: inherit;\n // overflow: hidden;\n\n .border-radius(0, @gridBorderRadius, @gridBo"
},
{
"path": "html/lib/angular-ui-grid/bootstrap/bootstrap.less",
"chars": 3857,
"preview": "/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://gi"
},
{
"path": "html/lib/angular-ui-grid/cell.less",
"chars": 877,
"preview": "@import 'variables';\n\n.ui-grid-cell {\n overflow: hidden;\n // position: absolute;\n // position: relative; // NOTE: rem"
},
{
"path": "html/lib/angular-ui-grid/cellnav/less/cellNav.less",
"chars": 541,
"preview": "@import '../../../less/variables';\n@import (reference) '../../../less/bootstrap/bootstrap';\n\n// .ui-grid-cell-contents:f"
},
{
"path": "html/lib/angular-ui-grid/edit/less/edit.less",
"chars": 451,
"preview": "@import '../../../less/variables';\n\ndiv.ui-grid-cell {\n input {\n border-radius: inherit;\n padding: 0;\n width: "
},
{
"path": "html/lib/angular-ui-grid/elements.less",
"chars": 5975,
"preview": "/*---------------------------------------------------\n LESS Elements 0.9\n ------------------------------------------"
},
{
"path": "html/lib/angular-ui-grid/expandable/less/expandable.less",
"chars": 464,
"preview": "@import '../../../less/variables';\n\n.expandableRow {\n .ui-grid-row {\n\n &:nth-child(odd) .ui-grid-cell {\n backgr"
},
{
"path": "html/lib/angular-ui-grid/exporter/less/exporter.less",
"chars": 65,
"preview": "@import '../../../less/variables';\n\n.ui-grid-exporter-header {\n}\n"
},
{
"path": "html/lib/angular-ui-grid/footer.less",
"chars": 1751,
"preview": "\n.ui-grid-footer-panel-background {\n .gradient(@headerBackgroundColor, @headerGradientStart, @headerGradientStop);\n}\n\n@"
},
{
"path": "html/lib/angular-ui-grid/goups.less",
"chars": 509,
"preview": "\n@topPanelRadius: @gridBorderRadius - @gridBorderWidth;\n\n.ui-grid-group-panel {\n .gradient(@headerBackgroundColor, @hea"
},
{
"path": "html/lib/angular-ui-grid/grid.less",
"chars": 1790,
"preview": "\n.ui-grid {\n border: @gridBorderWidth solid @borderColor;\n box-sizing: content-box; // If bootstrap (or another includ"
},
{
"path": "html/lib/angular-ui-grid/grouping/less/grouping.less",
"chars": 97,
"preview": "@import '../../../less/variables';\n\n.ui-grid-tree-header-row {\n font-weight: bold !important;\n}\n"
},
{
"path": "html/lib/angular-ui-grid/header.less",
"chars": 4406,
"preview": "\n.ui-grid-top-panel-background {\n .gradient(@headerBackgroundColor, @headerGradientStart, @headerGradientStop);\n}\n\n@top"
},
{
"path": "html/lib/angular-ui-grid/icons.less",
"chars": 1596,
"preview": "@font-face {\n font-family: 'ui-grid';\n src: url('@{font-path}ui-grid.eot');\n src: url('@{font-path}ui-grid.eot#iefix'"
},
{
"path": "html/lib/angular-ui-grid/importer/less/importer.less",
"chars": 65,
"preview": "@import '../../../less/variables';\n\n.ui-grid-importer-header {\n}\n"
},
{
"path": "html/lib/angular-ui-grid/main.less",
"chars": 261,
"preview": "@import (once, reference) 'bootstrap/bootstrap';\n@import 'grid';\n@import 'header';\n@import 'body';\n@import 'cell';\n@impo"
},
{
"path": "html/lib/angular-ui-grid/menu.less",
"chars": 2062,
"preview": ".ui-grid-menu-button {\n z-index: 2;\n position: absolute;\n right: 0;\n top: 0;\n background: @headerBackgroundColor;\n "
},
{
"path": "html/lib/angular-ui-grid/move-columns/less/colMovable.less",
"chars": 222,
"preview": "@import '../../../less/variables';\n\n.movingColumn {\n position: absolute;\n top: 0;\n border: 1px solid @borderColor;\n "
},
{
"path": "html/lib/angular-ui-grid/pagination/less/pagination.less",
"chars": 2402,
"preview": "@import \"../../../less/variables\";\n@import \"../../../less/elements\";\n@import (reference) \"../../../less/bootstrap/bootst"
},
{
"path": "html/lib/angular-ui-grid/pinning/less/pinning.less",
"chars": 2812,
"preview": "@import '../../../less/variables';\n\n.ui-grid-pinned-container {\n position: absolute;\n display: inline;\n top: 0;\n\n &."
},
{
"path": "html/lib/angular-ui-grid/resize-columns/less/column-resizer.less",
"chars": 905,
"preview": "@import '../../../less/variables';\n\n.ui-grid-column-resizer {\n top: 0;\n bottom: 0;\n width: 5px;\n position: absolute;"
},
{
"path": "html/lib/angular-ui-grid/row-edit/less/rowEdit.less",
"chars": 299,
"preview": "@import '../../../less/variables';\n\n.ui-grid-row-saving {\n .ui-grid-cell {\n color: @rowSavingForeground !important"
},
{
"path": "html/lib/angular-ui-grid/rtl.less",
"chars": 1268,
"preview": "/*\n* RTL Styles\n*/\n\n.ui-grid[dir=rtl] {\n\n .ui-grid-header-cell,\n .ui-grid-footer-cell,\n .ui-grid-cell {\n float: ri"
},
{
"path": "html/lib/angular-ui-grid/selection/less/selection.less",
"chars": 525,
"preview": "@import '../../../less/variables';\n\n.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {\n background-col"
},
{
"path": "html/lib/angular-ui-grid/sorting.less",
"chars": 561,
"preview": "// .ui-grid-sortarrow {\n// fill: @sortArrowBackgroundColor; \n// stroke: @sortArrowBorderColor; \n// stroke-linejoin"
},
{
"path": "html/lib/angular-ui-grid/tree-base/less/tree-base.less",
"chars": 126,
"preview": "@import '../../../less/variables';\n\n.ui-grid-tree-row-header-buttons.ui-grid-tree-header {\n cursor: pointer;\n opacity:"
},
{
"path": "html/lib/angular-ui-grid/tree-view/less/tree-view.less",
"chars": 213,
"preview": "@import '../../../less/variables';\n\n.ui-grid-tree-header-row {\n font-weight: bold !important;\n}\n.ui-grid-tree-header-ro"
},
{
"path": "html/lib/angular-ui-grid/ui-grid.css",
"chars": 53694,
"preview": "/*!\n * ui-grid - v3.1.1 - 2016-02-09\n * Copyright (c) 2016 ; License: MIT \n */\n#ui-grid-twbs #ui-grid-twbs .form-horizon"
},
{
"path": "html/lib/angular-ui-grid/ui-grid.js",
"chars": 1070589,
"preview": "/*!\n * ui-grid - v3.1.1 - 2016-02-09\n * Copyright (c) 2016 ; License: MIT \n */\n\n(function () {\n 'use strict';\n angular"
},
{
"path": "html/lib/angular-ui-grid/validate/less/validate.less",
"chars": 104,
"preview": "@import '../../../less/variables';\n\ndiv.ui-grid-cell-contents.invalid {\n border: @invalidValueBorder;\n}"
},
{
"path": "html/lib/angular-ui-grid/variables.less",
"chars": 2045,
"preview": "\n/* This file contains variable declarations (do not remove this line) */\n\n/*-- VARIABLES (DO NOT REMOVE THESE COMMENTS)"
},
{
"path": "html/lib/bootstrap/bootstrap-theme.css",
"chars": 26132,
"preview": "/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://gi"
},
{
"path": "html/lib/bootstrap/bootstrap.css",
"chars": 146082,
"preview": "/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://gi"
},
{
"path": "html/lib/bootstrap/bootstrap.js",
"chars": 68954,
"preview": "/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under the MIT license"
},
{
"path": "html/lib/bootstrap/npm.js",
"chars": 484,
"preview": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequ"
},
{
"path": "html/lib/bootstrap-submenu/css/bootstrap-submenu.css",
"chars": 6135,
"preview": "/*!\n * Bootstrap-submenu v2.0.4 (https://vsn4ik.github.io/bootstrap-submenu/)\n * Copyright 2014-2016 Vasily A. (https://"
},
{
"path": "html/lib/bootstrap-submenu/js/bootstrap-submenu.js",
"chars": 4773,
"preview": "/*!\n * Bootstrap-submenu v2.0.4 (https://vsn4ik.github.io/bootstrap-submenu/)\n * Copyright 2014-2016 Vasily A. (https://"
},
{
"path": "html/lib/d3/d3.js",
"chars": 336820,
"preview": "!function() {\n var d3 = {\n version: \"3.5.16\"\n };\n var d3_arraySlice = [].slice, d3_array = function(list) {\n re"
},
{
"path": "html/lib/flotr2/CONTRIBUTING.md",
"chars": 747,
"preview": "# Flotr2 Contribution Guidelines\n\nFlotr2 requires community involvement to be a successful project. Please \nreach out v"
},
{
"path": "html/lib/flotr2/README.md",
"chars": 2307,
"preview": "Flotr2\n======\n\nThe Canvas graphing library.\n\n {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymo"
},
{
"path": "html/lib/flotr2/flotr2.examples.types.js",
"chars": 29937,
"preview": "(function () {\n\nvar ExampleList = function () {\n\n // Map of examples.\n this.examples = {};\n\n};\n\nExampleList.prototype "
},
{
"path": "html/lib/flotr2/flotr2.js",
"chars": 229641,
"preview": "/*!\n * bean.js - copyright Jacob Thornton 2011\n * https://github.com/fat/bean\n * MIT License\n * special thanks to:\n "
},
{
"path": "html/lib/flotr2/flotr2.nolibs.js",
"chars": 179460,
"preview": "/**\n * Flotr2 (c) 2012 Carl Sutherland\n * MIT License\n * Special thanks to:\n * Flotr: http://code.google.com/p/flotr/ (f"
},
{
"path": "html/lib/flotr2/package.json",
"chars": 575,
"preview": "{\n \"name\": \"flotr2\", \n \"version\": \"0.1.0\",\n \"description\": \"A library for drawing HTML5 charts and graphs.\",\n \"homep"
},
{
"path": "html/lib/font-awesome/css/font-awesome.css",
"chars": 34779,
"preview": "/*!\n * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/lice"
},
{
"path": "html/lib/font-awesome/fonts/index.html",
"chars": 2254,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/"
},
{
"path": "html/lib/jquery/jquery.js",
"chars": 258648,
"preview": "/*!\n * jQuery JavaScript Library v2.2.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Cop"
},
{
"path": "html/lib/jquery/jquery.slim.js",
"chars": 209386,
"preview": "/*!\n * jQuery JavaScript Library v3.0.0-beta1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseJSON,-ajax/parseXML,-ajax/script,-"
},
{
"path": "html/lib/nvd3/nv.d3.css",
"chars": 12981,
"preview": "/* nvd3 version 1.8.2 (https://github.com/novus/nvd3) 2016-01-24 */\n.nvd3 .nv-axis {\r\n pointer-events:none;\r\n opac"
},
{
"path": "html/lib/nvd3/nv.d3.js",
"chars": 569593,
"preview": "/* nvd3 version 1.8.2 (https://github.com/novus/nvd3) 2016-01-24 */\n(function(){\n\n// set up main nv object\nvar nv = {};\n"
},
{
"path": "html/lib/seiyria-bootstrap-slider/bootstrap-slider.css",
"chars": 8257,
"preview": "/*! =======================================================\n VERSION 6.1.8 \n========="
},
{
"path": "html/lib/seiyria-bootstrap-slider/bootstrap-slider.js",
"chars": 53907,
"preview": "/*! =======================================================\n VERSION 6.1.8 \n========="
},
{
"path": "html/studio.html",
"chars": 3721,
"preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmln"
},
{
"path": "html/views-angular.html",
"chars": 5258,
"preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmln"
},
{
"path": "html/views.html",
"chars": 6154,
"preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmln"
},
{
"path": "package.json",
"chars": 568,
"preview": "{\n \"name\": \"cubesviewer\",\n \"version\": \"2.0.3-devel\",\n \"devDependencies\": {\n \"bower\": \"^1.7.9\",\n \"grunt\": \"^0.4."
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the jjmontesl/cubesviewer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 137 files (5.2 MB), approximately 1.4M tokens, and a symbol index with 1229 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.