diff --git a/admin/index.html b/admin/index.html index c98b5a9528af06d04e1bbf7b2b9433ec7935f380..f19fe0c12871efc80e5e687086b5b9fc5bf26719 100644 --- a/admin/index.html +++ b/admin/index.html @@ -106,21 +106,11 @@ <img height="40" style="margin: 5px;" src="res/logo/wheel.svg" id="wheel-logo" class="smooth" alt="Loading Wheel"> </div> - <ul class="nav navbar-nav navbar-left cust-menu"> + <ul class="nav navbar-nav navbar-left cust-menu pull-left"> </ul> - <ul class="nav navbar-nav navbar-right"> - <li class="dropdown"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> - <span class="glyphicon glyphicon-user" aria-hidden="true"></span> - <span class="caret"></span> - </a> - <ul class="dropdown-menu"> - <li><a href="#settings"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> Settings</a></li> - <li role="separator" class="divider"></li> - <li><a href="#" class="logoutAction"><span class="glyphicon glyphicon-off" aria-hidden="true"></span> Logout</a></li> - </ul> - </li> + <ul class="nav navbar-nav navbar-right pull-right"> + <li><a href="#" class="logoutAction"><span class="glyphicon glyphicon-off" aria-hidden="true"></span></a></li> </ul> </div> </nav> diff --git a/admin/lib/amiv/amivcore.js b/admin/lib/amiv/amivcore.js index 7d1a209abb531051b8ef4593607266401993f2b7..6509256212a1823056dec1f2dab5a19b731b08e3 100644 --- a/admin/lib/amiv/amivcore.js +++ b/admin/lib/amiv/amivcore.js @@ -1,303 +1,311 @@ (function(window) { - 'use strict'; - // Library NameSpace - var lns = 'amivcore' + 'use strict'; + // Library NameSpace + var lns = 'amivcore' - function libgen() { - // Lib to returned - var lib = {}; - - // Core - var core = { - // Important vars n' stuff - lib: { - api_url: 'https://amiv-apidev.vsos.ethz.ch', - spec_url: 'lib/amiv/spec.json', - authenticated: false, - ready: false, - req_time_out: 5000, - on_interval: 100, - show_errors: false, - }, - // Header Setup - header: { - req:{ - 'get': ['Content-Type','Authorization'], - 'post': ['Content-Type','Authorization'], - 'put': ['Content-Type','Authorization','If-Match'], - 'patch': ['Content-Type','Authorization','If-Match'], - 'delete': ['Content-Type','Authorization','If-Match'], - }, - make: { - 'Content-Type': function(){ - return 'application/json' - }, - 'Authorization': function(){ - if(get('cur_token') != null) - return 'Basic ' + btoa(get('cur_token') + ':'); - return ''; - }, - 'If-Match': function(){ - return null; - } - } - } - } - - // Utility empty function for no callback - function dummy(){}; - - //Save and get into localStorage - function set(cname, cvalue, exdays) { - window.localStorage.setItem('glob-'+cname, cvalue); - } - function get(cname) { - return window.localStorage.getItem('glob-'+cname); - } + function libgen() { + // Lib to returned + var lib = {}; - // Make Request - function req(attr, callback) { - callback = callback || function(msg) { - console.log(msg); - }; - $.ajax({ - url: core.lib.api_url + attr.path, - data: attr.data, - method: attr.method, - dataType: 'json', - timeout: core.lib.req_time_out, - headers: attr.headers, - error: function(res) { - if (core.lib.show_errors) console.log(res); - callback(res); - }, - }).done(function(res){ - callback(res); - }); - } - - function makeFunc(domain, m) { - return function(attr, callback) { - attr = attr || {}; - var curLib = {} - for (var curAttr in attr['data']) - curLib[curAttr] = attr['data'][curAttr]; + // Core + var core = { + // Important vars n' stuff + lib: { + api_url: 'https://amiv-apidev.vsos.ethz.ch', + //api_url: 'https://nicco.io/amiv', + spec_url: 'lib/amiv/spec.json', + //spec_url: 'https://nicco.io/amiv/docs/spec.json', + authenticated: false, + ready: false, + req_time_out: 5000, + on_interval: 100, + auth_interval: 5000, + auth_allowed_fails: 5, + auth_fails: 0, + show_errors: false, + }, + // Header Setup + header: { + req: { + 'get': ['Content-Type', 'Authorization'], + 'post': ['Content-Type', 'Authorization'], + 'put': ['Content-Type', 'Authorization', 'If-Match'], + 'patch': ['Content-Type', 'Authorization', 'If-Match'], + 'delete': ['Content-Type', 'Authorization', 'If-Match'], + }, + make: { + 'Content-Type': function() { + return 'application/json' + }, + 'Authorization': function() { + if (get('cur_token') != null) + return 'Basic ' + btoa(get('cur_token') + ':'); + return ''; + }, + 'If-Match': function() { + return null; + } + } + } + } - var hdr = {}; - for (var curHdr in attr['header']) - hdr[curHdr] = attr['header'][curHdr]; + // Utility empty function for no callback + function dummy() {}; - var curPath = '/' + domain; - var curLink = curPath; - if (attr['id'] != undefined) { - curPath += '/' + attr['id']; - curLink += '/{_id}'; + //Save and get into localStorage + function set(cname, cvalue, exdays) { + window.localStorage.setItem('glob-' + cname, cvalue); } - if (get('cur_token') != null) - hdr['Authorization'] = 'Basic ' + btoa(get('cur_token') + ':'); + function get(cname) { + return window.localStorage.getItem('glob-' + cname); + } - if (m != 'GET') { - if (m == 'POST' || m == 'PUT') - for (var param in lib[domain]['methods'][m][curLink]['params']) - if (lib[domain]['methods'][m][curLink]['params'][param]['required'] == true) - if (curLib[lib[domain]['methods'][m][curLink]['params'][param]['name']] == undefined) - return 'Error: Missing ' + lib[domain]['methods'][m][curLink]['params'][param]['name']; - hdr['Content-Type'] = 'application/json'; - curLib = JSON.stringify(curLib); + // Make Request + function req(attr, callback) { + callback = callback || function(msg) { + console.log(msg); + }; + $.ajax({ + url: core.lib.api_url + attr.path, + data: attr.data, + method: attr.method, + dataType: 'json', + timeout: core.lib.req_time_out, + headers: attr.headers, + error: function(res) { + if (core.lib.show_errors) console.log(res); + callback(res); + }, + }).done(function(res) { + callback(res); + }); } - req({ - path: curPath, - method: m, - data: curLib, - headers: hdr, - }, callback); - return true; - }; - } - $.ajax({ - url: core.lib.spec_url, - dataType: 'json', - timeout: 5000, - success: function(d) { - var data = d['domains']; - for (var domain in data) { - lib[domain] = {}; - lib[domain].methods = []; - for (var p in data[domain]['paths']) { - for (var m in data[domain]['paths'][p]) { - if (lib[domain].methods[m] == undefined) lib[domain].methods[m] = {}; - lib[domain].methods[m][p] = data[domain]['paths'][p][m]; - } - } - for (var m in lib[domain]['methods']) { - lib[domain][m] = makeFunc(domain, m); - } + function makeFunc(domain, m) { + return function(attr, callback) { + attr = attr || {}; + var curLib = {} + for (var curAttr in attr['data']) + curLib[curAttr] = attr['data'][curAttr]; + + var hdr = {}; + for (var curHdr in attr['header']) + hdr[curHdr] = attr['header'][curHdr]; + + var curPath = '/' + domain; + var curLink = curPath; + if (attr['id'] != undefined) { + curPath += '/' + attr['id']; + curLink += '/{_id}'; + } + + if (get('cur_token') != null) + hdr['Authorization'] = 'Basic ' + btoa(get('cur_token') + ':'); + + if (m != 'GET') { + if (m == 'POST' || m == 'PUT') + for (var param in lib[domain]['methods'][m][curLink]['params']) + if (lib[domain]['methods'][m][curLink]['params'][param]['required'] == true) + if (curLib[lib[domain]['methods'][m][curLink]['params'][param]['name']] == undefined) + return 'Error: Missing ' + lib[domain]['methods'][m][curLink]['params'][param]['name']; + hdr['Content-Type'] = 'application/json'; + curLib = JSON.stringify(curLib); + } + req({ + path: curPath, + method: m, + data: curLib, + headers: hdr, + }, callback); + return true; + }; } - checkAuth(); - }, - error: function(d) { - console.log('Cannot reach initialization spec: '+core.lib.spec_url); - console.log(d); - } - }); - function checkAuth() { - if (get('cur_token') != null) { - lib.sessions.GET({ - data: { - where: 'token==["' + get('cur_token') + '"]' - } - }, function(res) { - if (res !== undefined && res.hasOwnProperty('_items') && res['_items'].length > 0) - core.lib.authenticated = true; - else - core.lib.authenticated = false; - core.lib.ready = true; - checkAuth(); + $.ajax({ + url: core.lib.spec_url, + dataType: 'json', + timeout: 5000, + success: function(d) { + var data = d['domains']; + for (var domain in data) { + lib[domain] = {}; + lib[domain].methods = []; + for (var p in data[domain]['paths']) { + for (var m in data[domain]['paths'][p]) { + if (lib[domain].methods[m] == undefined) lib[domain].methods[m] = {}; + lib[domain].methods[m][p] = data[domain]['paths'][p][m]; + } + } + for (var m in lib[domain]['methods']) { + lib[domain][m] = makeFunc(domain, m); + } + } + checkAuth(); + }, + error: function(d) { + console.log('Cannot reach initialization spec: ' + core.lib.spec_url); + console.log(d); + } }); - } else { - core.lib.authenticated = false; - core.lib.ready = true; - checkAuth(); - } - } - - // Get the etag - lib.getEtag = function(curDomain, curId, callback) { - return lib[curDomain].GET({ - id: curId - }, function(res) { - callback(res['_etag']); - }); - } - - // Returns whether user is logged in - lib.authenticated = function() { - return core.lib.authenticated; - } - - // Login function - lib.login = function(curUser, curPass, callback) { - callback = callback || dummy; - req({ - path: '/sessions/', - method: 'POST', - data: JSON.stringify({ - user: curUser.toLowerCase(), - password: curPass - }), - headers: { - 'Content-Type': 'application/json', - }, - }, function(msg) { - var reqVar = ['token', 'user_id', 'id']; - for (var i in reqVar) { - lib['cur_' + reqVar[i]] = msg[reqVar[i]]; + + function checkAuth() { + if (get('cur_token') != null) { + lib.sessions.GET({ + data: { + where: 'token==["' + get('cur_token') + '"]' + } + }, function(res) { + if (res !== undefined && res.hasOwnProperty('_items') && res['_items'].length > 0) + core.lib.authenticated = true; + else + core.lib.authenticated = false; + core.lib.ready = true; + setTimeout(checkAuth, core.lib.auth_interval); + }); + } else { + core.lib.authenticated = false; + core.lib.ready = true; + setTimeout(checkAuth, core.lib.auth_interval); + } } - if (msg['_status'] == 'OK') { - set('cur_token_id', msg['id'], 1); - set('cur_token', msg['token'], 1); - set('cur_user_id', parseInt(msg['user_id']), 1); - callback(true); - } else { - set('cur_token_id', null); - set('cur_token', null); - set('cur_user_id', null); - callback(false); + + // Get the etag + lib.getEtag = function(curDomain, curId, callback) { + return lib[curDomain].GET({ + id: curId + }, function(res) { + callback(res['_etag']); + }); } - }); - } - // Logout - lib.logout = function() { - // Deleting token from api and unsetting the vars - lib.sessions.DELETE({id: get('cur_token_id')}, function(res){ - set('cur_token', null); - set('cur_token_id', null); - set('cur_user_id', null); - }); - } - - // Get info about the current user - lib.user = function(attr, callback) { - callback = callback || dummy; - lib.users.GET({ - id: get('cur_user_id') - }, function(res) { - if (typeof attr === 'object') { - var ret = {}; - for (var key in attr) - ret[attr[key]] = res[attr[key]]; - callback(ret); - } else { - callback(res[attr]); + // Returns whether user is logged in + lib.authenticated = function() { + return core.lib.authenticated; } - }); - } - - // Get the necessary field for specific requests - lib.getRequiredFields = function(domain, type, wId) { - var curTree; - var resAttr = {}; - if (wId) - curTree = lib[domain]['methods'][type]['/' + domain + '/{_id}']['params']; - else - curTree = lib[domain]['methods'][type]['/' + domain]['params']; - if (curTree.length == 0) return false; - else { - for (var i = 0; i < curTree.length; i++) - if (curTree[i].required == true) - resAttr[curTree[i].name] = curTree[i]; - } - return resAttr; - } - //On function - lib.on = function(trigger, callback){ - if(callback){ - lib.on_mem[trigger].callback = callback; - lib.on_mem[trigger].func(); - } - } - lib.on_mem = { - ready: { - func: function() { - if (core.lib.ready) - lib.on_mem.ready.callback(); - else setTimeout(function() { - lib.on_mem.ready.func(); - }, core.lib.on_interval); - } - }, - login: { - func: function(){ - if(core.lib.authenticated && !lib.on_mem.login.prev) - lib.on_mem.login.callback(); - lib.on_mem.login.prev = core.lib.authenticated; - setTimeout(lib.on_mem.login.func, core.lib.on_interval); - }, - prev: false, - }, - logout: { - func: function(){ - if(!core.lib.authenticated && lib.on_mem.logout.prev) - lib.on_mem.logout.callback(); - lib.on_mem.logout.prev = core.lib.authenticated; - setTimeout(lib.on_mem.logout.func, core.lib.on_interval); - }, - prev: false, - }, - } + // Login function + lib.login = function(curUser, curPass, callback) { + callback = callback || dummy; + req({ + path: '/sessions/', + method: 'POST', + data: JSON.stringify({ + user: curUser.toLowerCase(), + password: curPass + }), + headers: { + 'Content-Type': 'application/json', + }, + }, function(msg) { + var reqVar = ['token', 'user_id', 'id']; + for (var i in reqVar) { + lib['cur_' + reqVar[i]] = msg[reqVar[i]]; + } + if (msg['_status'] == 'OK') { + set('cur_token_id', msg['id'], 1); + set('cur_token', msg['token'], 1); + set('cur_user_id', parseInt(msg['user_id']), 1); + callback(true); + } else { + set('cur_token_id', null); + set('cur_token', null); + set('cur_user_id', null); + callback(false); + } + }); + } - return lib; - } + // Logout + lib.logout = function() { + // Deleting token from api and unsetting the vars + lib.sessions.DELETE({ + id: get('cur_token_id') + }, function(res) { + set('cur_token', null); + set('cur_token_id', null); + set('cur_user_id', null); + }); + } - if (typeof(window[lns]) === 'undefined') { - window[lns] = libgen(); - } else { - console.log(lns+' already defined, please solve conflict'); - } + // Get info about the current user + lib.user = function(attr, callback) { + callback = callback || dummy; + lib.users.GET({ + id: get('cur_user_id') + }, function(res) { + if (typeof attr === 'object') { + var ret = {}; + for (var key in attr) + ret[attr[key]] = res[attr[key]]; + callback(ret); + } else { + callback(res[attr]); + } + }); + } + + // Get the necessary field for specific requests + lib.getRequiredFields = function(domain, type, wId) { + var curTree; + var resAttr = {}; + if (wId) + curTree = lib[domain]['methods'][type]['/' + domain + '/{_id}']['params']; + else + curTree = lib[domain]['methods'][type]['/' + domain]['params']; + if (curTree.length == 0) return false; + else { + for (var i = 0; i < curTree.length; i++) + if (curTree[i].required == true) + resAttr[curTree[i].name] = curTree[i]; + } + return resAttr; + } + + //On function + lib.on = function(trigger, callback) { + if (callback) { + lib.on_mem[trigger].callback = callback; + lib.on_mem[trigger].func(); + } + } + lib.on_mem = { + ready: { + func: function() { + if (core.lib.ready) + lib.on_mem.ready.callback(); + else setTimeout(function() { + lib.on_mem.ready.func(); + }, core.lib.on_interval); + } + }, + login: { + func: function() { + if (core.lib.authenticated && !lib.on_mem.login.prev) + lib.on_mem.login.callback(); + lib.on_mem.login.prev = core.lib.authenticated; + setTimeout(lib.on_mem.login.func, core.lib.on_interval); + }, + prev: false, + }, + logout: { + func: function() { + if (!core.lib.authenticated && lib.on_mem.logout.prev) + lib.on_mem.logout.callback(); + lib.on_mem.logout.prev = core.lib.authenticated; + setTimeout(lib.on_mem.logout.func, core.lib.on_interval); + }, + prev: false, + }, + } + + return lib; + } + + if (typeof(window[lns]) === 'undefined') { + window[lns] = libgen(); + } else { + console.log(lns + ' already defined, please solve conflict'); + } })(window); diff --git a/admin/lib/amiv/spec.json b/admin/lib/amiv/spec.json index 671f633f5c9304b1236210a307f66386ca16960d..6dd3ffaf8f993ea8026d011db6153132f79eade1 100644 --- a/admin/lib/amiv/spec.json +++ b/admin/lib/amiv/spec.json @@ -1,2405 +1 @@ -{ - "domains": { - "files": { - "paths": { - "/files/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a File" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a File" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a File" - } - }, - "/files": { - "POST": { - "params": [ - { - "required": false, - "type": "objectid", - "name": "study_doc", - "data_relation": { - "field": "id", - "resource": "studydocuments", - "embeddable": true - } - }, - { - "name": "name", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "required": true, - "type": "media", - "name": "data" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": false, - "name": "study_doc_id", - "data_relation": { - "field": "id", - "resource": "studydocuments", - "embeddable": false - }, - "required": true, - "type": "objectid" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Create a File" - }, - "GET": { - "params": [], - "label": "Retrieve all files" - } - } - }, - "description": {} - }, - "studydocuments": { - "paths": { - "/studydocuments/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Studydocument" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "required": false, - "type": "objectid", - "name": "files", - "data_relation": { - "field": "id", - "resource": "files", - "embeddable": true - } - }, - { - "name": "name", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "name": "professor", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "name": "exam_session", - "nullable": true, - "required": false, - "maxlength": 10, - "unique": false, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "author_name", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "unique": false, - "name": "semester", - "nullable": true, - "required": false, - "type": "integer" - }, - { - "name": "department", - "nullable": true, - "required": false, - "maxlength": 4, - "unique": false, - "type": "string" - }, - { - "name": "lecture", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "name": "type", - "nullable": true, - "required": false, - "maxlength": 30, - "unique": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Update a Studydocument" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Studydocument" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Studydocument" - } - }, - "/studydocuments": { - "POST": { - "params": [ - { - "required": false, - "type": "objectid", - "name": "files", - "data_relation": { - "field": "id", - "resource": "files", - "embeddable": true - } - }, - { - "name": "name", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "name": "professor", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "name": "exam_session", - "nullable": true, - "required": false, - "maxlength": 10, - "unique": false, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "author_name", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "unique": false, - "name": "semester", - "nullable": true, - "required": false, - "type": "integer" - }, - { - "name": "department", - "nullable": true, - "required": false, - "maxlength": 4, - "unique": false, - "type": "string" - }, - { - "name": "lecture", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "name": "type", - "nullable": true, - "required": false, - "maxlength": 30, - "unique": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Create a Studydocument" - }, - "GET": { - "params": [], - "label": "Retrieve all studydocuments" - } - } - }, - "description": { - "fields": { - "semester": "Study-Semester as an Integer starting with first semester Bachelor." - }, - "general": "Study-documents are basically all documents that are connected to a course. This resource provides meta-data for the assigned files." - } - }, - "users": { - "paths": { - "/users/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a User" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "name": "legi", - "nullable": true, - "required": false, - "maxlength": 8, - "unique": true, - "type": "string" - }, - { - "unique": false, - "name": "firstname", - "maxlength": 50, - "required": true, - "type": "string" - }, - { - "required": false, - "type": "objectid", - "name": "sessions", - "data_relation": { - "field": "id", - "resource": "sessions", - "embeddable": true - } - }, - { - "required": false, - "type": "objectid", - "name": "groupmemberships", - "data_relation": { - "field": "id", - "resource": "groupusermembers", - "embeddable": true - } - }, - { - "unique": false, - "name": "lastname", - "maxlength": 50, - "required": true, - "type": "string" - }, - { - "name": "rfid", - "nullable": true, - "required": false, - "maxlength": 6, - "unique": true, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "regex": "^.+@.+$", - "name": "email", - "required": true, - "maxlength": 100, - "unique": true, - "type": "string" - }, - { - "name": "phone", - "nullable": true, - "required": false, - "maxlength": 20, - "unique": false, - "type": "string" - }, - { - "name": "membership", - "default": "none", - "required": true, - "maxlength": 13, - "unique": false, - "type": "string" - }, - { - "required": false, - "type": "objectid", - "name": "eventsignups", - "data_relation": { - "field": "id", - "resource": "eventsignups", - "embeddable": true - } - }, - { - "name": "nethz", - "nullable": true, - "required": false, - "maxlength": 30, - "unique": true, - "type": "string", - "empty": false - }, - { - "name": "gender", - "required": true, - "allowed": [ - "male", - "female" - ], - "unique": false, - "type": "string", - "maxlength": 6 - }, - { - "name": "department", - "nullable": true, - "required": false, - "allowed": [ - "itet", - "mavt" - ], - "unique": false, - "type": "string", - "maxlength": 5 - }, - { - "name": "password", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "name": "send_newsletter", - "nullable": true, - "default": true, - "required": false, - "unique": false, - "type": "boolean" - } - ], - "label": "Update a User" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a User" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a User" - } - }, - "/users/{nethz}": { - "GET": { - "params": [ - { - "name": "nethz", - "nullable": true, - "required": false, - "maxlength": 30, - "unique": true, - "type": "string", - "empty": false - } - ], - "label": "Retrieve a User" - } - }, - "/users": { - "POST": { - "params": [ - { - "name": "legi", - "nullable": true, - "required": false, - "maxlength": 8, - "unique": true, - "type": "string" - }, - { - "unique": false, - "name": "firstname", - "maxlength": 50, - "required": true, - "type": "string" - }, - { - "required": false, - "type": "objectid", - "name": "sessions", - "data_relation": { - "field": "id", - "resource": "sessions", - "embeddable": true - } - }, - { - "required": false, - "type": "objectid", - "name": "groupmemberships", - "data_relation": { - "field": "id", - "resource": "groupusermembers", - "embeddable": true - } - }, - { - "unique": false, - "name": "lastname", - "maxlength": 50, - "required": true, - "type": "string" - }, - { - "name": "rfid", - "nullable": true, - "required": false, - "maxlength": 6, - "unique": true, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "regex": "^.+@.+$", - "name": "email", - "required": true, - "maxlength": 100, - "unique": true, - "type": "string" - }, - { - "name": "phone", - "nullable": true, - "required": false, - "maxlength": 20, - "unique": false, - "type": "string" - }, - { - "name": "membership", - "default": "none", - "required": true, - "maxlength": 13, - "unique": false, - "type": "string" - }, - { - "required": false, - "type": "objectid", - "name": "eventsignups", - "data_relation": { - "field": "id", - "resource": "eventsignups", - "embeddable": true - } - }, - { - "name": "nethz", - "nullable": true, - "required": false, - "maxlength": 30, - "unique": true, - "type": "string", - "empty": false - }, - { - "name": "gender", - "required": true, - "allowed": [ - "male", - "female" - ], - "unique": false, - "type": "string", - "maxlength": 6 - }, - { - "name": "department", - "nullable": true, - "required": false, - "allowed": [ - "itet", - "mavt" - ], - "unique": false, - "type": "string", - "maxlength": 5 - }, - { - "name": "password", - "nullable": true, - "required": false, - "maxlength": 100, - "unique": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "name": "send_newsletter", - "nullable": true, - "default": true, - "required": false, - "unique": false, - "type": "boolean" - } - ], - "label": "Create a User" - }, - "GET": { - "params": [], - "label": "Retrieve all users" - } - } - }, - "description": { - "methods": { - "GET": "Authorization is required for most of the fields" - }, - "general": "In general, the user data will be generated from LDAP-Data. However, one might change the RFID-Number or the membership-status. Extraordinary members may not have a LDAP-Account and can therefore access all given fields." - } - }, - "": { - "paths": { - "/": { - "GET": {} - } - }, - "description": {} - }, - "purchases": { - "paths": { - "/purchases": { - "POST": { - "params": [ - { - "unique": false, - "name": "slot", - "nullable": true, - "required": false, - "type": "integer" - }, - { - "name": "user_id", - "nullable": true, - "required": false, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": false, - "name": "timestamp", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "type", - "nullable": true, - "required": false, - "maxlength": 5, - "unique": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Create a Purchase" - }, - "GET": { - "params": [], - "label": "Retrieve all purchases" - } - }, - "/purchases/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Purchase" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "unique": false, - "name": "slot", - "nullable": true, - "required": false, - "type": "integer" - }, - { - "name": "user_id", - "nullable": true, - "required": false, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": false, - "name": "timestamp", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "type", - "nullable": true, - "required": false, - "maxlength": 5, - "unique": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Update a Purchase" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Purchase" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Purchase" - } - } - }, - "description": { - "fields": { - "slot": "Slot in the machine which was purchased(different items, which may have different prices)." - }, - "general": "A beer machine or kaffi machine transaction. Users should be able to get beer or kaffi, if their last timestamp is older than one day and they are AMIV members. This resource is used to log their purchases." - } - }, - "docs": { - "paths": { - "/docs/": { - "GET": {} - }, - "/docs/spec.json": { - "GET": {} - } - }, - "description": {} - }, - "groupusermembers": { - "paths": { - "/groupusermembers/{_id}": { - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Groupusermember" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Groupusermember" - } - }, - "/groupusermembers": { - "POST": { - "params": [ - { - "name": "group_id", - "self_enrollment_must_be_allowed": true, - "required": true, - "unique_combination": [ - "groupusermembers", - "user_id" - ], - "data_relation": { - "field": "id", - "resource": "groups", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "user_id", - "unique_combination": [ - "groupusermembers", - "group_id" - ], - "required": true, - "only_self_enrollment_for_group": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Create a Groupusermember" - }, - "GET": { - "params": [], - "label": "Retrieve all groupusermembers" - } - } - }, - "description": { - "general": "Assignment of registered users to groups." - } - }, - "eventsignups": { - "paths": { - "/eventsignups/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Eventsignup" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "unique": false, - "name": "additional_fields", - "nullable": true, - "required": false, - "type": "json_event_field" - }, - { - "name": "user_id", - "unique_combination": [ - "eventsignups", - "event_id" - ], - "required": true, - "not_patchable": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "only_self_enrollment_for_event": true, - "unique": false, - "type": "objectid" - }, - { - "signup_requirements": true, - "name": "event_id", - "unique_combination": [ - "eventsignups", - "user_id", - "email" - ], - "required": true, - "not_patchable": true, - "data_relation": { - "field": "id", - "resource": "events", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "regex": "^.+@.+$", - "name": "email", - "email_signup_must_be_allowed": true, - "nullable": true, - "required": false, - "unique_combination": [ - "eventsignups", - "event_id" - ], - "not_patchable": true, - "maxlength": 100, - "unique": false, - "type": "objectid", - "only_anonymous": true - }, - { - "name": "_confirmed", - "nullable": true, - "default": false, - "required": false, - "unique": false, - "type": "boolean" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Update a Eventsignup" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Eventsignup" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Eventsignup" - } - }, - "/eventsignups": { - "GET": { - "params": [], - "label": "Retrieve all eventsignups" - } - } - }, - "description": { - "fields": { - "additional_fields": "Data-schema depends on 'additional_fields' from the mapped event. Please provide in json-format.", - "user_id": "To sign up as external user, set 'user_id' to '-1'", - "email": "For registered users, this is just a projection of your general email-address. External users need to provide their email here." - }, - "general": "You can signup here for an existing event inside of the registration-window. External Users can only sign up to public events." - } - }, - "static": { - "paths": { - "/static/bootstrap/{filename}": { - "GET": {} - }, - "/static/{filename}": { - "GET": {} - } - }, - "description": {} - }, - "groups": { - "paths": { - "/groups": { - "POST": { - "params": [ - { - "required": false, - "type": "objectid", - "name": "user_subscribers", - "data_relation": { - "field": "id", - "resource": "groupusermembers", - "embeddable": true - } - }, - { - "required": false, - "type": "objectid", - "name": "addresses", - "data_relation": { - "field": "id", - "resource": "forwardaddresses", - "embeddable": true - } - }, - { - "unique": true, - "name": "name", - "maxlength": 100, - "required": true, - "type": "string" - }, - { - "unique": false, - "name": "has_zoidberg_share", - "default": false, - "required": true, - "type": "boolean" - }, - { - "unique": false, - "name": "allow_self_enrollment", - "default": false, - "required": true, - "type": "boolean" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": false, - "name": "moderator_id", - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "required": true, - "type": "objectid" - }, - { - "required": false, - "type": "objectid", - "name": "owner", - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": true - } - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "unique": false, - "name": "permissions", - "nullable": true, - "required": false, - "type": "permissions_jsonschema" - } - ], - "label": "Create a Group" - }, - "GET": { - "params": [], - "label": "Retrieve all groups" - } - }, - "/groups/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Group" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "required": false, - "type": "objectid", - "name": "user_subscribers", - "data_relation": { - "field": "id", - "resource": "groupusermembers", - "embeddable": true - } - }, - { - "required": false, - "type": "objectid", - "name": "addresses", - "data_relation": { - "field": "id", - "resource": "forwardaddresses", - "embeddable": true - } - }, - { - "unique": true, - "name": "name", - "maxlength": 100, - "required": true, - "type": "string" - }, - { - "unique": false, - "name": "has_zoidberg_share", - "default": false, - "required": true, - "type": "boolean" - }, - { - "unique": false, - "name": "allow_self_enrollment", - "default": false, - "required": true, - "type": "boolean" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": false, - "name": "moderator_id", - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "required": true, - "type": "objectid" - }, - { - "required": false, - "type": "objectid", - "name": "owner", - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": true - } - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "unique": false, - "name": "permissions", - "nullable": true, - "required": false, - "type": "permissions_jsonschema" - } - ], - "label": "Update a Group" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Group" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Group" - } - } - }, - "description": { - "fields": { - "has_zoidberg_share": "Wether the group has a share in the amiv storage", - "allow_self_enrollment": "If true, the group can be seen by all users and they can subscribe themselves", - "permissions": "permissions the group grants. has to be according to the jsonschema available at /notyetavailable" - }, - "general": "This resource describes the different teams in AMIV.A group can grant API permissions and can be reached with several addresses. To see the subscriptions, have a look at '/groupusermembers'. To see the mail addresses, see '/forwardaddresses'." - } - }, - "forwardaddresses": { - "paths": { - "/forwardaddresses/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Forwardaddresse" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "name": "group_id", - "required": true, - "data_relation": { - "field": "id", - "resource": "groups", - "embeddable": false - }, - "only_groups_you_moderate": true, - "unique": false, - "type": "objectid" - }, - { - "required": false, - "type": "objectid", - "name": "group", - "data_relation": { - "field": "id", - "resource": "groups", - "embeddable": true - } - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "unique": true, - "name": "address", - "maxlength": 100, - "required": true, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - } - ], - "label": "Update a Forwardaddresse" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Forwardaddresse" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Forwardaddresse" - } - }, - "/forwardaddresses": { - "POST": { - "params": [ - { - "name": "group_id", - "required": true, - "data_relation": { - "field": "id", - "resource": "groups", - "embeddable": false - }, - "only_groups_you_moderate": true, - "unique": false, - "type": "objectid" - }, - { - "required": false, - "type": "objectid", - "name": "group", - "data_relation": { - "field": "id", - "resource": "groups", - "embeddable": true - } - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "unique": true, - "name": "address", - "maxlength": 100, - "required": true, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - } - ], - "label": "Create a Forwardaddresse" - }, - "GET": { - "params": [], - "label": "Retrieve all forwardaddresses" - } - } - }, - "description": { - "fields": { - "address": "E-Mail address to forward" - }, - "general": "An email address associated with a group. By adding an address here, all mails sent to that address will be forwarded to all members of the associated group." - } - }, - "media": { - "paths": { - "/media/{_id}": { - "GET": {} - } - }, - "description": {} - }, - "sessions": { - "paths": { - "/sessions/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Session" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "unique": false, - "name": "token", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "user_id", - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "required": true, - "type": "objectid" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Update a Session" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Session" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Session" - } - }, - "/sessions": { - "GET": { - "params": [], - "label": "Retrieve all sessions" - } - } - }, - "description": { - "methods": { - "POST": "Login and aquire a login token. Post the fields 'user' and 'password', the response will contain the token." - }, - "general": "A session is used to authenticate a user after he provided login data. To acquire a session use POST, which will give you a token to use as the user field of HTTP basic auth header with an empty password. POST requires user and password fields." - } - }, - "storage": { - "paths": { - "/storage/{filename}": { - "GET": {} - } - }, - "description": {} - }, - "joboffers": { - "paths": { - "/joboffers": { - "POST": { - "params": [ - { - "unique": false, - "name": "title_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "name": "company", - "nullable": true, - "required": false, - "maxlength": 30, - "unique": false, - "type": "string" - }, - { - "unique": false, - "name": "title_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": false, - "name": "description_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "time_end", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "logo" - }, - { - "filetype": [ - "pdf" - ], - "required": false, - "type": "media", - "name": "pdf" - }, - { - "unique": false, - "name": "description_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Create a Joboffer" - }, - "GET": { - "params": [], - "label": "Retrieve all joboffers" - } - }, - "/joboffers/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Joboffer" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "unique": false, - "name": "title_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "name": "company", - "nullable": true, - "required": false, - "maxlength": 30, - "unique": false, - "type": "string" - }, - { - "unique": false, - "name": "title_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "unique": false, - "name": "description_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "time_end", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "logo" - }, - { - "filetype": [ - "pdf" - ], - "required": false, - "type": "media", - "name": "pdf" - }, - { - "unique": false, - "name": "description_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - } - ], - "label": "Update a Joboffer" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Joboffer" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Joboffer" - } - } - }, - "description": {} - }, - "confirmations": { - "paths": { - "/confirmations": { - "POST": {} - } - }, - "description": {} - }, - "events": { - "paths": { - "/events": { - "POST": { - "params": [ - { - "unique": false, - "name": "title_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "allow_email_signup", - "default": false, - "required": true, - "type": "boolean" - }, - { - "readonly": true, - "unique": false, - "name": "signup_count", - "required": false, - "type": "string" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_thumbnail" - }, - { - "name": "time_end", - "nullable": true, - "later_than": "time_start", - "required": false, - "dependencies": [ - "time_start" - ], - "unique": false, - "type": "datetime" - }, - { - "required": false, - "type": "objectid", - "name": "signups", - "data_relation": { - "field": "id", - "resource": "eventsignups", - "embeddable": true - } - }, - { - "unique": false, - "name": "time_register_start", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "unique": false, - "name": "catchphrase_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "description_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "name": "time_register_end", - "nullable": true, - "later_than": "time_register_start", - "required": false, - "dependencies": [ - "time_register_start" - ], - "unique": false, - "type": "datetime" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_banner" - }, - { - "unique": false, - "name": "time_start", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "spots", - "min": -1, - "if_this_then": [ - "time_register_start", - "time_register_end" - ], - "required": true, - "unique": false, - "type": "integer" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "name": "location", - "nullable": true, - "required": false, - "maxlength": 50, - "unique": false, - "type": "string" - }, - { - "name": "show_infoscreen", - "nullable": true, - "default": false, - "required": false, - "unique": false, - "type": "boolean" - }, - { - "unique": false, - "name": "additional_fields", - "nullable": true, - "required": false, - "type": "json_schema" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_infoscreen" - }, - { - "name": "price", - "nullable": true, - "required": false, - "min": 0, - "unique": false, - "type": "integer" - }, - { - "unique": false, - "name": "title_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "description_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_poster" - }, - { - "name": "show_announce", - "nullable": true, - "default": false, - "required": false, - "unique": false, - "type": "boolean" - }, - { - "name": "show_website", - "nullable": true, - "default": false, - "required": false, - "unique": false, - "type": "boolean" - }, - { - "unique": false, - "name": "catchphrase_de", - "nullable": true, - "required": false, - "type": "string" - } - ], - "label": "Create a Event" - }, - "GET": { - "params": [], - "label": "Retrieve all events" - } - }, - "/events/{_id}": { - "PUT": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Replace a Event" - }, - "PATCH": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - }, - { - "unique": false, - "name": "title_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "allow_email_signup", - "default": false, - "required": true, - "type": "boolean" - }, - { - "readonly": true, - "unique": false, - "name": "signup_count", - "required": false, - "type": "string" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_thumbnail" - }, - { - "name": "time_end", - "nullable": true, - "later_than": "time_start", - "required": false, - "dependencies": [ - "time_start" - ], - "unique": false, - "type": "datetime" - }, - { - "required": false, - "type": "objectid", - "name": "signups", - "data_relation": { - "field": "id", - "resource": "eventsignups", - "embeddable": true - } - }, - { - "unique": false, - "name": "time_register_start", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "unique": false, - "name": "catchphrase_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "description_de", - "nullable": true, - "required": false, - "type": "string" - }, - { - "name": "time_register_end", - "nullable": true, - "later_than": "time_register_start", - "required": false, - "dependencies": [ - "time_register_start" - ], - "unique": false, - "type": "datetime" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_banner" - }, - { - "unique": false, - "name": "time_start", - "nullable": true, - "required": false, - "type": "datetime" - }, - { - "name": "_author", - "nullable": true, - "required": false, - "readonly": true, - "data_relation": { - "field": "id", - "resource": "users", - "embeddable": false - }, - "unique": false, - "type": "objectid" - }, - { - "name": "spots", - "min": -1, - "if_this_then": [ - "time_register_start", - "time_register_end" - ], - "required": true, - "unique": false, - "type": "integer" - }, - { - "unique": true, - "name": "id", - "required": false, - "type": "integer" - }, - { - "name": "location", - "nullable": true, - "required": false, - "maxlength": 50, - "unique": false, - "type": "string" - }, - { - "name": "show_infoscreen", - "nullable": true, - "default": false, - "required": false, - "unique": false, - "type": "boolean" - }, - { - "unique": false, - "name": "additional_fields", - "nullable": true, - "required": false, - "type": "json_schema" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_infoscreen" - }, - { - "name": "price", - "nullable": true, - "required": false, - "min": 0, - "unique": false, - "type": "integer" - }, - { - "unique": false, - "name": "title_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "unique": false, - "name": "description_en", - "nullable": true, - "required": false, - "type": "string" - }, - { - "filetype": [ - "png", - "jpeg" - ], - "required": false, - "type": "media", - "name": "img_poster" - }, - { - "name": "show_announce", - "nullable": true, - "default": false, - "required": false, - "unique": false, - "type": "boolean" - }, - { - "name": "show_website", - "nullable": true, - "default": false, - "required": false, - "unique": false, - "type": "boolean" - }, - { - "unique": false, - "name": "catchphrase_de", - "nullable": true, - "required": false, - "type": "string" - } - ], - "label": "Update a Event" - }, - "DELETE": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Delete a Event" - }, - "GET": { - "params": [ - { - "required": true, - "type": "string", - "name": "_id" - } - ], - "label": "Retrieve a Event" - } - } - }, - "description": { - "fields": { - "additional_fields": "must be provided in form of a JSON-Schema. You can add here fields you want to know from people signing up going further than their email-address", - "price": "Price of the event as Integer in Rappen.", - "allow_email_signup": "If False, only AMIV-Members can sign up for this event", - "spots": "For no limit, set to '0'. If no signup required, set to '-1'. Otherwise just provide an integer." - }, - "methods": { - "GET": "You are always allowed, even without session, to view AMIV-Events" - }, - "general": "An Event is basically everything happening in the AMIV. All time fields have the format YYYY-MM-DDThh:mmZ, e.g. 2014-12-20T11:50:06Z" - } - } - }, - "api_name": "API", - "base": "http:///", - "server_name": null -} \ No newline at end of file +{"domains":{"files":{"paths":{"/files/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a File"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a File"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a File"}},"/files":{"POST":{"params":[{"required":false,"type":"objectid","name":"study_doc","data_relation":{"field":"id","resource":"studydocuments","embeddable":true}},{"name":"name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"required":true,"type":"media","name":"data"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"study_doc_id","data_relation":{"field":"id","resource":"studydocuments","embeddable":false},"required":true,"type":"objectid"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a File"},"GET":{"params":[],"label":"Retrieve all files"}}},"description":{}},"studydocuments":{"paths":{"/studydocuments/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Studydocument"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"required":false,"type":"objectid","name":"files","data_relation":{"field":"id","resource":"files","embeddable":true}},{"name":"name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"professor","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"exam_session","nullable":true,"required":false,"maxlength":10,"unique":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"author_name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":false,"name":"semester","nullable":true,"required":false,"type":"integer"},{"name":"department","nullable":true,"required":false,"maxlength":4,"unique":false,"type":"string"},{"name":"lecture","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"type","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Studydocument"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Studydocument"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Studydocument"}},"/studydocuments":{"POST":{"params":[{"required":false,"type":"objectid","name":"files","data_relation":{"field":"id","resource":"files","embeddable":true}},{"name":"name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"professor","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"exam_session","nullable":true,"required":false,"maxlength":10,"unique":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"author_name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":false,"name":"semester","nullable":true,"required":false,"type":"integer"},{"name":"department","nullable":true,"required":false,"maxlength":4,"unique":false,"type":"string"},{"name":"lecture","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"type","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Studydocument"},"GET":{"params":[],"label":"Retrieve all studydocuments"}}},"description":{"fields":{"semester":"Study-Semester as an Integer starting with first semester Bachelor."},"general":"Study-documents are basically all documents that are connected to a course. This resource provides meta-data for the assigned files."}},"users":{"paths":{"/users/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a User"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"name":"legi","nullable":true,"required":false,"maxlength":8,"unique":true,"type":"string"},{"unique":false,"name":"firstname","maxlength":50,"required":true,"type":"string"},{"required":false,"type":"objectid","name":"sessions","data_relation":{"field":"id","resource":"sessions","embeddable":true}},{"required":false,"type":"objectid","name":"groupmemberships","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"unique":false,"name":"lastname","maxlength":50,"required":true,"type":"string"},{"name":"rfid","nullable":true,"required":false,"maxlength":6,"unique":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"regex":"^.+@.+$","name":"email","required":true,"maxlength":100,"unique":true,"type":"string"},{"name":"phone","nullable":true,"required":false,"maxlength":20,"unique":false,"type":"string"},{"name":"membership","default":"none","required":true,"maxlength":13,"unique":false,"type":"string"},{"required":false,"type":"objectid","name":"eventsignups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"name":"nethz","nullable":true,"required":false,"maxlength":30,"unique":true,"type":"string","empty":false},{"name":"gender","required":true,"allowed":["male","female"],"unique":false,"type":"string","maxlength":6},{"name":"department","nullable":true,"required":false,"allowed":["itet","mavt"],"unique":false,"type":"string","maxlength":5},{"name":"password","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"send_newsletter","nullable":true,"default":true,"required":false,"unique":false,"type":"boolean"}],"label":"Update a User"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a User"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a User"}},"/users/{nethz}":{"GET":{"params":[{"name":"nethz","nullable":true,"required":false,"maxlength":30,"unique":true,"type":"string","empty":false}],"label":"Retrieve a User"}},"/users":{"POST":{"params":[{"name":"legi","nullable":true,"required":false,"maxlength":8,"unique":true,"type":"string"},{"unique":false,"name":"firstname","maxlength":50,"required":true,"type":"string"},{"required":false,"type":"objectid","name":"sessions","data_relation":{"field":"id","resource":"sessions","embeddable":true}},{"required":false,"type":"objectid","name":"groupmemberships","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"unique":false,"name":"lastname","maxlength":50,"required":true,"type":"string"},{"name":"rfid","nullable":true,"required":false,"maxlength":6,"unique":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"regex":"^.+@.+$","name":"email","required":true,"maxlength":100,"unique":true,"type":"string"},{"name":"phone","nullable":true,"required":false,"maxlength":20,"unique":false,"type":"string"},{"name":"membership","default":"none","required":true,"maxlength":13,"unique":false,"type":"string"},{"required":false,"type":"objectid","name":"eventsignups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"name":"nethz","nullable":true,"required":false,"maxlength":30,"unique":true,"type":"string","empty":false},{"name":"gender","required":true,"allowed":["male","female"],"unique":false,"type":"string","maxlength":6},{"name":"department","nullable":true,"required":false,"allowed":["itet","mavt"],"unique":false,"type":"string","maxlength":5},{"name":"password","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"send_newsletter","nullable":true,"default":true,"required":false,"unique":false,"type":"boolean"}],"label":"Create a User"},"GET":{"params":[],"label":"Retrieve all users"}}},"description":{"methods":{"GET":"Authorization is required for most of the fields"},"general":"In general, the user data will be generated from LDAP-Data. However, one might change the RFID-Number or the membership-status. Extraordinary members may not have a LDAP-Account and can therefore access all given fields."}},"":{"paths":{"/":{"GET":{}}},"description":{}},"purchases":{"paths":{"/purchases":{"POST":{"params":[{"unique":false,"name":"slot","nullable":true,"required":false,"type":"integer"},{"name":"user_id","nullable":true,"required":false,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"timestamp","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"type","nullable":true,"required":false,"maxlength":5,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Purchase"},"GET":{"params":[],"label":"Retrieve all purchases"}},"/purchases/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Purchase"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"slot","nullable":true,"required":false,"type":"integer"},{"name":"user_id","nullable":true,"required":false,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"timestamp","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"type","nullable":true,"required":false,"maxlength":5,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Purchase"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Purchase"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Purchase"}}},"description":{"fields":{"slot":"Slot in the machine which was purchased(different items, which may have different prices)."},"general":"A beer machine or kaffi machine transaction. Users should be able to get beer or kaffi, if their last timestamp is older than one day and they are AMIV members. This resource is used to log their purchases."}},"docs":{"paths":{"/docs/":{"GET":{}},"/docs/spec.json":{"GET":{}}},"description":{}},"groupusermembers":{"paths":{"/groupusermembers/{_id}":{"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Groupusermember"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Groupusermember"}},"/groupusermembers":{"POST":{"params":[{"name":"group_id","self_enrollment_must_be_allowed":true,"required":true,"unique_combination":["groupusermembers","user_id"],"data_relation":{"field":"id","resource":"groups","embeddable":false},"unique":false,"type":"objectid"},{"name":"user_id","unique_combination":["groupusermembers","group_id"],"required":true,"only_self_enrollment_for_group":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Groupusermember"},"GET":{"params":[],"label":"Retrieve all groupusermembers"}}},"description":{"general":"Assignment of registered users to groups."}},"eventsignups":{"paths":{"/eventsignups/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Eventsignup"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"additional_fields","nullable":true,"required":false,"type":"json_event_field"},{"name":"user_id","unique_combination":["eventsignups","event_id"],"required":true,"not_patchable":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"only_self_enrollment_for_event":true,"unique":false,"type":"objectid"},{"signup_requirements":true,"name":"event_id","unique_combination":["eventsignups","user_id","email"],"required":true,"not_patchable":true,"data_relation":{"field":"id","resource":"events","embeddable":false},"unique":false,"type":"objectid"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"regex":"^.+@.+$","name":"email","email_signup_must_be_allowed":true,"nullable":true,"required":false,"unique_combination":["eventsignups","event_id"],"not_patchable":true,"maxlength":100,"unique":false,"type":"objectid","only_anonymous":true},{"name":"_confirmed","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Eventsignup"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Eventsignup"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Eventsignup"}},"/eventsignups":{"GET":{"params":[],"label":"Retrieve all eventsignups"}}},"description":{"fields":{"additional_fields":"Data-schema depends on 'additional_fields' from the mapped event. Please provide in json-format.","user_id":"To sign up as external user, set 'user_id' to '-1'","email":"For registered users, this is just a projection of your general email-address. External users need to provide their email here."},"general":"You can signup here for an existing event inside of the registration-window. External Users can only sign up to public events."}},"static":{"paths":{"/static/bootstrap/{filename}":{"GET":{}},"/static/{filename}":{"GET":{}}},"description":{}},"groups":{"paths":{"/groups":{"POST":{"params":[{"required":false,"type":"objectid","name":"user_subscribers","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"required":false,"type":"objectid","name":"addresses","data_relation":{"field":"id","resource":"forwardaddresses","embeddable":true}},{"unique":true,"name":"name","maxlength":100,"required":true,"type":"string"},{"unique":false,"name":"has_zoidberg_share","default":false,"required":true,"type":"boolean"},{"unique":false,"name":"allow_self_enrollment","default":false,"required":true,"type":"boolean"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"moderator_id","data_relation":{"field":"id","resource":"users","embeddable":false},"required":true,"type":"objectid"},{"required":false,"type":"objectid","name":"owner","data_relation":{"field":"id","resource":"users","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":false,"name":"permissions","nullable":true,"required":false,"type":"permissions_jsonschema"}],"label":"Create a Group"},"GET":{"params":[],"label":"Retrieve all groups"}},"/groups/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Group"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"required":false,"type":"objectid","name":"user_subscribers","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"required":false,"type":"objectid","name":"addresses","data_relation":{"field":"id","resource":"forwardaddresses","embeddable":true}},{"unique":true,"name":"name","maxlength":100,"required":true,"type":"string"},{"unique":false,"name":"has_zoidberg_share","default":false,"required":true,"type":"boolean"},{"unique":false,"name":"allow_self_enrollment","default":false,"required":true,"type":"boolean"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"moderator_id","data_relation":{"field":"id","resource":"users","embeddable":false},"required":true,"type":"objectid"},{"required":false,"type":"objectid","name":"owner","data_relation":{"field":"id","resource":"users","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":false,"name":"permissions","nullable":true,"required":false,"type":"permissions_jsonschema"}],"label":"Update a Group"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Group"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Group"}}},"description":{"fields":{"has_zoidberg_share":"Wether the group has a share in the amiv storage","allow_self_enrollment":"If true, the group can be seen by all users and they can subscribe themselves","permissions":"permissions the group grants. has to be according to the jsonschema available at /notyetavailable"},"general":"This resource describes the different teams in AMIV.A group can grant API permissions and can be reached with several addresses. To see the subscriptions, have a look at '/groupusermembers'. To see the mail addresses, see '/forwardaddresses'."}},"forwardaddresses":{"paths":{"/forwardaddresses/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Forwardaddresse"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"name":"group_id","required":true,"data_relation":{"field":"id","resource":"groups","embeddable":false},"only_groups_you_moderate":true,"unique":false,"type":"objectid"},{"required":false,"type":"objectid","name":"group","data_relation":{"field":"id","resource":"groups","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":true,"name":"address","maxlength":100,"required":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"}],"label":"Update a Forwardaddresse"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Forwardaddresse"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Forwardaddresse"}},"/forwardaddresses":{"POST":{"params":[{"name":"group_id","required":true,"data_relation":{"field":"id","resource":"groups","embeddable":false},"only_groups_you_moderate":true,"unique":false,"type":"objectid"},{"required":false,"type":"objectid","name":"group","data_relation":{"field":"id","resource":"groups","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":true,"name":"address","maxlength":100,"required":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"}],"label":"Create a Forwardaddresse"},"GET":{"params":[],"label":"Retrieve all forwardaddresses"}}},"description":{"fields":{"address":"E-Mail address to forward"},"general":"An email address associated with a group. By adding an address here, all mails sent to that address will be forwarded to all members of the associated group."}},"media":{"paths":{"/media/{_id}":{"GET":{}}},"description":{}},"sessions":{"paths":{"/sessions/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Session"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"token","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"user_id","data_relation":{"field":"id","resource":"users","embeddable":false},"required":true,"type":"objectid"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Session"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Session"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Session"}},"/sessions":{"GET":{"params":[],"label":"Retrieve all sessions"}}},"description":{"methods":{"POST":"Login and aquire a login token. Post the fields 'user' and 'password', the response will contain the token."},"general":"A session is used to authenticate a user after he provided login data. To acquire a session use POST, which will give you a token to use as the user field of HTTP basic auth header with an empty password. POST requires user and password fields."}},"storage":{"paths":{"/storage/{filename}":{"GET":{}}},"description":{}},"joboffers":{"paths":{"/joboffers":{"POST":{"params":[{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"name":"company","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"time_end","nullable":true,"required":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"logo"},{"filetype":["pdf"],"required":false,"type":"media","name":"pdf"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Joboffer"},"GET":{"params":[],"label":"Retrieve all joboffers"}},"/joboffers/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Joboffer"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"name":"company","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"time_end","nullable":true,"required":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"logo"},{"filetype":["pdf"],"required":false,"type":"media","name":"pdf"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Joboffer"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Joboffer"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Joboffer"}}},"description":{}},"confirmations":{"paths":{"/confirmations":{"POST":{}}},"description":{}},"events":{"paths":{"/events":{"POST":{"params":[{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"allow_email_signup","default":false,"required":true,"type":"boolean"},{"readonly":true,"unique":false,"name":"signup_count","required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_thumbnail"},{"name":"time_end","nullable":true,"later_than":"time_start","required":false,"dependencies":["time_start"],"unique":false,"type":"datetime"},{"required":false,"type":"objectid","name":"signups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"unique":false,"name":"time_register_start","nullable":true,"required":false,"type":"datetime"},{"unique":false,"name":"catchphrase_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"name":"time_register_end","nullable":true,"later_than":"time_register_start","required":false,"dependencies":["time_register_start"],"unique":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_banner"},{"unique":false,"name":"time_start","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"spots","min":-1,"if_this_then":["time_register_start","time_register_end"],"required":true,"unique":false,"type":"integer"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"location","nullable":true,"required":false,"maxlength":50,"unique":false,"type":"string"},{"name":"show_infoscreen","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"additional_fields","nullable":true,"required":false,"type":"json_schema"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_infoscreen"},{"name":"price","nullable":true,"required":false,"min":0,"unique":false,"type":"integer"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_poster"},{"name":"show_announce","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"name":"show_website","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"catchphrase_de","nullable":true,"required":false,"type":"string"}],"label":"Create a Event"},"GET":{"params":[],"label":"Retrieve all events"}},"/events/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Event"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"allow_email_signup","default":false,"required":true,"type":"boolean"},{"readonly":true,"unique":false,"name":"signup_count","required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_thumbnail"},{"name":"time_end","nullable":true,"later_than":"time_start","required":false,"dependencies":["time_start"],"unique":false,"type":"datetime"},{"required":false,"type":"objectid","name":"signups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"unique":false,"name":"time_register_start","nullable":true,"required":false,"type":"datetime"},{"unique":false,"name":"catchphrase_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"name":"time_register_end","nullable":true,"later_than":"time_register_start","required":false,"dependencies":["time_register_start"],"unique":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_banner"},{"unique":false,"name":"time_start","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"spots","min":-1,"if_this_then":["time_register_start","time_register_end"],"required":true,"unique":false,"type":"integer"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"location","nullable":true,"required":false,"maxlength":50,"unique":false,"type":"string"},{"name":"show_infoscreen","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"additional_fields","nullable":true,"required":false,"type":"json_schema"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_infoscreen"},{"name":"price","nullable":true,"required":false,"min":0,"unique":false,"type":"integer"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_poster"},{"name":"show_announce","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"name":"show_website","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"catchphrase_de","nullable":true,"required":false,"type":"string"}],"label":"Update a Event"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Event"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Event"}}},"description":{"fields":{"additional_fields":"must be provided in form of a JSON-Schema. You can add here fields you want to know from people signing up going further than their email-address","price":"Price of the event as Integer in Rappen.","allow_email_signup":"If False, only AMIV-Members can sign up for this event","spots":"For no limit, set to '0'. If no signup required, set to '-1'. Otherwise just provide an integer."},"methods":{"GET":"You are always allowed, even without session, to view AMIV-Events"},"general":"An Event is basically everything happening in the AMIV. All time fields have the format YYYY-MM-DDThh:mmZ, e.g. 2014-12-20T11:50:06Z"}}},"api_name":"API","base":"http:///","server_name":null} diff --git a/admin/lib/cust/main.css b/admin/lib/cust/main.css index 46eed464137f7895d0e7768bcb736f91e4d41462..1de6c3428b1f1670afec431a18ab3e208623f019 100644 --- a/admin/lib/cust/main.css +++ b/admin/lib/cust/main.css @@ -139,7 +139,7 @@ body { MAIN NAVBAR */ -.navbar-main .cust-menu>li { +.navbar-main .container-fluid>ul>li { float: left; } diff --git a/admin/lib/cust/main.js b/admin/lib/cust/main.js index ab4af9ad890d40e936f93794d54dc6d358a76efa..27febd792e77777f47b393aa43e894ab4b652ab7 100644 --- a/admin/lib/cust/main.js +++ b/admin/lib/cust/main.js @@ -22,18 +22,27 @@ var tools = { }, // Modal function - modalStatus: 0, + modalFunc: { + init: 0, + }, modal: function(attr) { attr = attr || {}; + if (attr.success !== undefined && typeof(attr.success) == 'function') + tools.modalFunc.success = attr.success; + if (attr.cancel !== undefined && typeof(attr.cancel) == 'function') + tools.modalFunc.cancel = attr.cancel; + if (!tools.modalFunc.init) { + $('.modalCont .modal-footer .btn-primary').click(function() { + $('.modalCont').off('hide.bs.modal').modal('hide'); + tools.modalFunc.success(); + }); + $('.modalCont').on('hide.bs.modal', tools.modalFunc.cancel); + tools.modalFunc.init = 1; + } $('.modalCont .modal-title').html(attr.head); $('.modalCont .modal-body').html(attr.body); - $('.modalCont .modal-footer .btn-primary').html(attr.button).click(function() { - $('.modalCont').off('hide.bs.modal').modal('hide'); - if (typeof(attr.success) == 'function') - attr.success(); - }); - if (typeof(attr.cancel) == 'function') - $('.modalCont').modal('show').on('hide.bs.modal', attr.cancel); + $('.modalCont .modal-footer .btn-primary').html(attr.button); + $('.modalCont').modal('show'); }, // Ajax loading gunction and getting the tools diff --git a/admin/tools/users.tool b/admin/tools/users.tool index 43ad79511ba68e22db04f5d27e0ea74addefd30c..809a9939188615e8505df6a1e273875b88ab812c 100644 --- a/admin/tools/users.tool +++ b/admin/tools/users.tool @@ -17,40 +17,98 @@ } </style> <script type="text/javascript"> + var users = { + showInTable: ['firstname', 'lastname', 'email', 'membership'], + curUserData: null, + }; + tools.ui.menu({ - 'Add User': { - callback: function() { - console.log('noice'); - } + '<span class="glyphicon glyphicon-user" aria-hidden="true"></span>': { + callback: function() {} + }, + '<span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>': { + callback: function() {} + }, + '<span class="users-cur-page" aria-hidden="true">0</span>': { + callback: function() {} + }, + '<span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>': { + callback: function() {} + }, + '<span class="glyphicon glyphicon-search" aria-hidden="true"></span>': { + callback: function() {} } }); + function inspectUser() { + var newUserData = {}; + $('.users-user-edit-table tr').each(function() { + newUserData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html(); + }); + var changed = false, + curUserDataChanged = {}; + for (var i in newUserData) { + if (newUserData[i] != String(curUserData[i])) { + changed = true; + curUserDataChanged[i] = newUserData[i]; + } + } + if (changed) { + amivcore.users.PATCH({ + id: curUserData.id, + header: { + 'If-Match': $('.users-user-edit-table').attr('data-etag') + }, + data: curUserDataChanged + }, function(){ + tools.log('User Updated', 's'); + tools.getTool('users'); + }); + } + } + function showDetails() { - console.log($(this).attr('data-id')); + amivcore.users.GET({ + id: $(this).attr('data-id') + }, function(ret) { + curUserData = ret; + var tmp = '<table class="table table-hover users-user-edit-table" data-etag="' + ret['_etag'] + '"><tbody>'; + for (var cur in ret) + if (cur.charAt(0) != '_') + tmp += '<tr><td>' + cur + '</td><td contenteditable>' + ret[cur] + '</td></tr>' + tmp += '</tbody></table>'; + + tools.modal({ + head: ret.firstname + ' ' + ret.lastname, + body: tmp, + button: 'OK', + success: inspectUser, + cancel: function() { + console.log('Canceled'); + } + }); + + });; } - var showInTable = ['firstname', 'lastname', 'email', 'membership'], - curData = null; amivcore.users.GET({ data: { - 'max_results': '50' + //'max_results': '50' } }, function(ret) { - if (!ret || ret['_items'].length == 0) { + if (ret === undefined || ret['_items'].length == 0) { tools.log('No Data', 'w'); return; } - curData = ret['_items']; - - showInTable.forEach(function(i) { + users.showInTable.forEach(function(i) { $('.users-table thead tr').append('<th>' + i + '</th>'); }); for (var n in ret['_items']) { var tmp = ''; - showInTable.forEach(function(i) { + users.showInTable.forEach(function(i) { tmp += '<td>' + ret['_items'][n][i] + '</td>'; }); $('.users-table tbody').append('<tr data-id="' + ret['_items'][n]['id'] + '">' + tmp + '</tr>'); diff --git a/public/css/cards.css b/public/css/cards.css index b09fe4253ab2e3808a8050937168bbfaf98f3bd1..f107a1611485a3fe96ff55e0a04667d6d868b5dd 100644 --- a/public/css/cards.css +++ b/public/css/cards.css @@ -12,8 +12,9 @@ #cardtitle.card span.card-title { color: #E8452B; font-size: 24px; - font-weight: 300; + font-weight: bold; text-transform: uppercase; + } .card .card-image { @@ -26,6 +27,7 @@ position: relative; z-index: -1; width: 100%; + min-height: 180px; } .card .card-image span.card-title { position: absolute; @@ -37,7 +39,7 @@ width: 100%; background: rgba(100%, 100%, 100%, 0.5); text-transform: uppercase; - font-weight: 300; + font-weight: bold; } .card .card-content { padding: 16px; diff --git a/public/css/logo-nav.css b/public/css/logo-nav.css index 99c822cc24be429e100b79acf4c1dbcddb126b43..fb83c60c3ff3d17f80837d56c726ff421d0247a2 100644 --- a/public/css/logo-nav.css +++ b/public/css/logo-nav.css @@ -24,4 +24,4 @@ body { .navbar-fixed-top .navbar-brand { padding: 20px 0; } -} \ No newline at end of file +} diff --git a/public/index.html b/public/index.html index ee48ca8d7df9c7922ce68a4b26fe8e3f59aac33f..441fd699ad5b689048eb8560531f54845acc88ec 100644 --- a/public/index.html +++ b/public/index.html @@ -48,7 +48,7 @@ </a> </div> <!-- Collect the nav links, forms, and other content for toggling --> - <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <div class="collapse navbar-collapse nav-collapse collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li> <a href="#">Home</a> @@ -62,12 +62,6 @@ <li> <a href="#">Jobbörse</a> </li> - <form class="navbar-form navbar-left" role="search"> - <div class="form-group"> - <input type="text" class="form-control" placeholder="Search"> - </div> - <button type="submit" class="btn btn-default">Search</button> - </form> </ul> </div> <!-- /.navbar-collapse --> @@ -78,6 +72,18 @@ <div class="container-fluid"> <div class="grid"> <div class="grid-sizer"></div> + <div class="grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2"> + <div class="card"> + <p> + <a data-chrome="noheader" class="twitter-timeline" href="https://twitter.com/AMIV_ETHZ/amiv" data-widget-id="389682176024784896"> + Tweets from @AMIV_ETHZ + </a> + </p> + <script type="text/javascript"> + !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs"); + </script> + </div> + </div> </div> </div> @@ -91,8 +97,7 @@ function addElement(item) { $('.grid') - .append('<div class="grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2">' + item + '</div>') - .masonry('reloadItems').masonry(); + .append('<div class="grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2">' + item + '</div>'); } $(document).ready(function() { @@ -101,76 +106,48 @@ itemSelector: '.grid-item', columnWidth: '.grid-sizer', percentPosition: true - }); + }).on('DOMSubtreeModified', function(){ + $(this).masonry('reloadItems').masonry(); + }) getEvents(function(ret) { ret['_items'].forEach(function(item) { + /*Is it Websitecontent?*/ + if (item.show_website == false){ + return; + } console.log(item.title_de); - if ( item.img_banner == null){ - item.img_banner = item.img_infoscreen; + + /*Picture Checker*/ + if (item.img_banner == null){ + item.img_banner = "https://s-media-cache-ak0.pinimg.com/736x/9c/24/fd/9c24fdb71c67e31efef540efb141f96d.jpg"; } + /* Datum anpassen*/ var datenum = new Date(item.time_start); - + var + var regend = new Date(item.time_start); + /*Minuten immer Zweistellig*/ var minutes = datenum.getMinutes(); if (minutes < 10){ minutes = "0" + minutes; } - var month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] + var month = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]; - addElement('<div class="card"><div class="card-image"><img class="img-responsive" src="'+item.img_banner+'"><date><div class="month">'+month[datenum.getMonth()]+'</div><div class="day">'+datenum.getDate()+'</div><div class="starttime">'+datenum.getHours()+':'+minutes+'</div><date-overlay></date-overlay></date><span class="card-title">'+item.title_de+' @ '+item.location+'</span></div><div class="card-content">'+item.description_de+'</div><div class="card-action"><a href="#" target="new_blank">Zum Event</a><a href="#" target="new_blank">Anmeldung</a><a href="#" target="new_blank">Im Kalender speichern</a></div></div>'); + /*Anmeldung*/ + var register = ""; + if (item.spot < 0){ + register = ""; + } + if (amivcore.authenticated() && item.spot >= 0){ + if(item.time_start < Tod) + } + addElement('<div class="card"><div class="card-image"><img class="img-responsive" src="'+item.img_banner+'"><date><div class="month">'+month[datenum.getMonth()]+'</div><div class="day">'+datenum.getDate()+'</div><div class="starttime">'+datenum.getHours()+':'+minutes+'</div><date-overlay></date-overlay></date><span class="card-title">'+item.title_de+' @ '+item.location+'</span></div><div class="card-content">'+item.description_de+'</div><div class="card-action"><a href="#" target="new_blank">Zum Event</a><a href="#" target="new_blank">'+register+'</a><a href="#" target="new_blank">Im Kalender speichern</a></div></div>'); }); }); }); </script> - -<!-- - <script> - $(function() { - var container = document.createElement('div'); - container.id = "card"; - $('grid').append(container); - - /*Date*/ - $(".month").append("October"); - $(".day").append("42"); - $(".starttime").append("18:00 - 20:00"); - - /*Visible Content*/ - $(".card-title").html("Jarcakebakery @ FoodLab"); //Title and Location - $(".card-content").append("<p>This is the best event like ever! You can bake some jarcakes and eat the afterwards all by yourself.</p>"); //content - $(".card-action").append(); //Links - $(".img-responsive").attr("src", "http://cdn0.wideopencountry.com/wp-content/uploads/2015/07/JamCheesecakesInAJarTall-793x526.png"); //image - - $('#card').append(html); - }); - </script> ---> - -<!-- - <div class="col-xs-12 col-md-4 col-lg-3"> - <div class="card card-1"> - <div class="card-image"> - <img class="img-responsive"> - <date> - <div class="month"></div> - <div class="day"></div> - <div class="starttime"></div> - <date-overlay></date-overlay> - </date> - <span class="card-title"></span> - </div> - - <div class="card-content"></div> - - <div class="card-action"> - <a href="#" target="new_blank">Zum Event</a> - <a href="#" target="new_blank">Anmeldung</a> - <a href="#" target="new_blank">Im Kalender speichern</a> - </div> - </div> - </div> ---> +<script src="js/main.js"></script> </body> </html> diff --git a/public/js/main.js b/public/js/main.js index d8af2b5d0e7020b29ed4088395a5c2165af38771..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,536 +0,0 @@ -(function(root, factory) { - if(typeof exports === 'object') { - module.exports = factory(); - } - else if(typeof define === 'function' && define.amd) { - define('salvattore', [], factory); - } - else { - root.salvattore = factory(); - } -}(this, function() { -/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */ - -window.matchMedia || (window.matchMedia = function() { - "use strict"; - - // For browsers that support matchMedium api such as IE 9 and webkit - var styleMedia = (window.styleMedia || window.media); - - // For those that don't support matchMedium - if (!styleMedia) { - var style = document.createElement('style'), - script = document.getElementsByTagName('script')[0], - info = null; - - style.type = 'text/css'; - style.id = 'matchmediajs-test'; - - script.parentNode.insertBefore(style, script); - - // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers - info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle; - - styleMedia = { - matchMedium: function(media) { - var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; - - // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers - if (style.styleSheet) { - style.styleSheet.cssText = text; - } else { - style.textContent = text; - } - - // Test if media query is true or false - return info.width === '1px'; - } - }; - } - - return function(media) { - return { - matches: styleMedia.matchMedium(media || 'all'), - media: media || 'all' - }; - }; -}()); -;/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */ -(function(){ - // Bail out for browsers that have addListener support - if (window.matchMedia && window.matchMedia('all').addListener) { - return false; - } - - var localMatchMedia = window.matchMedia, - hasMediaQueries = localMatchMedia('only all').matches, - isListening = false, - timeoutID = 0, // setTimeout for debouncing 'handleChange' - queries = [], // Contains each 'mql' and associated 'listeners' if 'addListener' is used - handleChange = function(evt) { - // Debounce - clearTimeout(timeoutID); - - timeoutID = setTimeout(function() { - for (var i = 0, il = queries.length; i < il; i++) { - var mql = queries[i].mql, - listeners = queries[i].listeners || [], - matches = localMatchMedia(mql.media).matches; - // Update mql.matches value and call listeners - // Fire listeners only if transitioning to or from matched state - if (matches !== mql.matches) { - mql.matches = matches; - - for (var j = 0, jl = listeners.length; j < jl; j++) { - listeners[j].call(window, mql); - } - } - } - }, 30); - }; - - window.matchMedia = function(media) { - var mql = localMatchMedia(media), - listeners = [], - index = 0; - - mql.addListener = function(listener) { - // Changes would not occur to css media type so return now (Affects IE <= 8) - if (!hasMediaQueries) { - return; - } - - // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8) - // There should only ever be 1 resize listener running for performance - if (!isListening) { - isListening = true; - window.addEventListener('resize', handleChange, true); - } - - // Push object only if it has not been pushed already - if (index === 0) { - index = queries.push({ - mql : mql, - listeners : listeners - }); - } - - listeners.push(listener); - }; - - mql.removeListener = function(listener) { - for (var i = 0, il = listeners.length; i < il; i++){ - if (listeners[i] === listener){ - listeners.splice(i, 1); - } - } - }; - - return mql; - }; -}()); -;// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ -// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - -// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel - -// MIT license - -(function() { - var lastTime = 0; - var vendors = ['ms', 'moz', 'webkit', 'o']; - for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { - window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; - window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] - || window[vendors[x]+'CancelRequestAnimationFrame']; - } - - if (!window.requestAnimationFrame) - window.requestAnimationFrame = function(callback, element) { - var currTime = new Date().getTime(); - var timeToCall = Math.max(0, 16 - (currTime - lastTime)); - var id = window.setTimeout(function() { callback(currTime + timeToCall); }, - timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - - if (!window.cancelAnimationFrame) - window.cancelAnimationFrame = function(id) { - clearTimeout(id); - }; -}()); -;var salvattore = (function (global, document, undefined) { -"use strict"; - -var self = {}, - grids = [], - add_to_dataset = function(element, key, value) { - // uses dataset function or a fallback for <ie10 - if (element.dataset) { - element.dataset[key] = value; - } else { - element.setAttribute("data-" + key, value); - } - return; - }; - -self.obtain_grid_settings = function obtain_grid_settings(element) { - // returns the number of columns and the classes a column should have, - // from computing the style of the ::before pseudo-element of the grid. - - var computedStyle = global.getComputedStyle(element, ":before") - , content = computedStyle.getPropertyValue("content").slice(1, -1) - , matchResult = content.match(/^\s*(\d+)(?:\s?\.(.+))?\s*$/) - , numberOfColumns - , columnClasses - ; - - if (matchResult) { - numberOfColumns = matchResult[1]; - columnClasses = matchResult[2]; - columnClasses = columnClasses? columnClasses.split(".") : ["column"]; - } else { - matchResult = content.match(/^\s*\.(.+)\s+(\d+)\s*$/); - columnClasses = matchResult[1]; - numberOfColumns = matchResult[2]; - if (numberOfColumns) { - numberOfColumns = numberOfColumns.split("."); - } - } - - return { - numberOfColumns: numberOfColumns, - columnClasses: columnClasses - }; -}; - - -self.add_columns = function add_columns(grid, items) { - // from the settings obtained, it creates columns with - // the configured classes and adds to them a list of items. - - var settings = self.obtain_grid_settings(grid) - , numberOfColumns = settings.numberOfColumns - , columnClasses = settings.columnClasses - , columnsItems = new Array(+numberOfColumns) - , columnsFragment = document.createDocumentFragment() - , i = numberOfColumns - , selector - ; - - while (i-- !== 0) { - selector = "[data-columns] > *:nth-child(" + numberOfColumns + "n-" + i + ")"; - columnsItems.push(items.querySelectorAll(selector)); - } - - columnsItems.forEach(function append_to_grid_fragment(rows) { - var column = document.createElement("div") - , rowsFragment = document.createDocumentFragment() - ; - - column.className = columnClasses.join(" "); - - Array.prototype.forEach.call(rows, function append_to_column(row) { - rowsFragment.appendChild(row); - }); - column.appendChild(rowsFragment); - columnsFragment.appendChild(column); - }); - - grid.appendChild(columnsFragment); - add_to_dataset(grid, 'columns', numberOfColumns); -}; - - -self.remove_columns = function remove_columns(grid) { - // removes all the columns from a grid, and returns a list - // of items sorted by the ordering of columns. - - var range = document.createRange(); - range.selectNodeContents(grid); - - var columns = Array.prototype.filter.call(range.extractContents().childNodes, function filter_elements(node) { - return node instanceof global.HTMLElement; - }); - - var numberOfColumns = columns.length - , numberOfRowsInFirstColumn = columns[0].childNodes.length - , sortedRows = new Array(numberOfRowsInFirstColumn * numberOfColumns) - ; - - Array.prototype.forEach.call(columns, function iterate_columns(column, columnIndex) { - Array.prototype.forEach.call(column.children, function iterate_rows(row, rowIndex) { - sortedRows[rowIndex * numberOfColumns + columnIndex] = row; - }); - }); - - var container = document.createElement("div"); - add_to_dataset(container, 'columns', 0); - - sortedRows.filter(function filter_non_null(child) { - return !!child; - }).forEach(function append_row(child) { - container.appendChild(child); - }); - - return container; -}; - - -self.recreate_columns = function recreate_columns(grid) { - // removes all the columns from the grid, and adds them again, - // it is used when the number of columns change. - - global.requestAnimationFrame(function render_after_css_media_query_change() { - self.add_columns(grid, self.remove_columns(grid)); - }); -}; - - -self.media_query_change = function media_query_change(mql) { - // recreates the columns when a media query matches the current state - // of the browser. - - if (mql.matches) { - Array.prototype.forEach.call(grids, self.recreate_columns); - } -}; - - -self.get_css_rules = function get_css_rules(stylesheet) { - // returns a list of css rules from a stylesheet - - var cssRules; - try { - cssRules = stylesheet.sheet.cssRules || stylesheet.sheet.rules; - } catch (e) { - return []; - } - - return cssRules || []; -}; - - -self.get_stylesheets = function get_stylesheets() { - // returns a list of all the styles in the document (that are accessible). - - return Array.prototype.concat.call( - Array.prototype.slice.call(document.querySelectorAll("style[type='text/css']")), - Array.prototype.slice.call(document.querySelectorAll("link[rel='stylesheet']")) - ); -}; - - -self.media_rule_has_columns_selector = function media_rule_has_columns_selector(rules) { - // checks if a media query css rule has in its contents a selector that - // styles the grid. - - var i = rules.length - , rule - ; - - while (i--) { - rule = rules[i]; - if (rule.selectorText && rule.selectorText.match(/\[data-columns\](.*)::?before$/)) { - return true; - } - } - - return false; -}; - - -self.scan_media_queries = function scan_media_queries() { - // scans all the stylesheets for selectors that style grids, - // if the matchMedia API is supported. - - - var mediaQueries = []; - - if (!global.matchMedia) { - return; - } - - self.get_stylesheets().forEach(function extract_rules(stylesheet) { - Array.prototype.forEach.call(self.get_css_rules(stylesheet), function filter_by_column_selector(rule) { - if (rule.media && self.media_rule_has_columns_selector(rule.cssRules)) { - mediaQueries.push(global.matchMedia(rule.media.mediaText)); - } - }); - }); - - mediaQueries.forEach(function listen_to_changes(mql) { - mql.addListener(self.media_query_change); - }); -}; - - -self.next_element_column_index = function next_element_column_index(grid, fragments) { - // returns the index of the column where the given element must be added. - - var children = grid.children - , m = children.length - , lowestRowCount = 0 - , child - , currentRowCount - , i - , index = 0 - ; - for (i = 0; i < m; i++) { - child = children[i]; - currentRowCount = child.children.length + fragments[i].children.length; - if(lowestRowCount === 0) { - lowestRowCount = currentRowCount; - } - if(currentRowCount < lowestRowCount) { - index = i; - lowestRowCount = currentRowCount; - } - } - - return index; -}; - - -self.create_list_of_fragments = function create_list_of_fragments(quantity) { - // returns a list of fragments - - - var fragments = new Array(quantity) - , i = 0 - ; - - while (i !== quantity) { - fragments[i] = document.createDocumentFragment(); - i++; - } - - return fragments; -}; - - -self.append_elements = function append_elements(grid, elements) { - // adds a list of elements to the end of a grid - var columns = grid.children - , numberOfColumns = columns.length - , fragments = self.create_list_of_fragments(numberOfColumns) - ; - - elements.forEach(function append_to_next_fragment(element) { - var columnIndex = self.next_element_column_index(grid, fragments); - fragments[columnIndex].appendChild(element); - }); - - Array.prototype.forEach.call(columns, function insert_column(column, index) { - column.appendChild(fragments[index]); - }); -}; - - -self.prepend_elements = function prepend_elements(grid, elements) { - // adds a list of elements to the start of a grid - - var columns = grid.children - , numberOfColumns = columns.length - , fragments = self.create_list_of_fragments(numberOfColumns) - , columnIndex = numberOfColumns - 1 - ; - - elements.forEach(function append_to_next_fragment(element) { - var fragment = fragments[columnIndex]; - fragment.insertBefore(element, fragment.firstChild); - if (columnIndex === 0) { - columnIndex = numberOfColumns - 1; - } else { - columnIndex--; - } - }); - - Array.prototype.forEach.call(columns, function insert_column(column, index) { - column.insertBefore(fragments[index], column.firstChild); - }); - - // populates a fragment with n columns till the right - var fragment = document.createDocumentFragment() - , numberOfColumnsToExtract = elements.length % numberOfColumns - ; - - while (numberOfColumnsToExtract-- !== 0) { - fragment.appendChild(grid.lastChild); - } - - // adds the fragment to the left - grid.insertBefore(fragment, grid.firstChild); -}; - - -self.register_grid = function register_grid (grid) { - if (global.getComputedStyle(grid).display === "none") { - return; - } - - // retrieve the list of items from the grid itself - var range = document.createRange(); - range.selectNodeContents(grid); - - var items = document.createElement("div"); - items.appendChild(range.extractContents()); - - - add_to_dataset(items, 'columns', 0); - self.add_columns(grid, items); - grids.push(grid); -}; - - -self.init = function init() { - // adds required CSS rule to hide 'content' based - // configuration. - - var css = document.createElement("style"); - css.innerHTML = "[data-columns]::before{visibility:hidden;position:absolute;font-size:1px;}"; - document.head.appendChild(css); - - // scans all the grids in the document and generates - // columns from their configuration. - - var gridElements = document.querySelectorAll("[data-columns]"); - Array.prototype.forEach.call(gridElements, self.register_grid); - self.scan_media_queries(); -}; - - -self.init(); - -return { - append_elements: self.append_elements, - prepend_elements: self.prepend_elements, - register_grid: self.register_grid -}; - -})(window, window.document); - - return salvattore; -})); - - function append(title, content){ - var grid = document.querySelector('#columns'); - var item = document.createElement('div'); - var h = '<div class="panel panel-primary">'; - h += '<div class="panel-heading">'; - h += title; - h += '</div>'; - h += '<div class="panel-body">'; - h += content; - h += '</div>'; - h += '</div>'; - salvattore['append_elements'](grid, [item]) - item.outerHTML = h; - } - - $.getJSON("https://www.googleapis.com/books/v1/volumes?q=inauthor:Ernest+Hemingway&callback=?", function(data){ - $(data.items).each(function(i,book){ - append(i +'. '+ book.volumeInfo.title, book.volumeInfo.description); - }); - }); \ No newline at end of file