Cdentinger has uploaded a new change for review. https://gerrit.wikimedia.org/r/211914
Change subject: spaces to tabs, fix a couple errant html tags ...................................................................... spaces to tabs, fix a couple errant html tags Change-Id: I7bd8eaf927e0baef5b11dc6184dfa2c7f9e5405b --- M bower.json M config.js M gulpfile.js M package.json M routes/index.js M src/app/require.config.js M src/app/router.js M src/app/startup.js M src/components/app-content/app-content.js M src/components/boards/generic-board/generic-board.html M src/components/boards/generic-board/generic-board.js M src/components/nav-bar/nav-bar.js M src/components/utils/date-pickers/date-pickers.html M src/components/utils/date-pickers/date-pickers.js M src/components/widgets/ABTesting/ABTestingMain.html M src/components/widgets/fraud-gauge/fraud-gauge.html M src/css/style.css M src/index.html M widgets/index.js 19 files changed, 1,102 insertions(+), 1,104 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/dash refs/changes/14/211914/1 diff --git a/bower.json b/bower.json index 75802c6..7ccbafe 100644 --- a/bower.json +++ b/bower.json @@ -1,55 +1,55 @@ { - "name": "dash", - "version": "0.0.0", - "authors": [ - "Sherah Smith <ssm...@wikimedia.org>" - ], - "description": "A Data Visualization Dashboard for Wikimedia Foundation Fundraising", - "main": "server.js", - "moduleType": [ - "amd", - "globals", - "node" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "public/javascripts/vendor", - "test", - "tests", - "bower_components", - "src/bower_modules" - ], - "dependencies": { - "bootstrap-datepicker": "~1.3.0", - "bootstrap-timepicker": "~0.2.6", - "d3": "~3.5.0", - "c3": "~0.4.10", - "chartjs": "~1.0.0", - "crossroads": "~0.12.0", - "gauge.js": "~1.2.1", - "fontawesome": "4.2", - "hasher": "~1.2.0", - "knockout-projections": "~1.1.0-pre", - "knockout": "~3.2.0", - "moment": "~2.7.0", - "raphael": "~2.1.2", - "requirejs": "~2.1.15", - "lato": "~0.2.1", - "requirejs-text": "~2.0.12", - "jquery": "~2.1.1", - "nouislider": "~7.0.7", - "numeraljs": "~1.5.3", - "select2": "~3.5.2" - }, - "keywords": [ - "dash" - ], - "homepage": "http://sherah.github.io/dash", - "private": true, - "resolutions": { - "bootstrap": ">=3.0 <4.0", - "jquery": "2.1.1" - } + "name": "dash", + "version": "0.0.0", + "authors": [ + "Sherah Smith <ssm...@wikimedia.org>" + ], + "description": "A Data Visualization Dashboard for Wikimedia Foundation Fundraising", + "main": "server.js", + "moduleType": [ + "amd", + "globals", + "node" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "public/javascripts/vendor", + "test", + "tests", + "bower_components", + "src/bower_modules" + ], + "dependencies": { + "bootstrap-datepicker": "~1.3.0", + "bootstrap-timepicker": "~0.2.6", + "d3": "~3.5.0", + "c3": "~0.4.10", + "chartjs": "~1.0.0", + "crossroads": "~0.12.0", + "gauge.js": "~1.2.1", + "fontawesome": "4.2", + "hasher": "~1.2.0", + "knockout-projections": "~1.1.0-pre", + "knockout": "~3.2.0", + "moment": "~2.7.0", + "raphael": "~2.1.2", + "requirejs": "~2.1.15", + "lato": "~0.2.1", + "requirejs-text": "~2.0.12", + "jquery": "~2.1.1", + "nouislider": "~7.0.7", + "numeraljs": "~1.5.3", + "select2": "~3.5.2" + }, + "keywords": [ + "dash" + ], + "homepage": "http://sherah.github.io/dash", + "private": true, + "resolutions": { + "bootstrap": ">=3.0 <4.0", + "jquery": "2.1.1" + } } diff --git a/config.js b/config.js index 0c7c0ab..a9fce33 100644 --- a/config.js +++ b/config.js @@ -1,30 +1,30 @@ var commander = require( 'commander' ), - defaults = require( './defaults.js' ), - logger = require( './logger.js' ), - prop, - config; + defaults = require( './defaults.js' ), + logger = require( './logger.js' ), + prop, + config; commander - .version( '0.0.1' ) - .option( '-c, --config <path>', 'Path to the local configuration file' ) - .option( '-d, --debug', 'Run unminified code and skip auth check') - .parse( process.argv ); - + .version( '0.0.1' ) + .option( '-c, --config <path>', 'Path to the local configuration file' ) + .option( '-d, --debug', 'Run unminified code and skip auth check') + .parse( process.argv ); + try { - if ( commander.config ) { - config = require( commander.config ); + if ( commander.config ) { + config = require( commander.config ); for ( prop in defaults ) { if ( defaults.hasOwnProperty( prop ) && !config.hasOwnProperty( prop ) ) { config[prop] = defaults[prop]; } } - } else { + } else { config = defaults; } config.debug = commander.debug; } catch(err) { - logger.error( 'Could not open configuration file ' + commander.config + '! ' + err ); - process.exit( 1 ); + logger.error( 'Could not open configuration file ' + commander.config + '! ' + err ); + process.exit( 1 ); } -module.exports = config; \ No newline at end of file +module.exports = config; diff --git a/gulpfile.js b/gulpfile.js index 089b9c3..57f30b6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,101 +1,101 @@ /*jslint node: true, stupid: true */ // Node modules var fs = require('fs'), - vm = require('vm'), - merge = require('deeply'), - chalk = require('chalk'); + vm = require('vm'), + merge = require('deeply'), + chalk = require('chalk'); // Gulp and plugins var gulp = require('gulp'), - rjs = require('gulp-requirejs-bundler'), - concat = require('gulp-concat'), - clean = require('gulp-clean'), - replace = require('gulp-replace'), - uglify = require('gulp-uglify'), - htmlreplace = require('gulp-html-replace'), - rev = require('gulp-rev'), - jshint = require('gulp-jshint'), - rename = require('gulp-rename'), - replace = require('gulp-replace'); + rjs = require('gulp-requirejs-bundler'), + concat = require('gulp-concat'), + clean = require('gulp-clean'), + replace = require('gulp-replace'), + uglify = require('gulp-uglify'), + htmlreplace = require('gulp-html-replace'), + rev = require('gulp-rev'), + jshint = require('gulp-jshint'), + rename = require('gulp-rename'), + replace = require('gulp-replace'); // Config var requireJsRuntimeConfig = vm.runInNewContext(fs.readFileSync('src/app/require.config.js') + '; require;'), - requireJsOptimizerConfig = merge(requireJsRuntimeConfig, { - out: 'scripts.js', - baseUrl: './src', - name: 'app/startup', - paths: { - requireLib: 'bower_modules/requirejs/require' - }, - include: [ - 'requireLib', - 'components/nav-bar/nav-bar', - 'components/home/home', - 'components/app-content/app-content', - 'components/utils/date-pickers/date-pickers', - 'components/widgets/fraud-gauge/fraud-gauge', - 'components/widgets/distance-to-goal-chart/distance-to-goal-chart', - 'components/widgets/totals-earned-chart/totals-earned-chart', - 'components/widgets/amt-per-second-chart/amt-per-second-chart', - 'components/boards/generic-board/generic-board', - 'components/widgets/x-by-y/x-by-y', - 'components/widgets/cat-trombone/cat-trombone' - ], - insertRequire: ['app/startup'], - bundles: { - // If you want parts of the site to load on demand, remove them from the 'include' list - // above, and group them into bundles here. - 'date-pickers': ['components/utils/date-pickers/date-pickers'] - // 'vega-timeseries': ['components/visualizers/vega-timeseries/vega-timeseries'] + requireJsOptimizerConfig = merge(requireJsRuntimeConfig, { + out: 'scripts.js', + baseUrl: './src', + name: 'app/startup', + paths: { + requireLib: 'bower_modules/requirejs/require' + }, + include: [ + 'requireLib', + 'components/nav-bar/nav-bar', + 'components/home/home', + 'components/app-content/app-content', + 'components/utils/date-pickers/date-pickers', + 'components/widgets/fraud-gauge/fraud-gauge', + 'components/widgets/distance-to-goal-chart/distance-to-goal-chart', + 'components/widgets/totals-earned-chart/totals-earned-chart', + 'components/widgets/amt-per-second-chart/amt-per-second-chart', + 'components/boards/generic-board/generic-board', + 'components/widgets/x-by-y/x-by-y', + 'components/widgets/cat-trombone/cat-trombone' + ], + insertRequire: ['app/startup'], + bundles: { + // If you want parts of the site to load on demand, remove them from the 'include' list + // above, and group them into bundles here. + 'date-pickers': ['components/utils/date-pickers/date-pickers'] + // 'vega-timeseries': ['components/visualizers/vega-timeseries/vega-timeseries'] - } - }); + } + }); var jsfilesToLint = ['**/*.js', '!node_modules/**/*.js', '!src/bower_modules/**/*.js', '!dist/**/*.js']; // linting gulp.task('lint', function () { - return gulp.src(jsfilesToLint) - .pipe(jshint()) - .pipe(jshint.reporter('default')); + return gulp.src(jsfilesToLint) + .pipe(jshint()) + .pipe(jshint.reporter('default')); }); // Discovers all AMD dependencies, concatenates together all required .js files, minifies them gulp.task('js', ['clean'], function () { - return rjs(requireJsOptimizerConfig) - .pipe(uglify({ - preserveComments: 'some' - })) - .pipe(rev()) - .pipe(gulp.dest('./dist/')) - .pipe(rev.manifest()) - .pipe(rename('js.manifest.json')) - .pipe(gulp.dest('./dist/')); + return rjs(requireJsOptimizerConfig) + .pipe(uglify({ + preserveComments: 'some' + })) + .pipe(rev()) + .pipe(gulp.dest('./dist/')) + .pipe(rev.manifest()) + .pipe(rename('js.manifest.json')) + .pipe(gulp.dest('./dist/')); }); gulp.task('css', ['clean'], function () { - return gulp.src(['src/bower_modules/bootstrap/dist/css/bootstrap.css', - 'src/bower_modules/nouislider/src/jquery.nouislider.css', - 'src/bower_modules/fontawesome/css/font-awesome.css', - 'src/bower_modules/lato/css/lato.css', - 'src/bower_modules/c3/c3.css', - 'src/bower_modules/select2/select2.css', - 'src/css/*.css']) - .pipe(concat('style.css')).pipe(rev()).pipe(gulp.dest('./dist/')) - // Add rev-manifest.json as a new src to prevent rev'ing rev-manifest.json - .pipe(rev.manifest()) - .pipe(rename('css.manifest.json')) - .pipe(gulp.dest('./dist/')); + return gulp.src(['src/bower_modules/bootstrap/dist/css/bootstrap.css', + 'src/bower_modules/nouislider/src/jquery.nouislider.css', + 'src/bower_modules/fontawesome/css/font-awesome.css', + 'src/bower_modules/lato/css/lato.css', + 'src/bower_modules/c3/c3.css', + 'src/bower_modules/select2/select2.css', + 'src/css/*.css']) + .pipe(concat('style.css')).pipe(rev()).pipe(gulp.dest('./dist/')) + // Add rev-manifest.json as a new src to prevent rev'ing rev-manifest.json + .pipe(rev.manifest()) + .pipe(rename('css.manifest.json')) + .pipe(gulp.dest('./dist/')); }); /** Copies semantic fonts where the css expects them to be**/ gulp.task('font', ['clean'], function () { - return gulp.src(['src/bower_modules/lato/font/*{ttf,woff,eot,svg}']) - .pipe(gulp.dest('./dist/font/')); + return gulp.src(['src/bower_modules/lato/font/*{ttf,woff,eot,svg}']) + .pipe(gulp.dest('./dist/font/')); }); gulp.task('fonts', ['clean'], function () { - return gulp.src(['src/bower_modules/fontawesome/fonts/*{ttf,woff,eot,svg,otf}']) - .pipe(gulp.dest('./dist/fonts/')); + return gulp.src(['src/bower_modules/fontawesome/fonts/*{ttf,woff,eot,svg,otf}']) + .pipe(gulp.dest('./dist/fonts/')); }); // Copies index.html, replacing <script> and <link> tags to reference production URLs @@ -104,77 +104,77 @@ // with references to versioned bundles gulp.task('replace', ['css', 'js'], function () { - // these manifests have been created by task rev.manifest before - var jsManifest = JSON.parse(fs.readFileSync('./dist/js.manifest.json', 'utf8')); - var cssManifest = JSON.parse(fs.readFileSync('./dist/css.manifest.json', 'utf8')); + // these manifests have been created by task rev.manifest before + var jsManifest = JSON.parse(fs.readFileSync('./dist/js.manifest.json', 'utf8')); + var cssManifest = JSON.parse(fs.readFileSync('./dist/css.manifest.json', 'utf8')); - // figure out what bundles do we have setup on requirejs - var bundles = Object.getOwnPropertyNames(jsManifest).filter(function (p) { - return p !== 'scripts.js'; - }); + // figure out what bundles do we have setup on requirejs + var bundles = Object.getOwnPropertyNames(jsManifest).filter(function (p) { + return p !== 'scripts.js'; + }); - var regex = ''; - bundles.forEach(function (element, index, array) { - var l = element.length; - // we are trying to match "project-selector" (quotes-included) - regex = regex + '\"(' + element.substr(0, l - 3) + ')\":|'; + var regex = ''; + bundles.forEach(function (element, index, array) { + var l = element.length; + // we are trying to match "project-selector" (quotes-included) + regex = regex + '\"(' + element.substr(0, l - 3) + ')\":|'; - }); + }); - //remove last '|', out come should be like: "(project-selector)"|"(vega-timeseries)" - regex = regex.substring(0, regex.length - 1); + //remove last '|', out come should be like: "(project-selector)"|"(vega-timeseries)" + regex = regex.substring(0, regex.length - 1); - // this build system is so inflexible that makes me want to cry - function replaceByVersion(match) { - // remove quotes from match and add ".js" - // so we can key on the manifest with versions - match = match.substring(1, match.length - 2); - match = match + '.js'; - var version = jsManifest[match]; + // this build system is so inflexible that makes me want to cry + function replaceByVersion(match) { + // remove quotes from match and add ".js" + // so we can key on the manifest with versions + match = match.substring(1, match.length - 2); + match = match + '.js'; + var version = jsManifest[match]; - version = '\"' + version + '\":'; - return version; - } + version = '\"' + version + '\":'; + return version; + } - var regexObj = new RegExp(regex, 'g'); + var regexObj = new RegExp(regex, 'g'); - gulp.src(['./dist/' + jsManifest['scripts.js']]) - .pipe(replace(regexObj, replaceByVersion)) - .pipe(gulp.dest('./dist/')); + gulp.src(['./dist/' + jsManifest['scripts.js']]) + .pipe(replace(regexObj, replaceByVersion)) + .pipe(gulp.dest('./dist/')); - return gulp.src('./src/index.html') - .pipe(htmlreplace({ - 'css': cssManifest['style.css'], - 'js': jsManifest['scripts.js'] - })) - .pipe(gulp.dest('./dist/')); + return gulp.src('./src/index.html') + .pipe(htmlreplace({ + 'css': cssManifest['style.css'], + 'js': jsManifest['scripts.js'] + })) + .pipe(gulp.dest('./dist/')); }); // Removes all files from ./dist/ gulp.task('clean', function () { - return gulp.src('./dist/**/*', { - read: false - }) - .pipe(clean()); + return gulp.src('./dist/**/*', { + read: false + }) + .pipe(clean()); }); gulp.task('images', function() { - return gulp.src('./src/images/**/*') - .pipe(gulp.dest('./dist/images/')); + return gulp.src('./src/images/**/*') + .pipe(gulp.dest('./dist/images/')); }); gulp.task('default', ['clean', 'replace', 'lint', 'font', 'fonts', 'images'], function (callback) { - callback(); - console.log('\nPlaced optimized files in ' + chalk.magenta('dist/\n')); - console.log('\nPlaced font files in ' + chalk.magenta('font/\n')); + callback(); + console.log('\nPlaced optimized files in ' + chalk.magenta('dist/\n')); + console.log('\nPlaced font files in ' + chalk.magenta('font/\n')); - console.log('\nWatching changes... You\'re free to kill off this task now.'); + console.log('\nWatching changes... You\'re free to kill off this task now.'); }); function logWatcher(event) { - console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); + console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); } gulp.watch('./src/**/*.js', ['js']).on('change', logWatcher); gulp.watch('./src/**/*.html', ['replace']).on('change', logWatcher); diff --git a/package.json b/package.json index 2b4e953..4c7a9d5 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,43 @@ { - "name": "dash", - "description": "Fundraising Dashboard App", - "version": "0.0.1", - "private": true, - "repository": { - "type": "git", - "url": "https://gerrit.wikimedia.org/r/wikimedia/fundraising/dash" - }, - "dependencies": { - "amdrequire": "0.0.3", - "commander": "~2.2.0", - "dotenv": "^0.4.0", - "evil-dns": "0.0.2", - "express": "3.x", - "gulp": "^3.8.8", - "gulp-jshint": "^1.8.4", - "gulp-rename": "^1.2.0", - "gulp-rev": "^1.1.0", - "jade": ">= 0.0.1", - "lodash": "^2.4.1", - "memory-cache": "0.0.5", - "mysql": "^2.4.3", - "mysql-promise": "^1.3.0", - "node-syslog": "~1.1.7", - "odata-parser": "~1.0.0", - "passport": "^0.2.1", - "passport-drupal": "0.3.3", - "passport-oauth": "^1.0.0", - "node.extend": "1.1.3" - }, - "devDependencies": { - "chalk": "^0.5.1", - "deeply": "^0.1.0", - "event-stream": "^3.1.7", - "gulp-clean": "^0.3.1", - "gulp-concat": "^2.4.1", - "gulp-html-replace": "^1.3.0", - "gulp-replace": "^0.4.0", - "gulp-requirejs-bundler": "^0.1.1", - "gulp-uglify": "^1.0.1" - } + "name": "dash", + "description": "Fundraising Dashboard App", + "version": "0.0.1", + "private": true, + "repository": { + "type": "git", + "url": "https://gerrit.wikimedia.org/r/wikimedia/fundraising/dash" + }, + "dependencies": { + "amdrequire": "0.0.3", + "commander": "~2.2.0", + "dotenv": "^0.4.0", + "evil-dns": "0.0.2", + "express": "3.x", + "gulp": "^3.8.8", + "gulp-jshint": "^1.8.4", + "gulp-rename": "^1.2.0", + "gulp-rev": "^1.1.0", + "jade": ">= 0.0.1", + "lodash": "^2.4.1", + "memory-cache": "0.0.5", + "mysql": "^2.4.3", + "mysql-promise": "^1.3.0", + "node-syslog": "~1.1.7", + "odata-parser": "~1.0.0", + "passport": "^0.2.1", + "passport-drupal": "0.3.3", + "passport-oauth": "^1.0.0", + "node.extend": "1.1.3" + }, + "devDependencies": { + "chalk": "^0.5.1", + "deeply": "^0.1.0", + "event-stream": "^3.1.7", + "gulp-clean": "^0.3.1", + "gulp-concat": "^2.4.1", + "gulp-html-replace": "^1.3.0", + "gulp-replace": "^0.4.0", + "gulp-requirejs-bundler": "^0.1.1", + "gulp-uglify": "^1.0.1" + } } diff --git a/routes/index.js b/routes/index.js index bcb02c3..3e7169f 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,9 +1,9 @@ var path = require('path'); require('fs').readdirSync(__dirname) - .filter(function(file) { - return ((file.indexOf('.') !== 0) && (file !== 'index.js') && (file.slice(-3) === '.js')); - }) - .forEach(function(file) { - module.exports[file.substr(0,file.length - 3)] = require(path.join(__dirname, file)); + .filter(function(file) { + return ((file.indexOf('.') !== 0) && (file !== 'index.js') && (file.slice(-3) === '.js')); + }) + .forEach(function(file) { + module.exports[file.substr(0,file.length - 3)] = require(path.join(__dirname, file)); }); diff --git a/src/app/require.config.js b/src/app/require.config.js index 4b15b77..a5c73bd 100644 --- a/src/app/require.config.js +++ b/src/app/require.config.js @@ -1,57 +1,57 @@ /* jshint -W098 */ var require = { - baseUrl: '.', - paths: { - 'bootstrap': 'bower_modules/bootstrap/dist/js/bootstrap', - 'crossroads': 'bower_modules/crossroads/dist/crossroads.min', - 'hasher': 'bower_modules/hasher/dist/js/hasher.min', - 'jquery': 'bower_modules/jquery/dist/jquery', - 'noUISlider': 'bower_modules/nouislider/distribute/jquery.nouislider.all', - 'knockout': 'bower_modules/knockout/dist/knockout', - 'knockout-projections': 'bower_modules/knockout-projections/dist/knockout-projections', - 'signals': 'bower_modules/js-signals/dist/signals.min', - 'd3': 'bower_modules/d3/d3', - 'text': 'bower_modules/requirejs-text/text', - 'chartjs': 'bower_modules/chartjs/Chart', - 'momentjs': 'bower_modules/moment/moment', - 'raphael': 'bower_modules/raphael/raphael', - 'gauge': 'bower_modules/gauge.js/dist/gauge', - 'bootstrap-datepicker': 'bower_modules/bootstrap-datepicker/js/bootstrap-datepicker', - 'bootstrap-timepicker': 'bower_modules/bootstrap-timepicker/js/bootstrap-timepicker', - 'sifter': 'bower_modules/sifter/sifter', - 'microplugin': 'bower_modules/microplugin/src/microplugin', - 'select2': 'bower_modules/select2//select2', - 'c3': 'bower_modules/c3/c3', - 'numeraljs': 'bower_modules/numeraljs/numeral', - 'decemberData': 'bower_modules/fakeData/decemberData', - 'WidgetBase': 'app/widgetBase' - }, - shim: { - 'bootstrap': { - deps: [ - 'jquery' - ] - }, - 'c3': { - deps: [ - 'd3' - ] - }, - 'momentjs': { - exports: 'moment' - }, - 'noUISlider': { - deps: [ - 'jquery' - ] - }, - 'selectize': { - deps: [ - 'bootstrap', - 'sifter', - 'microplugin' - ] - } - } -}; \ No newline at end of file + baseUrl: '.', + paths: { + 'bootstrap': 'bower_modules/bootstrap/dist/js/bootstrap', + 'crossroads': 'bower_modules/crossroads/dist/crossroads.min', + 'hasher': 'bower_modules/hasher/dist/js/hasher.min', + 'jquery': 'bower_modules/jquery/dist/jquery', + 'noUISlider': 'bower_modules/nouislider/distribute/jquery.nouislider.all', + 'knockout': 'bower_modules/knockout/dist/knockout', + 'knockout-projections': 'bower_modules/knockout-projections/dist/knockout-projections', + 'signals': 'bower_modules/js-signals/dist/signals.min', + 'd3': 'bower_modules/d3/d3', + 'text': 'bower_modules/requirejs-text/text', + 'chartjs': 'bower_modules/chartjs/Chart', + 'momentjs': 'bower_modules/moment/moment', + 'raphael': 'bower_modules/raphael/raphael', + 'gauge': 'bower_modules/gauge.js/dist/gauge', + 'bootstrap-datepicker': 'bower_modules/bootstrap-datepicker/js/bootstrap-datepicker', + 'bootstrap-timepicker': 'bower_modules/bootstrap-timepicker/js/bootstrap-timepicker', + 'sifter': 'bower_modules/sifter/sifter', + 'microplugin': 'bower_modules/microplugin/src/microplugin', + 'select2': 'bower_modules/select2//select2', + 'c3': 'bower_modules/c3/c3', + 'numeraljs': 'bower_modules/numeraljs/numeral', + 'decemberData': 'bower_modules/fakeData/decemberData', + 'WidgetBase': 'app/widgetBase' + }, + shim: { + 'bootstrap': { + deps: [ + 'jquery' + ] + }, + 'c3': { + deps: [ + 'd3' + ] + }, + 'momentjs': { + exports: 'moment' + }, + 'noUISlider': { + deps: [ + 'jquery' + ] + }, + 'selectize': { + deps: [ + 'bootstrap', + 'sifter', + 'microplugin' + ] + } + } +}; diff --git a/src/app/router.js b/src/app/router.js index 7a57ffc..834d33f 100644 --- a/src/app/router.js +++ b/src/app/router.js @@ -1,43 +1,43 @@ define( - [ 'jquery', - 'knockout', - 'crossroads', - 'hasher' - ], function( $, ko, crossroads, hasher ) { + ['jquery', + 'knockout', + 'crossroads', + 'hasher' + ], function( $, ko, crossroads, hasher ) { - var routerConfig = { - defaultParams: { page: 'home', action: 'view' } - }; + var routerConfig = { + defaultParams: { page: 'home', action: 'view' } + }; - function Router( config ) { - var self = this; + function Router( config ) { + var self = this; - self.currentRoute = ko.observable({}); + self.currentRoute = ko.observable({}); - crossroads.addRoute( ':page:/:action:', function( requestParams ) { - var routeParams = $.extend( config.defaultParams, requestParams ); - self.currentRoute = routeParams; - }); - crossroads.bypassed.add( function(){ - self.error(404); - }); - self.error = function( code ){ - self.currentRoute({ page: 'error', code: code }); - }; + crossroads.addRoute( ':page:/:action:', function( requestParams ) { + var routeParams = $.extend( config.defaultParams, requestParams ); + self.currentRoute = routeParams; + }); + crossroads.bypassed.add( function(){ + self.error(404); + }); + self.error = function( code ){ + self.currentRoute({ page: 'error', code: code }); + }; - startCrossroads(); + startCrossroads(); - } + } - function startCrossroads() { - function parseHash( newHash, oldHash ) { crossroads.parse( newHash ); } + function startCrossroads() { + function parseHash( newHash, oldHash ) { crossroads.parse( newHash ); } - crossroads.normalizeFn = crossroads.NORM_AS_OBJECT; + crossroads.normalizeFn = crossroads.NORM_AS_OBJECT; - hasher.initialized.add( parseHash ); - hasher.changed.add( parseHash ); - hasher.init(); - } + hasher.initialized.add( parseHash ); + hasher.changed.add( parseHash ); + hasher.init(); + } - return new Router( routerConfig ); -}); \ No newline at end of file + return new Router( routerConfig ); + }); diff --git a/src/app/startup.js b/src/app/startup.js index 9f596a1..4391013 100644 --- a/src/app/startup.js +++ b/src/app/startup.js @@ -1,33 +1,31 @@ define( - [ 'jquery', - 'knockout', - './router', - 'bootstrap', - 'knockout-projections', - './bindings' - ], function( $, ko, router ){ - ko.components.register( 'dashboard', { require: 'components/dashboard/dashboard' }); - ko.components.register( 'home', { require: 'components/home/home' }); - ko.components.register( 'nav-bar', { require: 'components/nav-bar/nav-bar' }); - ko.components.register( 'app-content', { require: 'components/app-content/app-content' }); + [ 'jquery', + 'knockout', + './router', + 'bootstrap', + 'knockout-projections', + './bindings' + ], function( $, ko, router ){ + ko.components.register( 'dashboard', { require: 'components/dashboard/dashboard' }); + ko.components.register( 'home', { require: 'components/home/home' }); + ko.components.register( 'nav-bar', { require: 'components/nav-bar/nav-bar' }); + ko.components.register( 'app-content', { require: 'components/app-content/app-content' }); - //register utils - ko.components.register( 'date-pickers', { require: 'components/utils/date-pickers/date-pickers' }); + //register utils + ko.components.register( 'date-pickers', { require: 'components/utils/date-pickers/date-pickers' }); - //register boards - ko.components.register( 'generic-board', { require: 'components/boards/generic-board/generic-board' }); + //register boards + ko.components.register( 'generic-board', { require: 'components/boards/generic-board/generic-board' }); - //register individual widgets - ko.components.register( 'fraud-gauge', { require: 'components/widgets/fraud-gauge/fraud-gauge' }); - ko.components.register( 'totals-earned-chart', { require: 'components/widgets/totals-earned-chart/totals-earned-chart' }); - ko.components.register( 'distance-to-goal-chart', { require: 'components/widgets/distance-to-goal-chart/distance-to-goal-chart' }); - ko.components.register( 'amt-per-second-chart', { require: 'components/widgets/amt-per-second-chart/amt-per-second-chart' }); - ko.components.register( 'x-by-y', { require: 'components/widgets/x-by-y/x-by-y' }); - ko.components.register( 'cat-trombone', { require: 'components/widgets/cat-trombone/cat-trombone' }); + //register individual widgets + ko.components.register( 'fraud-gauge', { require: 'components/widgets/fraud-gauge/fraud-gauge' }); + ko.components.register( 'totals-earned-chart', { require: 'components/widgets/totals-earned-chart/totals-earned-chart' }); + ko.components.register( 'distance-to-goal-chart', { require: 'components/widgets/distance-to-goal-chart/distance-to-goal-chart' }); + ko.components.register( 'amt-per-second-chart', { require: 'components/widgets/amt-per-second-chart/amt-per-second-chart' }); + ko.components.register( 'x-by-y', { require: 'components/widgets/x-by-y/x-by-y' }); + ko.components.register( 'cat-trombone', { require: 'components/widgets/cat-trombone/cat-trombone' }); - //fire up router - ko.applyBindings({ route: router.currentRoute }); + //fire up router + ko.applyBindings({ route: router.currentRoute }); - - -}); \ No newline at end of file +}); diff --git a/src/components/app-content/app-content.js b/src/components/app-content/app-content.js index d3d1f5a..508577f 100644 --- a/src/components/app-content/app-content.js +++ b/src/components/app-content/app-content.js @@ -1,55 +1,55 @@ define( - [ 'jquery', - 'knockout', - 'text!./app-content.html' - ], function( $, ko, templateMarkup ) { + [ 'jquery', + 'knockout', + 'text!./app-content.html' + ], function( $, ko, templateMarkup ) { - function AppContent( params ) { - var self = this; + function AppContent( params ) { + var self = this; - self.url = params.url || 'hi'; - self.displayedBoard = ko.observable(); - self.userBoards = ko.observableArray(); - self.userdata = ko.observableArray(); - self.displayPage = ko.observable('Home'); - self.loggedIn = ko.observable(false); - self.welcome = ko.observable(''); - self.widgetTemplates = ko.observableArray(); - self.widgetInstances = ko.observableArray(); + self.url = params.url || 'hi'; + self.displayedBoard = ko.observable(); + self.userBoards = ko.observableArray(); + self.userdata = ko.observableArray(); + self.displayPage = ko.observable('Home'); + self.loggedIn = ko.observable(false); + self.welcome = ko.observable(''); + self.widgetTemplates = ko.observableArray(); + self.widgetInstances = ko.observableArray(); - $.get( '/user/info', function( userInfo ) { - if ( userInfo && !userInfo.error ) { - self.userdata( userInfo ); - self.welcome( userInfo.name.charAt(0).toUpperCase() + userInfo.name.slice(1) ); - self.loggedIn( true ); + $.get( '/user/info', function( userInfo ) { + if ( userInfo && !userInfo.error ) { + self.userdata( userInfo ); + self.welcome( userInfo.name.charAt(0).toUpperCase() + userInfo.name.slice(1) ); + self.loggedIn( true ); - $.get( 'board/' + self.userdata().defaultBoard, function( moredata ){ - self.displayedBoard( moredata ); - }); + $.get( 'board/' + self.userdata().defaultBoard, function( moredata ){ + self.displayedBoard( moredata ); + }); - $.get( 'board/', function ( boards ){ - $.each( boards, function( i, board ){ - if( board.ownerId === self.userdata().id ){ - self.userBoards.push(board); - } - }); - }); - } - }); + $.get( 'board/', function ( boards ){ + $.each( boards, function( i, board ){ + if( board.ownerId === self.userdata().id ){ + self.userBoards.push(board); + } + }); + }); + } + }); - self.addWidgetToBoard = function( event, data ){ - $.ajax( { - method: 'POST', - url: '/widget-instance', - contentType: 'application/json; charset=UTF-8', - data: JSON.stringify( { - widgetId: event.id, - displayName: 'My ' + event.displayName, - isShared: false - } ), - success: function( data ) { - $.ajax( { - method: 'POST', + self.addWidgetToBoard = function( event, data ){ + $.ajax( { + method: 'POST', + url: '/widget-instance', + contentType: 'application/json; charset=UTF-8', + data: JSON.stringify( { + widgetId: event.id, + displayName: 'My ' + event.displayName, + isShared: false + } ), + success: function( data ) { + $.ajax( { + method: 'POST', url: '/board/' + self.userdata().defaultBoard + '/widgets', contentType: 'application/json; charset=UTF-8', data: JSON.stringify( { @@ -66,67 +66,67 @@ }); } } - } ); - } - } ); + } ); + } + } ); - }; + }; - self.removeWidgetFromBoard = function( event, data ){ - var removingBoard = self.displayedBoard().id; - $.ajax({ - method: 'DELETE', - url: '/board/' + removingBoard + '/widgets/' + event.instanceID, - success: function( ) { - $.get( 'board/' + removingBoard, function( moredata ){ - self.displayedBoard( moredata ); - $('.modal-backdrop').remove(); - }); - } - }); - }; + self.removeWidgetFromBoard = function( event, data ){ + var removingBoard = self.displayedBoard().id; + $.ajax({ + method: 'DELETE', + url: '/board/' + removingBoard + '/widgets/' + event.instanceID, + success: function( ) { + $.get( 'board/' + removingBoard, function( moredata ){ + self.displayedBoard( moredata ); + $('.modal-backdrop').remove(); + }); + } + }); + }; - self.setDisplayPage = function( e, data ){ - var pages = [ 'Library', 'Profile', 'Home' ], view = data.target.id; + self.setDisplayPage = function( e, data ){ + var pages = [ 'Library', 'Profile', 'Home' ], view = data.target.id; - if( pages.indexOf(data.target.id) > -1 ){ - self.displayPage(view); - } else if( isNaN( parseInt( view, 10 ) ) ) { - self.displayPage($.trim($(data.target).text())); - } else { - $.get( 'board/' + view, function( bdata ){ - self.displayPage('Home'); - self.displayedBoard( bdata ); - }); - } + if( pages.indexOf(data.target.id) > -1 ){ + self.displayPage(view); + } else if( isNaN( parseInt( view, 10 ) ) ) { + self.displayPage($.trim($(data.target).text())); + } else { + $.get( 'board/' + view, function( bdata ){ + self.displayPage('Home'); + self.displayedBoard( bdata ); + }); + } - }; + }; - self.getWidgetTemplates = function(){ - $.get( '/widget', function( widgetTemplates ){ + self.getWidgetTemplates = function(){ + $.get( '/widget', function( widgetTemplates ){ - var wt = $.map(widgetTemplates, function(n){ - return n; - }); + var wt = $.map(widgetTemplates, function(n){ + return n; + }); - self.widgetTemplates(wt); - }); - }; - self.getWidgetTemplates(); + self.widgetTemplates(wt); + }); + }; + self.getWidgetTemplates(); - self.getUsersWidgetInstances = function(){ - $.get('/widget-instance', function( widgetInstances ){ + self.getUsersWidgetInstances = function(){ + $.get('/widget-instance', function( widgetInstances ){ - var wi = $.map(widgetInstances, function(n){ - return n; - }); + var wi = $.map(widgetInstances, function(n){ + return n; + }); - self.widgetInstances(wi); - }); - }; - self.getUsersWidgetInstances(); + self.widgetInstances(wi); + }); + }; + self.getUsersWidgetInstances(); - } + } - return { viewModel: AppContent, template: templateMarkup }; -}); + return { viewModel: AppContent, template: templateMarkup }; + }); diff --git a/src/components/boards/generic-board/generic-board.html b/src/components/boards/generic-board/generic-board.html index dbf2861..f3484af 100644 --- a/src/components/boards/generic-board/generic-board.html +++ b/src/components/boards/generic-board/generic-board.html @@ -1,33 +1,33 @@ <div class="col-md-12"> - <div class="row"> - <div class="col-md-4 titleCol"> - <h2 style="display:inline" data-bind="text: displayedBoard().displayName"></h2> - <p><span data-bind="text: displayDate"></span></p> - <!-- <i class="fa fa-gear" data-toggle="modal" data-target="#changeBoardNameModal"></i></p> --> - </div> - <div class="col-md-8 titleCol"> - <div class="btn-group btn-group-xs pull-right"> - <button type="button" class="btn btn-default" id="Library" data-bind="click: $parent.setDisplayPage"><i class="fa fa-plus-square"></i> Add widgets</button> - </div> - </div> - </div> + <div class="row"> + <div class="col-md-4 titleCol"> + <h2 style="display:inline" data-bind="text: displayedBoard().displayName"></h2> + <p><span data-bind="text: displayDate"></span></p> + <!-- <i class="fa fa-gear" data-toggle="modal" data-target="#changeBoardNameModal"></i></p> --> + </div> + <div class="col-md-8 titleCol"> + <div class="btn-group btn-group-xs pull-right"> + <button type="button" class="btn btn-default" id="Library" data-bind="click: $parent.setDisplayPage"><i class="fa fa-plus-square"></i> Add widgets</button> + </div> + </div> + </div> - <div class="row jumbotron transparent" data-bind="visible: displayedBoard().widgets.length == 0"> - <div class="alert alert-info"> - <h1><i class="fa fa-flag"></i> There are no widgets on this board.</h1> - <div class="text-center"> - <h3>Don't worry, it's easy to add them. They live in the Library.</h3> - <button class="btn btn-lg btn-info" id="Library" data-bind="click: $parent.setDisplayPage"><i class="fa fa-paper-plane"></i> Take me to the Library!</button> - </div> - </div> - </div> + <div class="row jumbotron transparent" data-bind="visible: displayedBoard().widgets.length == 0"> + <div class="alert alert-info"> + <h1><i class="fa fa-flag"></i> There are no widgets on this board.</h1> + <div class="text-center"> + <h3>Don't worry, it's easy to add them. They live in the Library.</h3> + <button class="btn btn-lg btn-info" id="Library" data-bind="click: $parent.setDisplayPage"><i class="fa fa-paper-plane"></i> Take me to the Library!</button> + </div> + </div> + </div> - <div class="row widgetDisplayRow" data-bind="foreach: displayedBoard().widgets"> - <div class="widgetPlace" style="padding-left:0"> - <span class="floatingWidget" data-bind="component: { name: widgetCode, params: { title: displayName, description: description, configuration: configuration, widgetInstance: id, widgetCode: widgetCode, dataLoading: dataLoading, sharedContext: $parent.sharedContext } }"><span data-bind="text: display_name"></span></span> - </div> - </div> + <div class="row widgetDisplayRow" data-bind="foreach: displayedBoard().widgets"> + <div class="widgetPlace" style="padding-left:0"> + <span class="floatingWidget" data-bind="component: { name: widgetCode, params: { title: displayName, description: description, configuration: configuration, widgetInstance: id, widgetCode: widgetCode, dataLoading: dataLoading, sharedContext: $parent.sharedContext } }"><span data-bind="text: display_name"></span></span> + </div> + </div> </div> @@ -36,28 +36,28 @@ <div class="modal-content"> <h3 class="modal-body">Chart Loading....</h3> <div class="progress"> - <div class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"> - </div> + <div class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"> + </div> </div> </div><!-- /.modal-content --> </div> </div> <div class="modal fade" id="changeBoardNameModal"> - <div class="modal-dialog"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> - <h4 class="modal-title">Change Board Name</h4> - </div> - <div class="modal-body"> - <label>New Name:</label> - <input type="text" class="form-control" data-bind="textInput: boardName"> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> - <button type="button" class="btn btn-success pull-right" data-dismiss="modal">Submit</button> - </div> - </div><!-- /.modal-content --> - </div><!-- /.modal-dialog --> -</div><!-- /.modal --> \ No newline at end of file + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> + <h4 class="modal-title">Change Board Name</h4> + </div> + <div class="modal-body"> + <label>New Name:</label> + <input type="text" class="form-control" data-bind="textInput: boardName"> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + <button type="button" class="btn btn-success pull-right" data-dismiss="modal">Submit</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> +</div><!-- /.modal --> diff --git a/src/components/boards/generic-board/generic-board.js b/src/components/boards/generic-board/generic-board.js index 2d2614e..c240646 100644 --- a/src/components/boards/generic-board/generic-board.js +++ b/src/components/boards/generic-board/generic-board.js @@ -1,58 +1,58 @@ define( [ - 'knockout', - 'text!components/boards/generic-board/generic-board.html', - 'momentjs', - 'numeraljs' -], function( ko, template, moment, numeral ){ + 'knockout', + 'text!components/boards/generic-board/generic-board.html', + 'momentjs', + 'numeraljs' + ], function( ko, template, moment, numeral ){ - function GenericBoardViewModel( params ){ + function GenericBoardViewModel( params ){ - var self = this, - timeFormat = 'dddd, MMMM Do YYYY, h:mm:ss a'; + var self = this, +timeFormat = 'dddd, MMMM Do YYYY, h:mm:ss a'; - self.sharedContext = {}; - self.displayedBoard = params.displayedBoard; - self.boardName = ko.observable(); - self.widgetLoads = ko.observableArray([]); +self.sharedContext = {}; +self.displayedBoard = params.displayedBoard; +self.boardName = ko.observable(); +self.widgetLoads = ko.observableArray([]); - function setWidgetLoads() { - self.widgetLoads.removeAll(); - $.each( self.displayedBoard().widgets, function( i, widget ) { - widget.dataLoading = ko.observable( false ); - self.widgetLoads.push( widget.dataLoading ); - } ); - } - setWidgetLoads(); - self.displayedBoard.subscribe( setWidgetLoads ); +function setWidgetLoads() { + self.widgetLoads.removeAll(); + $.each( self.displayedBoard().widgets, function( i, widget ) { + widget.dataLoading = ko.observable( false ); + self.widgetLoads.push( widget.dataLoading ); + } ); +} +setWidgetLoads(); +self.displayedBoard.subscribe( setWidgetLoads ); - //TODO: be able to change board name - //self.boardName(self.displayedBoard().displayName); +//TODO: be able to change board name +//self.boardName(self.displayedBoard().displayName); - //This will return true if any child widget is loading - self.dataLoading = ko.computed( function() { - var i, - loads = self.widgetLoads(), - widgetCount = loads.length; +//This will return true if any child widget is loading +self.dataLoading = ko.computed( function() { + var i, + loads = self.widgetLoads(), + widgetCount = loads.length; - for ( i = 0; i < widgetCount; i++ ) { - if ( loads[i]() === true ) { - return true; - } - } - return false; - } ).extend( { throttle: 10 } ); // don't flip too often +for ( i = 0; i < widgetCount; i++ ) { + if ( loads[i]() === true ) { + return true; + } +} +return false; +} ).extend( { throttle: 10 } ); // don't flip too often - self.dataLoading.subscribe( function( value ) { - if ( value ) { - $('#loadingModal').modal('show'); //todo: knockout-style! - } else { - $('#loadingModal').modal('hide'); //todo: knockout-style! - } - } ); - // Get the date - self.displayDate = ko.observable( moment().format( timeFormat ) ); - } +self.dataLoading.subscribe( function( value ) { + if ( value ) { + $('#loadingModal').modal('show'); //todo: knockout-style! + } else { + $('#loadingModal').modal('hide'); //todo: knockout-style! + } +} ); +// Get the date +self.displayDate = ko.observable( moment().format( timeFormat ) ); +} - return { viewModel: GenericBoardViewModel, template: template }; +return { viewModel: GenericBoardViewModel, template: template }; }); diff --git a/src/components/nav-bar/nav-bar.js b/src/components/nav-bar/nav-bar.js index 13b0f62..d3d1e82 100644 --- a/src/components/nav-bar/nav-bar.js +++ b/src/components/nav-bar/nav-bar.js @@ -1,53 +1,53 @@ define( [ - 'knockout', - 'text!components/nav-bar/nav-bar.html' -], function( ko, template ){ + 'knockout', + 'text!components/nav-bar/nav-bar.html' + ], function( ko, template ){ - function NavBarViewModel( params ){ - var self = this; - self.loggedIn = params.loggedIn; - self.welcome = params.welcome; - self.userBoards = params.userBoards; - self.displayPage = ko.observable('filler'); + function NavBarViewModel( params ){ + var self = this; + self.loggedIn = params.loggedIn; + self.welcome = params.welcome; + self.userBoards = params.userBoards; + self.displayPage = ko.observable('filler'); - self.hideNav = function(){ - //make the nav menu fold out of view. - $('#navContainer .navWrapper').toggleClass('hide'); - $('#showNavMenu').css('display', 'inline'); - $('#dashApp').css('padding', '0 0 0 10px'); - }; + self.hideNav = function(){ + //make the nav menu fold out of view. + $('#navContainer .navWrapper').toggleClass('hide'); + $('#showNavMenu').css('display', 'inline'); + $('#dashApp').css('padding', '0 0 0 10px'); + }; - self.showNav = function(){ - window.setTimeout(function(){ - $('#navContainer .navWrapper').toggleClass('hide'); - $('#dashApp').css('padding-left', '175px'); - }, 200); - }; + self.showNav = function(){ + window.setTimeout(function(){ + $('#navContainer .navWrapper').toggleClass('hide'); + $('#dashApp').css('padding-left', '175px'); + }, 200); + }; - $('.mainNavButton').click(function(e){ - $('.mainNavButton').removeClass('selectedSubNav'); - if($(e.target).hasClass('mainNavButton')){ - $(e.target).addClass('selectedSubNav'); - } else { - $(e.target.parentElement).addClass('selectedSubNav'); - } - }); + $('.mainNavButton').click(function(e){ + $('.mainNavButton').removeClass('selectedSubNav'); + if($(e.target).hasClass('mainNavButton')){ + $(e.target).addClass('selectedSubNav'); + } else { + $(e.target.parentElement).addClass('selectedSubNav'); + } + }); - self.toggleBoardList = function(e, data){ - $('#boards.subNavBoardOpts').slideDown(200, 'swing', function(){ - $('#boards.subNavBoardOpts').toggleClass('hide'); - }); - }; + self.toggleBoardList = function(e, data){ + $('#boards.subNavBoardOpts').slideDown(200, 'swing', function(){ + $('#boards.subNavBoardOpts').toggleClass('hide'); + }); + }; - self.toggleProfileList = function(){ - $('#profileLinks.subNavBoardOpts').slideDown(200, 'swing', function(){ - $('#profileLinks.subNavBoardOpts').toggleClass('hide'); - }); - }; + self.toggleProfileList = function(){ + $('#profileLinks.subNavBoardOpts').slideDown(200, 'swing', function(){ + $('#profileLinks.subNavBoardOpts').toggleClass('hide'); + }); + }; - } + } - return { viewModel: NavBarViewModel, template: template }; + return { viewModel: NavBarViewModel, template: template }; -}); \ No newline at end of file + }); diff --git a/src/components/utils/date-pickers/date-pickers.html b/src/components/utils/date-pickers/date-pickers.html index e7f8128..0ad6f5e 100644 --- a/src/components/utils/date-pickers/date-pickers.html +++ b/src/components/utils/date-pickers/date-pickers.html @@ -1,38 +1,36 @@ <div class="form-group"> - <div> + <div> - <label>Choose Preset Time Period:</label> - <div> - <label> - <select class="form-control" id="timePeriodDropdown" data-bind="options: availableTimePresets, value: selectedTimePeriod"></select> - </label> - </div> + <label>Choose Preset Time Period:</label> + <div> + <label> + <select class="form-control" id="timePeriodDropdown" data-bind="options: availableTimePresets, value: selectedTimePeriod"></select> + </label> + </div> - <!-- <label>Or Custom Date & Time:</label> - <div class="input-group" id="customTimepicker"> - <input type="text" class="input-sm form-control" id="customDate" placeholder="Date" data-bind="value: chosenTimePeriodDate" data-provide="datepicker" name="start" /> + <!-- <label>Or Custom Date & Time:</label> + <div class="input-group" id="customTimepicker"> + <input type="text" class="input-sm form-control" id="customDate" placeholder="Date" data-bind="value: chosenTimePeriodDate" data-provide="datepicker" name="start" /> - <div class="input-group" id="customTimepickerRange"> - <div class="bootstrap-timepicker"> - <input id="queryTimepickerFrom" type="text" class="input-sm form-control" placeholder="From Time" data-bind="value: chosenTimePeriodFromTime" data-bind="click: setupTimepicker(event)"> - </div> - <span class="input-group-addon">to</span> - <div class="bootstrap-timepicker"> - <input id="queryTimepickerTo" type="text" class="input-sm form-control" placeholder="Time" data-bind="value: chosenTimePeriodToTime" data-bind="click: setupTimepicker(event)"> - </div> - </div> - </div> + <div class="input-group" id="customTimepickerRange"> + <div class="bootstrap-timepicker"> + <input id="queryTimepickerFrom" type="text" class="input-sm form-control" placeholder="From Time" data-bind="value: chosenTimePeriodFromTime" data-bind="click: setupTimepicker(event)"> + </div> + <span class="input-group-addon">to</span> + <div class="bootstrap-timepicker"> + <input id="queryTimepickerTo" type="text" class="input-sm form-control" placeholder="Time" data-bind="value: chosenTimePeriodToTime" data-bind="click: setupTimepicker(event)"> + </div> + </div> + </div> - <div> - <label>Or Custom Range:</label> - <div class="input-group" id="customDatepicker"> - <input type="text" class="input-sm form-control" placeholder="Date" data-bind="value: dateBeginRange" id="customDateFrom" data-provide="datepicker" name="start" /> - <span class="input-group-addon">to</span> - <input type="text" class="input-sm form-control" placeholder="Date" data-bind="value: dateEndRange" data-provide="datepicker" name="end" /> - </div> - </div> --> - </div> + <div> + <label>Or Custom Range:</label> + <div class="input-group" id="customDatepicker"> + <input type="text" class="input-sm form-control" placeholder="Date" data-bind="value: dateBeginRange" id="customDateFrom" data-provide="datepicker" name="start" /> + <span class="input-group-addon">to</span> + <input type="text" class="input-sm form-control" placeholder="Date" data-bind="value: dateEndRange" data-provide="datepicker" name="end" /> + </div> + </div> --> + </div> - </div> - </div> -</div> \ No newline at end of file +</div> diff --git a/src/components/utils/date-pickers/date-pickers.js b/src/components/utils/date-pickers/date-pickers.js index 984ae59..f93fdfe 100644 --- a/src/components/utils/date-pickers/date-pickers.js +++ b/src/components/utils/date-pickers/date-pickers.js @@ -1,81 +1,81 @@ define( [ - 'knockout', - 'text!components/utils/date-pickers/date-pickers.html', - 'bootstrap-timepicker' -], function( ko, template ){ + 'knockout', + 'text!components/utils/date-pickers/date-pickers.html', + 'bootstrap-timepicker' + ], function( ko, template ){ - function DatePickerViewModel( params ){ - var self = this; + function DatePickerViewModel( params ){ + var self = this; - self.setupTimepicker = function(event){ - $('#' + event.target.id).timepicker({ - template: false, - showMeridian: false - }); - }; + self.setupTimepicker = function(event){ + $('#' + event.target.id).timepicker({ + template: false, + showMeridian: false + }); + }; - //initialize inputs - self.dateBeginRange = ko.observable(''); - self.dateEndRange = ko.observable(''); - self.chosenTimePeriodPresetDate = ko.observable(''); - self.chosenTimePeriodDate = ko.observable(''); - self.chosenTimePeriodFromTime = ko.observable(''); - self.chosenTimePeriodToTime = ko.observable(''); - self.selectedTimePeriod = params.selectedTimePeriod; + //initialize inputs + self.dateBeginRange = ko.observable(''); + self.dateEndRange = ko.observable(''); + self.chosenTimePeriodPresetDate = ko.observable(''); + self.chosenTimePeriodDate = ko.observable(''); + self.chosenTimePeriodFromTime = ko.observable(''); + self.chosenTimePeriodToTime = ko.observable(''); + self.selectedTimePeriod = params.selectedTimePeriod; - //TODO: handle resetting fields - self.chosenTimePeriod = ko.pureComputed( function (){ - var timePeriod; + //TODO: handle resetting fields + self.chosenTimePeriod = ko.pureComputed( function (){ + var timePeriod; - if (self.dateBeginRange() && self.dateEndRange()){ - timePeriod = 'from ' + self.dateBeginRange() + ' to ' + self.dateEndRange(); - } else if(self.chosenTimePeriodPresetDate()){ - timePeriod = self.chosenTimePeriodPresetDate(); - } else if(self.chosenTimePeriodDate() && self.chosenTimePeriodFromTime() && self.chosenTimePeriodToTime()) { - timePeriod = self.chosenTimePeriodDate() + ' from ' + self.chosenTimePeriodFromTime() + ' to ' + self.chosenTimePeriodToTime(); - } + if (self.dateBeginRange() && self.dateEndRange()){ + timePeriod = 'from ' + self.dateBeginRange() + ' to ' + self.dateEndRange(); + } else if(self.chosenTimePeriodPresetDate()){ + timePeriod = self.chosenTimePeriodPresetDate(); + } else if(self.chosenTimePeriodDate() && self.chosenTimePeriodFromTime() && self.chosenTimePeriodToTime()) { + timePeriod = self.chosenTimePeriodDate() + ' from ' + self.chosenTimePeriodFromTime() + ' to ' + self.chosenTimePeriodToTime(); + } - return timePeriod; + return timePeriod; - }); + }); - self.submitTimePeriod = function(){ - console.log('the time period was submitted'); - }; + self.submitTimePeriod = function(){ + console.log('the time period was submitted'); + }; - self.shouldShowIncrements = ko.computed( function(){ - return true; - }); + self.shouldShowIncrements = ko.computed( function(){ + return true; + }); - self.shouldShowCustom = ko.computed( function(){ - return true; - }); + self.shouldShowCustom = ko.computed( function(){ + return true; + }); - self.availableTimePresets = ko.observableArray([ - 'Last 15 Minutes', - 'Last Hour', - 'Last 24 Hours', - 'Last 5 Minutes' - ]); + self.availableTimePresets = ko.observableArray([ + 'Last 15 Minutes', + 'Last Hour', + 'Last 24 Hours', + 'Last 5 Minutes' + ]); - self.availableIncrementTypes = ko.observableArray([ - 'Hour...', - 'Day...', - 'Week...', - 'Month...', - 'Year...' - ]); + self.availableIncrementTypes = ko.observableArray([ + 'Hour...', + 'Day...', + 'Week...', + 'Month...', + 'Year...' + ]); - self.selectedIncrement = ko.observable(); + self.selectedIncrement = ko.observable(); - self.getIncrementSubmenu = ko.computed( function(){ + self.getIncrementSubmenu = ko.computed( function(){ - }); + }); - } + } - return { viewModel: DatePickerViewModel, template: template }; + return { viewModel: DatePickerViewModel, template: template }; -}); \ No newline at end of file + }); diff --git a/src/components/widgets/ABTesting/ABTestingMain.html b/src/components/widgets/ABTesting/ABTestingMain.html index cb11962..7c4e1e8 100644 --- a/src/components/widgets/ABTesting/ABTestingMain.html +++ b/src/components/widgets/ABTesting/ABTestingMain.html @@ -1,53 +1,53 @@ <div id="ABTestingMainWidget"> - <div class="row"> + <div class="row"> - <nav class="navbar navbar-default"> - <div class="container-fluid"> - <div class="navbar-header"> - <h1 data-bind="text: title"></h1> - </div> + <nav class="navbar navbar-default"> + <div class="container-fluid"> + <div class="navbar-header"> + <h1 data-bind="text: title"></h1> + </div> - <ul class="navbar-form navbar-right"> - <div class="form-group"> - <input type="text" class="form-control" placeholder="Test Start Time"> - <input type="text" class="form-control" placeholder="Test End Time"> - <div class="btn-group"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> - Group By <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - <li><a href="#">Banner</a></li> - <li><a href="#">Payment Method</a></li> - <li><a href="#">Country</a></li> - <li><a href="#">Language</a></li> - </ul> - </div> - </div> - <button type="submit" class="btn btn-warning navbar-btn">Get Test Results</button> - </ul> - </div> - </nav> + <ul class="navbar-form navbar-right"> + <div class="form-group"> + <input type="text" class="form-control" placeholder="Test Start Time"> + <input type="text" class="form-control" placeholder="Test End Time"> + <div class="btn-group"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> + Group By <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Banner</a></li> + <li><a href="#">Payment Method</a></li> + <li><a href="#">Country</a></li> + <li><a href="#">Language</a></li> + </ul> + </div> + </div> + <button type="submit" class="btn btn-warning navbar-btn">Get Test Results</button> + </ul> + </div> + </nav> - <table class="table"> + <table class="table"> - <tr> - <td></td> - <td data-bind="text: winner"></td> - <td data-bind="text: runnerUp"></td> - </tr> + <tr> + <td></td> + <td data-bind="text: winner"></td> + <td data-bind="text: runnerUp"></td> + </tr> - <span data-bind="foreach: table1"> + <span data-bind="foreach: table1"> - <tr> - <td data-bind="text: table1.donations"></td> - </tr> + <tr> + <td data-bind="text: table1.donations"></td> + </tr> - </span> + </span> - </table> + </table> - </div> + </div> -</div> \ No newline at end of file +</div> diff --git a/src/components/widgets/fraud-gauge/fraud-gauge.html b/src/components/widgets/fraud-gauge/fraud-gauge.html index d7e8806..bbdbb6f 100644 --- a/src/components/widgets/fraud-gauge/fraud-gauge.html +++ b/src/components/widgets/fraud-gauge/fraud-gauge.html @@ -1,146 +1,148 @@ <div id="fraudGaugeWidget" class="panel panel-purple widget-6"> - <div class="panel-heading"> - <span data-bind='text: title'></span> - <div class="btn-group btn-group-xs pull-right"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="modal" data-target="#sqlModal"><i class="fa fa-database"></i></button> - <button type="button" class="btn btn-default" data-toggle="modal" data-target="#modifyModal" data-bind="click: renderPercentRangeChart"><i class="fa fa-edit"></i></button> - <button type="button" class="btn btn-danger" data-bind="visible: !chartSaved() && optionStateChanged, click: saveWidgetConfig"><i class="fa fa-save"></i></button> - <button type="button" class="btn btn-success" data-bind="visible: chartSaved && !optionStateChanged()"><i class="fa fa-save"></i> Saved</button> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="modal" data-bind="attr: { 'data-target': '#remove'+instanceID }"><i class="fa fa-times"></i></button> - </div> - </div> - <div class="panel-body"> + <div class="panel-heading"> + <span data-bind='text: title'></span> + <div class="btn-group btn-group-xs pull-right"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="modal" data-target="#sqlModal"><i class="fa fa-database"></i></button> + <button type="button" class="btn btn-default" data-toggle="modal" data-target="#modifyModal" data-bind="click: renderPercentRangeChart"><i class="fa fa-edit"></i></button> + <button type="button" class="btn btn-danger" data-bind="visible: !chartSaved() && optionStateChanged, click: saveWidgetConfig"><i class="fa fa-save"></i></button> + <button type="button" class="btn btn-success" data-bind="visible: chartSaved && !optionStateChanged()"><i class="fa fa-save"></i> Saved</button> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="modal" data-bind="attr: { 'data-target': '#remove'+instanceID }"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="panel-body"> - <div class="row"> - <div class="gauge"> + <div class="row"> + <div class="gauge"> - <div class="row"> - <h3 class="text-center" data-bind="visible: configSet, text: selectedTimePeriod"></h3> - </div> + <div class="row"> + <h3 class="text-center" data-bind="visible: configSet, text: selectedTimePeriod"></h3> + </div> - <div class="row" id="specifiedFraudGauge" data-bind="if: configSet"> - <div id="FraudRiskScoreGauge" data-bind='c3: gauge'></div> - </div> + <div class="row" id="specifiedFraudGauge" data-bind="if: configSet"> + <div id="FraudRiskScoreGauge" data-bind='c3: gauge'></div> + </div> - <div class="row" id="unspecifiedFraudGauge" data-bind="if: !configSet()"> - <div class="col-md-12"> - <div class="setupAsk"> - <h3>This widget hasn't been set up yet.</h3> - <button type="button" class="btn btn-primary btn-lg btn-block" data-toggle="modal" data-target="#modifyModal" data-bind="click: renderPercentRangeChart">Set it up</button> - </div> - </div> - </div> + <div class="row" id="unspecifiedFraudGauge" data-bind="if: !configSet()"> + <div class="col-md-12"> + <div class="setupAsk"> + <h3>This widget hasn't been set up yet.</h3> + <button type="button" class="btn btn-primary btn-lg btn-block" data-toggle="modal" data-target="#modifyModal" data-bind="click: renderPercentRangeChart">Set it up</button> + </div> + </div> + </div> - <div class="row" id="fraudGaugeMeta" data-bind="visible: configSet"> - <p class="text-center"><span data-bind="visible: filtersSelected()">By: </span><span class="label label-info" data-bind="text: selectedFilters"></span></p> - </div> + <div class="row" id="fraudGaugeMeta" data-bind="visible: configSet"> + <p class="text-center"><span data-bind="visible: filtersSelected()">By: </span><span class="label label-info" data-bind="text: selectedFilters"></span></p> + </div> - <div class="modal fade" id="modifyModal"> - <div class="modal-dialog"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> - <h4 class="modal-title">Modify Gauge Settings</h4> - </div> - <div class="modal-body"> + <div class="modal fade" id="modifyModal"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> + <h4 class="modal-title">Modify Gauge Settings</h4> + </div> + <div class="modal-body"> - <form role="form" class="fraudForm"> - <div class="form-group"> - <div class="well"> - <label for="fraudPercentRanges">Fraud Percent Ranges</label> - <p>set up the colors as they'll appear in the gauge.</p> - <canvas id="fraudPercentRanges" width="200" height="120"></canvas> - <div class="row"> - <div class="col-md-4 col-sm-4 col-lg-4"> - <label>low fraud score: up to</label> - <div class="input-group"> - <input type="text" class="form-control" data-bind="textInput: greenHighRange, event: { mouseout: renderPercentRangeChart }"> - <span class="input-group-btn"> - <button class="btn btn-success percentBtn" type="button"><i class="fa fa-refresh"></i></button> - </span> - </div> - </div> - <div class="col-md-4 col-sm-4 col-lg-4"> - <label>mid-level score:</label> - <div class="input-group"> - <span class="input-group-btn"> - <button class="btn btn-warning percentBtn" type="button"><span data-bind="text:greenHighRange() + '% to ' + redLowRange() + '%'"></button> - </span> - </div> - </div> - <div class="col-md-4 col-sm-4 col-lg-4"> - <label>high fraud score: from</label> - <div class="input-group"> - <input type="text" class="form-control" data-bind="textInput: redLowRange, event: { mouseout: renderPercentRangeChart }"> - <span class="input-group-btn"> - <button class="btn btn-danger percentBtn" type="button"><i class="fa fa-refresh"></i></button> - </span> - </div> - </div> - </div> - </div> - </div> + <form role="form" class="fraudForm"> + <div class="form-group"> + <div class="well"> + <label for="fraudPercentRanges">Fraud Percent Ranges</label> + <p>set up the colors as they'll appear in the gauge.</p> + <canvas id="fraudPercentRanges" width="200" height="120"></canvas> + <div class="row"> + <div class="col-md-4 col-sm-4 col-lg-4"> + <label>low fraud score: up to</label> + <div class="input-group"> + <input type="text" class="form-control" data-bind="textInput: greenHighRange, event: { mouseout: renderPercentRangeChart }"> + <span class="input-group-btn"> + <button class="btn btn-success percentBtn" type="button"><i class="fa fa-refresh"></i></button> + </span> + </div> + </div> + <div class="col-md-4 col-sm-4 col-lg-4"> + <label>mid-level score:</label> + <div class="input-group"> + <span class="input-group-btn"> + <button class="btn btn-warning percentBtn" type="button"><span data-bind="text:greenHighRange() + '% to ' + redLowRange() + '%'"></button> + </span> + </div> + </div> + <div class="col-md-4 col-sm-4 col-lg-4"> + <label>high fraud score: from</label> + <div class="input-group"> + <input type="text" class="form-control" data-bind="textInput: redLowRange, event: { mouseout: renderPercentRangeChart }"> + <span class="input-group-btn"> + <button class="btn btn-danger percentBtn" type="button"><i class="fa fa-refresh"></i></button> + </span> + </div> + </div> + </div> + </div> + </div> - <!--Call Date Pickers Component to handle date range--> - <date-pickers params="selectedTimePeriod: selectedTimePeriod"></date-pickers> + <!--Call Date Pickers Component to handle date range--> + <date-pickers params="selectedTimePeriod: selectedTimePeriod"></date-pickers> - <div class="form-group filterPickerForm"> - <label>Filter By:</label><br> - <p class="small text-warning" style="display: inline"><i class="fa fa-lightbulb-o"></i> by default, the result will be "all of the above."</p> - <ul class="filterPickerList nav nav-tabs" id="filterNav" role="tablist" data-bind="foreach: filters"> - <li data-bind="visible: $data.values"> - <input type="checkbox" data-bind="checkedValue: display, checked: $parent.selectedFilters, click: $parent.showSubfilters(display)"><span data-bind="text: display"></span> - <ul class="hide filterPickerList subfilterSubnav" data-bind="attr: {'id': display}, foreach: $data.values"> - <li> - <input type="checkbox" class="filterChoices" data-bind="value: ($parentContext.$data.display + ' eq \'' + $data + '\''), checked: $parents[1].selectedSubFilters"><span data-bind="text: $data"></span> - </li> - </ul> - </li> - </ul> - </div> + <div class="form-group filterPickerForm"> + <label>Filter By:</label><br> + <p class="small text-warning" style="display: inline"><i class="fa fa-lightbulb-o"></i> by default, the result will be "all of the above."</p> + <ul class="filterPickerList nav nav-tabs" id="filterNav" role="tablist" data-bind="foreach: filters"> + <li data-bind="visible: $data.values"> + <input type="checkbox" data-bind="checkedValue: display, checked: $parent.selectedFilters, click: $parent.showSubfilters(display)"><span data-bind="text: display"></span> + <ul class="hide filterPickerList subfilterSubnav" data-bind="attr: {'id': display}, foreach: $data.values"> + <li> + <input type="checkbox" class="filterChoices" data-bind="value: ($parentContext.$data.display + ' eq \'' + $data + '\''), checked: $parents[1].selectedSubFilters"><span data-bind="text: $data"></span> + </li> + </ul> + </li> + </ul> + </div> - </form> - </div> - <div class="modal-footer"> - <div class="alert alert-danger hide" id="fraudSubmissionErrors"> - <p class="text-danger .errors"></p> - </div> - <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> - <button type="button" class="btn btn-success" data-dismiss="modal" data-bind="click: submitGaugeModifications.bind(true)">Submit</button> - </div> - </div><!-- /.modal-content --> - </div><!-- /.modal-dialog --> - </div><!-- /.modal --> + </form> + </div> + <div class="modal-footer"> + <div class="alert alert-danger hide" id="fraudSubmissionErrors"> + <p class="text-danger .errors"></p> + </div> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + <button type="button" class="btn btn-success" data-dismiss="modal" data-bind="click: submitGaugeModifications.bind(true)">Submit</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> - <div class="modal fade" id="sqlModal"> - <div class="modal-dialog"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> - <h4 class="modal-title">Fraud Gauge SQL:</h4> - </div> - <div class="modal-body" data-bind="text: queryStringSQL"></div> - </div><!-- /.modal-content --> - </div><!-- /.modal-dialog --> - </div><!-- /.modal --> + <div class="modal fade" id="sqlModal"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> + <h4 class="modal-title">Fraud Gauge SQL:</h4> + </div> + <div class="modal-body" data-bind="text: queryStringSQL"></div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> - </div> - </div> - </div> + </div> + </div> + </div> -</div> + </div> -<div class="modal fade" data-bind="attr: { id: 'remove'+instanceID } "> - <div class="modal-dialog modal-sm"> - <div class="modal-content"> - <div class="modal-header"> - <h2>Remove this widget from the board?</h2> - </div> - <div class="modal-body"> - <button class="btn btn-lg btn-success pull-right" data-dismiss="modal" data-bind="click: $parents[2].removeWidgetFromBoard"> OK</button> - <button class="btn btn-lg btn-danger pull-right" data-dismiss="modal"> Cancel</button> - </div> - </div><!-- /.modal-content --> - </div> + <div class="modal fade" data-bind="attr: { id: 'remove'+instanceID } "> + <div class="modal-dialog modal-sm"> + <div class="modal-content"> + <div class="modal-header"> + <h2>Remove this widget from the board?</h2> + </div> + <div class="modal-body"> + <button class="btn btn-lg btn-success pull-right" data-dismiss="modal" data-bind="click: $parents[2].removeWidgetFromBoard"> OK</button> + <button class="btn btn-lg btn-danger pull-right" data-dismiss="modal"> Cancel</button> + </div> + </div><!-- /.modal-content --> + </div> + </div> + </div> diff --git a/src/css/style.css b/src/css/style.css index e039ce8..e4553c6 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -1,471 +1,471 @@ html { - margin:0; - padding:0; + margin:0; + padding:0; } body { - background-color: #f5f5f5; - font-family: "Lato"; - margin:0; - padding:0; + background-color: #f5f5f5; + font-family: "Lato"; + margin:0; + padding:0; } .container-fluid { - padding: 12px 85px; + padding: 12px 85px; } #dashApp { - padding-left: 175px; - transition: all 0.4s ease 0s; + padding-left: 175px; + transition: all 0.4s ease 0s; } #dashApp .container { - padding-top: 50px; + padding-top: 50px; } .navRow { - width: 200px; - padding:0; - margin: 0; + width: 200px; + padding:0; + margin: 0; } .navWrapper { - margin-left: -200px; - left: 200px; - width: 200px; - position: fixed; - height: 100%; - overflow-y: auto; - z-index: 1000; - transition: all 0.4s ease 0s; - background-color: #5e668a; - color: #f5f5f5; + margin-left: -200px; + left: 200px; + width: 200px; + position: fixed; + height: 100%; + overflow-y: auto; + z-index: 1000; + transition: all 0.4s ease 0s; + background-color: #5e668a; + color: #f5f5f5; } select { - height: 37px; - border-radius: none; + height: 37px; + border-radius: none; } .sidebar-nav ul { - list-style-type: none; - width: 100%; - padding: 0; - background-color: rgba(255,255,255,0.2); - margin-bottom: 0; + list-style-type: none; + width: 100%; + padding: 0; + background-color: rgba(255,255,255,0.2); + margin-bottom: 0; } .mainNavButton, .mainNavButtonLogin { - font-size: 16px; - font-weight: normal; - width: 100%; - text-align: left; - padding: 1em; - border-bottom: rgba(255,255,255,0.3) solid 1px; - overflow: hidden; + font-size: 16px; + font-weight: normal; + width: 100%; + text-align: left; + padding: 1em; + border-bottom: rgba(255,255,255,0.3) solid 1px; + overflow: hidden; } .mainNavButton i { - margin-right: 8px; + margin-right: 8px; } .mainNavButton:hover { - cursor: pointer; + cursor: pointer; } .sidebar-nav a { - color: #f5f5f5; + color: #f5f5f5; } .setupAsk { - margin: 0 auto; - background-color: rgba(0,0,0,0.03); - padding: 5%; - font-size: 1.4em; - color: rgba(0,0,0,0.6); + margin: 0 auto; + background-color: rgba(0,0,0,0.03); + padding: 5%; + font-size: 1.4em; + color: rgba(0,0,0,0.6); } .setupWidget { - background-color: rgba(217,83,79, 0.7); + background-color: rgba(217,83,79, 0.7); } #collapseNavMenu { - background-color: rgba(255,255,255,0.4); + background-color: rgba(255,255,255,0.4); } #collapseNavMenu:hover { - background-color: rgba(255,255,255,0.7); - color: #5e668a; - cursor: pointer; + background-color: rgba(255,255,255,0.7); + color: #5e668a; + cursor: pointer; } .collapsedNavMenu { - width: 15px; - transition-duration: 1s; + width: 15px; + transition-duration: 1s; } #mainNav ul{ - list-style-type: none; - cursor: pointer; + list-style-type: none; + cursor: pointer; } .libraryTitle { - margin-bottom: .5em; + margin-bottom: .5em; } #showNavMenu { - display: none; - position: fixed; - top: 10px; - left: 10px; - cursor: pointer; + display: none; + position: fixed; + top: 10px; + left: 10px; + cursor: pointer; } .selectedSubNav { - background-color: #f5f5f5; - color: #5e668a; - cursor: pointer; - border-top: 1px rgba(94,102,138,0.5) solid; + background-color: #f5f5f5; + color: #5e668a; + cursor: pointer; + border-top: 1px rgba(94,102,138,0.5) solid; } .subNavButton { - background-color: rgba(255,255,255,0.5); - color: #5e668a; - cursor: pointer; - transition:700ms ease-in; + background-color: rgba(255,255,255,0.5); + color: #5e668a; + cursor: pointer; + transition:700ms ease-in; } .subNavButton { - border-top: 1px rgba(94,102,138,0.5) solid; + border-top: 1px rgba(94,102,138,0.5) solid; } .subNavButton a { - color: #5e668a; + color: #5e668a; } .subNavBoardOpts li { - padding: 10px; - text-align: right; - border-top: 1px rgba(94, 102, 138, 0.2) solid; + padding: 10px; + text-align: right; + border-top: 1px rgba(94, 102, 138, 0.2) solid; } .subNavBoardOpts li:hover { - background-color: rgba(94,102,138,0.2); + background-color: rgba(94,102,138,0.2); } #welcomeTitle { - margin-bottom: 50px; - border-bottom: 1px #555 solid; + margin-bottom: 50px; + border-bottom: 1px #555 solid; } .titlebrand, .titlebrandToggle { - background-color: #d9534f; - overflow: hidden; - padding: 12px; - margin: 0; + background-color: #d9534f; + overflow: hidden; + padding: 12px; + margin: 0; } .titlebrand:hover { - background-color: #c12e2a; - cursor: pointer; + background-color: #c12e2a; + cursor: pointer; } .titlebrandToggle { - padding: 5px; - margin-left: 5px; + padding: 5px; + margin-left: 5px; } .titlebrandToggle:hover { - background-color: #fff; - color: #F15854; + background-color: #fff; + color: #F15854; } .titleCol { - padding: 0; + padding: 0; } .titleCol p { - color: #555; + color: #555; } /* MAIN BASE QUALITY STYLEINGS */ .avatar { - height: 70px; - width: 70px; - border-radius: 35px; - margin: 18px 10px; + height: 70px; + width: 70px; + border-radius: 35px; + margin: 18px 10px; } .boxedIcon { - color: #333; - font-size: 18px; - color: rgba(0,0,0,0.2); - background-color: rgba(0,0,0,0.05); - padding: .5em; + color: #333; + font-size: 18px; + color: rgba(0,0,0,0.2); + background-color: rgba(0,0,0,0.05); + padding: .5em; } .smallIcon { - color: #333; - font-size: 13px; - color: #fff; + color: #333; + font-size: 13px; + color: #fff; } .lightWell { - background-color: rgba(0,0,0,0.009); + background-color: rgba(0,0,0,0.009); } .whiteWell { - background-color: #fff; + background-color: #fff; } .noUi-base { - background-color: #dff0d8; + background-color: #dff0d8; } .noUi-background { - background-color: #f2dede; + background-color: #f2dede; } .noUi-connect { - background-color: #fcf8e3; + background-color: #fcf8e3; } /* WIDGET BASE STYLINGS */ .alert { - overflow: hidden; + overflow: hidden; } .factbox { - width: 100%; - padding: 7px; - color: #f5f5f5; + width: 100%; + padding: 7px; + color: #f5f5f5; } .factbox h3 { - font-size: 2em; + font-size: 2em; } .factbox-blue { - background-color: rgb(49,176,213); + background-color: rgb(49,176,213); } .factbox-yellow { - background-color: rgb(92,184,92); + background-color: rgb(92,184,92); } .factbox-red { - background-color: rgb(217,83,79); + background-color: rgb(217,83,79); } .factbox-icon { - font-size: 4em; - text-align: center; - padding:0; + font-size: 4em; + text-align: center; + padding:0; } .factbox-header { - margin-top: 10px; - margin-bottom: -12px; + margin-top: 10px; + margin-bottom: -12px; } /* TODO: finish this schema */ /* Different widget class sizes */ .widget-6 { - width: 47%; - display:inline-block; + width: 47%; + display:inline-block; } /* Big English */ #bigEnglishThermometer { - margin-top: 10px; + margin-top: 10px; } .bigEnglish-updates .row { - margin: 0 0 10px 0; - border-bottom: 1px #ccc solid; + margin: 0 0 10px 0; + border-bottom: 1px #ccc solid; } .transparent { - background-color: #f5f5f5; + background-color: #f5f5f5; } /* Gauges */ .fraudGauge { - padding: 0; - display: inline-block; - clear:right; + padding: 0; + display: inline-block; + clear:right; } #fraudGaugeWidget .panel-body { - padding: 0; + padding: 0; } #fraudGaugeMeta { - margin: 10px; + margin: 10px; } #FraudRiskScoreGauge { - width: 390px; - margin: -90px auto 0 auto; + width: 390px; + margin: -90px auto 0 auto; } #fraudPercentRanges { - margin: 0 auto; - display: inherit; + margin: 0 auto; + display: inherit; } #queryButton { - cursor: pointer; + cursor: pointer; } ul.filterPickerList { - list-style-type: none; - margin: 0; - padding: 0; + list-style-type: none; + margin: 0; + padding: 0; } .filterPickerList > li { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } .subFilterPickerList input { - height: 12px; + height: 12px; } #filterNav > li > input, .subfilterSubnav > li > input{ - vertical-align: middle; - margin-right:3px; + vertical-align: middle; + margin-right:3px; } #filterNav > li { - width: 25%; - padding:10px 0 0 0; + width: 25%; + padding:10px 0 0 0; } #filterNav.nav-tabs { - border: none; + border: none; } .subfilterSubnav { - margin-left: -35px; + margin-left: -35px; } #customTimePicker { - width: 100px; + width: 100px; } #customDate { - width: 100px; + width: 100px; } .input-sm.form-control{ - height: 34px; - font-size: 14px; + height: 34px; + font-size: 14px; } #chosenTimePeriod { - margin: 15px 0 -15px 0; + margin: 15px 0 -15px 0; } #customTimepickerRange { - margin-left: 7px; + margin-left: 7px; } #fraudSubmissionErrors { - text-align: left; + text-align: left; } #unspecifiedFraudGauge.row{ - margin: 10px; + margin: 10px; } .btn.percentBtn { - padding: .44em; + padding: .44em; } .btn.btn-warning.percentBtn { - width: 100%; + width: 100%; } .addToBoardBtn { - bottom: 0; + bottom: 0; } .widgetDesc { - height: 70px; + height: 70px; } /* BOOTSTRAP OVERRIDES */ .btn { - border-radius: 0; - padding: .7em; + border-radius: 0; + padding: .7em; } .btn-col { - margin: 5px 0; + margin: 5px 0; } .btn-mint { - background-color: rgb(220,245,242); - color: #5e668a; + background-color: rgb(220,245,242); + color: #5e668a; } .btn-mint:hover { - background-color: rgba(220,245,242,0.9); - color: #000; + background-color: rgba(220,245,242,0.9); + color: #000; } a:hover { - text-decoration: none; + text-decoration: none; } input { - height: 28px; + height: 28px; } .modal-body { - overflow: hidden; + overflow: hidden; } #loadingModal .modal-content { - padding: 10px; + padding: 10px; } .navbar-fixed-top { - height: 70px; + height: 70px; } .padded { - padding: 1em; + padding: 1em; } .panel { - vertical-align: top; - min-height: 355px; - margin-right: 1.4em; + vertical-align: top; + min-height: 355px; + margin-right: 1.4em; } .panel-transparent { - border-color: #ccc; + border-color: #ccc; } .panel-purple { - border-color: #ccc; + border-color: #ccc; } .panel-purple > .panel-heading { - color: #f5f5f5; - background-color: rgb(94,102,138); - border-color: #5e668a; - height:33px; - padding:5px 5px 0 10px; + color: #f5f5f5; + background-color: rgb(94,102,138); + border-color: #5e668a; + height:33px; + padding:5px 5px 0 10px; } .panel-heading button { @@ -473,166 +473,166 @@ } .panel-purple > .panel-heading + .panel-collapse .panel-body { - border-top-color: #5e668a; + border-top-color: #5e668a; } .panel-purple > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #5e668a; + border-bottom-color: #5e668a; } .label { - font-weight: normal; + font-weight: normal; } .layoutRow:first-child, .layoutRow .firstWidget { - padding-left: 0; + padding-left: 0; } .layoutRow:last-child, .layoutRow .lastWidget { - padding-right: 0; + padding-right: 0; } .datepicker { - z-index: 1151 !important; + z-index: 1151 !important; } .datePickerForm input[type="radio"], input[type="checkbox"] { - margin: -4px 0 0 0; + margin: -4px 0 0 0; } .input-daterange .add-on{ - margin-top: -4px; - height: 27px; + margin-top: -4px; + height: 27px; } #queryTimepickerFrom.input-small, #queryTimepickerTo.input-small { - width: 100px; + width: 100px; } .sliderTable { - width: 50%; - margin-top: -30px; - font-weight: bold; + width: 50%; + margin-top: -30px; + font-weight: bold; } .sliderTable > tbody > tr > td { - border-top: none; + border-top: none; } /* Charts are only so useful when small */ .widgetDisplayRow { - min-width: 875px; + min-width: 875px; } .widgetPlace { - display: inline; + display: inline; } /* C3 Bar Chart Styles */ .c3-region { - fill: red; - fill-opacity: .1; + fill: red; + fill-opacity: .1; } #distanceToGoalChart { - padding: 0 9px 0 0; + padding: 0 9px 0 0; } .goalText { - font-size: 1.5em; - margin-top: 1em; + font-size: 1.5em; + margin-top: 1em; } .loading, .loadingWidget { - background-color: #5bc0de; - opacity: .85; - border-radius: 25px; - padding: 37px; - color: #ffffff; - z-index: 99999; - font-size: 110%; - height: 192px; - width: 192px; + background-color: #5bc0de; + opacity: .85; + border-radius: 25px; + padding: 37px; + color: #ffffff; + z-index: 99999; + font-size: 110%; + height: 192px; + width: 192px; } .loading { - position: fixed; - top: 360px; - left: 50%; - margin-top: -96px; - margin-left: -96px; + position: fixed; + top: 360px; + left: 50%; + margin-top: -96px; + margin-left: -96px; } .loadingWidget { - position: absolute; - display: block; - margin: 10% 43%; + position: absolute; + display: block; + margin: 10% 43%; } .loading div { - margin-left: 10px; + margin-left: 10px; } #demoChart { - margin-left:30px; + margin-left:30px; } #savedChartsMenu { - padding: 5px; - color: #555; + padding: 5px; + color: #555; } #savedChartsMenu li { - padding: 3px; + padding: 3px; } #savedChartsMenu li:hover{ - background-color: rgba(0,0,0,0.05); + background-color: rgba(0,0,0,0.05); } .select2-container-multi .select2-choices { - min-height: 36px; - min-width: 200px; - margin-left: 1px; + min-height: 36px; + min-width: 200px; + margin-left: 1px; } .widgetLibrary { - list-style-type: none; - margin: 0; - padding: 0; + list-style-type: none; + margin: 0; + padding: 0; } .widgetLibraryTitle { - margin-left: 10px; + margin-left: 10px; } .widgetLibrary li { - display: inline-block; - padding: 20px; - margin: 10px; - background-color: rgba(49,176,213,0.6); - color: #f5f5f5; - width: 250px; - height: 320px; - overflow: hidden; - border-bottom: 7px solid rgb(49,176,213); - border-radius: 4px 4px 0 0; + display: inline-block; + padding: 20px; + margin: 10px; + background-color: rgba(49,176,213,0.6); + color: #f5f5f5; + width: 250px; + height: 320px; + overflow: hidden; + border-bottom: 7px solid rgb(49,176,213); + border-radius: 4px 4px 0 0; } .widgetLibrary li:hover { - background-color: rgb(49,176,213); + background-color: rgb(49,176,213); } .widgetLibrary img { - width: 210px; - height: 100px; + width: 210px; + height: 100px; } .xyGroupOption { - overflow: hidden; - min-width: 250px; - margin: 10px auto; + overflow: hidden; + min-width: 250px; + margin: 10px auto; } .xyGroupOption .panel-heading{ - overflow: hidden; -} \ No newline at end of file + overflow: hidden; +} diff --git a/src/index.html b/src/index.html index 8eeff7d..4ce43d0 100644 --- a/src/index.html +++ b/src/index.html @@ -1,29 +1,29 @@ <!DOCTYPE html> <html lang="en"> <head> - <!--build:css--> - <link rel="stylesheet" type="text/css" href="bower_modules/bootstrap/dist/css/bootstrap.css"/> - <link rel="stylesheet" type="text/css" href="bower_modules/fontawesome/css/font-awesome.css"/> - <link rel="stylesheet" type="text/css" href="bower_modules/lato/css/lato.css"/> - <link rel="stylesheet" type="text/css" href="bower_modules/nouislider/src/jquery.nouislider.css"/> - <link rel="stylesheet" type="text/css" href="bower_modules/select2/select2.css"/> - <link rel="stylesheet" type="text/css" href="bower_modules/c3/c3.css"/> - <link rel="stylesheet" type="text/css" href="css/style.css"/> - <!--endbuild--> +<!--build:css--> +<link rel="stylesheet" type="text/css" href="bower_modules/bootstrap/dist/css/bootstrap.css"/> +<link rel="stylesheet" type="text/css" href="bower_modules/fontawesome/css/font-awesome.css"/> +<link rel="stylesheet" type="text/css" href="bower_modules/lato/css/lato.css"/> +<link rel="stylesheet" type="text/css" href="bower_modules/nouislider/src/jquery.nouislider.css"/> +<link rel="stylesheet" type="text/css" href="bower_modules/select2/select2.css"/> +<link rel="stylesheet" type="text/css" href="bower_modules/c3/c3.css"/> +<link rel="stylesheet" type="text/css" href="css/style.css"/> +<!--endbuild--> - <!--build:js--> - <script src="bower_modules/raphael/raphael.js"></script> - <script src="app/require.config.js"></script> - <script data-main="app/startup" src="bower_modules/requirejs/require.js"></script> - <!--endbuild--> +<!--build:js--> +<script src="bower_modules/raphael/raphael.js"></script> +<script src="app/require.config.js"></script> +<script data-main="app/startup" src="bower_modules/requirejs/require.js"></script> +<!--endbuild--> </head> <body> <section id="dashApp"> - <app-content></app-content> + <app-content></app-content> </section> </body> -</html> \ No newline at end of file +</html> diff --git a/widgets/index.js b/widgets/index.js index bcb02c3..6770efa 100644 --- a/widgets/index.js +++ b/widgets/index.js @@ -1,9 +1,9 @@ var path = require('path'); require('fs').readdirSync(__dirname) - .filter(function(file) { - return ((file.indexOf('.') !== 0) && (file !== 'index.js') && (file.slice(-3) === '.js')); - }) - .forEach(function(file) { - module.exports[file.substr(0,file.length - 3)] = require(path.join(__dirname, file)); + .filter(function(file) { + return ((file.indexOf('.') !== 0) && (file !== 'index.js') && (file.slice(-3) === '.js')); +}) + .forEach(function(file) { + module.exports[file.substr(0,file.length - 3)] = require(path.join(__dirname, file)); }); -- To view, visit https://gerrit.wikimedia.org/r/211914 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7bd8eaf927e0baef5b11dc6184dfa2c7f9e5405b Gerrit-PatchSet: 1 Gerrit-Project: wikimedia/fundraising/dash Gerrit-Branch: master Gerrit-Owner: Cdentinger <cdentin...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits