Author: smaisonneuve Date: 2015-04-27 08:32:41 +0000 (Mon, 27 Apr 2015) New Revision: 1254 Url: http://forge.nuiton.org/projects/sandbox/repository/revisions/1254 Log: [Wit] - Create pages and services packages Added: wit/js/pages/ wit/js/pages/Rapport.js wit/js/pages/Timer.js wit/js/pages/UserActivity.js wit/js/services/ wit/js/services/TimerService.js wit/js/services/UserActivityService.js wit/js/services/database.js Removed: wit/js/Rapport.js wit/js/Timer.js wit/js/TimerService.js wit/js/UserActivity.js wit/js/UserActivityService.js wit/js/database.js Modified: wit/index.html wit/js/components/FilterBar.js wit/js/main.js Modified: wit/index.html =================================================================== --- wit/index.html 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/index.html 2015-04-27 08:32:41 UTC (rev 1254) @@ -14,9 +14,9 @@ <script type="text/jsx" src="js/components/FilterBar.js"></script> <script type="text/jsx" src="js/components/FilterLogs.js"></script> <script type="text/jsx" src="js/components/Timeline.js"></script> - <script type="text/jsx" src="js/Timer.js"></script> - <script type="text/jsx" src="js/Rapport.js"></script> - <script type="text/jsx" src="js/UserActivity.js"></script> + <script type="text/jsx" src="js/pages/Timer.js"></script> + <script type="text/jsx" src="js/pages/Rapport.js"></script> + <script type="text/jsx" src="js/pages/UserActivity.js"></script> <script type="text/jsx" src="js/main.js"></script> <!-- For Less --> Deleted: wit/js/Rapport.js =================================================================== --- wit/js/Rapport.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/Rapport.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -1,21 +0,0 @@ -/** @jsx React.DOM */ - -var Rapport = React.createClass({ - - getInitialState : function() { - return {result: []}; - }, - - handleSearchResult: function(result) { - this.setState({result: result}); - }, - - render: function() { - return ( - <div> - <FilterBar onSearchResult={this.handleSearchResult}/> - <FilterLogs data={this.state.result}/> - </div> - ); - } -}); Deleted: wit/js/Timer.js =================================================================== --- wit/js/Timer.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/Timer.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -1,13 +0,0 @@ -/** @jsx React.DOM */ - -var Timer = React.createClass({ - render: function() { - return ( - <div> - <Time /> - <Tags /> - <ActionsBar /> - </div> - ); - } -}); Deleted: wit/js/TimerService.js =================================================================== --- wit/js/TimerService.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/TimerService.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -1,106 +0,0 @@ -var moment = require('moment'); -var db = require("./database.js"); -var x11 = require('x11'); - -var events = require('events'); -var eventEmitter = new events.EventEmitter(); - -var TIME_IDLE = 4 * 1000; - -var tags = ["wit", "js", "dev"]; -var time = null; -var idleTime = null; -var deltaIdle = 0; - -var updateUserIdleTime = function() { - x11.createClient(function(err, display) { - var X = display.client; - X.require('screen-saver', function(err, SS) { - SS.QueryInfo(display.screen[0].root, function(err, info) { - console.log('Idle time ' + info.idle + "ms"); - - if (info.idle >= TIME_IDLE) { - idleTime = idleTime || new Date(); - eventEmitter.emit('onIdle'); - } - }); - }); - X.on('error', console.error); - }); -}; - -exports.start = function() { - time = new Date(); - timeChange(); -}; - -exports.stop = function() { - if (time) { - db.insertLog(tags, time, idleTime || new Date()); - time = null; - idleTime = null; - deltaIdle = 0; - timeChange(); - } -}; - -exports.getTime = function() { - if (time) { - var start = idleTime ? moment(idleTime) : moment(); - var diff = moment(start.diff(time) + deltaIdle).utcOffset(0); - return diff.format("HH:mm:ss"); - } -}; - -exports.getIdle = function() { - if (idleTime) { - var diff = moment(moment().diff(time) + deltaIdle).utcOffset(0); - return diff.format("HH:mm:ss"); - } -}; - -exports.getTags = function() { - return tags; -}; - -exports.addTag = function(tag) { - tags.push(tag); -}; - -exports.removeTag = function(index) { - tags.splice(index, 1); -}; - -var timeChangeTimer = null; - -var timeChange = function() { - clearTimeout(timeChangeTimer); - - eventEmitter.emit('onTimeChanged'); - if (time) { - timeChangeTimer = setTimeout(timeChange.bind(), 1000); - - //updateUserIdleTime(); - } -}; - -exports.subscribeTimeChanged = function(callback) { - eventEmitter.on('onTimeChanged', callback); -}; - -exports.subscribeIdle = function(callback) { - eventEmitter.on('onIdle', callback); -}; - -exports.keepTime = function() { - var old = deltaIdle + moment(idleTime).diff(time); - - exports.stop(); - exports.start(); - - deltaIdle = old; -}; - -exports.keepIdle = function() { - idleTime = null; -}; Deleted: wit/js/UserActivity.js =================================================================== --- wit/js/UserActivity.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/UserActivity.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -1,13 +0,0 @@ -/** @jsx React.DOM */ - -var UserActivity = React.createClass({ - - render: function() { - return ( - <div className="userActivity"> - <h1> What the hell did i do today ? </h1> - <Timeline /> - </div> - ); - } -}); \ No newline at end of file Deleted: wit/js/UserActivityService.js =================================================================== --- wit/js/UserActivityService.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/UserActivityService.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -1,128 +0,0 @@ -var x11 = require('x11'); -var xprop = require('xprop'); -var moment = require('moment'); - -var windowSessions = []; - -const _NET_ACTIVE_WINDOW = 334; - -exports.getSessions = function (startDate, endDate) { - var result = windowSessions, m; - - if (startDate) { - m = moment(startDate); - result = result.filter(function(s) { - return m.isBefore(s.endDate); - }); - } - - if (endDate) { - m = moment(endDate); - result = result.filter(function(s) { - return m.isAfter(s.startDate); - }); - } - - return result; -} - -/* Inspired by : -http://stackoverflow.com/questions/19840459/linux-get-notification-on-focuse... window-change/19847998#19847998 -*/ -x11.createClient(function(err, display) { - var X = display.client; - - X.ChangeWindowAttributes(display.screen[0].root, { - eventMask:x11.eventMask.PropertyChange - }); - - // Init windows session with the currently active window - - updateWindowSessions(X, display.screen[0].root) - - // Listen to client display events to identify when the currently active window has change - - X.on('event', onActiveWindowChange.bind(null, X)); -}); - - -var onActiveWindowChange = function (X, ev) { - if(ev.name == 'PropertyNotify') { - - X.GetAtomName(ev.atom, function(err, name) { - - // if the property change refers to the currently active window, retrieve new active window name - - if (name == '_NET_ACTIVE_WINDOW') { - updateWindowSessions(X, ev.wid) - } - }); - } -}; - -var updateWindowSessions = function (X, wid) { - return getWindowId(X, wid) - .then(getWindowName) - .then(createNewSession); -}; - -var getWindowId = function (X, wid) { - return new Promise(function (resolve, reject) { - - X.GetProperty(0, wid, _NET_ACTIVE_WINDOW, X.atoms.WINDOW, 0, 4, function(err, prop) { - if (err) { - - console.log("Couldn't retrieve active window property"); - reject(); - - } else { - - resolve(prop.data.readUInt32LE(0)); - - } - }); - }); -} - -var getWindowName = function (windowId) { - return new Promise(function (resolve, reject) { - - xprop({prop:'_NET_WM_NAME', id:windowId}, function(err, properties) { - - if (err) { - - console.log("Couldn't retrieve window name for id :", windowId); - reject(); - - } else { - - resolve(properties.length && properties[0].value); - - } - }); - }); -}; - -var createNewSession = function (windowName) { - if (windowSessions.length) { - var now = Date.now(); - var last = windowSessions[windowSessions.length - 1]; - last.endDate = moment(); - last.duration = last.endDate.diff(last.startDate); - } - - // Check if a session corresponding to the given name already exists, - // so that we can retrieve some properties - - var prev = getSessionByName(windowName); - - windowSessions.push({ - name: windowName, - color: prev && prev.color || "#" + (Math.floor(Math.random() * (999 - 100 + 1)) + 100), - startDate: moment() - }); -}; - -var getSessionByName = function (name) { - return windowSessions.filter(function (s) { return s.name == name })[0]; -}; \ No newline at end of file Modified: wit/js/components/FilterBar.js =================================================================== --- wit/js/components/FilterBar.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/components/FilterBar.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -19,7 +19,7 @@ onSearch: function() { var self = this; var moment = require('moment'); - var db = require("./js/database.js"); + var db = require("./js/services/database.js"); var beginDate = moment(React.findDOMNode(this.refs.beginDate).value).toDate(); var endDate = moment(React.findDOMNode(this.refs.endDate).value).toDate(); Deleted: wit/js/database.js =================================================================== --- wit/js/database.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/database.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -1,36 +0,0 @@ -var Datastore = require('nedb'); -var db = new Datastore(); - -exports.insertLog = function (tags, startDate, endDate) { - return new Promise(function(resolve, reject) { - db.insert({ - tags: tags, - startDate: startDate.getTime(), - endDate: endDate.getTime() - }, function(err, newDocs) { - if (!err) { - resolve(newDocs); - } else { - reject(err); - } - }); - }); -}; - -exports.searchLogs = function (tags, startDate, endDate) { - var query = {}; - - if (tags) { query.tags = { $in: tags }; } - if (startDate) { query.startDate = { $gte: startDate.getTime() } } - if (endDate) { query.endDate = { $lte: endDate.getTime() } } - - return new Promise(function(resolve, reject) { - db.find(query, function(err, docs) { - if (!err) { - resolve(docs); - } else { - reject(err); - } - }); - }); -}; Modified: wit/js/main.js =================================================================== --- wit/js/main.js 2015-04-27 08:05:13 UTC (rev 1253) +++ wit/js/main.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -9,9 +9,9 @@ global.navigator = window.navigator; var React = require('react'); -var timer = require('./js/TimerService.js'); +var timer = require('./js/services/TimerService.js'); var Router = require('react-router'); -var user = require('./js/UserActivityService.js'); +var user = require('./js/services/UserActivityService.js'); var DefaultRoute = Router.DefaultRoute; var Link = Router.Link; Copied: wit/js/pages/Rapport.js (from rev 1253, wit/js/Rapport.js) =================================================================== --- wit/js/pages/Rapport.js (rev 0) +++ wit/js/pages/Rapport.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -0,0 +1,21 @@ +/** @jsx React.DOM */ + +var Rapport = React.createClass({ + + getInitialState : function() { + return {result: []}; + }, + + handleSearchResult: function(result) { + this.setState({result: result}); + }, + + render: function() { + return ( + <div> + <FilterBar onSearchResult={this.handleSearchResult}/> + <FilterLogs data={this.state.result}/> + </div> + ); + } +}); Copied: wit/js/pages/Timer.js (from rev 1253, wit/js/Timer.js) =================================================================== --- wit/js/pages/Timer.js (rev 0) +++ wit/js/pages/Timer.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -0,0 +1,13 @@ +/** @jsx React.DOM */ + +var Timer = React.createClass({ + render: function() { + return ( + <div> + <Time /> + <Tags /> + <ActionsBar /> + </div> + ); + } +}); Copied: wit/js/pages/UserActivity.js (from rev 1253, wit/js/UserActivity.js) =================================================================== --- wit/js/pages/UserActivity.js (rev 0) +++ wit/js/pages/UserActivity.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -0,0 +1,13 @@ +/** @jsx React.DOM */ + +var UserActivity = React.createClass({ + + render: function() { + return ( + <div className="userActivity"> + <h1> What the hell did i do today ? </h1> + <Timeline /> + </div> + ); + } +}); \ No newline at end of file Copied: wit/js/services/TimerService.js (from rev 1253, wit/js/TimerService.js) =================================================================== --- wit/js/services/TimerService.js (rev 0) +++ wit/js/services/TimerService.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -0,0 +1,106 @@ +var moment = require('moment'); +var db = require("./database.js"); +var x11 = require('x11'); + +var events = require('events'); +var eventEmitter = new events.EventEmitter(); + +var TIME_IDLE = 4 * 1000; + +var tags = ["wit", "js", "dev"]; +var time = null; +var idleTime = null; +var deltaIdle = 0; + +var updateUserIdleTime = function() { + x11.createClient(function(err, display) { + var X = display.client; + X.require('screen-saver', function(err, SS) { + SS.QueryInfo(display.screen[0].root, function(err, info) { + console.log('Idle time ' + info.idle + "ms"); + + if (info.idle >= TIME_IDLE) { + idleTime = idleTime || new Date(); + eventEmitter.emit('onIdle'); + } + }); + }); + X.on('error', console.error); + }); +}; + +exports.start = function() { + time = new Date(); + timeChange(); +}; + +exports.stop = function() { + if (time) { + db.insertLog(tags, time, idleTime || new Date()); + time = null; + idleTime = null; + deltaIdle = 0; + timeChange(); + } +}; + +exports.getTime = function() { + if (time) { + var start = idleTime ? moment(idleTime) : moment(); + var diff = moment(start.diff(time) + deltaIdle).utcOffset(0); + return diff.format("HH:mm:ss"); + } +}; + +exports.getIdle = function() { + if (idleTime) { + var diff = moment(moment().diff(time) + deltaIdle).utcOffset(0); + return diff.format("HH:mm:ss"); + } +}; + +exports.getTags = function() { + return tags; +}; + +exports.addTag = function(tag) { + tags.push(tag); +}; + +exports.removeTag = function(index) { + tags.splice(index, 1); +}; + +var timeChangeTimer = null; + +var timeChange = function() { + clearTimeout(timeChangeTimer); + + eventEmitter.emit('onTimeChanged'); + if (time) { + timeChangeTimer = setTimeout(timeChange.bind(), 1000); + + //updateUserIdleTime(); + } +}; + +exports.subscribeTimeChanged = function(callback) { + eventEmitter.on('onTimeChanged', callback); +}; + +exports.subscribeIdle = function(callback) { + eventEmitter.on('onIdle', callback); +}; + +exports.keepTime = function() { + var old = deltaIdle + moment(idleTime).diff(time); + + exports.stop(); + exports.start(); + + deltaIdle = old; +}; + +exports.keepIdle = function() { + idleTime = null; +}; Copied: wit/js/services/UserActivityService.js (from rev 1253, wit/js/UserActivityService.js) =================================================================== --- wit/js/services/UserActivityService.js (rev 0) +++ wit/js/services/UserActivityService.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -0,0 +1,128 @@ +var x11 = require('x11'); +var xprop = require('xprop'); +var moment = require('moment'); + +var windowSessions = []; + +const _NET_ACTIVE_WINDOW = 334; + +exports.getSessions = function (startDate, endDate) { + var result = windowSessions, m; + + if (startDate) { + m = moment(startDate); + result = result.filter(function(s) { + return m.isBefore(s.endDate); + }); + } + + if (endDate) { + m = moment(endDate); + result = result.filter(function(s) { + return m.isAfter(s.startDate); + }); + } + + return result; +} + +/* Inspired by : +http://stackoverflow.com/questions/19840459/linux-get-notification-on-focuse... window-change/19847998#19847998 +*/ +x11.createClient(function(err, display) { + var X = display.client; + + X.ChangeWindowAttributes(display.screen[0].root, { + eventMask:x11.eventMask.PropertyChange + }); + + // Init windows session with the currently active window + + updateWindowSessions(X, display.screen[0].root) + + // Listen to client display events to identify when the currently active window has change + + X.on('event', onActiveWindowChange.bind(null, X)); +}); + + +var onActiveWindowChange = function (X, ev) { + if(ev.name == 'PropertyNotify') { + + X.GetAtomName(ev.atom, function(err, name) { + + // if the property change refers to the currently active window, retrieve new active window name + + if (name == '_NET_ACTIVE_WINDOW') { + updateWindowSessions(X, ev.wid) + } + }); + } +}; + +var updateWindowSessions = function (X, wid) { + return getWindowId(X, wid) + .then(getWindowName) + .then(createNewSession); +}; + +var getWindowId = function (X, wid) { + return new Promise(function (resolve, reject) { + + X.GetProperty(0, wid, _NET_ACTIVE_WINDOW, X.atoms.WINDOW, 0, 4, function(err, prop) { + if (err) { + + console.log("Couldn't retrieve active window property"); + reject(); + + } else { + + resolve(prop.data.readUInt32LE(0)); + + } + }); + }); +} + +var getWindowName = function (windowId) { + return new Promise(function (resolve, reject) { + + xprop({prop:'_NET_WM_NAME', id:windowId}, function(err, properties) { + + if (err) { + + console.log("Couldn't retrieve window name for id :", windowId); + reject(); + + } else { + + resolve(properties.length && properties[0].value); + + } + }); + }); +}; + +var createNewSession = function (windowName) { + if (windowSessions.length) { + var now = Date.now(); + var last = windowSessions[windowSessions.length - 1]; + last.endDate = moment(); + last.duration = last.endDate.diff(last.startDate); + } + + // Check if a session corresponding to the given name already exists, + // so that we can retrieve some properties + + var prev = getSessionByName(windowName); + + windowSessions.push({ + name: windowName, + color: prev && prev.color || "#" + (Math.floor(Math.random() * (999 - 100 + 1)) + 100), + startDate: moment() + }); +}; + +var getSessionByName = function (name) { + return windowSessions.filter(function (s) { return s.name == name })[0]; +}; \ No newline at end of file Copied: wit/js/services/database.js (from rev 1253, wit/js/database.js) =================================================================== --- wit/js/services/database.js (rev 0) +++ wit/js/services/database.js 2015-04-27 08:32:41 UTC (rev 1254) @@ -0,0 +1,36 @@ +var Datastore = require('nedb'); +var db = new Datastore(); + +exports.insertLog = function (tags, startDate, endDate) { + return new Promise(function(resolve, reject) { + db.insert({ + tags: tags, + startDate: startDate.getTime(), + endDate: endDate.getTime() + }, function(err, newDocs) { + if (!err) { + resolve(newDocs); + } else { + reject(err); + } + }); + }); +}; + +exports.searchLogs = function (tags, startDate, endDate) { + var query = {}; + + if (tags) { query.tags = { $in: tags }; } + if (startDate) { query.startDate = { $gte: startDate.getTime() } } + if (endDate) { query.endDate = { $lte: endDate.getTime() } } + + return new Promise(function(resolve, reject) { + db.find(query, function(err, docs) { + if (!err) { + resolve(docs); + } else { + reject(err); + } + }); + }); +};