diff --git a/bin/www b/bin/www index f940195..e65ee8f 100755 --- a/bin/www +++ b/bin/www @@ -4,7 +4,7 @@ * Module dependencies. */ -var app = require("../app"); +var app = require("../src/app"); var http = require("http"); var https = require("https"); var fs = require("fs"); diff --git a/package-lock.json b/package-lock.json index d321046..d6c28d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,6 @@ "": { "name": "teamsnap-benchcoach", "version": "0.0.0", - "license": "Unlicense", "dependencies": { "@teamsnap/teamsnap-ui": "^3.12.3", "bootstrap": "^5.3.1", @@ -22,11 +21,13 @@ "http-errors": "~1.6.3", "mkdirp": "^1.0.4", "morgan": "~1.9.1", + "multer": "^1.4.5-lts.1", "papaparse": "^5.4.1", "passport": "^0.6.0", "passport-teamsnap": "^1.1.1", "pluralize": "^8.0.0", "pug": "^3.0.2", + "sortablejs": "^1.15.0", "teamsnap.js": "^1.62.1", "xhr2": "^0.2.1" }, @@ -704,6 +705,11 @@ "node": ">=0.4.0" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", @@ -962,6 +968,17 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1101,6 +1118,20 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/connect-ensure-login": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/connect-ensure-login/-/connect-ensure-login-0.1.1.tgz", @@ -1197,6 +1228,11 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/csrf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", @@ -2345,6 +2381,14 @@ "node": ">= 0.6" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -2376,6 +2420,34 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/multer/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2687,6 +2759,11 @@ "node": ">=4" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -2925,6 +3002,25 @@ "node": ">=0.10.0" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", @@ -3198,6 +3294,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3223,6 +3324,22 @@ "node": ">= 0.6" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", @@ -3391,6 +3508,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -3464,6 +3586,11 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3561,6 +3688,14 @@ "engines": { "node": ">=0.4.0" } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } } } } diff --git a/package.json b/package.json index 4ef188f..4a428d3 100644 --- a/package.json +++ b/package.json @@ -39,11 +39,13 @@ "http-errors": "~1.6.3", "mkdirp": "^1.0.4", "morgan": "~1.9.1", + "multer": "^1.4.5-lts.1", "papaparse": "^5.4.1", "passport": "^0.6.0", "passport-teamsnap": "^1.1.1", "pluralize": "^8.0.0", "pug": "^3.0.2", + "sortablejs": "^1.15.0", "teamsnap.js": "^1.62.1", "xhr2": "^0.2.1" } diff --git a/public/js/load_from_teamsnap.js b/public/js/load_from_teamsnap.js deleted file mode 100644 index 1b26347..0000000 --- a/public/js/load_from_teamsnap.js +++ /dev/null @@ -1,115 +0,0 @@ -event_id = "292333461"; -event_id_2 = "292333462"; -team_id = "6882652"; - -function format_stat(number) { - const zeroPad = (num, places) => String(num).padStart(3, "0"); - return zeroPad(Math.round(number * 1000), 3); -} - -async function load_data_xxx() { - const event_id = document.querySelector('input[name="event_id"]').value; - const team_id = document.querySelector('input[name="team_id"]').value; - update_card(team_id, event_id); -} - -async function update_card(team_id, event_id) { - fetch(`/${team_id}/event/${event_id}/gamecard/data`, { - method: "GET", - headers: { - Accept: "application/json", - }, - }) - .then((response) => response.json()) - .then(function (items) { - console.log(items); - events = items.filter(function (item) { - return item.type == "event"; - }); - event_index = events.findIndex(function (e) { - return e.id == event_id; - }); - event = events[event_index]; - document.title = event.formattedTitle; - - document.querySelectorAll(".event-title").forEach(function (element) { - element.innerText = event.formattedTitle; - }); - - document.querySelectorAll(".event-label").forEach(function (element) { - element.innerText = event.label; - }); - - document - .querySelectorAll(".event-location-name") - .forEach(function (element) { - element.innerText = event.locationName; - }); - - document.querySelectorAll(".opponent").forEach(function (element) { - element.innerText = event.opponentName; - }); - - document.querySelectorAll(".homeaway").forEach(function (element) { - element.innerText = event.gameType; - }); - - document.querySelectorAll(".event-date").forEach(function (element) { - element.innerText = new Date(event.startDate).toLocaleDateString( - "en-us", - { - weekday: "short", - day: "numeric", - // year: "numeric", - month: "short", - } - ); - }); - - document.querySelectorAll(".event-time").forEach(function (element) { - element.innerText = new Date(event.startDate).toLocaleTimeString( - "en-us", - { - hour: "numeric", - minute: "2-digit", - } - ); - }); - - document.getElementById("todays-game-header").innerText = - event.formattedTitle + - " - " + - new Date(event.startDate).toLocaleDateString("en-us", { - weekday: "short", - day: "numeric", - // year: "numeric", - month: "short", - }) + - " " + - new Date(event.startDate).toLocaleTimeString("en-us", { - hour: "numeric", - minute: "2-digit", - }); - - for (let j = -4; j < 5; j++) { - if (j < 0) { - plus_minus = "minus"; - } else if (j > 0) { - plus_minus = "plus"; - } else { - continue; - } - document.querySelector( - `th.today-${plus_minus}-${Math.abs(j)} div` - ).textContent = new Date( - events[event_index + j].startDate - ).toLocaleDateString("en-us", { - weekday: "short", - }); - } - console.log({ - 0: events[event_index], - 1: events[event_index + 1], - }); - }); -} diff --git a/public/js/teamsnap.js b/public/js/teamsnap.js deleted file mode 100644 index a483c72..0000000 --- a/public/js/teamsnap.js +++ /dev/null @@ -1,6810 +0,0 @@ -(function() { -var window, global = {}; -(function() { - 'use strict'; - - var globals = typeof window === 'undefined' ? global : window; - if (typeof globals.require === 'function') return; - - var modules = {}; - var cache = {}; - var aliases = {}; - var has = ({}).hasOwnProperty; - - var expRe = /^\.\.?(\/|$)/; - var expand = function(root, name) { - var results = [], part; - var parts = (expRe.test(name) ? root + '/' + name : name).split('/'); - for (var i = 0, length = parts.length; i < length; i++) { - part = parts[i]; - if (part === '..') { - results.pop(); - } else if (part !== '.' && part !== '') { - results.push(part); - } - } - return results.join('/'); - }; - - var dirname = function(path) { - return path.split('/').slice(0, -1).join('/'); - }; - - var localRequire = function(path) { - return function expanded(name) { - var absolute = expand(dirname(path), name); - return globals.require(absolute, path); - }; - }; - - var initModule = function(name, definition) { - var hot = null; - hot = hmr && hmr.createHot(name); - var module = {id: name, exports: {}, hot: hot}; - cache[name] = module; - definition(module.exports, localRequire(name), module); - return module.exports; - }; - - var expandAlias = function(name) { - return aliases[name] ? expandAlias(aliases[name]) : name; - }; - - var _resolve = function(name, dep) { - return expandAlias(expand(dirname(name), dep)); - }; - - var require = function(name, loaderPath) { - if (loaderPath == null) loaderPath = '/'; - var path = expandAlias(name); - - if (has.call(cache, path)) return cache[path].exports; - if (has.call(modules, path)) return initModule(path, modules[path]); - - throw new Error("Cannot find module '" + name + "' from '" + loaderPath + "'"); - }; - - require.alias = function(from, to) { - aliases[to] = from; - }; - - var extRe = /\.[^.\/]+$/; - var indexRe = /\/index(\.[^\/]+)?$/; - var addExtensions = function(bundle) { - if (extRe.test(bundle)) { - var alias = bundle.replace(extRe, ''); - if (!has.call(aliases, alias) || aliases[alias].replace(extRe, '') === alias + '/index') { - aliases[alias] = bundle; - } - } - - if (indexRe.test(bundle)) { - var iAlias = bundle.replace(indexRe, ''); - if (!has.call(aliases, iAlias)) { - aliases[iAlias] = bundle; - } - } - }; - - require.register = require.define = function(bundle, fn) { - if (typeof bundle === 'object') { - for (var key in bundle) { - if (has.call(bundle, key)) { - require.register(key, bundle[key]); - } - } - } else { - modules[bundle] = fn; - delete cache[bundle]; - addExtensions(bundle); - } - }; - - require.list = function() { - var list = []; - for (var item in modules) { - if (has.call(modules, item)) { - list.push(item); - } - } - return list; - }; - - var hmr = globals._hmr && new globals._hmr(_resolve, require, modules, cache); - require._cache = cache; - require.hmr = hmr && hmr.wrap; - require.brunch = true; - globals.require = require; -})(); -var require = global.require; -global = this; -if (global.window) window = this; -require.register("auth.coffee", function(exports, require, module) { -var TeamSnap, authRequest, browserStorageName, browserStore, collectionJSONMime, createAuthDialog, generateUrl, jsonMime, multipartMime, promises, request, sdkRequest; - -TeamSnap = require('./teamsnap').TeamSnap; - -promises = require('./promises'); - -request = require('./request'); - -jsonMime = 'application/json'; - -collectionJSONMime = 'application/vnd.collection+json'; - -multipartMime = 'multipart/form-data'; - -browserStorageName = 'teamsnap.authToken'; - -authRequest = request.create().hook(function(xhr, data) { - xhr.setRequestHeader('Accept', jsonMime); - if (data) { - xhr.setRequestHeader('Content-Type', jsonMime); - } - return xhr.withCredentials = true; -}); - -sdkRequest = request.create().hook(function(xhr, data) { - xhr.setRequestHeader('Accept', collectionJSONMime); - if (data && !(data instanceof FormData)) { - xhr.setRequestHeader('Content-Type', collectionJSONMime); - } - return xhr.withCredentials = true; -}); - -generateUrl = function(endpoint, params) { - var key, queries, url, value; - queries = []; - for (key in params) { - value = params[key]; - if (value) { - queries.push(key + '=' + encodeURIComponent(value)); - } - } - url = teamsnap.authUrl + '/oauth/' + endpoint; - if (queries.length) { - url = url + '?' + queries.join('&'); - } - return url.replace(/%20/g, '+'); -}; - -TeamSnap.prototype.auth = function(token) { - var cachedCollections, callback; - if (typeof token === 'function') { - callback = token; - token = null; - } else if (typeof token === 'object') { - callback = cachedCollections; - cachedCollections = token; - token = null; - } - if (typeof cachedCollections === 'function') { - callback = cachedCollections; - cachedCollections = null; - } - this.request = sdkRequest.clone(); - if (typeof token === 'number' && teamsnap.apiUrl.indexOf(':3000') !== -1) { - this.request.hook(function(xhr) { - return xhr.setRequestHeader('X-Teamsnap-User-ID', token); - }); - return this; - } - if (!token) { - token = browserStore(); - } - if (!token) { - throw new TSArgsError('teamsnap.auth', 'A token is required to auth unless in the browser it has been cached'); - } - this.request.hook(function(xhr) { - return xhr.setRequestHeader('Authorization', 'Bearer ' + token); - }); - return this; -}; - -TeamSnap.prototype.deleteAuth = function() { - return this.request = null; -}; - -TeamSnap.prototype.isAuthed = function() { - return !!this.request; -}; - -TeamSnap.prototype.hasSession = function() { - return !!browserStore(); -}; - -TeamSnap.prototype.browserLogout = function() { - createAuthDialog(teamsnap.authUrl + '/logout'); - if (this.isAuthed) { - return this.deleteAuth(); - } -}; - -TeamSnap.prototype.init = function(clientId, secret) { - var generateAuthUrl, generatePasswordUrl, generateTokenUrl; - generateAuthUrl = function(type, redirect, scopes) { - scopes = Array.isArray(scopes) ? scopes.join(' ') : scopes; - return generateUrl('authorize', { - response_type: type, - client_id: clientId, - redirect_uri: redirect, - scope: scopes - }); - }; - generateTokenUrl = function(code) { - return generateUrl('token', { - grant_type: 'authorization_code', - code: code, - client_id: clientId, - client_secret: secret - }); - }; - generatePasswordUrl = function(username, password) { - return generateUrl('token', { - grant_type: 'password', - username: username, - password: password, - client_id: clientId, - client_secret: secret - }); - }; - this.getServerAuthUrl = function(redirect, scopes) { - return generateAuthUrl('code', redirect, scopes); - }; - this.getServerTokenUrl = function(code) { - return generateTokenUrl(code); - }; - this.getBrowserAuthUrl = function(redirect, scopes) { - return generateAuthUrl('token', redirect, scopes); - }; - this.getPasswordAuthUrl = function(username, password) { - return generatePasswordUrl(username, password); - }; - this.createDialog = function(url, callback) { - return createAuthDialog(url, callback); - }; - this.finishServerAuth = function(code, callback) { - return authRequest.post(this.getServerTokenUrl(code), callback); - }; - this.startBrowserAuth = function(redirect, scopes, callback) { - if (location.protocol === 'file:') { - throw new TSError('TeamSnap.js cannot auth from the file system'); - } - return this.createDialog(this.getBrowserAuthUrl(redirect, scopes)).then((function(_this) { - return function(response) { - var token; - token = response.access_token; - browserStore(token); - return _this.auth(token); - }; - })(this)).callback(callback); - }; - return this.startPasswordAuth = function(username, password, callback) { - return authRequest.post(this.getPasswordAuthUrl(username, password), callback); - }; -}; - -browserStore = function(token) { - if (!global.sessionStorage) { - return; - } - if (arguments.length === 0) { - return sessionStorage.getItem(browserStorageName); - } else { - sessionStorage.setItem(browserStorageName, token); - } -}; - -createAuthDialog = function(url, callback) { - var deferred, dialog, height, interval, left, top, width, windowHeight, windowWidth, x, y; - width = 860; - height = 720; - deferred = promises.defer(); - x = window.screenLeft || window.screenX; - y = window.screenTop || window.screenY; - windowWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; - left = x + (windowWidth - width) / 2; - top = y + (windowHeight - height) / 2; - dialog = window.open(url, 'oauth', 'menubar=no,scrollbars=no,status=no,toolbar=no,' + 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top); - interval = setInterval(function() { - var e, params, response; - try { - if (dialog.closed) { - clearInterval(interval); - deferred.reject({ - error: 'access_denied', - error_description: 'The resource owner denied the request.' - }); - } - if (dialog.location.host !== location.host) { - return; - } - params = dialog.location.hash.replace(/^#/, '') || dialog.location.search.replace(/^\?/, ''); - } catch (error) { - e = error; - return; - } - clearInterval(interval); - dialog.close(); - response = {}; - params.split('&').forEach(function(param) { - var key, ref, value; - ref = param.split('='), key = ref[0], value = ref[1]; - return response[decodeURIComponent(key)] = decodeURIComponent(value.replace(/\+/g, ' ')); - }); - if (response.error) { - return deferred.reject(response); - } else { - return deferred.resolve(response); - } - }, 50); - return deferred.promise.callback(callback); -}; - -}); - -require.register("collections/assignments.coffee", function(exports, require, module) { -exports.EVENT_SETS = ['future_games_and_events', 'future_games', 'future_events']; - -exports.loadAssignments = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadAssignments', 'must provide a teamId or query parameters'); - } - return this.loadItems('assignment', params, callback); -}; - -exports.createAssignment = function(data) { - return this.createItem(data, { - type: 'assignment', - description: '' - }); -}; - -exports.saveAssignment = function(assignment, callback) { - var ref; - if (!assignment) { - throw new TSArgsError('teamsnap.saveAssignment', "`assignment` must be provided"); - } - if (!this.isItem(assignment, 'assignment')) { - throw new TSArgsError('teamsnap.saveAssignment', "`assignment.type` must be 'assignment'"); - } - if (!assignment.eventId) { - return this.reject('You must choose an event.', 'eventId', callback); - } - if (!((ref = assignment.description) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a description for the assignment.', 'name', callback); - } - return this.saveItem(assignment, callback); -}; - -exports.deleteAssignment = function(assignment, callback) { - if (!assignment) { - throw new TSArgsError('teamsnap.deleteAssignment', '`assignment` must be provided'); - } - return this.deleteItem(assignment, callback); -}; - -exports.getAssignmentSort = function(reverse) { - return (function(_this) { - return function(itemA, itemB) { - var valueA, valueB; - if (!_this.isItem(itemA, 'assignment') || !_this.isItem(itemB, 'assignment')) { - valueA = itemA.type; - valueB = itemB.type; - } else { - valueA = _this.memberName(itemA.member, reverse).toLowerCase(); - valueB = _this.memberName(itemB.member, reverse).toLowerCase(); - } - if (typeof (valueA != null ? valueA.localeCompare : void 0) === 'function') { - return valueA.localeCompare(valueB); - } else { - if (valueA === valueB) { - return 0; - } else if (!valueA && valueB) { - return 1; - } else if (valueA && !valueB) { - return -1; - } else if (valueA > valueB) { - return 1; - } else if (valueA < valueB) { - return -1; - } else { - return 0; - } - } - }; - })(this); -}; - -exports.sendAssignmentEmails = function(teamId, eventIds, message, sendingMemberId, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.sendAssignmentEmails', "must provide a `teamId`"); - } - if (!eventIds) { - throw new TSArgsError('teamsnap.sendAssignmentEmails', "must provide `eventIds`"); - } - if (this.isItem(eventIds)) { - eventIds = eventIds.id; - } - if (!this.isId(sendingMemberId)) { - throw new TSArgsError('teamsnap.sendAssignmentEmails', "must provide a `sendingMemberId`"); - } - params = { - teamId: teamId, - eventIds: eventIds, - message: message, - sendingMemberId: sendingMemberId - }; - return this.collections.assignments.exec('sendAssignmentEmails', params, callback); -}; - -exports.reorderAssignments = function(eventId, assignmentIds, callback) { - var params; - if (!this.isId(eventId)) { - throw new TSArgsError('teamsnap.reorderAssignments', '`eventId` must be provided'); - } - if (!(assignmentIds && Array.isArray(assignmentIds))) { - throw new TSArgsError('teamsnap.reorderAssignments', 'You must provide an array of ordered Assignments IDs'); - } - params = { - eventId: eventId, - sortedIds: assignmentIds - }; - return this.collections.assignments.exec('reorderAssignments', params).callback(callback); -}; - -exports.createBulkAssignments = function(eventSet, description, teamId, createAsMemberId, callback) { - var params; - if (!(this.EVENT_SETS.indexOf(eventSet) > -1)) { - throw new TSArgsError('teamsnap.createBulkAssignments', " `eventSet` must be one of the following: " + this.EVENT_SETS.toString() + "."); - } - if (!description.trim()) { - return this.reject('You must provide a description for the assignments.', 'description', callback); - } - if (!teamId) { - throw new TSArgsError('teamsnap.createBulkAssignments', '`teamId` must be provided.'); - } - if (this.isItem(teamId, 'team')) { - ({ - teamId: teamId.id - }); - } - if (!createAsMemberId) { - throw new TSArgsError('teamsnap.createBulkAssignments', '`createAsMemberId` must be provided.'); - } - if (this.isItem(createAsMemberId, 'member')) { - ({ - createAsMemberId: createAsMemberId.id - }); - } - params = { - eventSet: eventSet, - description: description, - teamId: teamId, - createAsMemberId: createAsMemberId - }; - return this.collections.assignments.exec('createBulkAssignments', params, callback); -}; - -}); - -require.register("collections/availabilities.coffee", function(exports, require, module) { -var key, ref, statuses, value; - -exports.AVAILABILITIES = { - NONE: null, - NO: 0, - YES: 1, - MAYBE: 2 -}; - -statuses = {}; - -ref = exports.AVAILABILITIES; -for (key in ref) { - value = ref[key]; - statuses[value] = true; -} - -exports.loadAvailabilities = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadAvailabilities', 'must provide a teamId or query parameters'); - } - return this.loadItems('availability', params, callback); -}; - -exports.saveAvailability = function(availability, callback) { - if (!availability) { - throw new TSArgsError('teamsnap.saveAvailability', "`availability` must be provided"); - } - if (!this.isItem(availability, 'availability')) { - throw new TSArgsError('teamsnap.saveAvailability', "`type` must be 'availability'"); - } - if (availability.statusCode !== null && !statuses[availability.statusCode]) { - return this.reject('You must select a valid status or null', 'statusCode', callback); - } - return this.saveItem(availability, callback); -}; - -exports.bulkMarkUnsetAvailabilities = function(memberId, statusCode, callback) { - var params; - if (!this.isId(memberId)) { - throw new TSArgsError('teamsnap.bulkMarkUnsetAvailabilities', "must provide a `memberId`"); - } - if (!((statusCode != null) && statuses[statusCode])) { - return this.reject('You must select a valid status', 'statusCode', callback); - } - params = { - memberId: memberId, - statusCode: statusCode - }; - return this.collections.availabilities.exec('bulkMarkUnsetAvailabilities', params).pop().callback(callback); -}; - -}); - -require.register("collections/broadcastAlerts.coffee", function(exports, require, module) { -exports.loadBroadcastAlerts = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadBroadcastAlerts', 'must provide a teamId or query parameters'); - } - return this.loadItems('broadcastAlert', params, callback); -}; - -exports.createBroadcastAlert = function(data) { - return this.createItem(data, { - type: 'broadcastAlert' - }); -}; - -exports.saveBroadcastAlert = function(broadcastAlert, callback) { - var ref; - if (!broadcastAlert) { - throw new TSArgsError('teamsnap.saveBroadcastAlert', "`broadcastAlert` must be provided"); - } - if (!this.isItem(broadcastAlert, 'broadcastAlert')) { - throw new TSArgsError('teamsnap.saveBroadcastAlert', "`type` must be 'broadcastAlert'"); - } - if (!broadcastAlert.teamId) { - return this.reject('You must provide a team id.', 'teamId', callback); - } - if (!broadcastAlert.memberId) { - return this.reject('You must provide a member id.', 'memberId', callback); - } - if (!((ref = broadcastAlert.body) != null ? ref.trim() : void 0)) { - return this.reject('You must provide the text alert body.', 'body', callback); - } - return this.saveItem(broadcastAlert, callback); -}; - -exports.deleteBroadcastAlert = function(broadcastAlert, callback) { - if (!broadcastAlert) { - throw new TSArgsError('teamsnap.deleteBroadcastAlert', '`broadcastAlert` must be provided'); - } - return this.deleteItem(broadcastAlert, callback); -}; - -}); - -require.register("collections/broadcastEmailAttachments.coffee", function(exports, require, module) { -exports.loadBroadcastEmailAttachments = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadBroadcastEmailAttachments', 'must provide a teamId or query parameters'); - } - return this.loadItems('broadcastEmailAttachment', params, callback); -}; - -exports.deleteBroadcastEmailAttachment = function(broadcastEmailAttachment, callback) { - if (!broadcastEmailAttachment) { - throw new TSArgsError('teamsnap.deleteBroadcastEmailAttachment', '`broadcastEmailAttachment` must be provided'); - } - return this.deleteItem(broadcastEmailAttachment, callback); -}; - -exports.uploadBroadcastEmailAttachment = function(broadcastEmailId, memberId, file, progressCallback, callback) { - var params; - if (typeof FormData === 'undefined') { - this.reject('Your browser does not support the new file upload APIs.', 'file', callback); - } - if (!broadcastEmailId) { - throw new TSArgsError('teamsnap.uploadBroadcastEmailAttachment', 'broadcastEmailId is required'); - } - if (!(file instanceof File)) { - throw new TSArgsError('teamsnap.uploadBroadcastEmailAttachment', 'must include `file` as type File', 'file is required'); - } - if (!memberId) { - throw new TSArgsError('teamsnap.uploadBroadcastEmailAttachment', 'memberId is required'); - } - params = { - broadcastEmailId: broadcastEmailId, - file: file, - memberId: memberId - }; - return this.collections.broadcastEmailAttachments.file('uploadBroadcastEmailAttachment', params, progressCallback, callback); -}; - -}); - -require.register("collections/broadcastEmails.coffee", function(exports, require, module) { -exports.loadBroadcastEmails = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadBroadcastEmails', 'must provide a teamId or query parameters'); - } - return this.loadItems('broadcastEmail', params, callback); -}; - -exports.createBroadcastEmail = function(data) { - return this.createItem(data, { - type: 'broadcastEmail' - }); -}; - -exports.saveBroadcastEmail = function(broadcastEmail, callback) { - var ref; - if (!broadcastEmail) { - throw new TSArgsError('teamsnap.saveBroadcastEmail', "`broadcastEmail` must be provided"); - } - if (!this.isItem(broadcastEmail, 'broadcastEmail')) { - throw new TSArgsError('teamsnap.saveBroadcastEmail', "`type` must be 'broadcastEmail'"); - } - if (broadcastEmail.isLeague) { - if (!broadcastEmail.divisionId) { - return reject('You must provide a division id.', 'divisionId', callback); - } - } else { - if (!broadcastEmail.teamId) { - return this.reject('You must provide a team id.', 'teamId', callback); - } - } - if (!broadcastEmail.memberId) { - return this.reject('You must provide a member id.', 'memberId', callback); - } - if (!((ref = broadcastEmail.body) != null ? ref.trim() : void 0)) { - return this.reject('You must provide the text alert body.', 'body', callback); - } - if (!broadcastEmail.isDraft) { - if (!broadcastEmail.isLeague) { - if (!(Array.isArray(broadcastEmail.recipientIds) && broadcastEmail.recipientIds.length > 0)) { - return this.reject('You must provide at least one recipient.', 'recipientIds'); - } - } - } - return this.saveItem(broadcastEmail, callback); -}; - -exports.deleteBroadcastEmail = function(broadcastEmail, callback) { - if (!broadcastEmail) { - throw new TSArgsError('teamsnap.deleteBroadcastEmail', '`broadcastEmail` must be provided'); - } - return this.deleteItem(broadcastEmail, callback); -}; - -exports.bulkDeleteBroadcastEmails = function(broadcastEmailIds, callback) { - if (!(Array.isArray(broadcastEmailIds))) { - throw new TSArgsError('teamsnap.broadcastEmailIds', 'You must provide an array of broadcastEmail IDs'); - } - return this.collections.broadcastEmails.exec('bulkDelete', { - id: broadcastEmailIds - }, callback); -}; - -}); - -require.register("collections/contactEmailAddresses.coffee", function(exports, require, module) { -exports.loadContactEmailAddresses = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadContactEmailAddresses', 'must provide a teamId or query parameters'); - } - return this.loadItems('contactEmailAddress', params, callback); -}; - -exports.createContactEmailAddress = function(data) { - return this.createItem(data, { - type: 'contactEmailAddress', - receivesTeamEmails: true - }); -}; - -exports.saveContactEmailAddress = function(contactEmailAddress, callback) { - if (!contactEmailAddress) { - throw new TSArgsError('teamsnap.saveContactEmailAddress', '`contactEmailAddress` must be provided'); - } - if (!this.isItem(contactEmailAddress, 'contactEmailAddress')) { - throw new TSArgsError('teamsnap.saveContactEmailAddress', "`contactEmailAddress.type` must be 'contactEmailAddress'"); - } - if (!contactEmailAddress.contactId) { - return this.reject('You must choose a contact.', 'contactId', callback); - } - return this.saveItem(contactEmailAddress, callback); -}; - -exports.deleteContactEmailAddress = function(contactEmailAddress, callback) { - if (!contactEmailAddress) { - throw new TSArgsError('teamsnap.deleteContactEmailAddress', '`contactEmailAddress` must be provided'); - } - return this.deleteItem(contactEmailAddress, callback); -}; - -}); - -require.register("collections/contactPhoneNumbers.coffee", function(exports, require, module) { -exports.loadContactPhoneNumbers = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadContactPhoneNumbers', 'must provide a teamId or query parameters'); - } - return this.loadItems('contactPhoneNumber', params, callback); -}; - -exports.createContactPhoneNumber = function(data) { - return this.createItem(data, { - type: 'contactPhoneNumber' - }); -}; - -exports.saveContactPhoneNumber = function(contactPhoneNumber, callback) { - if (!contactPhoneNumber) { - throw new TSArgsError('teamsnap.saveContactPhoneNumber', '`contactPhoneNumber` must be provided'); - } - if (!this.isItem(contactPhoneNumber, 'contactPhoneNumber')) { - throw new TSArgsError('teamsnap.saveContactPhoneNumber', "`contactPhoneNumber.type` must be 'contactPhoneNumber'"); - } - if (!contactPhoneNumber.contactId) { - return this.reject('You must choose a contact.', 'contactId', callback); - } - return this.saveItem(contactPhoneNumber, callback); -}; - -exports.deleteContactPhoneNumber = function(contactPhoneNumber, callback) { - if (!contactPhoneNumber) { - throw new TSArgsError('teamsnap.deleteContactPhoneNumber', '`contactPhoneNumber` must be provided'); - } - return this.deleteItem(contactPhoneNumber, callback); -}; - -}); - -require.register("collections/contacts.coffee", function(exports, require, module) { -exports.loadContacts = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadContacts', 'must provide a teamId or query parameters'); - } - return this.loadItems('contact', params, callback); -}; - -exports.createContact = function(data) { - return this.createItem(data, { - type: 'contact' - }); -}; - -exports.saveContact = function(contact, callback) { - var ref; - if (!contact) { - throw new TSArgsError('teamsnap.saveContact', "`contact` must be provided"); - } - if (!this.isItem(contact, 'contact')) { - throw new TSArgsError('teamsnap.saveContact', "`contact.type` must be 'contact'"); - } - if (!contact.memberId) { - return this.reject('You must choose a member.', 'memberId', callback); - } - if (!((ref = contact.firstName) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a firstName for the contact.', 'name', callback); - } - return this.saveItem(contact, callback); -}; - -exports.deleteContact = function(contact, callback) { - if (!contact) { - throw new TSArgsError('teamsnap.deleteContact', '`contact` must be provided'); - } - return this.deleteItem(contact, callback); -}; - -}); - -require.register("collections/customData.coffee", function(exports, require, module) { -exports.loadCustomData = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadCustomData', 'must provide a teamId or query parameters'); - } - return this.loadItems('customDatum', params, callback); -}; - -exports.createCustomDatum = function(data, field) { - return this.createItem(data, { - type: 'customDatum', - customFieldId: field.id, - kind: field.kind, - name: field.name, - isPrivate: false, - value: null - }); -}; - -exports.saveCustomDatum = function(customDatum, callback) { - if (!customDatum) { - throw new TSArgsError('teamsnap.saveCustomField', '`customDatum` must be provided'); - } - if (!this.isItem(customDatum, 'customDatum')) { - throw new TSArgsError('teamsnap.saveCustomField', "`customDatum.type` must be 'customDatum'"); - } - return this.saveItem(customDatum, callback); -}; - -}); - -require.register("collections/customFields.coffee", function(exports, require, module) { -exports.loadCustomFields = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadCustomFields', 'must provide a teamId or query parameters'); - } - return this.loadItems('customField', params, callback); -}; - -exports.createCustomField = function(data) { - return this.createItem(data, { - type: 'customField' - }); -}; - -exports.saveCustomField = function(customField, callback) { - if (!customField) { - throw new TSArgsError('teamsnap.saveCustomField', '`customField` must be provided'); - } - if (!this.isItem(customField, 'customField')) { - throw new TSArgsError('teamsnap.saveCustomField', "`customField.type` must be 'customField'"); - } - if (!customField.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!customField.name) { - return this.reject('You must enter a name.', 'name', callback); - } - if (!customField.kind) { - return this.reject('You must choose a type.', 'kind', callback); - } - return this.saveItem(customField, callback); -}; - -exports.deleteCustomField = function(customField, callback) { - if (!customField) { - throw new TSArgsError('teamsnap.deleteCustomField', '`customField` must be provided'); - } - return this.deleteItem(customField, callback); -}; - -}); - -require.register("collections/divisionEvents.coffee", function(exports, require, module) { -exports.loadDivisionEvents = function(params, callback) { - if (this.isId(params)) { - params = { - divisionId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadDivisionEvents', 'must provide a divisionId or query parameters'); - } - return this.loadItems('divisionEvent', params, callback); -}; - -}); - -require.register("collections/divisionLocations.coffee", function(exports, require, module) { -exports.loadDivisionLocations = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadDivisionLocations', 'must provide a teamId or query parameters'); - } - return this.loadItems('divisionLocation', params, callback); -}; - -}); - -require.register("collections/divisionMembers.coffee", function(exports, require, module) { -exports.loadDivisionMembers = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadDivisionMembers', 'must provide a teamId or query parameters'); - } - return this.loadItems('divisionMember', params, callback); -}; - -}); - -require.register("collections/divisionMembersPreferences.coffee", function(exports, require, module) { -exports.PREFS = { - SCHEDULE_SHOW: { - ALL: 1, - GAMES: 2, - EVENTS: 3 - } -}; - -exports.loadDivisionMembersPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadDivisionMembersPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItems('divisionMemberPreferences', params, callback); -}; - -exports.loadDivisionMemberPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadDivisionMemberPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItem('divisionMemberPreferences', params, callback); -}; - -exports.saveDivisionMemberPreferences = function(divisionMemberPreferences, callback) { - if (!divisionMemberPreferences) { - throw new TSArgsError('teamsnap.saveDivisionMemberPreferences', "`divisionMemberPreferences` must be provided"); - } - if (!this.isItem(divisionMemberPreferences, 'divisionMemberPreferences')) { - throw new TSArgsError('teamsnap.saveDivisionMemberPreferences', "`divisionMemberPreferences.type` must be 'divisionMemberPreferences'"); - } - return this.saveItem(divisionMemberPreferences, callback); -}; - -}); - -require.register("collections/divisionTeamStandings.coffee", function(exports, require, module) { -exports.loadDivisionTeamStandings = function(teamId, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.loadDivisionTeamStandings', 'must provide a teamId'); - } - params = { - teamId: teamId - }; - return this.loadItems('divisionTeamStanding', params, callback); -}; - -}); - -require.register("collections/divisions.coffee", function(exports, require, module) { -exports.loadDivisions = function(params, callback) { - if (params == null) { - params = {}; - } - if (typeof params === 'function') { - callback = params; - params = {}; - } - if (Object.keys(params).length) { - return this.loadItems('division', params, callback); - } else { - return this.loadMe().then((function(_this) { - return function(me) { - params.userId = me.id; - return _this.loadItems('division', params, callback); - }; - })(this)); - } -}; - -exports.loadDivision = function(divisionId, callback) { - if (!this.isId(divisionId)) { - throw new TSArgsError('teamsnap.loadDivision', 'divisionId must be provided'); - } - return this.loadItem('division', { - id: divisionId - }, callback); -}; - -exports.createDivision = function(data) { - return this.createItem(data, { - type: 'division', - name: '' - }); -}; - -exports.saveDivision = function(division, callback) { - var ref; - if (!division) { - throw new TSArgsError('teamsnap.saveDivision', "`division` must be provided"); - } - if (!this.isItem(division, 'division')) { - throw new TSArgsError('teamsnap.saveDivision', "`type` must be 'division'"); - } - if (!((ref = division.name) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a name for the division.', 'name', callback); - } - return this.saveItem(division, callback); -}; - -exports.deleteDivision = function(division, callback) { - if (!division) { - throw new TSArgsError('teamsnap.deleteDivision', '`division` must be provided'); - } - return this.deleteItem(division, callback); -}; - -exports.loadAncestorDivisions = function(divisionId, callback) { - if (!this.isId(divisionId)) { - throw new TSArgsError('teamsnap.loadAncestorDivisions', 'divisionId must be provided'); - } - return this.collections.divisions.queryItems('ancestors', { - id: divisionId - }, callback); -}; - -exports.loadDescendantDivisions = function(divisionId, callback) { - if (!this.isId(divisionId)) { - throw new TSArgsError('teamsnap.loadDescendantDivisions', 'divisionId must be provided'); - } - return this.collections.divisions.queryItems('descendants', { - id: divisionId - }, callback); -}; - -exports.loadChildDivisions = function(divisionId, callback) { - if (!this.isId(divisionId)) { - throw new TSArgsError('teamsnap.loadChildDivisions', 'divisionId must be provided'); - } - return this.collections.divisions.queryItems('children', { - id: divisionId - }, callback); -}; - -exports.loadActiveTrialDivisions = function(userId, callback) { - if (!this.isId(userId)) { - throw new TSArgsError('teamsnap.loadActiveTrialsDivisions', 'userId must be provided'); - } - return this.collections.divisions.queryItems('activeTrials', { - userId: userId - }, callback); -}; - -}); - -require.register("collections/divisionsPreferences.coffee", function(exports, require, module) { -exports.loadDivisionsPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - divisionId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadDivisionsPreferences', 'must provide a divisionId or query parameters'); - } - return this.loadItems('divisionPreferences', params, callback); -}; - -exports.loadDivisionPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - divisionId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadDivisionPreferences', 'must provide a divisionId or query parameters'); - } - return this.loadItem('divisionPreferences', params, callback); -}; - -exports.saveDivisionPreferences = function(divisionPreferences, callback) { - if (!divisionPreferences) { - throw new TSArgsError('teamsnap.saveDivisionPreferences', "`divisionPreferences` must be provided"); - } - if (!this.isItem(divisionPreferences, 'divisionPreferences')) { - throw new TSArgsError('teamsnap.saveDivisionPreferences', "`divisionPreferences.type` must be 'divisionPreferences'"); - } - return this.saveItem(divisionPreferences, callback); -}; - -}); - -require.register("collections/eventStatistics.coffee", function(exports, require, module) { -exports.loadEventStatistics = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadEventStatistics', 'must provide a teamId or query parameters'); - } - return this.loadItems('eventStatistic', params, callback); -}; - -}); - -require.register("collections/events.coffee", function(exports, require, module) { -var includes, key, ref, value; - -exports.EVENTS = { - NONE: 'none', - FUTURE: 'future', - ALL: 'all' -}; - -exports.REMINDERS = { - ALL: 'all', - UNSET: 'unset' -}; - -includes = {}; - -ref = exports.EVENTS; -for (key in ref) { - value = ref[key]; - includes[value] = true; -} - -exports.loadEvents = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadEvents', 'must provide a teamId or query parameters'); - } - return this.loadItems('event', params, callback); -}; - -exports.createEvent = function(data) { - return this.createItem(data, { - type: 'event', - isGame: false, - tracksAvailability: true - }); -}; - -exports.saveEvent = function(event, callback) { - var ref1, ref2; - if (!event) { - throw new TSArgsError('teamsnap.saveEvent', "`event` must be provided"); - } - if (!this.isItem(event, 'event')) { - throw new TSArgsError('teamsnap.saveEvent', "`event.type` must be 'event'"); - } - if (!(event.isGame || ((ref1 = event.name) != null ? ref1.trim() : void 0))) { - return this.reject('You must provide a name.', 'name', callback); - } - if (!event.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!(event.locationId || event.divisionLocationId)) { - return this.reject('You must choose a location.', 'locationId', callback); - } - if (event.isGame && !event.opponentId) { - return this.reject('You must choose an opponent.', 'opponentId', callback); - } - if (isNaN((ref2 = event.startDate) != null ? ref2.getTime() : void 0)) { - return this.reject('You must provide a valid start date.', 'startDate', callback); - } - if (event.notifyTeam && !event.notifyTeamAsMemberId) { - return this.reject('You must provide the current member\'s id.', 'notifyTeamAsMemberId', callback); - } - return this.saveItem(event, callback); -}; - -exports.deleteEvent = function(event, include, notify, notifyAs, callback) { - var params; - params = {}; - if (!event) { - throw new TSArgsError('teamsnap.deleteEvent', '`event` must be provided'); - } - if (typeof include === 'function') { - callback = include; - include = null; - } - if (!include && event.repeatingUuid) { - include = this.EVENTS.NONE; - } - if (include) { - if (!includes[include]) { - throw new TSArgsError('teamsnap.deleteEvent', "`include` must be one of " + (Object.keys(includes).join(', '))); - } - params.repeatingInclude = include; - } - if (notify) { - params.notifyTeam = notify; - if (!notifyAs) { - throw new TSArgsError('teamsnap.deleteEvent', '`notifyTeamAsMemberId` must be provided'); - } - params.notifyTeamAsMemberId = notifyAs; - } - return this.deleteItem(event, params, callback); -}; - -exports.sendAvailabilityReminders = function(eventId, sendingMemberId, include) { - var options; - if (!include) { - include = []; - } - if (this.isItem(eventId, 'event')) { - eventId = eventId.id; - } - if (this.isItem(sendingMemberId, 'member')) { - sendingMemberId = sendingMemberId.id; - } else if (this.isItem(sendingMemberId, 'divisionMember')) { - sendingMemberId = sendingMemberId.id; - } - if (!this.isId(eventId)) { - throw new TSArgsError('teamsnap.sendAvailabilityReminders', 'must include id `eventId`'); - } - if (!this.isId(sendingMemberId)) { - throw new TSArgsError('teamsnap.sendAvailabilityReminders', 'must include id `sendingMemberId`'); - } - if (!Array.isArray(include)) { - throw new TSArgsError('teamsnap.sendAvailabilityReminders', "`include` must be an array of member ids"); - } - if ((include == null) || include.length === 0) { - throw new TSArgsError('teamsnap.sendAvailabilityReminders', "`include` must be an array of member ids"); - } - options = { - id: eventId, - membersToNotify: include, - notifyTeamAsMemberId: sendingMemberId - }; - return this.collections.events.exec('sendAvailabilityReminders', options); -}; - -exports.getEventSort = function() { - return (function(_this) { - return function(itemA, itemB) { - var valueA, valueB; - if (!_this.isItem(itemA, 'event') || !_this.isItem(itemB, 'event')) { - valueA = itemA.type; - valueB = itemB.type; - } else { - valueA = itemA.startDate; - valueB = itemB.startDate; - } - if (valueA > valueB) { - return 1; - } else if (valueA < valueB) { - return -1; - } else { - return 0; - } - }; - })(this); -}; - -exports.bulkCreateEvents = function(params, callback) { - var options; - if (!params.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!Array.isArray(params.events)) { - throw new TSArgsError('teamsnap.bulkCreateEvents', "`events` must be an array of events"); - } - options = { - templates: params.events, - teamId: params.teamId, - notifyTeamAsMemberId: params.sendingMemberId, - notifyTeam: params.notifyTeam - }; - return this.collections.events.exec('bulkCreate', options, callback); -}; - -}); - -require.register("collections/facebookPages.coffee", function(exports, require, module) { -exports.loadFacebookPages = function(callback) { - var params; - params = {}; - return this.loadItems('facebookPage', params, callback); -}; - -}); - -require.register("collections/forumPosts.coffee", function(exports, require, module) { -exports.loadForumPosts = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadForumPosts', 'must provide a teamId or query parameters'); - } - return this.loadItems('forumPost', params, callback); -}; - -exports.createForumPost = function(data) { - return this.createItem(data, { - type: 'forumPost' - }); -}; - -exports.saveForumPost = function(forumPost, callback) { - var ref; - if (!forumPost) { - throw new TSArgsError('teamsnap.saveForumPost', "`forumPost` must be provided"); - } - if (!this.isItem(forumPost, 'forumPost')) { - throw new TSArgsError('teamsnap.saveForumPost', "`type` must be 'forumPost'"); - } - if (!forumPost.forumTopicId) { - return this.reject('You must provide a forum topic id.', 'forumTopicId', callback); - } - if (!forumPost.memberId) { - return this.reject('You must provide a member id.', 'memberId', callback); - } - if (!((ref = forumPost.message) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a message for the forum post.', 'message', callback); - } - return this.saveItem(forumPost, callback); -}; - -exports.deleteForumPost = function(forumPost, callback) { - if (!forumPost) { - throw new TSArgsError('teamsnap.deleteForumPost', '`forumPost` must be provided'); - } - return this.deleteItem(forumPost, callback); -}; - -}); - -require.register("collections/forumSubscriptions.coffee", function(exports, require, module) { -exports.loadForumSubscriptions = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadForumSubscriptions', 'must provide a teamId or query parameters'); - } - return this.loadItems('forumSubscription', params, callback); -}; - -exports.createForumSubscription = function(data) { - return this.createItem(data, { - type: 'forumSubscription' - }); -}; - -exports.saveForumSubscription = function(forumSubscription, callback) { - if (!forumSubscription) { - throw new TSArgsError('teamsnap.saveForumSubscription', "`forumSubscription` must be provided"); - } - if (!this.isItem(forumSubscription, 'forumSubscription')) { - throw new TSArgsError('teamsnap.saveForumSubscription', "`type` must be 'forumSubscription'"); - } - if (!forumSubscription.forumTopicId) { - return this.reject('You must provide a forum topic id.', 'forumTopicId', callback); - } - if (!forumSubscription.memberId) { - return this.reject('You must provide a member id.', 'memberId', callback); - } - return this.saveItem(forumSubscription, callback); -}; - -exports.deleteForumSubscription = function(forumSubscription, callback) { - if (!forumSubscription) { - throw new TSArgsError('teamsnap.deleteForumSubscription', '`forumSubscription` must be provided'); - } - return this.deleteItem(forumSubscription, callback); -}; - -}); - -require.register("collections/forumTopics.coffee", function(exports, require, module) { -exports.loadForumTopics = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadForumTopics', 'must provide a teamId or query parameters'); - } - return this.loadItems('forumTopic', params, callback); -}; - -exports.createForumTopic = function(data) { - return this.createItem(data, { - type: 'forumTopic' - }); -}; - -exports.saveForumTopic = function(forumTopic, callback) { - var ref; - if (!forumTopic) { - throw new TSArgsError('teamsnap.saveForumTopic', "`forumTopic` must be provided"); - } - if (!this.isItem(forumTopic, 'forumTopic')) { - throw new TSArgsError('teamsnap.saveForumTopic', "`type` must be 'forumTopic'"); - } - if (!forumTopic.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!((ref = forumTopic.title) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a title for the forum topic.', 'title', callback); - } - return this.saveItem(forumTopic, callback); -}; - -exports.deleteForumTopic = function(forumTopic, callback) { - if (!forumTopic) { - throw new TSArgsError('teamsnap.deleteForumTopic', '`forumTopic` must be provided'); - } - return this.deleteItem(forumTopic, callback); -}; - -}); - -require.register("collections/leagueCustomData.coffee", function(exports, require, module) { -exports.loadLeagueCustomData = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadLeagueCustomData', 'must provide a teamId or query parameters'); - } - return this.loadItems('leagueCustomDatum', params, callback); -}; - -exports.createLeagueCustomDatum = function(data, field) { - return this.createItem(data, { - type: 'leagueCustomDatum', - leagueCustomFieldId: field.id, - kind: field.kind, - name: field.name, - isPrivate: false, - value: null - }); -}; - -exports.saveLeagueCustomDatum = function(leagueCustomDatum, callback) { - if (!leagueCustomDatum) { - throw new TSArgsError('teamsnap.saveLeagueCustomDatum', '`leagueCustomDatum` must be provided'); - } - if (!this.isItem(leagueCustomDatum, 'leagueCustomDatum')) { - throw new TSArgsError('teamsnap.saveLeagueCustomDatum', "`leagueCustomDatum.type` must be 'leagueCustomDatum'"); - } - return this.saveItem(leagueCustomDatum, callback); -}; - -}); - -require.register("collections/leagueCustomFields.coffee", function(exports, require, module) { -exports.loadLeagueCustomFields = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadLeagueCustomFields', 'must provide a teamId or query parameters'); - } - return this.loadItems('leagueCustomField', params, callback); -}; - -}); - -require.register("collections/leagueRegistrantDocuments.coffee", function(exports, require, module) { -exports.loadLeagueRegistrantDocuments = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadLeagueRegistrantDocuments', 'must provide a teamId or query parameters'); - } - return this.loadItems('leagueRegistrantDocument', params, callback); -}; - -}); - -require.register("collections/locations.coffee", function(exports, require, module) { -exports.loadLocations = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadLocations', 'must provide a teamId or query parameters'); - } - return this.loadItems('location', params, callback); -}; - -exports.createLocation = function(data) { - return this.createItem(data, { - type: 'location', - name: '' - }); -}; - -exports.saveLocation = function(location, callback) { - var ref; - if (!location) { - throw new TSArgsError('teamsnap.saveLocation', "`location` must be provided"); - } - if (!this.isItem(location, 'location')) { - throw new TSArgsError('teamsnap.saveLocation', "`location.type` must be 'location'"); - } - if (!location.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!((ref = location.name) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a name for the location.', 'name', callback); - } - return this.saveItem(location, callback); -}; - -exports.deleteLocation = function(location, callback) { - if (!location) { - throw new TSArgsError('teamsnap.deleteLocation', '`location` must be provided'); - } - return this.deleteItem(location, callback); -}; - -}); - -require.register("collections/memberAssignments.coffee", function(exports, require, module) { -exports.loadMemberAssignments = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberAssignments', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberAssignment', params, callback); -}; - -exports.createMemberAssignment = function(data) { - return this.createItem(data, { - type: 'memberAssignment' - }); -}; - -exports.saveMemberAssignment = function(memberAssignment, callback) { - if (!memberAssignment) { - throw new TSArgsError('teamsnap.saveMemberAssignment', "`memberAssignment` must be provided"); - } - if (!this.isItem(memberAssignment, 'memberAssignment')) { - throw new TSArgsError('teamsnap.saveMemberAssignment', "`memberAssignment.type` must be 'memberAssignment'"); - } - return this.saveItem(memberAssignment, callback); -}; - -exports.deleteMemberAssignment = function(memberAssignment, callback) { - if (!memberAssignment) { - throw new TSArgsError('teamsnap.deleteMemberAssignment', '`memberAssignment` must be provided'); - } - return this.deleteItem(memberAssignment, callback); -}; - -}); - -require.register("collections/memberBalances.coffee", function(exports, require, module) { -exports.loadMemberBalances = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberBalances', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberBalance', params, callback); -}; - -}); - -require.register("collections/memberEmailAddresses.coffee", function(exports, require, module) { -exports.INVITED_STATES = ["new", "new_user", "existing_user"]; - -exports.loadMemberEmailAddresses = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberEmailAddresses', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberEmailAddress', params, callback); -}; - -exports.createMemberEmailAddress = function(data) { - return this.createItem(data, { - type: 'memberEmailAddress', - receivesTeamEmails: true - }); -}; - -exports.inviteMemberEmailAddresses = function(options, callback) { - if (!options.memberEmailAddressIds) { - throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.memberEmailAddressIds is required.'); - } - if (!options.memberId) { - throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.memberId is required.'); - } - if (!options.teamId) { - throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.teamId is required.'); - } - if (!options.notifyAsMemberId) { - throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.notifyAsMemberId is required.'); - } - return this.collections.memberEmailAddresses.exec('invite', options).pop().callback(callback); -}; - -exports.saveMemberEmailAddress = function(memberEmailAddress, callback) { - if (!memberEmailAddress) { - throw new TSArgsError('teamsnap.saveMemberEmailAddress', '`memberEmailAddress` must be provided'); - } - if (!this.isItem(memberEmailAddress, 'memberEmailAddress')) { - throw new TSArgsError('teamsnap.saveMemberEmailAddress', "`memberEmailAddress.type` must be 'memberEmailAddress'"); - } - if (!memberEmailAddress.memberId) { - return this.reject('You must choose a member.', 'memberId', callback); - } - return this.saveItem(memberEmailAddress, callback); -}; - -exports.deleteMemberEmailAddress = function(memberEmailAddress, callback) { - if (!memberEmailAddress) { - throw new TSArgsError('teamsnap.deleteMemberEmailAddress', '`memberEmailAddress` must be provided'); - } - return this.deleteItem(memberEmailAddress, callback); -}; - -}); - -require.register("collections/memberFiles.coffee", function(exports, require, module) { -exports.loadMemberFiles = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberFiles', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberFile', params, callback); -}; - -exports.createMemberFile = function(data) { - return this.createItem(data, { - type: 'memberFile' - }); -}; - -exports.saveMemberFile = function(memberFile, callback) { - if (!memberFile) { - throw new TSArgsError('teamsnap.saveMemberFile', '`memberFile` must be provided'); - } - if (!this.isItem(memberFile, 'memberFile')) { - throw new TSArgsError('teamsnap.saveMemberFile', "`memberFile.type` must be 'memberFile'"); - } - if (!memberFile.memberId) { - return this.reject('You must choose a member.', 'memberId', callback); - } - return this.saveItem(memberFile, callback); -}; - -exports.deleteMemberFile = function(memberFile, callback) { - if (!memberFile) { - throw new TSArgsError('teamsnap.deleteMemberFile', '`memberFile` must be provided'); - } - return this.deleteItem(memberFile, callback); -}; - -exports.uploadMemberFile = function(memberFileId, file, callback) { - var params; - if (this.isItem(memberFileId, 'memberFile')) { - memberFileId = memberFileId.id; - } - if (typeof FormData === 'undefined') { - this.reject('Your browser does not support the new file upload APIs.', 'file', callback); - } - if (!this.isId(memberFileId)) { - throw new TSArgsError('teamsnap.uploadMemberFile', 'must include `memberFileId`'); - } - if (!(file instanceof File)) { - throw new TSArgsError('teamsnap.uploadMemberFile', 'must include `file` as type File'); - } - params = { - memberFileId: memberFileId, - file: file - }; - return this.collections.memberFiles.exec('uploadMemberFile', params).pop().callback(callback); -}; - -}); - -require.register("collections/memberLinks.coffee", function(exports, require, module) { -exports.loadMemberLinks = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberLinks', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberLink', params, callback); -}; - -exports.createMemberLink = function(data) { - return this.createItem(data, { - type: 'memberLink' - }); -}; - -exports.saveMemberLink = function(memberLink, callback) { - if (!memberLink) { - throw new TSArgsError('teamsnap.saveMemberLink', '`memberLink` must be provided'); - } - if (!this.isItem(memberLink, 'memberLink')) { - throw new TSArgsError('teamsnap.saveMemberLink', "`memberLink.type` must be 'memberLink'"); - } - if (!memberLink.memberId) { - return this.reject('You must choose a member.', 'memberId', callback); - } - return this.saveItem(memberLink, callback); -}; - -exports.deleteMemberLink = function(memberLink, callback) { - if (!memberLink) { - throw new TSArgsError('teamsnap.deleteMemberLink', '`memberLink` must be provided'); - } - return this.deleteItem(memberLink, callback); -}; - -}); - -require.register("collections/memberPayments.coffee", function(exports, require, module) { -exports.loadMemberPayments = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberPayments', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberPayment', params, callback); -}; - -exports.saveMemberPayment = function(memberPayment, callback) { - if (!memberPayment) { - throw new TSArgsError('teamsnap.saveMemberPayment', '`memberPayment` must be provided'); - } - if (!this.isItem(memberPayment, 'memberPayment')) { - throw new TSArgsError('teamsnap.saveMemberPayment', "`memberPayment.type` must be 'memberPayment'"); - } - if (!memberPayment.memberId) { - return this.reject('You must choose a member.', 'memberId', callback); - } - return this.saveItem(memberPayment, callback); -}; - -exports.memberPaymentTransaction = function(memberPaymentId, amount, note, callback) { - var params; - if (!this.isItem(memberPaymentId)) { - throw new TSArgsError('teamsnap.memberPaymentTransaction', "must provide a `memberPaymentId`"); - } - if (this.isItem(memberPaymentId)) { - memberPaymentId = memberPaymentId.id; - } - if (!amount) { - return this.reject('You must add an amount.', 'amount', callback); - } - if (typeof note === 'function') { - callback = note; - } - params = { - memberPaymentId: memberPaymentId, - amount: amount, - note: note - }; - return this.collections.memberPayments.exec('transaction', params).pop().callback(callback); -}; - -}); - -require.register("collections/memberPhoneNumbers.coffee", function(exports, require, module) { -exports.loadMemberPhoneNumbers = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberPhoneNumbers', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberPhoneNumber', params, callback); -}; - -exports.createMemberPhoneNumber = function(data) { - return this.createItem(data, { - type: 'memberPhoneNumber' - }); -}; - -exports.saveMemberPhoneNumber = function(memberPhoneNumber, callback) { - if (!memberPhoneNumber) { - throw new TSArgsError('teamsnap.saveMemberPhoneNumber', '`memberPhoneNumber` must be provided'); - } - if (!this.isItem(memberPhoneNumber, 'memberPhoneNumber')) { - throw new TSArgsError('teamsnap.saveMemberPhoneNumber', "`memberPhoneNumber.type` must be 'memberPhoneNumber'"); - } - if (!memberPhoneNumber.memberId) { - return this.reject('You must choose a member.', 'memberId', callback); - } - return this.saveItem(memberPhoneNumber, callback); -}; - -exports.deleteMemberPhoneNumber = function(memberPhoneNumber, callback) { - if (!memberPhoneNumber) { - throw new TSArgsError('teamsnap.deleteMemberPhoneNumber', '`memberPhoneNumber` must be provided'); - } - return this.deleteItem(memberPhoneNumber, callback); -}; - -}); - -require.register("collections/memberPhotos.coffee", function(exports, require, module) { -exports.loadMemberPhotos = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberPhotos', 'must provide a `teamId` or query parameters'); - } - return this.loadItems('memberPhoto', params, callback); -}; - -exports.loadMemberPhoto = function(params, callback) { - if (this.isId(params)) { - params = { - id: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberPhoto', 'must provide an `id` or query parameters'); - } - return this.loadItem('memberPhoto', params, callback); -}; - -}); - -require.register("collections/memberRegistrationSignups.coffee", function(exports, require, module) { -exports.loadMemberRegistrationSignups = function(params, callback) { - if (this.isId(params)) { - params = { - id: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberRegistrationSignups', 'must provide a id or query parameters'); - } - return this.loadItems('memberRegistrationSignup', params, callback); -}; - -}); - -require.register("collections/memberStatistics.coffee", function(exports, require, module) { -exports.loadMemberStatistics = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberStatistics', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberStatistic', params, callback); -}; - -}); - -require.register("collections/members.coffee", function(exports, require, module) { -exports.loadMembers = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMembers', 'must provide a teamId or query parameters'); - } - return this.loadItems('member', params, callback); -}; - -exports.createMember = function(data) { - return this.createItem(data, { - type: 'member' - }); -}; - -exports.saveMember = function(member, callback) { - var ref; - if (!member) { - throw new TSArgsError('teamsnap.saveMember', "`member` must be provided"); - } - if (!this.isItem(member, 'member')) { - throw new TSArgsError('teamsnap.saveMember', "`type` must be 'member'"); - } - if (!member.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!((ref = member.firstName) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a first name for the member.', 'name', callback); - } - return this.saveItem(member, callback); -}; - -exports.deleteMember = function(member, callback) { - if (!member) { - throw new TSArgsError('teamsnap.deleteMember', '`member` must be provided'); - } - return this.deleteItem(member, callback); -}; - -exports.uploadMemberPhoto = function(memberId, file, callback) { - var params; - if (this.isItem(memberId, 'member')) { - memberId = memberId.id; - } - if (typeof FormData === 'undefined') { - this.reject('Your browser does not support the new file upload APIs.', 'file', callback); - } - if (!this.isId(memberId)) { - throw new TSArgsError('teamsnap.deleteMemberPhoto', "`memberId` must be a valid id"); - } - if (!(file instanceof File)) { - throw new TSArgsError('teamsnap.uploadMemberFile', 'must include `file` as type File'); - } - params = { - memberId: memberId, - file: file - }; - return this.collections.members.exec('uploadMemberPhoto', params).pop().callback(callback); -}; - -exports.removeMemberPhoto = function(memberId, callback) { - var params; - if (this.isItem(memberId, 'member')) { - memberId = memberId.id; - } - if (!this.isId(memberId)) { - throw new TSArgsError('teamsnap.deleteMemberPhoto', "`memberId` must be a valid id"); - } - params = { - memberId: memberId - }; - return this.collections.members.exec('removeMemberPhoto', params).pop().callback(callback); -}; - -exports.generateMemberThumbnail = function(memberId, x, y, width, height, callback) { - var params; - if (this.isItem(memberId, 'member')) { - memberId = memberId.id; - } - if (!((memberId != null) && (x != null) && (y != null) && (width != null) && (height != null))) { - throw new TSArgsError('teamsnap.generateThumbnail', "`memberId`, `x`, `y`, `width`, and `height` are all required"); - } - if (!this.isId(memberId)) { - throw new TSArgsError('teamsnap.generateMemberThumbnail', "`memberId` must be a valid id"); - } - params = { - memberId: memberId, - x: x, - y: y, - width: width, - height: height - }; - return this.collections.members.exec('generateMemberThumbnail', params).pop().callback(callback); -}; - -exports.disableMember = function(memberId, callback) { - var params; - if (this.isItem(memberId, 'member')) { - memberId = memberId.id; - } - if (!this.isId(memberId)) { - throw new TSArgsError('teamsnap.disableMember', "`memberId` must be a valid id"); - } - params = { - memberId: memberId - }; - return this.collections.members.exec('disableMember', params).pop().callback(callback); -}; - -exports.divisionLoadMembers = function(params, callback) { - if (!params.divisionId) { - throw new TSArgsError('teamsnap.divisionLoadMembers', "`divisionId` must be provided"); - } - return this.collections.members.queryItems('divisionSearch', params, callback); -}; - -exports.divisionAdvancedLoadMembers = function(params, callback) { - if (!params.divisionId) { - throw new TSArgsError('teamsnap.divisionAdvancedLoadMembers', "`divisionId` must be provided"); - } - return this.collections.members.queryItems('advancedDivisionSearch', params, callback); -}; - -exports.memberName = function(member, reverse, forSort) { - if (!member) { - return ''; - } - if (reverse && (member.firstName && member.lastName || forSort)) { - return member.lastName + ', ' + member.firstName; - } - return [member.firstName || '', member.lastName || ''].join(' ').trim(); -}; - -exports.getMemberSort = function(reverse) { - return (function(_this) { - return function(itemA, itemB) { - var valueA, valueB; - if (!_this.isItem(itemA, 'member') || !_this.isItem(itemB, 'member')) { - valueA = itemA.type; - valueB = itemB.type; - } else { - valueA = _this.memberName(itemA, reverse, true).toLowerCase(); - valueB = _this.memberName(itemB, reverse, true).toLowerCase(); - } - if (typeof (valueA != null ? valueA.localeCompare : void 0) === 'function') { - return valueA.localeCompare(valueB); - } else { - if (valueA === valueB) { - return 0; - } else if (!valueA && valueB) { - return 1; - } else if (valueA && !valueB) { - return -1; - } else if (valueA > valueB) { - return 1; - } else if (valueA < valueB) { - return -1; - } else { - return 0; - } - } - }; - })(this); -}; - -exports.canEditTeam = function(member, team) { - if (!(member && team)) { - return false; - } - return (member.isManager || member.isOwner) && (!team.isArchivedSeason || member.isOwner); -}; - -exports.canEditItem = function(member, team, item) { - if (!(member && team && this.isItem(item))) { - return false; - } - if (item.readOnly) { - return false; - } - if (item.type === 'member' && item.isOwner && !member.isOwner) { - return false; - } - if (teamsnap.canEditTeam(member, team)) { - return true; - } - if (team.isArchivedSeason) { - return false; - } - if (this.isItem(item, 'member')) { - return item.href === member.href; - } else { - return item.links.member.href === member.href; - } -}; - -exports.importMembersFromTeam = function(memberIds, teamId, sendInvites, callback) { - var params; - if (!memberIds) { - throw new TSArgsError('teamsnap.importMembersFromTeam', 'must include `memberIds`'); - } - if (!this.isItem(teamId)) { - throw new TSArgsError('teamsnap.importMembersFromTeam', "must provide a teamId"); - } - if (this.isItem(teamId)) { - teamId = teamId.id; - } - if (typeof sendInvites === 'function') { - callback = sendInvites; - } - params = { - sourceMemberIds: memberIds, - destinationTeamId: teamId, - sendInvites: sendInvites - }; - return this.collections.members.exec('importFromTeam', params, callback); -}; - -exports.loadImportableMembers = function(userId, includeArchivedTeams, callback) { - var params; - if (!userId) { - throw new TSArgsError('teamsnap.loadImportableMembers', "must provide a userId"); - } - if (typeof includeArchivedTeams === 'function') { - callback = includeArchivedTeams; - } - params = { - userId: userId, - includeArchivedTeams: includeArchivedTeams - }; - return this.collections.members.queryItems('importableMembers', params, callback); -}; - -exports.bulkDeleteMembers = function(members, callback) { - if (Array.isArray(members)) { - if (members.length === 0) { - throw new TSArgsError('teamsnap.bulkDeleteMembers', 'The array of members to be deleted is empty.'); - } else if (members.every((function(_this) { - return function(member) { - return _this.isItem(member, 'member'); - }; - })(this))) { - members = { - memberId: members.map(function(member) { - return member.id; - }) - }; - } else { - throw new TSArgsError('teamsnap.bulkDeleteMembers', 'Must provide an `array` of member `ids` or `member` objects'); - } - } else if (typeof members === 'object' && this.isItem(members, 'member')) { - members = { - memberId: members.id - }; - } else { - throw new TSArgsError('teamsnap.bulkDeleteMembers', 'Must provide an `array` of members, or a `member` object'); - } - return this.collections.members.exec('bulkDelete', members).callback(callback); -}; - -exports.moveMemberToTeam = function(params, callback) { - if (!params.member) { - throw new TSArgsError('teamsnap.moveMemberToTeam', 'params must include `member`'); - } - if (!params.divisionId) { - throw new TSArgsError('teamsnap.moveMemberToTeam', 'params must include `divisionId`'); - } - if (Array.isArray(params.member)) { - if (params.member.length === 0) { - throw new TSArgsError('teamsnap.moveMemberToTeam', 'member in params is empty.'); - } else if (params.member.every((function(_this) { - return function(member) { - return _this.isItem(member, 'member'); - }; - })(this))) { - params.memberId = params.member.map(function(member) { - return member.id; - }); - } else { - throw new TSArgsError('teamsnap.moveMemberToTeam', 'Must provide an `array` of member objects or a `member` object for member'); - } - } else if (this.isItem(params.member, 'member')) { - params.memberId = params.member.id; - } else { - throw new TSArgsError('teamsnap.moveMemberToTeam', 'Must provide an `array` of member objects or `member` objects for member'); - } - if (this.isItem(params.divisionId, 'division')) { - params.divisionId = params.divisionId.id; - } - if (this.isItem(params.teamId, 'team')) { - params.teamId = params.teamId.id; - } - return this.collections.members.exec('moveMember', params).callback(callback); -}; - -}); - -require.register("collections/membersPreferences.coffee", function(exports, require, module) { -exports.PREFS = { - SCHEDULE_SHOW: { - ALL: 1, - GAMES: 2, - EVENTS: 3 - } -}; - -exports.loadMembersPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMembersPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItems('memberPreferences', params, callback); -}; - -exports.loadMemberPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMemberPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItem('memberPreferences', params, callback); -}; - -exports.saveMemberPreferences = function(memberPreferences, callback) { - if (!memberPreferences) { - throw new TSArgsError('teamsnap.saveMemberPreferences', "`memberPreferences` must be provided"); - } - if (!this.isItem(memberPreferences, 'memberPreferences')) { - throw new TSArgsError('teamsnap.saveMemberPreferences', "`memberPreferences.type` must be 'memberPreferences'"); - } - return this.saveItem(memberPreferences, callback); -}; - -}); - -require.register("collections/messageData.coffee", function(exports, require, module) { -exports.loadMessageData = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMessageData', 'must provide a teamId or query parameters'); - } - return this.loadItems('messageDatum', params, callback); -}; - -}); - -require.register("collections/messages.coffee", function(exports, require, module) { -exports.loadMessages = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadMessages', 'must provide a teamId or query parameters'); - } - return this.loadItems('message', params, callback); -}; - -exports.markMessageAsRead = function(params, callback) { - if (typeof params === 'object') { - params = { - id: params.id - }; - } else if (this.isId(params)) { - params = { - id: params - }; - } else { - throw new TSArgsError('teamsnap.markMessageAsRead', 'a message `id` or `message` object must be provided'); - } - return this.collections.messages.exec('markMessageAsRead', params).pop().callback(callback); -}; - -exports.bulkDeleteMessages = function(messages, callback) { - if (Array.isArray(messages)) { - if (messages.length === 0) { - throw new TSArgsError('teamsnap.bulkDeleteMessages', 'The array of messages to be deleted is empty.'); - } else if (this.isItem(messages[0], 'message')) { - messages = { - id: messages.map(function(message) { - return message.id; - }) - }; - } else if (this.isId(messages[0])) { - messages = { - id: messages - }; - } else { - throw new TSArgsError('teamsnap.bulkDeleteMessages', 'Must provide an `array` of message `ids` or `message` objects'); - } - } else if (typeof messages === 'object' && this.isItem(messages, 'message')) { - messages = { - id: messages.id - }; - } else if (this.isId(messages)) { - messages = { - id: messages - }; - } else { - throw new TSArgsError('teamsnap.bulkDeleteMessages', 'Must provide an `array` of message `ids`, an `id` or a `message` object'); - } - return this.collections.messages.exec('bulkDelete', messages).callback(callback); -}; - -}); - -require.register("collections/opponents.coffee", function(exports, require, module) { -exports.loadOpponents = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadOpponents', 'must provide a teamId or query parameters'); - } - return this.loadItems('opponent', params, callback); -}; - -exports.createOpponent = function(data) { - return this.createItem(data, { - type: 'opponent', - name: '' - }); -}; - -exports.saveOpponent = function(opponent, callback) { - var ref; - if (!opponent) { - throw new TSArgsError('teamsnap.saveOpponent', "`opponent` must be provided"); - } - if (!this.isItem(opponent, 'opponent')) { - throw new TSArgsError('teamsnap.saveOpponent', "`opponent.type` must be 'opponent'"); - } - if (!opponent.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!((ref = opponent.name) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a name for the opponent.', 'name', callback); - } - return this.saveItem(opponent, callback); -}; - -exports.deleteOpponent = function(opponent, callback) { - if (!opponent) { - throw new TSArgsError('teamsnap.deleteOpponent', '`opponent` must be provided'); - } - return this.deleteItem(opponent, callback); -}; - -}); - -require.register("collections/opponentsResults.coffee", function(exports, require, module) { -exports.loadOpponentsResults = function(params, callback) { - if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadOpponentsResults', 'must provide query parameters'); - } - return this.loadItems('opponentResults', params, callback); -}; - -exports.loadOpponentResults = function(opponentId, callback) { - var params; - if (!this.isId(opponentId)) { - throw new TSArgsError('teamsnap.loadOpponentResults', 'must provide an opponentId'); - } - params = { - id: opponentId - }; - return this.loadItem('opponentResults', params, callback); -}; - -}); - -require.register("collections/paymentNotes.coffee", function(exports, require, module) { -exports.loadPaymentNotes = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadPaymentNotes', 'must provide a teamId or query parameters'); - } - return this.loadItems('paymentNote', params, callback); -}; - -exports.createPaymentNote = function(data) { - return this.createItem(data, { - type: 'paymentNote' - }); -}; - -exports.savePaymentNote = function(paymentNote, callback) { - if (!paymentNote) { - throw new TSArgsError('teamsnap.savePaymentNote', '`paymentNote` must be provided'); - } - if (!this.isItem(paymentNote, 'paymentNote')) { - throw new TSArgsError('teamsnap.savePaymentNote', "`paymentNote.type` must be 'paymentNote'"); - } - if (!paymentNote.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!paymentNote.memberPaymentId) { - return this.reject('You must specify a memberPaymentId.', 'memberPaymentId', callback); - } - if (!paymentNote.note) { - return this.reject('You must provide a note.', 'note', callback); - } - return this.saveItem(paymentNote, callback); -}; - -}); - -require.register("collections/plans.coffee", function(exports, require, module) { -exports.loadPlans = function(params, callback) { - if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadPlans', 'must provide query parameters'); - } - return this.loadItems('plan', params, callback); -}; - -exports.loadPlan = function(teamId, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.loadPlan', 'must provide a teamId'); - } - params = { - teamId: teamId - }; - return this.loadItem('plan', params, callback); -}; - -}); - -require.register("collections/registrationForms.coffee", function(exports, require, module) { -exports.loadRegistrationForms = function(params, callback) { - if (this.isId(params)) { - params = { - id: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadRegistrationForms', 'must provide a id or query parameters'); - } - return this.loadItems('registrationForm', params, callback); -}; - -}); - -require.register("collections/sponsors.coffee", function(exports, require, module) { -exports.loadSponsors = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadSponsors', 'must provide a teamId or query parameters'); - } - return this.loadItems('sponsor', params, callback); -}; - -exports.createSponsor = function(data) { - return this.createItem(data, { - type: 'sponsor', - name: '' - }); -}; - -exports.saveSponsor = function(sponsor, callback) { - if (!sponsor) { - throw new TSArgsError('teamsnap.saveSponsor', "`sponsor` must be provided"); - } - if (!this.isItem(sponsor, 'sponsor')) { - throw new TSArgsError('teamsnap.saveSponsor', "`sponsor.type` must be 'sponsor'"); - } - return this.saveItem(sponsor, callback); -}; - -exports.deleteSponsor = function(sponsor, callback) { - if (!sponsor) { - throw new TSArgsError('teamsnap.deleteSponsor', "`sponsor` must be provided"); - } - return this.deleteItem(sponsor, callback); -}; - -exports.uploadSponsorLogo = function(sponsorId, file, callback) { - var params; - if (this.isItem(sponsorId, 'sponsor')) { - sponsorId = sponsorId.id; - } - if (typeof FormData === 'undefined') { - this.reject('Your browser does not support the new file upload APIs.', 'file', callback); - } - if (!this.isId(sponsorId)) { - throw new TSArgsError('teamsnap.uploadSponsorLogo', 'must include `sponsorId`'); - } - if (!(file instanceof File)) { - throw new TSArgsError('teamsnap.uploadSponsorLogo', 'must include `file` as type File'); - } - params = { - sponsorId: sponsorId, - file: file - }; - return this.collections.sponsors.exec('uploadSponsorLogo', params).pop().callback(callback); -}; - -exports.deleteSponsorLogo = function(sponsorId, callback) { - var params; - if (!sponsorId) { - throw new TSArgsError('teamsnap.deleteSponsorLogo', "`sponsorId` must be provided"); - } - if (this.isItem(sponsorId, 'sponsor')) { - sponsorId = sponsorId.id; - } - if (!this.isId(sponsorId)) { - throw new TSArgsError('teamsnap.deleteSponsorLogo', "`sponsorId` must be a valid id"); - } - params = { - sponsorId: sponsorId - }; - return this.collections.sponsors.exec('removeSponsorLogo', params).callback(callback); -}; - -}); - -require.register("collections/sports.coffee", function(exports, require, module) { -exports.loadSports = function(params, callback) { - if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadSports', 'must provide query parameters'); - } - return this.loadItems('sport', params, callback); -}; - -exports.loadSport = function(teamId, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.loadSport', 'must provide a teamId'); - } - params = { - teamId: teamId - }; - return this.loadItem('sport', params, callback); -}; - -}); - -require.register("collections/statisticAggregates.coffee", function(exports, require, module) { -exports.loadStatisticAggregates = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadStatisticAggregates', 'must provide a teamId or query parameters'); - } - return this.loadItems('statisticAggregate', params, callback); -}; - -}); - -require.register("collections/statisticData.coffee", function(exports, require, module) { -exports.loadStatisticData = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadStatisticData', 'must provide a teamId or query parameters'); - } - return this.loadItems('statisticDatum', params, callback); -}; - -exports.createStatisticDatum = function(data) { - return this.createItem(data, { - type: 'statisticDatum' - }); -}; - -exports.saveStatisticDatum = function(statisticDatum, callback) { - if (!statisticDatum) { - throw new TSArgsError('teamsnap.saveStatisticDatum', '`statisticDatum` must be provided'); - } - if (!this.isItem(statisticDatum, 'statisticDatum')) { - throw new TSArgsError('teamsnap.saveStatisticDatum', "`statisticDatum.type` must be 'statisticDatum'"); - } - if (!statisticDatum.eventId) { - return this.reject('You must specify an event.', 'eventId', callback); - } - if (!statisticDatum.statisticId) { - return this.reject('You must specify a statistic.', 'statisticId', callback); - } - if (!statisticDatum.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - return this.saveItem(statisticDatum, callback); -}; - -exports.deleteStatisticDatum = function(statisticDatum, callback) { - if (!statisticDatum) { - throw new TSArgsError('teamsnap.deleteStatisticDatum', '`statisticDatum` must be provided'); - } - return this.deleteItem(statisticDatum, callback); -}; - -exports.bulkSaveStatisticData = function(templates, callback) { - var params; - if (!templates) { - throw new TSArgsError('teamsnap.bulkSaveStatisticData', "`templates` must be provided"); - } - params = { - templates: templates - }; - return this.collections.statisticData.exec('bulkUpdateStatisticData', params).callback(callback); -}; - -exports.bulkDeleteStatisticData = function(member, event, callback) { - var params; - if (!member) { - throw new TSArgsError('teamsnap.bulkDeleteStatisticData', "`member` must be provided"); - } - if (!this.isItem(member, 'member')) { - throw new TSArgsError('teamsnap.bulkDeleteStatisticData', "`member.type` must be 'member'"); - } - if (!event) { - throw new TSArgsError('teamsnap.bulkDeleteStatisticData', "`event` must be provided"); - } - if (!this.isItem(event, 'event')) { - throw new TSArgsError('teamsnap.bulkDeleteStatisticData', "`event.type` must be 'event'"); - } - params = { - memberId: member.id, - eventId: event.id - }; - return this.collections.statisticData.exec('bulkDeleteStatisticData', params).callback(callback); -}; - -}); - -require.register("collections/statisticGroups.coffee", function(exports, require, module) { -exports.loadStatisticGroups = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadStatisticGroups', 'you must provide a a teamId or query parameters'); - } - return this.loadItems('statisticGroup', params, callback); -}; - -exports.createStatisticGroup = function(data) { - return this.createItem(data, { - type: 'statisticGroup' - }); -}; - -exports.saveStatisticGroup = function(statisticGroup, callback) { - if (!statisticGroup) { - throw new TSArgsError('teamsnap.saveStatisticGroup', '`statisticGroup` must be provided'); - } - if (!this.isItem(statisticGroup, 'statisticGroup')) { - throw new TSArgsError('teamsnap.saveStatisticGroup', "`statisticGroup.type` must be 'statisticGroup'"); - } - if (!statisticGroup.name) { - return this.reject('You must specify a name', 'name', callback); - } - if (!statisticGroup.teamId) { - return this.reject('You must specify a team', 'teamId', callback); - } - return this.saveItem(statisticGroup, callback); -}; - -exports.deleteStatisticGroup = function(statisticGroup, callback) { - if (!statisticGroup) { - throw new TSArgsError('teamsnap.deleteStatisticGroup', '`statisticGroup` must be provided'); - } - return this.deleteItem(statisticGroup, callback); -}; - -exports.reorderStatisticGroups = function(teamId, statisticGroupIds, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.reorderStatisticGroups', '`teamId` must be provided'); - } - if (!(statisticGroupIds && Array.isArray(statisticGroupIds))) { - throw new TSArgsError('teamsnap.reorderStatisticGroups', 'You must provide an array of ordered Statistic Group IDs'); - } - params = { - teamId: teamId, - sortedIds: statisticGroupIds - }; - return this.collections.statisticGroups.exec('reorderStatisticGroups', params).callback(callback); -}; - -}); - -require.register("collections/statistics.coffee", function(exports, require, module) { -exports.loadStatistics = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadStatistics', 'must provide a teamId or query parameters'); - } - return this.loadItems('statistic', params, callback); -}; - -exports.createStatistic = function(data) { - return this.createItem(data, { - type: 'statistic' - }); -}; - -exports.saveStatistic = function(statistic, callback) { - if (!statistic) { - throw new TSArgsError('teamsnap.saveStatistic', '`statistic` must be provided'); - } - if (!this.isItem(statistic, 'statistic')) { - throw new TSArgsError('teamsnap.saveStatistic', "`statistic.type` must be 'statistic'"); - } - if (!statistic.name) { - return this.reject('You must specify a name.', 'name', callback); - } - if (!statistic.acronym) { - return this.reject('You must specify an acronym.', 'acronym', callback); - } - if (!statistic.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - return this.saveItem(statistic, callback); -}; - -exports.deleteStatistic = function(statistic, callback) { - if (!statistic) { - throw new TSArgsError('teamsnap.deleteStatistic', '`statistic` must be provided'); - } - return this.deleteItem(statistic, callback); -}; - -exports.reorderStatistics = function(teamId, statisticIds, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.reorderStatistics', '`teamId` must be provided'); - } - if (!(statisticIds && Array.isArray(statisticIds))) { - throw new TSArgsError('teamsnap.reorderStatistics', 'You must provide an array of ordered Statistic IDs'); - } - params = { - teamId: teamId, - sortedIds: statisticIds - }; - return this.collections.statistics.exec('reorderStatistics', params).callback(callback); -}; - -}); - -require.register("collections/teamFees.coffee", function(exports, require, module) { -exports.loadTeamFees = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamFees', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamFee', params, callback); -}; - -exports.createTeamFee = function(data) { - return this.createItem(data, { - type: 'teamFee' - }); -}; - -exports.saveTeamFee = function(teamFee, callback) { - if (!teamFee) { - throw new TSArgsError('teamsnap.saveTeamFee', '`teamFee` must be provided'); - } - if (!this.isItem(teamFee, 'teamFee')) { - throw new TSArgsError('teamsnap.saveTeamFee', "`teamFee.type` must be 'teamFee'"); - } - if (!teamFee.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!teamFee.description) { - return this.reject('You must provide a team fee description.', 'description', callback); - } - if (!teamFee.amount) { - return this.reject('You must provide a fee amount.', 'description', callback); - } - return this.saveItem(teamFee, callback); -}; - -exports.deleteTeamFee = function(teamFee, callback) { - if (!teamFee) { - throw new TSArgsError('teamsnap.deleteTeamFee', '`teamFee` must be provided'); - } - return this.deleteItem(teamFee, callback); -}; - -}); - -require.register("collections/teamMedia.coffee", function(exports, require, module) { -exports.ROTATION_DIRECTIONS = { - CLOCKWISE: 'clockwise', - COUNTERCLOCKWISE: 'counterclockwise' -}; - -exports.loadTeamMedia = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamMedia', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamMedium', params, callback); -}; - -exports.createTeamMedium = function(data) { - return this.createItem(data, { - type: 'teamMedium' - }); -}; - -exports.uploadTeamMedium = function(teamMedium, progressCallback, callback) { - if (!teamMedium) { - throw new TSArgsError('teamsnap.uploadTeamMedium', "`teamMedium` must be provided"); - } - if (!this.isItem(teamMedium, 'teamMedium')) { - throw new TSArgsError('teamsnap.uploadTeamMedium', "`type` must be 'teamMedium'"); - } - if (!this.isId(teamMedium.teamId)) { - throw new TSArgsError('teamsnap.uploadTeamMedium', 'must include `teamId`'); - } - if (!this.isId(teamMedium.teamMediaGroupId)) { - throw new TSArgsError('teamsnap.uploadTeamMedium', 'must include `teamMediaGroupId`'); - } - if (!(teamMedium.file instanceof File)) { - throw new TSArgsError('teamsnap.uploadTeamMedium', 'must include `file` as type File'); - } - return this.collections.teamMedia.file('uploadTeamMedium', teamMedium, progressCallback).pop().callback(callback); -}; - -exports.deleteTeamMedium = function(teamMedium, callback) { - if (!teamMedium) { - throw new TSArgsError('teamsnap.deleteTeamMedium', '`teamMedium` must be provided'); - } - return this.deleteItem(teamMedium, callback); -}; - -exports.saveTeamMedium = function(teamMedium, callback) { - if (!teamMedium) { - throw new TSArgsError('teamsnap.saveTeamMedium', "`teamMedium` must be provided"); - } - if (!this.isItem(teamMedium, 'teamMedium')) { - throw new TSArgsError('teamsnap.saveTeamMedium', "`type` must be 'teamMedium'"); - } - if (!this.isId(teamMedium.teamId)) { - throw new TSArgsError('teamsnap.saveTeamMedium', 'must include `teamId`'); - } - if (!this.isId(teamMedium.memberId)) { - throw new TSArgsError('teamsnap.saveTeamMedium', 'must include `memberId`'); - } - if (!this.isId(teamMedium.teamMediaGroupId)) { - throw new TSArgsError('teamsnap.saveTeamMedium', 'must include `teamMediaGroupId`'); - } - return this.saveItem(teamMedium, callback); -}; - -exports.saveTeamVideoLink = function(teamMedium, callback) { - if (!teamMedium) { - throw new TSArgsError('teamsnap.createVideoLink', "`teamMedium` must be provided"); - } - if (!this.isItem(teamMedium, 'teamMedium')) { - throw new TSArgsError('teamsnap.createVideoLink', "`type` must be 'teamMedium'"); - } - if (!this.isId(teamMedium.teamId)) { - throw new TSArgsError('teamsnap.createVideoLink', 'must include `teamId`'); - } - if (!this.isId(teamMedium.teamMediaGroupId)) { - throw new TSArgsError('teamsnap.createVideoLink', 'must include `teamMediaGroupId`'); - } - return this.collections.teamMedia.exec('createTeamVideoLink', teamMedium).pop().callback(callback); -}; - -exports.bulkDeleteTeamMedia = function(teamMediumIds, callback) { - var params; - if (!teamMediumIds) { - throw new TSArgsError('teamsnap.bulkDeleteTeamMedia', "`teamMediumIds` must be provided"); - } - params = { - teamMediumIds: teamMediumIds - }; - return this.collections.teamMedia.exec('bulkDeleteTeamMedia', params).callback(callback); -}; - -exports.assignMediaToGroup = function(teamMediumIds, teamMediaGroupId, callback) { - var params; - if (!teamMediumIds) { - throw new TSArgsError('teamsnap.assignMediaToGroup', 'must provide teamMediumIds'); - } - if (this.isItem(teamMediaGroupId, 'teamMediaGroup')) { - teamMediaGroupId = teamMediaGroupId.id; - } - if (!(teamMediaGroupId && this.isId(teamMediaGroupId))) { - throw new TSArgsError('teamsnap.assignMediaToGroup', 'must provide a teamMediaGroupId'); - } - params = { - teamMediumIds: teamMediumIds, - teamMediaGroupId: teamMediaGroupId - }; - return this.collections.teamMedia.exec('assignMediaToGroup', params).callback(callback); -}; - -exports.rotateTeamMediumImage = function(teamMediumId, rotateDirection, callback) { - var params; - if (this.isItem(teamMediumId, 'teamMedium')) { - teamMediumId = teamMediumId.id; - } - if (!(teamMediumId && this.isId(teamMediumId))) { - throw new TSArgsError('teamsnap.rotateTeamMediumImage', 'must provide a teamMediumId'); - } - if (!rotateDirection) { - throw new TSArgsError('teamsnap.rotateTeamMediumImage', 'must provide a rotateDirection'); - } - params = { - teamMediumId: teamMediumId, - rotateDirection: rotateDirection - }; - return this.collections.teamMedia.exec('rotateTeamMediumImage', params).pop().callback(callback); -}; - -exports.setMediumAsTeamPhoto = function(teamMediumId, callback) { - var params; - if (this.isItem(teamMediumId, 'teamMedium')) { - teamMediumId = teamMediumId.id; - } - if (!(teamMediumId && this.isId(teamMediumId))) { - throw new TSArgsError('teamsnap.setMediumAsTeamPhoto', 'must include a teamMediumId'); - } - params = { - teamMediumId: teamMediumId - }; - return this.collections.teamMedia.exec('setMediumAsTeamPhoto', params).pop().callback(callback); -}; - -exports.setMediumAsMemberPhoto = function(teamMediumId, memberId, callback) { - var params; - if (this.isItem(teamMediumId, 'teamMedium')) { - teamMediumId = teamMediumId.id; - } - if (this.isItem(memberId, 'member')) { - memberId = memberId.id; - } - if (!(teamMediumId && this.isId(teamMediumId))) { - throw new TSArgsError('teamsnap.setMediumAsMemberPhoto', 'must include a teamMediumId'); - } - if (!(memberId && this.isId(memberId))) { - throw new TSArgsError('teamsnap.setMediumAsMemberPhoto', 'must include a memberId'); - } - params = { - teamMediumId: teamMediumId, - memberId: memberId - }; - return this.collections.teamMedia.exec('setMediumAsMemberPhoto', params).pop().callback(callback); -}; - -exports.reorderTeamMedia = function(teamId, teamMediaIds, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.reorderTeamMedia', '`teamId` must be provided'); - } - if (!(teamMediaIds && Array.isArray(teamMediaIds))) { - throw new TSArgsError('teamsnap.reorderTeamMedia', 'You must provide an array of ordered Team Medium IDs'); - } - params = { - teamId: teamId, - sortedIds: teamMediaIds - }; - return this.collections.teamMedia.exec('reorderTeamMedia', params).callback(callback); -}; - -exports.facebookShareTeamMedium = function(teamMediumId, facebookPageId, isSuppressedFromFeed, caption, callback) { - var params; - if (typeof facebookPageId === 'boolean') { - callback = caption; - caption = isSuppressedFromFeed; - isSuppressedFromFeed = facebookPageId; - facebookPageId = null; - } - if (typeof caption === 'function') { - callback = caption; - } - if (facebookPageId != null) { - facebookPageId = parseInt(facebookPageId); - } - if (this.isItem(teamMediumId, 'teamMedium')) { - teamMediumId = teamMediumId.id; - } - if (!((isSuppressedFromFeed != null) && typeof isSuppressedFromFeed === 'boolean')) { - throw new TSArgsError('teamsnap.facebookShareMedium', 'must include boolean isSuppressedFromFeed'); - } - params = { - teamMediumId: teamMediumId, - facebookPageId: facebookPageId, - caption: caption, - isSuppressedFromFeed: isSuppressedFromFeed - }; - return this.collections.teamMedia.exec('facebookShareTeamMedium', params).pop().callback(callback); -}; - -}); - -require.register("collections/teamMediaGroups.coffee", function(exports, require, module) { -exports.loadTeamMediaGroups = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamMediaGroups', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamMediaGroup', params, callback); -}; - -exports.createTeamMediaGroup = function(data) { - return this.createItem(data, { - type: 'teamMediaGroup' - }); -}; - -exports.saveTeamMediaGroup = function(teamMediaGroup, callback) { - if (!teamMediaGroup) { - throw new TSArgsError('teamsnap.saveTeamMediaGroup', "`teamMediaGroup` must be provided"); - } - if (!this.isItem(teamMediaGroup, 'teamMediaGroup')) { - throw new TSArgsError('teamsnap.saveTeamMediaGroup', "`teamMediaGroup.type` must be 'teamMediaGroup'"); - } - return this.saveItem(teamMediaGroup, callback); -}; - -exports.deleteTeamMediaGroup = function(teamMediaGroup, callback) { - if (!teamMediaGroup) { - throw new TSArgsError('teamsnap.deleteTeamMediaGroup', '`teamMediaGroup` must be provided'); - } - return this.deleteItem(teamMediaGroup, callback); -}; - -exports.reorderTeamMediaGroups = function(teamId, teamMediaGroupIds, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.reorderTeamMediaGroups', '`teamId` must be provided'); - } - if (!(teamMediaGroupIds && Array.isArray(teamMediaGroupIds))) { - throw new TSArgsError('teamsnap.reorderTeamMediaGroups', 'You must provide an array of ordered Team Media Group IDs'); - } - params = { - teamId: teamId, - sortedIds: teamMediaGroupIds - }; - return this.collections.teamMediaGroups.exec('reorderTeamMediaGroups', params).callback(callback); -}; - -exports.facebookShareTeamMediaGroup = function(teamMediaGroupId, facebookPageId, isSuppressedFromFeed, albumName, callback) { - var params; - if (typeof facebookPageId === 'boolean') { - callback = albumName; - albumName = isSuppressedFromFeed; - isSuppressedFromFeed = facebookPageId; - facebookPageId = null; - } - if (typeof albumName === 'function') { - callback = albumName; - } - if (facebookPageId != null) { - facebookPageId = parseInt(facebookPageId); - } - if (this.isItem(teamMediaGroupId, 'teamMedium')) { - teamMediaGroupId = teamMediaGroup.id; - } - if (!((isSuppressedFromFeed != null) && typeof isSuppressedFromFeed === 'boolean')) { - throw new TSArgsError('teamsnap.facebookShareMediaGroup', 'must include boolean isSuppressedFromFeed'); - } - params = { - teamMediaGroupId: teamMediaGroupId, - facebookPageId: facebookPageId, - albumName: albumName, - isSuppressedFromFeed: isSuppressedFromFeed - }; - return this.collections.teamMediaGroups.exec('facebookShareTeamMediaGroup', params).pop().callback(callback); -}; - -}); - -require.register("collections/teamMediumComments.coffee", function(exports, require, module) { -exports.loadTeamMediumComments = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamMediumComments', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamMediumComment', params, callback); -}; - -exports.createTeamMediumComment = function(data) { - return this.createItem(data, { - type: 'teamMediumComment' - }); -}; - -exports.saveTeamMediumComment = function(teamMediumComment, callback) { - if (!teamMediumComment) { - throw new TSArgsError('teamsnap.saveTeamMediumComment', '`teamMediumComment` must be provided'); - } - if (!this.isItem(teamMediumComment, 'teamMediumComment')) { - throw new TSArgsError('teamsnap.saveTeamMediumComment', "`teamMediumComment.type` must be 'teamMediumComment'"); - } - return this.saveItem(teamMediumComment, callback); -}; - -exports.deleteTeamMediumComment = function(teamMediumComment, callback) { - if (!teamMediumComment) { - throw new TSArgsError('teamsnap.deleteTeamMediumComment', '`teamMediumComment` must be provided'); - } - return this.deleteItem(teamMediumComment, callback); -}; - -}); - -require.register("collections/teamPhotos.coffee", function(exports, require, module) { -exports.loadTeamPhotos = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamPhotos', 'must provide a `teamId` or query parameters'); - } - return this.loadItems('teamPhoto', params, callback); -}; - -exports.loadTeamPhoto = function(params, callback) { - if (this.isId(params)) { - params = { - id: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamPhoto', 'must provide an `id` or query parameters'); - } - return this.loadItem('teamPhoto', params, callback); -}; - -}); - -require.register("collections/teamPublicSites.coffee", function(exports, require, module) { -exports.loadTeamPublicSites = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamPublicSites', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamPublicSite', params, callback); -}; - -exports.loadTeamPublicSite = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamPublicSite', 'must provide a teamId or query parameters'); - } - return this.loadItem('teamPublicSite', params, callback); -}; - -exports.saveTeamPublicSite = function(teamPublicSite, callback) { - if (!teamPublicSite) { - throw new TSArgsError('teamsnap.saveTeamPublicSite', "`teamPublicSite` must be provided"); - } - if (!this.isItem(teamPublicSite, 'teamPublicSite')) { - throw new TSArgsError('teamsnap.saveTeamPublicSite', "`teamPublicSite.type` must be 'teamPublicSite'"); - } - return this.saveItem(teamPublicSite, callback); -}; - -exports.uploadTeamPublicPhoto = function(teamPublicSiteId, file, callback) { - var params; - if (this.isItem(teamPublicSiteId, 'teamPublicSite')) { - teamPublicSiteId = teamPublicSite.id; - } - if (typeof FormData === 'undefined') { - this.reject('Your browser does not support the new file upload APIs.', 'file', callback); - } - if (!this.isId(teamPublicSiteId)) { - throw new TSArgsError('teamsnap.uploadTeamPublicPhoto', 'must include `teamPublicSiteId`'); - } - if (!(file instanceof File)) { - throw new TSArgsError('teamsnap.uploadTeamPublicPhoto', 'must include `file` as type File'); - } - params = { - teamPublicSiteId: teamPublicSiteId, - file: file - }; - return this.collections.teamPublicSites.exec('uploadTeamPublicPhoto', params).pop().callback(callback); -}; - -exports.deleteTeamPublicPhoto = function(teamPublicSiteId, callback) { - var params; - if (!teamPublicSiteId) { - throw new TSArgsError('teamsnap.deleteTeamPublicPhoto', "`teamPublicSiteId` must be provided"); - } - if (this.isItem(teamPublicSiteId, 'teamPublicSite')) { - teamPublicSiteId = teamPublicSite.id; - } - if (!this.isId(teamPublicSiteId)) { - throw new TSArgsError('teamsnap.deleteTeamPublicPhoto', "`teamPublicSiteId` must be a valid id"); - } - params = { - teamPublicSiteId: teamPublicSiteId - }; - return this.collections.teamPublicSites.exec('removeTeamPublicPhoto', params).callback(callback); -}; - -exports.validateSubdomain = function(subdomain, callback) { - var params; - if (!subdomain) { - throw new TSArgsError('teamsnap.validateSubdomain', "`subdomain` must be provided"); - } - params = { - subdomain: subdomain - }; - return this.collections.teamPublicSites.exec('validateSubdomain', params).callback(callback); -}; - -}); - -require.register("collections/teamStatistics.coffee", function(exports, require, module) { -exports.loadTeamStatistics = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamStatistics', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamStatistic', params, callback); -}; - -}); - -require.register("collections/teams.coffee", function(exports, require, module) { -var cleanArray; - -exports.loadTeams = function(params, callback) { - if (params == null) { - params = {}; - } - if (typeof params === 'function') { - callback = params; - params = {}; - } - if (Object.keys(params).length) { - return this.loadItems('team', params, callback); - } else { - return this.loadMe().then((function(_this) { - return function(me) { - params.userId = me.id; - return _this.loadItems('team', params, callback); - }; - })(this)); - } -}; - -exports.loadTeam = function(teamId, callback) { - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.loadTeam', 'teamId must be provided'); - } - return this.loadItem('team', { - teamId: teamId - }, callback); -}; - -exports.createTeam = function(data) { - return this.createItem(data, { - type: 'team', - name: '' - }); -}; - -exports.saveTeam = function(team, callback) { - var ref; - if (!team) { - throw new TSArgsError('teamsnap.saveTeam', "`team` must be provided"); - } - if (!this.isItem(team, 'team')) { - throw new TSArgsError('teamsnap.saveTeam', "`type` must be 'team'"); - } - if (!((ref = team.name) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a name for the team.', 'name', callback); - } - return this.saveItem(team, callback); -}; - -exports.deleteTeam = function(team, callback) { - if (!team) { - throw new TSArgsError('teamsnap.deleteTeam', '`team` must be provided'); - } - return this.deleteItem(team, callback); -}; - -exports.bulkLoad = function(teamId, types, callback) { - var key, loadParams, params, value; - if (typeof teamId === 'object' && !Array.isArray(teamId)) { - loadParams = teamId; - teamId = loadParams.teamId; - types = loadParams.types; - } - if (!(this.isId(teamId) || (Array.isArray(teamId) && this.isId(teamId[0])))) { - throw new TSArgsError('teamsnap.bulkLoad', 'teamId must be provided'); - if (typeof types === 'function') { - callback = types; - types = null; - } - } - if (!Array.isArray(types)) { - types = this.getTeamTypes(); - types.splice(types.indexOf('availability'), 1); - } - params = { - teamId: teamId, - types: types.map(this.underscoreType).join(',') - }; - if (loadParams != null) { - if (loadParams.scopeTo != null) { - params.scopeTo = this.underscoreType(loadParams.scopeTo); - } - for (key in loadParams) { - value = loadParams[key]; - if (key.indexOf('__') !== -1) { - params[key] = value; - } - } - } - return this.collections.root.queryItems('bulkLoad', params, callback); -}; - -exports.invite = function(options) { - if (options == null) { - options = {}; - } - cleanArray(options, 'memberId'); - cleanArray(options, 'contactId'); - if (!(options.memberId || options.contactId)) { - throw new TSArgsError('teamsnap.invite', 'options.memberId or options.contactId is required.'); - } - if (!options.teamId) { - throw new TSArgsError('teamsnap.invite', 'options.teamId is required.'); - } - if (!options.notifyAsMemberId) { - throw new TSArgsError('teamsnap.invite', 'options.notifyAsMemberId is required.'); - } - return this.collections.teams.exec('invite', options); -}; - -exports.updateTimeZone = function(options) { - if (options == null) { - options = {}; - } - if (!options.timeZone) { - throw new TSArgsError('teamsnap.updateTimeZone', 'options.timeZone is required.'); - } - if (!options.teamId) { - throw new TSArgsError('teamsnap.updateTimeZone', 'options.teamId is required.'); - } - if (!options.offsetTeamTimes) { - throw new TSArgsError('teamsnap.updateTimeZone', 'options.offsetTeamTimes is required'); - } - return this.collections.teams.exec('updateTimeZone', options); -}; - -exports.resetStatistics = function(teamId, callback) { - var params; - if (!teamId) { - throw new TSArgsError('teamsnap.resetStatistics', "`teamId` must be provided"); - } - if (this.isItem(teamId, 'teamId')) { - teamId = teamId.id; - } - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.resetStatistics', "`teamId` must be a valid id"); - } - params = { - teamId: teamId - }; - return this.collections.teams.exec('resetStatistics', params).callback(callback); -}; - -exports.divisionLoadTeams = function(params, callback) { - if (!params.divisionId) { - throw new TSArgsError('teamsnap.divisionLoadTeams', "`divisionId` must be provided"); - } - return this.collections.teams.queryItems('divisionSearch', params, callback); -}; - -cleanArray = function(obj, prop) { - var plural; - plural = prop + 's'; - if (obj[plural]) { - obj[prop] = obj[plural]; - delete obj[plural]; - } - if ((obj[prop] != null) && !Array.isArray(obj[prop])) { - obj[prop] = [obj[prop]]; - } - return obj; -}; - -}); - -require.register("collections/teamsPaypalPreferences.coffee", function(exports, require, module) { -exports.loadTeamsPaypalPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamsPaypalPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamPaypalPreferences', params, callback); -}; - -exports.loadTeamPaypalPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamPaypalPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItem('teamPaypalPreferences', params, callback); -}; - -exports.saveTeamPaypalPreferences = function(teamPaypalPreferences, callback) { - if (!teamPaypalPreferences) { - throw new TSArgsError('teamsnap.saveTeamPaypalPreferences', "`teamPaypalPreferences` must be provided"); - } - if (!this.isItem(teamPaypalPreferences, 'teamPaypalPreferences')) { - throw new TSArgsError('teamsnap.saveTeamPaypalPreferences', "`teamPaypalPreferences.type` must be 'teamPaypalPreferences'"); - } - return this.saveItem(teamPaypalPreferences, callback); -}; - -}); - -require.register("collections/teamsPreferences.coffee", function(exports, require, module) { -exports.ASSIGNMENTS_ENABLED_FOR_CODE = { - GamesAndEvents: 0, - Games: 1, - Events: 2 -}; - -exports.loadTeamsPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItems('teamPreferences', params, callback); -}; - -exports.loadTeamPreferences = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamPreferences', 'must provide a teamId or query parameters'); - } - return this.loadItem('teamPreferences', params, callback); -}; - -exports.saveTeamPreferences = function(teamPreferences, callback) { - if (!teamPreferences) { - throw new TSArgsError('teamsnap.saveTeamPreferences', "`teamPreferences` must be provided"); - } - if (!this.isItem(teamPreferences, 'teamPreferences')) { - throw new TSArgsError('teamsnap.saveTeamPreferences', "`teamPreferences.type` must be 'teamPreferences'"); - } - return this.saveItem(teamPreferences, callback); -}; - -exports.uploadTeamPhoto = function(teamPreferencesId, file, callback) { - var params; - if (this.isItem(teamPreferencesId, 'teamPreferences')) { - teamPreferencesId = teamPreferencesId.id; - } - if (typeof FormData === 'undefined') { - this.reject('Your browser does not support the new file upload APIs.', 'file', callback); - } - if (!this.isId(teamPreferencesId)) { - throw new TSArgsError('teamsnap.uploadTeamPhoto', 'must include `teamPreferencesId`'); - } - if (!(file instanceof File)) { - throw new TSArgsError('teamsnap.uploadTeamPhoto', 'must include `file` as type File'); - } - params = { - teamPreferencesId: teamPreferencesId, - file: file - }; - return this.collections.teamsPreferences.exec('uploadTeamPhoto', params).pop().callback(callback); -}; - -exports.deleteTeamPhoto = function(teamPreferencesId, callback) { - var params; - if (!teamPreferencesId) { - throw new TSArgsError('teamsnap.deleteTeamPhoto', "`teamPreferencesId` must be provided"); - } - if (this.isItem(teamPreferencesId, 'teamPreferences')) { - teamPreferencesId = teamPreferences.id; - } - if (!this.isId(teamPreferencesId)) { - throw new TSArgsError('teamsnap.deleteTeamPhoto', "`teamPreferencesId` must be a valid id"); - } - params = { - teamPreferencesId: teamPreferencesId - }; - return this.collections.teamsPreferences.exec('removeTeamPhoto', params).callback(callback); -}; - -exports.uploadTeamLogo = function(teamPreferencesId, file, callback) { - var params; - if (this.isItem(teamPreferencesId, 'teamPreferences')) { - teamPreferencesId = teamPreferences.id; - } - if (typeof FormData === 'undefined') { - this.reject('Your browser does not support the new file upload APIs.', 'file', callback); - } - if (!this.isId(teamPreferencesId)) { - throw new TSArgsError('teamsnap.uploadTeamLogo', 'must include `teamPreferencesId`'); - } - if (!(file instanceof File)) { - throw new TSArgsError('teamsnap.uploadTeamLogo', 'must include `file` as type File'); - } - params = { - teamPreferencesId: teamPreferencesId, - file: file - }; - return this.collections.teamsPreferences.exec('uploadTeamLogo', params).pop().callback(callback); -}; - -exports.deleteTeamLogo = function(teamPreferencesId, callback) { - var params; - if (!teamPreferencesId) { - throw new TSArgsError('teamsnap.deleteTeamLogo', "`teamPreferencesId` must be provided"); - } - if (this.isItem(teamPreferencesId, 'teamPreferences')) { - teamPreferencesId = teamPreferences.id; - } - if (!this.isId(teamPreferencesId)) { - throw new TSArgsError('teamsnap.deleteTeamLogo', "`teamPreferencesId` must be a valid id"); - } - params = { - teamPreferencesId: teamPreferencesId - }; - return this.collections.teamsPreferences.exec('removeTeamLogo', params).callback(callback); -}; - -}); - -require.register("collections/teamsResults.coffee", function(exports, require, module) { -exports.loadTeamsResults = function(params, callback) { - if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTeamsResults', 'must provide query parameters'); - } - return this.loadItems('teamResults', params, callback); -}; - -exports.loadTeamResults = function(teamId, callback) { - var params; - if (!this.isId(teamId)) { - throw new TSArgsError('teamsnap.loadTeamResults', 'must provide a teamId'); - } - params = { - teamId: teamId - }; - return this.loadItem('teamResults', params, callback); -}; - -}); - -require.register("collections/trackedItemStatuses.coffee", function(exports, require, module) { -var key, ref, statuses, value; - -exports.TRACKING = { - NONE: 0, - CHECK: 1, - X: 2 -}; - -statuses = {}; - -ref = exports.TRACKING; -for (key in ref) { - value = ref[key]; - statuses[value] = true; -} - -exports.loadTrackedItemStatuses = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTrackedItemStatuses', 'must provide a teamId or query parameters'); - } - return this.loadItems('trackedItemStatus', params, callback); -}; - -exports.saveTrackedItemStatus = function(trackedItemStatus, callback) { - if (!trackedItemStatus) { - throw new TSArgsError('teamsnap.saveTrackedItemStatus', "`trackedItemStatus` must be provided"); - } - if (!this.isItem(trackedItemStatus, 'trackedItemStatus')) { - throw new TSArgsError('teamsnap.saveTrackedItemStatus', "`trackedItemStatus.type` must be 'trackedItemStatus'"); - } - if (!statuses[trackedItemStatus.statusCode]) { - return this.reject('You must select a valid status', 'statusCode', callback); - } - return this.saveItem(trackedItemStatus, callback); -}; - -}); - -require.register("collections/trackedItems.coffee", function(exports, require, module) { -exports.loadTrackedItems = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadTrackedItems', 'must provide a teamId or query parameters'); - } - return this.loadItems('trackedItem', params, callback); -}; - -exports.createTrackedItem = function(data) { - return this.createItem(data, { - type: 'trackedItem', - name: '' - }); -}; - -exports.saveTrackedItem = function(trackedItem, callback) { - var ref; - if (!trackedItem) { - throw new TSArgsError('teamsnap.saveTrackedItem', "`trackedItem` must be provided"); - } - if (!this.isItem(trackedItem, 'trackedItem')) { - throw new TSArgsError('teamsnap.saveTrackedItem', "`trackedItem.type` must be 'trackedItem'"); - } - if (!trackedItem.teamId) { - return this.reject('You must choose a team.', 'teamId', callback); - } - if (!((ref = trackedItem.name) != null ? ref.trim() : void 0)) { - return this.reject('You must provide a name for the tracked item.', 'name', callback); - } - return this.saveItem(trackedItem, callback); -}; - -exports.deleteTrackedItem = function(trackedItem, callback) { - if (!trackedItem) { - throw new TSArgsError('teamsnap.deleteTrackedItem', '`trackedItem` must be provided'); - } - return this.deleteItem(trackedItem, callback); -}; - -}); - -require.register("collections/users.coffee", function(exports, require, module) { -exports.loadUsers = function(params, callback) { - if (this.isId(params)) { - params = { - teamId: params - }; - } else if (!(params && typeof params === 'object')) { - throw new TSArgsError('teamsnap.loadUsers', 'must provide a teamId or query parameters'); - } - return this.loadItems('user', params, callback); -}; - -exports.loadMe = function(callback) { - return this.collections.root.queryItem('me', callback); -}; - -exports.saveUser = function(user, callback) { - var ref; - if (!user) { - throw new TSArgsError('teamsnap.saveUser', "`user` must be provided"); - } - if (!this.isItem(user, 'user')) { - throw new TSArgsError('teamsnap.saveUser', "`user.type` must be 'user'"); - } - if (!((ref = user.email) != null ? ref.trim() : void 0)) { - return this.reject('You must provide an email for the user.', 'email', callback); - } - return this.saveItem(user, callback); -}; - -}); - -require.register("errors.coffee", function(exports, require, module) { -var TSArgsError, TSError, TSServerError, TSValidationError, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - -TSError = (function(superClass) { - extend(TSError, superClass); - - function TSError(message) { - TSError.__super__.constructor.call(this); - this.name = 'TeamSnapError'; - this.message = message; - } - - return TSError; - -})(Error); - -TSArgsError = (function(superClass) { - extend(TSArgsError, superClass); - - function TSArgsError(method, msg) { - TSArgsError.__super__.constructor.call(this); - this.name = 'TeamSnapArgumentError'; - this.message = "Failed to execute `" + method + "`: " + msg + "."; - } - - return TSArgsError; - -})(TypeError); - -TSValidationError = (function(superClass) { - extend(TSValidationError, superClass); - - function TSValidationError(message, field) { - TSValidationError.__super__.constructor.call(this); - this.name = 'TeamSnapValidationError'; - this.message = message; - this.field = field; - } - - return TSValidationError; - -})(RangeError); - -TSServerError = (function(superClass) { - extend(TSServerError, superClass); - - function TSServerError(message) { - TSServerError.__super__.constructor.call(this); - this.name = 'TeamSnapServerError'; - this.message = message || 'An unknown error occurred on TeamSnap\'s server.'; - } - - TSServerError.create = function(message, jqxhr) { - return new TSServerError(message, jqxhr); - }; - - return TSServerError; - -})(Error); - -global.TSError = TSError; - -global.TSArgsError = TSArgsError; - -global.TSValidationError = TSValidationError; - -global.TSServerError = TSServerError; - -}); - -require.register("linking.coffee", function(exports, require, module) { -var linkItem, linkItemWith, linkItems, types, unlinkItem, unlinkItemFrom, unlinkItems, unlinkItemsFrom; - -types = require('./types'); - -linkItems = function(items, lookup) { - if (lookup == null) { - lookup = {}; - } - if (!items) { - return; - } - if (Array.isArray(items)) { - items.forEach(function(item) { - if (item.href) { - return lookup[item.href] = item; - } - }); - items.forEach(function(item) { - return linkItem(item, lookup); - }); - } else { - if (items.href) { - lookup[items.href] = items; - } - linkItem(items, lookup); - } - return items; -}; - -unlinkItems = function(items, lookup) { - if (lookup == null) { - lookup = {}; - } - if (!items) { - return; - } - if (Array.isArray(items)) { - items.forEach(function(item) { - return unlinkItem(item, lookup); - }); - } else { - unlinkItem(items, lookup); - } - return items; -}; - -linkItem = function(item, lookup) { - if (!lookup) { - throw new TSArgsError('linkItem', 'lookup must be provided'); - } - if (item.href) { - lookup[item.href] = item; - } - return item.links.each(function(rel, href) { - var related; - if (types.isPluralType(rel)) { - if (!item[rel]) { - return item[rel] = []; - } - } else { - if (!(related = lookup[href])) { - return; - } - item[rel] = related; - return linkItemWith(item, related); - } - }); -}; - -linkItemWith = function(item, other) { - var plural; - plural = types.getPluralType(item.type); - if (plural && other.links.has(plural)) { - if (!other[plural]) { - other[plural] = []; - } - if (other[plural].indexOf(item) === -1) { - return other[plural].push(item); - } - } else { - return other.links.each(function(rel, href) { - if (href === item.href) { - return other[rel] = item; - } - }); - } -}; - -unlinkItem = function(item, lookup) { - if (!item.href) { - return; - } - if (lookup[item.href] === item) { - delete lookup[item.href]; - } - return item.links.each(function(rel, href) { - if (!item[rel]) { - return; - } - if (types.isPluralType(rel)) { - unlinkItemsFrom(item[rel], item); - } else { - unlinkItemFrom(item, item[rel]); - } - return delete item[rel]; - }); -}; - -unlinkItemFrom = function(item, other) { - var index, plural; - plural = types.getPluralType(item.type); - if (plural && other.links.has(plural) && other[plural]) { - index = other[plural].indexOf(item); - if (index !== -1) { - return other[plural].splice(index, 1); - } - } else { - return other.links.each(function(rel, href) { - if (other[rel] === item) { - return delete other[rel]; - } - }); - } -}; - -unlinkItemsFrom = function(items, from) { - return items.forEach(function(item) { - return item.links.each(function(rel, href) { - if (item[rel] === from) { - return delete item[rel]; - } - }); - }); -}; - -exports.linkItems = linkItems; - -exports.unlinkItems = unlinkItems; - -exports.linkItem = linkItem; - -exports.linkItemWith = linkItemWith; - -exports.unlinkItem = unlinkItem; - -exports.unlinkItemFrom = unlinkItemFrom; - -exports.unlinkItemsFrom = unlinkItemsFrom; - -}); - -require.register("loadCollections.coffee", function(exports, require, module) { -var Collection, collectionsPromise, promises, types, - hasProp = {}.hasOwnProperty; - -promises = require('./promises'); - -types = require('./types'); - -Collection = require('./model').Collection; - -collectionsPromise = null; - -module.exports = function(request, cachedCollections) { - if (!collectionsPromise || collectionsPromise.getStatus() === 'reject') { - collectionsPromise = request.get(teamsnap.apiUrl).then(function(xhr) { - var collections, key, loads, ref, ref1, ref2, ref3, root, rootTypeToRels, value; - collections = {}; - collections.root = root = Collection.fromData(xhr.data); - if (cachedCollections && cachedCollections.root.version === root.version) { - collections = {}; - for (key in cachedCollections) { - value = cachedCollections[key]; - collections[key] = new Collection(value); - } - return collectionsPromise = promises.resolve(collections); - } else { - rootTypeToRels = {}; - loads = []; - ref = collections.root.links; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - value = ref[key]; - rootTypeToRels[value.href] = key; - } - if ((ref1 = collections.root) != null ? (ref2 = ref1.links) != null ? (ref3 = ref2.schemas) != null ? ref3.href : void 0 : void 0 : void 0) { - loads.push(request.get(collections.root.links.schemas.href).then(function(xhr) { - return xhr.data.forEach(function(collection) { - var rel; - rel = rootTypeToRels[collection.collection.href]; - if (rel && rel !== "root") { - return collections[rel] = Collection.fromData(collection); - } - }); - })); - } else { - types.getTypes().forEach(function(type) { - var rel; - rel = types.getPluralType(type); - if (root.links.has(rel)) { - return loads.push(request.get(root.links.href(rel)).then(function(xhr) { - return collections[rel] = Collection.fromData(xhr.data); - })); - } - }); - } - return promises.when.apply(promises, loads).then(function() { - return collections; - }); - } - }); - } - return collectionsPromise; -}; - -module.exports.clear = function() { - return collectionsPromise = null; -}; - -}); - -require.register("model.coffee", function(exports, require, module) { -var Collection, File, Item, MetaList, ScopedCollection, camelize, copy, dateField, dateValue, promises, underscore, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - -promises = require('./promises'); - -File = global.File || function() {}; - -Collection = (function() { - Collection.fromData = function(data) { - return new Collection().deserialize(data); - }; - - function Collection(data) { - if (data == null) { - data = {}; - } - this.href = data.href; - this.links = new MetaList(data.links); - this.queries = new MetaList(data.queries); - this.commands = new MetaList(data.commands); - this.template = data.template || []; - if (data.version) { - this.version = data.version; - } - if (data.items) { - this.items = data.items; - } - } - - Collection.prototype.deserialize = function(data) { - var ref, ref1; - if (data.collection) { - data = data.collection; - } - if (!data) { - return; - } - this.href = data.href; - this.links.deserialize(data.links); - this.queries.deserialize(data.queries); - this.commands.deserialize(data.commands); - if (data.version) { - this.version = data.version; - } - this.template = ((ref = data.template) != null ? ref.data : void 0) || []; - if ((ref1 = data.items) != null ? ref1.length : void 0) { - this.items = data.items; - } - return this; - }; - - return Collection; - -})(); - -ScopedCollection = (function(superClass) { - extend(ScopedCollection, superClass); - - ScopedCollection.fromData = function(request, data) { - return new ScopedCollection(request, new Collection().deserialize(data)); - }; - - function ScopedCollection(_request, collection) { - this._request = _request; - this.href = collection.href; - this.links = collection.links; - this.queries = collection.queries; - this.commands = collection.commands; - this.template = collection.template; - this.version = collection.version; - if (collection.items) { - this.items = Item.fromArray(this._request, collection.items); - } - } - - ScopedCollection.prototype.save = function(item, callback) { - var data, method; - if (!(item instanceof Item)) { - item = Item.create(this._request, item); - } - method = item.href ? 'put' : 'post'; - data = item.serialize(this.template); - if (data.template.data.length === 0) { - return promises.resolve(item).callback(callback); - } - return this._request(method, item.href || this.href, data).then((function(_this) { - return function(xhr) { - var all, items, ref, ref1; - if ((items = (ref = xhr.data) != null ? (ref1 = ref.collection) != null ? ref1.items : void 0 : void 0)) { - if (items.length > 1) { - item.deserialize(items.shift()); - all = Item.fromArray(_this._request, items); - all.unshift(item); - return all; - } else if (items.length) { - return item.deserialize(xhr.data); - } - } - }; - })(this)).callback(callback); - }; - - ScopedCollection.prototype.loadItems = function(linkName, callback) { - return this.links.loadItems(this._request, linkName, callback); - }; - - ScopedCollection.prototype.loadItem = function(linkName, callback) { - return this.links.loadItem(this._request, linkName, callback); - }; - - ScopedCollection.prototype.queryItems = function(queryName, params, callback) { - return this.queries.loadItems(this._request, queryName, params, callback); - }; - - ScopedCollection.prototype.queryItem = function(queryName, params, callback) { - return this.queries.loadItem(this._request, queryName, params, callback); - }; - - ScopedCollection.prototype.exec = function(commandName, params, callback) { - return this.commands.exec(this._request, commandName, params, callback); - }; - - ScopedCollection.prototype.file = function(commandName, params, progress, callback) { - return this.commands.fileExec(this._request, commandName, params, progress, callback); - }; - - return ScopedCollection; - -})(Collection); - -Item = (function() { - Item.create = function(request, data) { - return new Item(request, data); - }; - - Item.fromArray = function(request, array) { - if (Array.isArray(array)) { - return array.map(function(data) { - return Item.fromData(request, data); - }); - } else { - return array; - } - }; - - Item.fromData = function(request, data) { - if (data.collection || data.data) { - return this.create(request).deserialize(data); - } else { - return this.create(request, data); - } - }; - - function Item(_request, data) { - this._request = _request; - if (typeof data === 'string') { - this.href = data; - } else if (data && typeof data === 'object') { - copy(data, this); - } - if (!(this.links instanceof MetaList)) { - this.links = new MetaList(data != null ? data.links : void 0); - } - } - - Item.prototype.deserialize = function(data) { - var i, len, prop, ref, ref1, value; - if (data != null ? data.collection : void 0) { - data = (ref = data.collection.items) != null ? ref[0] : void 0; - } - if (!data) { - return; - } - this.href = data.href; - this.links.deserialize(data.links); - ref1 = data.data; - for (i = 0, len = ref1.length; i < len; i++) { - prop = ref1[i]; - value = prop.value; - if (prop.type === 'DateTime' && value) { - value = new Date(value); - } - if (prop.name === 'type') { - value = camelize(value); - } - this[camelize(prop.name)] = value; - } - return this; - }; - - Item.prototype.serialize = function(template) { - var fields, item; - if (!(template != null ? template.length : void 0)) { - throw new TSError('You must provide the collection\'s template'); - } - fields = []; - item = this; - template.forEach(function(prop) { - var value; - value = item[camelize(prop.name)]; - if (prop.name === 'type') { - value = underscore(value); - } - if (value !== void 0) { - return fields.push({ - name: prop.name, - value: value - }); - } - }); - return { - template: { - data: fields - } - }; - }; - - Item.prototype.loadItems = function(linkName, callback) { - return this.links.loadItems(this._request, linkName, callback); - }; - - Item.prototype.loadItem = function(linkName, callback) { - return this.links.loadItem(this._request, linkName, callback); - }; - - Item.prototype["delete"] = function(params, callback) { - var data, fields, key, value; - if (typeof params === 'function') { - callback = params; - params = null; - } - if (params) { - fields = []; - for (key in params) { - if (!hasProp.call(params, key)) continue; - value = params[key]; - fields.push({ - name: underscore(key), - value: value - }); - } - data = { - template: { - data: fields - } - }; - } - return this._request["delete"](this.href, data).callback(callback); - }; - - Item.prototype.copy = function(template) { - var obj; - obj = {}; - if (template) { - template.forEach((function(_this) { - return function(prop) { - var camel; - camel = camelize(prop.name); - return obj[camel] = _this[camel]; - }; - })(this)); - } else { - copy(this, obj); - } - delete obj.id; - delete obj.href; - obj.type = this.type; - obj.links = this.links.cloneEmpty(); - return new Item(this._request, obj); - }; - - Item.prototype.toJSON = function() { - var obj; - obj = {}; - Object.keys(this).forEach((function(_this) { - return function(key) { - var value; - value = _this[key]; - if (typeof value === 'function' || key.charAt(0) === '_' || _this.links.has(key)) { - return; - } - return obj[key] = _this[key]; - }; - })(this)); - return obj; - }; - - return Item; - -})(); - -MetaList = (function() { - function MetaList(data) { - if (data) { - copy(data, this); - } - } - - MetaList.prototype.deserialize = function(data) { - var entry, i, j, len, len1, link, linksToRemove, param, params, propName, ref, results; - if (!Array.isArray(data)) { - return; - } - linksToRemove = {}; - Object.keys(this).forEach(function(link) { - return linksToRemove[link] = true; - }); - for (i = 0, len = data.length; i < len; i++) { - entry = data[i]; - params = {}; - if (Array.isArray(entry.data)) { - ref = entry.data; - for (j = 0, len1 = ref.length; j < len1; j++) { - param = ref[j]; - params[camelize(param.name)] = param.value; - } - } - propName = camelize(entry.rel); - this[propName] = { - href: entry.href, - params: params - }; - delete linksToRemove[propName]; - } - results = []; - for (link in linksToRemove) { - results.push(delete this[link]); - } - return results; - }; - - MetaList.prototype.has = function(rel) { - return this.hasOwnProperty(rel); - }; - - MetaList.prototype.href = function(rel) { - var ref; - return (ref = this[rel]) != null ? ref.href : void 0; - }; - - MetaList.prototype.each = function(iterator) { - var entry, ref, rel, results; - ref = this; - results = []; - for (rel in ref) { - if (!hasProp.call(ref, rel)) continue; - entry = ref[rel]; - results.push(iterator(rel, entry.href, entry.params)); - } - return results; - }; - - MetaList.prototype.loadItems = function(request, rel, params, callback) { - if (typeof params === 'function') { - callback = params; - params = void 0; - } - return this._request(request, 'get', rel, params, 'items').callback(callback); - }; - - MetaList.prototype.loadItem = function(request, rel, params, callback) { - if (typeof params === 'function') { - callback = params; - params = void 0; - } - return this._request(request, 'get', rel, params, 'item').callback(callback); - }; - - MetaList.prototype["delete"] = function(request, rel, callback) { - return this._request(request, 'delete', rel, void 0, 'item').callback(callback); - }; - - MetaList.prototype.exec = function(request, rel, params, callback) { - if (typeof params === 'function') { - callback = params; - params = void 0; - } - return this._request(request, 'post', rel, params, 'items').callback(callback); - }; - - MetaList.prototype.fileExec = function(request, rel, params, progress, callback) { - var progressHook; - if (typeof params === 'function') { - callback = progress; - progress = params; - params = void 0; - } - progressHook = function(xhr, data) { - if (data instanceof FormData) { - return xhr.upload.onprogress = function(e) { - if (e.lengthComputable) { - return progress({ - loaded: e.loaded, - total: e.total - }); - } - }; - } - }; - request.hook(progressHook); - return this._request(request, 'post', rel, params, 'items').callback(callback); - }; - - MetaList.prototype.cloneEmpty = function() { - var clone, entry, ref, rel; - clone = new MetaList(); - ref = this; - for (rel in ref) { - if (!hasProp.call(ref, rel)) continue; - entry = ref[rel]; - if (entry.href) { - clone[rel] = { - href: '' - }; - } - } - return clone; - }; - - MetaList.prototype._request = function(request, method, rel, params, type) { - var data, entry, filteredOn, itemCollection, key, value; - if (!(entry = this[rel])) { - throw new TSError("Unable to find rel '" + rel + "'"); - } - if (params) { - data = {}; - for (key in params) { - if (!hasProp.call(params, key)) continue; - value = params[key]; - if (value instanceof File) { - data = new FormData(); - for (key in params) { - if (!hasProp.call(params, key)) continue; - value = params[key]; - data.append(underscore(key), value); - } - break; - } - if (entry.params.hasOwnProperty(key)) { - data[underscore(key)] = value; - } else if (key.indexOf('__') !== -1) { - filteredOn = key.split('__'); - itemCollection = teamsnap.getCollectionForItem(filteredOn[0]); - if (itemCollection.queries.search.params.hasOwnProperty(filteredOn[1])) { - data[underscore(key)] = value; - } - } - } - } - return request(method, entry.href, data).then(function(xhr) { - var items, ref, ref1; - items = ((ref = xhr.data) != null ? (ref1 = ref.collection) != null ? ref1.items : void 0 : void 0) ? Item.fromArray(request, xhr.data.collection.items) : []; - if (type === 'item') { - return items.pop(); - } else { - return items; - } - }); - }; - - return MetaList; - -})(); - -dateField = /(At|Date)$/; - -dateValue = /^\d{4}-/; - -copy = function(from, to) { - Object.keys(from).forEach(function(key) { - var value; - value = from[key]; - if (typeof value === 'function' || key.charAt(0) === '_') { - return; - } - if (dateField.test(key) && dateValue.test(value)) { - value = new Date(value); - } - return to[key] = value; - }); - return to; -}; - -camelize = function(str) { - return str.replace(/[-_]+(\w)/g, function(_, char) { - return char.toUpperCase(); - }); -}; - -underscore = function(str) { - return str.replace(/[A-Z]/g, function(char) { - return '_' + char.toLowerCase(); - }); -}; - -exports.Collection = Collection; - -exports.ScopedCollection = ScopedCollection; - -exports.Item = Item; - -exports.MetaList = MetaList; - -}); - -require.register("persistence.coffee", function(exports, require, module) { -var Item, MetaList, ScopedCollection, camelize, copy, linking, lookup, modifyModel, modifySDK, promises, ref, revertModel, revertSDK, revertWrapMethod, types, wrapMethod, wrapSave, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - -promises = require('./promises'); - -linking = require('./linking'); - -types = require('./types'); - -Item = require('./model').Item; - -ref = require('./model'), ScopedCollection = ref.ScopedCollection, Item = ref.Item, MetaList = ref.MetaList; - -lookup = null; - -exports.enablePersistence = function(cachedItemData) { - var initialItems; - if (lookup) { - return; - } - if (!this.collections) { - throw new TSError('You must auth() and loadCollections() before enabling persistence.'); - } - this.persistenceEnabled = true; - lookup = {}; - modifyModel(); - modifySDK(this); - initialItems = []; - initialItems.push.apply(initialItems, this.plans); - initialItems.push.apply(initialItems, this.smsGateways); - initialItems.push.apply(initialItems, this.sports); - initialItems.push.apply(initialItems, this.timeZones); - linking.linkItems(this.plans.concat(this.sports), lookup); - if (cachedItemData) { - return Item.fromArray(this.request, cachedItemData); - } -}; - -exports.disablePersistence = function() { - if (!lookup) { - return; - } - this.persistenceEnabled = false; - linking.unlinkItems(Object.keys(lookup).map(function(href) { - return lookup[href]; - }), lookup); - lookup = null; - revertModel(); - revertSDK(this); - return this; -}; - -exports.findItem = function(href) { - return lookup != null ? lookup[href] : void 0; -}; - -exports.getAllItems = function() { - return Object.keys(lookup).map(function(href) { - return lookup[href]; - }); -}; - -exports.unlinkTeam = function(team) { - var i, items, len, plural, ref1, ref2, teamType, users, value; - items = [team]; - users = (ref1 = team.members) != null ? ref1.filter(function(member) { - return member.user; - }).map(function(member) { - return member.user; - }) : void 0; - ref2 = this.getTeamTypes(); - for (i = 0, len = ref2.length; i < len; i++) { - teamType = ref2[i]; - plural = this.getPluralType(teamType); - if ((value = team[plural]) && value.length) { - items.push.apply(items, value); - } else if ((value = team[teamType])) { - items.push(value); - } - } - return unlinkItems(items); -}; - -modifyModel = function() { - wrapMethod(Item, 'fromArray', function(fromArray) { - return function(request, array) { - var items; - items = fromArray.call(this, request, array); - return linking.linkItems(items, lookup).map(function(item) { - return item.saveState(); - }); - }; - }); - wrapMethod(ScopedCollection.prototype, 'save', function(save) { - return function(item, callback) { - return save.call(this, item).then(function(item) { - if (Array.isArray(item)) { - return item.map(function(item) { - linking.linkItem(item, lookup); - return item.saveState(); - }); - } else { - linking.linkItem(item, lookup); - return item.saveState(); - } - }).callback(callback); - }; - }); - wrapMethod(Item.prototype, 'delete', function(deleteItem) { - return function(params, callback) { - var item; - item = this; - linking.unlinkItem(item, lookup); - return deleteItem.call(this, params).fail(function(err) { - linking.linkItem(item, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(Item, 'create', function(create) { - return function(request, data) { - var item; - item = create.call(this, request, data); - linking.linkItem(item, lookup); - return item; - }; - }); - wrapMethod(Item.prototype, 'deserialize', function(deserialize) { - return function(data) { - var item, ref1; - if (data != null ? data.collection : void 0) { - data = (ref1 = data.collection.items) != null ? ref1[0] : void 0; - } - item = lookup[data.href] || this; - return deserialize.call(item, data); - }; - }); - wrapMethod(Item.prototype, 'serialize', function(serialize) { - return function(template) { - var body, state; - body = serialize.call(this, template); - if ((state = this._state)) { - body.template.data = body.template.data.filter(function(field) { - var isSame, oldValue, value; - oldValue = state[camelize(field.name)]; - value = field.value; - if (field.name === 'type') { - value = camelize(value); - } - isSame = value === oldValue || (value && oldValue && value.valueOf() === oldValue.valueOf()); - return !isSame; - }); - } - return body; - }; - }); - Item.prototype.saveState = function() { - this._state = { - _undos: [] - }; - if (this.href) { - copy(this, this._state); - } - return this; - }; - Item.prototype.rollback = function() { - this._state._undos.reverse().forEach(function(undo) { - return undo(); - }); - this._state._undos.length = 0; - return copy(this._state, this); - }; - return Item.prototype.link = function(rel, item) { - var related, undos; - if (!this._state) { - this.saveState(); - } - undos = this._state._undos; - if (this[rel]) { - related = this[rel]; - linking.unlinkItemFrom(this, this[rel]); - undos.push((function(_this) { - return function() { - _this[rel] = related; - _this.links[rel].href = related.href; - _this[rel + 'Id'] = related.id; - return linking.linkItemWith(_this, related); - }; - })(this)); - } - this[rel] = item; - if (item) { - this[rel + 'Id'] = item.id; - this.links[rel].href = item.href; - linking.linkItemWith(this, item); - undos.push((function(_this) { - return function() { - delete _this[rel]; - delete _this[rel + 'Id']; - return linking.unlinkItemFrom(_this, item); - }; - })(this)); - } - return this; - }; -}; - -revertModel = function() { - revertWrapMethod(MetaList.prototype, '_request'); - revertWrapMethod(ScopedCollection.prototype, 'save'); - revertWrapMethod(Item.prototype, 'delete'); - revertWrapMethod(Item, 'create'); - revertWrapMethod(Item.prototype, 'deserialize'); - revertWrapMethod(Item.prototype, 'serialize'); - delete Item.prototype.saveState; - delete Item.prototype.rollback; - return delete Item.prototype.link; -}; - -modifySDK = function(sdk) { - wrapSave(sdk, 'saveMember', function(member) { - return promises.when(sdk.loadAvailabilities({ - memberId: member.id - }), sdk.loadTrackedItemStatuses({ - memberId: member.id - }), sdk.loadCustomData({ - memberId: member.id - }), sdk.loadLeagueCustomData({ - memberId: member.id - }), sdk.loadMemberPayments({ - memberId: member.id - }), sdk.loadMemberBalances({ - memberId: member.id - }), sdk.loadTeamFees({ - teamId: member.teamId - })); - }); - wrapMethod(sdk, 'deleteMember', function(deleteMember) { - return function(member, callback) { - var toRemove; - toRemove = []; - toRemove.push.apply(toRemove, member.assignments); - toRemove.push.apply(toRemove, member.availabilities); - member.contacts.forEach(function(contact) { - toRemove.push.apply(toRemove, contact.contactEmailAddresses); - toRemove.push.apply(toRemove, contact.contactPhoneNumbers); - return toRemove.push(contact); - }); - toRemove.push.apply(toRemove, member.trackedItemStatuses); - toRemove.push.apply(toRemove, member.memberPayments); - toRemove.push.apply(toRemove, member.memberStatistics); - toRemove.push.apply(toRemove, member.statisticData); - toRemove.push.apply(toRemove, member.memberAssignments); - linking.unlinkItems(toRemove, lookup); - return deleteMember.call(this, member, callback).then(function(result) { - sdk.loadTeamFees(member.teamId); - sdk.loadStatisticAggregates(member.teamId); - return result; - }).fail(function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteContact', function(deleteContact) { - return function(contact, callback) { - var toRemove; - toRemove = []; - toRemove.push.apply(toRemove, contact.contactEmailAddresses); - toRemove.push.apply(toRemove, contact.contactPhoneNumbers); - linking.unlinkItems(toRemove, lookup); - return deleteContact.call(this, contact, callback).then(function(result) { - return sdk.loadMembers({ - memberId: contact.memberId - }).then(function() { - return result; - }); - }).fail(function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveMemberEmailAddress', function(saveMemberEmailAddress) { - return function(emailAddress, callback) { - return saveMemberEmailAddress.call(this, emailAddress, callback).then(function(result) { - return sdk.loadMembers({ - id: emailAddress.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteMemberEmailAddress', function(deleteMemberEmailAddress) { - return function(emailAddress, callback) { - return deleteMemberEmailAddress.call(this, emailAddress, callback).then(function(result) { - return sdk.loadMembers({ - id: emailAddress.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveMemberPhoneNumber', function(saveMemberPhoneNumber) { - return function(phoneNumber, callback) { - return saveMemberPhoneNumber.call(this, phoneNumber, callback).then(function(result) { - return sdk.loadMembers({ - id: phoneNumber.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteMemberPhoneNumber', function(deleteMemberPhoneNumber) { - return function(phoneNumber, callback) { - return deleteMemberPhoneNumber.call(this, phoneNumber, callback).then(function(result) { - return sdk.loadMembers({ - id: phoneNumber.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveContactEmailAddress', function(saveContactEmailAddress) { - return function(emailAddress, callback) { - return saveContactEmailAddress.call(this, emailAddress, callback).then(function(result) { - return sdk.loadMembers({ - id: emailAddress.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteContactEmailAddress', function(deleteContactEmailAddress) { - return function(emailAddress, callback) { - return deleteContactEmailAddress.call(this, emailAddress, callback).then(function(result) { - return sdk.loadMembers({ - id: emailAddress.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveContactPhoneNumber', function(saveContactPhoneNumber) { - return function(phoneNumber, callback) { - return saveContactPhoneNumber.call(this, phoneNumber, callback).then(function(result) { - return sdk.loadMembers({ - id: phoneNumber.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteContactPhoneNumber', function(deleteContactPhoneNumber) { - return function(phoneNumber, callback) { - return deleteContactPhoneNumber.call(this, phoneNumber, callback).then(function(result) { - return sdk.loadMembers({ - id: phoneNumber.memberId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapSave(sdk, 'saveEvent', function(event) { - var ids; - ids = Array.isArray(event) ? (event.map(function(event) { - return event.id; - })).join(',') : event.id; - return sdk.loadAvailabilities({ - eventId: ids - }); - }, function(event) { - var e, firstEvent, ref1, ref2, repeatingEventIds, toRemove; - if (event.isGame) { - return promises.when(sdk.loadTeamResults(event.teamId), sdk.loadOpponentResults(event.opponentId), sdk.loadEventStatistics({ - eventId: event.id - })); - } else if (Array.isArray(event)) { - repeatingEventIds = (function() { - var i, len, results; - results = []; - for (i = 0, len = event.length; i < len; i++) { - e = event[i]; - results.push(e.id); - } - return results; - })(); - firstEvent = event.shift(); - toRemove = []; - if ((ref1 = firstEvent.team) != null) { - if ((ref2 = ref1.events) != null) { - ref2.forEach(function(e) { - if (e.repeatingUuid === firstEvent.repeatingUuid) { - return toRemove.push(e); - } - }); - } - } - toRemove = toRemove.filter(function(e) { - var ref3; - return ref3 = e.id, indexOf.call(repeatingEventIds, ref3) < 0; - }); - return linking.unlinkItems(toRemove, lookup); - } - }); - wrapMethod(sdk, 'deleteEvent', function(deleteEvent) { - return function(event, include, notify, notifyAs, callback) { - var events, ref1, ref2, startDate, toRemove, uuid; - events = []; - if (typeof include === 'string' && include !== sdk.EVENTS.NONE) { - uuid = event.repeatingUuid; - startDate = event.startDate; - if ((ref1 = event.team) != null) { - if ((ref2 = ref1.events) != null) { - ref2.forEach(function(event) { - if (event.repeatingUuid === uuid) { - return events.push(event); - } - }); - } - } - if (include === sdk.EVENTS.FUTURE) { - events = events.filter(function(event) { - return event.startDate >= startDate; - }); - } - } else { - events.push(event); - } - toRemove = events.slice(); - events.forEach(function(event) { - toRemove.push.apply(toRemove, event.assignments); - toRemove.push.apply(toRemove, event.availabilities); - return toRemove.push.apply(toRemove, event.eventStatistics); - }); - event.assignments.forEach(function(assignment) { - if (assignment.memberAssignments.length) { - return assignment.memberAssignments.forEach(function(memberAssignment) { - return toRemove.push.apply(toRemove, memberAssignment); - }); - } - }); - linking.unlinkItems(toRemove, lookup); - return deleteEvent.call(this, event, include, notify, notifyAs, callback).then(function(result) { - if (event.isGame) { - return promises.when(sdk.loadTeamResults(event.teamId), sdk.loadOpponentResults(event.opponentId)).then(function() { - return result; - }); - } else { - return result; - } - }, function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapSave(sdk, 'saveTrackedItem', function(trackedItem) { - return sdk.loadTrackedItemStatuses({ - trackedItemId: trackedItem.id - }); - }); - wrapMethod(sdk, 'deleteTrackedItem', function(deleteTrackedItem) { - return function(trackedItem, callback) { - var toRemove; - toRemove = trackedItem.trackedItemStatuses.slice(); - linking.unlinkItems(toRemove, lookup); - return deleteTrackedItem.call(this, trackedItem).fail(function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteStatistic', function(deleteStatistic) { - return function(statistic, callback) { - var toRemove; - toRemove = statistic.statisticData.slice(); - toRemove.push.apply(toRemove, statistic.eventStatistics); - toRemove.push.apply(toRemove, statistic.memberStatistics); - toRemove.push.apply(toRemove, statistic.teamStatistics); - toRemove.push.apply(toRemove, statistic.statisticAggregates); - linking.unlinkItems(toRemove, lookup); - return deleteStatistic.call(this, statistic).then(function(result) { - var bulkLoadTypes, statisticId, teamId; - teamId = statistic.teamId; - statisticId = result.id; - bulkLoadTypes = ['memberStatistic', 'teamStatistic', 'statisticAggregate', 'eventStatistic']; - return sdk.bulkLoad(teamId, bulkLoadTypes).then(function() { - return result; - }); - }).fail(function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveStatistic', function(saveStatistic) { - return function(statistic, callback) { - if ((statistic.statisticGroupId == null) && (statistic.statisticGroup != null)) { - linking.unlinkItems(statistic.statisticGroup, statistic); - } - return saveStatistic.call(this, statistic, callback).then(function(result) { - var bulkLoadTypes, statisticId, teamId; - teamId = statistic.teamId; - statisticId = result.id; - bulkLoadTypes = ['memberStatistic', 'teamStatistic', 'statisticAggregate', 'statistic', 'statisticGroup', 'eventStatistic']; - return sdk.bulkLoad(teamId, bulkLoadTypes).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'bulkSaveStatisticData', function(bulkSaveStatisticData) { - return function(templates, callback) { - return bulkSaveStatisticData.call(this, templates, callback).then(function(result) { - var bulkLoadTypes, teamId; - if ((result[0] != null) && (result[0].teamId != null)) { - teamId = result[0].teamId; - bulkLoadTypes = ['memberStatistic', 'statisticAggregate', 'eventStatistic']; - return sdk.bulkLoad(teamId, bulkLoadTypes).then(function() { - return result; - }); - } - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveStatisticDatum', function(saveStatisticDatum) { - return function(statisticDatum, callback) { - return saveStatisticDatum.call(this, statisticDatum, callback).then(function(result) { - var bulkLoadTypes, statisticId, teamId; - teamId = result.teamId; - statisticId = result.statisticId; - bulkLoadTypes = ['memberStatistic', 'statisticAggregate', 'eventStatistic']; - return sdk.bulkLoad(teamId, bulkLoadTypes).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'bulkDeleteStatisticData', function(bulkDeleteStatisticData) { - return function(member, event, callback) { - var ref1, toRemove; - toRemove = []; - toRemove.push(event.eventStatistics); - if ((ref1 = member.statisticData) != null) { - ref1.forEach(function(statisticDatum) { - if (statisticDatum.event === event) { - return toRemove.push(statisticDatum); - } - }); - } - linking.unlinkItems(toRemove, lookup); - return bulkDeleteStatisticData.call(this, member, event).then(function(result) { - var bulkLoadTypes, teamId; - teamId = member.teamId; - bulkLoadTypes = ['memberStatistic', 'statisticAggregate', 'eventStatistic']; - return sdk.bulkLoad(teamId, bulkLoadTypes).then(function() { - return result; - }); - }).fail(function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveMemberPayment', function(saveMemberPayment) { - return function(memberPayment, callback) { - return saveMemberPayment.call(this, memberPayment).then(function(result) { - var memberId, teamFeeId; - memberId = result.memberId; - teamFeeId = result.teamFeeId; - return promises.when(sdk.loadMemberBalances({ - memberId: memberId - }), sdk.loadTeamFees({ - id: teamFeeId - }), sdk.loadPaymentNotes({ - memberPaymentId: memberPayment.id - })).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveTeamFee', function(saveTeamFee) { - return function(teamFee, callback) { - return saveTeamFee.call(this, teamFee).then(function(result) { - var teamId; - teamId = result.teamId; - return sdk.loadMemberBalances({ - teamId: teamId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteTeamFee', function(deleteTeamFee) { - return function(teamFee, callback) { - return deleteTeamFee.call(this, teamFee).then(function(result) { - var teamId; - teamId = teamFee.teamId; - return sdk.loadMemberBalances({ - teamId: teamId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'assignMediaToGroup', function(assignMediaToGroup) { - return function(teamMediumIds, teamMediaGroup, callback) { - return assignMediaToGroup.call(this, teamMediumIds, teamMediaGroup).then(function(result) { - var bulkLoadTypes, teamId; - teamId = result[0].teamId; - bulkLoadTypes = ['teamMediaGroup', 'teamMedium']; - return sdk.bulkLoad(teamId, bulkLoadTypes).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'setMediumAsTeamPhoto', function(setMediumAsTeamPhoto) { - return function(teamMedium, callback) { - return setMediumAsTeamPhoto.call(this, teamMedium).then(function(result) { - var teamId; - teamId = result.teamId; - return sdk.loadTeamPreferences(teamId).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'setMediumAsMemberPhoto', function(setMediumAsMemberPhoto) { - return function(teamMedium, member, callback) { - return setMediumAsMemberPhoto.call(this, teamMedium, member).then(function(result) { - if (member.id != null) { - return sdk.loadMembers({ - id: member.id - }).then(function() { - return result; - }); - } - }).callback(callback); - }; - }); - wrapMethod(sdk, 'uploadTeamMedium', function(uploadTeamMedium) { - return function(teamMedium, progressCallback, callback) { - return uploadTeamMedium.call(this, teamMedium, progressCallback).then(function(result) { - return promises.when(sdk.loadTeam(teamMedium.teamId), sdk.loadTeamMediaGroups({ - id: teamMedium.teamMediaGroupId - })).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveTeamMedium', function(saveTeamMedium) { - return function(teamMedium, callback) { - var ref1, teamMediaGroupIds; - teamMediaGroupIds = [teamMedium.teamMediaGroupId]; - if ((((ref1 = teamMedium._state) != null ? ref1.teamMediaGroupId : void 0) != null) !== teamMedium.teamMediaGroupId) { - teamMediaGroupIds.push(teamMedium._state.teamMediaGroupId); - } - return saveTeamMedium.call(this, teamMedium).then(function(result) { - var teamId; - teamId = teamMedium.teamId; - return sdk.loadTeamMediaGroups({ - id: teamMediaGroupIds - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveTeamVideoLink', function(saveTeamVideoLink) { - return function(teamMedium, callback) { - return saveTeamVideoLink.call(this, teamMedium).then(function(result) { - return sdk.loadTeamMediaGroups({ - id: teamMedium.teamMediaGroupId - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteTeamMedium', function(deleteTeamMedium) { - return function(teamMedium, callback) { - var toRemove; - toRemove = teamMedium.teamMediumComments.slice(); - linking.unlinkItems(toRemove, lookup); - return deleteTeamMedium.call(this, teamMedium).then(function(result) { - return promises.when(sdk.loadTeam(teamMedium.teamId), sdk.loadTeamMediaGroups({ - id: teamMedium.teamMediaGroupId - })).then(function() { - return result; - }); - }, function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'bulkDeleteTeamMedia', function(bulkDeleteTeamMedia) { - return function(teamMediumIds, teamId, callback) { - if (typeof teamId === 'function') { - callback = teamId; - } - return bulkDeleteTeamMedia.call(this, teamMediumIds, callback).then(function(result) { - if (typeof teamId === 'string' || typeof teamId === 'number') { - return promises.when(sdk.loadTeam(teamId), sdk.loadTeamMediaGroups({ - teamId: teamId - })).then(function() { - return result; - }); - } else { - return result; - } - }).callback(callback); - }; - }); - wrapMethod(sdk, 'reorderTeamMedia', function(reorderTeamMedia) { - return function(teamId, teamMediaIds, teamMediaGroupId, callback) { - var params; - params = { - teamId: teamId - }; - if (typeof teamMediaGroupId === 'function') { - callback = teamMediaGroupId; - } - if (typeof teamMediaGroupId === 'string' || typeof teamMediaGroupId === 'number') { - params = { - id: teamMediaGroupId - }; - } - return reorderTeamMedia.call(this, teamId, teamMediaIds).then(function(result) { - return sdk.loadTeamMediaGroups(params).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteTeam', function(deleteTeam) { - return function(team, callback) { - var toRemove; - toRemove = []; - team.links.each(function(rel) { - var value; - value = team[name]; - if (types.getType(rel) && rel !== 'sport' && rel !== 'plan') { - if (Array.isArray(value)) { - return toRemove.push.apply(toRemove, value); - } else { - return toRemove.push(value); - } - } - }); - return deleteTeam.call(this, team).then(function(result) { - linking.unlinkItems(toRemove, lookup); - return result; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteForumTopic', function(deleteForumTopic) { - return function(topic, callback) { - var toRemove; - toRemove = []; - toRemove.push.apply(toRemove, topic.forumPosts); - linking.unlinkItems(toRemove, lookup); - return deleteForumTopic.call(this, topic, callback).fail(function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'invite', function(invite) { - return function(options, callback) { - return invite.call(this, options).then(function(result) { - var contactId, memberId; - if (options.hasOwnProperty('memberId')) { - memberId = options.memberId; - return sdk.loadMemberEmailAddresses({ - memberId: memberId - }).then(function() { - return result; - }); - } else if (options.hasOwnProperty('contactId')) { - contactId = options.contactId; - return sdk.loadContactEmailAddresses({ - contactId: contactId - }).then(function() { - return result; - }); - } - }).callback(callback); - }; - }); - wrapMethod(sdk, 'memberPaymentTransaction', function(memberPaymentTransaction) { - return function(memberPaymentId, amount, note, callback) { - return memberPaymentTransaction.call(this, memberPaymentId, amount, note).then(function(result) { - var memberId, teamFeeId; - memberId = result.memberId; - teamFeeId = result.teamFeeId; - return promises.when(sdk.loadMemberBalances({ - memberId: memberId - }), sdk.loadTeamFees({ - id: teamFeeId - }), sdk.loadPaymentNotes({ - memberPaymentId: memberPaymentId - })).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'importMembersFromTeam', function(importMembersFromTeam) { - return function(memberIds, teamId, sendInvites, callback) { - return importMembersFromTeam.call(this, memberIds, teamId, sendInvites).then(function(result) { - memberIds = result.map(function(member) { - return member.id; - }); - return promises.when(sdk.loadMembers({ - id: memberIds - }), sdk.loadContacts({ - memberId: memberIds - }), sdk.loadMemberEmailAddresses({ - memberId: memberIds - }), sdk.loadContactEmailAddresses({ - memberId: memberIds - }), sdk.loadMemberPhoneNumbers({ - memberId: memberIds - }), sdk.loadContactPhoneNumbers({ - memberId: memberIds - })).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveBroadcastAlert', function(saveBroadcastAlert) { - return function(broadcastAlert, callback) { - return saveBroadcastAlert.call(this, broadcastAlert).then(function(result) { - var params; - if ((result.member != null) || (result.divisionMember != null)) { - params = { - memberId: result.memberId - }; - } else { - params = { - contactId: result.contactId - }; - } - sdk.loadMessageData(params); - return sdk.loadMessages({ - messageSourceId: result.id - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveBroadcastEmail', function(saveBroadcastEmail) { - return function(broadcastEmail, callback) { - return saveBroadcastEmail.call(this, broadcastEmail).then(function(result) { - var params; - if ((result.member != null) || (result.divisionMember != null)) { - params = { - memberId: result.memberId - }; - } else { - params = { - contactId: result.contactId - }; - } - sdk.loadMessageData(params); - return sdk.loadMessages({ - messageSourceId: result.id - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveAssignment', function(saveAssignment) { - return function(assignment, callback) { - return saveAssignment.call(this, assignment, callback).then(function(result) { - return sdk.loadMemberAssignments({ - assignmentId: result.id - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteAssignment', function(deleteAssignment) { - return function(assignment, callback) { - var toRemove; - if (assignment.memberAssignments.length) { - toRemove = assignment.memberAssignments; - linking.unlinkItems(toRemove, lookup); - } - return deleteAssignment.call(this, assignment).then(function(result) { - return sdk.loadEvents({ - eventId: assignment.eventId - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'saveMemberAssignment', function(saveMemberAssignment) { - return function(memberAssignment, callback) { - return saveMemberAssignment.call(this, memberAssignment).then(function(result) { - return sdk.loadAssignments({ - id: result.assignmentId - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'deleteMemberAssignment', function(deleteMemberAssignment) { - return function(memberAssignment, callback) { - return deleteMemberAssignment.call(this, memberAssignment, callback).then(function(result) { - return sdk.loadAssignments({ - id: memberAssignment.assignmentId - }).then(function(assignment) { - assignment[0].member = null; - return result; - }); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'markMessageAsRead', function(markMessageAsRead) { - return function(messageId, callback) { - return markMessageAsRead.call(this, messageId, callback).then(function(result) { - var params; - if ((result.member != null) || (result.divisionMember != null)) { - params = { - memberId: result.memberId - }; - } else { - params = { - contactId: result.contactId - }; - } - params.messageType = 'alert,email'; - sdk.loadMessages({ - id: result.messageId - }); - return sdk.loadMessageData(params); - }).callback(callback); - }; - }); - wrapMethod(sdk, 'bulkDeleteMessages', function(bulkDeleteMessages) { - return function(messages, callback) { - var contactId, memberId, teamId, toRemove; - if (Array.isArray(messages) && messages.length && this.isItem(messages[0], 'message')) { - toRemove = messages; - } else if (typeof messages === 'object' && this.isItem(messages, 'message')) { - toRemove = [messages]; - } - if (toRemove != null) { - if (toRemove[0].contactId != null) { - contactId = toRemove[0].contactId; - } else if (toRemove[0].memberId != null) { - memberId = toRemove[0].memberId; - } - teamId = toRemove[0].teamId; - linking.unlinkItems(toRemove, lookup); - } - return bulkDeleteMessages.call(this, messages).then(function(result) { - var params; - if (toRemove != null) { - params = {}; - if (contactId != null) { - params.contactId = contactId; - } else if (memberId != null) { - params.memberId = memberId; - } - params.messageType = 'alert,email'; - params.teamId = teamId; - return sdk.loadMessageData(params).then(function(result) { - return result; - }).fail(function(err) { - return err; - }); - } else { - return result; - } - }).fail(function(err) { - if (toRemove != null) { - linking.linkItems(toRemove, lookup); - } - return err; - }).callback(callback); - }; - }); - wrapMethod(sdk, 'createBulkAssignments', function(createBulkAssignments) { - return function(eventSet, description, teamId, createAsMemberId, callback) { - return createBulkAssignments.call(this, eventSet, description, teamId, createAsMemberId, callback).then(function(result) { - var assignmentIds; - assignmentIds = result.map(function(assignment) { - return assignment.id; - }); - return sdk.loadAssignments({ - id: assignmentIds - }).then(function() { - return result; - }); - }).callback(callback); - }; - }); - return wrapMethod(sdk, 'bulkDeleteMembers', function(bulkDeleteMembers) { - return function(members, callback) { - var toRemove; - toRemove = []; - members.forEach(function(member) { - toRemove.push.apply(toRemove, member.assignments); - toRemove.push.apply(toRemove, member.availabilities); - member.contacts.forEach(function(contact) { - toRemove.push.apply(toRemove, contact.contactEmailAddresses); - toRemove.push.apply(toRemove, contact.contactPhoneNumbers); - return toRemove.push(contact); - }); - toRemove.push.apply(toRemove, member.trackedItemStatuses); - toRemove.push.apply(toRemove, member.memberPayments); - toRemove.push.apply(toRemove, member.memberStatistics); - toRemove.push.apply(toRemove, member.statisticData); - return toRemove.push.apply(toRemove, member.memberAssignments); - }); - linking.unlinkItems(toRemove, lookup); - return bulkDeleteMembers.call(this, members, callback).then(function(result) { - return result; - }).fail(function(err) { - linking.linkItems(toRemove, lookup); - return err; - }).callback(callback); - }; - }); -}; - -revertSDK = function(sdk) { - revertWrapMethod(sdk, 'saveMember'); - revertWrapMethod(sdk, 'deleteMember'); - revertWrapMethod(sdk, 'deleteContact'); - revertWrapMethod(sdk, 'saveEvent'); - revertWrapMethod(sdk, 'deleteEvent'); - revertWrapMethod(sdk, 'saveTrackedItem'); - revertWrapMethod(sdk, 'deleteTrackedItem'); - return revertWrapMethod(sdk, 'deleteTeam'); -}; - -wrapMethod = function(obj, methodName, newMethodProvider) { - var oldMethod; - oldMethod = obj[methodName]; - obj[methodName] = newMethodProvider(oldMethod); - obj[methodName].oldMethod = oldMethod; - return obj; -}; - -revertWrapMethod = function(obj, methodName) { - var oldMethod; - oldMethod = obj[methodName].oldMethod; - return obj[methodName] = oldMethod; -}; - -wrapSave = function(sdk, saveMethodName, onSaveNew, onSaveEdit) { - return wrapMethod(sdk, saveMethodName, function(save) { - return function(item, callback) { - var savedItem; - if (item.id && onSaveEdit) { - savedItem = null; - return save.call(this, item).then(function(item) { - return savedItem = item; - }).then(onSaveEdit).then(function() { - return savedItem; - }).callback(callback); - } else if (!item.id && onSaveNew) { - savedItem = null; - return save.call(this, item).then(function(item) { - return savedItem = item; - }).then(onSaveNew).then(function() { - return savedItem; - }).callback(callback); - } else { - return save.call(this, item, callback); - } - }; - }); -}; - -copy = function(from, to) { - Object.keys(from).forEach(function(key) { - if (typeof value === 'function' || key.charAt(0) === '_') { - return; - } - return to[key] = from[key]; - }); - return to; -}; - -camelize = function(str) { - return str.replace(/[-_]+(\w)/g, function(_, char) { - return char.toUpperCase(); - }); -}; - -}); - -require.register("promises.coffee", function(exports, require, module) { -var Deferred, Promise, args, promises, - bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - slice = [].slice, - hasProp = {}.hasOwnProperty; - -promises = typeof exports !== 'undefined' ? exports : this; - -Promise = (function() { - function Promise() { - this.call = bind(this.call, this); - } - - Promise.prototype.then = function(resolvedHandler, rejectedHandler, progressHandler, cancelHandler) { - throw new TypeError('The Promise base class is abstract, this function is overwritten by the promise\'s deferred object'); - }; - - Promise.prototype.callback = function(callback) { - if (callback && typeof callback === 'function') { - this.then(function() { - var results; - results = 1 <= arguments.length ? slice.call(arguments, 0) : []; - return callback.apply(null, [null].concat(slice.call(results))); - }, function(err) { - return callback(err); - }); - } - return this; - }; - - Promise.prototype.resolved = function(handler) { - return this.then(handler); - }; - - Promise.prototype.done = function(handler) { - return this.then(handler); - }; - - Promise.prototype.rejected = function(handler) { - return this.then(null, handler); - }; - - Promise.prototype.fail = function(handler) { - return this.then(null, handler); - }; - - Promise.prototype.always = function(handler) { - var rejectedHandler, resolvedHandler; - resolvedHandler = function(res) { - return handler(null, res); - }; - rejectedHandler = function(err) { - return handler(err); - }; - return this.then(resolvedHandler, rejectedHandler); - }; - - Promise.prototype.progress = function(handler) { - return this.then(null, null, handler); - }; - - Promise.prototype.canceled = function(handler) { - return this.then(null, null, null, handler); - }; - - Promise.prototype.apply = function(handler, context) { - return this.then(function(result) { - if ((result instanceof Array)(handler.apply(context || this, result))) { - - } else { - return handler.call(context || this, result); - } - }); - }; - - Promise.prototype.cancel = function() { - throw new TypeError('The Promise base class is abstract, this function is overwritten by the promise\'s deferred object'); - }; - - Promise.prototype.get = function(propertyName) { - return this.then(function(object) { - return object != null ? object[propertyName] : void 0; - }); - }; - - Promise.prototype.set = function(propertyName, value) { - return this.then(function(object) { - if (object != null) { - object[propertyName] = value; - } - return object; - }); - }; - - Promise.prototype.put = function(propertyName, value) { - return this.then(function(object) { - return object != null ? object[propertyName] = value : void 0; - }); - }; - - Promise.prototype.run = function() { - var functionName, params; - functionName = arguments[0], params = 2 <= arguments.length ? slice.call(arguments, 1) : []; - return this.then(function(object) { - if (object != null) { - object[functionName].apply(object, params); - } - return object; - }); - }; - - Promise.prototype.call = function() { - var functionName, params; - functionName = arguments[0], params = 2 <= arguments.length ? slice.call(arguments, 1) : []; - return this.then(function(object) { - return object[functionName].apply(object, params); - }); - }; - - return Promise; - -})(); - -['pop', 'shift', 'splice', 'filter', 'every', 'map', 'some'].forEach(function(method) { - return Promise.prototype[method] = function() { - var args; - args = 1 <= arguments.length ? slice.call(arguments, 0) : []; - return this.then(function(object) { - return object != null ? typeof object[method] === "function" ? object[method].apply(object, args) : void 0 : void 0; - }); - }; -}); - -['push', 'reverse', 'sort', 'unshift', 'forEach'].forEach(function(method) { - return Promise.prototype[method] = function() { - var args; - args = 1 <= arguments.length ? slice.call(arguments, 0) : []; - return this.then(function(object) { - if (object instanceof Array) { - object[method].apply(object, args); - } - return object; - }); - }; -}); - -Promise.extend = function(methods) { - var SubPromise, name, value; - SubPromise = function() {}; - SubPromise.extend = this.extend; - SubPromise.prototype = new this(); - if (methods) { - for (name in methods) { - if (!hasProp.call(methods, name)) continue; - value = methods[name]; - SubPromise.prototype[name] = value; - } - } - return SubPromise; -}; - -promises.when = function() { - var alwaysCallback, count, createCallback, deferred, i, len, name, obj, params, rejected, rejectedCallback, resolvedCallback; - params = 1 <= arguments.length ? slice.call(arguments, 0) : []; - deferred = promises.defer(); - count = params.length; - rejected = false; - resolvedCallback = function() {}; - rejectedCallback = function(value) { - rejected = true; - return value; - }; - createCallback = function(index) { - return function() { - var results; - results = 1 <= arguments.length ? slice.call(arguments, 0) : []; - params[index] = results.length > 1 ? results : results[0]; - if (--count === 0) { - if (rejected) { - return deferred.reject.apply(deferred, params); - } else { - return deferred.resolve.apply(deferred, params); - } - } - }; - }; - for (name = i = 0, len = params.length; i < len; name = ++i) { - obj = params[name]; - if (obj && typeof obj.then === 'function') { - alwaysCallback = createCallback(name); - obj.then(resolvedCallback, rejectedCallback); - obj.then(alwaysCallback, alwaysCallback); - } else { - --count; - } - } - if (count === 0) { - deferred.resolve.apply(deferred, params); - } - return deferred.promise; -}; - -args = function() { - var params; - params = 1 <= arguments.length ? slice.call(arguments, 0) : []; - params.isArgs = true; - return params; -}; - -Deferred = (function() { - function Deferred(promise) { - if (promise == null) { - promise = new promises.Promise; - } - this.progress = bind(this.progress, this); - this.cancel = bind(this.cancel, this); - this.reject = bind(this.reject, this); - this.resolve = bind(this.resolve, this); - this.finished = bind(this.finished, this); - this.then = bind(this.then, this); - this.promise = promise; - this.status = 'pending'; - this.progressHandlers = []; - this.handlers = []; - promise.then = this.then; - promise.cancel = this.cancel; - promise.getStatus = (function(_this) { - return function() { - return _this.status; - }; - })(this); - } - - Deferred.prototype.then = function(resolvedHandler, rejectedHandler, progressHandler, canceledHandler) { - var deferred, handler, i, len, method, nextDeferred, nextResult; - for (i = 0, len = arguments.length; i < len; i++) { - handler = arguments[i]; - if ((handler != null) && typeof handler !== 'function') { - throw new Error('Promise handlers must be functions'); - } - } - if (progressHandler) { - this.progressHandlers.push(progressHandler); - } - nextDeferred = promises.defer(); - nextDeferred.promise.prev = this.promise; - this._addHandler(resolvedHandler, rejectedHandler, canceledHandler).nextDeferred = nextDeferred; - if (this.finished()) { - handler = this.handlers.pop(); - method = handler[this.status]; - deferred = handler.nextDeferred; - if (!method) { - deferred[this.status].apply(deferred, this.results); - } else { - nextResult = method.apply(null, this.results); - if (nextResult && typeof nextResult.then === 'function') { - nextResult.then(deferred.resolve, deferred.reject); - } else { - deferred[this.status](nextResult); - } - } - } - return nextDeferred.promise; - }; - - Deferred.prototype.finished = function() { - return this.status !== 'pending'; - }; - - Deferred.prototype.resolve = function() { - var deferred, handler, method, nextResult, ref, results; - results = 1 <= arguments.length ? slice.call(arguments, 0) : []; - if (this.status !== 'pending') { - return; - } - if ((ref = results[0]) != null ? ref.isArgs : void 0) { - results = results[0]; - } - clearTimeout(this._timeout); - this.status = 'resolve'; - this.results = results; - while ((handler = this.handlers.shift())) { - method = handler[this.status]; - deferred = handler.nextDeferred; - if (!method) { - deferred[this.status].apply(deferred, this.results); - } else { - nextResult = method.apply(null, this.results); - if (nextResult && typeof nextResult.then === 'function') { - nextResult.then(deferred.resolve, deferred.reject); - } else { - deferred[this.status](nextResult); - } - } - } - }; - - Deferred.prototype.reject = function() { - var deferred, handler, method, nextResult, ref, results; - results = 1 <= arguments.length ? slice.call(arguments, 0) : []; - if (this.status !== 'pending') { - return; - } - if ((ref = results[0]) != null ? ref.isArgs : void 0) { - results = results[0]; - } - clearTimeout(this._timeout); - this.status = 'reject'; - this.results = results; - while ((handler = this.handlers.shift())) { - method = handler[this.status]; - deferred = handler.nextDeferred; - if (!method) { - deferred[this.status].apply(deferred, this.results); - } else { - nextResult = method.apply(null, this.results); - if (nextResult && typeof nextResult.then === 'function') { - nextResult.then(deferred.resolve, deferred.reject); - } else { - deferred[this.status](nextResult); - } - } - } - }; - - Deferred.prototype.cancel = function() { - var deferred, handler, method, nextResult, ref, ref1, results; - results = 1 <= arguments.length ? slice.call(arguments, 0) : []; - if (this.status !== 'pending') { - return; - } - if ((ref = results[0]) != null ? ref.isArgs : void 0) { - results = results[0]; - } - clearTimeout(this._timeout); - this.status = 'cancel'; - this.results = results; - while ((handler = this.handlers.shift())) { - method = handler[this.status]; - deferred = handler.nextDeferred; - if (!method) { - deferred[this.status].apply(deferred, this.results); - } else { - nextResult = method.apply(null, this.results); - if (nextResult && typeof nextResult.then === 'function') { - nextResult.then(deferred.resolve, deferred.reject); - } else { - deferred[this.status](nextResult); - } - } - } - if ((ref1 = this.promise.prev) != null) { - ref1.cancel(); - } - }; - - Deferred.prototype.progress = function() { - var i, len, params, progress, ref, results1; - params = 1 <= arguments.length ? slice.call(arguments, 0) : []; - ref = this.progressHandlers; - results1 = []; - for (i = 0, len = ref.length; i < len; i++) { - progress = ref[i]; - results1.push(progress.apply(null, params)); - } - return results1; - }; - - Deferred.prototype.timeout = function(milliseconds, error) { - clearTimeout(this._timeout); - return this._timeout = setTimeout((function(_this) { - return function() { - return _this.reject(error != null ? error : new Error('Operation timed out')); - }; - })(this), milliseconds); - }; - - Deferred.prototype.reset = function() { - this.status = 'pending'; - this.progressHandlers = []; - return this.handlers = []; - }; - - Deferred.prototype._addHandler = function(resolvedHandler, rejectedHandler, canceledHandler) { - var handler; - handler = { - resolve: resolvedHandler, - reject: rejectedHandler, - cancel: canceledHandler - }; - this.handlers.push(handler); - return handler; - }; - - return Deferred; - -})(); - -promises.Deferred = Deferred; - -promises.Promise = Promise; - -promises.args = args; - -promises.defer = function(promise) { - return new promises.Deferred(promise); -}; - -promises.wrap = function(method, PromiseClass) { - return function() { - var args, callback, deferred, promise; - args = 1 <= arguments.length ? slice.call(arguments, 0) : []; - promise = PromiseClass ? new PromiseClass() : void 0; - deferred = promises.defer(promise); - if (typeof args[args.length - 1] === 'function') { - callback = args.pop(); - } - args.push(function(err, result) { - var extras; - extras = Array.prototype.slice.call(arguments, 2); - if (callback) { - callback.apply(null, [err, result].concat(slice.call(extras))); - } - if (err) { - return deferred.reject(err); - } else { - return deferred.resolve.apply(deferred, [result].concat(slice.call(extras))); - } - }); - method.apply(this, args); - return deferred.promise; - }; -}; - -promises.resolve = function() { - var args, deferred; - args = 1 <= arguments.length ? slice.call(arguments, 0) : []; - deferred = promises.defer(); - deferred.resolve.apply(deferred, args); - return deferred.promise; -}; - -promises.reject = function() { - var args, deferred; - args = 1 <= arguments.length ? slice.call(arguments, 0) : []; - deferred = promises.defer(); - deferred.reject.apply(deferred, args); - return deferred.promise; -}; - -}); - -require.register("request.coffee", function(exports, require, module) { -var FormData, RequestError, createRequest, promises, sendRequest, unloading, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - -if (typeof XMLHttpRequest === 'undefined') { - global.XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; -} - -FormData = global.FormData || function() {}; - -promises = require('./promises'); - -sendRequest = function(method, url, data, hooks, callback) { - var deferred, hook, i, key, len, query, value, xhr; - if (data && method.toUpperCase() === 'GET') { - query = []; - for (key in data) { - value = data[key]; - query.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - } - if (query.length) { - url += url.indexOf('?') === -1 ? '?' : '&'; - url += query.join('&'); - } - } else if (typeof data === 'object' && !(data instanceof FormData)) { - data = JSON.stringify(data); - } - xhr = new XMLHttpRequest(); - xhr.open(method.toUpperCase(), url); - if (hooks) { - for (i = 0, len = hooks.length; i < len; i++) { - hook = hooks[i]; - hook(xhr, data); - } - } - deferred = promises.defer(); - xhr.onreadystatechange = function() { - var errorMsg, ref, ref1, ref2; - switch (xhr.readyState) { - case 3: - return deferred.progress(xhr); - case 4: - try { - xhr.data = JSON.parse(xhr.responseText); - } catch (error) { - xhr.data = null; - } - if (xhr.status >= 400) { - errorMsg = ((ref = xhr.data) != null ? (ref1 = ref.collection) != null ? (ref2 = ref1.error) != null ? ref2.message : void 0 : void 0 : void 0) || ''; - } - if (xhr.status === 0) { - if (unloading) { - return promises.defer().promise; - } - return deferred.reject(new RequestError(RequestError.CONNECTION_ERROR, 'Could not connect to the server'), xhr, errorMsg); - } else if (xhr.status >= 500) { - if (global.console) { - console.error("TeamSnap API error: " + errorMsg); - } - return deferred.reject(new RequestError(RequestError.SERVER_ERROR, 'Error with the server'), xhr, errorMsg); - } else if (xhr.status > 400) { - return deferred.reject(new RequestError(RequestError.CLIENT_ERROR, 'There was an error with the request'), xhr, errorMsg); - } else if (xhr.status === 400) { - return deferred.reject(new RequestError(RequestError.VALIDATION_ERROR, errorMsg || 'The data was invalid'), xhr); - } else { - return deferred.resolve(xhr); - } - } - }; - xhr.send(data || null); - return deferred.promise.callback(callback); -}; - -createRequest = function(hooks) { - var request; - if (hooks == null) { - hooks = []; - } - request = function(method, url, data, callback) { - if (typeof data === 'function') { - callback = data; - data = null; - } - return sendRequest(method, url, data, hooks, callback); - }; - request.get = function(url, params, callback) { - return request('get', url, params, callback); - }; - request.post = function(url, params, callback) { - return request('post', url, params, callback); - }; - request.put = function(url, params, callback) { - return request('put', url, params, callback); - }; - request["delete"] = function(url, params, callback) { - return request('delete', url, params, callback); - }; - request.create = function() { - return createRequest(); - }; - request.clone = function() { - return createRequest(hooks.slice()); - }; - request.reset = function() { - hooks = []; - return this; - }; - request.hook = function(hook) { - hooks.push(hook); - return this; - }; - request.removeHook = function(hook) { - var index; - index = hooks.indexOf(hook); - if (index !== -1) { - hooks.splice(index, 1); - } - return this; - }; - return request; -}; - -module.exports = createRequest(); - -RequestError = (function(superClass) { - extend(RequestError, superClass); - - RequestError.CONNECTION_ERROR = 1; - - RequestError.SERVER_ERROR = 2; - - RequestError.CLIENT_ERROR = 3; - - RequestError.VALIDATION_ERROR = 4; - - function RequestError(code, message) { - this.code = code; - this.message = message; - RequestError.__super__.constructor.call(this); - this.name = 'RequestError'; - } - - return RequestError; - -})(Error); - -if (typeof window !== 'undefined') { - unloading = false; - window.addEventListener('beforeunload', function() { - unloading = true; - }); -} - -}); - -;require.register("sdk.coffee", function(exports, require, module) { -var Item, ScopedCollection, TeamSnap, add, linking, loadCollections, mergeDefaults, promises, ref, urlExp, - hasProp = {}.hasOwnProperty; - -TeamSnap = require('./teamsnap').TeamSnap; - -promises = require('./promises'); - -loadCollections = require('./loadCollections'); - -ref = require('./model'), Item = ref.Item, ScopedCollection = ref.ScopedCollection; - -urlExp = /^https?:\/\//; - -TeamSnap.prototype.loadCollections = function(cachedCollections, callback) { - if (typeof cachedCollections === 'function') { - callback = cachedCollections; - cachedCollections = null; - } - return loadCollections(this.request, cachedCollections).then((function(_this) { - return function(colls) { - var ref1, ref2, ref3, ref4; - _this.collections = {}; - Object.keys(colls).forEach(function(name) { - return _this.collections[name] = new ScopedCollection(_this.request, colls[name]); - }); - _this.apiVersion = colls.root.version; - _this.plans = Item.fromArray(_this.request, ((ref1 = colls.plans.items) != null ? ref1.slice() : void 0) || []); - _this.smsGateways = Item.fromArray(_this.request, ((ref2 = colls.smsGateways.items) != null ? ref2.slice() : void 0) || []); - _this.sports = Item.fromArray(_this.request, ((ref3 = colls.sports.items) != null ? ref3.slice() : void 0) || []); - _this.timeZones = Item.fromArray(_this.request, ((ref4 = colls.timeZones.items) != null ? ref4.slice() : void 0) || []); - return _this; - }; - })(this)).callback(callback); -}; - -TeamSnap.prototype.reloadCollections = function(callback) { - loadCollections.clear(); - return this.loadCollections(callback); -}; - -TeamSnap.prototype.loadItems = function(type, params, callback) { - var collection; - if (!this.hasType(type)) { - throw new TSArgsError('teamsnap.load*', 'must provide a valid `type`'); - } - collection = this.getCollectionForItem(type); - return collection.queryItems('search', params, callback); -}; - -TeamSnap.prototype.loadItem = function(type, params, callback) { - var collection; - if (!this.hasType(type)) { - throw new TSArgsError('teamsnap.load*', 'must provide a valid `type`'); - } - collection = this.getCollectionForItem(type); - return collection.queryItem('search', params, callback); -}; - -TeamSnap.prototype.createItem = function(properties, defaults) { - var collection; - if (!properties) { - properties = defaults; - defaults = null; - } - if (defaults) { - properties = mergeDefaults(properties, defaults); - } - if (!this.isItem(properties)) { - throw new TSArgsError('teamsnap.create*', 'must include a valid `type`'); - } - if (!properties.links) { - collection = this.getCollectionForItem(properties.type); - properties.links = collection.links.cloneEmpty(); - } - return Item.create(this.request, properties); -}; - -TeamSnap.prototype.saveItem = function(item, callback) { - var collection; - if (!this.isItem(item)) { - throw new TSArgsError('teamsnap.save*', 'must include a valid `type`'); - } - collection = this.getCollectionForItem(item); - return collection.save(item, callback); -}; - -TeamSnap.prototype.deleteItem = function(item, params, callback) { - if (typeof item === 'string' && urlExp.test(item)) { - item = { - href: item - }; - } - if (!(typeof (item != null ? item.href : void 0) === 'string' && urlExp.test(item.href))) { - throw new TSArgsError('teamsnap.delete*', 'item must have a valid href to delete'); - } - if (!(item instanceof Item)) { - item = Item.create(this.request, item); - } - return item["delete"](params, callback); -}; - -TeamSnap.prototype.copyItem = function(item) { - var collection; - collection = this.getCollectionForItem(item); - return item.copy(collection.template); -}; - -TeamSnap.prototype.getNameSort = function() { - return function(itemA, itemB) { - var valueA, valueB; - if (itemA.type !== itemB.type) { - valueA = itemA.type; - valueB = itemB.type; - } else if (typeof itemA.name === 'string' && typeof itemB.name === 'string') { - valueA = itemA.name.toLowerCase(); - valueB = itemB.name.toLowerCase(); - } else { - if (itemA.createdAt && itemB.createdAt) { - valueA = itemA.createdAt; - valueB = itemB.createdAt; - } else { - valueA = itemA.id; - valueB = itemB.id; - } - } - if (typeof (valueA != null ? valueA.localeCompare : void 0) === 'function') { - return valueA.localeCompare(valueB); - } else { - if (valueA === valueB) { - return 0; - } else if (!valueA && valueB) { - return 1; - } else if (valueA && !valueB) { - return -1; - } else if (valueA > valueB) { - return 1; - } else if (valueA < valueB) { - return -1; - } else { - return 0; - } - } - }; -}; - -TeamSnap.prototype.getDefaultSort = function() { - return function(itemA, itemB) { - var valueA, valueB; - if (itemA.type !== itemB.type) { - valueA = itemA.type; - valueB = itemB.type; - } else { - if (itemA.createdAt && itemB.createdAt) { - valueA = itemA.createdAt; - valueB = itemB.createdAt; - } else { - valueA = itemA.id; - valueB = itemB.id; - } - } - if (typeof (valueA != null ? valueA.localeCompare : void 0) === 'function') { - return valueA.localeCompare(valueB); - } else { - if (valueA === valueB) { - return 0; - } else if (!valueA && valueB) { - return 1; - } else if (valueA && !valueB) { - return -1; - } else if (valueA > valueB) { - return 1; - } else if (valueA < valueB) { - return -1; - } else { - return 0; - } - } - }; -}; - -TeamSnap.prototype.getCollectionForItem = function(item) { - var collectionName, type; - if (!this.collections) { - throw new TSError('You must auth() and loadCollections() before using any load*, save*, create*, or delete* methods.'); - } - type = typeof item === 'string' ? item : item.type; - collectionName = this.getPluralType(type); - return this.collections[collectionName]; -}; - -TeamSnap.prototype.isId = function(value) { - return typeof value === 'string' || typeof value === 'number'; -}; - -TeamSnap.prototype.isItem = function(value, type) { - return this.hasType(value != null ? value.type : void 0) && (!type || value.type === type); -}; - -TeamSnap.prototype.reject = function(msg, field, callback) { - return promises.reject(new TSValidationError(msg, field)).callback(callback); -}; - -add = function(module) { - var key, results, value; - results = []; - for (key in module) { - value = module[key]; - results.push(TeamSnap.prototype[key] = value); - } - return results; -}; - -add(require('./types')); - -linking = require('./linking'); - -TeamSnap.prototype.linkItems = linking.linkItems; - -TeamSnap.prototype.unlinkItems = linking.unlinkItems; - -add(require('./persistence')); - -add(require('./collections/teams')); - -add(require('./collections/assignments')); - -add(require('./collections/availabilities')); - -add(require('./collections/broadcastAlerts')); - -add(require('./collections/broadcastEmails')); - -add(require('./collections/broadcastEmailAttachments')); - -add(require('./collections/contactEmailAddresses')); - -add(require('./collections/contactPhoneNumbers')); - -add(require('./collections/contacts')); - -add(require('./collections/customData')); - -add(require('./collections/customFields')); - -add(require('./collections/leagueCustomData')); - -add(require('./collections/leagueCustomFields')); - -add(require('./collections/divisionEvents')); - -add(require('./collections/divisionLocations')); - -add(require('./collections/divisionMembers')); - -add(require('./collections/divisionMembersPreferences')); - -add(require('./collections/divisionTeamStandings')); - -add(require('./collections/divisions')); - -add(require('./collections/divisionsPreferences')); - -add(require('./collections/events')); - -add(require('./collections/eventStatistics')); - -add(require('./collections/facebookPages')); - -add(require('./collections/forumPosts')); - -add(require('./collections/forumSubscriptions')); - -add(require('./collections/forumTopics')); - -add(require('./collections/leagueRegistrantDocuments')); - -add(require('./collections/locations')); - -add(require('./collections/memberAssignments')); - -add(require('./collections/memberBalances')); - -add(require('./collections/memberEmailAddresses')); - -add(require('./collections/memberFiles')); - -add(require('./collections/memberLinks')); - -add(require('./collections/memberPayments')); - -add(require('./collections/memberPhoneNumbers')); - -add(require('./collections/memberPhotos')); - -add(require('./collections/membersPreferences')); - -add(require('./collections/memberStatistics')); - -add(require('./collections/memberRegistrationSignups')); - -add(require('./collections/members')); - -add(require('./collections/messageData')); - -add(require('./collections/messages')); - -add(require('./collections/opponents')); - -add(require('./collections/opponentsResults')); - -add(require('./collections/paymentNotes')); - -add(require('./collections/plans')); - -add(require('./collections/sponsors')); - -add(require('./collections/sports')); - -add(require('./collections/registrationForms')); - -add(require('./collections/statisticAggregates')); - -add(require('./collections/statistics')); - -add(require('./collections/statisticData')); - -add(require('./collections/statisticGroups')); - -add(require('./collections/teamFees')); - -add(require('./collections/teamMedia')); - -add(require('./collections/teamMediumComments')); - -add(require('./collections/teamMediaGroups')); - -add(require('./collections/teamPublicSites')); - -add(require('./collections/teamsPaypalPreferences')); - -add(require('./collections/teamPhotos')); - -add(require('./collections/teamsPreferences')); - -add(require('./collections/teamsResults')); - -add(require('./collections/teamStatistics')); - -add(require('./collections/trackedItems')); - -add(require('./collections/trackedItemStatuses')); - -add(require('./collections/users')); - -mergeDefaults = function(properties, defaults) { - var key, obj, value; - obj = {}; - for (key in properties) { - if (!hasProp.call(properties, key)) continue; - value = properties[key]; - if (!(typeof value === 'function' || key.charAt(0) === '_')) { - obj[key] = value; - } - } - for (key in defaults) { - if (!hasProp.call(defaults, key)) continue; - value = defaults[key]; - if (!(typeof value === 'function' || properties.hasOwnProperty(key))) { - obj[key] = value; - } - } - return obj; -}; - -}); - -require.register("teamsnap.coffee", function(exports, require, module) { -var Collection, Item, TeamSnap, promises, ref; - -promises = require('./promises'); - -ref = require('./model'), Collection = ref.Collection, Item = ref.Item; - -require('./errors'); - -TeamSnap = (function() { - TeamSnap.prototype.version = '1.24.0'; - - TeamSnap.prototype.promises = promises; - - TeamSnap.prototype.when = promises.when; - - TeamSnap.prototype.TeamSnap = TeamSnap; - - TeamSnap.prototype.Collection = Collection; - - TeamSnap.prototype.Item = Item; - - function TeamSnap(apiUrl, authUrl) { - this.apiUrl = apiUrl != null ? apiUrl : 'https://apiv3.teamsnap.com'; - this.authUrl = authUrl != null ? authUrl : 'https://auth.teamsnap.com'; - } - - return TeamSnap; - -})(); - -module.exports = new TeamSnap(); - -require('./auth'); - -require('./sdk'); - -if (!String.prototype.trim) { - String.prototype.trim = function() { - return this.replace(/^\s+|\s+$/g, ''); - }; -} - -}); - -;require.register("types.coffee", function(exports, require, module) { -var i, len, plural, pluralLookup, singularLookup, teamTypes, teamsnap, type, typeLookup, types; - -teamsnap = exports; - -types = ['user', 'assignment', 'availability', 'broadcastAlert', 'broadcastEmail', 'broadcastEmailAttachment', 'contact', 'contactEmailAddress', 'contactPhoneNumber', 'customDatum', 'customField', 'leagueCustomDatum', 'leagueCustomField', 'divisionContact', 'divisionContactEmailAddress', 'divisionContactPhoneNumber', 'divisionEvent', 'divisionLocation', 'divisionMember', 'divisionMemberEmailAddress', 'divisionMemberPhoneNumber', 'divisionMemberPreferences', 'divisionTeamStanding', 'divisionPreferences', 'division', 'event', 'eventStatistic', 'facebookPage', 'forumPost', 'forumSubscription', 'forumTopic', 'leagueRegistrantDocument', 'location', 'member', 'memberAssignment', 'memberBalance', 'memberEmailAddress', 'memberFile', 'memberLink', 'memberPayment', 'memberPhoneNumber', 'memberPhoto', 'memberPreferences', 'memberStatistic', 'memberRegistrationSignup', 'message', 'messageDatum', 'opponent', 'opponentResults', 'paymentNote', 'plan', 'registrationForm', 'smsGateway', 'sponsor', 'statistic', 'statisticAggregate', 'statisticDatum', 'statisticGroup', 'sport', 'team', 'teamFee', 'teamMedium', 'teamMediumComment', 'teamMediaGroup', 'teamPaypalPreferences', 'teamPhoto', 'teamPreferences', 'teamPublicSite', 'teamResults', 'teamStatistic', 'timeZone', 'trackedItem', 'trackedItemStatus']; - -teamTypes = types.slice(); - -teamTypes.remove = function(type) { - var index; - index = this.indexOf(type); - if (index !== -1) { - this.splice(index, 1); - } - return this; -}; - -teamTypes.remove('user').remove('plan').remove('smsGateway').remove('sport').remove('timeZone'); - -typeLookup = {}; - -singularLookup = {}; - -pluralLookup = { - memberPreferences: 'membersPreferences', - divisionMemberPreferences: 'divisionMembersPreferences', - divisionPreferences: 'divisionsPreferences', - opponentResults: 'opponentsResults', - statisticDatum: 'statisticData', - messageDatum: 'messageData', - teamMedium: 'teamMedia', - teamPaypalPreferences: 'teamsPaypalPreferences', - teamPreferences: 'teamsPreferences', - teamResults: 'teamsResults', - customDatum: 'customData', - leagueCustomDatum: 'leagueCustomData', - smsGateway: 'smsGateways' -}; - -for (i = 0, len = types.length; i < len; i++) { - type = types[i]; - plural = pluralLookup[type] || (function() { - switch (type.slice(-1)) { - case 'y': - return type.slice(0, -1) + 'ies'; - case 's': - return type + 'es'; - default: - return type + 's'; - } - })(); - typeLookup[type] = type; - typeLookup[plural] = type; - singularLookup[plural] = type; - pluralLookup[type] = plural; -} - -teamsnap.isPluralType = function(name) { - return singularLookup.hasOwnProperty(name); -}; - -teamsnap.isSingularType = function(name) { - return pluralLookup.hasOwnProperty(name); -}; - -teamsnap.hasType = function(type) { - return typeLookup[type] !== void 0; -}; - -teamsnap.getTypes = function() { - return types.slice(); -}; - -teamsnap.getTeamTypes = function() { - return teamTypes.slice(); -}; - -teamsnap.getPluralType = function(name) { - return pluralLookup[name]; -}; - -teamsnap.getSingularType = function(name) { - return singularLookup[name]; -}; - -teamsnap.getType = function(name) { - return typeLookup[name]; -}; - -teamsnap.camelcaseType = function(type) { - return type.replace(/[-_]+(\w)/g, function(_, char) { - return char.toUpperCase(); - }); -}; - -teamsnap.underscoreType = function(type) { - return type.replace(/[A-Z]/g, function(char) { - return '_' + char.toLowerCase(); - }); -}; - -}); - - -global['teamsnap'] = require('teamsnap'); -})(); \ No newline at end of file diff --git a/app.js b/src/app.js similarity index 82% rename from app.js rename to src/app.js index d1a2e5c..e969967 100644 --- a/app.js +++ b/src/app.js @@ -8,9 +8,9 @@ var session = require("express-session"); var csrf = require("csurf"); var passport = require("passport"); var logger = require("morgan"); +var bodyParser = require("body-parser"); global.XMLHttpRequest = require("xhr2"); var teamsnap = require("teamsnap.js"); - var indexRouter = require("./routes/index"); var authRouter = require("./routes/auth"); @@ -22,6 +22,8 @@ app.set("view engine", "pug"); app.locals.pluralize = require("pluralize"); +app.use(bodyParser.urlencoded({ extended: true })); +app.use(bodyParser.json()); app.use(logger("dev")); app.use(express.json()); app.use(express.urlencoded({ extended: false })); @@ -29,17 +31,21 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, "public"))); app.use( "/css", - express.static(path.join(__dirname, "node_modules/bootstrap/dist/css")) + express.static(path.join(__dirname, "../node_modules/bootstrap/dist/css")) ); app.use( "/css", express.static( - path.join(__dirname, "node_modules/@teamsnap/teamsnap-ui/dist/css") + path.join(__dirname, "../node_modules/@teamsnap/teamsnap-ui/dist/css") ) ); app.use( "/font", - express.static(path.join(__dirname, "node_modules/bootstrap-icons/font")) + express.static(path.join(__dirname, "../node_modules/bootstrap-icons/font")) +); +app.use( + "/js", + express.static(path.join(__dirname, "../node_modules/sortablejs")) ); app.use( session({ diff --git a/src/controllers/events.js b/src/controllers/events.js new file mode 100644 index 0000000..4dc833c --- /dev/null +++ b/src/controllers/events.js @@ -0,0 +1,42 @@ +utils = require("../lib/utils"); + +exports.getEvents = (req, res, next) => { + team_id = req.params.team_id; + utils.initTeamsnap(req, res, () => { + teamsnap + .bulkLoad(team_id, ["team", "event", "availabilitySummary"]) + .then(() => { + items = teamsnap.getAllItems(); + context = { + title: "Events", + team: items.find((i) => i.type == "team" && i.id == team_id), + availabilitySummaries: items.filter( + (i) => i.type == "availabilitySummary" + ), + events: items.filter((i) => i.type == "event"), + }; + res.render("events", context); + }); + }); +}; + +exports.getEvent = (req, res, next) => { + team_id = req.params.team_id; + event_id = req.params.event_id; + utils.initTeamsnap(req, res, () => { + teamsnap + .bulkLoad(team_id, ["team", "event", "availabilitySummary"]) + .then(() => { + items = teamsnap.getAllItems(); + context = { + title: "Event", + team: items.find((i) => i.type == "team" && i.id == team_id), + availabilitySummary: items.find( + (i) => i.type == "availabilitySummary" && i.id == event_id + ), + event: items.find((i) => i.type == "event" && i.id == event_id), + }; + res.render("event", context); + }); + }); +}; diff --git a/src/controllers/teams.js b/src/controllers/teams.js new file mode 100644 index 0000000..c6833bc --- /dev/null +++ b/src/controllers/teams.js @@ -0,0 +1,20 @@ +utils = require("../lib/utils"); + +exports.getTeams = (req, res, next) => { + utils.initTeamsnap(req, res, () => { + teamsnap.loadTeams().then((teams) => { + context = { title: "Teams", teams: teams }; + res.render("teams", context); + }); + }); +}; + +exports.getTeamHome = (req, res, next) => { + team_id = req.params.team_id; + utils.initTeamsnap(req, res, () => { + teamsnap.loadTeam(team_id).then((team) => { + context = { title: "Home", team: team }; + res.render("team", context); + }); + }); +}; diff --git a/src/lib/utils.js b/src/lib/utils.js new file mode 100644 index 0000000..b9ed824 --- /dev/null +++ b/src/lib/utils.js @@ -0,0 +1,35 @@ +exports.teamsnapAvailabilitiesSort = (a, b) => { + status_code_sort = [ + teamsnap.AVAILABILITIES.YES, + teamsnap.AVAILABILITIES.MAYBE, + teamsnap.AVAILABILITIES.NO, + teamsnap.AVAILABILITIES.NONE, + ]; + a_sort = status_code_sort.indexOf(a.statusCode); + b_sort = status_code_sort.indexOf(b.statusCode); + if (a_sort > b_sort) { + return 1; + } + if (a_sort < b_sort) { + return -1; + } + if (a_sort == b_sort) { + if (a.member.lastName < b.member.lastName) { + return -1; + } + if (a.member.lastName > b.member.lastName) { + return 1; + } + } +}; + +exports.initTeamsnap = (req, res, next) => { + if (!teamsnap.isAuthed()) { + teamsnap.init(process.env["TEAMSNAP_CLIENT_ID"]); + teamsnap.auth(req.user.accessToken); + } + teamsnap.loadCollections((err) => { + teamsnap.enablePersistence(); + next(req, res, next); + }); +}; diff --git a/public/css/gamecard.css b/src/public/css/gamecard.css similarity index 100% rename from public/css/gamecard.css rename to src/public/css/gamecard.css diff --git a/src/public/css/lineup.css b/src/public/css/lineup.css new file mode 100644 index 0000000..c7da9bc --- /dev/null +++ b/src/public/css/lineup.css @@ -0,0 +1,71 @@ +@import url("/font/bootstrap-icons.css"); + +:root { + --bc-text-muted: #6c757d; +} + +#label_13_5_0 span { + display: none !important; +} +#label_13_5_0:after { + font-family: FontAwesome; + content: "\f005"; +} +.lineup-slot .Panel-cell { + display: flex; + align-items: center; +} + +.lineup-slot .Panel-cell:has(.drag-handle) { + flex-direction: column; +} + +.lineup-slot [class*="availability-status-code"]::before { + padding-right: 6px; + font-family: "bootstrap-icons"; +} + +.lineup-slot .availability-status-code-1::before { + content: "\F26A"; + color: var(--bs-success); +} + +.lineup-slot .availability-status-code-2::before { + content: "\F504"; + color: var(--bs-primary); +} + +.lineup-slot .availability-status-code-0::before { + content: "\F622"; + color: var(--bs-danger); +} + +.lineup-slot .availability-status-code-null::before { + content: "\F505"; + color: var(--bs-secondary); +} + +.lineup-slot .lastname { + text-transform: uppercase; + font-weight: bold; +} + +.lineup-slot .jerseynumber { + text-transform: uppercase; + font-weight: light; + color: var(--bc-text-muted); + font-size: 0.8em; +} + +.lineup-slot .jerseynumber::before { + content: " - "; +} + +/* if lineup_entry.availabilityStatusCode == 2 + i.bi.bi-question-circle-fill.text-info.u-spaceRightXs +else if lineup_entry.availabilityStatusCode == 1 + i.bi.bi-check-circle-fill.text-success.u-spaceRightXs +else if lineup_entry.availabilityStatusCode == 0 + i.bi.bi-x-circle-fill.text-danger.u-spaceRightXs +else + i.bi.bi-question-circle.u-spaceRightXs */ diff --git a/public/css/paper.css b/src/public/css/paper.css similarity index 100% rename from public/css/paper.css rename to src/public/css/paper.css diff --git a/public/css/project.css b/src/public/css/project.css similarity index 79% rename from public/css/project.css rename to src/public/css/project.css index c132114..877c8f6 100644 --- a/public/css/project.css +++ b/src/public/css/project.css @@ -1,5 +1,6 @@ /* These styles are generated from project.scss. */ @import url("https://fonts.googleapis.com/css2?family=Open+Sans&display=swap"); +@import url("../fonts/helvetica-now/stylesheet.css"); .alert-debug { color: black; background-color: white; @@ -55,3 +56,17 @@ border-color: #1b73bc; background-color: #1b73bc; } + +.benchcoach-nav { + background-color: #323669; + margin-bottom: 2em; + padding: 0.5em; + color: white; +} + +.benchcoach-nav h3 { + font-family: "Helvetica Now"; + font-weight: bolder; + color: white; + text-transform: uppercase; +} diff --git a/public/fonts/futura-now/stylesheet.css b/src/public/fonts/futura-now/stylesheet.css similarity index 100% rename from public/fonts/futura-now/stylesheet.css rename to src/public/fonts/futura-now/stylesheet.css diff --git a/public/fonts/helvetica-now/stylesheet.css b/src/public/fonts/helvetica-now/stylesheet.css similarity index 100% rename from public/fonts/helvetica-now/stylesheet.css rename to src/public/fonts/helvetica-now/stylesheet.css diff --git a/public/fonts/inconsolata/stylesheet.css b/src/public/fonts/inconsolata/stylesheet.css similarity index 100% rename from public/fonts/inconsolata/stylesheet.css rename to src/public/fonts/inconsolata/stylesheet.css diff --git a/public/fonts/m+1m/m+1m.css b/src/public/fonts/m+1m/m+1m.css similarity index 100% rename from public/fonts/m+1m/m+1m.css rename to src/public/fonts/m+1m/m+1m.css diff --git a/public/fonts/vera/bitstreamvera.css b/src/public/fonts/vera/bitstreamvera.css similarity index 100% rename from public/fonts/vera/bitstreamvera.css rename to src/public/fonts/vera/bitstreamvera.css diff --git a/public/fonts/verdana/verdanapro.css b/src/public/fonts/verdana/verdanapro.css similarity index 100% rename from public/fonts/verdana/verdanapro.css rename to src/public/fonts/verdana/verdanapro.css diff --git a/public/media/baseball-diamond.svg b/src/public/media/baseball-diamond.svg similarity index 100% rename from public/media/baseball-diamond.svg rename to src/public/media/baseball-diamond.svg diff --git a/public/media/benchcoach.svg b/src/public/media/benchcoach.svg similarity index 100% rename from public/media/benchcoach.svg rename to src/public/media/benchcoach.svg diff --git a/src/public/media/teamsnap.svg b/src/public/media/teamsnap.svg new file mode 100644 index 0000000..1565893 --- /dev/null +++ b/src/public/media/teamsnap.svg @@ -0,0 +1 @@ +TeamSnap Logo diff --git a/src/public/media/teamsnap_star.svg b/src/public/media/teamsnap_star.svg new file mode 100644 index 0000000..9a0da90 --- /dev/null +++ b/src/public/media/teamsnap_star.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/routes/auth.js b/src/routes/auth.js similarity index 87% rename from routes/auth.js rename to src/routes/auth.js index 7fbbf0f..364e5ba 100644 --- a/routes/auth.js +++ b/src/routes/auth.js @@ -17,6 +17,7 @@ passport.use( clientSecret: process.env["TEAMSNAP_CLIENT_SECRET"], callbackURL: "/auth/teamsnap/callback", passReqToCallback: true, + scope: ["read", "write"], }, function (req, accessToken, refreshToken, profile, done) { json = JSON.parse(profile._raw); @@ -30,8 +31,7 @@ passport.use( new_profile["first_name"] = json.collection.items[0].data.filter( (e) => e.name == "first_name" )[0].value; - console.log("LI#35 session is ", req.session); - console.log("LI#35 session id is ", req.session.id); + req.session.teamsnap_access_token = accessToken; teamsnap.init(process.env["TEAMSNAP_CLIENT_ID"]); teamsnap.auth(accessToken); @@ -79,6 +79,10 @@ var router = express.Router(); * will be sent to the `GET /login/federated/teamsnap` route. */ router.get("/login", function (req, res, next) { + // https://stackoverflow.com/a/73056806/20522015 + returnTo = req.session.returnTo; + // req.session.regenerate(); // this is not working right as of now... + req.session.returnTo = returnTo; res.render("login"); }); @@ -107,22 +111,13 @@ router.get( passport.authenticate("teamsnap", function (err, user, info, status) {}) ); -router.get("/auth/teamsnap/callback", function (req, res, next) { - passport.authenticate("teamsnap", function (err, user, info, status) { - if (err) { - // do something with the error - console.error("error: ", err); - } - // success - console.log("L#105 user is ", user); - req.logIn(user, function (err) { - if (err) { - return next(err); - } - - return res.redirect("/"); - }); - })(req, res, next); -}); +router.get( + "/auth/teamsnap/callback", + passport.authenticate("teamsnap", { + successReturnToOrRedirect: "/", + failureRedirect: "/login", + keepSessionInfo: true, + }) +); module.exports = router; diff --git a/routes/index.js b/src/routes/index.js similarity index 58% rename from routes/index.js rename to src/routes/index.js index 652e723..0cc1f61 100644 --- a/routes/index.js +++ b/src/routes/index.js @@ -6,176 +6,19 @@ var ensureLoggedIn = ensureLogIn(); var router = express.Router(); -function authTeamsnap(user) { - if (!teamsnap.isAuthed()) { - teamsnap.init(process.env["TEAMSNAP_CLIENT_ID"]); - teamsnap.auth(user.accessToken); - } -} - -function availabilitiesSort(a, b) { - status_code_sort = [ - teamsnap.AVAILABILITIES.YES, - teamsnap.AVAILABILITIES.MAYBE, - teamsnap.AVAILABILITIES.NO, - teamsnap.AVAILABILITIES.NONE, - ]; - a_sort = status_code_sort.indexOf(a.statusCode); - b_sort = status_code_sort.indexOf(b.statusCode); - if (a_sort > b_sort) { - return 1; - } - if (a_sort < b_sort) { - return -1; - } - if (a_sort == b_sort) { - if (a.member.lastName < b.member.lastName) { - return -1; - } - if (a.member.lastName > b.member.lastName) { - return 1; - } - } -} - -async function fetch_stats(resolve, reject) { - url = - "https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv&gid={tab_id}"; - papaparse.Papa.parse(url, { - download: true, - complete: function (results) { - results.data.forEach((row, i) => { - if (i == 0 || row[2] == "Totals" || row[2] == "") { - return; - } - d = { - first_name: row[3], - last_name: row[2], - jersey_number: row[1], - pa: row[5], - ab: row[6], - avg: row[20], - obp: row[21], - slg: row[22], - }; - }); - resolve(d); - }, - }); -} - -/* GET home page. */ -router.get("/", ensureLoggedIn, function (req, res, next) { - if (req.user) { - authTeamsnap(req.user); - teamsnap.loadCollections(function (err) { - if (err) { - alert("Error loading TeamSnap SDK"); - return; - } - teamsnap.loadTeams(function onTeamsLoad(err, teams) { - teams = teams.sort((a, b) => b.seasonName - a.seasonName); - res.render("home", { req: req, teams: teams }); - }); - }); - } else { - res.render("home", { req: req }); - } -}); - -router.get( - "/teams", - ensureLoggedIn, - function (req, res, next) { - console.log("teamsnap authed?: ", teamsnap.isAuthed()); - console.log("user is", req.user); - - authTeamsnap(req.user); - teamsnap.loadCollections(function (err) { - if (err) { - alert("Error loading TeamSnap SDK"); - return; - } - teamsnap.loadTeams(function onTeamsLoad(err, teams) { - teams = teams.sort((a, b) => b.seasonName - a.seasonName); - res.render("teams", { teams: teams }); - }); - }); - - next(); - }, - function (req, res, next) { - // res.send(`${me.firstName} ${me.lastName}`); - } -); - -router.get("/:team_id([0-9]+)", ensureLoggedIn, function (req, res, next) { - authTeamsnap(req.user); - team_id = req.params.team_id; - console.log("team_id", team_id); - teamsnap.loadCollections(function (err) { - if (err) { - alert("Error loading TeamSnap SDK"); - return; - } - teamsnap.enablePersistence(); - - teamsnap.bulkLoad( - team_id, - ["team", "member", "event", "opponent", "availability_summary"], - function onBulkLoad(err, items) { - team = items.find((i) => (i.type == "team") & (i.id == team_id)); - console.log(team); - res.set("Content-Type", "text/html"); - res.render("team", { team: team }); - } - ); - }); -}); +var multer = require("multer"); +const storage = multer.memoryStorage(); +const upload = multer({ storage: storage }); +const teamsController = require("../controllers/teams"); +const eventsController = require("../controllers/events"); +router.get("/", ensureLoggedIn, teamsController.getTeams); +router.get("/:team_id/home", ensureLoggedIn, teamsController.getTeamHome); +router.get("/:team_id/events", ensureLoggedIn, eventsController.getEvents); router.get( "/:team_id/event/:event_id", ensureLoggedIn, - function (req, res, next) { - authTeamsnap(req.user); - var team_id = req.params.team_id; - var event_id = req.params.event_id; - teamsnap.loadCollections(function (err) { - console.log(); - teamsnap.enablePersistence(); - - teamsnap.bulkLoad( - team_id, - ["team", "event", "availabilitySummary"], - function (err, items) { - if (err) { - res.code = 500; - res.send(err); - } - - availabilitySummaries = items.filter( - (i) => i.type == "availabilitySummary" && i.id == event_id - ); - events = items.filter((i) => i.type == "event" && i.id == event_id); - - if (events) { - event = events[0]; - availabilitySummary = availabilitySummaries[0]; - console.log("A_S", availabilitySummaries); - res.render("event", { - event: event, - team_id: team_id, - team: items.find((i) => i.type == "team" && i.id == team_id), - availabilitySummary: availabilitySummary, - }); - } else { - res.code = 500; - res.send("error"); - } - } - ); - }); - } + eventsController.getEvent ); router.get( @@ -234,6 +77,7 @@ router.get( current_event_index = events.findIndex((e) => e.id == event_id); context = { + title: "Gamecard", team_id: req.params.team_id, event_id: req.params.event_id, current_event_index: current_event_index, @@ -328,6 +172,8 @@ router.get( current_event_index = events.findIndex((e) => e.id == event_id); context = { + title: "Lineup", + team: items.find((e) => e.type == "team" && e.id == team_id), team_id: req.params.team_id, event_id: req.params.event_id, current_event_index: current_event_index, @@ -360,30 +206,27 @@ router.get( .sort((a, b) => a.sequence - b.sequence), }; - res.render("lineup", context); + res.render("lineup/lineup", context); }); }); } ); -router.get("/:team_id/events", ensureLoggedIn, function (req, res, next) { +router.get("/:team_id/events", ensureLoggedIn); + +router.get("/:team_id/opponents", ensureLoggedIn, function (req, res, next) { authTeamsnap(req.user); team_id = req.params.team_id; - event_id = req.params.event_id; teamsnap.loadCollections(function (err) { - teamsnap - .bulkLoad(team_id, ["team", "event", "availability_summary"]) - .then((items) => { - res.set("Content-Type", "text/html"); - res.render("events", { - team: items.find((i) => i.type == "team" && i.id == team_id), - events: items.filter((i) => i.type == "event"), - availabilitySummaries: items.filter( - (i) => i.type == "availabilitySummary" - ), - team_id: team_id, - }); + teamsnap.bulkLoad(team_id, ["team", "opponent"]).then((items) => { + res.set("Content-Type", "text/html"); + res.render("opponents", { + title: "Opponents", + team: items.find((i) => i.type == "team" && i.id == team_id), + opponents: items.filter((i) => i.type == "opponent"), + team_id: team_id, }); + }); }); }); @@ -394,6 +237,7 @@ router.get("/:team_id/opponents", ensureLoggedIn, function (req, res, next) { teamsnap.bulkLoad(team_id, ["team", "opponent"]).then((items) => { res.set("Content-Type", "text/html"); res.render("opponents", { + title: "Opponents", team: items.find((i) => i.type == "team" && i.id == team_id), opponents: items.filter((i) => i.type == "opponent"), team_id: team_id, @@ -402,38 +246,72 @@ router.get("/:team_id/opponents", ensureLoggedIn, function (req, res, next) { }); }); +router.get("/:team_id/roster", ensureLoggedIn, function (req, res, next) { + authTeamsnap(req.user); + team_id = req.params.team_id; + teamsnap.loadCollections(function (err) { + teamsnap.enablePersistence(); + teamsnap.bulkLoad(team_id, ["team", "members"]).then(() => { + items = teamsnap.getAllItems(); + res.set("Content-Type", "text/html"); + res.render("roster", { + title: `Roster`, + team: items.find((i) => i.type == "team" && i.id == team_id), + members: items.find((i) => i.type == "member" && team.id == team_id), + team_id: team_id, + }); + }); + }); +}); + router.get( - "/:team_id/opponent/:opponent_id", + "/:team_id/opponent/:opponent_id/upload-logo", ensureLoggedIn, function (req, res, next) { - authTeamsnap(req.user); - team_id = req.params.team_id; opponent_id = req.params.opponent_id; - teamsnap.loadCollections(function (err) { - teamsnap.enablePersistence(); - teamsnap - .bulkLoad(team_id, ["team", "opponent"]) - .then(() => { - teamsnap.loadTeamMedia(team_id); - }) - .then(() => { - items = teamsnap.getAllItems(); - res.set("Content-Type", "text/html"); - res.render("opponent", { - team: items.find((i) => i.type == "team" && i.id == team_id), - opponent: items.find( - (i) => i.type == "opponent" && i.id == opponent_id - ), - opponent_logo: items.find( - (i) => - i.type == "teamMedium" && - i.description == `team-logo-${opponent_id}.png` - ), - team_id: team_id, - }); - }); + team_id = req.params.team_id; + res.set("Content-Type", "text/html"); + res.render("upload-logo", { + title: "Upload Logo", + csrf_token: req.csrfToken(), + team_id: team_id, + opponent_id: opponent_id, }); } ); +router.post( + "/:team_id/opponent/:opponent_id/upload-logo", + ensureLoggedIn, + upload.single("file"), + function (req, res, next) { + opponent_id = req.body.opponent_id; + team_id = req.body.team_id; + member_id = req.user.id; + file = new File(req.file.buffer, `team-logo-${opponent_id}.png`, { + type: "image/png", + }); + authTeamsnap(req.user); + teamsnap + .loadCollections() + .then(() => { + return teamsnap.createTeamMedium({ + file: file, + mediaFormat: "file", + memberId: member_id, + teamId: team_id, + teamMediaGroupId: "4927028", + description: `team-logo-${opponent_id}.png`, + }); + }) + .then((item) => { + return teamsnap.uploadTeamMedium(item); + }) + .then((item) => { + res.send("Data Received: " + JSON.stringify(item)); + }) + .fail((err) => console.log(err)); + } +); + module.exports = router; diff --git a/src/views/base.pug b/src/views/base.pug new file mode 100644 index 0000000..caae5ba --- /dev/null +++ b/src/views/base.pug @@ -0,0 +1,42 @@ +html +head + block meta + meta(charset='utf-8') + meta(name='viewport' content='width=device-width, initial-scale=1') + title BenchCoach - #{title} + block styles + link(rel='stylesheet' href='/css/bootstrap.min.css') + link(rel='stylesheet' href='/font/bootstrap-icons.min.css') + link(rel='stylesheet' href='/css/teamsnap-ui.css') + link(rel='stylesheet' href='/css/project.css') + block pre-scripts + script(type='text/javascript', src='/js/Sortable.js') + +body.bg-light + block navbar + .benchcoach-nav.u-flex.u-flexJustifyBetween.u-flexAlignItemsCenter + .u-flex.u-flexAlignItemsCenter + img(src='/media/benchcoach.svg' alt='TeamSnap Logo' width='30' height='30') + h3.u-padLeft.u-colorWhite.u-noMarginBottom BenchCoach + + .u-spaceSm.u-md-spaceLg + block content + .Panel + .Panel-header + h2.Panel-title Panel + .Panel-body + .Panel-row Panel Row + .Panel-row Roster + .Panel-row Opponents + + block footer + .u-padMd.u-borderTop + .u-max1200.u-flexExpandSides.Grid + .Grid-cell.u-md-size1of2 + p.u-textCenter.u-md-textLeft + | Copyright © 2023 BenchCoach. BenchCoach is not affiliated with TeamSnap, inc. + .Grid-cell.u-md-size1of2 + p.u-textCenter.u-md-textRight + + block scripts + \ No newline at end of file diff --git a/views/error.pug b/src/views/error.pug similarity index 100% rename from views/error.pug rename to src/views/error.pug diff --git a/views/gamecard.pug b/src/views/event-lineup-card.pug similarity index 100% rename from views/gamecard.pug rename to src/views/event-lineup-card.pug diff --git a/src/views/event-lineup.pug b/src/views/event-lineup.pug new file mode 100644 index 0000000..63ccd7a --- /dev/null +++ b/src/views/event-lineup.pug @@ -0,0 +1,63 @@ +extends ../base.pug +include lineup-slot.pug +include ../widgets/availability-progress-bar.pug + +block append styles + link(rel='stylesheet' href='/css/lineup.css') + +block pre-scripts + script(type='text/javascript', src='/js/Sortable.js') + +block content + div(id=`event-lineup-${event.id}`).event-lineup + .Panel + .panel-header + .Panel-title #{event.formattedTitle} + .Panel-body + .Panel-row + p.text-muted.mb-2 #{event.startDate} + p #{event.locationName} + +availability-progress-bar(availabilitySummary, team) + + .Panel + .Panel-body + .Panel-row.Panel-title.u-padXs + i.bi.bi-clipboard-check.me-1 + span Starting Lineup + .Panel-row.Grid.Grid--fit.fw-bold.text-center.u-padXs + each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] + .Grid-cell.position-status #{pos} + .slot-set + each lineup_entry, i in event_lineup_entries_offense + +lineup-slot(lineup_entry, i) + .Panel + .Panel-body + .Panel-row.Panel-title.u-padXs + i.bi.bi-clipboard-minus.me-1 + span Starting Lineup (Position Only) + .slot-set + each lineup_entry, i in event_lineup_entries + if lineup_entry.label.includes("[PO]") + +lineup-slot(lineup_entry, i) + .Panel + .Panel-body + .Panel-row.Panel-title.u-padXs + i.bi.bi-clipboard.me-1 + span Bench + .slot-set + each availability, i in availabilities.filter((a)=>a.eventId==event_id && !context.event_lineup_entries.map((lue)=>lue.memberId).includes(a.memberId) && !a.member.isNonPlayer && a.statusCode!=0 && a.statusCode!==null) + +lineup-slot(availability, i) + + .Panel + .Panel-body + .Panel-row.Panel-title.u-padXs + i.bi.bi-clipboard-x.me-1 + span Out + .slot-set + each availability, i in availabilities.filter((a)=>a.eventId==event_id && !context.event_lineup_entries.map((lue)=>lue.memberId).includes(a.memberId) && !a.member.isNonPlayer && (a.statusCode==0 || a.statusCode===null)) + +lineup-slot(availability, i) +block scripts + script + include lineup.js + script. + colorPositions(); diff --git a/src/views/event.pug b/src/views/event.pug new file mode 100644 index 0000000..4b5bea5 --- /dev/null +++ b/src/views/event.pug @@ -0,0 +1,27 @@ +extends base.pug +include mixin-availability-progress-bar.pug + +block content + .Panel + .Panel-header + h3.Panel-title #{event.formattedTitle} + .Panel-body + .Panel-row + h6.card-text.text-muted.mb-2 + |#{event.startDate} + br + |#{event.locationName} + .Panel-row + h4 Availability + +availability-progress-bar(availabilitySummary, team) + .Panel-row + div.d-flex + a(class="Button m-auto" href=`/${team_id}/event/${event.id}/lineup`) + i(class="bi bi-clipboard") + span.mx-1 Lineup + a(class="Button m-auto" href=`/${team_id}/event/${event.id}/gamecard`) + i(class="bi bi-book") + span.mx-1 Game Card + a(class="Button m-auto" href=`https://go.teamsnap.com/${team_id}/schedule/view_game/${event.id}`) + i(class="bi bi-asterisk") + span.mx-1 TeamSnap \ No newline at end of file diff --git a/src/views/events.pug b/src/views/events.pug new file mode 100644 index 0000000..4e28c43 --- /dev/null +++ b/src/views/events.pug @@ -0,0 +1,21 @@ +extends base.pug +include mixin-availability-progress-bar.pug + +block content + .Panel + .Panel-header + .Panel-title Schedule + .Panel-body + each event in events + - var availabilitySummary = availabilitySummaries.find((a)=>a.eventId==event.id) + a(class="event list-group-item" href=`/${team_id}/event/${event.id}`).Panel-row--withCells + .Panel-cell + h4 #{event.formattedTitle} + +availability-progress-bar(availabilitySummary, team) + .Panel-cell + |#{event.startDate.toLocaleDateString("en-us",{weekday: "short", day: "numeric",month: "short"})} + .Panel-cell + |#{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})} + .Panel-cell + |#{event.locationName} + diff --git a/src/views/home.pug b/src/views/home.pug new file mode 100644 index 0000000..5cca666 --- /dev/null +++ b/src/views/home.pug @@ -0,0 +1,24 @@ +extends base.pug + +block content + .row + .text-center.my-2 + .row + h1 + img.mx-auto(src="media/benchcoach.svg" style="width: 2.5em;") + .row + h1 + strong + | Welcome to + span.text-nowrap BenchCoach + .text-center.lead.fst-italic.fw-light + | An assistant coach for TeamSnap + .row + .col.text-center + if req.user + ul.list-group + each team in teams + a(class='team list-group-item' href=`/${team.id}/home`) #{team.name} [#{team.seasonName}] + else + a.btn.btn-outline-primary(href="login") + | Login \ No newline at end of file diff --git a/src/views/lineup.js b/src/views/lineup.js new file mode 100644 index 0000000..e063646 --- /dev/null +++ b/src/views/lineup.js @@ -0,0 +1,356 @@ +/* Project specific Javascript goes here. */ +function onPositionSelectChange(elem) { + elem.querySelectorAll("option").forEach((option) => { + if (option.innerText == elem.value) { + option.setAttribute("selected", "selected"); + } else { + option.removeAttribute("selected"); + } + }); + colorPositions(); +} + +function colorPositions() { + console.log("Coloring Positions"); + for (bcLineup of document.getElementsByClassName("event-lineup")) { + selected_lineup_positions = Array.from( + bcLineup.querySelectorAll( + ".Panel-row .SelectBox.position-selection option[selected='selected']" + ) + ).map((el) => el.value); + console.log(selected_lineup_positions); + for (position_status of bcLineup.querySelectorAll(".position-status")) { + for (class_name of ["text-danger", "text-warning", "text-success"]) { + if (position_status.classList.contains(class_name)) { + position_status.classList.remove(class_name); + } + } + + occurrences = selected_lineup_positions.filter( + (s) => s == position_status.innerText + ).length; + + if (occurrences == 1) { + position_status.classList.add("text-success"); + } else if (occurrences > 1) { + position_status.classList.add("text-warning"); + } else { + position_status.classList.add("text-danger"); + } + } + } +} + +function refresh_lineup_order(itemEl) { + let bcLineup = itemEl.closest(".benchcoach-lineup"); + var player_rows = []; + for (tbody of bcLineup.querySelectorAll( + "[class*='tbody-benchcoach-starting']" + )) { + for (row of tbody.rows) { + player_rows.push(row); + } + } + + for (let i = 0; i < player_rows.length; i++) { + var player_order = player_rows[i].querySelector('[id^="sequence"]'); + var form_element_order = player_rows[i].querySelector('[id$="sequence"]'); + player_order.innerText = parseInt(player_rows[i].dataset.order); + player_rows[i].dataset.order = i; + form_element_order.value = i; + player_order.innerHTML = i + 1; + } + var player_rows = bcLineup.getElementsByClassName("tbody-benchcoach-bench")[0] + .rows; + for (let i = 0; i < player_rows.length; i++) { + var player_order = player_rows[i].querySelector('[id^="sequence"]'); + var form_element_order = player_rows[i].querySelector('[id$="sequence"]'); + player_rows[i].dataset.order = null; + form_element_order.value = null; + player_order.innerHTML = null; + } +} + +function sendToClipboard(itemEl) { + let bcLineup = itemEl.closest(".benchcoach-lineup"); + player_rows = bcLineup.querySelectorAll("[data-position=P]"); + lineup_export = []; + if (player_rows.length > 0) { + lineup_export.push(player_rows[0].dataset.playerName); + lineup_export.push("", ""); + } else { + lineup_export.push("", "", ""); + } + + lineup_export.push(""); + for (position of ["C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "DH"]) { + var player_rows = bcLineup.querySelectorAll( + `[data-position=${CSS.escape(position)}]` + ); + if (player_rows.length > 0) { + lineup_export.push(player_rows[0].dataset.playerName); + } else { + lineup_export.push(""); + } + } + for (position of ["EH"]) { + var player_rows = bcLineup.querySelectorAll( + `[data-position=${CSS.escape(position)}]` + ); + for (var i = 0; i < 2; i++) { + if (i < player_rows.length) { + lineup_export.push(player_rows[i].dataset.playerName); + } else { + lineup_export.push(""); + } + } + } + + for (position of ["DR"]) { + let player_rows = bcLineup.querySelectorAll( + `[data-position=${CSS.escape(position)}]` + ); + if (player_rows.length > 0) { + lineup_export.push(player_rows[0].dataset.playerName); + } else { + lineup_export.push(""); + } + } + + lineup_export.push(""); + lineup_export.push("", ""); + lineup_export.push(""); + + for (var i = 0; i < 11; i++) { + let player_rows = bcLineup + .querySelector(".table-benchcoach-startinglineup") + .querySelectorAll(`[data-order=${CSS.escape(i)}]`); + if (player_rows.length > 0) { + lineup_export.push(player_rows[0].dataset.playerName); + } else { + lineup_export.push(""); + } + } + + console.dir(lineup_export); + var textArea = document.createElement("textarea"); + textArea.value = lineup_export.join("\n"); + + // Avoid scrolling to bottom + textArea.style.top = "0"; + textArea.style.left = "0"; + textArea.style.position = "fixed"; + + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + var successful = document.execCommand("copy"); + var msg = successful ? "successful" : "unsuccessful"; + console.log("Copying text command was " + msg); + } catch (err) { + console.error("Oops, unable to copy", err); + } + + document.body.removeChild(textArea); +} + +for (bcLineup of document.querySelectorAll(".Panel:has(.lineup-slot)")) { + var startinglineup = new Sortable.create( + bcLineup.querySelector(".slot-set"), + { + animation: 150, + handle: ".drag-handle", + ghostClass: "ghost", + group: { + name: bcLineup.id, + put: [bcLineup.id], + pull: [bcLineup.id], + }, + onAdd: function (/**Event*/ evt) { + // Add to Lineup + var itemEl = evt.item; // dragged HTMLElement + var player_order = itemEl.querySelector('[id^="sequence-member"]'); + var player_available = itemEl.querySelector( + '[class^="member-availability-status"]' + ); + refresh_lineup_order(itemEl); + if (player_order.classList.contains("d-none")) { + player_order.classList.remove("d-none"); + } + // player_available.classList.add('d-none') + }, + onUpdate: function (/**Event*/ evt) { + console.log("update to lineup"); + var itemEl = evt.item; // dragged HTMLElement + refresh_lineup_order(itemEl); + }, + } + ); +} + +function copyEmailTable(itemEl, subject, recipients) { + // Create container for the HTML + // [1] + let bcLineup = itemEl.closest(".benchcoach-lineup"); + var container = document.createElement("div"); + var tbl = document.createElement("table"); + + let thead = tbl.createTHead(); + let thead_row = thead.insertRow(); + let thead_row_cell = thead_row.insertCell(); + thead_row_cell.appendChild( + document + .createElement("h3") + .appendChild(document.createTextNode("STARTING LINEUP")) + ); + thead_row_cell.colSpan = 3; + thead_row_cell.classList.add("title-cell"); + var tbody = tbl.createTBody(); + for (row of bcLineup.querySelector(".table-benchcoach-startinglineup").rows) { + let tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + cell.appendChild(document.createTextNode(parseInt(row.dataset.order) + 1)); + cell = tr.insertCell(); + cell.appendChild(document.createTextNode(row.dataset.playerName)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild(document.createTextNode(row.dataset.position)); + } + + if ( + bcLineup.querySelector(".table-benchcoach-startingpositionalonly").rows + .length > 0 + ) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("STARTING (POS. ONLY)")); + cell.classList.add("title-cell"); + + for (row of bcLineup.querySelector( + ".table-benchcoach-startingpositionalonly" + ).rows) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + cell.appendChild(document.createTextNode("")); + cell = tr.insertCell(); + cell.appendChild(document.createTextNode(row.dataset.playerName)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild( + document.createTextNode(row.dataset.position) + ); + } + } + + if (bcLineup.querySelector(".table-benchcoach-bench").rows.length > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("SUBS")); + cell.classList.add("title-cell"); + + for (row of bcLineup.querySelector(".table-benchcoach-bench").rows) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + availability_status = { + None: "UNK", + 0: "NO", + 2: "MAY", + 1: "YES", + }[row.dataset.availabilityStatuscode]; + cell.appendChild(document.createTextNode(availability_status)); + cell = tr.insertCell(); + cell.appendChild(document.createTextNode(row.dataset.playerName)); + cell.classList.add("name-cell"); + tr.insertCell().appendChild(document.createTextNode("")); + } + } + + if (bcLineup.querySelector(".table-benchcoach-out").rows.length > 0) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.colSpan = 3; + cell.appendChild(document.createTextNode("OUT")); + cell.classList.add("title-cell"); + + for (row of bcLineup.querySelector(".table-benchcoach-out").rows) { + var tr = tbody.insertRow(); + cell = tr.insertCell(); + cell.classList.add("sequence-cell"); + availability_status = { + None: "UNK", + 0: "NO", + 1: "MAY", + 2: "YES", + }[row.dataset.availabilityStatuscode]; + cell.appendChild(document.createTextNode(availability_status)); + tr.insertCell().appendChild( + document.createTextNode(row.dataset.playerName) + ); + tr.insertCell().appendChild(document.createTextNode("")); + } + } + + container.appendChild(tbl); + for (cell of container.getElementsByClassName("title-cell")) { + cell.setAttribute( + "style", + "font-weight:bold;background-color:#323669;color:#fff;padding:2px 5px;" + ); + } + + for (cell of container.getElementsByClassName("sequence-cell")) { + cell.setAttribute("style", "font-weight:bold;padding:2px 5px;"); + } + + for (cell of container.getElementsByClassName("name-cell")) { + cell.setAttribute("style", "width:200px;"); + } + + // Detect all style sheets of the page + var activeSheets = Array.prototype.slice + .call(document.styleSheets) + .filter(function (sheet) { + return !sheet.disabled; + }); + + // Mount the container to the DOM to make `contentWindow` available + // [3] + document.body.appendChild(container); + + // Copy to clipboard + // [4] + window.getSelection().removeAllRanges(); + + var range = document.createRange(); + range.selectNode(container); + window.getSelection().addRange(range); + + // [5.1] + document.execCommand("copy"); + + // [5.2] + for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true; + + // [5.3] + // document.execCommand('copy') + + // [5.4] + for (var i = 0; i < activeSheets.length; i++) + activeSheets[i].disabled = false; + + // Remove the container + // [6] + document.body.removeChild(container); + subject_encoded = encodeURIComponent(subject); + window.open( + "readdle-spark://compose?recipient=manager@chihounds.com&subject=" + + subject + + "&bcc=" + + recipients + ); +} diff --git a/src/views/login.pug b/src/views/login.pug new file mode 100644 index 0000000..54f8f14 --- /dev/null +++ b/src/views/login.pug @@ -0,0 +1,19 @@ +extends base.pug + +block content + .Grid.Grid--fit.Grid--withGutter.u-max1200.u-flexExpandSides.u-xs-size5of6.u-sm-size2of3.u-md-sizeFull.u-padBottomMd.u-xs-padEndsLg.u-sm-padEndsXl + .Grid-cell.u-size5of12 + .Panel.u-padLg.u-spaceSidesAuto + h1.u-spaceSidesAuto.u-spaceBottomLg Sign in + a(class="Button Button--large Button--orange" href="/login/federated/teamsnap").u-spaceSidesAuto + img(src="/media/teamsnap_star.svg").icon.u-spaceRightSm + span TeamSnap + .Grid-cell.u-size7of12.u-textCenter + h1 + img(src="media/benchcoach.svg" style="width: 2.5em;") + h1 + strong + | Welcome to + span.text-nowrap BenchCoach + .lead.fst-italic.fw-light + | An assistant coach for TeamSnap \ No newline at end of file diff --git a/src/views/mixin-availability-progress-bar.pug b/src/views/mixin-availability-progress-bar.pug new file mode 100644 index 0000000..841f01b --- /dev/null +++ b/src/views/mixin-availability-progress-bar.pug @@ -0,0 +1,15 @@ +mixin availability-progress-bar(availabilitySummary, team) + .progress + div(class="progress-bar bg-success fw-bold" role="progressbar" style=` + width: ${((availabilitySummary.playerGoingCount/team.playerMemberCount)*100).toString() + "%"}`) + |#{availabilitySummary.playerGoingCount} + div(class="progress-bar bg-info fw-bold" role="progressbar" style=` + width: ${((availabilitySummary.playerMaybeCount/team.playerMemberCount)*100).toString() + "%"}`) + |#{availabilitySummary.playerMaybeCount} + div(class="progress-bar bg-danger fw-bold" role="progressbar" style=` + width: ${((availabilitySummary.playerNotGoingCount/team.playerMemberCount)*100).toString() + "%"}`) + |#{availabilitySummary.playerNotGoingCount} + div(class="progress-bar text-secondary fw-bold" role="progressbar" style=` + width: ${((availabilitySummary.playerUnknownCount/team.playerMemberCount)*100).toString() + "%"}; + background-color: var(--bs-gray-200)`) + |#{availabilitySummary.playerUnknownCount} \ No newline at end of file diff --git a/src/views/mixin-lineup-slot.pug b/src/views/mixin-lineup-slot.pug new file mode 100644 index 0000000..1f08309 --- /dev/null +++ b/src/views/mixin-lineup-slot.pug @@ -0,0 +1,22 @@ +mixin lineup-slot(item, index) + - + if (item.type == "eventLineupEntry") { + var availability_status_code = item.availabilityStatusCode + } else if (item.type == "availability") { + var availability_status_code = item.statusCode + } + .Panel-row.Panel-row--withCells.lineup-slot + .Panel-cell.Panel-cell--header.u-padXs.u-size1of12 + .u-flexAlignSelfCenter + |#{index+1} + div(class=`Panel-cell availability-status-code-${availability_status_code}`).u-padXs.u-size8of12 + span.lastname #{item.member.lastName} + span.jerseynumber ##{item.member.jerseyNumber} + .Panel-cell.u-padXs.u-size2of12 + .SelectBox.position-selection + select(onchange="onPositionSelectChange(this)").position-select-box.SelectBox-options + each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] + option(selected=item.label==pos) #{pos} + .Panel-cell.u-padXs.u-flexAlignSelfCenter.u-size1of12 + .drag-handle + i.bi.bi-grip-vertical.text-secondary.drag-handle \ No newline at end of file diff --git a/views/opponent.pug b/src/views/opponent.pug similarity index 56% rename from views/opponent.pug rename to src/views/opponent.pug index a7b56b4..179c6c1 100644 --- a/views/opponent.pug +++ b/src/views/opponent.pug @@ -13,6 +13,11 @@ body .Panel-header .Panel-title #{opponent.name} .Panel-body + .Panel-row.Panel-row--withCells + .Panel-cell.Panel-cell--header ID + .panel-cell #{opponent.id} + Button(onclick=`navigator.clipboard.writeText("${opponent.id}");`).Button + i.bi.bi-clipboard.Icon .Panel-row.Panel-row--withCells .Panel-cell.Panel-cell--header Contact Name .panel-cell #{opponent.contactsName} @@ -27,8 +32,16 @@ body .panel-cell if opponent_logo img(src=`${opponent_logo.mediumUrl}` width="64" height="64") + a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/view/${opponent_logo.id}`).Button + i.bi.bi-asterisk.Icon else - button.Button Upload + if team_media_group + a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/list/${team_media_group.id}`) Upload + else + a.Button(target="_blank" rel="noopener noreferrer" href=`https://go.teamsnap.com/${team_id}/files/`) Upload + Button(onclick=`navigator.clipboard.writeText("team-logo-${opponent.id}.png");`).Button + i.bi.bi-clipboard.Icon + span Copy Filename .Panel-row.Panel-row--withCells .Panel-cell.Panel-cell--header Notes .panel-cell #{opponent.Notes} diff --git a/views/opponents.pug b/src/views/opponents.pug similarity index 100% rename from views/opponents.pug rename to src/views/opponents.pug diff --git a/src/views/roster.pug b/src/views/roster.pug new file mode 100644 index 0000000..5e068dc --- /dev/null +++ b/src/views/roster.pug @@ -0,0 +1,17 @@ +extends base.pug +include widgets/availability-progress-bar.pug + +block content + .Panel + .Panel-header + .Panel-title roster + .Panel-body + each member in members + - var availabilitySummary = availabilitySummaries.find((a)=>a.eventId==event.id) + a(class="event list-group-item" href=`/${team_id}/event/${event.id}`).Panel-row--withCells + .Panel-cell + |#{member.firstName} + .Panel-cell + |#{event.lastName} + + diff --git a/src/views/team.pug b/src/views/team.pug new file mode 100644 index 0000000..ba42d04 --- /dev/null +++ b/src/views/team.pug @@ -0,0 +1,24 @@ +extends base.pug + +block content + .Panel + .Panel-body + .Panel-row + h2.Panel-title #{team.name} + p #{team.seasonName} + .Panel + .Panel-body + .Panel-row + a(href=`/${team.id}/events`).u-fontSizeXl- + + + + | Events + .Panel-row + a(href=`/${team.id}/roster`) + + | Roster + .Panel-row + a(href=`/${team.id}/opponents`) + + | Opponents \ No newline at end of file diff --git a/src/views/teams.pug b/src/views/teams.pug new file mode 100644 index 0000000..1e145b4 --- /dev/null +++ b/src/views/teams.pug @@ -0,0 +1,20 @@ +extends base.pug + +block content + .row + .text-center.my-2 + .row + h1 + img.mx-auto(src="media/benchcoach.svg" style="width: 2.5em;") + .row + h1 + strong + | Welcome to + span.text-nowrap BenchCoach + .text-center.lead.fst-italic.fw-light + | An assistant coach for TeamSnap + .row + .col.text-center + ul.list-group + each team in teams + a(class='team list-group-item' href=`/${team.id}/home`) #{team.name} [#{team.seasonName}] diff --git a/src/views/upload-logo.pug b/src/views/upload-logo.pug new file mode 100644 index 0000000..9ceb8d9 --- /dev/null +++ b/src/views/upload-logo.pug @@ -0,0 +1,84 @@ +html +head + meta(charset='utf-8') + meta(name='viewport' content='width=device-width, initial-scale=1') + title BenchCoach - Teams + link(rel='stylesheet' href='/css/bootstrap.min.css') + link(rel='stylesheet' href='/font/bootstrap-icons.min.css') + link(rel='stylesheet' href='/css/teamsnap-ui.css') + script(type='text/javascript', src='/js/teamsnap.js') + +body + .container + .Panel + .Panel-header + .Panel-title Upload + .Panel-body + .Panel-row + .input-group + label(for='file') Select file + input(id='file' type="file") + input(id="csrf_token", type="hidden" name="csrf_token" value=`${csrf_token}`) + input(id='team_id', type="hidden", value=`${team_id}`) + input(id='opponent_id', type="hidden", value=`${opponent_id}`) + input(id='token', type="hidden", value=`${token}`) + input(id='clientId', type="hidden", value=`${clientId}`) + button(type='submit' onClick="submitForm()") Upload + +script. + function submitForm(e) { + console.log(document.getElementById("opponent_id").value) + const file = document.getElementById("file"); + const csrf_token = document.getElementById("csrf_token").value; + const team_id = document.getElementById("team_id").value; + const opponent_id = document.getElementById("opponent_id").value; + const formData = new FormData(); + formData.append("file", file.files[0]); + formData.append("team_id", team_id); + formData.append("opponent_id", opponent_id); + for (var key of formData.entries()) { + console.log(key[0] + ', ' + key[1]); + } + fetch(`/${team_id}/opponent/${opponent_id}/upload-logo`, { + method: 'POST', + body: formData, + headers: { + "X-CSRF-Token": csrf_token, + + } + }) + .then((res) => console.log(res)) + .catch((err) => ("Error occured", err)); + } + + function uploadImageForm(e) { + const file = document.getElementById("file"); + const csrf_token = document.getElementById("csrf_token").value; + const team_id = document.getElementById("team_id").value; + const opponent_id = document.getElementById("opponent_id").value; + const token = document.getElementById("token").value; + const clientId = document.getElementById("clientId").value; + const formData = new FormData(); + teamsnap.init(clientId); + teamsnap.auth(token) + console.log(teamsnap.isAuthed()) + teamsnap + .loadCollections() + .then(() => { + return teamsnap.createTeamMedium({ + file: file.files[0], + mediaFormat: "file", + memberId: member_id, + teamId: team_id, + teamMediaGroupId: "4927028", + description: `team-logo-${opponent_id}.png`, + }); + }) + .then((item) => { + return teamsnap.uploadTeamMedium(item); + }) + .then((item) => { + res.send("Data Received: " + JSON.stringify(item)); + }) + .fail((err) => console.log(err)); + } \ No newline at end of file diff --git a/views/event.pug b/views/event.pug deleted file mode 100644 index 93d9dec..0000000 --- a/views/event.pug +++ /dev/null @@ -1,46 +0,0 @@ -html - head - meta(charset='utf-8') - meta(name='viewport' content='width=device-width, initial-scale=1') - title #{event.formattedTitle} - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/font/bootstrap-icons.min.css') - link(rel='stylesheet' href='/css/teamsnap-ui.css') - body - .container - .Panel - .Panel-header - h3.Panel-title #{event.formattedTitle} - .Panel-body - .Panel-row - h6.card-text.text-muted.mb-2 - |#{event.startDate} - br - |#{event.locationName} - .Panel-row - h4 Availability - .progress - div(class="progress-bar bg-success fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerGoingCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerGoingCount} - div(class="progress-bar bg-info fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerMaybeCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerMaybeCount} - div(class="progress-bar bg-danger fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerNotGoingCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerNotGoingCount} - div(class="progress-bar text-secondary fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerUnknownCount/team.playerMemberCount)*100).toString() + "%"}; - background-color: var(--bs-gray-200)`) - |#{availabilitySummary.playerUnknownCount} - hr - div.d-flex - a(class="Button m-auto" href=`/${team_id}/event/${event.id}/lineup`) - i(class="bi bi-clipboard") - span.mx-1 Lineup - a(class="Button m-auto" href=`/${team_id}/event/${event.id}/gamecard`) - i(class="bi bi-book") - span.mx-1 Game Card - a(class="Button m-auto" href=`https://go.teamsnap.com/${team_id}/schedule/view_game/${event.id}`) - i(class="bi bi-asterisk") - span.mx-1 TeamSnap \ No newline at end of file diff --git a/views/events.pug b/views/events.pug deleted file mode 100644 index fda04df..0000000 --- a/views/events.pug +++ /dev/null @@ -1,37 +0,0 @@ -html - head - meta(charset='utf-8') - meta(name='viewport' content='width=device-width, initial-scale=1') - title BenchCoach - Teams - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/css/teamsnap-ui.css') - body - .container - .Panel - .Panel-header - .Panel-title Schedule - .Panel-body - each event in events - - var availabilitySummary = availabilitySummaries.find((a)=>a.eventId==event.id) - .Panel-row - a(class="event list-group-item" href=`/${team_id}/event/${event.id}`) - h4 #{event.formattedTitle} - p.small - | #{event.startDate.toLocaleDateString("en-us",{weekday: "short", day: "numeric",month: "short"})} - | #{event.startDate.toLocaleTimeString("en-us",{hour: "numeric", minute: "2-digit"})} - p #{event.locationName} - .progress - div(class="progress-bar bg-success fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerGoingCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerGoingCount} - div(class="progress-bar bg-info fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerMaybeCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerMaybeCount} - div(class="progress-bar bg-danger fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerNotGoingCount/team.playerMemberCount)*100).toString() + "%"}`) - |#{availabilitySummary.playerNotGoingCount} - div(class="progress-bar text-secondary fw-bold" role="progressbar" style=` - width: ${((availabilitySummary.playerUnknownCount/team.playerMemberCount)*100).toString() + "%"}; - background-color: var(--bs-gray-200)`) - |#{availabilitySummary.playerUnknownCount} - diff --git a/views/home.pug b/views/home.pug deleted file mode 100644 index e002492..0000000 --- a/views/home.pug +++ /dev/null @@ -1,29 +0,0 @@ -head - meta(charset='utf-8') - meta(name='viewport' content='width=device-width, initial-scale=1') - title BenchCoach - Home - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/css/project.css') -body.bg-light - .container - .row - .text-center.my-2 - .row - h1 - img.mx-auto(src="media/benchcoach.svg" style="width: 2.5em;") - .row - h1 - strong - | Welcome to - span.text-nowrap BenchCoach - .text-center.lead.fst-italic.fw-light - | An assistant coach for TeamSnap - .row - .col.text-center - if req.user - ul.list-group - each team in teams - a(class='team list-group-item' href=`/${team.id}`) #{team.name} [#{team.seasonName}] - else - a.btn.btn-outline-primary(href="login") - | Login \ No newline at end of file diff --git a/views/lineup.pug b/views/lineup.pug deleted file mode 100644 index 861e4d2..0000000 --- a/views/lineup.pug +++ /dev/null @@ -1,139 +0,0 @@ -html - head - meta(charset='utf-8') - title #{event.formattedTitle} - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/font/bootstrap-icons.min.css') - link(rel='stylesheet' href='/css/teamsnap-ui.css') - - body.bg-light - .container - div(style="max-width: 455px") - .Panel - .panel-header - .Panel-title #{event.formattedTitle} - .Panel-body - .Panel-row - p.text-muted.mb-2 #{event.startDate} - p #{event.locationName} - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard-check.me-1 - span Starting Lineup - .Panel-row.Grid.Grid--fit.fw-bold.text-center.u-padXs - each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] - if event_lineup_entries.map((lue)=>lue.label).includes(pos) - .Grid-cell.text-success - |#{pos} - else - .Grid-cell.text-danger - |#{pos} - each lineup_entry, i in event_lineup_entries_offense - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header.u-padXs.u-size1of12 - .u-flexAlignSelfCenter - |#{i+1} - .Panel-cell.u-padXs.u-size8of12.fw-bold.text-uppercase - if lineup_entry.availabilityStatusCode == 2 - i.bi.bi-question-circle-fill.text-info.u-spaceRightXs - else if lineup_entry.availabilityStatusCode == 1 - i.bi.bi-check-circle-fill.text-success.u-spaceRightXs - else if lineup_entry.availabilityStatusCode == 0 - i.bi.bi-x-circle-fill.text-danger.u-spaceRightXs - else - i.bi.bi-question-circle.u-spaceRightXs - |#{lineup_entry.member.lastName} - .Panel-cell.u-padXs.u-size2of12 - .SelectBox - select.SelectBox-options - each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] - option(selected=lineup_entry.label==pos) #{pos} - .Panel-cell.u-padXs.u-flexAlignSelfCenter.u-size1of12 - .drag-handle - i.bi.bi-grip-vertical.text-secondary - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard-minus.me-1 - span Starting Lineup (Position Only) - each lineup_entry, i in event_lineup_entries - if lineup_entry.label.includes("[PO]") - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header.u-padXs.u-size1of12 - .u-flexAlignSelfCenter - |#{i+1} - .Panel-cell.u-padXs.u-size8of12.fw-bold.text-uppercase - if lineup_entry.availabilityStatusCode == 2 - i.bi.bi-question-circle-fill.text-info.u-spaceRightXs - else if lineup_entry.availabilityStatusCode == 1 - i.bi.bi-check-circle-fill.text-success.u-spaceRightXs - else if lineup_entry.availabilityStatusCode == 0 - i.bi.bi-x-circle-fill.text-danger.u-spaceRightXs - else - i.bi.bi-question-circle.u-spaceRightXs - |#{lineup_entry.member.lastName} - .Panel-cell.u-padXs.u-size2of12 - .SelectBox - select.SelectBox-options - each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] - option(selected=lineup_entry.label==pos) #{pos} - .Panel-cell.u-padXs.u-flexAlignSelfCenter.u-size1of12 - .drag-handle - i.bi.bi-grip-vertical.text-secondary - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard.me-1 - span Bench - each availability, i in availabilities.filter((a)=>a.eventId==event_id && !context.event_lineup_entries.map((lue)=>lue.memberId).includes(a.memberId) && !a.member.isNonPlayer && a.statusCode!=0 && a.statusCode!==null) - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header.u-padXs.u-size1of12 - .u-flexAlignSelfCenter - .Panel-cell.u-padXs.u-size8of12.fw-bold.text-uppercase - if availability.statusCode == 2 - i.bi.bi-question-circle-fill.text-info.u-spaceRightXs - else if availability.statusCode == 1 - i.bi.bi-check-circle-fill.text-success.u-spaceRightXs - else if availability.statusCode == 0 - i.bi.bi-x-circle-fill.text-danger.u-spaceRightXs - else - i.bi.bi-question-circle.u-spaceRightXs - |#{availability.member.lastName} - .Panel-cell.u-padXs.u-size2of12 - .SelectBox - select.SelectBox-options - each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] - option #{pos} - .Panel-cell.u-padXs.u-flexAlignSelfCenter.u-size1of12 - .drag-handle - i.bi.bi-grip-vertical.text-secondary - - .Panel - .Panel-body - .Panel-row.Panel-title.u-padXs - i.bi.bi-clipboard-x.me-1 - span Out - each availability, i in availabilities.filter((a)=>a.eventId==event_id && !context.event_lineup_entries.map((lue)=>lue.memberId).includes(a.memberId) && !a.member.isNonPlayer && (a.statusCode==0 || a.statusCode===null)) - .Panel-row.Panel-row--withCells - .Panel-cell.Panel-cell--header.u-padXs.u-size1of12 - .u-flexAlignSelfCenter - .Panel-cell.u-padXs.u-size8of12.fw-bold.text-uppercase - if availability.statusCode == 2 - i.bi.bi-question-circle-fill.text-info.u-spaceRightXs - else if availability.statusCode == 1 - i.bi.bi-check-circle-fill.text-success.u-spaceRightXs - else if availability.statusCode == 0 - i.bi.bi-x-circle-fill.text-danger.u-spaceRightXs - else - i.bi.bi-question-circle.u-spaceRightXs - |#{availability.member.lastName} - .Panel-cell.u-padXs.u-size2of12 - .SelectBox - select.SelectBox-options - each pos in ["P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "EH", "DH"] - option #{pos} - .Panel-cell.u-padXs.u-flexAlignSelfCenter.u-size1of12 - .drag-handle - i.bi.bi-grip-vertical.text-secondary - diff --git a/views/login.pug b/views/login.pug deleted file mode 100644 index 8f48814..0000000 --- a/views/login.pug +++ /dev/null @@ -1,19 +0,0 @@ -html - head - meta(charset='utf-8') - meta(name='viewport' content='width=device-width, initial-scale=1') - title BenchCoach - Login - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/font/bootstrap-icons.min.css') - link(rel='stylesheet' href='/css/teamsnap-ui.css') - body - .u-padSidesMd.u-xs-padSidesLg - .Panel.u-padLg - h3 BenchCoach - p Sign in - - a(class="Button Button--large Button--orange" href="/login/federated/teamsnap") - i(class="bi bi-asterisk")/ - span Sign in with TeamSnap - - diff --git a/views/team.pug b/views/team.pug deleted file mode 100644 index 7d4d4a3..0000000 --- a/views/team.pug +++ /dev/null @@ -1,22 +0,0 @@ -html - head - meta(charset='utf-8') - meta(name='viewport' content='width=device-width, initial-scale=1') - title BenchCoach - #{team.name} - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/font/bootstrap-icons.min.css') - link(rel='stylesheet' href='/css/teamsnap-ui.css') - - body - .container - .Panel - .Panel-header - h2.Panel-title #{team.name} - p #{team.seasonName} - .Panel-body - .Panel-row - a(class="list-group-item" href=`${team.id}/events`) Events - .Panel-row - a(class="list-group-item" href=`${team.id}/roster`) Roster - .Panel-row - a(class="list-group-item" href=`${team.id}/opponents`) Opponents \ No newline at end of file diff --git a/views/teams.pug b/views/teams.pug deleted file mode 100644 index 29811b1..0000000 --- a/views/teams.pug +++ /dev/null @@ -1,14 +0,0 @@ -html - head - meta(charset='utf-8') - meta(name='viewport' content='width=device-width, initial-scale=1') - title BenchCoach - Teams - link(rel='stylesheet' href='/css/bootstrap.min.css') - link(rel='stylesheet' href='/font/bootstrap-icons.min.css') - link(rel='stylesheet' href='/css/teamsnap-ui.css') - - body - ul - each team in teams - li - a(class='team' href=`/${team.id}`) #{team.name} [#{team.seasonName}]