diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4a708d2 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +#export PATH := $(PWD)/vendor/bin:$(PATH) + +CC=$(PWD)/vendor/bin/coffee +SCRIPT_DIR=js +COFFEE_FILES := $(wildcard $(SCRIPT_DIR)/*.coffee) +JS_FILES=$(COFFEE_FILES:$(SCRIPT_DIR)/%.coffee=$(SCRIPT_DIR)/%.js) + +all: coffee + +coffee: $(JS_FILES) + +$(SCRIPT_DIR)/%.js: $(SCRIPT_DIR)/%.coffee + $(CC) -c $< + + + + + +# Cleanup + +.PHONY: clean +clean: + -rm $(SCRIPT_DIR)/*.js diff --git a/composer.json b/composer.json index 49f4b76..95e1242 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,8 @@ "google/apiclient": "^2.0.0@RC" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "4.*", + "npm-asset/coffee-script": "*" }, "autoload": { "classmap": ["lib/"] diff --git a/composer.lock b/composer.lock index 4d018cf..2d74e69 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "b24a0007ade6b73266663de233c8dd86", - "content-hash": "61659d06b06498fbcab8c3ba1b5e4c99", + "hash": "c16fe5d634e2d6392c87fbf9c4d05519", + "content-hash": "59fa10158328c7f6a6432c72fc6fb721", "packages": [ { "name": "bower-asset/material-design-lite", @@ -942,6 +942,65 @@ ], "time": "2015-06-14 21:17:01" }, + { + "name": "npm-asset/coffee-script", + "version": "1.10.0", + "dist": { + "type": "tar", + "url": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", + "reference": null, + "shasum": "12938bcf9be1948fa006f92e0c4c9e81705108c0" + }, + "require-dev": { + "npm-asset/docco": "~0.7.0", + "npm-asset/highlight.js": "~8.0.0", + "npm-asset/jison": ">=0.2.0", + "npm-asset/uglify-js": "~2.2", + "npm-asset/underscore": "~1.5.2" + }, + "bin": { + "coffee": "./bin/coffee", + "cake": "./bin/cake" + }, + "type": "npm-asset-library", + "extra": { + "npm-asset-bugs": { + "url": "https://github.com/jashkenas/coffeescript/issues" + }, + "npm-asset-main": "./lib/coffee-script/coffee-script", + "npm-asset-directories": { + "lib": "./lib/coffee-script" + }, + "npm-asset-repository": { + "type": "git", + "url": "git://github.com/jashkenas/coffeescript.git" + }, + "npm-asset-scripts": { + "test": "node ./bin/cake test", + "test-harmony": "node --harmony ./bin/cake test" + }, + "npm-asset-engines": { + "node": ">=0.8.0" + }, + "npm-asset-prefer-global": true + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Ashkenas" + } + ], + "description": "Unfancy JavaScript", + "homepage": "http://coffeescript.org", + "keywords": [ + "coffeescript", + "compiler", + "javascript", + "language" + ] + }, { "name": "phpdocumentor/reflection-common", "version": "1.0", diff --git a/js/frs.coffee b/js/frs.coffee new file mode 100644 index 0000000..3f852b0 --- /dev/null +++ b/js/frs.coffee @@ -0,0 +1,25 @@ +checkValidity = -> + if @required + optId = @selectedIndex + selOpt = @options[optId] + if selOpt.value is '' + @parentNode.classList.add 'is-invalid' + else + @parentNode.classList.remove 'is-invalid' + +document.addEventListener 'DOMContentLoaded', (event) -> + all_selects = document.getElementsByTagName 'select' + for own i, xsel of all_selects + xvalue = xsel.dataset.value + #console.log 'Value of %o = %o', xsel, xvalue + # Walk all options, compare to desired value and set if matches + for o, ov of xsel.options + if ov.value is xvalue + xsel.selectedIndex = o + break + + # Add eventlistener to change is-invalid state and run once + xsel.addEventListener 'change', checkValidity + event = document.createEvent 'HTMLEvents' + event.initEvent 'change', true, true + xsel.dispatchEvent event diff --git a/js/frs.js b/js/frs.js deleted file mode 100644 index a148b22..0000000 --- a/js/frs.js +++ /dev/null @@ -1,36 +0,0 @@ -function checkValidity() { - if (this.required) { - var optId = this.selectedIndex; - var selOpt = this.options[optId]; - if (selOpt.value == '') { - this.parentNode.classList.add('is-invalid'); - } else { - this.parentNode.classList.remove('is-invalid'); - } - } -} - -document.addEventListener("DOMContentLoaded", function(event) { - var all_selects = document.getElementsByTagName('select'); - for (var i in all_selects) { - if (!all_selects.hasOwnProperty(i)) { - continue; - } - var xsel = all_selects[i]; - var xvalue = xsel.dataset.value; - //console.log('Value of %o = %o', xsel, xvalue); - // Walk all options, compare to desired value and set if matches - for (var o in xsel.options) { - if (xsel.options[o].value == xvalue) { - xsel.selectedIndex = o; - break; - } - } - - // Add eventlistener to change is-invalid state and run once - xsel.addEventListener('change', checkValidity); - var event = document.createEvent('HTMLEvents'); - event.initEvent('change', true, true); - xsel.dispatchEvent(event); - } -}); diff --git a/js/session.coffee b/js/session.coffee new file mode 100644 index 0000000..fdec4e0 --- /dev/null +++ b/js/session.coffee @@ -0,0 +1,16 @@ +window.page_load_time = Math.floor(Date.now() / 1000); +window.expire_time = window.page_load_time + window.seconds_left; + +window.updateTimeLeft = -> + now = Math.floor Date.now() / 1000 + time_left = window.expire_time - now + obj = document.getElementById 'session_expires' + minutes = Math.floor time_left / 60 + seconds = time_left % 60 + if minutes+seconds > 0 + obj.innerHTML = ' (' + ('0' + minutes).slice(-2) + ':' + ('0' + seconds).slice(-2) + ')' + else + obj?.innerHTML = '' + window.clearInterval window.updateTimer + +window.updateTimer = window.setInterval 'updateTimeLeft();', 1000 diff --git a/templates/partials/mdl_head.mustache b/templates/partials/mdl_head.mustache index 2ea4a84..2e9916f 100644 --- a/templates/partials/mdl_head.mustache +++ b/templates/partials/mdl_head.mustache @@ -20,24 +20,7 @@