Skip to content

Instantly share code, notes, and snippets.

@gbrian
Created February 14, 2018 18:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gbrian/0946809ef8f4defbd51741c2077fe830 to your computer and use it in GitHub Desktop.
Save gbrian/0946809ef8f4defbd51741c2077fe830 to your computer and use it in GitHub Desktop.
function parseData(js, user){
var timeTaken = c => parseFloat((c.timeTaken ||(new Date().getTime()-Date.parse(c.data[0].date))) / 1000 / 60 / 60).toFixed(2);
var endDate = c => c.data[c.data.length-1].type == "addMemberToCard" ? "Working...": c.data[c.data.length-1].date;
return [[]].concat(js.filter(j => !j.member || j.member.id == user.id).sort((a,b) => Date.parse(a.date) - Date.parse(b.date)))
.reduce((a,b) => {
var k = b.data.card.name, card = a.find(c => c.name === k) || a[a.push(Object.assign({data:[]}, b.data.card))-1];
card.data.push(b);
if(b.type == "addMemberToCard")
card.lastJoin = b.date;
if(b.type == "removeMemberFromCard"){
if(card.lastJoin){
var taken = Date.parse(b.date) - Date.parse(card.lastJoin);
card.timeTaken = (card.timeTaken || 0) + taken;
}
}
if(b.data.list)
card.list = b.data.list.name;
return a;
})
.map(c => ({User: user.fullName, List: c.list||"", Card: "<a href='https://trello.com/c/"+c.shortLink+"'>"+c.name+"</a>", Time: timeTaken(c), Started: c.data[0].date, End: endDate(c), Attempts: c.data.length/2}))
.sort((a,b) => Date.parse(a.End) - Date.parse(b.End))
}
var def = $.Deferred();
var board = window.location.href.split("/")[4];
var promises = $.getJSON("https://trello.com/1/boards/"+board+"/members")
.then(js => {
var users = js//.filter((a,i) => i < 1);
var data = [];
users.map(j => $.getJSON("https://trello.com/1/members/"+j.id+"/actions?filter=updateCard%2CaddMemberToCard%2CremoveMemberFromCard%2CupdateMember&limit=200&display=false")
.then(js => js.filter(c => c.data.board.shortLink == board))
.then(js => data.push(parseData(_js = js, j)))
.then(ucount => {if(ucount == users.length) def.resolve(data)})
);
});
def.then(users => users.reduce((a,b) => a.concat(b)))
.then(users => ({columns: Object.keys(users[0]), users: users}))
.then(users => ({users: users.users, columns: users.columns, data: users.users.map(u => users.columns.map(k => u[k]))}))
.then(data => {
console.log(data);
$('head').append( $('<link rel="stylesheet" type="text/css" />').attr('href', '//cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css') );
$('head').append( $('<script type="text/javascript" />').attr('src', "//cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"));
$('#board').hide();
$('.board-canvas')
.css('background-color', 'gainsboro')
.css('padding', '10px')
.append("<table class='report'/>")
window.setTimeout(() => $('.report').DataTable({
data: data.data,
columns: data.columns.map(c => ({ title: c })),
pageLength: 50
}), 1000);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment