Skip to content
This repository was archived by the owner on Nov 11, 2025. It is now read-only.

Commit e9824f6

Browse files
authored
add "Trek Now" button (#10)
1 parent f0a7591 commit e9824f6

4 files changed

Lines changed: 69 additions & 32 deletions

File tree

background.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
1-
trektor.runtime.onMessage.addListener((msg) => {
1+
trektor.runtime.onMessage.addListener(async (msg) => {
22
switch (msg.action) {
3+
case 'track':
4+
await track(...msg.args);
5+
return;
36
case 'addTask':
4-
return addTask(...msg.args);
7+
await addTask(...msg.args);
8+
return;
59
default:
6-
return Promise.reject(new Error('unknown action'));
10+
throw new Error(`unknown action: ${msg.action}`);
711
}
812
});
913

14+
async function track(cardId) {
15+
const task = await addTask(cardId);
16+
const response = await trektor.togglGateway.startTimeEntry(task.id);
17+
return response.data;
18+
}
19+
1020
async function addTask(cardId) {
1121
const card = await trektor.trelloGateway.getCard(cardId);
1222

@@ -49,7 +59,9 @@ async function addTask(cardId) {
4959
throw new Error('Found multiple matching toggl projects. Not sure how to deal with that...');
5060
}
5161
const tasks = await trektor.togglGateway.getTasks(projects[0].id);
52-
if (tasks.some((task) => task.name === taskName)) return;
62+
const task = tasks.find((task) => task.name === taskName);
63+
if (task !== undefined) return task;
5364

54-
await trektor.togglGateway.createTask(projects[0].id, taskName);
65+
const response = await trektor.togglGateway.createTask(projects[0].id, taskName)
66+
return response.data;
5567
}

content_script.js

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,45 @@
11
async function addButton() {
22
const sidebar = await awaitSelector(".window-sidebar", 10000);
3-
sidebar.querySelector(".mod-no-top-margin")?.classList?.remove("mod-no-top-margin");
4-
sidebar.querySelector(".js-sidebar-add-heading")?.classList?.remove("mod-no-top-margin");
53

6-
const button = document.createElement("span");
7-
button.classList.add("button-link");
8-
sidebar.prepend(button);
4+
const module = document.createElement("div");
5+
module.classList.add("window-module", "u-clearfix");
6+
sidebar.prepend(module);
97

10-
const buttonIcon = document.createElement("span");
11-
buttonIcon.classList.add("icon-sm", "plugin-icon");
12-
buttonIcon.innerText = "+";
13-
button.append(buttonIcon);
8+
const moduleHeading = document.createElement('h3');
9+
moduleHeading.innerText = 'Trektor';
10+
module.append(moduleHeading);
1411

15-
const buttonText = document.createElement("span");
16-
buttonText.innerText = "Toggl Task";
17-
button.append(buttonText);
12+
const buttonList = document.createElement("div");
13+
buttonList.classList.add("u-clearfix");
14+
module.append(buttonList);
1815

19-
button.addEventListener("click", async () => {
16+
const trackButton = document.createElement("span");
17+
trackButton.classList.add("button-link");
18+
buttonList.append(trackButton);
19+
20+
const trackButtonIcon = document.createElement("span");
21+
trackButtonIcon.classList.add("icon-sm", "icon-clock");
22+
trackButton.append(trackButtonIcon);
23+
24+
const trackButtonText = document.createElement("span");
25+
trackButtonText.innerText = "Trek Now";
26+
trackButton.append(trackButtonText);
27+
28+
const addButton = document.createElement("span");
29+
addButton.classList.add("button-link", "add-button-link");
30+
addButton.innerText = "Toggl Task hinzufügen";
31+
buttonList.append(addButton);
32+
33+
trackButton.addEventListener("click", async () => {
34+
const response = await trektor.runtime.sendMessage({
35+
action: 'track',
36+
args: [window.location.pathname.split('/', 3)[2]],
37+
});
38+
39+
if (response) window.alert(response);
40+
});
41+
42+
addButton.addEventListener("click", async () => {
2043
const response = await trektor.runtime.sendMessage({
2144
action: 'addTask',
2245
args: [window.location.pathname.split('/', 3)[2]],

options/script.js

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
let trelloTextField = document.querySelector("input[name='trello']");
2-
let togglTextField = document.querySelector("input[name='toggl']");
1+
const fields = document.querySelectorAll("input").forEach(async (field) => {
2+
field.addEventListener("input", (e) => {
3+
trektor.storage.set({[e.target.name]: e.target.value});
4+
});
35

4-
trelloTextField.addEventListener("input", onChange)
5-
togglTextField.addEventListener("input", onChange)
6-
7-
function onChange(e) {
8-
trektor.storage.set({[e.target.name]: e.target.value});
9-
}
10-
11-
trektor.storage.get(['trello', 'toggl']).then(result => {
12-
trelloTextField.value = result.trello;
13-
togglTextField.value = result.toggl;
14-
})
6+
const { [field.name] : value } = await trektor.storage.get(field.name);
7+
field.value = (value === undefined) ? '' : value;
8+
});

trektor.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,15 @@ class TogglGateway {
9494
}
9595

9696
createTask(projectId, name) {
97-
return this.request("post", "/tasks", { task: { name, pid: projectId } });
97+
return this.request("post", "/tasks", {
98+
task: { name, pid: projectId },
99+
});
100+
}
101+
102+
startTimeEntry(taskId) {
103+
return this.request("post", "/time_entries/start", {
104+
time_entry: { tid: taskId, created_with: "trektor" },
105+
});
98106
}
99107

100108
async request(method, path, data = null) {

0 commit comments

Comments
 (0)