UNPKG

timers3000

Version:

Provides a graphical interface in your browser to create and manage incremental timers for your daily tasks.

245 lines (216 loc) 6.49 kB
var sessionsArr = []; var dataArray = []; var locked = true; var socket = io.connect(window.location.hostname); xcol = ['x']; sess = ['Timer']; avgs = ['Average']; scale = 1; interval = 34146000 /** * Gets called when the statistics page is loaded * Starts the chart-creating chain of doom */ function c3Chart(){ constructDataArrays(interval); scale = getScale(sessionsArr); chart = c3.generate({ bindto: '#chart_div', data: { x: 'x', columns: [xcol,sess, avgs], types: { Timer: 'area', Average: 'line' }, }, axis : { x : { label : 'Sessiondate', type : 'timeseries', tick : { format: function (d) { return (d.getDate() + "." + (d.getMonth()+1)); }} }, y : { label : generateTitle(scale) } }, grid: { x: { show: true }, y: { show: true } } }); } function constructDataArrays(interval){ var limit = moment().subtract('days', interval); console.log(limit._d); scale = getScale(sessionsArr); for (var i = sessionsArr.length - 1; i >= 0; i--) { var d = new Date(parseInt(sessionsArr[i].date)) if(d > limit._d){ xcol.push(d); time = (Math.round((sessionsArr[i].time / scale )* 100)) / 100; sess.push(time); } }; for (var i = 1; i < sess.length; i++) { if(d > limit._d){ var arr = sess.slice(1,i+1); var avg = calcAverage(arr); avgs.push(avg); } }; } function getScale(array){ var max = 0; var result = 1; for (var i = 0; i < array.length; i++) { max = Math.max(parseInt(array[i].time),max); }; if(max > 120) result = 60; if(max > 7200) result = 3600; generateTitle(result); return result; } function sumTimes(array){ var result = 0; for (var i = 0; i < array.length; i++) { result += array[i]; }; return result; } /** * Artefact from googlechart */ function handleOverEvent(id){ //var i = getIndexOfSession(id) //if(chart) chart.setSelection([{'row' : (sessionsArr.length-1-i)}]); } function getIndexOfSession(id){ for (var i = 0; i < sessionsArr.length; i++) { if(sessionsArr[i].id === id) return i; } } function generateTitle(_scale){ var result = ''; if(_scale === 3600) result += 'Hours'; if(_scale === 60) result += 'Minutes'; return result; } function calcAverage(arr){ var result = Math.round(sumTimes(arr) * 100 / arr.length)/100; return result; } function updateValueLabel(newValue, sessionId){ document.getElementById(sessionId).innerHTML = convertSeconds(newValue); } function changeValue(newValue, sessionId){ if(locked){ updateValueLocally(newValue, sessionId); }else{ showSpinner(); socket.emit("updateSessionTime", sessionId, newValue, function(){ updateValueLocally(newValue, sessionId) hideSpinner(); }); } } function updateValueLocally(newValue, sessionId){ document.getElementById(sessionId).innerHTML = convertSeconds(newValue); var i = getIndexOfSession(sessionId); console.log(i); //Change value sess[sessionsArr.length-i] = parseInt(newValue)/scale; //assign new average for (var j = sessionsArr.length-i; j < avgs.length; j++) { avgs[j] = calcAverage(sess.slice(1,j+1)); }; sessionsArr[i].time = newValue; chart.load({ columns: [xcol,sess, avgs]}); } function deleteSession(id){ if(locked){ deleteSessionLocal(id) }else{ showSpinner(); socket.emit("deleteSession",id,function(){ deleteSessionLocal(id); hideSpinner(); }); } } function deleteSessionLocal(id){ var i = getIndexOfSession(id); sess.splice(sessionsArr.length-i, 1); avgs.splice(sessionsArr.length-i, 1); xcol.splice(sessionsArr.length-i, 1); sessionsArr.splice(i, 1); chart.load({ columns: [xcol,sess, avgs]}); var row = document.getElementById(id+"_row"); row.parentNode.removeChild(row); } function limitSessions(_interval){ //Reset buttons var b1 = document.getElementById("intervalbutton_all"); b1.className = "btn btn-info intervalbutton pull-right"; var b2 = document.getElementById("intervalbutton_7"); b2.className = "btn btn-info intervalbutton pull-right"; var b3 = document.getElementById("intervalbutton_30"); b3.className = "btn btn-info intervalbutton pull-right"; interval = _interval; switch(interval){ case 7: b2.className = "btn btn-warning intervalbutton pull-right";break; case 30: b3.className = "btn btn-warning intervalbutton pull-right";break; case 34146000: b1.className = "btn btn-warning intervalbutton pull-right";break; } xlen = xcol.length //Clear arrays xcol = ['x']; sess = ['Timer']; avgs = ['Average']; //Construct new data constructDataArrays(interval); diff = xlen - xcol.length; //Reload data chart.load({ columns: [xcol, sess, avgs]}); //delete first (diff-1) sessions from view list = document.getElementById("sessionscontainer"); blist = document.getElementById("mergebuttonscontainer"); for (var i = 0; i < diff; i++) { list.removeChild(list.lastChild); if(i % 2 == 1) blist.removeChild(blist.lastChild); }; } function mergeSessions(btn){ //Calc new time and assign it to the graph var id = parseInt(btn.getAttribute("value")); var newtime = parseInt(sessionsArr[id].time) + parseInt(sessionsArr[id+1].time); sessionsArr[id+1].time = newtime; changeValue(newtime, sessionsArr[id+1].id); deleteSession(sessionsArr[id].id); //Update value in sessionslist document.getElementById(sessionsArr[id].id).innerHTML = convertSeconds(newtime); //Remove extra merge buttons var sessionscontainer = document.getElementById("sessionscontainer"); if(sessionscontainer.children.length % 2 == 1){ var buttonscontainer = document.getElementById("mergebuttonscontainer"); buttonscontainer.removeChild(buttonscontainer.lastChild); } } function lockUnlockStatistics(btn){ console.log(); locknote = document.getElementById("locknote"); if(locked){ locked = false; locknote.parentNode.className = "btn btn-danger pull-right" locknote.innerHTML = "Unlocked"; }else{ locked = true; locknote.parentNode.className = "btn btn-success pull-right" locknote.innerHTML = "Locked"; } }