Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,11 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


# Icons

Icons published by Font-Awesome, licensed under a Creative Commons Attribution
4.0 International License; CC BY 4.0 License
(https://creativecommons.org/licenses/by/4.0/) as stated in
https://github.com/FortAwesome/Font-Awesome/blob/6.x/LICENSE.txt
1 change: 1 addition & 0 deletions public/rotate-solid.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/trash-can-solid.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions src/toggl.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,14 @@ export class TogglService {
return togglTask;
}

async track(tracking, description) {
async track(tracking) {
const togglTask = await this.addTask(tracking);

await this.#gateway.startTimeEntry(
togglTask.workspace_id,
togglTask.project_id,
togglTask.id,
description,
tracking.description,
);
}

Expand Down
67 changes: 48 additions & 19 deletions src/trello.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import { TogglGateway, TogglService } from "./toggl.js";

const withErrorMessage = async function (t, fnc) {
try {
await fnc(t);
} catch (error) {
t.alert({ message: error.message });
throw error;
}
};

const stripStoryPointsAndTaskToken = function (name) {
return name
.replace(/^(\s*\(\d+\))?\s*/, "") // story points, e.g. (3)
.replace(/\s*#\w+\s*$/, ""); // task token, e.g. #orga_5417
};

const track = async function (t) {
const token = await t.loadSecret("togglToken");
if (token === null) {
throw new Error("Toggl API Token not configured");
}

const togglGateway = new TogglGateway(token);
const togglService = new TogglService(togglGateway);

const extractTrackingData = async function (t) {
const card = await t.card("name", "labels", "idShort", "shortLink");

const projectLabels = card.labels
Expand All @@ -28,24 +29,52 @@ const track = async function (t) {
}
const project = projectLabels[0];

const tracking = {
return {
project,
task: `${project}_${card.idShort}_${card.shortLink}`,
description: stripStoryPointsAndTaskToken(card.name),
};
};

await togglService.track(tracking, stripStoryPointsAndTaskToken(card.name));
const setTrackingData = async function (t, tracking) {
await t.set("card", "shared", "tracking", tracking);
};

t.set("card", "shared", "tracking", tracking);
t.alert({ message: `Started trekking #${tracking.task}`});
const track = async function (t) {
const token = await t.loadSecret("togglToken");
if (token === null) {
throw new Error("Toggl API Token not configured");
}
const togglService = new TogglService(new TogglGateway(token));

const tracking = await extractTrackingData(t);

await togglService.track(tracking);
await setTrackingData(t, tracking);
t.alert({ message: `Started trekking #${tracking.task}` });
};

const updateTracking = async function (t) {
const tracking = await extractTrackingData(t);
await setTrackingData(t, tracking);

t.alert({ message: `Updated trekking #${tracking.task}` });
};

const deleteTracking = async function (t) {
t.remove("card", "shared", "tracking");

t.alert({ message: "Deleted trekking" });
};

export default {
track: async function (t) {
try {
await track(t);
} catch (error) {
t.alert({ message: error.message });
throw error;
}
await withErrorMessage(t, track);
},
updateTracking: async function (t) {
await withErrorMessage(t, updateTracking);
},
deleteTracking: async function (t) {
await withErrorMessage(t, deleteTracking);
},
};