From 75761ca83cb87f08a4fdfd3e90e76525f6202b33 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Sun, 27 Sep 2015 19:38:02 -0500 Subject: [PATCH 01/18] move from grunt to gulp, remove dependency on bower, break up points center js into separate files and incorporate browserify, update datatables to new api, update typeaheadjs to new api, replace hogan with lodash.template, namespace points table css so it can be included with global css, lint js with eslint, and lots more --- .eslintrc | 110 ++ .gitignore | 4 +- Gruntfile.js | 120 -- ajax/PointsCenter.php | 12 +- ajax/getSlivkans.php | 3 +- base.php | 6 +- bower.json | 35 - css/add2home.css | 1 - css/bootstrap-multiselect.css | 1 - css/bootstrap-theme.css | 1 - css/bootstrap.css | 1 - css/font-awesome.css | 1 - css/nprogress.css | 1 - css/{pointsCenter.css => points-center.css} | 23 +- css/{pointsTable.css => points-table.css} | 159 +- css/typeahead.js-bootstrap.css | 16 +- footer.html | 8 +- gulpfile.js | 152 ++ header.html | 2 +- js/directory.js | 37 +- js/iframeHeight.js | 14 +- js/points-center/admin.js | 331 ++++ js/points-center/breakdown.js | 210 ++ js/points-center/committee-headquarters.js | 228 +++ js/points-center/correction.js | 88 + js/points-center/index.js | 35 + js/points-center/rankings.js | 137 ++ js/points-center/submission.js | 789 ++++++++ js/points-center/table.js | 149 ++ js/points-center/utils.js | 97 + js/pointsCenter.js | 1977 ------------------- js/require.js | 1 - js/require.min.js | 36 - package.json | 59 +- pointsCenter.build.js | 80 - spc-admin.php | 506 +++-- spc-breakdown.php | 212 +- spc-committee-headquarters.php | 28 +- spc-correction.php | 2 +- spc-submission.php | 6 +- spc-table.php | 130 +- test/tests.html | 14 - test/tests.js | 3 - 43 files changed, 2937 insertions(+), 2888 deletions(-) create mode 100644 .eslintrc delete mode 100644 Gruntfile.js delete mode 100644 bower.json delete mode 120000 css/add2home.css delete mode 120000 css/bootstrap-multiselect.css delete mode 120000 css/bootstrap-theme.css delete mode 120000 css/bootstrap.css delete mode 120000 css/font-awesome.css delete mode 120000 css/nprogress.css rename css/{pointsCenter.css => points-center.css} (93%) rename css/{pointsTable.css => points-table.css} (76%) create mode 100644 gulpfile.js create mode 100644 js/points-center/admin.js create mode 100644 js/points-center/breakdown.js create mode 100644 js/points-center/committee-headquarters.js create mode 100644 js/points-center/correction.js create mode 100644 js/points-center/index.js create mode 100644 js/points-center/rankings.js create mode 100644 js/points-center/submission.js create mode 100644 js/points-center/table.js create mode 100644 js/points-center/utils.js delete mode 100644 js/pointsCenter.js delete mode 120000 js/require.js delete mode 100644 js/require.min.js delete mode 100755 pointsCenter.build.js delete mode 100644 test/tests.html delete mode 100644 test/tests.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..0b5174a --- /dev/null +++ b/.eslintrc @@ -0,0 +1,110 @@ +root: true + +env: + browser: true + node: true + +ecmaFeatures: + globalReturn: false + +globals: + $: false + +rules: + # Default rules recommended by ESLint (http://eslint.org/docs/rules/): + comma-dangle: [2, "never"] + no-cond-assign: 2 + no-console: 2 + no-constant-condition: 2 + no-control-regex: 2 + no-debugger: 2 + no-dupe-args: 2 + no-dupe-keys: 2 + no-duplicate-case: 2 + no-empty-character-class: 2 + no-empty: 2 + no-ex-assign: 2 + no-extra-boolean-cast: 2 + no-extra-semi: 2 + no-func-assign: 2 + no-inner-declarations: [2, "both"] + no-invalid-regexp: 2 + no-irregular-whitespace: 2 + no-negated-in-lhs: 2 + no-obj-calls: 2 + no-regex-spaces: 2 + no-sparse-arrays: 2 + no-unreachable: 2 + use-isnan: 2 + valid-typeof: 2 + no-unexpected-multiline: 2 + + # Best Practice Rules: + block-scoped-var: 2 + consistent-return: 2 + curly: [2, "all"] + dot-location: [1, "property"] + dot-notation: 1 + eqeqeq: [2, "allow-null"] + guard-for-in: 2 + no-caller: 2 + no-eq-null: 2 + no-eval: 2 + no-extend-native: 2 + no-fallthrough: 2 # recommended + no-floating-decimal: 1 + no-implicit-coercion: 1 + no-implied-eval: 2 + no-lone-blocks: 1 + no-loop-func: 1 + no-multi-str: 1 + no-native-reassign: 2 + no-new: 2 + no-octal: 2 # recommended + no-redeclare: [2, {"builtinGlobals": true}] # recommended + no-void: 2 + no-with: 2 + radix: 2 + strict: [2, "global"] + vars-on-top: 1 + wrap-iife: [1, "inside"] + + # Variable Declaration Rules + no-delete-var: 2 + no-shadow-restricted-names: 2 + no-shadow: 1 + no-undef: 2 + no-undefined: 2 + no-unused-vars: [1, {"vars": "local", "args": "after-used"}] + no-use-before-define: 2 + + # Stylistic Rules + brace-style: [1, "1tbs"] + camelcase: [1, {"properties": "never"}] + comma-spacing: 1 + comma-style: [2, "last"] + consistent-this: [1, "self"] + eol-last: 1 + func-style: [2, "expression"] + indent: [1, 4] + key-spacing: [1, {"beforeColon": false, "afterColon": true}] + linebreak-style: 2 + max-len: [1, 120] + new-cap: [2, {"capIsNewExceptions": ["HmacSHA256"]}] + newline-after-var: 1 + no-array-constructor: 1 + no-mixed-spaces-and-tabs: 1 + no-nested-ternary: 1 + no-new-object: 1 + no-spaced-func: 2 + no-trailing-spaces: 1 + object-curly-spacing: [1, "always"] + one-var: [1, {"initialized": "never"}] + padded-blocks: [1, "never"] + quotes: [1, "single"] + semi: [2, "always"] + space-after-keywords: [1, "always"] + space-before-blocks: [1, "always"] + space-before-function-paren: [1, "never"] + spaced-comment: [1, "always"] + space-infix-ops: 1 diff --git a/.gitignore b/.gitignore index 4cda9e1..ddb5035 100644 --- a/.gitignore +++ b/.gitignore @@ -11,8 +11,6 @@ ajax/tmp.php **.sql ajax/sendPointsCorrection.php -pointsCenter.built.js -css/pointsCenter.built.css -css/pointsCenter.built.min.css +build bower_components node_modules diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index ce4343b..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,120 +0,0 @@ -module.exports = function(grunt) { - 'use strict'; - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - bower: { - target: { - rjsConfig: 'pointsCenter.build.js', - options: { - exclude: ['qunit', 'almond'] - } - } - }, - requirejs: { - compile: { - options: { - baseUrl: './', - mainConfigFile: 'pointsCenter.build.js', - include: 'pointsCenter.build.js', - name: 'bower_components/almond/almond', - out: 'pointsCenter.built.js', - optimize: 'uglify', - uglify: { - toplevel: true, - ascii_only: true, - beautify: false, - max_line_length: 10000 - }, - inlineText: true, - useStrict: false, - skipPragmas: false, - skipModuleInsertion: false, - optimizeAllPluginResources: false, - findNestedDependencies: false, - removeCombined: false, - fileExclusionRegExp: /^\./, - preserveLicenseComments: false, - logLevel: 0 - } - } - }, - qunit: { - files: ['test/tests.html'] - }, - jshint: { - files: ['gruntfile.js', 'js/pointsCenter.js'], - options: { - // options here to override JSHint defaults - 'browser': true, - 'esnext': true, - 'quotmark': 'single', - 'smarttabs': true, - 'trailing': true, - 'undef': true, - 'unused': true, - 'strict': true, - globals: { - define: true, - console: true, - module: true - } - } - }, - watch: { - files: ['<%= jshint.files %>'], - tasks: ['jshint', 'qunit'] - }, - cssmin: { - combine: { - options: { - banner: '/* Slivka Points Center minified css (includes Bootstrap, Bootstrap-theme, typeahead, nprogress, bootstrap-multiselect, and add2home) */', - keepSpecialComments: 0, - report: 'gzip' - }, - files: { - 'css/<%= pkg.name %>.built.css': [ - 'css/bootstrap.css', - 'css/bootstrap-theme.css', - 'css/font-awesome.css', - 'css/font-awesome-social.css', - 'css/typeahead.js-bootstrap.css', - 'css/nprogress.css', - 'css/bootstrap-multiselect.css', - 'css/add2home.css', - 'css/pointsCenter.css' - ] - } - }, - minify: { - expand: true, - src: ['css/<%= pkg.name %>.built.css'], - dest: '', - ext: '.built.min.css' - } - }, - compress: { - main: { - options: { - mode: 'gzip' - }, - expand: true, - src: ['css/<%= pkg.name %>.built.min.css'], - dest: '', - ext: '.built.min.css.gz' - } - } - }); - - grunt.loadNpmTasks('grunt-bower-requirejs'); - grunt.loadNpmTasks('grunt-contrib-requirejs'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-qunit'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-contrib-cssmin'); - grunt.loadNpmTasks('grunt-contrib-compress'); - - grunt.registerTask('test', ['jshint', 'qunit']); - - grunt.registerTask('default', ['jshint', 'requirejs', 'cssmin']); - -}; diff --git a/ajax/PointsCenter.php b/ajax/PointsCenter.php index 59d11f2..7a091ca 100644 --- a/ajax/PointsCenter.php +++ b/ajax/PointsCenter.php @@ -211,6 +211,8 @@ public function getSlivkans() { $absentSlivkans = self::fetchAllQuery('SELECT nu_email FROM absences WHERE qtr=:qtr', PDO::FETCH_COLUMN); + $nicknames = self::fetchAllQuery("SELECT nu_email,nickname FROM nicknames", PDO::FETCH_GROUP | PDO::FETCH_COLUMN); + $slivkans = self::fetchAllQuery( "SELECT CONCAT(first_name, ' ', last_name) AS full_name, slivkans.nu_email,gender,wildcard,committee,photo,suite,year @@ -226,16 +228,14 @@ public function getSlivkans() $n = count($slivkans); for ($i=0; $i<$n; $i++) { $slivkans[$i]["tokens"] = explode(" ", $slivkans[$i]["full_name"]); - } + if (array_key_exists($slivkans[$i]["nu_email"], $nicknames)) { + $slivkans[$i]["tokens"] = array_merge($slivkans[$i]["tokens"], $nicknames[$slivkans[$i]["nu_email"]]); + } + } return $slivkans; } - public function getNicknames() - { - return self::fetchAllQuery("SELECT nu_email,nickname FROM nicknames", PDO::FETCH_NAMED); - } - public function getFellows() { return self::fetchAllQuery( diff --git a/ajax/getSlivkans.php b/ajax/getSlivkans.php index fad444c..ba53e20 100644 --- a/ajax/getSlivkans.php +++ b/ajax/getSlivkans.php @@ -3,9 +3,8 @@ $points_center = new \Slivka\PointsCenter(); $qtrs = $points_center->getQuarters(); $slivkans = $points_center->getSlivkans(); -$nicknames = $points_center->getNicknames(); $fellows = $points_center->getFellows(); $quarter_info = $points_center->getQuarterInfo(); $im_teams = $quarter_info['im_teams']; -echo json_encode(array("qtrs"=>$qtrs,"slivkans"=>$slivkans,"nicknames"=>$nicknames,"fellows"=>$fellows,"im_teams"=>$im_teams)); +echo json_encode(array("qtrs"=>$qtrs,"slivkans"=>$slivkans,"fellows"=>$fellows,"im_teams"=>$im_teams)); diff --git a/base.php b/base.php index 512e336..22cccd8 100644 --- a/base.php +++ b/base.php @@ -7,7 +7,7 @@ - + Admin Dashboard -
-
-
-
-
-

Quarter

-
- - - - - + + + +
Current Quarter - - + Edit + +
+
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Housing Selection + ? + Toggle
VP NameEdit
VP EmailEdit
VP Copies EmailEdit
Point Submission
Email Notifications
Toggle
Mailbot EmailEdit
Mailbot PasswordEdit
+
+
+
+
-

Configuration

+

+ Add/Update Photo +

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Housing Selection - ? - Toggle
VP NameEdit
VP EmailEdit
VP Copies EmailEdit
Point Submission
Email Notifications
Toggle
Mailbot EmailEdit
Mailbot PasswordEdit
-
-
-
- -
-
-

- Add/Update Photo -

-
-
- -
- - Successfully uploaded photo! -
- + -
-
- - -
-
-
- - +
+ + Successfully uploaded photo!
-
- - + +
+
+ +
- - - 0) { ?> -
-
-

- Open Points Corrections -

+ - - - - - - - - - - - - - - - -
NU EmailEvent
- -
-
-

Committee / Committee Points

-
-
-
-
- -
-
- Edit -
+ + 0) { ?> +
+
+

+ Open Points Corrections +

+
+ + + + + + + + + + + + + + + +
NU EmailEvent
+
+ +
+
+

Committee / Committee Points

+
+
+
+
+ +
+
+ Edit
-
-
-

Suite

-
-
-
-
- -
-
- Edit -
+
+
+
+

Suite

+
+
+
+
+
- - + + +
diff --git a/spc-breakdown.php b/spc-breakdown.php index 803a0a8..6ab638a 100644 --- a/spc-breakdown.php +++ b/spc-breakdown.php @@ -14,116 +14,112 @@ }
-
-
- - -
-
- - -
- -
- - +
+ + +
+
+ + +
+
+ + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeEventsIMsHelperCommitteeOtherTotal
Subtotal
Events
IMs
Helper
Committee
Other
Total
-
+ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSubtotal
Events
IMs
Helper
Committee
Other
Total
+
+
+ - diff --git a/spc-committee-headquarters.php b/spc-committee-headquarters.php index e4f3a31..3d65238 100644 --- a/spc-committee-headquarters.php +++ b/spc-committee-headquarters.php @@ -22,7 +22,7 @@ function getFullName($slivkans, $nu_email) } ?> - + Admin Dashboard
diff --git a/spc-breakdown.php b/spc-breakdown.php index 6ab638a..1a7054d 100644 --- a/spc-breakdown.php +++ b/spc-breakdown.php @@ -85,17 +85,9 @@
- + + + + diff --git a/spc-committee-headquarters.php b/spc-committee-headquarters.php index 3d65238..778d0a0 100644 --- a/spc-committee-headquarters.php +++ b/spc-committee-headquarters.php @@ -22,13 +22,12 @@ function getFullName($slivkans, $nu_email) } ?> - @@ -47,37 +46,38 @@ function getFullName($slivkans, $nu_email)
Committee Headquarters -
-
-

Click to edit values.

+
+
+
+

Click to edit values.

+
+
+
+
Colors:
+ + + + + + + +
AttendeePoint TakerOther PointsNone
+
+ +
-
-
Colors:
- - - - - - - -
AttendeePoint TakerOther PointsNone
-
- - -
-
+
- + - - diff --git a/spc-submission.php b/spc-submission.php index 54d02ba..397924b 100644 --- a/spc-submission.php +++ b/spc-submission.php @@ -203,3 +203,17 @@ + + From de1b1795f0c4374cebc3fb8a37ead7c2d2577a49 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Sun, 11 Oct 2015 00:18:55 -0500 Subject: [PATCH 03/18] add eventNameExists to fix issue with event name checking, other bug fixes --- ajax/PointsCenter.php | 27 ++++++++++++++++++++++----- ajax/eventNameExists.php | 7 +++++++ js/points-center/admin.js | 8 ++++---- js/points-center/submission.js | 12 +++++------- js/points-center/utils.js | 4 ---- 5 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 ajax/eventNameExists.php diff --git a/ajax/PointsCenter.php b/ajax/PointsCenter.php index 7a091ca..7564fba 100644 --- a/ajax/PointsCenter.php +++ b/ajax/PointsCenter.php @@ -306,6 +306,17 @@ public function getRecentEvents() ); } + public function eventNameExists($event_name) + { + return count(self::fetchAllQuery( + "SELECT event_name + FROM events + WHERE qtr=:qtr AND event_name=:event_name", + PDO::FETCH_COLUMN, + array(":event_name" => $event_name) + )) > 0; + } + public function getCommitteeEvents($committee) { if ($committee == "Facilities") { @@ -513,11 +524,17 @@ public function getSlivkanBonusPoints($nu_email) $other_points = 0; } - $other_breakdown = array( - array($bonus['other1_name'] | '', $bonus['other1'] | 0), - array($bonus['other2_name'] | '', $bonus['other2'] | 0), - array($bonus['other3_name'] | '', $bonus['other3'] | 0) - ); + $other_breakdown = array(); + + if (!empty($bonus['other1_name'])) { + $other_breakdown[] = array($bonus['other1_name'], $bonus['other1']); + } + if (!empty($bonus['other2_name'])) { + $other_breakdown[] = array($bonus['other2_name'], $bonus['other2']); + } + if (!empty($bonus['other3_name'])) { + $other_breakdown[] = array($bonus['other3_name'], $bonus['other3']); + } return array( "helper" => $helper_points, diff --git a/ajax/eventNameExists.php b/ajax/eventNameExists.php new file mode 100644 index 0000000..eb58a21 --- /dev/null +++ b/ajax/eventNameExists.php @@ -0,0 +1,7 @@ +eventNameExists($_GET['event_name']); + +echo json_encode(array('eventNameExists' => $eventNameExists)); diff --git a/js/points-center/admin.js b/js/points-center/admin.js index a341ba1..05fa37b 100644 --- a/js/points-center/admin.js +++ b/js/points-center/admin.js @@ -239,10 +239,10 @@ module.exports = { utils.appendSlivkanInputs(9); $('#slivkan-entry-tab') - .on('focus', '.slivkan-entry', slivkanTypeahead); - // .on('typeahead:close', '.slivkan-entry', - // { callback: validateSlivkanName }, - // utils.destroyTypeahead); + .on('focus', '.slivkan-entry', slivkanTypeahead) + .on('typeahead:close', '.slivkan-entry', + { callback: validateSlivkanName }, + utils.destroyTypeahead); $('[data-edit-committee]').on('click', function() { var committee = $('#edit-committee').val(); diff --git a/js/points-center/submission.js b/js/points-center/submission.js index 1e096a0..9543527 100644 --- a/js/points-center/submission.js +++ b/js/points-center/submission.js @@ -85,9 +85,7 @@ var validateSlivkanName = function(entry, inBulk) { if (!foundSlivkan) { valid = false; - } - - if (type === 'Committee Only' && $('#committee').val() !== foundSlivkan.committee) { + } else if (type === 'Committee Only' && $('#committee').val() !== foundSlivkan.committee) { valid = false; } @@ -155,10 +153,10 @@ var validateEventName = function() { } else if ((eventName.length <= 32 && eventName.length >= 8) || (type === 'P2P' && eventName === 'P2P')) { eventName += ' ' + $('#date').val(); - $.getJSON(utils.ajaxRoot + '/ajax/getRecentEvents.php', function(events) { + $.getJSON(utils.ajaxRoot + '/ajax/eventNameExists.php', { event_name: eventName }, function(response) { var last; - if (events.length > 0 && _.findIndex(events, { event_name: eventName }) !== -1) { + if (response.eventNameExists) { if (type === 'IM') { last = parseInt(eventEl.val().slice(-1), 10); eventEl.val(eventEl.val().slice(0, -1) + (last + 1).toString()); @@ -709,7 +707,7 @@ module.exports = { .on('typeahead:close', '.slivkan-entry', { callback: validateSlivkanName }, utils.destroyTypeahead) - .on('typeahead:autocomplete', '.slivkan-entry', function() { + .on('typeahead:autocomplete typeahead:select', '.slivkan-entry', function() { $(this).closest('.form-group').next().find('input').focus(); }); @@ -718,7 +716,7 @@ module.exports = { .on('typeahead:close', '.fellow-entry', { callback: validateFellowName }, utils.destroyTypeahead) - .on('typeahead:autocomplete', '.fellow-entry', function() { + .on('typeahead:autocomplete typeahead:select', '.fellow-entry', function() { $(this).closest('.form-group').next().find('input').focus(); }); }); diff --git a/js/points-center/utils.js b/js/points-center/utils.js index c5a35ba..273d86c 100644 --- a/js/points-center/utils.js +++ b/js/points-center/utils.js @@ -86,9 +86,5 @@ module.exports.destroyTypeahead = function(event) { if (target.hasClass('tt-input')) { event.data.callback(target.typeahead('destroy').closest('.form-group')); - - if (TAB_PRESSED) { - target.closest('.form-group').next().find('input').focus(); - } } }; From 1366d303707368f0b1c7c08b33a77a79f0cc4882 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Sun, 11 Oct 2015 02:47:12 -0500 Subject: [PATCH 04/18] re-add bootstrap-multiselect --- css/points-center.css | 8 -------- gulpfile.js | 1 + js/points-center/admin.js | 6 +++--- js/points-center/index.js | 1 + js/points-center/table.js | 9 ++++++--- package.json | 1 + spc-table.php | 31 +++++++++++++++---------------- 7 files changed, 27 insertions(+), 30 deletions(-) diff --git a/css/points-center.css b/css/points-center.css index 74f4106..07ad70b 100644 --- a/css/points-center.css +++ b/css/points-center.css @@ -47,14 +47,6 @@ legend{ padding: 6px 4px; } -.dropdown-menu ul{ - margin-bottom: 0; -} - -.dropdown-menu input[type="checkbox"]{ - margin-left: 5px; -} - /* committee colors .Exec td { background-color: #2f7ed8!important; } .Academic td { background-color: #0d233a!important; color: white; } diff --git a/gulpfile.js b/gulpfile.js index 62f3975..a20ead2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -71,6 +71,7 @@ var stylesheetsShare = function(opts) { var stream = gulp.src([ 'node_modules/bootstrap/dist/css/bootstrap.css', 'node_modules/bootstrap/dist/css/bootstrap-theme.css', + 'node_modules/bootstrap-multiselect/dist/css/bootstrap-multiselect.css', 'node_modules/font-awesome/css/font-awesome.css', 'node_modules/nprogress/nprogress.css', 'css/typeahead.js-bootstrap.css', diff --git a/js/points-center/admin.js b/js/points-center/admin.js index 05fa37b..88319bf 100644 --- a/js/points-center/admin.js +++ b/js/points-center/admin.js @@ -101,9 +101,9 @@ module.exports = { init: function() { var quarter = $('[data-current-quarter]').text(); - // $('.multiselect').multiselect({ - // buttonClass: 'btn btn-default' - // }); + $('.multiselect').multiselect({ + buttonClass: 'btn btn-default' + }); $('[data-toggle="popover"]').popover().on('click', function() { return false; diff --git a/js/points-center/index.js b/js/points-center/index.js index e24c54e..06e18e2 100644 --- a/js/points-center/index.js +++ b/js/points-center/index.js @@ -2,6 +2,7 @@ window.$ = window.jQuery = require('jquery'); require('bootstrap'); +require('../../node_modules/bootstrap-multiselect/dist/js/bootstrap-multiselect'); $(function() { var nprogress = require('nprogress'); diff --git a/js/points-center/table.js b/js/points-center/table.js index 8bfc2f3..fc839ee 100644 --- a/js/points-center/table.js +++ b/js/points-center/table.js @@ -5,8 +5,8 @@ var utils = require('./utils'); var i, table, events; var columnFilter = function() { - var committees = $('#committeeFilter').find('input:checked').map(function() { - return this.value; + var committees = $('#committeeFilter').find('option:selected').map(function() { + return this.innerHTML; }).get(); var ims = $('#imFilter').val(); var n = 0; @@ -107,7 +107,10 @@ module.exports = { $('#imFilter').on('change', columnFilter); - $('#committeeFilter input').on('click', columnFilter); + $('#committeeFilter').multiselect({ + buttonClass: 'btn btn-default', + onChange: columnFilter + }).siblings('.placeholder').hide(); $('#noFilter').on('click', function() { localStorage.spc_tab_noFilter = 1; diff --git a/package.json b/package.json index 2530206..e233ba0 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "js/points-center/index.js", "dependencies": { "bootstrap": "3.3.5", + "bootstrap-multiselect": "0.9.13", "datatables": "1.10.9", "font-awesome": "4.4.0", "highcharts-browserify": "0.1.5", diff --git a/spc-table.php b/spc-table.php index bbc4c5b..1480ec6 100644 --- a/spc-table.php +++ b/spc-table.php @@ -56,22 +56,21 @@
-
From 942d006cea25dd84aff047a3b9e07902e3a2e13f Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Sat, 17 Oct 2015 11:17:47 -0500 Subject: [PATCH 05/18] for typeahead, scale the image inside the suggestion row instead of floating over it --- css/points-center.css | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/css/points-center.css b/css/points-center.css index 07ad70b..7f57fa7 100644 --- a/css/points-center.css +++ b/css/points-center.css @@ -30,12 +30,7 @@ legend{ } .tt-suggestion img:hover{ - z-index: 100; - -webkit-transform: translate(0,60px) scale(5); - -moz-transform: translate(0,60px) scale(5); - -ms-transform: translate(0,60px) scale(5); - -o-transform: translate(0,60px) scale(5); - transform: translate(0,60px) scale(5); + height: 120px; } .tt-suggestion.dupe{ From 16d2f95506411787af4bf821f9a6dcce1f052a0a Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Wed, 21 Oct 2015 13:59:47 -0500 Subject: [PATCH 06/18] change glyphicon fonts to symlinks --- fonts/glyphicons-halflings-regular.eot | Bin 14079 -> 64 bytes fonts/glyphicons-halflings-regular.svg | 229 +---------------------- fonts/glyphicons-halflings-regular.ttf | Bin 29512 -> 64 bytes fonts/glyphicons-halflings-regular.woff | Bin 16448 -> 65 bytes fonts/glyphicons-halflings-regular.woff2 | 1 + 5 files changed, 2 insertions(+), 228 deletions(-) mode change 100644 => 120000 fonts/glyphicons-halflings-regular.eot mode change 100644 => 120000 fonts/glyphicons-halflings-regular.svg mode change 100644 => 120000 fonts/glyphicons-halflings-regular.ttf mode change 100644 => 120000 fonts/glyphicons-halflings-regular.woff create mode 120000 fonts/glyphicons-halflings-regular.woff2 diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 87eaa434234e2a984c261e0450a2f4ad837aa7b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14079 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 diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot new file mode 120000 index 0000000..7de97ae --- /dev/null +++ b/fonts/glyphicons-halflings-regular.eot @@ -0,0 +1 @@ +../node_modules/bootstrap/fonts/glyphicons-halflings-regular.eot \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 5fee068..0000000 --- a/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg new file mode 120000 index 0000000..4bd0fcf --- /dev/null +++ b/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1 @@ +../node_modules/bootstrap/fonts/glyphicons-halflings-regular.svg \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index be784dc1d5bcb92ab155f578f3723524a3dd9688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29512 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 DlhOCh diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf new file mode 120000 index 0000000..9e7b153 --- /dev/null +++ b/fonts/glyphicons-halflings-regular.ttf @@ -0,0 +1 @@ +../node_modules/bootstrap/fonts/glyphicons-halflings-regular.ttf \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.woff b/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 2cc3e4852a5a42e6aadd6284e067b66e14a57bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16448 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 Date: Wed, 21 Oct 2015 14:00:07 -0500 Subject: [PATCH 07/18] tweaks and fixes --- ajax/PointsCenter.php | 9 ++++++++- css/points-table.css | 10 +++------- js/points-center/breakdown.js | 2 +- js/points-center/submission.js | 2 +- js/points-center/table.js | 2 +- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/ajax/PointsCenter.php b/ajax/PointsCenter.php index 7564fba..bb811aa 100644 --- a/ajax/PointsCenter.php +++ b/ajax/PointsCenter.php @@ -238,11 +238,18 @@ public function getSlivkans() public function getFellows() { - return self::fetchAllQuery( + $fellows = self::fetchAllQuery( "SELECT full_name,position,about,photo FROM fellows WHERE qtr_final IS NULL" ); + + # add tokens for typeahead.js + $n = count($fellows); + for ($i=0; $i<$n; $i++) { + $fellows[$i]["tokens"] = explode(" ", $fellows[$i]["full_name"]); + } + return $fellows; } public function updateFellowPhoto($fellow, $photo) diff --git a/css/points-table.css b/css/points-table.css index aad06c1..719cff5 100644 --- a/css/points-table.css +++ b/css/points-table.css @@ -225,17 +225,13 @@ tr.odd td.yellow.sorting_1 { background-color: #FFD500; } margin-left: 170px; } - .points-table th.name { + .points-table th.name, + .points-table td.name { position: absolute; - margin-left: -170px; + margin-left: -171px; } .points-table th.name > div { display: block; } - - .points-table td.name { - position: absolute; - margin-left: -170px; - } } diff --git a/js/points-center/breakdown.js b/js/points-center/breakdown.js index 62214b0..97f4cad 100644 --- a/js/points-center/breakdown.js +++ b/js/points-center/breakdown.js @@ -73,7 +73,7 @@ var getSlivkanPoints = function() { // fix height of breakdown so there is no flash of background $breakdown.parent().css('min-height', $breakdown.parent().height()); - if (nuEmail.length > 0) { + if (nuEmail && nuEmail.length > 0) { localStorage.spc_brk_slivkan = nuEmail; $.when( diff --git a/js/points-center/submission.js b/js/points-center/submission.js index 9543527..96d2068 100644 --- a/js/points-center/submission.js +++ b/js/points-center/submission.js @@ -122,7 +122,7 @@ var validateFellowName = function(entry) { entry.removeClass('has-warning'); if (name.length > 0) { - valid = _.findIndex({ full_name: name }) !== -1; + valid = _.findIndex(fellows, { full_name: name }) !== -1; utils.updateValidity(entry, valid); } else { entry.removeClass('has-success has-error'); diff --git a/js/points-center/table.js b/js/points-center/table.js index fc839ee..66116dd 100644 --- a/js/points-center/table.js +++ b/js/points-center/table.js @@ -52,7 +52,7 @@ module.exports = { }; })(); var adjustWidth = function() { - var width = (tableWrapper.width() - nameColWidth - 6 * totalsColWidth - 2) + 'px'; + var width = (tableWrapper.width() - nameColWidth - 6 * totalsColWidth) + 'px'; $('th.end').css({ 'width': width, From 67f9520059fd60999146c438358ff5cb504f7199 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Thu, 22 Oct 2015 09:26:13 -0500 Subject: [PATCH 08/18] set Other as default event type --- js/points-center/submission.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/points-center/submission.js b/js/points-center/submission.js index 96d2068..66a7bcf 100644 --- a/js/points-center/submission.js +++ b/js/points-center/submission.js @@ -8,7 +8,8 @@ var _ = { template: require('lodash/string/template') }; var utils = require('./utils'); -var type, slivkans, fellows; +var slivkans, fellows; +var type = 'Other'; var typeaheadUniqueIndex = 0; var VALID_EVENT_NAME = false; From 38f08925dd8fd4c31d5fe4884b97367f052d8136 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Thu, 22 Oct 2015 20:06:46 -0500 Subject: [PATCH 09/18] remove unused linting configs --- .jscsrc | 131 ------------------------------------------------------ .jshintrc | 16 ------- 2 files changed, 147 deletions(-) delete mode 100644 .jscsrc delete mode 100644 .jshintrc diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index f4faa24..0000000 --- a/.jscsrc +++ /dev/null @@ -1,131 +0,0 @@ -{ - "requireCurlyBraces": [ - "if", - "else", - "for", - "while", - "do", - "try", - "catch" - ], - "requireSpaceAfterKeywords": [ - "return" - ], - "disallowSpaceAfterKeywords": [ - "if", - "for", - "while", - "do", - "switch", - "try", - "catch" - ], - "disallowSpaceBeforeBlockStatements": true, - "requireParenthesesAroundIIFE": true, - "requireSpacesInConditionalExpression": true, - "disallowSpacesInFunctionExpression": { - "beforeOpeningCurlyBrace": true - }, - "disallowSpacesInFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInAnonymousFunctionExpression": { - "beforeOpeningCurlyBrace": true - }, - "disallowSpacesInAnonymousFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "requireSpacesInNamedFunctionExpression": { - "beforeOpeningCurlyBrace": true - }, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "requireSpacesInFunctionDeclaration": { - "beforeOpeningCurlyBrace": true - }, - "disallowSpacesInFunctionDeclaration": { - "beforeOpeningRoundBrace": true - }, - "requireMultipleVarDecl": "onevar", - "requireBlocksOnNewline": 1, - "disallowSpacesInsideParentheses": true, - "requireSpacesInsideObjectBrackets": "all", - "disallowSpacesInsideArrayBrackets": "all", - "disallowSpaceAfterObjectKeys": true, - "requireCommaBeforeLineBreak": true, - "requireOperatorBeforeLineBreak": true, - "disallowSpaceAfterPrefixUnaryOperators": true, - "disallowSpaceBeforePostfixUnaryOperators": true, - "requireSpaceBeforeBinaryOperators": [ - "=", - "+=", - "-=", - "*=", - "/=", - "%=", - "<<=", - ">>=", - ">>>=", - "&=", - "|=", - "^=", - "+=", - "+", - "-", - "*", - "/", - "%", - "<<", - ">>", - ">>>", - "&", - "|", - "^", - "&&", - "||", - "===", - "==", - ">=", - "<=", - "<", - ">", - "!=", - "!==" - ], - "disallowSpaceBeforeBinaryOperators": [ - ",", - ":" - ], - "requireSpaceAfterBinaryOperators": true, - "disallowImplicitTypeConversion": [ - "numeric", - "boolean", - "binary" - ], - "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", - "disallowKeywords": [ - "with" - ], - "disallowMultipleLineStrings": true, - "disallowMultipleLineBreaks": true, - "validateLineBreaks": "LF", - "validateQuoteMarks": "'", - "disallowMixedSpacesAndTabs": "smart", - "disallowTrailingWhitespace": true, - "disallowTrailingComma": true, - "disallowKeywordsOnNewLine": [ - "else" - ], - "maximumLineLength": { - "value": 120, - "tabSize": 1, - "allowUrlComments": true, - "allowRegex": true - }, - "safeContextKeyword": [ - "self" - ], - "requireDotNotation": true, - "disallowYodaConditions": true -} diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 5c924a7..0000000 --- a/.jshintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "browser": true, - "esnext": true, - "globals": { - "require": false, - "define": false - }, - "latedef": true, - "quotmark": "single", - "smarttabs": true, - "trailing": true, - "undef": true, - "unused": true, - "forin": true, - "indent": 1 -} \ No newline at end of file From c4fbc77b4f040f37978d9172f8ad7458817789fd Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Fri, 23 Oct 2015 00:58:50 -0500 Subject: [PATCH 10/18] moving to sass --- css/{points-center.css => points-center.scss} | 0 css/{points-table.css => points-table.scss} | 0 css/{typeahead.js-bootstrap.css => typeahead.js-bootstrap.scss} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename css/{points-center.css => points-center.scss} (100%) rename css/{points-table.css => points-table.scss} (100%) rename css/{typeahead.js-bootstrap.css => typeahead.js-bootstrap.scss} (100%) diff --git a/css/points-center.css b/css/points-center.scss similarity index 100% rename from css/points-center.css rename to css/points-center.scss diff --git a/css/points-table.css b/css/points-table.scss similarity index 100% rename from css/points-table.css rename to css/points-table.scss diff --git a/css/typeahead.js-bootstrap.css b/css/typeahead.js-bootstrap.scss similarity index 100% rename from css/typeahead.js-bootstrap.css rename to css/typeahead.js-bootstrap.scss From f6ec9c830d596acac540c13b3cf95573532317c9 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Fri, 23 Oct 2015 02:06:16 -0500 Subject: [PATCH 11/18] migrate to sass --- .sass-lint.yml | 11 ++ css/bootstrap-multiselect.scss | 1 + css/nprogress.scss | 1 + css/points-center.scss | 58 ++++----- css/points-table.scss | 224 +++++++++++++++++++++------------ gulpfile.js | 37 +++--- js/points-center/index.js | 2 +- package.json | 4 +- 8 files changed, 208 insertions(+), 130 deletions(-) create mode 100644 .sass-lint.yml create mode 120000 css/bootstrap-multiselect.scss create mode 120000 css/nprogress.scss diff --git a/.sass-lint.yml b/.sass-lint.yml new file mode 100644 index 0000000..d624bf2 --- /dev/null +++ b/.sass-lint.yml @@ -0,0 +1,11 @@ +rules: + property-sort-order: 0 + force-element-nesting: 0 + nesting-depth: + - 1 + - max-depth: 4 + no-important: 0 + no-qualifying-elements: 0 + leading-zero: + - 1 + - include: true \ No newline at end of file diff --git a/css/bootstrap-multiselect.scss b/css/bootstrap-multiselect.scss new file mode 120000 index 0000000..1f8240f --- /dev/null +++ b/css/bootstrap-multiselect.scss @@ -0,0 +1 @@ +../node_modules/bootstrap-multiselect/dist/css/bootstrap-multiselect.css \ No newline at end of file diff --git a/css/nprogress.scss b/css/nprogress.scss new file mode 120000 index 0000000..5c10551 --- /dev/null +++ b/css/nprogress.scss @@ -0,0 +1 @@ +../node_modules/nprogress/nprogress.css \ No newline at end of file diff --git a/css/points-center.scss b/css/points-center.scss index 7f57fa7..84bf02a 100644 --- a/css/points-center.scss +++ b/css/points-center.scss @@ -1,66 +1,62 @@ -legend{ +@import '../node_modules/bootstrap-sass/assets/stylesheets/bootstrap'; +@import '../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/theme'; +@import '../node_modules/font-awesome/scss/font-awesome'; +@import 'bootstrap-multiselect'; +@import 'nprogress'; +@import 'typeahead.js-bootstrap'; +@import 'points-table'; + +$gray: #999; + +legend { padding-left: 10px; } -.navbar{ +.navbar { z-index: 99; } -.credits{ +.credits { margin: 50px 20px 15px; } -.tt-suggestion{ - min-height: 30px!important; - height: auto!important; +.tt-suggestion { + min-height: 30px !important; + height: auto !important; } .tt-menu { - min-width: 260px!important; + min-width: 260px !important; } -.tt-suggestion img{ +.tt-suggestion img { display: inline-block; height: 30px; float: right; - transition-duration: 0.2s; - -webkit-transition-duration: 0.2s; - -moz-transition-duration: 0.2s; - -o-transition-duration: 0.2s; + transition-duration: 0.2s; } -.tt-suggestion img:hover{ +.tt-suggestion img:hover { height: 120px; } -.tt-suggestion.dupe{ - color: #999999; +.tt-suggestion.dupe { + color: $gray; font-style: italic; } -.form-control{ +.form-control { padding: 6px 4px; } -/* committee colors -.Exec td { background-color: #2f7ed8!important; } -.Academic td { background-color: #0d233a!important; color: white; } -.Facilities td { background-color: #8bbc21!important; } -.Faculty td { background-color: #910000!important; color: white; } -.IT td { background-color: #1aadce!important; } -.Philanthropy td { background-color: #492970!important; color: white; } -.Publications td { background-color: #f28f43!important; } -.Social td { background-color: #77a1e5!important; } -.CA td { background-color: #c42525!important; color: white; } -.Other td { background-color: #a6c96a!important; }*/ - -@media (max-width: 768px){ - .container{ +@media (max-width: 768px) { + .container { padding-right: 10px; padding-left: 10px; } - .form-group, .form-horizontal .form-group{ + .form-group, + .form-horizontal .form-group { margin-right: -5px; margin-left: -5px; } diff --git a/css/points-table.scss b/css/points-table.scss index 719cff5..7b7749e 100644 --- a/css/points-table.scss +++ b/css/points-table.scss @@ -1,10 +1,21 @@ +$red: #ffa1a1; +$green: #00d10e; +$blue: #9cf; +$yellow: #fffa00; +$gold: #fc6; + +$white: #fff; +$gray-light: #f0f0f0; +$gray: #808080; +$black: #000; + .points-table-info { margin-bottom: 0; padding: 15.5px 15px; } .points-table-controls .legend { - color: black; + color: $black; border-collapse: separate; border-spacing: 3px; } @@ -15,8 +26,8 @@ } .points-table-controls .form-group { - margin-right: 10px; - display: inline-block; + margin-right: 10px; + display: inline-block; } .points-table-wrapper { @@ -27,20 +38,20 @@ .points-table { table-layout: fixed; margin-top: 190px; -} - -.points-table td { - padding: 0; - text-align: center; - border-left: 1px solid gray; -} -.points-table td.name { - width: 171px; - position: relative; - margin-left: 0; - text-align: left; - padding-left: 5px; + td { + padding: 0; + text-align: center; + border-left: 1px solid $gray; + + &.name { + width: 171px; + position: relative; + margin-left: 0; + text-align: left; + padding-left: 5px; + } + } } .points-table th { @@ -63,7 +74,7 @@ position: relative; margin-left: 0; padding: 0; - background-color: white; + background-color: $white; z-index: 1; } @@ -73,17 +84,13 @@ bottom: 12px; width: 100%; height: 192px; - background-color: white; + background-color: $white; } .points-table th.name > div > div { height: 100%; - background-color: white; - -webkit-transform:skew(-30deg,0deg) translateX(55px); - -moz-transform:skew(-30deg,0deg) translateX(55px); - -ms-transform:skew(-30deg,0deg) translateX(55px); - -o-transform:skew(-30deg,0deg) translateX(55px); - transform:skew(-30deg,0deg) translateX(55px); + background-color: $white; + transform: skew(-30deg, 0deg) translateX(55px); } .points-table th.name span { @@ -92,8 +99,8 @@ width: 164px; height: 14px; padding-left: 5px; - border-left: 1px solid gray; - background-position: right!important; + border-left: 1px solid $gray; + background-position: right !important; } .points-table th .slanted { @@ -102,12 +109,8 @@ left: 55px; width: 20px; height: 190px; - border-left: 1px solid gray; - -webkit-transform:skew(-30deg,0deg); - -moz-transform:skew(-30deg,0deg); - -ms-transform:skew(-30deg,0deg); - -o-transform:skew(-30deg,0deg); - transform:skew(-30deg,0deg); + border-left: 1px solid $gray; + transform: skew(-30deg, 0deg); } .points-table th .slanted span { @@ -118,11 +121,7 @@ display: inline-block; text-align: left; white-space: nowrap; - -webkit-transform:skew(30deg,0deg) rotate(-60deg); - -moz-transform:skew(30deg,0deg) rotate(-60deg); - -ms-transform:skew(30deg,0deg) rotate(-60deg); - -o-transform:skew(30deg,0deg) rotate(-60deg); - transform:skew(30deg,0deg) rotate(-60deg); + transform: skew(30deg, 0deg) rotate(-60deg); } .sort-icon { @@ -131,7 +130,7 @@ height: 14px; bottom: 0; padding: 0; - border-left: 1px solid gray; + border-left: 1px solid $gray; } .points-table th.event { @@ -157,59 +156,120 @@ } .points-table th.end .sort-icon { - background-image: none!important; + background-image: none !important; } -tr.even td { background-color: #FFA1A1; } -tr.odd td { background-color: #FF8F8F; } +.points-table { + tr.even td { + background-color: $red; + + &.sorting_1 { + background-color: darken($red, 9.6); + } + + &.name, + &.totals, + &.white { + background-color: $white; + + &.sorting_1 { + background-color: darken($white, 6.3); + } + } + + &.green { + background-color: $green; + + &.sorting_1 { + background-color: darken($green, 5.9); + } + } + + &.blue { + background-color: $blue; + + &.sorting_1 { + background-color: darken(adjust-hue($blue, 2.6), 4.5); + } + } + + &.yellow { + background-color: $yellow; + + &.sorting_1 { + background-color: adjust-hue($yellow, -3.8); + } + } + } -tr.even td.sorting_1 { background-color: #FF7070; } -tr.odd td.sorting_1 { background-color: #FF5050; } + tr.odd td { + background-color: darken($red, 3.5); -tr.even td.name, tr.even td.totals, tr.even td.white { background-color: #FFFFFF; } -tr.odd td.name, tr.odd td.totals, tr.odd td.white { background-color: #F0F0F0; } + &.sorting_1 { + background-color: darken($red, 15.9); + } -tr.even td.name.sorting_1, tr.even td.totals.sorting_1, tr.even td.white.sorting_1 { background-color: #EFEFEF; } -tr.odd td.name.sorting_1, tr.odd td.totals.sorting_1, tr.odd td.white.sorting_1 { background-color: #D0D0D0; } + &.name, + &.totals, + &.white { + background-color: $gray-light; -tr.even td.end, tr.odd td.end { background-color: #FFFFFF; } + &.sorting_1 { + background-color: darken($gray-light, 12.5); + } + } -tr.even td.green { background-color: #00D10E; } -tr.odd td.green { background-color: #00BF0D; } + &.green { + background-color: darken($green, 3.5); -tr.even td.green.sorting_1 { background-color: #00B30C; } -tr.odd td.green.sorting_1 { background-color: #00A30B; } + &.sorting_1 { + background-color: darken($green, 9); + } + } -tr.even td.blue { background-color: #99CCFF; } -tr.odd td.blue { background-color: #80BFFF; } + &.blue { + background-color: darken($blue, 5); -tr.even td.blue.sorting_1 { background-color: #82BBFF; } -tr.odd td.blue.sorting_1 { background-color: #409FFF; } + &.sorting_1 { + background-color: darken(adjust-hue($blue, 0.16), 17.5); + } + } -.gold { background-color: #FFCC66!important; } + &.yellow { + background-color: adjust-hue($yellow, -4.9); -tr.even td.yellow { background-color: #FFFA00; } -tr.odd td.yellow { background-color: #FFE500; } + &.sorting_1 { + background-color: adjust-hue($yellow, -8.7); + } + } + } -tr.even td.yellow.sorting_1 { background-color: #FFEA00; } -tr.odd td.yellow.sorting_1 { background-color: #FFD500; } + td.end { + background-color: $white; + } -.points-table .sorting .sort-icon, -.points-table .name.sorting span { - background: url('data:image/gif;base64,R0lGODlhBwAJAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAkAAAINjGEJq8sOk4Qu0IZmKgA7') no-repeat; - background-position: center; -} + .sort-icon, + .name span { + background: url('data:image/gif;base64,R0lGODlhBwAJAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAkAAAINjGEJq8sOk4Qu0IZmKgA7') no-repeat center; + } -.points-table .sorting_asc .sort-icon, -.points-table .name.sorting_asc span { - background: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIHjGEJq8sOCwA7') no-repeat; - background-position: center; + .sorting_asc { + .sort-icon, + span { + background-image: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIHjGEJq8sOCwA7'); + } + } + + .sorting_desc { + .sort-icon, + span { + background-image: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw=='); + } + } } -.points-table .sorting_desc .sort-icon, -.points-table .name.sorting_desc span { - background: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==') no-repeat; - background-position: center; +.gold { + background-color: $gold !important; } .points-table th:active { @@ -223,15 +283,15 @@ tr.odd td.yellow.sorting_1 { background-color: #FFD500; } @media (min-width: 768px) { .points-table { margin-left: 170px; - } - .points-table th.name, - .points-table td.name { - position: absolute; - margin-left: -171px; - } + th.name, + td.name { + position: absolute; + margin-left: -171px; - .points-table th.name > div { - display: block; + > div { + display: block; + } + } } } diff --git a/gulpfile.js b/gulpfile.js index a20ead2..3d23f69 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -68,18 +68,11 @@ var browserifyShare = function(opts) { var stylesheetsShare = function(opts) { var watch = opts.watch || false; var minify = opts.minify || false; - var stream = gulp.src([ - 'node_modules/bootstrap/dist/css/bootstrap.css', - 'node_modules/bootstrap/dist/css/bootstrap-theme.css', - 'node_modules/bootstrap-multiselect/dist/css/bootstrap-multiselect.css', - 'node_modules/font-awesome/css/font-awesome.css', - 'node_modules/nprogress/nprogress.css', - 'css/typeahead.js-bootstrap.css', - 'css/points-center.css', - 'css/points-table.css' - ]) + var stream = gulp.src('css/points-center.scss') .pipe(plugins.sourcemaps.init()) - .pipe(plugins.concat('points-center.css')) + .pipe(plugins.sass({ + precision: 9 + }).on('error', plugins.sass.logError)) .pipe(plugins.sourcemaps.write('./', { includeContent: false, sourceRoot: '../' @@ -102,10 +95,10 @@ var stylesheetsShare = function(opts) { return stream; }; -gulp.task('clean', function() { +gulp.task('javascript-clean', function() { var del = require('del'); - return del(['build']); + return del(['build/*.js', 'build/*.js.map']); }); gulp.task('javascript-lint', function() { @@ -127,18 +120,32 @@ gulp.task('javascript-build', ['clean'], function() { return browserifyShare({ watch: false, minify: true }); }); +gulp.task('stylesheets-clean', function() { + var del = require('del'); + + return del(['build/*.css', 'build/*.css.map']); +}); + +gulp.task('stylesheets-lint', function() { + return gulp.src(['css/points-center.scss', 'css/points-table.scss']) + .pipe(plugins.sassLint()) + .pipe(plugins.sassLint.format()); +}); + gulp.task('stylesheets', function() { return stylesheetsShare({ watch: false, minify: false }); }); -gulp.task('stylesheets-watch', function() { +gulp.task('stylesheets-watch', ['stylesheets-lint'], function() { return stylesheetsShare({ watch: true, minify: false }); }); -gulp.task('stylesheets-build', ['clean'], function() { +gulp.task('stylesheets-build', ['stylesheets-clean'], function() { return stylesheetsShare({ watch: false, minify: true }); }); +gulp.task('clean', ['javascript-clean', 'stylesheets-clean']); + gulp.task('watch', ['clean', 'javascript-watch', 'stylesheets-watch'], function() { plugins.livereload.listen(); diff --git a/js/points-center/index.js b/js/points-center/index.js index 06e18e2..a8695ce 100644 --- a/js/points-center/index.js +++ b/js/points-center/index.js @@ -1,7 +1,7 @@ 'use strict'; window.$ = window.jQuery = require('jquery'); -require('bootstrap'); +require('../../node_modules/bootstrap-sass/assets/javascripts/bootstrap'); require('../../node_modules/bootstrap-multiselect/dist/js/bootstrap-multiselect'); $(function() { diff --git a/package.json b/package.json index e233ba0..4a3d9a6 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "Slivka Points Center", "main": "js/points-center/index.js", "dependencies": { - "bootstrap": "3.3.5", "bootstrap-multiselect": "0.9.13", + "bootstrap-sass": "^3.3.5", "datatables": "1.10.9", "font-awesome": "4.4.0", "highcharts-browserify": "0.1.5", @@ -27,6 +27,8 @@ "gulp-load-plugins": "0.10.0", "gulp-minify-css": "1.2.1", "gulp-rename": "1.2.2", + "gulp-sass": "^2.0.4", + "gulp-sass-lint": "^1.0.1", "gulp-sourcemaps": "1.5.2", "gulp-uglify": "1.4.1", "vinyl-buffer": "1.0.0", From 38d37d2b8791e4cc77a21b681e1d47c1c0b2ecb7 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Fri, 23 Oct 2015 02:28:15 -0500 Subject: [PATCH 12/18] small style fixes --- css/points-table.scss | 34 ++++++++++++++++++++++++++-------- gulpfile.js | 2 +- package.json | 1 - spc-committee-headquarters.php | 4 ++-- spc-table.php | 6 +++--- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/css/points-table.scss b/css/points-table.scss index 7b7749e..75c2bea 100644 --- a/css/points-table.scss +++ b/css/points-table.scss @@ -18,6 +18,22 @@ $black: #000; color: $black; border-collapse: separate; border-spacing: 3px; + + .green { + background-color: $green; + } + + .blue { + background-color: $blue; + } + + .yellow { + background-color: $yellow; + } + + .red { + background-color: $red; + } } .points-table-controls .legend td { @@ -244,26 +260,28 @@ $black: #000; } } - td.end { + tr > td.end { background-color: $white; } - .sort-icon, - .name span { - background: url('data:image/gif;base64,R0lGODlhBwAJAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAkAAAINjGEJq8sOk4Qu0IZmKgA7') no-repeat center; + .sorting { + .sort-icon, + &.name span { + background: url('data:image/gif;base64,R0lGODlhBwAJAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAkAAAINjGEJq8sOk4Qu0IZmKgA7') center no-repeat; + } } .sorting_asc { .sort-icon, - span { - background-image: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIHjGEJq8sOCwA7'); + &.name span { + background: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIHjGEJq8sOCwA7') center no-repeat; } } .sorting_desc { .sort-icon, - span { - background-image: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw=='); + &.name span { + background: url('data:image/gif;base64,R0lGODlhBwAEAIAAACMtMP///yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==') center no-repeat; } } } diff --git a/gulpfile.js b/gulpfile.js index 3d23f69..aa65a48 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -150,7 +150,7 @@ gulp.task('watch', ['clean', 'javascript-watch', 'stylesheets-watch'], function( plugins.livereload.listen(); gulp.watch('js/**/*.js', ['javascript-lint']); - gulp.watch('css/*.css', ['stylesheets-watch']); + gulp.watch('css/*.scss', ['stylesheets-watch']); }); gulp.task('build', ['clean', 'javascript-build', 'stylesheets-build']); diff --git a/package.json b/package.json index 4a3d9a6..8e8e98a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "del": "2.0.2", "gulp": "3.9.0", "gulp-cached": "1.1.0", - "gulp-concat": "2.6.0", "gulp-eslint": "1.0.0", "gulp-ignore": "1.2.1", "gulp-livereload": "3.8.1", diff --git a/spc-committee-headquarters.php b/spc-committee-headquarters.php index 778d0a0..7622a9c 100644 --- a/spc-committee-headquarters.php +++ b/spc-committee-headquarters.php @@ -55,11 +55,11 @@ function getFullName($slivkans, $nu_email)
Colors:
Name
Name
-
+
+
@@ -87,15 +87,15 @@ function getFullName($slivkans, $nu_email) $totalsColumns = array("Bonus", "Total");//, "Total (adjusted)"); for ($i=0; $i -
-
+
+
-
+
+
- + - +
Attendee Point Taker Other PointsNoneNone
diff --git a/spc-table.php b/spc-table.php index 1480ec6..61a1f8a 100644 --- a/spc-table.php +++ b/spc-table.php @@ -25,12 +25,12 @@ ?>

- - + + - +
Colors:
Colors: Point Committee HelperNoneNone
From f696fc864a4680a645c851ad6f95a85efe5d68b5 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Fri, 23 Oct 2015 02:46:32 -0500 Subject: [PATCH 13/18] update symlinks to fonts --- fonts/FontAwesome.otf | 2 +- fonts/fontawesome-webfont.eot | 2 +- fonts/fontawesome-webfont.svg | 2 +- fonts/fontawesome-webfont.ttf | 2 +- fonts/fontawesome-webfont.woff | 2 +- fonts/glyphicons-halflings-regular.eot | 2 +- fonts/glyphicons-halflings-regular.svg | 2 +- fonts/glyphicons-halflings-regular.ttf | 2 +- fonts/glyphicons-halflings-regular.woff | 2 +- fonts/glyphicons-halflings-regular.woff2 | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fonts/FontAwesome.otf b/fonts/FontAwesome.otf index 9223c38..f8a732f 120000 --- a/fonts/FontAwesome.otf +++ b/fonts/FontAwesome.otf @@ -1 +1 @@ -../bower_components/font-awesome/fonts/FontAwesome.otf \ No newline at end of file +../node_modules/font-awesome/fonts/FontAwesome.otf \ No newline at end of file diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot index 9a5c8da..8bdc5bf 120000 --- a/fonts/fontawesome-webfont.eot +++ b/fonts/fontawesome-webfont.eot @@ -1 +1 @@ -../bower_components/font-awesome/fonts/fontawesome-webfont.eot \ No newline at end of file +../node_modules/font-awesome/fonts/fontawesome-webfont.eot \ No newline at end of file diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg index c663374..1997d2c 120000 --- a/fonts/fontawesome-webfont.svg +++ b/fonts/fontawesome-webfont.svg @@ -1 +1 @@ -../bower_components/font-awesome/fonts/fontawesome-webfont.svg \ No newline at end of file +../node_modules/font-awesome/fonts/fontawesome-webfont.svg \ No newline at end of file diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf index d01bfcf..133122e 120000 --- a/fonts/fontawesome-webfont.ttf +++ b/fonts/fontawesome-webfont.ttf @@ -1 +1 @@ -../bower_components/font-awesome/fonts/fontawesome-webfont.ttf \ No newline at end of file +../node_modules/font-awesome/fonts/fontawesome-webfont.ttf \ No newline at end of file diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff index db97c98..612164b 120000 --- a/fonts/fontawesome-webfont.woff +++ b/fonts/fontawesome-webfont.woff @@ -1 +1 @@ -../bower_components/font-awesome/fonts/fontawesome-webfont.woff \ No newline at end of file +../node_modules/font-awesome/fonts/fontawesome-webfont.woff \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot index 7de97ae..ea12048 120000 --- a/fonts/glyphicons-halflings-regular.eot +++ b/fonts/glyphicons-halflings-regular.eot @@ -1 +1 @@ -../node_modules/bootstrap/fonts/glyphicons-halflings-regular.eot \ No newline at end of file +../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.eot \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg index 4bd0fcf..4c18d82 120000 --- a/fonts/glyphicons-halflings-regular.svg +++ b/fonts/glyphicons-halflings-regular.svg @@ -1 +1 @@ -../node_modules/bootstrap/fonts/glyphicons-halflings-regular.svg \ No newline at end of file +../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.svg \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf index 9e7b153..e6c980d 120000 --- a/fonts/glyphicons-halflings-regular.ttf +++ b/fonts/glyphicons-halflings-regular.ttf @@ -1 +1 @@ -../node_modules/bootstrap/fonts/glyphicons-halflings-regular.ttf \ No newline at end of file +../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.woff b/fonts/glyphicons-halflings-regular.woff index 2c244d9..12c3a8c 120000 --- a/fonts/glyphicons-halflings-regular.woff +++ b/fonts/glyphicons-halflings-regular.woff @@ -1 +1 @@ -../node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff \ No newline at end of file +../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.woff \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.woff2 b/fonts/glyphicons-halflings-regular.woff2 index a7992ac..7c81a78 120000 --- a/fonts/glyphicons-halflings-regular.woff2 +++ b/fonts/glyphicons-halflings-regular.woff2 @@ -1 +1 @@ -../node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff2 \ No newline at end of file +../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 \ No newline at end of file From 703375e9ad6bb6b3fd39fb2c76b9c7791e374a1d Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Fri, 23 Oct 2015 02:53:26 -0500 Subject: [PATCH 14/18] fix symlinks for fonts --- fonts/bootstrap | 1 + fonts/glyphicons-halflings-regular.eot | 1 - fonts/glyphicons-halflings-regular.svg | 1 - fonts/glyphicons-halflings-regular.ttf | 1 - fonts/glyphicons-halflings-regular.woff | 1 - fonts/glyphicons-halflings-regular.woff2 | 1 - 6 files changed, 1 insertion(+), 5 deletions(-) create mode 120000 fonts/bootstrap delete mode 120000 fonts/glyphicons-halflings-regular.eot delete mode 120000 fonts/glyphicons-halflings-regular.svg delete mode 120000 fonts/glyphicons-halflings-regular.ttf delete mode 120000 fonts/glyphicons-halflings-regular.woff delete mode 120000 fonts/glyphicons-halflings-regular.woff2 diff --git a/fonts/bootstrap b/fonts/bootstrap new file mode 120000 index 0000000..b40f6a0 --- /dev/null +++ b/fonts/bootstrap @@ -0,0 +1 @@ +../node_modules/bootstrap-sass/assets/fonts/bootstrap/ \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot deleted file mode 120000 index ea12048..0000000 --- a/fonts/glyphicons-halflings-regular.eot +++ /dev/null @@ -1 +0,0 @@ -../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.eot \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg deleted file mode 120000 index 4c18d82..0000000 --- a/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1 +0,0 @@ -../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.svg \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf deleted file mode 120000 index e6c980d..0000000 --- a/fonts/glyphicons-halflings-regular.ttf +++ /dev/null @@ -1 +0,0 @@ -../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.woff b/fonts/glyphicons-halflings-regular.woff deleted file mode 120000 index 12c3a8c..0000000 --- a/fonts/glyphicons-halflings-regular.woff +++ /dev/null @@ -1 +0,0 @@ -../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.woff \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.woff2 b/fonts/glyphicons-halflings-regular.woff2 deleted file mode 120000 index 7c81a78..0000000 --- a/fonts/glyphicons-halflings-regular.woff2 +++ /dev/null @@ -1 +0,0 @@ -../node_modules/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 \ No newline at end of file From 283a9cf5614e3113170359864606a53f2209650d Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Fri, 23 Oct 2015 02:53:37 -0500 Subject: [PATCH 15/18] add dumb fix --- css/points-center.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/css/points-center.scss b/css/points-center.scss index 84bf02a..c79dd9f 100644 --- a/css/points-center.scss +++ b/css/points-center.scss @@ -8,6 +8,12 @@ $gray: #999; +// stupid fix to long-standing bootstrap-sass issue: https://github.com/twbs/bootstrap-sass/issues/919 +.breadcrumb > li + li:before { + content: '/\00a0'; + color: $breadcrumb-color; +} + legend { padding-left: 10px; } From 6c963042d1593bcfe6819799c71a39be60c15a72 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Mon, 2 Nov 2015 21:59:46 -0600 Subject: [PATCH 16/18] wrap well in a row --- spc-submission.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/spc-submission.php b/spc-submission.php index 397924b..e3a4222 100644 --- a/spc-submission.php +++ b/spc-submission.php @@ -150,14 +150,16 @@
Additional inputs appear automatically.
-
- -
- - +
+
+ +
+ + +
+
+
-
-
From 4348505463f4e0e42e0fea1b619c1c1938640315 Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Mon, 2 Nov 2015 22:00:30 -0600 Subject: [PATCH 17/18] fix bug with id selectors --- js/points-center/table.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/points-center/table.js b/js/points-center/table.js index 66116dd..a4bb28b 100644 --- a/js/points-center/table.js +++ b/js/points-center/table.js @@ -95,12 +95,12 @@ module.exports = { $('#nameFilter').on('keyup', function() { delay(function() { - table.column([0]).search($('#name-filter').val()).draw(); + table.column([0]).search($('#nameFilter').val()).draw(); }, 500); }); $('#genderFilter').on('change', function() { - var option = $('#gender-filter').val(); + var option = $('#genderFilter').val(); table.column([1]).search(option).draw(); }); From deadf7168bb85f55626c13632a63f1d1b7f5fe8f Mon Sep 17 00:00:00 2001 From: Ben Rothman Date: Mon, 2 Nov 2015 22:33:27 -0600 Subject: [PATCH 18/18] good-enough fix for directory page --- js/directory.js | 85 ++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/js/directory.js b/js/directory.js index e94eb0b..94516f1 100644 --- a/js/directory.js +++ b/js/directory.js @@ -1,49 +1,60 @@ /* eslint strict:0 */ -$(function() { +jQuery(function() { 'use strict'; - $.getJSON('/points/ajax/getDirectory.php', function(data) { - var i; - var path = 'http://slivka.northwestern.edu/points/img/slivkans/'; - - for (i = 0; i < data.length; i++) { - data[i][5] = [ - '' - ].join(''); + var checkForDataTables = function() { + if (typeof($().DataTable) === 'undefined') { + setTimeout(checkForDataTables, 100); + } else { + init(); } + }, + init = function() { + $.getJSON('/points/ajax/getDirectory.php', function(data) { + var i; + var path = 'http://slivka.northwestern.edu/points/img/slivkans/'; - $('#directory').dataTable( { - data: data, - columns: [ - { title: 'First Name' }, - { title: 'Last Name' }, - { title: 'Year' }, - { title: 'Major' }, - { title: 'Suite' }, - { title: 'Photo', orderable: false } - ], - order: [[0, 'asc']], - paging: false - }); + for (i = 0; i < data.length; i++) { + data[i][5] = [ + '' + ].join(''); + } - // directory password - // This is a very insecure measure, mostly so the photos - // aren't displayed by default and you have to know javascript to display them - $('#submitdirectorypass').click(function() { - if ('discoverslivka' === $('#directorypass').val()) { - $('.directoryphoto').show(); + $('#directory').dataTable( { + data: data, + columns: [ + { title: 'First Name' }, + { title: 'Last Name' }, + { title: 'Year' }, + { title: 'Major' }, + { title: 'Suite' }, + { title: 'Photo', orderable: false } + ], + order: [[0, 'asc']], + paging: false + }); - // dumb but works: saving password in localstorage - localStorage.directorypass = 'discoverslivka'; + // directory password + // This is a very insecure measure, mostly so the photos + // aren't displayed by default and you have to know javascript to display them + $('#submitdirectorypass').click(function() { + if ('discoverslivka' === $('#directorypass').val()) { + $('.directoryphoto').show(); + + // dumb but works: saving password in localstorage + localStorage.directorypass = 'discoverslivka'; + } + }); + + if (localStorage.directorypass) { + $('#directorypass').val(localStorage.directorypass); + $('#submitdirectorypass').click(); } }); + } - if (localStorage.directorypass) { - $('#directorypass').val(localStorage.directorypass); - $('#submitdirectorypass').click(); - } - }); + $.getScript('/points/node_modules/datatables/media/js/jquery.dataTables.min.js', checkForDataTables); });