# Trello analytics
- Insert code to chrome dev tools while open trello
- wait for console.log "Done"
- use vars to get statistics
```javascript=
const board = await fetch(
"https://trello.com/b/gVZUCX4f/devextremegrids.json"
).then((r) => r.json());
const getDoneSprints = (board) => {
const regex = /^Done in Sprint (\d+)/;
const getSprintNumber = (card) => {
const number = regex.exec(card.name)[1];
return number;
};
return board.lists
.filter((l) => regex.exec(l.name))
.map((l) => ({
...l,
number: getSprintNumber(l),
}))
.sort((a, b) => b.number - a.number);
};
const getCardsInList = (allCards, list) => {
return allCards.filter((c) => c.idList === list.id);
};
const lists = {
dones: getDoneSprints(board),
complex: board.lists.find((l) => l.name === "Complex Bugs"),
incoming: board.lists.find((l) => l.name === "Incoming Bugs"),
bugs: board.lists.find((l) => l.name === "Bugs"),
doing: board.lists.find((l) => l.name === "Doing [7]"),
waiting: board.lists.find((l) => l.name === "Waiting [6]"),
review: board.lists.find((l) => l.name === "Review [6]"),
testing: board.lists.find((l) => l.name === "Testing [6]"),
};
for (const listName in lists) {
if (listName === "dones") {
lists[listName].cards = board.cards.filter((card) =>
lists.dones.map((l) => l.id).includes(card.idList)
);
} else {
lists[listName].cards = board.cards.filter(
(card) => card.idList === lists[listName].id && !card.closed
);
}
}
const groupByFeatures = (cards) => {
const _byCategories = {};
cards.forEach((c) => {
c.labels.forEach((l) => {
if (l.name.includes("feature")) {
_byCategories[l.name] = _byCategories[l.name] || [];
_byCategories[l.name].push(c);
}
});
});
const byCategories = Object.keys(_byCategories)
.map((k) => ({
name: k,
cards: _byCategories[k],
length: _byCategories[k].length,
}))
.sort((a, b) => b.length - a.length);
byCategories.forEach((cat) => {
const isAlpha = function (ch) {
return (
typeof ch === "string" &&
ch.length === 1 &&
((ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z"))
);
};
const name = Array.from(cat.name.replace("feature:", ""))
.filter(isAlpha)
.join("");
byCategories[name] = cat;
});
return byCategories;
};
const isActive = (card) => {
return !doneLists.map((l) => l.id).includes(card.idList);
};
const hasLabel = (label) => (card) => {
return card.labels.some((l) => l.name === label);
};
const hasNotLabel = (label) => (card) => {
return card.labels.every((l) => l.name !== label);
};
const isBug = hasLabel("Bug");
console.log("Done");
```