diff --git a/LICENSE b/LICENSE
index 65d260d..cd00b40 100644
--- a/LICENSE
+++ b/LICENSE
@@ -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
diff --git a/public/rotate-solid.svg b/public/rotate-solid.svg
new file mode 100644
index 0000000..6e9f395
--- /dev/null
+++ b/public/rotate-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/trash-can-solid.svg b/public/trash-can-solid.svg
new file mode 100644
index 0000000..aff8dc1
--- /dev/null
+++ b/public/trash-can-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/toggl.js b/src/toggl.js
index 7a820fd..960a03d 100644
--- a/src/toggl.js
+++ b/src/toggl.js
@@ -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,
);
}
diff --git a/src/trello.js b/src/trello.js
index 2dd57ce..5732538 100644
--- a/src/trello.js
+++ b/src/trello.js
@@ -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
@@ -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);
},
};