Skip to content

User scripts

Joern Bernhardt edited this page Jun 5, 2019 · 9 revisions

Collection of user scripts

This is a small collection of scripts to readily be used as user scripts. If you want to share something, feel free!

List all todos labeled with a specific label

const LABEL_TO_LOOK_FOR = "#bug";

const result = flattenTodos(list)
  .filter(todo => todo.labels.some(l => l === LABEL_TO_LOOK_FOR))
  .map(todo => todo.title);

console.log(result.join("\n"));

function flattenTodos(list) {
  return list.reduce(
    (all, item) => [...all, item, ...flattenTodos(item.children)],
    []
  );
}

Show all tracked times in chronological order

const history = flattenTodos(list)
  .reduce((trackedTimes, todo) => [...trackedTimes, ...todo.trackedTimes], [])
  .sort((timeA, timeB) => timeA.date.localeCompare(timeB.date))
  .reduce((acc, entry) => {
    return [
      ...acc,
      { time: timeToSeconds(entry.trackedTime), str: `${entry.tracker} - ${entry.date} - ${entry.trackedTime}` }
    ];
  }, []);

console.log(
  `Time tracked:\n${history.map(e => e.str).join("\n")}\n(in sum: ${secondsToTime(
    history.map(e => e.time).reduce((acc, e) => acc + e, 0)
  )})`
);

function secondsToTime(seconds) {
  const h = Math.floor(seconds / 60 / 60);
  const m = Math.floor((seconds % (60 * 60)) / 60);
  const s = seconds % 60;
  const nf = n => `${n < 10 ? "0" : ""}${n}`;
  return [h, m, s].map(nf).join(":");
}

function timeToSeconds(time) {
  const [hours, minutes, seconds] = time.split(":").map(num => parseInt(num));
  return hours * 60 * 60 + minutes * 60 + seconds;
}

function flattenTodos(list) {
  return list.reduce((all, item) => [...all, item, ...flattenTodos(item.children)], []);
}

Track times of all todos in a tree and return it as an alert

const result = flattenTodos(list)
  .reduce((trackedTimes, todo) => [...trackedTimes, ...todo.trackedTimes], [])
  .reduce((seconds, entry) => seconds + timeToSeconds(entry.trackedTime), 0);

alert(`Time tracked: ${secondsToTime(result)} (${result / 60 / 60 / 8} workdays [w/ 8 hours per day])`);

function secondsToTime(seconds) {
  const h = Math.floor(seconds / 60 / 60);
  const m = Math.floor((seconds % (60 * 60)) / 60);
  const s = seconds % 60;
  const nf = n => `${n < 10 ? "0" : ""}${n}`;
  return [h, m, s].map(nf).join(":");
}

function timeToSeconds(time) {
  const [hours, minutes, seconds] = time.split(":").map(num => parseInt(num));
  return hours * 60 * 60 + minutes * 60 + seconds;
}

function flattenTodos(list) {
  return list.reduce(
    (all, item) => [...all, item, ...flattenTodos(item.children)],
    []
  );
}

Onsite times

When adding "onsite": true to a tracked time, it will fall into a different bucket through this script, which alerts all resulting trackers and their respective times.

const userTimes = flattenTodos(list)
  .reduce((trackedTimes, todo) => [...trackedTimes, ...todo.trackedTimes], [])
  .reduce((acc, entry) => ({
    ...acc,
    _all: acc._all + timeToSeconds(entry.trackedTime),
    [entry.tracker]: (acc[entry.tracker] || 0) + (!entry.onsite ? timeToSeconds(entry.trackedTime) : 0),
    [entry.tracker + "-onsite"]: (acc[entry.tracker + "-onsite"] || 0) + (entry.onsite ? timeToSeconds(entry.trackedTime) : 0)
  }), {_all: 0});

const str = Object.keys(userTimes).filter(key => key !== "_all").reduce((str, name) => {
  const result = userTimes[name];
  return `${str}\n${name}: ${secondsToTime(result)} (${result / 60 / 60 / 8} workdays [w/ 8 hours per day])`
}, `Total time tracked: ${secondsToTime(userTimes._all)}\n`);

alert(`Time tracked:\n${str}`);

function secondsToTime(seconds) {
  const h = Math.floor(seconds / 60 / 60);
  const m = Math.floor((seconds % (60 * 60)) / 60);
  const s = seconds % 60;
  const nf = n => `${n < 10 ? "0" : ""}${n}`;
  return [h, m, s].map(nf).join(":");
}

function timeToSeconds(time) {
  const [hours, minutes, seconds] = time.split(":").map(num => parseInt(num));
  return hours * 60 * 60 + minutes * 60 + seconds;
}

function flattenTodos(list) {
  return list.reduce(
    (all, item) => [...all, item, ...flattenTodos(item.children)],
    []
  );
}