From a099056fa5fcc6e072afd766da626e3c3a986c79 Mon Sep 17 00:00:00 2001 From: OrangeII Date: Wed, 9 Jul 2025 18:45:14 +0200 Subject: [PATCH 01/44] add basic custom report --- .../src/common/charts.mockdata.ts | 7140 +++++++++++++++++ frontend/simple-tracker/src/common/charts.ts | 133 + .../src/components/AppNavigation.vue | 9 + .../src/components/charts/AppNewChart.vue | 132 + 4 files changed, 7414 insertions(+) create mode 100644 frontend/simple-tracker/src/common/charts.mockdata.ts create mode 100644 frontend/simple-tracker/src/common/charts.ts create mode 100644 frontend/simple-tracker/src/components/charts/AppNewChart.vue diff --git a/frontend/simple-tracker/src/common/charts.mockdata.ts b/frontend/simple-tracker/src/common/charts.mockdata.ts new file mode 100644 index 0000000..3eed8b1 --- /dev/null +++ b/frontend/simple-tracker/src/common/charts.mockdata.ts @@ -0,0 +1,7140 @@ +import type { DataPoint } from "./charts"; + +export const data: DataPoint[] = [ + { + time_entry_id: 1, + time_entry_notes: null, + task_id: "task_id_1", + start_time: 1739105604344, + end_time: 1739105605364, + task_name: "Finance & Accounting", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1019, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 2, + time_entry_notes: null, + task_id: "task_id_2", + start_time: 1739105608159, + end_time: 1739105608938, + task_name: "Code Review", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 778, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 3, + time_entry_notes: null, + task_id: "task_id_3", + start_time: 1739105612134, + end_time: 1739105613249, + task_name: "Documentation", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1115, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 4, + time_entry_notes: null, + task_id: "task_id_4", + start_time: 1739105616083, + end_time: 1739105616826, + task_name: "Customer Support", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 742, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 5, + time_entry_notes: null, + task_id: "task_id_5", + start_time: 1739105620201, + end_time: 1739105621096, + task_name: "Client Meeting", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 894, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 6, + time_entry_notes: null, + task_id: "task_id_6", + start_time: 1739105624710, + end_time: 1739105625450, + task_name: "Team Stand-up", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 739, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 7, + time_entry_notes: null, + task_id: "task_id_7", + start_time: 1739105629134, + end_time: 1739105637299, + task_name: "Bug Fixing", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 8164, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 8, + time_entry_notes: null, + task_id: "task_id_8", + start_time: 1739105641241, + end_time: 1739105642283, + task_name: "Development", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1041, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 9, + time_entry_notes: null, + task_id: "task_id_9", + start_time: 1739105644879, + end_time: 1739105645932, + task_name: "Marketing Campaign", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1052, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 10, + time_entry_notes: null, + task_id: "task_id_10", + start_time: 1739105648774, + end_time: 1739105653759, + task_name: "HR & Recruiting", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4985, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 11, + time_entry_notes: null, + task_id: "task_id_11", + start_time: 1739105656473, + end_time: 1739107942155, + task_name: "Testing", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2285681, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 12, + time_entry_notes: null, + task_id: "task_id_12", + start_time: 1739107947196, + end_time: 1739108581686, + task_name: "Sales Call", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 634490, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 13, + time_entry_notes: null, + task_id: "task_id_13", + start_time: 1739108588529, + end_time: 1739109523417, + task_name: "Project Management", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 934888, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 14, + time_entry_notes: null, + task_id: "task_id_14", + start_time: 1739109536552, + end_time: 1739110217478, + task_name: "Research", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 680926, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 15, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739114139555, + end_time: 1739116214894, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2075338, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 16, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1741678269166, + end_time: 1741679557631, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1288465, + weekday: 2, + month: 3, + year: 2025, + }, + { + time_entry_id: 16, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1741678269166, + end_time: 1741679557631, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1288465, + weekday: 2, + month: 3, + year: 2025, + }, + { + time_entry_id: 17, + time_entry_notes: null, + task_id: "task_id_17", + start_time: 1741775196498, + end_time: 1741781207133, + task_name: "Training & Development", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 6010635, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 18, + time_entry_notes: null, + task_id: "task_id_17", + start_time: 1741783774132, + end_time: 1741784917987, + task_name: "Training & Development", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 1143855, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 19, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742409830212, + end_time: 1742419517066, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 9686854, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 20, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739116932704, + end_time: 1739116966109, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 33405, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 21, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1741855933952, + end_time: 1741856963453, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1029501, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 22, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739116979520, + end_time: 1739117029915, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 50395, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 23, + time_entry_notes: null, + task_id: "task_id_19", + start_time: 1741998284520, + end_time: 1742026345581, + task_name: "Operations", + tag_id: "tag_id_5", + tag_name: "non-billable", + tag_color: "#3e3d85", + tag_dot_text: null, + duration: 28061061, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 24, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742057161141, + end_time: 1742071538997, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 14377856, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 25, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742542744634, + end_time: 1742544243913, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1499279, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 25, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742542744634, + end_time: 1742544243913, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1499279, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 26, + time_entry_notes: null, + task_id: "task_id_20", + start_time: 1742637884238, + end_time: 1742644907962, + task_name: "Content Creation", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 7023724, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 26, + time_entry_notes: null, + task_id: "task_id_20", + start_time: 1742637884238, + end_time: 1742644907962, + task_name: "Content Creation", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 7023724, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 27, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739117202356, + end_time: 1739117302226, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 99869, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 28, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742734583220, + end_time: 1742740381870, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 5798650, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 29, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739117331840, + end_time: 1739117649895, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 318054, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 30, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1743012432312, + end_time: 1743013097764, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 665452, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 31, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739117690196, + end_time: 1739117980110, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 289913, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 32, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1743321153099, + end_time: 1743321945045, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 791946, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 33, + time_entry_notes: null, + task_id: "task_id_21", + start_time: 1743358143123, + end_time: 1743358148640, + task_name: "Anonymized Task 1", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 5517, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 34, + time_entry_notes: null, + task_id: "task_id_22", + start_time: 1739119767795, + end_time: 1739119770057, + task_name: "Anonymized Task 2", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2262, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 35, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739119772515, + end_time: 1739119774206, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1691, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 36, + time_entry_notes: null, + task_id: "task_id_23", + start_time: 1739119994720, + end_time: 1739119996876, + task_name: "Anonymized Task 3", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2155, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 37, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739120007953, + end_time: 1739120013187, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 5234, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 38, + time_entry_notes: null, + task_id: "task_id_23", + start_time: 1739120013732, + end_time: 1739120269277, + task_name: "Anonymized Task 3", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 255545, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 39, + time_entry_notes: null, + task_id: "task_id_24", + start_time: 1739120395851, + end_time: 1739120397060, + task_name: "Anonymized Task 4", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1208, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 40, + time_entry_notes: null, + task_id: "task_id_15", + start_time: 1739120863096, + end_time: 1739120864426, + task_name: "Design", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1329, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 41, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1743588118332, + end_time: 1743588964113, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 845781, + weekday: 3, + month: 4, + year: 2025, + }, + { + time_entry_id: 42, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1743926174536, + end_time: 1743926930630, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 756094, + weekday: 0, + month: 4, + year: 2025, + }, + { + time_entry_id: 43, + time_entry_notes: null, + task_id: "task_id_23", + start_time: 1739121795611, + end_time: 1739121802752, + task_name: "Anonymized Task 3", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7140, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 44, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1744534612479, + end_time: 1744535582773, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 970294, + weekday: 0, + month: 4, + year: 2025, + }, + { + time_entry_id: 45, + time_entry_notes: null, + task_id: "task_id_25", + start_time: 1739125901895, + end_time: 1739125921570, + task_name: "Anonymized Task 5", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 19674, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 46, + time_entry_notes: null, + task_id: "task_id_25", + start_time: 1739125925719, + end_time: 1739126071016, + task_name: "Anonymized Task 5", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 145296, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 47, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745304033862, + end_time: 1745305306043, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1272181, + weekday: 2, + month: 4, + year: 2025, + }, + { + time_entry_id: 47, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745304033862, + end_time: 1745305306043, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1272181, + weekday: 2, + month: 4, + year: 2025, + }, + { + time_entry_id: 48, + time_entry_notes: null, + task_id: "task_id_26", + start_time: 1739126170944, + end_time: 1739126229843, + task_name: "Anonymized Task 6", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 58899, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 49, + time_entry_notes: null, + task_id: "task_id_27", + start_time: 1739126518652, + end_time: 1739126524709, + task_name: "Anonymized Task 7", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 6056, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 50, + time_entry_notes: null, + task_id: "task_id_27", + start_time: 1739126572982, + end_time: 1739126580850, + task_name: "Anonymized Task 7", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7868, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 51, + time_entry_notes: null, + task_id: "task_id_28", + start_time: 1739127138050, + end_time: 1739135029333, + task_name: "Anonymized Task 8", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7891283, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 52, + time_entry_notes: null, + task_id: "task_id_29", + start_time: 1739174823587, + end_time: 1739180813163, + task_name: "Anonymized Task 9", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 5989575, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 53, + time_entry_notes: null, + task_id: "task_id_30", + start_time: 1739180819296, + end_time: 1739180955179, + task_name: "Anonymized Task 10", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 135883, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 54, + time_entry_notes: null, + task_id: "task_id_31", + start_time: 1739180959558, + end_time: 1739182037984, + task_name: "Anonymized Task 11", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1078426, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 55, + time_entry_notes: null, + task_id: "task_id_31", + start_time: 1739182042465, + end_time: 1739182633555, + task_name: "Anonymized Task 11", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 591089, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 56, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1745569721979, + end_time: 1745570913266, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1191287, + weekday: 5, + month: 4, + year: 2025, + }, + { + time_entry_id: 57, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745822100861, + end_time: 1745823457266, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1356405, + weekday: 1, + month: 4, + year: 2025, + }, + { + time_entry_id: 57, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745822100861, + end_time: 1745823457266, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1356405, + weekday: 1, + month: 4, + year: 2025, + }, + { + time_entry_id: 58, + time_entry_notes: null, + task_id: "task_id_32", + start_time: 1739183358469, + end_time: 1739189693132, + task_name: "Anonymized Task 12", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 6334663, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 59, + time_entry_notes: null, + task_id: "task_id_33", + start_time: 1739193584610, + end_time: 1739193853888, + task_name: "Anonymized Task 13", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 269277, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 60, + time_entry_notes: null, + task_id: "task_id_34", + start_time: 1739194317912, + end_time: 1739203355568, + task_name: "Anonymized Task 14", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9037655, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 61, + time_entry_notes: null, + task_id: "task_id_35", + start_time: 1739262992769, + end_time: 1739265154661, + task_name: "Anonymized Task 15", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2161891, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 62, + time_entry_notes: null, + task_id: "task_id_33", + start_time: 1739265162468, + end_time: 1739267274547, + task_name: "Anonymized Task 13", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2112079, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 63, + time_entry_notes: null, + task_id: "task_id_36", + start_time: 1739271304402, + end_time: 1739272875754, + task_name: "Anonymized Task 16", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1571351, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 64, + time_entry_notes: null, + task_id: "task_id_37", + start_time: 1739272880407, + end_time: 1739281003560, + task_name: "Anonymized Task 17", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 8123153, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 65, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739281008213, + end_time: 1739281940354, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 932141, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 66, + time_entry_notes: null, + task_id: "task_id_39", + start_time: 1739282644837, + end_time: 1739283199946, + task_name: "Anonymized Task 19", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 555109, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 67, + time_entry_notes: null, + task_id: "task_id_40", + start_time: 1739283328920, + end_time: 1739294882012, + task_name: "Anonymized Task 20", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 11553092, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 68, + time_entry_notes: null, + task_id: "task_id_41", + start_time: 1739359205829, + end_time: 1739359216598, + task_name: "Anonymized Task 21", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 10769, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 69, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739360176401, + end_time: 1739360283971, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 107570, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 70, + time_entry_notes: null, + task_id: "task_id_42", + start_time: 1739360401086, + end_time: 1739360423717, + task_name: "Anonymized Task 22", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 22630, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 71, + time_entry_notes: null, + task_id: "task_id_43", + start_time: 1739360427417, + end_time: 1739360434261, + task_name: "Anonymized Task 23", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 6843, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 72, + time_entry_notes: null, + task_id: "task_id_44", + start_time: 1739360438345, + end_time: 1739360446201, + task_name: "Anonymized Task 24", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7856, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 73, + time_entry_notes: null, + task_id: "task_id_45", + start_time: 1739360449959, + end_time: 1739360457390, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7430, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 74, + time_entry_notes: null, + task_id: "task_id_46", + start_time: 1739360461039, + end_time: 1739360468346, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7306, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 75, + time_entry_notes: null, + task_id: "task_id_47", + start_time: 1739360471927, + end_time: 1739360481711, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9784, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 76, + time_entry_notes: null, + task_id: "task_id_48", + start_time: 1739360485292, + end_time: 1739360516188, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 30896, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 77, + time_entry_notes: null, + task_id: "task_id_49", + start_time: 1739360520099, + end_time: 1739360521234, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1135, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 78, + time_entry_notes: null, + task_id: "task_id_46", + start_time: 1739360633096, + end_time: 1739360647788, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 14691, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 79, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1744198453301, + end_time: 1744199610010, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1156709, + weekday: 3, + month: 4, + year: 2025, + }, + { + time_entry_id: 80, + time_entry_notes: null, + task_id: "task_id_50", + start_time: 1746190409404, + end_time: 1746195643297, + task_name: "Anonymized Task 26", + tag_id: "tag_id_7", + tag_name: "research", + tag_color: "#ac41a7", + tag_dot_text: null, + duration: 5233893, + weekday: 5, + month: 5, + year: 2025, + }, + { + time_entry_id: 80, + time_entry_notes: null, + task_id: "task_id_50", + start_time: 1746190409404, + end_time: 1746195643297, + task_name: "Anonymized Task 26", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 5233893, + weekday: 5, + month: 5, + year: 2025, + }, + { + time_entry_id: 81, + time_entry_notes: null, + task_id: "task_id_51", + start_time: 1746263553276, + end_time: 1746264530770, + task_name: "Anonymized Task 27", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 977494, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 81, + time_entry_notes: null, + task_id: "task_id_51", + start_time: 1746263553276, + end_time: 1746264530770, + task_name: "Anonymized Task 27", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 977494, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 82, + time_entry_notes: null, + task_id: "task_id_52", + start_time: 1746266846521, + end_time: 1746268094280, + task_name: "Anonymized Task 28", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 1247759, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 82, + time_entry_notes: null, + task_id: "task_id_52", + start_time: 1746266846521, + end_time: 1746268094280, + task_name: "Anonymized Task 28", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 1247759, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 83, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749533256369, + end_time: 1749534765222, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1508853, + weekday: 2, + month: 6, + year: 2025, + }, + { + time_entry_id: 83, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749533256369, + end_time: 1749534765222, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1508853, + weekday: 2, + month: 6, + year: 2025, + }, + { + time_entry_id: 84, + time_entry_notes: null, + task_id: "task_id_53", + start_time: 1739360701004, + end_time: 1739360701810, + task_name: "Anonymized Task 29", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 806, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 85, + time_entry_notes: null, + task_id: "task_id_46", + start_time: 1739360714251, + end_time: 1739360715105, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 854, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 86, + time_entry_notes: null, + task_id: "task_id_54", + start_time: 1739360723818, + end_time: 1739360737083, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 13265, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 87, + time_entry_notes: null, + task_id: "task_id_53", + start_time: 1739361046648, + end_time: 1739361047610, + task_name: "Anonymized Task 29", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 961, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 88, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739361051912, + end_time: 1739361052575, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 663, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 89, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739361310315, + end_time: 1739361586716, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 276401, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 90, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739361587556, + end_time: 1739361590274, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2718, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 91, + time_entry_notes: null, + task_id: "task_id_46", + start_time: 1739361592261, + end_time: 1739361841999, + task_name: "Anonymized Task 25", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 249737, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 92, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739361842753, + end_time: 1739361844779, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2026, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 93, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739361849574, + end_time: 1739361923254, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 73680, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 94, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739361989725, + end_time: 1739362070017, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 80292, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 95, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739362070758, + end_time: 1739362077950, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7191, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 96, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739362078680, + end_time: 1739362085425, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 6745, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 97, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739362086178, + end_time: 1739362090238, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4060, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 98, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739362091035, + end_time: 1739362095034, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3999, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 99, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739362095765, + end_time: 1739362100793, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 5028, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 100, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739362101514, + end_time: 1739362113015, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 11500, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 101, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739362113910, + end_time: 1739362262853, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 148943, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 102, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739362263603, + end_time: 1739362265556, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1952, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 103, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739362270411, + end_time: 1739362271960, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1548, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 104, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739362505666, + end_time: 1739364239993, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1734326, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 105, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739364240884, + end_time: 1739364243347, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2463, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 106, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739364244093, + end_time: 1739364245894, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1801, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 107, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739364248905, + end_time: 1739364350512, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 101607, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 108, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739364351255, + end_time: 1739364353490, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2234, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 109, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739364354262, + end_time: 1739364356353, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2090, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 110, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739364357173, + end_time: 1739364359589, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2416, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 111, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739364360358, + end_time: 1739364381663, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 21304, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 112, + time_entry_notes: null, + task_id: "task_id_55", + start_time: 1739364382424, + end_time: 1739364383606, + task_name: "Anonymized Task 30", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1181, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 113, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739364384359, + end_time: 1739365531789, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1147429, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 114, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1741591805065, + end_time: 1741593115687, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1310622, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 114, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1741591805065, + end_time: 1741593115687, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1310622, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 115, + time_entry_notes: null, + task_id: "task_id_56", + start_time: 1741684923269, + end_time: 1741694586505, + task_name: "Anonymized Task 31", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 9663236, + weekday: 2, + month: 3, + year: 2025, + }, + { + time_entry_id: 116, + time_entry_notes: null, + task_id: "task_id_39", + start_time: 1739365550312, + end_time: 1739365647700, + task_name: "Anonymized Task 19", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 97388, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 117, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739365648637, + end_time: 1739365701685, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 53047, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 118, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739365720840, + end_time: 1739365724694, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3854, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 119, + time_entry_notes: null, + task_id: "task_id_38", + start_time: 1739367445758, + end_time: 1739367502324, + task_name: "Anonymized Task 18", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 56566, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 120, + time_entry_notes: null, + task_id: "task_id_57", + start_time: 1739367521944, + end_time: 1739370178606, + task_name: "Anonymized Task 32", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2656662, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 121, + time_entry_notes: null, + task_id: "task_id_58", + start_time: 1739370185879, + end_time: 1739387951646, + task_name: "Anonymized Task 33", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 17765767, + weekday: 3, + month: 2, + year: 2025, + }, + { + time_entry_id: 122, + time_entry_notes: null, + task_id: "task_id_59", + start_time: 1739520908573, + end_time: 1739524474835, + task_name: "Anonymized Task 20", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3566262, + weekday: 5, + month: 2, + year: 2025, + }, + { + time_entry_id: 123, + time_entry_notes: null, + task_id: "task_id_37", + start_time: 1739524487382, + end_time: 1739527282895, + task_name: "Anonymized Task 17", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2795512, + weekday: 5, + month: 2, + year: 2025, + }, + { + time_entry_id: 124, + time_entry_notes: null, + task_id: "task_id_60", + start_time: 1739527288084, + end_time: 1739528188284, + task_name: "Anonymized Task 34", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 900199, + weekday: 5, + month: 2, + year: 2025, + }, + { + time_entry_id: 125, + time_entry_notes: null, + task_id: "task_id_61", + start_time: 1739528199690, + end_time: 1739529712992, + task_name: "Anonymized Task 35", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1513301, + weekday: 5, + month: 2, + year: 2025, + }, + { + time_entry_id: 126, + time_entry_notes: null, + task_id: "task_id_62", + start_time: 1739530325815, + end_time: 1739530911039, + task_name: "Anonymized Task 36", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 585224, + weekday: 5, + month: 2, + year: 2025, + }, + { + time_entry_id: 127, + time_entry_notes: null, + task_id: "task_id_63", + start_time: 1739531101950, + end_time: 1739533065879, + task_name: "Anonymized Task 37", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1963929, + weekday: 5, + month: 2, + year: 2025, + }, + { + time_entry_id: 128, + time_entry_notes: null, + task_id: "task_id_63", + start_time: 1739631185953, + end_time: 1739631188402, + task_name: "Anonymized Task 37", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2449, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 129, + time_entry_notes: null, + task_id: "task_id_64", + start_time: 1739631314850, + end_time: 1739634818851, + task_name: "Anonymized Task 38", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3504001, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 130, + time_entry_notes: null, + task_id: "task_id_61", + start_time: 1739634819491, + end_time: 1739634869161, + task_name: "Anonymized Task 35", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 49669, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 131, + time_entry_notes: null, + task_id: "task_id_61", + start_time: 1739635176413, + end_time: 1739636078662, + task_name: "Anonymized Task 35", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 902249, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 132, + time_entry_notes: null, + task_id: "task_id_17", + start_time: 1741781230485, + end_time: 1741781816890, + task_name: "Training & Development", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 586405, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 133, + time_entry_notes: null, + task_id: "task_id_61", + start_time: 1739639154370, + end_time: 1739639174236, + task_name: "Anonymized Task 35", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 19865, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 134, + time_entry_notes: null, + task_id: "task_id_17", + start_time: 1741785025522, + end_time: 1741785397667, + task_name: "Training & Development", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 372145, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 135, + time_entry_notes: null, + task_id: "task_id_63", + start_time: 1739640095578, + end_time: 1739640426853, + task_name: "Anonymized Task 37", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 331275, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 136, + time_entry_notes: null, + task_id: "task_id_61", + start_time: 1739640427518, + end_time: 1739640437823, + task_name: "Anonymized Task 35", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 10305, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 137, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742112781462, + end_time: 1742113766097, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 984635, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 138, + time_entry_notes: null, + task_id: "task_id_61", + start_time: 1739640539654, + end_time: 1739640551657, + task_name: "Anonymized Task 35", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 12002, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 139, + time_entry_notes: null, + task_id: "task_id_61", + start_time: 1739640559666, + end_time: 1739642501150, + task_name: "Anonymized Task 35", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1941484, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 140, + time_entry_notes: null, + task_id: "task_id_64", + start_time: 1739642501660, + end_time: 1739712336160, + task_name: "Anonymized Task 38", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 69834500, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 141, + time_entry_notes: null, + task_id: "task_id_65", + start_time: 1739712839326, + end_time: 1739713148140, + task_name: "Anonymized Task 39", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 308814, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 142, + time_entry_notes: null, + task_id: "task_id_65", + start_time: 1739713163171, + end_time: 1739713169407, + task_name: "Anonymized Task 39", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 6236, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 143, + time_entry_notes: null, + task_id: "task_id_64", + start_time: 1739713201753, + end_time: 1739713205504, + task_name: "Anonymized Task 38", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3750, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 144, + time_entry_notes: null, + task_id: "task_id_66", + start_time: 1739730967695, + end_time: 1739739712390, + task_name: "Anonymized Task 40", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 8744695, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 145, + time_entry_notes: null, + task_id: "task_id_67", + start_time: 1739780227850, + end_time: 1739781969239, + task_name: "Anonymized Task 41", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1741388, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 146, + time_entry_notes: null, + task_id: "task_id_68", + start_time: 1739783534665, + end_time: 1739784755053, + task_name: "Anonymized Task 42", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1220387, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 147, + time_entry_notes: null, + task_id: "task_id_69", + start_time: 1739790688322, + end_time: 1739798034186, + task_name: "Anonymized Task 43", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7345864, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 148, + time_entry_notes: null, + task_id: "task_id_70", + start_time: 1741856993389, + end_time: 1741859060852, + task_name: "Anonymized Task 44", + tag_id: "tag_id_9", + tag_name: "internal", + tag_color: "#d8c371", + tag_dot_text: null, + duration: 2067463, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 149, + time_entry_notes: null, + task_id: "task_id_71", + start_time: 1739799198287, + end_time: 1739806706358, + task_name: "Anonymized Task 45", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7508071, + weekday: 1, + month: 2, + year: 2025, + }, + { + time_entry_id: 150, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742026370144, + end_time: 1742027231406, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 861262, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 151, + time_entry_notes: null, + task_id: "task_id_72", + start_time: 1739872245126, + end_time: 1739879373616, + task_name: "Anonymized Task 46", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7128489, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 152, + time_entry_notes: null, + task_id: "task_id_73", + start_time: 1739879384806, + end_time: 1739891586303, + task_name: "Anonymized Task 47", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 12201497, + weekday: 2, + month: 2, + year: 2025, + }, + { + time_entry_id: 153, + time_entry_notes: null, + task_id: "task_id_74", + start_time: 1740045938014, + end_time: 1740047970326, + task_name: "Anonymized Task 48", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2032311, + weekday: 4, + month: 2, + year: 2025, + }, + { + time_entry_id: 154, + time_entry_notes: null, + task_id: "task_id_75", + start_time: 1740047976589, + end_time: 1740056639468, + task_name: "Anonymized Task 49", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 8662879, + weekday: 4, + month: 2, + year: 2025, + }, + { + time_entry_id: 155, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742456245415, + end_time: 1742457607667, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1362252, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 155, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742456245415, + end_time: 1742457607667, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1362252, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 156, + time_entry_notes: null, + task_id: "task_id_76", + start_time: 1740088634143, + end_time: 1740123687289, + task_name: "Anonymized Task 50", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 35053146, + weekday: 4, + month: 2, + year: 2025, + }, + { + time_entry_id: 157, + time_entry_notes: null, + task_id: "task_id_77", + start_time: 1740125872563, + end_time: 1740136838975, + task_name: "Anonymized Task 51", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 10966412, + weekday: 5, + month: 2, + year: 2025, + }, + { + time_entry_id: 158, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742578680354, + end_time: 1742579689993, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1009639, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 159, + time_entry_notes: null, + task_id: "task_id_78", + start_time: 1742644935741, + end_time: 1742647677038, + task_name: "Anonymized Task 52", + tag_id: "tag_id_10", + tag_name: "improvement", + tag_color: "#45b6c7", + tag_dot_text: null, + duration: 2741297, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 159, + time_entry_notes: null, + task_id: "task_id_78", + start_time: 1742644935741, + end_time: 1742647677038, + task_name: "Anonymized Task 52", + tag_id: "tag_id_11", + tag_name: "bug", + tag_color: "#9f7e32", + tag_dot_text: null, + duration: 2741297, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 160, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1742755952817, + end_time: 1742759585059, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3632242, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 161, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743060628080, + end_time: 1743061970446, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1342366, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 161, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743060628080, + end_time: 1743061970446, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1342366, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 162, + time_entry_notes: null, + task_id: "task_id_80", + start_time: 1743328020250, + end_time: 1743331835913, + task_name: "Anonymized Task 54", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 3815663, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 162, + time_entry_notes: null, + task_id: "task_id_80", + start_time: 1743328020250, + end_time: 1743331835913, + task_name: "Anonymized Task 54", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 3815663, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 163, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743402854908, + end_time: 1743404608054, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1753146, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 163, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743402854908, + end_time: 1743404608054, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1753146, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 164, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1744007803468, + end_time: 1744009194198, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1390730, + weekday: 1, + month: 4, + year: 2025, + }, + { + time_entry_id: 164, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1744007803468, + end_time: 1744009194198, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1390730, + weekday: 1, + month: 4, + year: 2025, + }, + { + time_entry_id: 165, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1744267139244, + end_time: 1744268477417, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1338173, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 165, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1744267139244, + end_time: 1744268477417, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1338173, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 166, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1744795475581, + end_time: 1744796466086, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 990505, + weekday: 3, + month: 4, + year: 2025, + }, + { + time_entry_id: 167, + time_entry_notes: null, + task_id: "task_id_19", + start_time: 1743459503656, + end_time: 1743488967902, + task_name: "Operations", + tag_id: "tag_id_5", + tag_name: "non-billable", + tag_color: "#3e3d85", + tag_dot_text: null, + duration: 29464246, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 168, + time_entry_notes: null, + task_id: "task_id_56", + start_time: 1741699272136, + end_time: 1741700577194, + task_name: "Anonymized Task 31", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 1305058, + weekday: 2, + month: 3, + year: 2025, + }, + { + time_entry_id: 169, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743661958096, + end_time: 1743663360641, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1402545, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 169, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743661958096, + end_time: 1743663360641, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1402545, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 170, + time_entry_notes: null, + task_id: "task_id_81", + start_time: 1744030117755, + end_time: 1744034705950, + task_name: "Anonymized Task 55", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4588195, + weekday: 1, + month: 4, + year: 2025, + }, + { + time_entry_id: 171, + time_entry_notes: null, + task_id: "task_id_78", + start_time: 1741781827278, + end_time: 1741783457502, + task_name: "Anonymized Task 52", + tag_id: "tag_id_10", + tag_name: "improvement", + tag_color: "#45b6c7", + tag_dot_text: null, + duration: 1630224, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 171, + time_entry_notes: null, + task_id: "task_id_78", + start_time: 1741781827278, + end_time: 1741783457502, + task_name: "Anonymized Task 52", + tag_id: "tag_id_11", + tag_name: "bug", + tag_color: "#9f7e32", + tag_dot_text: null, + duration: 1630224, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 172, + time_entry_notes: null, + task_id: "task_id_82", + start_time: 1740231827413, + end_time: 1740232279690, + task_name: "Anonymized Task 56", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 452277, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 173, + time_entry_notes: null, + task_id: "task_id_17", + start_time: 1741787356976, + end_time: 1741789966399, + task_name: "Training & Development", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 2609423, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 174, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1741201409104, + end_time: 1741208465185, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7056081, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 175, + time_entry_notes: null, + task_id: "task_id_82", + start_time: 1740232421766, + end_time: 1740232655985, + task_name: "Anonymized Task 56", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 234218, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 176, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1749630296508, + end_time: 1749631363454, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1066946, + weekday: 3, + month: 6, + year: 2025, + }, + { + time_entry_id: 177, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746204180193, + end_time: 1746204631682, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 451489, + weekday: 5, + month: 5, + year: 2025, + }, + { + time_entry_id: 178, + time_entry_notes: null, + task_id: "task_id_82", + start_time: 1740233335826, + end_time: 1740233347797, + task_name: "Anonymized Task 56", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 11971, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 179, + time_entry_notes: null, + task_id: "task_id_83", + start_time: 1744355952001, + end_time: 1744364940066, + task_name: "Anonymized Task 57", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 8988065, + weekday: 5, + month: 4, + year: 2025, + }, + { + time_entry_id: 180, + time_entry_notes: null, + task_id: "task_id_84", + start_time: 1741865936016, + end_time: 1741876097217, + task_name: "Anonymized Task 58", + tag_id: "tag_id_12", + tag_name: "sales", + tag_color: "#328b86", + tag_dot_text: null, + duration: 10161201, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 180, + time_entry_notes: null, + task_id: "task_id_84", + start_time: 1741865936016, + end_time: 1741876097217, + task_name: "Anonymized Task 58", + tag_id: "tag_id_13", + tag_name: "support", + tag_color: "#3f756a", + tag_dot_text: null, + duration: 10161201, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 181, + time_entry_notes: null, + task_id: "task_id_85", + start_time: 1742032443790, + end_time: 1742048764082, + task_name: "Anonymized Task 59", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 16320292, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 181, + time_entry_notes: null, + task_id: "task_id_85", + start_time: 1742032443790, + end_time: 1742048764082, + task_name: "Anonymized Task 59", + tag_id: "tag_id_14", + tag_name: "planning", + tag_color: "#991865", + tag_dot_text: null, + duration: 16320292, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 182, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742216348894, + end_time: 1742216933766, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 584872, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 183, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1741511348142, + end_time: 1741511800090, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 451948, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 184, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742489559596, + end_time: 1742491070658, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1511062, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 184, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742489559596, + end_time: 1742491070658, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1511062, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 185, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742589317913, + end_time: 1742590920295, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1602382, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 186, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742725176268, + end_time: 1742726116442, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 940174, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 187, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742801885109, + end_time: 1742803252389, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1367280, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 187, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742801885109, + end_time: 1742803252389, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1367280, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 188, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743147327731, + end_time: 1743149015945, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1688214, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 188, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743147327731, + end_time: 1743149015945, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1688214, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 189, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1741427140536, + end_time: 1741430700312, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 3559776, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 190, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1744871510772, + end_time: 1744872875355, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1364583, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 190, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1744871510772, + end_time: 1744872875355, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1364583, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 191, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1745138606351, + end_time: 1745139593319, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 986968, + weekday: 0, + month: 4, + year: 2025, + }, + { + time_entry_id: 192, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745393256796, + end_time: 1745394343691, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1086895, + weekday: 3, + month: 4, + year: 2025, + }, + { + time_entry_id: 192, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745393256796, + end_time: 1745394343691, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1086895, + weekday: 3, + month: 4, + year: 2025, + }, + { + time_entry_id: 193, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1745653865396, + end_time: 1745654901916, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1036520, + weekday: 6, + month: 4, + year: 2025, + }, + { + time_entry_id: 194, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745908788016, + end_time: 1745910118908, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1330892, + weekday: 2, + month: 4, + year: 2025, + }, + { + time_entry_id: 194, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745908788016, + end_time: 1745910118908, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1330892, + weekday: 2, + month: 4, + year: 2025, + }, + { + time_entry_id: 195, + time_entry_notes: null, + task_id: "task_id_19", + start_time: 1747286928878, + end_time: 1747288357568, + task_name: "Operations", + tag_id: "tag_id_5", + tag_name: "non-billable", + tag_color: "#3e3d85", + tag_dot_text: null, + duration: 1428690, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 196, + time_entry_notes: null, + task_id: "task_id_86", + start_time: 1746268112460, + end_time: 1746268346676, + task_name: "Anonymized Task 60", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 234216, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 196, + time_entry_notes: null, + task_id: "task_id_86", + start_time: 1746268112460, + end_time: 1746268346676, + task_name: "Anonymized Task 60", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 234216, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 197, + time_entry_notes: null, + task_id: "task_id_87", + start_time: 1746274810757, + end_time: 1746291277079, + task_name: "Anonymized Task 61", + tag_id: "tag_id_15", + tag_name: "marketing", + tag_color: "#64baa7", + tag_dot_text: null, + duration: 16466322, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 198, + time_entry_notes: null, + task_id: "task_id_87", + start_time: 1746350894828, + end_time: 1746369063875, + task_name: "Anonymized Task 61", + tag_id: "tag_id_15", + tag_name: "marketing", + tag_color: "#64baa7", + tag_dot_text: null, + duration: 18169047, + weekday: 0, + month: 5, + year: 2025, + }, + { + time_entry_id: 199, + time_entry_notes: null, + task_id: "task_id_88", + start_time: 1746453406285, + end_time: 1746458842037, + task_name: "Anonymized Task 62", + tag_id: "tag_id_7", + tag_name: "research", + tag_color: "#ac41a7", + tag_dot_text: null, + duration: 5435752, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 199, + time_entry_notes: null, + task_id: "task_id_88", + start_time: 1746453406285, + end_time: 1746458842037, + task_name: "Anonymized Task 62", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 5435752, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 199, + time_entry_notes: null, + task_id: "task_id_88", + start_time: 1746453406285, + end_time: 1746458842037, + task_name: "Anonymized Task 62", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 5435752, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 200, + time_entry_notes: null, + task_id: "task_id_89", + start_time: 1746519349918, + end_time: 1746524491613, + task_name: "Anonymized Task 63", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 5141695, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 200, + time_entry_notes: null, + task_id: "task_id_89", + start_time: 1746519349918, + end_time: 1746524491613, + task_name: "Anonymized Task 63", + tag_id: "tag_id_7", + tag_name: "research", + tag_color: "#ac41a7", + tag_dot_text: null, + duration: 5141695, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 200, + time_entry_notes: null, + task_id: "task_id_89", + start_time: 1746519349918, + end_time: 1746524491613, + task_name: "Anonymized Task 63", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 5141695, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 201, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746619298082, + end_time: 1746620438620, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1140538, + weekday: 3, + month: 5, + year: 2025, + }, + { + time_entry_id: 202, + time_entry_notes: null, + task_id: "task_id_89", + start_time: 1746696776784, + end_time: 1746707216278, + task_name: "Anonymized Task 63", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 10439494, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 202, + time_entry_notes: null, + task_id: "task_id_89", + start_time: 1746696776784, + end_time: 1746707216278, + task_name: "Anonymized Task 63", + tag_id: "tag_id_7", + tag_name: "research", + tag_color: "#ac41a7", + tag_dot_text: null, + duration: 10439494, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 202, + time_entry_notes: null, + task_id: "task_id_89", + start_time: 1746696776784, + end_time: 1746707216278, + task_name: "Anonymized Task 63", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 10439494, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 203, + time_entry_notes: null, + task_id: "task_id_90", + start_time: 1746776102371, + end_time: 1746780300802, + task_name: "Anonymized Task 64", + tag_id: "tag_id_7", + tag_name: "research", + tag_color: "#ac41a7", + tag_dot_text: null, + duration: 4198431, + weekday: 5, + month: 5, + year: 2025, + }, + { + time_entry_id: 204, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746956901828, + end_time: 1746957810189, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 908361, + weekday: 0, + month: 5, + year: 2025, + }, + { + time_entry_id: 205, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747117742359, + end_time: 1747118968307, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1225948, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 205, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747117742359, + end_time: 1747118968307, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1225948, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 206, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1747557730806, + end_time: 1747558434686, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 703880, + weekday: 0, + month: 5, + year: 2025, + }, + { + time_entry_id: 207, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747722414329, + end_time: 1747724357157, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1942828, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 207, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747722414329, + end_time: 1747724357157, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1942828, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 208, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1748016994101, + end_time: 1748017436364, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 442263, + weekday: 5, + month: 5, + year: 2025, + }, + { + time_entry_id: 209, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1748156079387, + end_time: 1748156893642, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 814255, + weekday: 0, + month: 5, + year: 2025, + }, + { + time_entry_id: 210, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1748501641127, + end_time: 1748502417724, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 776597, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 211, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1748759781607, + end_time: 1748760684633, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 903026, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 212, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1749036841642, + end_time: 1749037919594, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1077952, + weekday: 3, + month: 6, + year: 2025, + }, + { + time_entry_id: 213, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1749286837190, + end_time: 1749287820995, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 983805, + weekday: 6, + month: 6, + year: 2025, + }, + { + time_entry_id: 214, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749450485112, + end_time: 1749451775929, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1290817, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 214, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749450485112, + end_time: 1749451775929, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1290817, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 215, + time_entry_notes: null, + task_id: "task_id_91", + start_time: 1740242037567, + end_time: 1740242041915, + task_name: "Anonymized Task 65", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4348, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 216, + time_entry_notes: null, + task_id: "task_id_91", + start_time: 1740242390628, + end_time: 1740242463703, + task_name: "Anonymized Task 65", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 73075, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 217, + time_entry_notes: null, + task_id: "task_id_91", + start_time: 1740243512618, + end_time: 1740243551249, + task_name: "Anonymized Task 65", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 38631, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 218, + time_entry_notes: null, + task_id: "task_id_92", + start_time: 1740244361790, + end_time: 1740244365759, + task_name: "Anonymized Task 66", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3969, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 219, + time_entry_notes: null, + task_id: "task_id_92", + start_time: 1740244863240, + end_time: 1740244869246, + task_name: "Anonymized Task 66", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 6006, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 220, + time_entry_notes: null, + task_id: "task_id_92", + start_time: 1740244870103, + end_time: 1740244874214, + task_name: "Anonymized Task 66", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4111, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 221, + time_entry_notes: null, + task_id: "task_id_93", + start_time: 1740245461470, + end_time: 1740245485015, + task_name: "Anonymized Task 67", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 23545, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 222, + time_entry_notes: null, + task_id: "task_id_93", + start_time: 1740245493164, + end_time: 1740245496784, + task_name: "Anonymized Task 67", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3620, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 223, + time_entry_notes: null, + task_id: "task_id_93", + start_time: 1740245498030, + end_time: 1740245503013, + task_name: "Anonymized Task 67", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4983, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 224, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1740247253884, + end_time: 1740247320450, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 66566, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 225, + time_entry_notes: null, + task_id: "task_id_94", + start_time: 1740248169890, + end_time: 1740248179548, + task_name: "Anonymized Task 68", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9658, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 226, + time_entry_notes: null, + task_id: "task_id_94", + start_time: 1740248182041, + end_time: 1740248486255, + task_name: "Anonymized Task 68", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 304214, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 227, + time_entry_notes: null, + task_id: "task_id_94", + start_time: 1740248488586, + end_time: 1740248493599, + task_name: "Anonymized Task 68", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 5013, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 228, + time_entry_notes: null, + task_id: "task_id_94", + start_time: 1740249053581, + end_time: 1740250181601, + task_name: "Anonymized Task 68", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1128020, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 229, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740250213228, + end_time: 1740250243108, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 29880, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 230, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740250244340, + end_time: 1740251050690, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 806350, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 231, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740251051606, + end_time: 1740251053835, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2229, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 232, + time_entry_notes: null, + task_id: "task_id_94", + start_time: 1740251054474, + end_time: 1740251162663, + task_name: "Anonymized Task 68", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 108189, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 233, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740251170001, + end_time: 1740251190750, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 20749, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 234, + time_entry_notes: null, + task_id: "task_id_94", + start_time: 1740251191688, + end_time: 1740251192836, + task_name: "Anonymized Task 68", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1148, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 235, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740251193410, + end_time: 1740251194524, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1114, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 236, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740251195172, + end_time: 1740251558808, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 363636, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 237, + time_entry_notes: null, + task_id: "task_id_95", + start_time: 1740251573733, + end_time: 1740251583204, + task_name: "Anonymized Task 69", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9471, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 238, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740254613901, + end_time: 1740255049864, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 435963, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 239, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740255050511, + end_time: 1740255054470, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3959, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 240, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740255055822, + end_time: 1740255061435, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 5613, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 241, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740255063295, + end_time: 1740255072773, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9478, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 242, + time_entry_notes: null, + task_id: "task_id_95", + start_time: 1740255072227, + end_time: 1740255076691, + task_name: "Anonymized Task 69", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4464, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 243, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740255076284, + end_time: 1740255080398, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4114, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 244, + time_entry_notes: null, + task_id: "task_id_95", + start_time: 1740255080019, + end_time: 1740255084931, + task_name: "Anonymized Task 69", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4912, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 245, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740255084570, + end_time: 1740255091469, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 6899, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 246, + time_entry_notes: null, + task_id: "task_id_95", + start_time: 1740255091132, + end_time: 1740255101010, + task_name: "Anonymized Task 69", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9878, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 247, + time_entry_notes: null, + task_id: "task_id_93", + start_time: 1740261028169, + end_time: 1740261032659, + task_name: "Anonymized Task 67", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 4490, + weekday: 6, + month: 2, + year: 2025, + }, + { + time_entry_id: 248, + time_entry_notes: null, + task_id: "task_id_96", + start_time: 1740301655865, + end_time: 1740303373450, + task_name: "Anonymized Task 70", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1717585, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 249, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1740303377192, + end_time: 1740304415865, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1038673, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 250, + time_entry_notes: null, + task_id: "task_id_97", + start_time: 1740304887124, + end_time: 1740307074507, + task_name: "Anonymized Task 71", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2187383, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 251, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1740307073995, + end_time: 1740307169716, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 95721, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 252, + time_entry_notes: null, + task_id: "task_id_97", + start_time: 1740308687426, + end_time: 1740309930595, + task_name: "Anonymized Task 71", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1243169, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 253, + time_entry_notes: null, + task_id: "task_id_98", + start_time: 1740309969490, + end_time: 1740311058927, + task_name: "Anonymized Task 72", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1089437, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 254, + time_entry_notes: null, + task_id: "task_id_97", + start_time: 1740311058112, + end_time: 1740311067075, + task_name: "Anonymized Task 71", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 8963, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 255, + time_entry_notes: null, + task_id: "task_id_98", + start_time: 1740311066406, + end_time: 1740311370864, + task_name: "Anonymized Task 72", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 304458, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 256, + time_entry_notes: null, + task_id: "task_id_97", + start_time: 1740311370376, + end_time: 1740311584826, + task_name: "Anonymized Task 71", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 214450, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 257, + time_entry_notes: null, + task_id: "task_id_98", + start_time: 1740311584041, + end_time: 1740311865963, + task_name: "Anonymized Task 72", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 281922, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 258, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740311866579, + end_time: 1740311868430, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1851, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 259, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740311869702, + end_time: 1740314451815, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2582113, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 260, + time_entry_notes: null, + task_id: "task_id_99", + start_time: 1740315188273, + end_time: 1740315533054, + task_name: "Anonymized Task 73", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 344781, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 261, + time_entry_notes: null, + task_id: "task_id_97", + start_time: 1740315532450, + end_time: 1740315538076, + task_name: "Anonymized Task 71", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 5626, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 262, + time_entry_notes: null, + task_id: "task_id_99", + start_time: 1740315537695, + end_time: 1740316337418, + task_name: "Anonymized Task 73", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 799723, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 263, + time_entry_notes: null, + task_id: "task_id_99", + start_time: 1740318235453, + end_time: 1740318315372, + task_name: "Anonymized Task 73", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 79919, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 264, + time_entry_notes: null, + task_id: "task_id_99", + start_time: 1740318337804, + end_time: 1740318380576, + task_name: "Anonymized Task 73", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 42772, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 265, + time_entry_notes: null, + task_id: "task_id_98", + start_time: 1740318379153, + end_time: 1740318480781, + task_name: "Anonymized Task 72", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 101628, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 266, + time_entry_notes: null, + task_id: "task_id_98", + start_time: 1740318745423, + end_time: 1740318763717, + task_name: "Anonymized Task 72", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 18294, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 267, + time_entry_notes: null, + task_id: "task_id_98", + start_time: 1740318771337, + end_time: 1740318781152, + task_name: "Anonymized Task 72", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9815, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 268, + time_entry_notes: null, + task_id: "task_id_79", + start_time: 1740318780631, + end_time: 1740319313119, + task_name: "Anonymized Task 53", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 532488, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 269, + time_entry_notes: null, + task_id: "task_id_99", + start_time: 1740319335411, + end_time: 1740320200330, + task_name: "Anonymized Task 73", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 864919, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 270, + time_entry_notes: null, + task_id: "task_id_98", + start_time: 1740320500565, + end_time: 1740320768354, + task_name: "Anonymized Task 72", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 267789, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 271, + time_entry_notes: null, + task_id: "task_id_100", + start_time: 1740320779853, + end_time: 1740322018588, + task_name: "Anonymized Task 74", + tag_id: "tag_id_16", + tag_name: "high-priority", + tag_color: "#b3aa5a", + tag_dot_text: null, + duration: 1238735, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 272, + time_entry_notes: null, + task_id: "task_id_97", + start_time: 1740322309301, + end_time: 1740324429492, + task_name: "Anonymized Task 71", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2120191, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 273, + time_entry_notes: null, + task_id: "task_id_101", + start_time: 1740324433909, + end_time: 1740331691572, + task_name: "Anonymized Task 75", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 7257663, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 274, + time_entry_notes: null, + task_id: "task_id_102", + start_time: 1741619199316, + end_time: 1741623308505, + task_name: "Anonymized Task 76", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 4109189, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 275, + time_entry_notes: null, + task_id: "task_id_103", + start_time: 1740332477702, + end_time: 1740332513199, + task_name: "Anonymized Task 77", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 35497, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 276, + time_entry_notes: null, + task_id: "task_id_103", + start_time: 1740332514631, + end_time: 1740334287259, + task_name: "Anonymized Task 77", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 1772628, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 277, + time_entry_notes: null, + task_id: "task_id_104", + start_time: 1740334718598, + end_time: 1740334728193, + task_name: "Anonymized Task 78", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 9595, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 278, + time_entry_notes: null, + task_id: "task_id_104", + start_time: 1740334744247, + end_time: 1740334746529, + task_name: "Anonymized Task 78", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2282, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 279, + time_entry_notes: null, + task_id: "task_id_103", + start_time: 1740334792976, + end_time: 1740334803568, + task_name: "Anonymized Task 77", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 10592, + weekday: 0, + month: 2, + year: 2025, + }, + { + time_entry_id: 280, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1741772948667, + end_time: 1741773966514, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1017847, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 281, + time_entry_notes: null, + task_id: "task_id_19", + start_time: 1740961822636, + end_time: 1740986739319, + task_name: "Operations", + tag_id: "tag_id_5", + tag_name: "non-billable", + tag_color: "#3e3d85", + tag_dot_text: null, + duration: 24916683, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 282, + time_entry_notes: null, + task_id: "task_id_17", + start_time: 1741785533166, + end_time: 1741786848240, + task_name: "Training & Development", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 1315074, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 283, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1745225366746, + end_time: 1745226539921, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1173175, + weekday: 1, + month: 4, + year: 2025, + }, + { + time_entry_id: 284, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1740986754028, + end_time: 1740987972739, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1218711, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 284, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1740986754028, + end_time: 1740987972739, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1218711, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 285, + time_entry_notes: null, + task_id: "task_id_105", + start_time: 1741795360340, + end_time: 1741795372950, + task_name: "Anonymized Task 79", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 12610, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 286, + time_entry_notes: null, + task_id: "task_id_105", + start_time: 1741795376034, + end_time: 1741808774760, + task_name: "Anonymized Task 79", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 13398726, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 287, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1741937290263, + end_time: 1741941205573, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 3915310, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 287, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1741937290263, + end_time: 1741941205573, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 3915310, + weekday: 5, + month: 3, + year: 2025, + }, + { + time_entry_id: 288, + time_entry_notes: null, + task_id: "task_id_106", + start_time: 1741011806879, + end_time: 1741014138332, + task_name: "Anonymized Task 80", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 2331453, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 289, + time_entry_notes: null, + task_id: "task_id_19", + start_time: 1741477918401, + end_time: 1741510346627, + task_name: "Operations", + tag_id: "tag_id_5", + tag_name: "non-billable", + tag_color: "#3e3d85", + tag_dot_text: null, + duration: 32428226, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 290, + time_entry_notes: null, + task_id: "task_id_107", + start_time: 1741014146242, + end_time: 1741017332433, + task_name: "Anonymized Task 81", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 3186191, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 291, + time_entry_notes: null, + task_id: "task_id_108", + start_time: 1742048858543, + end_time: 1742053873455, + task_name: "Anonymized Task 82", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 5014912, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 291, + time_entry_notes: null, + task_id: "task_id_108", + start_time: 1742048858543, + end_time: 1742053873455, + task_name: "Anonymized Task 82", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 5014912, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 292, + time_entry_notes: null, + task_id: "task_id_109", + start_time: 1741017345576, + end_time: 1741019616294, + task_name: "Anonymized Task 83", + tag_id: null, + tag_name: null, + tag_color: null, + tag_dot_text: null, + duration: 2270718, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 293, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742374065817, + end_time: 1742374890006, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 824189, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 294, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742491560721, + end_time: 1742492813241, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1252520, + weekday: 4, + month: 3, + year: 2025, + }, + { + time_entry_id: 295, + time_entry_notes: null, + task_id: "task_id_19", + start_time: 1741044209342, + end_time: 1741073497173, + task_name: "Operations", + tag_id: "tag_id_5", + tag_name: "non-billable", + tag_color: "#3e3d85", + tag_dot_text: null, + duration: 29287831, + weekday: 1, + month: 3, + year: 2025, + }, + { + time_entry_id: 296, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742634498479, + end_time: 1742635641565, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1143086, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 297, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1742730477543, + end_time: 1742731440621, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 963078, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 298, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742972438782, + end_time: 1742973880072, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1441290, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 298, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1742972438782, + end_time: 1742973880072, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1441290, + weekday: 3, + month: 3, + year: 2025, + }, + { + time_entry_id: 299, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1743245971115, + end_time: 1743246912116, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 941001, + weekday: 6, + month: 3, + year: 2025, + }, + { + time_entry_id: 300, + time_entry_notes: null, + task_id: "task_id_110", + start_time: 1743343439985, + end_time: 1743353250313, + task_name: "Anonymized Task 84", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 9810328, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 300, + time_entry_notes: null, + task_id: "task_id_110", + start_time: 1743343439985, + end_time: 1743353250313, + task_name: "Anonymized Task 84", + tag_id: "tag_id_17", + tag_name: "external", + tag_color: "#316847", + tag_dot_text: null, + duration: 9810328, + weekday: 0, + month: 3, + year: 2025, + }, + { + time_entry_id: 301, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743488981354, + end_time: 1743490290607, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1309253, + weekday: 2, + month: 4, + year: 2025, + }, + { + time_entry_id: 301, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1743488981354, + end_time: 1743490290607, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1309253, + weekday: 2, + month: 4, + year: 2025, + }, + { + time_entry_id: 302, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1743841487107, + end_time: 1743842482792, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 995685, + weekday: 6, + month: 4, + year: 2025, + }, + { + time_entry_id: 303, + time_entry_notes: null, + task_id: "task_id_111", + start_time: 1744034710640, + end_time: 1744039053668, + task_name: "Anonymized Task 85", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 4343028, + weekday: 1, + month: 4, + year: 2025, + }, + { + time_entry_id: 304, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746082145319, + end_time: 1746083140645, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 995326, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 305, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1745051295459, + end_time: 1745052349240, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1053781, + weekday: 6, + month: 4, + year: 2025, + }, + { + time_entry_id: 306, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745476697085, + end_time: 1745478134212, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1437127, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 306, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1745476697085, + end_time: 1745478134212, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1437127, + weekday: 4, + month: 4, + year: 2025, + }, + { + time_entry_id: 307, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1745742947140, + end_time: 1745743647152, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 700012, + weekday: 0, + month: 4, + year: 2025, + }, + { + time_entry_id: 308, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746004970758, + end_time: 1746005944898, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 974140, + weekday: 3, + month: 4, + year: 2025, + }, + { + time_entry_id: 309, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746262148797, + end_time: 1746263125200, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 976403, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 310, + time_entry_notes: null, + task_id: "task_id_51", + start_time: 1746264535237, + end_time: 1746266830343, + task_name: "Anonymized Task 27", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 2295106, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 310, + time_entry_notes: null, + task_id: "task_id_51", + start_time: 1746264535237, + end_time: 1746266830343, + task_name: "Anonymized Task 27", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 2295106, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 311, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1744442479674, + end_time: 1744443954500, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1474826, + weekday: 6, + month: 4, + year: 2025, + }, + { + time_entry_id: 312, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746017611545, + end_time: 1746017653345, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 41800, + weekday: 3, + month: 4, + year: 2025, + }, + { + time_entry_id: 313, + time_entry_notes: null, + task_id: "task_id_112", + start_time: 1746268360316, + end_time: 1746269281683, + task_name: "Anonymized Task 86", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 921367, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 313, + time_entry_notes: null, + task_id: "task_id_112", + start_time: 1746268360316, + end_time: 1746269281683, + task_name: "Anonymized Task 86", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 921367, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 314, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746345861025, + end_time: 1746346709509, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 848484, + weekday: 0, + month: 5, + year: 2025, + }, + { + time_entry_id: 315, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1746513442455, + end_time: 1746514826895, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1384440, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 315, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1746513442455, + end_time: 1746514826895, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1384440, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 316, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1746426617085, + end_time: 1746428318926, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1701841, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 316, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1746426617085, + end_time: 1746428318926, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1701841, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 317, + time_entry_notes: null, + task_id: "task_id_113", + start_time: 1746524621498, + end_time: 1746532140233, + task_name: "Anonymized Task 87", + tag_id: "tag_id_7", + tag_name: "research", + tag_color: "#ac41a7", + tag_dot_text: null, + duration: 7518735, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 317, + time_entry_notes: null, + task_id: "task_id_113", + start_time: 1746524621498, + end_time: 1746532140233, + task_name: "Anonymized Task 87", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 7518735, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 317, + time_entry_notes: null, + task_id: "task_id_113", + start_time: 1746524621498, + end_time: 1746532140233, + task_name: "Anonymized Task 87", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 7518735, + weekday: 2, + month: 5, + year: 2025, + }, + { + time_entry_id: 318, + time_entry_notes: null, + task_id: "task_id_114", + start_time: 1746685282307, + end_time: 1746693732944, + task_name: "Anonymized Task 88", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 8450637, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 318, + time_entry_notes: null, + task_id: "task_id_114", + start_time: 1746685282307, + end_time: 1746693732944, + task_name: "Anonymized Task 88", + tag_id: "tag_id_7", + tag_name: "research", + tag_color: "#ac41a7", + tag_dot_text: null, + duration: 8450637, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 318, + time_entry_notes: null, + task_id: "task_id_114", + start_time: 1746685282307, + end_time: 1746693732944, + task_name: "Anonymized Task 88", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 8450637, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 319, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1746771139784, + end_time: 1746773943739, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 2803955, + weekday: 5, + month: 5, + year: 2025, + }, + { + time_entry_id: 319, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1746771139784, + end_time: 1746773943739, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 2803955, + weekday: 5, + month: 5, + year: 2025, + }, + { + time_entry_id: 320, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1746877995974, + end_time: 1746878880699, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 884725, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 321, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747031379355, + end_time: 1747032757173, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1377818, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 321, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747031379355, + end_time: 1747032757173, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1377818, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 322, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1747208781013, + end_time: 1747209615949, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 834936, + weekday: 3, + month: 5, + year: 2025, + }, + { + time_entry_id: 323, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1747467592281, + end_time: 1747468641274, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1048993, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 324, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747635944347, + end_time: 1747637985463, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 2041116, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 324, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1747635944347, + end_time: 1747637985463, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 2041116, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 325, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1747896403085, + end_time: 1747897231490, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 828405, + weekday: 4, + month: 5, + year: 2025, + }, + { + time_entry_id: 326, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1748073756608, + end_time: 1748074604948, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 848340, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 327, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1748241014854, + end_time: 1748242353217, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1338363, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 327, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1748241014854, + end_time: 1748242353217, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1338363, + weekday: 1, + month: 5, + year: 2025, + }, + { + time_entry_id: 328, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1748680042047, + end_time: 1748681209534, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1167487, + weekday: 6, + month: 5, + year: 2025, + }, + { + time_entry_id: 329, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1748851462863, + end_time: 1748852263315, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 800452, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 330, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749101068369, + end_time: 1749102683282, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1614913, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 330, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749101068369, + end_time: 1749102683282, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1614913, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 331, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1749366721212, + end_time: 1749367545530, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 824318, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 332, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1751735694151, + end_time: 1751737233139, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1538988, + weekday: 6, + month: 7, + year: 2025, + }, + { + time_entry_id: 333, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1751039911551, + end_time: 1751040975438, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1063887, + weekday: 5, + month: 6, + year: 2025, + }, + { + time_entry_id: 334, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1751096279711, + end_time: 1751097302188, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1022477, + weekday: 6, + month: 6, + year: 2025, + }, + { + time_entry_id: 335, + time_entry_notes: null, + task_id: "task_id_115", + start_time: 1751009699659, + end_time: 1751015889946, + task_name: "Anonymized Task 89", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 6190287, + weekday: 5, + month: 6, + year: 2025, + }, + { + time_entry_id: 336, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1751189460489, + end_time: 1751190293129, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 832640, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 337, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1751700109391, + end_time: 1751701100388, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 990997, + weekday: 6, + month: 7, + year: 2025, + }, + { + time_entry_id: 338, + time_entry_notes: null, + task_id: "task_id_116", + start_time: 1751965890622, + end_time: 1751968356964, + task_name: "Anonymized Task 90", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 2466342, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 339, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1751790578829, + end_time: 1751791286436, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 707607, + weekday: 0, + month: 7, + year: 2025, + }, + { + time_entry_id: 340, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749706777721, + end_time: 1749708227759, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1450038, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 340, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1749706777721, + end_time: 1749708227759, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1450038, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 341, + time_entry_notes: "Anonymized Note", + task_id: "task_id_117", + start_time: 1751194072608, + end_time: 1751194801179, + task_name: "Anonymized Task 91", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 728571, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 341, + time_entry_notes: "Anonymized Note", + task_id: "task_id_117", + start_time: 1751194072608, + end_time: 1751194801179, + task_name: "Anonymized Task 91", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 728571, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 342, + time_entry_notes: null, + task_id: "task_id_118", + start_time: 1751205495939, + end_time: 1751208786945, + task_name: "Anonymized Task 92", + tag_id: "tag_id_3", + tag_name: "low-priority", + tag_color: "#3c6a9f", + tag_dot_text: null, + duration: 3291006, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 342, + time_entry_notes: null, + task_id: "task_id_118", + start_time: 1751205495939, + end_time: 1751208786945, + task_name: "Anonymized Task 92", + tag_id: "tag_id_6", + tag_name: "testing", + tag_color: "#ed7e79", + tag_dot_text: "Anonymized Dot Text", + duration: 3291006, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 343, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1751191630183, + end_time: 1751193439942, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1809759, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 344, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1749887781116, + end_time: 1749888979638, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1198522, + weekday: 6, + month: 6, + year: 2025, + }, + { + time_entry_id: 345, + time_entry_notes: "Anonymized Note", + task_id: "task_id_16", + start_time: 1751264774174, + end_time: 1751267217959, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 2443785, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 345, + time_entry_notes: "Anonymized Note", + task_id: "task_id_16", + start_time: 1751264774174, + end_time: 1751267217959, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 2443785, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 346, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1749975311991, + end_time: 1749976441458, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1129467, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 347, + time_entry_notes: null, + task_id: "task_id_119", + start_time: 1751289913535, + end_time: 1751291467586, + task_name: "Anonymized Task 93", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 1554051, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 348, + time_entry_notes: null, + task_id: "task_id_120", + start_time: 1751291904085, + end_time: 1751297491201, + task_name: "Anonymized Task 94", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 5587116, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 349, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750055190874, + end_time: 1750056627521, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1436647, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 349, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750055190874, + end_time: 1750056627521, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1436647, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 350, + time_entry_notes: null, + task_id: "task_id_119", + start_time: 1751354057335, + end_time: 1751354766209, + task_name: "Anonymized Task 93", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 708874, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 351, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1750091088211, + end_time: 1750092036243, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 948032, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 352, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1750234586647, + end_time: 1750235578614, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 991967, + weekday: 3, + month: 6, + year: 2025, + }, + { + time_entry_id: 353, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1750311232601, + end_time: 1750311235405, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 2804, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 354, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750311237502, + end_time: 1750312620552, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1383050, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 354, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750311237502, + end_time: 1750312620552, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1383050, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 355, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1750494610774, + end_time: 1750495537337, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 926563, + weekday: 6, + month: 6, + year: 2025, + }, + { + time_entry_id: 356, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1750579051368, + end_time: 1750579795432, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 744064, + weekday: 0, + month: 6, + year: 2025, + }, + { + time_entry_id: 357, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750660150321, + end_time: 1750661493684, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1343363, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 357, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750660150321, + end_time: 1750661493684, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1343363, + weekday: 1, + month: 6, + year: 2025, + }, + { + time_entry_id: 358, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1750842766263, + end_time: 1750843518459, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 752196, + weekday: 3, + month: 6, + year: 2025, + }, + { + time_entry_id: 359, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750915945397, + end_time: 1750917331318, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1385921, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 359, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750915945397, + end_time: 1750917331318, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1385921, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 360, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750951126932, + end_time: 1750953799074, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 2672142, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 360, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1750951126932, + end_time: 1750953799074, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 2672142, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 361, + time_entry_notes: null, + task_id: "task_id_18", + start_time: 1750953805699, + end_time: 1750954498289, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 692590, + weekday: 4, + month: 6, + year: 2025, + }, + { + time_entry_id: 362, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1752045644681, + end_time: 1752046534923, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 890242, + weekday: 3, + month: 7, + year: 2025, + }, + { + time_entry_id: 363, + time_entry_notes: null, + task_id: "task_id_120", + start_time: 1751354817496, + end_time: 1751357810387, + task_name: "Anonymized Task 94", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 2992891, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 364, + time_entry_notes: null, + task_id: "task_id_120", + start_time: 1751357851168, + end_time: 1751361039227, + task_name: "Anonymized Task 94", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 3188059, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 365, + time_entry_notes: null, + task_id: "task_id_121", + start_time: 1751361076699, + end_time: 1751362392533, + task_name: "Anonymized Task 95", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 1315834, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 366, + time_entry_notes: null, + task_id: "task_id_120", + start_time: 1751365347252, + end_time: 1751367607822, + task_name: "Anonymized Task 94", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 2260570, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 367, + time_entry_notes: null, + task_id: "task_id_120", + start_time: 1751373529747, + end_time: 1751375909195, + task_name: "Anonymized Task 94", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 2379448, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 368, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1751457505125, + end_time: 1751458363908, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 858783, + weekday: 3, + month: 7, + year: 2025, + }, + { + time_entry_id: 369, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1751461972119, + end_time: 1751465387698, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 3415579, + weekday: 3, + month: 7, + year: 2025, + }, + { + time_entry_id: 370, + time_entry_notes: "Anonymized Note", + task_id: "task_id_16", + start_time: 1751520347199, + end_time: 1751521500207, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1153008, + weekday: 4, + month: 7, + year: 2025, + }, + { + time_entry_id: 370, + time_entry_notes: "Anonymized Note", + task_id: "task_id_16", + start_time: 1751520347199, + end_time: 1751521500207, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1153008, + weekday: 4, + month: 7, + year: 2025, + }, + { + time_entry_id: 371, + time_entry_notes: null, + task_id: "task_id_122", + start_time: 1751526880043, + end_time: 1751535561481, + task_name: "Anonymized Task 96", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 8681438, + weekday: 4, + month: 7, + year: 2025, + }, + { + time_entry_id: 372, + time_entry_notes: null, + task_id: "task_id_123", + start_time: 1751544564706, + end_time: 1751553519244, + task_name: "Anonymized Task 97", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 8954538, + weekday: 4, + month: 7, + year: 2025, + }, + { + time_entry_id: 373, + time_entry_notes: null, + task_id: "task_id_124", + start_time: 1751613031894, + end_time: 1751614893806, + task_name: "Anonymized Task 98", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 1861912, + weekday: 5, + month: 7, + year: 2025, + }, + { + time_entry_id: 374, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1751868904444, + end_time: 1751870518065, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1613621, + weekday: 1, + month: 7, + year: 2025, + }, + { + time_entry_id: 374, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1751868904444, + end_time: 1751870518065, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1613621, + weekday: 1, + month: 7, + year: 2025, + }, + { + time_entry_id: 375, + time_entry_notes: "Anonymized Note", + task_id: "task_id_18", + start_time: 1751906771670, + end_time: 1751908260319, + task_name: "Administrative Work", + tag_id: "tag_id_4", + tag_name: "urgent", + tag_color: "#8135bd", + tag_dot_text: "Anonymized Dot Text", + duration: 1488649, + weekday: 1, + month: 7, + year: 2025, + }, + { + time_entry_id: 376, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1751953071628, + end_time: 1751954403373, + task_name: "Commute", + tag_id: "tag_id_1", + tag_name: "meeting", + tag_color: "#a945a1", + tag_dot_text: null, + duration: 1331745, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 376, + time_entry_notes: null, + task_id: "task_id_16", + start_time: 1751953071628, + end_time: 1751954403373, + task_name: "Commute", + tag_id: "tag_id_2", + tag_name: "deployment", + tag_color: "#d9551b", + tag_dot_text: null, + duration: 1331745, + weekday: 2, + month: 7, + year: 2025, + }, + { + time_entry_id: 377, + time_entry_notes: null, + task_id: "task_id_125", + start_time: 1751962541332, + end_time: 1751965834665, + task_name: "Anonymized Task 99", + tag_id: "tag_id_8", + tag_name: "billable", + tag_color: "#3f93b9", + tag_dot_text: "Anonymized Dot Text", + duration: 3293333, + weekday: 2, + month: 7, + year: 2025, + }, +]; diff --git a/frontend/simple-tracker/src/common/charts.ts b/frontend/simple-tracker/src/common/charts.ts new file mode 100644 index 0000000..e2f6802 --- /dev/null +++ b/frontend/simple-tracker/src/common/charts.ts @@ -0,0 +1,133 @@ +import { data } from "./charts.mockdata"; + +export interface DataPoint { + time_entry_id: number; + time_entry_notes: string | null; + task_id: string; + start_time: number; + end_time: number; + task_name: string; + tag_id: string | null; + tag_name: string | null; + tag_color: string | null; + tag_dot_text: string | null; + duration: number; + weekday: number; + month: number; + year: number; + [key: string]: string | number | null; +} + +export enum PeriodType { + TODAY = "today", + YESTERDAY = "yesterday", + THIS_WEEK = "this_week", + LAST_WEEK = "last_week", + THIS_MONTH = "this_month", + LAST_MONTH = "last_month", + THIS_YEAR = "this_year", + LAST_YEAR = "last_year", +} + +export interface ChartConfig { + title: string; + description: string; + periodType: PeriodType; +} + +export function getDateIntevealFromPeriodType(periodType: PeriodType): { + start: Date; + end: Date; +} { + const now = new Date(); + let start: Date; + let end: Date; + + switch (periodType) { + case PeriodType.TODAY: + start = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + end = new Date(start); + end.setDate(end.getDate() + 1); + break; + case PeriodType.YESTERDAY: + start = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); + end = new Date(start); + end.setDate(end.getDate() + 1); + break; + case PeriodType.THIS_WEEK: + start = new Date(now); + start.setDate(start.getDate() - start.getDay()); + end = new Date(start); + end.setDate(end.getDate() + 7); + break; + case PeriodType.LAST_WEEK: + start = new Date(now); + start.setDate(start.getDate() - (start.getDay() + 7)); + end = new Date(start); + end.setDate(end.getDate() + 7); + break; + case PeriodType.THIS_MONTH: + start = new Date(now.getFullYear(), now.getMonth(), 1); + end = new Date(now.getFullYear(), now.getMonth() + 1, 1); + break; + case PeriodType.LAST_MONTH: + start = new Date(now.getFullYear(), now.getMonth() - 1, 1); + end = new Date(now.getFullYear(), now.getMonth(), 1); + break; + case PeriodType.THIS_YEAR: + start = new Date(now.getFullYear(), 0, 1); + end = new Date(now.getFullYear() + 1, 0, 1); + break; + case PeriodType.LAST_YEAR: + start = new Date(now.getFullYear() - 1, 0, 1); + end = new Date(now.getFullYear(), 0, 1); + break; + default: + throw new Error("Invalid period type"); + } + + return { start, end }; +} + +export function selectData(config: ChartConfig): DataPoint[] { + const { start, end } = getDateIntevealFromPeriodType(config.periodType); + return data.filter( + (item) => + new Date(item.start_time) >= start && new Date(item.end_time) < end + ); +} + +export interface ChartData { + points: { + x: any[]; + ys: { + data: any[]; + label: string; + }[]; + }; + config: ChartConfig; +} + +export function getChartData(config: ChartConfig): ChartData { + const selectedData: DataPoint[] = selectData(config); + const chartData: ChartData = { + points: { + x: [], + ys: [], + }, + config, + }; + + const xField = "task_name"; + const yField = "duration"; + const x = selectedData.map((item) => item[xField]); + const ys = { + data: selectedData.map((item) => item[yField]), + label: yField, + }; + + chartData.points.x = x; + chartData.points.ys = [ys]; + + return chartData; +} diff --git a/frontend/simple-tracker/src/components/AppNavigation.vue b/frontend/simple-tracker/src/components/AppNavigation.vue index b9fc1b9..c99b9c5 100644 --- a/frontend/simple-tracker/src/components/AppNavigation.vue +++ b/frontend/simple-tracker/src/components/AppNavigation.vue @@ -29,6 +29,14 @@ > + + +
+ +
From 3bd55085be700c7813750b914a62f990a60b7e33 Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sun, 13 Jul 2025 11:56:59 +0200 Subject: [PATCH 02/44] refactor chart code --- frontend/simple-tracker/src/common/charts.ts | 133 ------------------ .../common/{ => charts}/charts.mockdata.ts | 2 +- .../src/common/charts/charts.ts | 39 +++++ .../src/common/charts/charts.types.ts | 46 ++++++ .../src/common/charts/charts.utils.ts | 55 ++++++++ .../src/components/charts/AppNewChart.vue | 12 +- 6 files changed, 145 insertions(+), 142 deletions(-) delete mode 100644 frontend/simple-tracker/src/common/charts.ts rename frontend/simple-tracker/src/common/{ => charts}/charts.mockdata.ts (99%) create mode 100644 frontend/simple-tracker/src/common/charts/charts.ts create mode 100644 frontend/simple-tracker/src/common/charts/charts.types.ts create mode 100644 frontend/simple-tracker/src/common/charts/charts.utils.ts diff --git a/frontend/simple-tracker/src/common/charts.ts b/frontend/simple-tracker/src/common/charts.ts deleted file mode 100644 index e2f6802..0000000 --- a/frontend/simple-tracker/src/common/charts.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { data } from "./charts.mockdata"; - -export interface DataPoint { - time_entry_id: number; - time_entry_notes: string | null; - task_id: string; - start_time: number; - end_time: number; - task_name: string; - tag_id: string | null; - tag_name: string | null; - tag_color: string | null; - tag_dot_text: string | null; - duration: number; - weekday: number; - month: number; - year: number; - [key: string]: string | number | null; -} - -export enum PeriodType { - TODAY = "today", - YESTERDAY = "yesterday", - THIS_WEEK = "this_week", - LAST_WEEK = "last_week", - THIS_MONTH = "this_month", - LAST_MONTH = "last_month", - THIS_YEAR = "this_year", - LAST_YEAR = "last_year", -} - -export interface ChartConfig { - title: string; - description: string; - periodType: PeriodType; -} - -export function getDateIntevealFromPeriodType(periodType: PeriodType): { - start: Date; - end: Date; -} { - const now = new Date(); - let start: Date; - let end: Date; - - switch (periodType) { - case PeriodType.TODAY: - start = new Date(now.getFullYear(), now.getMonth(), now.getDate()); - end = new Date(start); - end.setDate(end.getDate() + 1); - break; - case PeriodType.YESTERDAY: - start = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); - end = new Date(start); - end.setDate(end.getDate() + 1); - break; - case PeriodType.THIS_WEEK: - start = new Date(now); - start.setDate(start.getDate() - start.getDay()); - end = new Date(start); - end.setDate(end.getDate() + 7); - break; - case PeriodType.LAST_WEEK: - start = new Date(now); - start.setDate(start.getDate() - (start.getDay() + 7)); - end = new Date(start); - end.setDate(end.getDate() + 7); - break; - case PeriodType.THIS_MONTH: - start = new Date(now.getFullYear(), now.getMonth(), 1); - end = new Date(now.getFullYear(), now.getMonth() + 1, 1); - break; - case PeriodType.LAST_MONTH: - start = new Date(now.getFullYear(), now.getMonth() - 1, 1); - end = new Date(now.getFullYear(), now.getMonth(), 1); - break; - case PeriodType.THIS_YEAR: - start = new Date(now.getFullYear(), 0, 1); - end = new Date(now.getFullYear() + 1, 0, 1); - break; - case PeriodType.LAST_YEAR: - start = new Date(now.getFullYear() - 1, 0, 1); - end = new Date(now.getFullYear(), 0, 1); - break; - default: - throw new Error("Invalid period type"); - } - - return { start, end }; -} - -export function selectData(config: ChartConfig): DataPoint[] { - const { start, end } = getDateIntevealFromPeriodType(config.periodType); - return data.filter( - (item) => - new Date(item.start_time) >= start && new Date(item.end_time) < end - ); -} - -export interface ChartData { - points: { - x: any[]; - ys: { - data: any[]; - label: string; - }[]; - }; - config: ChartConfig; -} - -export function getChartData(config: ChartConfig): ChartData { - const selectedData: DataPoint[] = selectData(config); - const chartData: ChartData = { - points: { - x: [], - ys: [], - }, - config, - }; - - const xField = "task_name"; - const yField = "duration"; - const x = selectedData.map((item) => item[xField]); - const ys = { - data: selectedData.map((item) => item[yField]), - label: yField, - }; - - chartData.points.x = x; - chartData.points.ys = [ys]; - - return chartData; -} diff --git a/frontend/simple-tracker/src/common/charts.mockdata.ts b/frontend/simple-tracker/src/common/charts/charts.mockdata.ts similarity index 99% rename from frontend/simple-tracker/src/common/charts.mockdata.ts rename to frontend/simple-tracker/src/common/charts/charts.mockdata.ts index 3eed8b1..0fe8bc9 100644 --- a/frontend/simple-tracker/src/common/charts.mockdata.ts +++ b/frontend/simple-tracker/src/common/charts/charts.mockdata.ts @@ -1,4 +1,4 @@ -import type { DataPoint } from "./charts"; +import type { DataPoint } from "./charts.types"; export const data: DataPoint[] = [ { diff --git a/frontend/simple-tracker/src/common/charts/charts.ts b/frontend/simple-tracker/src/common/charts/charts.ts new file mode 100644 index 0000000..d0b2041 --- /dev/null +++ b/frontend/simple-tracker/src/common/charts/charts.ts @@ -0,0 +1,39 @@ +import { data } from "./charts.mockdata"; +import { generateRandomColor } from "../colorUtils"; +import type { ChartConfig, DataPoint, ChartData } from "./charts.types"; +import { getDateIntevealFromPeriodType } from "./charts.utils"; + +export function selectData(config: ChartConfig): DataPoint[] { + const { start, end } = getDateIntevealFromPeriodType(config.periodType); + return data.filter( + (item) => + new Date(item.start_time) >= start && new Date(item.end_time) < end + ); +} + +export function getChartData(config: ChartConfig): ChartData { + const selectedData: DataPoint[] = selectData(config); + const chartData: ChartData = { + points: { + x: [], + ys: [], + }, + config, + }; + + const xField = "task_name"; + const yFields = ["duration"]; + const x = selectedData.map((item) => item[xField]); + const ys = yFields.map((yField) => ({ + data: selectedData.map((item) => item[yField]), + label: yField, + backgroundColor: selectedData.map((item) => + item.tag_color ? item.tag_color : generateRandomColor() + ), + })); + + chartData.points.x = x; + chartData.points.ys = ys; + + return chartData; +} diff --git a/frontend/simple-tracker/src/common/charts/charts.types.ts b/frontend/simple-tracker/src/common/charts/charts.types.ts new file mode 100644 index 0000000..7154656 --- /dev/null +++ b/frontend/simple-tracker/src/common/charts/charts.types.ts @@ -0,0 +1,46 @@ +export interface DataPoint { + time_entry_id: number; + time_entry_notes: string | null; + task_id: string; + start_time: number; + end_time: number; + task_name: string; + tag_id: string | null; + tag_name: string | null; + tag_color: string | null; + tag_dot_text: string | null; + duration: number; + weekday: number; + month: number; + year: number; + [key: string]: string | number | null; +} + +export enum PeriodType { + TODAY = "today", + YESTERDAY = "yesterday", + THIS_WEEK = "this_week", + LAST_WEEK = "last_week", + THIS_MONTH = "this_month", + LAST_MONTH = "last_month", + THIS_YEAR = "this_year", + LAST_YEAR = "last_year", +} + +export interface ChartConfig { + title: string; + description: string; + periodType: PeriodType; +} + +export interface ChartData { + points: { + x: any[]; + ys: { + data: any[]; + label: string; + backgroundColor: string[]; + }[]; + }; + config: ChartConfig; +} diff --git a/frontend/simple-tracker/src/common/charts/charts.utils.ts b/frontend/simple-tracker/src/common/charts/charts.utils.ts new file mode 100644 index 0000000..ffb9982 --- /dev/null +++ b/frontend/simple-tracker/src/common/charts/charts.utils.ts @@ -0,0 +1,55 @@ +import { PeriodType } from "./charts.types"; + +export function getDateIntevealFromPeriodType(periodType: PeriodType): { + start: Date; + end: Date; +} { + const now = new Date(); + let start: Date; + let end: Date; + + switch (periodType) { + case PeriodType.TODAY: + start = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + end = new Date(start); + end.setDate(end.getDate() + 1); + break; + case PeriodType.YESTERDAY: + start = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); + end = new Date(start); + end.setDate(end.getDate() + 1); + break; + case PeriodType.THIS_WEEK: + start = new Date(now); + start.setDate(start.getDate() - start.getDay()); + end = new Date(start); + end.setDate(end.getDate() + 7); + break; + case PeriodType.LAST_WEEK: + start = new Date(now); + start.setDate(start.getDate() - (start.getDay() + 7)); + end = new Date(start); + end.setDate(end.getDate() + 7); + break; + case PeriodType.THIS_MONTH: + start = new Date(now.getFullYear(), now.getMonth(), 1); + end = new Date(now.getFullYear(), now.getMonth() + 1, 1); + break; + case PeriodType.LAST_MONTH: + start = new Date(now.getFullYear(), now.getMonth() - 1, 1); + end = new Date(now.getFullYear(), now.getMonth(), 1); + break; + case PeriodType.THIS_YEAR: + start = new Date(now.getFullYear(), 0, 1); + end = new Date(now.getFullYear() + 1, 0, 1); + break; + case PeriodType.LAST_YEAR: + start = new Date(now.getFullYear() - 1, 0, 1); + end = new Date(now.getFullYear(), 0, 1); + break; + default: + throw new Error("Invalid period type"); + } + + return { start, end }; +} diff --git a/frontend/simple-tracker/src/components/charts/AppNewChart.vue b/frontend/simple-tracker/src/components/charts/AppNewChart.vue index 70432af..5ec463c 100644 --- a/frontend/simple-tracker/src/components/charts/AppNewChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppNewChart.vue @@ -45,11 +45,7 @@ From 8226bc08155518caeaf30cec53bb8f58b8c751eb Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sat, 19 Jul 2025 16:02:14 +0200 Subject: [PATCH 12/44] refactor chart types to their own components --- .../src/components/charts/AppBarChart.vue | 68 +++++++++ .../components/charts/AppDoughnutChart.vue | 47 +++++++ .../src/components/charts/AppLineChart.vue | 68 +++++++++ .../src/components/charts/AppNewChart.vue | 129 ++---------------- .../simple-tracker/src/stores/chartHelpers.ts | 46 +++++++ 5 files changed, 242 insertions(+), 116 deletions(-) create mode 100644 frontend/simple-tracker/src/components/charts/AppBarChart.vue create mode 100644 frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue create mode 100644 frontend/simple-tracker/src/components/charts/AppLineChart.vue create mode 100644 frontend/simple-tracker/src/stores/chartHelpers.ts diff --git a/frontend/simple-tracker/src/components/charts/AppBarChart.vue b/frontend/simple-tracker/src/components/charts/AppBarChart.vue new file mode 100644 index 0000000..91a91dd --- /dev/null +++ b/frontend/simple-tracker/src/components/charts/AppBarChart.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue b/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue new file mode 100644 index 0000000..8d7fe47 --- /dev/null +++ b/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue @@ -0,0 +1,47 @@ + + + diff --git a/frontend/simple-tracker/src/components/charts/AppLineChart.vue b/frontend/simple-tracker/src/components/charts/AppLineChart.vue new file mode 100644 index 0000000..844b869 --- /dev/null +++ b/frontend/simple-tracker/src/components/charts/AppLineChart.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/simple-tracker/src/components/charts/AppNewChart.vue b/frontend/simple-tracker/src/components/charts/AppNewChart.vue index 23792b7..a6a6f88 100644 --- a/frontend/simple-tracker/src/components/charts/AppNewChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppNewChart.vue @@ -77,14 +77,20 @@
- +
- - + +
- +
@@ -92,21 +98,6 @@ diff --git a/frontend/simple-tracker/src/stores/chartHelpers.ts b/frontend/simple-tracker/src/stores/chartHelpers.ts new file mode 100644 index 0000000..04aa683 --- /dev/null +++ b/frontend/simple-tracker/src/stores/chartHelpers.ts @@ -0,0 +1,46 @@ +import { defineStore } from "pinia"; +import { computed } from "vue"; +import { useStyleStore } from "./style"; +import { + DataPointValueAesthetics, + type ChartConfig, +} from "../common/charts/charts.types"; + +export const useChartHelpersStore = defineStore("chartHelpers", () => { + const styleStore = useStyleStore(); + + const chartTextColor = computed(() => { + return styleStore.getPrimaryColor(); + }); + const chartGridColor = computed(() => { + return chartTextColor.value + "40"; + }); + + const chartTooltipConfig = (chartConfig: ChartConfig) => ({ + callbacks: { + label: (context: any) => { + const label = context.dataset.label || ""; + const value = context.raw; + return `${label}: ${DataPointValueAesthetics[ + chartConfig.yAxisField + ].getTickLabel(value)}`; + }, + }, + }); + + const chartTicksConfigY = (chartConfig: ChartConfig) => ({ + color: chartTextColor.value, + callback: (value: any) => { + return chartConfig.yAxisField + ? DataPointValueAesthetics[chartConfig.yAxisField].getTickLabel(value) + : value.toString(); + }, + }); + + return { + chartTextColor, + chartGridColor, + chartTooltipConfig, + chartTicksConfigY, + }; +}); From c7ba893add15a15f83070393de9ba5843dd4d1e2 Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sat, 19 Jul 2025 16:07:53 +0200 Subject: [PATCH 13/44] style charts --- frontend/simple-tracker/src/components/charts/AppBarChart.vue | 3 --- .../simple-tracker/src/components/charts/AppDoughnutChart.vue | 2 -- .../simple-tracker/src/components/charts/AppLineChart.vue | 4 +++- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/frontend/simple-tracker/src/components/charts/AppBarChart.vue b/frontend/simple-tracker/src/components/charts/AppBarChart.vue index 91a91dd..447a17f 100644 --- a/frontend/simple-tracker/src/components/charts/AppBarChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppBarChart.vue @@ -22,10 +22,7 @@ const chartjsData = computed(() => { labels: props.chartData.points.x, datasets: props.chartData.points.ys.map((dataset) => ({ ...dataset, - borderColor: dataset.backgroundColor, - borderWidth: 2, borderRadius: 2, - lineTension: 0.4, })), }; }); diff --git a/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue b/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue index 8d7fe47..88ab31f 100644 --- a/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue @@ -23,8 +23,6 @@ const chartjsData = computed(() => { datasets: props.chartData.points.ys.map((dataset) => ({ ...dataset, borderColor: dataset.backgroundColor, - borderWidth: 2, - borderRadius: 2, lineTension: 0.4, })), }; diff --git a/frontend/simple-tracker/src/components/charts/AppLineChart.vue b/frontend/simple-tracker/src/components/charts/AppLineChart.vue index 844b869..fb23b6b 100644 --- a/frontend/simple-tracker/src/components/charts/AppLineChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppLineChart.vue @@ -8,6 +8,7 @@ import { useChartHelpersStore } from "../../stores/chartHelpers"; import type { ChartConfig, ChartData } from "../../common/charts/charts.types"; import { Line } from "vue-chartjs"; import { Chart as ChartJS, LineElement, PointElement } from "chart.js"; +import { useStyleStore } from "../../stores/style"; ChartJS.register(LineElement, PointElement); const props = defineProps<{ @@ -16,13 +17,14 @@ const props = defineProps<{ }>(); const chartHelpers = useChartHelpersStore(); +const styleStore = useStyleStore(); const chartjsData = computed(() => { return { labels: props.chartData.points.x, datasets: props.chartData.points.ys.map((dataset) => ({ ...dataset, - borderColor: dataset.backgroundColor, + borderColor: styleStore.getPrimaryColor(), borderWidth: 2, borderRadius: 2, lineTension: 0.4, From aaa6eacf04dc1f4d4b7c6ed5f5ab3162fca4f05c Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sat, 19 Jul 2025 16:32:40 +0200 Subject: [PATCH 14/44] add gradient to line chart --- .../src/components/charts/AppBarChart.vue | 4 +- .../components/charts/AppDoughnutChart.vue | 4 +- .../src/components/charts/AppLineChart.vue | 90 +++++++++++++------ 3 files changed, 69 insertions(+), 29 deletions(-) diff --git a/frontend/simple-tracker/src/components/charts/AppBarChart.vue b/frontend/simple-tracker/src/components/charts/AppBarChart.vue index 447a17f..a762391 100644 --- a/frontend/simple-tracker/src/components/charts/AppBarChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppBarChart.vue @@ -7,8 +7,8 @@ import { computed } from "vue"; import { useChartHelpersStore } from "../../stores/chartHelpers"; import type { ChartConfig, ChartData } from "../../common/charts/charts.types"; import { Bar } from "vue-chartjs"; -import { Chart as ChartJS, BarElement } from "chart.js"; -ChartJS.register(BarElement); +import { Chart as ChartJS, registerables } from "chart.js"; +ChartJS.register(...registerables); const props = defineProps<{ chartConfig: ChartConfig; diff --git a/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue b/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue index 88ab31f..24ee238 100644 --- a/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppDoughnutChart.vue @@ -7,8 +7,8 @@ import { computed } from "vue"; import { useChartHelpersStore } from "../../stores/chartHelpers"; import type { ChartConfig, ChartData } from "../../common/charts/charts.types"; import { Doughnut } from "vue-chartjs"; -import { Chart as ChartJS, ArcElement } from "chart.js"; -ChartJS.register(ArcElement); +import { Chart as ChartJS, registerables } from "chart.js"; +ChartJS.register(...registerables); const props = defineProps<{ chartConfig: ChartConfig; diff --git a/frontend/simple-tracker/src/components/charts/AppLineChart.vue b/frontend/simple-tracker/src/components/charts/AppLineChart.vue index fb23b6b..d6cd2b3 100644 --- a/frontend/simple-tracker/src/components/charts/AppLineChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppLineChart.vue @@ -7,9 +7,9 @@ import { computed } from "vue"; import { useChartHelpersStore } from "../../stores/chartHelpers"; import type { ChartConfig, ChartData } from "../../common/charts/charts.types"; import { Line } from "vue-chartjs"; -import { Chart as ChartJS, LineElement, PointElement } from "chart.js"; import { useStyleStore } from "../../stores/style"; -ChartJS.register(LineElement, PointElement); +import { Chart as ChartJS, registerables } from "chart.js"; +ChartJS.register(...registerables); const props = defineProps<{ chartConfig: ChartConfig; @@ -24,10 +24,48 @@ const chartjsData = computed(() => { labels: props.chartData.points.x, datasets: props.chartData.points.ys.map((dataset) => ({ ...dataset, - borderColor: styleStore.getPrimaryColor(), + borderColor: (context: any) => { + const chart = context.chart; + const { ctx, chartArea } = chart; + + if (!chartArea) { + // This case happens on initial chart load + return; + } + + const gradient = ctx.createLinearGradient( + 0, + chartArea.top, + 0, + chartArea.bottom + ); + gradient.addColorStop(0, styleStore.getPrimaryColor()); + gradient.addColorStop(1, styleStore.getPrimaryColor() + "40"); + return gradient; + }, + backgroundColor: (context: any) => { + const chart = context.chart; + const { ctx, chartArea } = chart; + + if (!chartArea) { + // This case happens on initial chart load + return; + } + + const gradient = ctx.createLinearGradient( + 0, + chartArea.top, + 0, + chartArea.bottom + ); + gradient.addColorStop(0, styleStore.getPrimaryColor() + "80"); + gradient.addColorStop(1, styleStore.getPrimaryColor() + "00"); + return gradient; + }, borderWidth: 2, borderRadius: 2, lineTension: 0.4, + fill: true, })), }; }); @@ -40,31 +78,33 @@ const chartTicksConfigY = computed(() => { return chartHelpers.chartTicksConfigY(props.chartConfig); }); -const barChartOptions = { - responsive: true, - maintainAspectRatio: false, - plugins: { - legend: { - display: false, - }, - tooltip: chartTooltipConfig.value, - }, - scales: { - y: { - beginAtZero: false, - ticks: chartTicksConfigY.value, - grid: { - color: chartHelpers.chartGridColor, +const barChartOptions = computed(() => { + return { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { + display: false, }, + tooltip: chartTooltipConfig.value, }, - x: { - ticks: { - color: chartHelpers.chartTextColor, + scales: { + y: { + beginAtZero: false, + ticks: chartTicksConfigY.value, + grid: { + color: chartHelpers.chartGridColor, + }, }, - grid: { - color: chartHelpers.chartGridColor, + x: { + ticks: { + color: chartHelpers.chartTextColor, + }, + grid: { + color: chartHelpers.chartGridColor, + }, }, }, - }, -}; + }; +}); From 83f6b32fdea0823571569365d683d482de72bd8a Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sat, 19 Jul 2025 16:49:32 +0200 Subject: [PATCH 15/44] style charts --- .../simple-tracker/src/stores/chartHelpers.ts | 2 +- frontend/simple-tracker/src/stores/style.ts | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/frontend/simple-tracker/src/stores/chartHelpers.ts b/frontend/simple-tracker/src/stores/chartHelpers.ts index 04aa683..e33eeef 100644 --- a/frontend/simple-tracker/src/stores/chartHelpers.ts +++ b/frontend/simple-tracker/src/stores/chartHelpers.ts @@ -10,7 +10,7 @@ export const useChartHelpersStore = defineStore("chartHelpers", () => { const styleStore = useStyleStore(); const chartTextColor = computed(() => { - return styleStore.getPrimaryColor(); + return styleStore.getTextColor(); }); const chartGridColor = computed(() => { return chartTextColor.value + "40"; diff --git a/frontend/simple-tracker/src/stores/style.ts b/frontend/simple-tracker/src/stores/style.ts index 186a8c3..d405e81 100644 --- a/frontend/simple-tracker/src/stores/style.ts +++ b/frontend/simple-tracker/src/stores/style.ts @@ -29,8 +29,29 @@ export const useStyleStore = defineStore("style", () => { return primaryColor; } + function getTextColor(): string { + //find the div with the id "main-div" + const appDiv = document.getElementById(MAIN_DIV_ID); + if (!appDiv) { + throw new Error("app main-div not found"); + } + //create a div with the id "probe" and append it to the app div + const probeDiv = document.createElement("div"); + probeDiv.id = PROBE_DIV_ID; + appDiv.appendChild(probeDiv); + const computedStyle = getComputedStyle(probeDiv); + const textColor = computedStyle.getPropertyValue("--text"); + //remove the probe div + appDiv.removeChild(probeDiv); + //remove the probe div + probeDiv.remove(); + //return the text color + return textColor; + } + return { MAIN_DIV_ID, getPrimaryColor, + getTextColor, }; }); From a4cc8d31d8274e4fece04e9a67542df027c6f86a Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sat, 19 Jul 2025 17:09:40 +0200 Subject: [PATCH 16/44] style charts --- .../src/components/AppNavigation.vue | 1 + .../src/components/charts/AppNewChart.vue | 169 +++++++++--------- 2 files changed, 87 insertions(+), 83 deletions(-) diff --git a/frontend/simple-tracker/src/components/AppNavigation.vue b/frontend/simple-tracker/src/components/AppNavigation.vue index c99b9c5..c551b0b 100644 --- a/frontend/simple-tracker/src/components/AppNavigation.vue +++ b/frontend/simple-tracker/src/components/AppNavigation.vue @@ -32,6 +32,7 @@
diff --git a/frontend/simple-tracker/src/components/charts/AppNewChart.vue b/frontend/simple-tracker/src/components/charts/AppNewChart.vue index a6a6f88..622ded0 100644 --- a/frontend/simple-tracker/src/components/charts/AppNewChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppNewChart.vue @@ -1,97 +1,100 @@ From e9a33747ccc8c79968e557289684a9777286ecbf Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sat, 19 Jul 2025 17:26:35 +0200 Subject: [PATCH 17/44] style charts --- .../src/components/charts/AppNewChart.vue | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/frontend/simple-tracker/src/components/charts/AppNewChart.vue b/frontend/simple-tracker/src/components/charts/AppNewChart.vue index 622ded0..d2b0f5a 100644 --- a/frontend/simple-tracker/src/components/charts/AppNewChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppNewChart.vue @@ -37,12 +37,13 @@
@@ -61,7 +62,7 @@
@@ -71,14 +72,17 @@ -
+
+
+

+ No data available for the selected configuration. +

+
@@ -108,6 +120,7 @@ import { GroupKey, DataPointValue, ChartType, + DataPointValueAesthetics, } from "../../common/charts/charts.types"; import { getAllowedXFields, @@ -152,10 +165,4 @@ watch( } } ); - -const getDataPointValueKey = (value: DataPointValue) => { - return Object.keys(DataPointValue).find( - (key) => DataPointValue[key as keyof typeof DataPointValue] === value - ); -}; From 71559b45953283f64000f0189068d18765816d04 Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sun, 20 Jul 2025 11:37:45 +0200 Subject: [PATCH 18/44] read chart data from backend --- ...50720082656_add_time_entry_report_view.sql | 50 + ...720090624_fix_time_entry_report_issues.sql | 14 + ...8_fix_refresh_time_entry_report_issues.sql | 15 + .../src/common/charts/charts.mockdata.ts | 7140 ----------------- .../src/common/charts/charts.supabase.ts | 23 + .../src/common/charts/charts.ts | 10 +- .../src/components/charts/AppNewChart.vue | 10 +- .../simple-tracker/src/stores/chartData.ts | 21 + 8 files changed, 137 insertions(+), 7146 deletions(-) create mode 100644 backend/supabase/migrations/20250720082656_add_time_entry_report_view.sql create mode 100644 backend/supabase/migrations/20250720090624_fix_time_entry_report_issues.sql create mode 100644 backend/supabase/migrations/20250720092408_fix_refresh_time_entry_report_issues.sql delete mode 100644 frontend/simple-tracker/src/common/charts/charts.mockdata.ts create mode 100644 frontend/simple-tracker/src/common/charts/charts.supabase.ts create mode 100644 frontend/simple-tracker/src/stores/chartData.ts diff --git a/backend/supabase/migrations/20250720082656_add_time_entry_report_view.sql b/backend/supabase/migrations/20250720082656_add_time_entry_report_view.sql new file mode 100644 index 0000000..96cc42e --- /dev/null +++ b/backend/supabase/migrations/20250720082656_add_time_entry_report_view.sql @@ -0,0 +1,50 @@ +set check_function_bodies = off; + +CREATE OR REPLACE FUNCTION public.refresh_time_entry_report() + RETURNS trigger + LANGUAGE plpgsql + SECURITY DEFINER +AS $function$ +BEGIN + REFRESH MATERIALIZED VIEW CONCURRENTLY public.time_entry_report; + RETURN NULL; +END; +$function$ +; + +create materialized view "public"."time_entry_report" as SELECT time_entries.user_id, + time_entries.id AS time_entry_id, + time_entries.notes AS time_entry_notes, + time_entries.task_id, + time_entries.start_time, + time_entries.end_time, + tasks.name AS task_name, + tags.id AS tag_id, + tags.name AS tag_name, + tags.hex_color AS tag_color, + tags.dot_text AS tag_dot_text, + ((EXTRACT(epoch FROM (time_entries.end_time - time_entries.start_time)) * (1000)::numeric))::bigint AS duration, + (EXTRACT(dow FROM time_entries.start_time))::integer AS weekday, + (EXTRACT(month FROM time_entries.start_time))::integer AS month, + (EXTRACT(year FROM time_entries.start_time))::integer AS year, + 1 AS count + FROM (((time_entries + LEFT JOIN tasks ON ((time_entries.task_id = tasks.id))) + LEFT JOIN tasks_tags ON ((tasks_tags.task_id = tasks.id))) + LEFT JOIN tags ON ((tasks_tags.tag_id = tags.id))) + WHERE (time_entries.end_time IS NOT NULL); + + +CREATE INDEX idx_time_entry_report_start_time ON public.time_entry_report USING btree (start_time); + +CREATE INDEX idx_time_entry_report_tag_id ON public.time_entry_report USING btree (tag_id); + +CREATE INDEX idx_time_entry_report_task_id ON public.time_entry_report USING btree (task_id); + +CREATE TRIGGER refresh_time_entry_report_trigger_tags AFTER INSERT OR DELETE OR UPDATE ON public.tags FOR EACH STATEMENT EXECUTE FUNCTION refresh_time_entry_report(); + +CREATE TRIGGER refresh_time_entry_report_trigger_tasks AFTER INSERT OR DELETE OR UPDATE ON public.tasks FOR EACH STATEMENT EXECUTE FUNCTION refresh_time_entry_report(); + +CREATE TRIGGER refresh_time_entry_report_trigger AFTER INSERT OR DELETE OR UPDATE ON public.time_entries FOR EACH STATEMENT EXECUTE FUNCTION refresh_time_entry_report(); + + diff --git a/backend/supabase/migrations/20250720090624_fix_time_entry_report_issues.sql b/backend/supabase/migrations/20250720090624_fix_time_entry_report_issues.sql new file mode 100644 index 0000000..c0566cd --- /dev/null +++ b/backend/supabase/migrations/20250720090624_fix_time_entry_report_issues.sql @@ -0,0 +1,14 @@ +-- add a unique index so view can be updated concurrently +CREATE UNIQUE INDEX IF NOT EXISTS idx_time_entry_report_time_entry_id_tag_id ON public.time_entry_report USING btree (time_entry_id, tag_id); + +-- Create a private schema if it doesn't exist +CREATE SCHEMA IF NOT EXISTS private; + +-- Move the materialized view to the private schema +ALTER MATERIALIZED VIEW public.time_entry_report SET SCHEMA private; + +-- Create a public view with RLS +CREATE OR REPLACE VIEW public.time_entry_report +WITH (security_invoker=on) AS +SELECT * FROM private.time_entry_report +WHERE (select auth.uid()) = user_id; diff --git a/backend/supabase/migrations/20250720092408_fix_refresh_time_entry_report_issues.sql b/backend/supabase/migrations/20250720092408_fix_refresh_time_entry_report_issues.sql new file mode 100644 index 0000000..8e079e3 --- /dev/null +++ b/backend/supabase/migrations/20250720092408_fix_refresh_time_entry_report_issues.sql @@ -0,0 +1,15 @@ +CREATE OR REPLACE FUNCTION public.refresh_time_entry_report() + RETURNS trigger + LANGUAGE plpgsql + SECURITY DEFINER + SET search_path = '' +AS $function$ +BEGIN + REFRESH MATERIALIZED VIEW CONCURRENTLY private.time_entry_report; + RETURN NULL; +END; +$function$ +; + +-- move the function to the private schema +ALTER FUNCTION public.refresh_time_entry_report SET SCHEMA private; \ No newline at end of file diff --git a/frontend/simple-tracker/src/common/charts/charts.mockdata.ts b/frontend/simple-tracker/src/common/charts/charts.mockdata.ts deleted file mode 100644 index 0fe8bc9..0000000 --- a/frontend/simple-tracker/src/common/charts/charts.mockdata.ts +++ /dev/null @@ -1,7140 +0,0 @@ -import type { DataPoint } from "./charts.types"; - -export const data: DataPoint[] = [ - { - time_entry_id: 1, - time_entry_notes: null, - task_id: "task_id_1", - start_time: 1739105604344, - end_time: 1739105605364, - task_name: "Finance & Accounting", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1019, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 2, - time_entry_notes: null, - task_id: "task_id_2", - start_time: 1739105608159, - end_time: 1739105608938, - task_name: "Code Review", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 778, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 3, - time_entry_notes: null, - task_id: "task_id_3", - start_time: 1739105612134, - end_time: 1739105613249, - task_name: "Documentation", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1115, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 4, - time_entry_notes: null, - task_id: "task_id_4", - start_time: 1739105616083, - end_time: 1739105616826, - task_name: "Customer Support", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 742, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 5, - time_entry_notes: null, - task_id: "task_id_5", - start_time: 1739105620201, - end_time: 1739105621096, - task_name: "Client Meeting", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 894, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 6, - time_entry_notes: null, - task_id: "task_id_6", - start_time: 1739105624710, - end_time: 1739105625450, - task_name: "Team Stand-up", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 739, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 7, - time_entry_notes: null, - task_id: "task_id_7", - start_time: 1739105629134, - end_time: 1739105637299, - task_name: "Bug Fixing", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 8164, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 8, - time_entry_notes: null, - task_id: "task_id_8", - start_time: 1739105641241, - end_time: 1739105642283, - task_name: "Development", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1041, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 9, - time_entry_notes: null, - task_id: "task_id_9", - start_time: 1739105644879, - end_time: 1739105645932, - task_name: "Marketing Campaign", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1052, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 10, - time_entry_notes: null, - task_id: "task_id_10", - start_time: 1739105648774, - end_time: 1739105653759, - task_name: "HR & Recruiting", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4985, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 11, - time_entry_notes: null, - task_id: "task_id_11", - start_time: 1739105656473, - end_time: 1739107942155, - task_name: "Testing", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2285681, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 12, - time_entry_notes: null, - task_id: "task_id_12", - start_time: 1739107947196, - end_time: 1739108581686, - task_name: "Sales Call", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 634490, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 13, - time_entry_notes: null, - task_id: "task_id_13", - start_time: 1739108588529, - end_time: 1739109523417, - task_name: "Project Management", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 934888, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 14, - time_entry_notes: null, - task_id: "task_id_14", - start_time: 1739109536552, - end_time: 1739110217478, - task_name: "Research", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 680926, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 15, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739114139555, - end_time: 1739116214894, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2075338, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 16, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1741678269166, - end_time: 1741679557631, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1288465, - weekday: 2, - month: 3, - year: 2025, - }, - { - time_entry_id: 16, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1741678269166, - end_time: 1741679557631, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1288465, - weekday: 2, - month: 3, - year: 2025, - }, - { - time_entry_id: 17, - time_entry_notes: null, - task_id: "task_id_17", - start_time: 1741775196498, - end_time: 1741781207133, - task_name: "Training & Development", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 6010635, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 18, - time_entry_notes: null, - task_id: "task_id_17", - start_time: 1741783774132, - end_time: 1741784917987, - task_name: "Training & Development", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 1143855, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 19, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742409830212, - end_time: 1742419517066, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 9686854, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 20, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739116932704, - end_time: 1739116966109, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 33405, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 21, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1741855933952, - end_time: 1741856963453, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1029501, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 22, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739116979520, - end_time: 1739117029915, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 50395, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 23, - time_entry_notes: null, - task_id: "task_id_19", - start_time: 1741998284520, - end_time: 1742026345581, - task_name: "Operations", - tag_id: "tag_id_5", - tag_name: "non-billable", - tag_color: "#3e3d85", - tag_dot_text: null, - duration: 28061061, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 24, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742057161141, - end_time: 1742071538997, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 14377856, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 25, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742542744634, - end_time: 1742544243913, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1499279, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 25, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742542744634, - end_time: 1742544243913, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1499279, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 26, - time_entry_notes: null, - task_id: "task_id_20", - start_time: 1742637884238, - end_time: 1742644907962, - task_name: "Content Creation", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 7023724, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 26, - time_entry_notes: null, - task_id: "task_id_20", - start_time: 1742637884238, - end_time: 1742644907962, - task_name: "Content Creation", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 7023724, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 27, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739117202356, - end_time: 1739117302226, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 99869, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 28, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742734583220, - end_time: 1742740381870, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 5798650, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 29, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739117331840, - end_time: 1739117649895, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 318054, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 30, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1743012432312, - end_time: 1743013097764, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 665452, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 31, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739117690196, - end_time: 1739117980110, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 289913, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 32, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1743321153099, - end_time: 1743321945045, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 791946, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 33, - time_entry_notes: null, - task_id: "task_id_21", - start_time: 1743358143123, - end_time: 1743358148640, - task_name: "Anonymized Task 1", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 5517, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 34, - time_entry_notes: null, - task_id: "task_id_22", - start_time: 1739119767795, - end_time: 1739119770057, - task_name: "Anonymized Task 2", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2262, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 35, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739119772515, - end_time: 1739119774206, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1691, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 36, - time_entry_notes: null, - task_id: "task_id_23", - start_time: 1739119994720, - end_time: 1739119996876, - task_name: "Anonymized Task 3", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2155, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 37, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739120007953, - end_time: 1739120013187, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 5234, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 38, - time_entry_notes: null, - task_id: "task_id_23", - start_time: 1739120013732, - end_time: 1739120269277, - task_name: "Anonymized Task 3", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 255545, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 39, - time_entry_notes: null, - task_id: "task_id_24", - start_time: 1739120395851, - end_time: 1739120397060, - task_name: "Anonymized Task 4", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1208, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 40, - time_entry_notes: null, - task_id: "task_id_15", - start_time: 1739120863096, - end_time: 1739120864426, - task_name: "Design", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1329, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 41, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1743588118332, - end_time: 1743588964113, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 845781, - weekday: 3, - month: 4, - year: 2025, - }, - { - time_entry_id: 42, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1743926174536, - end_time: 1743926930630, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 756094, - weekday: 0, - month: 4, - year: 2025, - }, - { - time_entry_id: 43, - time_entry_notes: null, - task_id: "task_id_23", - start_time: 1739121795611, - end_time: 1739121802752, - task_name: "Anonymized Task 3", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7140, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 44, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1744534612479, - end_time: 1744535582773, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 970294, - weekday: 0, - month: 4, - year: 2025, - }, - { - time_entry_id: 45, - time_entry_notes: null, - task_id: "task_id_25", - start_time: 1739125901895, - end_time: 1739125921570, - task_name: "Anonymized Task 5", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 19674, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 46, - time_entry_notes: null, - task_id: "task_id_25", - start_time: 1739125925719, - end_time: 1739126071016, - task_name: "Anonymized Task 5", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 145296, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 47, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745304033862, - end_time: 1745305306043, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1272181, - weekday: 2, - month: 4, - year: 2025, - }, - { - time_entry_id: 47, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745304033862, - end_time: 1745305306043, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1272181, - weekday: 2, - month: 4, - year: 2025, - }, - { - time_entry_id: 48, - time_entry_notes: null, - task_id: "task_id_26", - start_time: 1739126170944, - end_time: 1739126229843, - task_name: "Anonymized Task 6", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 58899, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 49, - time_entry_notes: null, - task_id: "task_id_27", - start_time: 1739126518652, - end_time: 1739126524709, - task_name: "Anonymized Task 7", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 6056, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 50, - time_entry_notes: null, - task_id: "task_id_27", - start_time: 1739126572982, - end_time: 1739126580850, - task_name: "Anonymized Task 7", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7868, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 51, - time_entry_notes: null, - task_id: "task_id_28", - start_time: 1739127138050, - end_time: 1739135029333, - task_name: "Anonymized Task 8", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7891283, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 52, - time_entry_notes: null, - task_id: "task_id_29", - start_time: 1739174823587, - end_time: 1739180813163, - task_name: "Anonymized Task 9", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 5989575, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 53, - time_entry_notes: null, - task_id: "task_id_30", - start_time: 1739180819296, - end_time: 1739180955179, - task_name: "Anonymized Task 10", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 135883, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 54, - time_entry_notes: null, - task_id: "task_id_31", - start_time: 1739180959558, - end_time: 1739182037984, - task_name: "Anonymized Task 11", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1078426, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 55, - time_entry_notes: null, - task_id: "task_id_31", - start_time: 1739182042465, - end_time: 1739182633555, - task_name: "Anonymized Task 11", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 591089, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 56, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1745569721979, - end_time: 1745570913266, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1191287, - weekday: 5, - month: 4, - year: 2025, - }, - { - time_entry_id: 57, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745822100861, - end_time: 1745823457266, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1356405, - weekday: 1, - month: 4, - year: 2025, - }, - { - time_entry_id: 57, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745822100861, - end_time: 1745823457266, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1356405, - weekday: 1, - month: 4, - year: 2025, - }, - { - time_entry_id: 58, - time_entry_notes: null, - task_id: "task_id_32", - start_time: 1739183358469, - end_time: 1739189693132, - task_name: "Anonymized Task 12", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 6334663, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 59, - time_entry_notes: null, - task_id: "task_id_33", - start_time: 1739193584610, - end_time: 1739193853888, - task_name: "Anonymized Task 13", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 269277, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 60, - time_entry_notes: null, - task_id: "task_id_34", - start_time: 1739194317912, - end_time: 1739203355568, - task_name: "Anonymized Task 14", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9037655, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 61, - time_entry_notes: null, - task_id: "task_id_35", - start_time: 1739262992769, - end_time: 1739265154661, - task_name: "Anonymized Task 15", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2161891, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 62, - time_entry_notes: null, - task_id: "task_id_33", - start_time: 1739265162468, - end_time: 1739267274547, - task_name: "Anonymized Task 13", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2112079, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 63, - time_entry_notes: null, - task_id: "task_id_36", - start_time: 1739271304402, - end_time: 1739272875754, - task_name: "Anonymized Task 16", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1571351, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 64, - time_entry_notes: null, - task_id: "task_id_37", - start_time: 1739272880407, - end_time: 1739281003560, - task_name: "Anonymized Task 17", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 8123153, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 65, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739281008213, - end_time: 1739281940354, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 932141, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 66, - time_entry_notes: null, - task_id: "task_id_39", - start_time: 1739282644837, - end_time: 1739283199946, - task_name: "Anonymized Task 19", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 555109, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 67, - time_entry_notes: null, - task_id: "task_id_40", - start_time: 1739283328920, - end_time: 1739294882012, - task_name: "Anonymized Task 20", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 11553092, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 68, - time_entry_notes: null, - task_id: "task_id_41", - start_time: 1739359205829, - end_time: 1739359216598, - task_name: "Anonymized Task 21", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 10769, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 69, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739360176401, - end_time: 1739360283971, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 107570, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 70, - time_entry_notes: null, - task_id: "task_id_42", - start_time: 1739360401086, - end_time: 1739360423717, - task_name: "Anonymized Task 22", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 22630, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 71, - time_entry_notes: null, - task_id: "task_id_43", - start_time: 1739360427417, - end_time: 1739360434261, - task_name: "Anonymized Task 23", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 6843, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 72, - time_entry_notes: null, - task_id: "task_id_44", - start_time: 1739360438345, - end_time: 1739360446201, - task_name: "Anonymized Task 24", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7856, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 73, - time_entry_notes: null, - task_id: "task_id_45", - start_time: 1739360449959, - end_time: 1739360457390, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7430, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 74, - time_entry_notes: null, - task_id: "task_id_46", - start_time: 1739360461039, - end_time: 1739360468346, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7306, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 75, - time_entry_notes: null, - task_id: "task_id_47", - start_time: 1739360471927, - end_time: 1739360481711, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9784, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 76, - time_entry_notes: null, - task_id: "task_id_48", - start_time: 1739360485292, - end_time: 1739360516188, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 30896, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 77, - time_entry_notes: null, - task_id: "task_id_49", - start_time: 1739360520099, - end_time: 1739360521234, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1135, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 78, - time_entry_notes: null, - task_id: "task_id_46", - start_time: 1739360633096, - end_time: 1739360647788, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 14691, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 79, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1744198453301, - end_time: 1744199610010, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1156709, - weekday: 3, - month: 4, - year: 2025, - }, - { - time_entry_id: 80, - time_entry_notes: null, - task_id: "task_id_50", - start_time: 1746190409404, - end_time: 1746195643297, - task_name: "Anonymized Task 26", - tag_id: "tag_id_7", - tag_name: "research", - tag_color: "#ac41a7", - tag_dot_text: null, - duration: 5233893, - weekday: 5, - month: 5, - year: 2025, - }, - { - time_entry_id: 80, - time_entry_notes: null, - task_id: "task_id_50", - start_time: 1746190409404, - end_time: 1746195643297, - task_name: "Anonymized Task 26", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 5233893, - weekday: 5, - month: 5, - year: 2025, - }, - { - time_entry_id: 81, - time_entry_notes: null, - task_id: "task_id_51", - start_time: 1746263553276, - end_time: 1746264530770, - task_name: "Anonymized Task 27", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 977494, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 81, - time_entry_notes: null, - task_id: "task_id_51", - start_time: 1746263553276, - end_time: 1746264530770, - task_name: "Anonymized Task 27", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 977494, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 82, - time_entry_notes: null, - task_id: "task_id_52", - start_time: 1746266846521, - end_time: 1746268094280, - task_name: "Anonymized Task 28", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 1247759, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 82, - time_entry_notes: null, - task_id: "task_id_52", - start_time: 1746266846521, - end_time: 1746268094280, - task_name: "Anonymized Task 28", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 1247759, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 83, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749533256369, - end_time: 1749534765222, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1508853, - weekday: 2, - month: 6, - year: 2025, - }, - { - time_entry_id: 83, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749533256369, - end_time: 1749534765222, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1508853, - weekday: 2, - month: 6, - year: 2025, - }, - { - time_entry_id: 84, - time_entry_notes: null, - task_id: "task_id_53", - start_time: 1739360701004, - end_time: 1739360701810, - task_name: "Anonymized Task 29", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 806, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 85, - time_entry_notes: null, - task_id: "task_id_46", - start_time: 1739360714251, - end_time: 1739360715105, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 854, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 86, - time_entry_notes: null, - task_id: "task_id_54", - start_time: 1739360723818, - end_time: 1739360737083, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 13265, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 87, - time_entry_notes: null, - task_id: "task_id_53", - start_time: 1739361046648, - end_time: 1739361047610, - task_name: "Anonymized Task 29", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 961, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 88, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739361051912, - end_time: 1739361052575, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 663, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 89, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739361310315, - end_time: 1739361586716, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 276401, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 90, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739361587556, - end_time: 1739361590274, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2718, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 91, - time_entry_notes: null, - task_id: "task_id_46", - start_time: 1739361592261, - end_time: 1739361841999, - task_name: "Anonymized Task 25", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 249737, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 92, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739361842753, - end_time: 1739361844779, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2026, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 93, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739361849574, - end_time: 1739361923254, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 73680, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 94, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739361989725, - end_time: 1739362070017, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 80292, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 95, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739362070758, - end_time: 1739362077950, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7191, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 96, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739362078680, - end_time: 1739362085425, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 6745, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 97, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739362086178, - end_time: 1739362090238, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4060, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 98, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739362091035, - end_time: 1739362095034, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3999, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 99, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739362095765, - end_time: 1739362100793, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 5028, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 100, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739362101514, - end_time: 1739362113015, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 11500, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 101, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739362113910, - end_time: 1739362262853, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 148943, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 102, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739362263603, - end_time: 1739362265556, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1952, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 103, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739362270411, - end_time: 1739362271960, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1548, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 104, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739362505666, - end_time: 1739364239993, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1734326, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 105, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739364240884, - end_time: 1739364243347, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2463, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 106, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739364244093, - end_time: 1739364245894, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1801, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 107, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739364248905, - end_time: 1739364350512, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 101607, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 108, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739364351255, - end_time: 1739364353490, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2234, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 109, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739364354262, - end_time: 1739364356353, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2090, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 110, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739364357173, - end_time: 1739364359589, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2416, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 111, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739364360358, - end_time: 1739364381663, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 21304, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 112, - time_entry_notes: null, - task_id: "task_id_55", - start_time: 1739364382424, - end_time: 1739364383606, - task_name: "Anonymized Task 30", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1181, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 113, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739364384359, - end_time: 1739365531789, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1147429, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 114, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1741591805065, - end_time: 1741593115687, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1310622, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 114, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1741591805065, - end_time: 1741593115687, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1310622, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 115, - time_entry_notes: null, - task_id: "task_id_56", - start_time: 1741684923269, - end_time: 1741694586505, - task_name: "Anonymized Task 31", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 9663236, - weekday: 2, - month: 3, - year: 2025, - }, - { - time_entry_id: 116, - time_entry_notes: null, - task_id: "task_id_39", - start_time: 1739365550312, - end_time: 1739365647700, - task_name: "Anonymized Task 19", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 97388, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 117, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739365648637, - end_time: 1739365701685, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 53047, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 118, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739365720840, - end_time: 1739365724694, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3854, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 119, - time_entry_notes: null, - task_id: "task_id_38", - start_time: 1739367445758, - end_time: 1739367502324, - task_name: "Anonymized Task 18", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 56566, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 120, - time_entry_notes: null, - task_id: "task_id_57", - start_time: 1739367521944, - end_time: 1739370178606, - task_name: "Anonymized Task 32", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2656662, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 121, - time_entry_notes: null, - task_id: "task_id_58", - start_time: 1739370185879, - end_time: 1739387951646, - task_name: "Anonymized Task 33", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 17765767, - weekday: 3, - month: 2, - year: 2025, - }, - { - time_entry_id: 122, - time_entry_notes: null, - task_id: "task_id_59", - start_time: 1739520908573, - end_time: 1739524474835, - task_name: "Anonymized Task 20", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3566262, - weekday: 5, - month: 2, - year: 2025, - }, - { - time_entry_id: 123, - time_entry_notes: null, - task_id: "task_id_37", - start_time: 1739524487382, - end_time: 1739527282895, - task_name: "Anonymized Task 17", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2795512, - weekday: 5, - month: 2, - year: 2025, - }, - { - time_entry_id: 124, - time_entry_notes: null, - task_id: "task_id_60", - start_time: 1739527288084, - end_time: 1739528188284, - task_name: "Anonymized Task 34", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 900199, - weekday: 5, - month: 2, - year: 2025, - }, - { - time_entry_id: 125, - time_entry_notes: null, - task_id: "task_id_61", - start_time: 1739528199690, - end_time: 1739529712992, - task_name: "Anonymized Task 35", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1513301, - weekday: 5, - month: 2, - year: 2025, - }, - { - time_entry_id: 126, - time_entry_notes: null, - task_id: "task_id_62", - start_time: 1739530325815, - end_time: 1739530911039, - task_name: "Anonymized Task 36", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 585224, - weekday: 5, - month: 2, - year: 2025, - }, - { - time_entry_id: 127, - time_entry_notes: null, - task_id: "task_id_63", - start_time: 1739531101950, - end_time: 1739533065879, - task_name: "Anonymized Task 37", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1963929, - weekday: 5, - month: 2, - year: 2025, - }, - { - time_entry_id: 128, - time_entry_notes: null, - task_id: "task_id_63", - start_time: 1739631185953, - end_time: 1739631188402, - task_name: "Anonymized Task 37", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2449, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 129, - time_entry_notes: null, - task_id: "task_id_64", - start_time: 1739631314850, - end_time: 1739634818851, - task_name: "Anonymized Task 38", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3504001, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 130, - time_entry_notes: null, - task_id: "task_id_61", - start_time: 1739634819491, - end_time: 1739634869161, - task_name: "Anonymized Task 35", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 49669, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 131, - time_entry_notes: null, - task_id: "task_id_61", - start_time: 1739635176413, - end_time: 1739636078662, - task_name: "Anonymized Task 35", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 902249, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 132, - time_entry_notes: null, - task_id: "task_id_17", - start_time: 1741781230485, - end_time: 1741781816890, - task_name: "Training & Development", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 586405, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 133, - time_entry_notes: null, - task_id: "task_id_61", - start_time: 1739639154370, - end_time: 1739639174236, - task_name: "Anonymized Task 35", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 19865, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 134, - time_entry_notes: null, - task_id: "task_id_17", - start_time: 1741785025522, - end_time: 1741785397667, - task_name: "Training & Development", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 372145, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 135, - time_entry_notes: null, - task_id: "task_id_63", - start_time: 1739640095578, - end_time: 1739640426853, - task_name: "Anonymized Task 37", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 331275, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 136, - time_entry_notes: null, - task_id: "task_id_61", - start_time: 1739640427518, - end_time: 1739640437823, - task_name: "Anonymized Task 35", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 10305, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 137, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742112781462, - end_time: 1742113766097, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 984635, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 138, - time_entry_notes: null, - task_id: "task_id_61", - start_time: 1739640539654, - end_time: 1739640551657, - task_name: "Anonymized Task 35", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 12002, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 139, - time_entry_notes: null, - task_id: "task_id_61", - start_time: 1739640559666, - end_time: 1739642501150, - task_name: "Anonymized Task 35", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1941484, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 140, - time_entry_notes: null, - task_id: "task_id_64", - start_time: 1739642501660, - end_time: 1739712336160, - task_name: "Anonymized Task 38", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 69834500, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 141, - time_entry_notes: null, - task_id: "task_id_65", - start_time: 1739712839326, - end_time: 1739713148140, - task_name: "Anonymized Task 39", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 308814, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 142, - time_entry_notes: null, - task_id: "task_id_65", - start_time: 1739713163171, - end_time: 1739713169407, - task_name: "Anonymized Task 39", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 6236, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 143, - time_entry_notes: null, - task_id: "task_id_64", - start_time: 1739713201753, - end_time: 1739713205504, - task_name: "Anonymized Task 38", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3750, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 144, - time_entry_notes: null, - task_id: "task_id_66", - start_time: 1739730967695, - end_time: 1739739712390, - task_name: "Anonymized Task 40", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 8744695, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 145, - time_entry_notes: null, - task_id: "task_id_67", - start_time: 1739780227850, - end_time: 1739781969239, - task_name: "Anonymized Task 41", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1741388, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 146, - time_entry_notes: null, - task_id: "task_id_68", - start_time: 1739783534665, - end_time: 1739784755053, - task_name: "Anonymized Task 42", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1220387, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 147, - time_entry_notes: null, - task_id: "task_id_69", - start_time: 1739790688322, - end_time: 1739798034186, - task_name: "Anonymized Task 43", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7345864, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 148, - time_entry_notes: null, - task_id: "task_id_70", - start_time: 1741856993389, - end_time: 1741859060852, - task_name: "Anonymized Task 44", - tag_id: "tag_id_9", - tag_name: "internal", - tag_color: "#d8c371", - tag_dot_text: null, - duration: 2067463, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 149, - time_entry_notes: null, - task_id: "task_id_71", - start_time: 1739799198287, - end_time: 1739806706358, - task_name: "Anonymized Task 45", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7508071, - weekday: 1, - month: 2, - year: 2025, - }, - { - time_entry_id: 150, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742026370144, - end_time: 1742027231406, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 861262, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 151, - time_entry_notes: null, - task_id: "task_id_72", - start_time: 1739872245126, - end_time: 1739879373616, - task_name: "Anonymized Task 46", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7128489, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 152, - time_entry_notes: null, - task_id: "task_id_73", - start_time: 1739879384806, - end_time: 1739891586303, - task_name: "Anonymized Task 47", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 12201497, - weekday: 2, - month: 2, - year: 2025, - }, - { - time_entry_id: 153, - time_entry_notes: null, - task_id: "task_id_74", - start_time: 1740045938014, - end_time: 1740047970326, - task_name: "Anonymized Task 48", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2032311, - weekday: 4, - month: 2, - year: 2025, - }, - { - time_entry_id: 154, - time_entry_notes: null, - task_id: "task_id_75", - start_time: 1740047976589, - end_time: 1740056639468, - task_name: "Anonymized Task 49", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 8662879, - weekday: 4, - month: 2, - year: 2025, - }, - { - time_entry_id: 155, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742456245415, - end_time: 1742457607667, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1362252, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 155, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742456245415, - end_time: 1742457607667, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1362252, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 156, - time_entry_notes: null, - task_id: "task_id_76", - start_time: 1740088634143, - end_time: 1740123687289, - task_name: "Anonymized Task 50", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 35053146, - weekday: 4, - month: 2, - year: 2025, - }, - { - time_entry_id: 157, - time_entry_notes: null, - task_id: "task_id_77", - start_time: 1740125872563, - end_time: 1740136838975, - task_name: "Anonymized Task 51", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 10966412, - weekday: 5, - month: 2, - year: 2025, - }, - { - time_entry_id: 158, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742578680354, - end_time: 1742579689993, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1009639, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 159, - time_entry_notes: null, - task_id: "task_id_78", - start_time: 1742644935741, - end_time: 1742647677038, - task_name: "Anonymized Task 52", - tag_id: "tag_id_10", - tag_name: "improvement", - tag_color: "#45b6c7", - tag_dot_text: null, - duration: 2741297, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 159, - time_entry_notes: null, - task_id: "task_id_78", - start_time: 1742644935741, - end_time: 1742647677038, - task_name: "Anonymized Task 52", - tag_id: "tag_id_11", - tag_name: "bug", - tag_color: "#9f7e32", - tag_dot_text: null, - duration: 2741297, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 160, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1742755952817, - end_time: 1742759585059, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3632242, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 161, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743060628080, - end_time: 1743061970446, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1342366, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 161, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743060628080, - end_time: 1743061970446, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1342366, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 162, - time_entry_notes: null, - task_id: "task_id_80", - start_time: 1743328020250, - end_time: 1743331835913, - task_name: "Anonymized Task 54", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 3815663, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 162, - time_entry_notes: null, - task_id: "task_id_80", - start_time: 1743328020250, - end_time: 1743331835913, - task_name: "Anonymized Task 54", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 3815663, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 163, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743402854908, - end_time: 1743404608054, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1753146, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 163, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743402854908, - end_time: 1743404608054, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1753146, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 164, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1744007803468, - end_time: 1744009194198, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1390730, - weekday: 1, - month: 4, - year: 2025, - }, - { - time_entry_id: 164, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1744007803468, - end_time: 1744009194198, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1390730, - weekday: 1, - month: 4, - year: 2025, - }, - { - time_entry_id: 165, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1744267139244, - end_time: 1744268477417, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1338173, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 165, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1744267139244, - end_time: 1744268477417, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1338173, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 166, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1744795475581, - end_time: 1744796466086, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 990505, - weekday: 3, - month: 4, - year: 2025, - }, - { - time_entry_id: 167, - time_entry_notes: null, - task_id: "task_id_19", - start_time: 1743459503656, - end_time: 1743488967902, - task_name: "Operations", - tag_id: "tag_id_5", - tag_name: "non-billable", - tag_color: "#3e3d85", - tag_dot_text: null, - duration: 29464246, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 168, - time_entry_notes: null, - task_id: "task_id_56", - start_time: 1741699272136, - end_time: 1741700577194, - task_name: "Anonymized Task 31", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 1305058, - weekday: 2, - month: 3, - year: 2025, - }, - { - time_entry_id: 169, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743661958096, - end_time: 1743663360641, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1402545, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 169, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743661958096, - end_time: 1743663360641, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1402545, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 170, - time_entry_notes: null, - task_id: "task_id_81", - start_time: 1744030117755, - end_time: 1744034705950, - task_name: "Anonymized Task 55", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4588195, - weekday: 1, - month: 4, - year: 2025, - }, - { - time_entry_id: 171, - time_entry_notes: null, - task_id: "task_id_78", - start_time: 1741781827278, - end_time: 1741783457502, - task_name: "Anonymized Task 52", - tag_id: "tag_id_10", - tag_name: "improvement", - tag_color: "#45b6c7", - tag_dot_text: null, - duration: 1630224, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 171, - time_entry_notes: null, - task_id: "task_id_78", - start_time: 1741781827278, - end_time: 1741783457502, - task_name: "Anonymized Task 52", - tag_id: "tag_id_11", - tag_name: "bug", - tag_color: "#9f7e32", - tag_dot_text: null, - duration: 1630224, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 172, - time_entry_notes: null, - task_id: "task_id_82", - start_time: 1740231827413, - end_time: 1740232279690, - task_name: "Anonymized Task 56", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 452277, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 173, - time_entry_notes: null, - task_id: "task_id_17", - start_time: 1741787356976, - end_time: 1741789966399, - task_name: "Training & Development", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 2609423, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 174, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1741201409104, - end_time: 1741208465185, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7056081, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 175, - time_entry_notes: null, - task_id: "task_id_82", - start_time: 1740232421766, - end_time: 1740232655985, - task_name: "Anonymized Task 56", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 234218, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 176, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1749630296508, - end_time: 1749631363454, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1066946, - weekday: 3, - month: 6, - year: 2025, - }, - { - time_entry_id: 177, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746204180193, - end_time: 1746204631682, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 451489, - weekday: 5, - month: 5, - year: 2025, - }, - { - time_entry_id: 178, - time_entry_notes: null, - task_id: "task_id_82", - start_time: 1740233335826, - end_time: 1740233347797, - task_name: "Anonymized Task 56", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 11971, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 179, - time_entry_notes: null, - task_id: "task_id_83", - start_time: 1744355952001, - end_time: 1744364940066, - task_name: "Anonymized Task 57", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 8988065, - weekday: 5, - month: 4, - year: 2025, - }, - { - time_entry_id: 180, - time_entry_notes: null, - task_id: "task_id_84", - start_time: 1741865936016, - end_time: 1741876097217, - task_name: "Anonymized Task 58", - tag_id: "tag_id_12", - tag_name: "sales", - tag_color: "#328b86", - tag_dot_text: null, - duration: 10161201, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 180, - time_entry_notes: null, - task_id: "task_id_84", - start_time: 1741865936016, - end_time: 1741876097217, - task_name: "Anonymized Task 58", - tag_id: "tag_id_13", - tag_name: "support", - tag_color: "#3f756a", - tag_dot_text: null, - duration: 10161201, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 181, - time_entry_notes: null, - task_id: "task_id_85", - start_time: 1742032443790, - end_time: 1742048764082, - task_name: "Anonymized Task 59", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 16320292, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 181, - time_entry_notes: null, - task_id: "task_id_85", - start_time: 1742032443790, - end_time: 1742048764082, - task_name: "Anonymized Task 59", - tag_id: "tag_id_14", - tag_name: "planning", - tag_color: "#991865", - tag_dot_text: null, - duration: 16320292, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 182, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742216348894, - end_time: 1742216933766, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 584872, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 183, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1741511348142, - end_time: 1741511800090, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 451948, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 184, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742489559596, - end_time: 1742491070658, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1511062, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 184, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742489559596, - end_time: 1742491070658, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1511062, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 185, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742589317913, - end_time: 1742590920295, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1602382, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 186, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742725176268, - end_time: 1742726116442, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 940174, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 187, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742801885109, - end_time: 1742803252389, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1367280, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 187, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742801885109, - end_time: 1742803252389, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1367280, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 188, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743147327731, - end_time: 1743149015945, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1688214, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 188, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743147327731, - end_time: 1743149015945, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1688214, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 189, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1741427140536, - end_time: 1741430700312, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 3559776, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 190, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1744871510772, - end_time: 1744872875355, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1364583, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 190, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1744871510772, - end_time: 1744872875355, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1364583, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 191, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1745138606351, - end_time: 1745139593319, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 986968, - weekday: 0, - month: 4, - year: 2025, - }, - { - time_entry_id: 192, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745393256796, - end_time: 1745394343691, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1086895, - weekday: 3, - month: 4, - year: 2025, - }, - { - time_entry_id: 192, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745393256796, - end_time: 1745394343691, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1086895, - weekday: 3, - month: 4, - year: 2025, - }, - { - time_entry_id: 193, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1745653865396, - end_time: 1745654901916, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1036520, - weekday: 6, - month: 4, - year: 2025, - }, - { - time_entry_id: 194, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745908788016, - end_time: 1745910118908, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1330892, - weekday: 2, - month: 4, - year: 2025, - }, - { - time_entry_id: 194, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745908788016, - end_time: 1745910118908, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1330892, - weekday: 2, - month: 4, - year: 2025, - }, - { - time_entry_id: 195, - time_entry_notes: null, - task_id: "task_id_19", - start_time: 1747286928878, - end_time: 1747288357568, - task_name: "Operations", - tag_id: "tag_id_5", - tag_name: "non-billable", - tag_color: "#3e3d85", - tag_dot_text: null, - duration: 1428690, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 196, - time_entry_notes: null, - task_id: "task_id_86", - start_time: 1746268112460, - end_time: 1746268346676, - task_name: "Anonymized Task 60", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 234216, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 196, - time_entry_notes: null, - task_id: "task_id_86", - start_time: 1746268112460, - end_time: 1746268346676, - task_name: "Anonymized Task 60", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 234216, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 197, - time_entry_notes: null, - task_id: "task_id_87", - start_time: 1746274810757, - end_time: 1746291277079, - task_name: "Anonymized Task 61", - tag_id: "tag_id_15", - tag_name: "marketing", - tag_color: "#64baa7", - tag_dot_text: null, - duration: 16466322, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 198, - time_entry_notes: null, - task_id: "task_id_87", - start_time: 1746350894828, - end_time: 1746369063875, - task_name: "Anonymized Task 61", - tag_id: "tag_id_15", - tag_name: "marketing", - tag_color: "#64baa7", - tag_dot_text: null, - duration: 18169047, - weekday: 0, - month: 5, - year: 2025, - }, - { - time_entry_id: 199, - time_entry_notes: null, - task_id: "task_id_88", - start_time: 1746453406285, - end_time: 1746458842037, - task_name: "Anonymized Task 62", - tag_id: "tag_id_7", - tag_name: "research", - tag_color: "#ac41a7", - tag_dot_text: null, - duration: 5435752, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 199, - time_entry_notes: null, - task_id: "task_id_88", - start_time: 1746453406285, - end_time: 1746458842037, - task_name: "Anonymized Task 62", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 5435752, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 199, - time_entry_notes: null, - task_id: "task_id_88", - start_time: 1746453406285, - end_time: 1746458842037, - task_name: "Anonymized Task 62", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 5435752, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 200, - time_entry_notes: null, - task_id: "task_id_89", - start_time: 1746519349918, - end_time: 1746524491613, - task_name: "Anonymized Task 63", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 5141695, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 200, - time_entry_notes: null, - task_id: "task_id_89", - start_time: 1746519349918, - end_time: 1746524491613, - task_name: "Anonymized Task 63", - tag_id: "tag_id_7", - tag_name: "research", - tag_color: "#ac41a7", - tag_dot_text: null, - duration: 5141695, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 200, - time_entry_notes: null, - task_id: "task_id_89", - start_time: 1746519349918, - end_time: 1746524491613, - task_name: "Anonymized Task 63", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 5141695, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 201, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746619298082, - end_time: 1746620438620, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1140538, - weekday: 3, - month: 5, - year: 2025, - }, - { - time_entry_id: 202, - time_entry_notes: null, - task_id: "task_id_89", - start_time: 1746696776784, - end_time: 1746707216278, - task_name: "Anonymized Task 63", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 10439494, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 202, - time_entry_notes: null, - task_id: "task_id_89", - start_time: 1746696776784, - end_time: 1746707216278, - task_name: "Anonymized Task 63", - tag_id: "tag_id_7", - tag_name: "research", - tag_color: "#ac41a7", - tag_dot_text: null, - duration: 10439494, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 202, - time_entry_notes: null, - task_id: "task_id_89", - start_time: 1746696776784, - end_time: 1746707216278, - task_name: "Anonymized Task 63", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 10439494, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 203, - time_entry_notes: null, - task_id: "task_id_90", - start_time: 1746776102371, - end_time: 1746780300802, - task_name: "Anonymized Task 64", - tag_id: "tag_id_7", - tag_name: "research", - tag_color: "#ac41a7", - tag_dot_text: null, - duration: 4198431, - weekday: 5, - month: 5, - year: 2025, - }, - { - time_entry_id: 204, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746956901828, - end_time: 1746957810189, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 908361, - weekday: 0, - month: 5, - year: 2025, - }, - { - time_entry_id: 205, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747117742359, - end_time: 1747118968307, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1225948, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 205, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747117742359, - end_time: 1747118968307, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1225948, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 206, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1747557730806, - end_time: 1747558434686, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 703880, - weekday: 0, - month: 5, - year: 2025, - }, - { - time_entry_id: 207, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747722414329, - end_time: 1747724357157, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1942828, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 207, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747722414329, - end_time: 1747724357157, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1942828, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 208, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1748016994101, - end_time: 1748017436364, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 442263, - weekday: 5, - month: 5, - year: 2025, - }, - { - time_entry_id: 209, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1748156079387, - end_time: 1748156893642, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 814255, - weekday: 0, - month: 5, - year: 2025, - }, - { - time_entry_id: 210, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1748501641127, - end_time: 1748502417724, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 776597, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 211, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1748759781607, - end_time: 1748760684633, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 903026, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 212, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1749036841642, - end_time: 1749037919594, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1077952, - weekday: 3, - month: 6, - year: 2025, - }, - { - time_entry_id: 213, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1749286837190, - end_time: 1749287820995, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 983805, - weekday: 6, - month: 6, - year: 2025, - }, - { - time_entry_id: 214, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749450485112, - end_time: 1749451775929, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1290817, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 214, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749450485112, - end_time: 1749451775929, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1290817, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 215, - time_entry_notes: null, - task_id: "task_id_91", - start_time: 1740242037567, - end_time: 1740242041915, - task_name: "Anonymized Task 65", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4348, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 216, - time_entry_notes: null, - task_id: "task_id_91", - start_time: 1740242390628, - end_time: 1740242463703, - task_name: "Anonymized Task 65", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 73075, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 217, - time_entry_notes: null, - task_id: "task_id_91", - start_time: 1740243512618, - end_time: 1740243551249, - task_name: "Anonymized Task 65", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 38631, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 218, - time_entry_notes: null, - task_id: "task_id_92", - start_time: 1740244361790, - end_time: 1740244365759, - task_name: "Anonymized Task 66", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3969, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 219, - time_entry_notes: null, - task_id: "task_id_92", - start_time: 1740244863240, - end_time: 1740244869246, - task_name: "Anonymized Task 66", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 6006, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 220, - time_entry_notes: null, - task_id: "task_id_92", - start_time: 1740244870103, - end_time: 1740244874214, - task_name: "Anonymized Task 66", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4111, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 221, - time_entry_notes: null, - task_id: "task_id_93", - start_time: 1740245461470, - end_time: 1740245485015, - task_name: "Anonymized Task 67", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 23545, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 222, - time_entry_notes: null, - task_id: "task_id_93", - start_time: 1740245493164, - end_time: 1740245496784, - task_name: "Anonymized Task 67", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3620, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 223, - time_entry_notes: null, - task_id: "task_id_93", - start_time: 1740245498030, - end_time: 1740245503013, - task_name: "Anonymized Task 67", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4983, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 224, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1740247253884, - end_time: 1740247320450, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 66566, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 225, - time_entry_notes: null, - task_id: "task_id_94", - start_time: 1740248169890, - end_time: 1740248179548, - task_name: "Anonymized Task 68", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9658, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 226, - time_entry_notes: null, - task_id: "task_id_94", - start_time: 1740248182041, - end_time: 1740248486255, - task_name: "Anonymized Task 68", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 304214, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 227, - time_entry_notes: null, - task_id: "task_id_94", - start_time: 1740248488586, - end_time: 1740248493599, - task_name: "Anonymized Task 68", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 5013, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 228, - time_entry_notes: null, - task_id: "task_id_94", - start_time: 1740249053581, - end_time: 1740250181601, - task_name: "Anonymized Task 68", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1128020, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 229, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740250213228, - end_time: 1740250243108, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 29880, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 230, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740250244340, - end_time: 1740251050690, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 806350, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 231, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740251051606, - end_time: 1740251053835, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2229, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 232, - time_entry_notes: null, - task_id: "task_id_94", - start_time: 1740251054474, - end_time: 1740251162663, - task_name: "Anonymized Task 68", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 108189, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 233, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740251170001, - end_time: 1740251190750, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 20749, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 234, - time_entry_notes: null, - task_id: "task_id_94", - start_time: 1740251191688, - end_time: 1740251192836, - task_name: "Anonymized Task 68", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1148, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 235, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740251193410, - end_time: 1740251194524, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1114, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 236, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740251195172, - end_time: 1740251558808, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 363636, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 237, - time_entry_notes: null, - task_id: "task_id_95", - start_time: 1740251573733, - end_time: 1740251583204, - task_name: "Anonymized Task 69", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9471, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 238, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740254613901, - end_time: 1740255049864, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 435963, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 239, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740255050511, - end_time: 1740255054470, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3959, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 240, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740255055822, - end_time: 1740255061435, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 5613, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 241, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740255063295, - end_time: 1740255072773, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9478, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 242, - time_entry_notes: null, - task_id: "task_id_95", - start_time: 1740255072227, - end_time: 1740255076691, - task_name: "Anonymized Task 69", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4464, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 243, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740255076284, - end_time: 1740255080398, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4114, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 244, - time_entry_notes: null, - task_id: "task_id_95", - start_time: 1740255080019, - end_time: 1740255084931, - task_name: "Anonymized Task 69", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4912, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 245, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740255084570, - end_time: 1740255091469, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 6899, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 246, - time_entry_notes: null, - task_id: "task_id_95", - start_time: 1740255091132, - end_time: 1740255101010, - task_name: "Anonymized Task 69", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9878, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 247, - time_entry_notes: null, - task_id: "task_id_93", - start_time: 1740261028169, - end_time: 1740261032659, - task_name: "Anonymized Task 67", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 4490, - weekday: 6, - month: 2, - year: 2025, - }, - { - time_entry_id: 248, - time_entry_notes: null, - task_id: "task_id_96", - start_time: 1740301655865, - end_time: 1740303373450, - task_name: "Anonymized Task 70", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1717585, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 249, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1740303377192, - end_time: 1740304415865, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1038673, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 250, - time_entry_notes: null, - task_id: "task_id_97", - start_time: 1740304887124, - end_time: 1740307074507, - task_name: "Anonymized Task 71", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2187383, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 251, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1740307073995, - end_time: 1740307169716, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 95721, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 252, - time_entry_notes: null, - task_id: "task_id_97", - start_time: 1740308687426, - end_time: 1740309930595, - task_name: "Anonymized Task 71", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1243169, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 253, - time_entry_notes: null, - task_id: "task_id_98", - start_time: 1740309969490, - end_time: 1740311058927, - task_name: "Anonymized Task 72", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1089437, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 254, - time_entry_notes: null, - task_id: "task_id_97", - start_time: 1740311058112, - end_time: 1740311067075, - task_name: "Anonymized Task 71", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 8963, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 255, - time_entry_notes: null, - task_id: "task_id_98", - start_time: 1740311066406, - end_time: 1740311370864, - task_name: "Anonymized Task 72", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 304458, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 256, - time_entry_notes: null, - task_id: "task_id_97", - start_time: 1740311370376, - end_time: 1740311584826, - task_name: "Anonymized Task 71", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 214450, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 257, - time_entry_notes: null, - task_id: "task_id_98", - start_time: 1740311584041, - end_time: 1740311865963, - task_name: "Anonymized Task 72", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 281922, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 258, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740311866579, - end_time: 1740311868430, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1851, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 259, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740311869702, - end_time: 1740314451815, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2582113, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 260, - time_entry_notes: null, - task_id: "task_id_99", - start_time: 1740315188273, - end_time: 1740315533054, - task_name: "Anonymized Task 73", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 344781, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 261, - time_entry_notes: null, - task_id: "task_id_97", - start_time: 1740315532450, - end_time: 1740315538076, - task_name: "Anonymized Task 71", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 5626, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 262, - time_entry_notes: null, - task_id: "task_id_99", - start_time: 1740315537695, - end_time: 1740316337418, - task_name: "Anonymized Task 73", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 799723, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 263, - time_entry_notes: null, - task_id: "task_id_99", - start_time: 1740318235453, - end_time: 1740318315372, - task_name: "Anonymized Task 73", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 79919, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 264, - time_entry_notes: null, - task_id: "task_id_99", - start_time: 1740318337804, - end_time: 1740318380576, - task_name: "Anonymized Task 73", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 42772, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 265, - time_entry_notes: null, - task_id: "task_id_98", - start_time: 1740318379153, - end_time: 1740318480781, - task_name: "Anonymized Task 72", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 101628, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 266, - time_entry_notes: null, - task_id: "task_id_98", - start_time: 1740318745423, - end_time: 1740318763717, - task_name: "Anonymized Task 72", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 18294, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 267, - time_entry_notes: null, - task_id: "task_id_98", - start_time: 1740318771337, - end_time: 1740318781152, - task_name: "Anonymized Task 72", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9815, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 268, - time_entry_notes: null, - task_id: "task_id_79", - start_time: 1740318780631, - end_time: 1740319313119, - task_name: "Anonymized Task 53", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 532488, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 269, - time_entry_notes: null, - task_id: "task_id_99", - start_time: 1740319335411, - end_time: 1740320200330, - task_name: "Anonymized Task 73", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 864919, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 270, - time_entry_notes: null, - task_id: "task_id_98", - start_time: 1740320500565, - end_time: 1740320768354, - task_name: "Anonymized Task 72", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 267789, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 271, - time_entry_notes: null, - task_id: "task_id_100", - start_time: 1740320779853, - end_time: 1740322018588, - task_name: "Anonymized Task 74", - tag_id: "tag_id_16", - tag_name: "high-priority", - tag_color: "#b3aa5a", - tag_dot_text: null, - duration: 1238735, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 272, - time_entry_notes: null, - task_id: "task_id_97", - start_time: 1740322309301, - end_time: 1740324429492, - task_name: "Anonymized Task 71", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2120191, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 273, - time_entry_notes: null, - task_id: "task_id_101", - start_time: 1740324433909, - end_time: 1740331691572, - task_name: "Anonymized Task 75", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 7257663, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 274, - time_entry_notes: null, - task_id: "task_id_102", - start_time: 1741619199316, - end_time: 1741623308505, - task_name: "Anonymized Task 76", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 4109189, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 275, - time_entry_notes: null, - task_id: "task_id_103", - start_time: 1740332477702, - end_time: 1740332513199, - task_name: "Anonymized Task 77", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 35497, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 276, - time_entry_notes: null, - task_id: "task_id_103", - start_time: 1740332514631, - end_time: 1740334287259, - task_name: "Anonymized Task 77", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 1772628, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 277, - time_entry_notes: null, - task_id: "task_id_104", - start_time: 1740334718598, - end_time: 1740334728193, - task_name: "Anonymized Task 78", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 9595, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 278, - time_entry_notes: null, - task_id: "task_id_104", - start_time: 1740334744247, - end_time: 1740334746529, - task_name: "Anonymized Task 78", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2282, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 279, - time_entry_notes: null, - task_id: "task_id_103", - start_time: 1740334792976, - end_time: 1740334803568, - task_name: "Anonymized Task 77", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 10592, - weekday: 0, - month: 2, - year: 2025, - }, - { - time_entry_id: 280, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1741772948667, - end_time: 1741773966514, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1017847, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 281, - time_entry_notes: null, - task_id: "task_id_19", - start_time: 1740961822636, - end_time: 1740986739319, - task_name: "Operations", - tag_id: "tag_id_5", - tag_name: "non-billable", - tag_color: "#3e3d85", - tag_dot_text: null, - duration: 24916683, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 282, - time_entry_notes: null, - task_id: "task_id_17", - start_time: 1741785533166, - end_time: 1741786848240, - task_name: "Training & Development", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 1315074, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 283, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1745225366746, - end_time: 1745226539921, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1173175, - weekday: 1, - month: 4, - year: 2025, - }, - { - time_entry_id: 284, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1740986754028, - end_time: 1740987972739, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1218711, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 284, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1740986754028, - end_time: 1740987972739, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1218711, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 285, - time_entry_notes: null, - task_id: "task_id_105", - start_time: 1741795360340, - end_time: 1741795372950, - task_name: "Anonymized Task 79", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 12610, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 286, - time_entry_notes: null, - task_id: "task_id_105", - start_time: 1741795376034, - end_time: 1741808774760, - task_name: "Anonymized Task 79", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 13398726, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 287, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1741937290263, - end_time: 1741941205573, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 3915310, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 287, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1741937290263, - end_time: 1741941205573, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 3915310, - weekday: 5, - month: 3, - year: 2025, - }, - { - time_entry_id: 288, - time_entry_notes: null, - task_id: "task_id_106", - start_time: 1741011806879, - end_time: 1741014138332, - task_name: "Anonymized Task 80", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 2331453, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 289, - time_entry_notes: null, - task_id: "task_id_19", - start_time: 1741477918401, - end_time: 1741510346627, - task_name: "Operations", - tag_id: "tag_id_5", - tag_name: "non-billable", - tag_color: "#3e3d85", - tag_dot_text: null, - duration: 32428226, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 290, - time_entry_notes: null, - task_id: "task_id_107", - start_time: 1741014146242, - end_time: 1741017332433, - task_name: "Anonymized Task 81", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 3186191, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 291, - time_entry_notes: null, - task_id: "task_id_108", - start_time: 1742048858543, - end_time: 1742053873455, - task_name: "Anonymized Task 82", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 5014912, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 291, - time_entry_notes: null, - task_id: "task_id_108", - start_time: 1742048858543, - end_time: 1742053873455, - task_name: "Anonymized Task 82", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 5014912, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 292, - time_entry_notes: null, - task_id: "task_id_109", - start_time: 1741017345576, - end_time: 1741019616294, - task_name: "Anonymized Task 83", - tag_id: null, - tag_name: null, - tag_color: null, - tag_dot_text: null, - duration: 2270718, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 293, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742374065817, - end_time: 1742374890006, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 824189, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 294, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742491560721, - end_time: 1742492813241, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1252520, - weekday: 4, - month: 3, - year: 2025, - }, - { - time_entry_id: 295, - time_entry_notes: null, - task_id: "task_id_19", - start_time: 1741044209342, - end_time: 1741073497173, - task_name: "Operations", - tag_id: "tag_id_5", - tag_name: "non-billable", - tag_color: "#3e3d85", - tag_dot_text: null, - duration: 29287831, - weekday: 1, - month: 3, - year: 2025, - }, - { - time_entry_id: 296, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742634498479, - end_time: 1742635641565, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1143086, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 297, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1742730477543, - end_time: 1742731440621, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 963078, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 298, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742972438782, - end_time: 1742973880072, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1441290, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 298, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1742972438782, - end_time: 1742973880072, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1441290, - weekday: 3, - month: 3, - year: 2025, - }, - { - time_entry_id: 299, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1743245971115, - end_time: 1743246912116, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 941001, - weekday: 6, - month: 3, - year: 2025, - }, - { - time_entry_id: 300, - time_entry_notes: null, - task_id: "task_id_110", - start_time: 1743343439985, - end_time: 1743353250313, - task_name: "Anonymized Task 84", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 9810328, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 300, - time_entry_notes: null, - task_id: "task_id_110", - start_time: 1743343439985, - end_time: 1743353250313, - task_name: "Anonymized Task 84", - tag_id: "tag_id_17", - tag_name: "external", - tag_color: "#316847", - tag_dot_text: null, - duration: 9810328, - weekday: 0, - month: 3, - year: 2025, - }, - { - time_entry_id: 301, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743488981354, - end_time: 1743490290607, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1309253, - weekday: 2, - month: 4, - year: 2025, - }, - { - time_entry_id: 301, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1743488981354, - end_time: 1743490290607, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1309253, - weekday: 2, - month: 4, - year: 2025, - }, - { - time_entry_id: 302, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1743841487107, - end_time: 1743842482792, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 995685, - weekday: 6, - month: 4, - year: 2025, - }, - { - time_entry_id: 303, - time_entry_notes: null, - task_id: "task_id_111", - start_time: 1744034710640, - end_time: 1744039053668, - task_name: "Anonymized Task 85", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 4343028, - weekday: 1, - month: 4, - year: 2025, - }, - { - time_entry_id: 304, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746082145319, - end_time: 1746083140645, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 995326, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 305, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1745051295459, - end_time: 1745052349240, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1053781, - weekday: 6, - month: 4, - year: 2025, - }, - { - time_entry_id: 306, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745476697085, - end_time: 1745478134212, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1437127, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 306, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1745476697085, - end_time: 1745478134212, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1437127, - weekday: 4, - month: 4, - year: 2025, - }, - { - time_entry_id: 307, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1745742947140, - end_time: 1745743647152, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 700012, - weekday: 0, - month: 4, - year: 2025, - }, - { - time_entry_id: 308, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746004970758, - end_time: 1746005944898, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 974140, - weekday: 3, - month: 4, - year: 2025, - }, - { - time_entry_id: 309, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746262148797, - end_time: 1746263125200, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 976403, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 310, - time_entry_notes: null, - task_id: "task_id_51", - start_time: 1746264535237, - end_time: 1746266830343, - task_name: "Anonymized Task 27", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 2295106, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 310, - time_entry_notes: null, - task_id: "task_id_51", - start_time: 1746264535237, - end_time: 1746266830343, - task_name: "Anonymized Task 27", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 2295106, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 311, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1744442479674, - end_time: 1744443954500, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1474826, - weekday: 6, - month: 4, - year: 2025, - }, - { - time_entry_id: 312, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746017611545, - end_time: 1746017653345, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 41800, - weekday: 3, - month: 4, - year: 2025, - }, - { - time_entry_id: 313, - time_entry_notes: null, - task_id: "task_id_112", - start_time: 1746268360316, - end_time: 1746269281683, - task_name: "Anonymized Task 86", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 921367, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 313, - time_entry_notes: null, - task_id: "task_id_112", - start_time: 1746268360316, - end_time: 1746269281683, - task_name: "Anonymized Task 86", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 921367, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 314, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746345861025, - end_time: 1746346709509, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 848484, - weekday: 0, - month: 5, - year: 2025, - }, - { - time_entry_id: 315, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1746513442455, - end_time: 1746514826895, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1384440, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 315, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1746513442455, - end_time: 1746514826895, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1384440, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 316, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1746426617085, - end_time: 1746428318926, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1701841, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 316, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1746426617085, - end_time: 1746428318926, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1701841, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 317, - time_entry_notes: null, - task_id: "task_id_113", - start_time: 1746524621498, - end_time: 1746532140233, - task_name: "Anonymized Task 87", - tag_id: "tag_id_7", - tag_name: "research", - tag_color: "#ac41a7", - tag_dot_text: null, - duration: 7518735, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 317, - time_entry_notes: null, - task_id: "task_id_113", - start_time: 1746524621498, - end_time: 1746532140233, - task_name: "Anonymized Task 87", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 7518735, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 317, - time_entry_notes: null, - task_id: "task_id_113", - start_time: 1746524621498, - end_time: 1746532140233, - task_name: "Anonymized Task 87", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 7518735, - weekday: 2, - month: 5, - year: 2025, - }, - { - time_entry_id: 318, - time_entry_notes: null, - task_id: "task_id_114", - start_time: 1746685282307, - end_time: 1746693732944, - task_name: "Anonymized Task 88", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 8450637, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 318, - time_entry_notes: null, - task_id: "task_id_114", - start_time: 1746685282307, - end_time: 1746693732944, - task_name: "Anonymized Task 88", - tag_id: "tag_id_7", - tag_name: "research", - tag_color: "#ac41a7", - tag_dot_text: null, - duration: 8450637, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 318, - time_entry_notes: null, - task_id: "task_id_114", - start_time: 1746685282307, - end_time: 1746693732944, - task_name: "Anonymized Task 88", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 8450637, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 319, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1746771139784, - end_time: 1746773943739, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 2803955, - weekday: 5, - month: 5, - year: 2025, - }, - { - time_entry_id: 319, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1746771139784, - end_time: 1746773943739, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 2803955, - weekday: 5, - month: 5, - year: 2025, - }, - { - time_entry_id: 320, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1746877995974, - end_time: 1746878880699, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 884725, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 321, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747031379355, - end_time: 1747032757173, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1377818, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 321, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747031379355, - end_time: 1747032757173, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1377818, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 322, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1747208781013, - end_time: 1747209615949, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 834936, - weekday: 3, - month: 5, - year: 2025, - }, - { - time_entry_id: 323, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1747467592281, - end_time: 1747468641274, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1048993, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 324, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747635944347, - end_time: 1747637985463, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 2041116, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 324, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1747635944347, - end_time: 1747637985463, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 2041116, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 325, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1747896403085, - end_time: 1747897231490, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 828405, - weekday: 4, - month: 5, - year: 2025, - }, - { - time_entry_id: 326, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1748073756608, - end_time: 1748074604948, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 848340, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 327, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1748241014854, - end_time: 1748242353217, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1338363, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 327, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1748241014854, - end_time: 1748242353217, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1338363, - weekday: 1, - month: 5, - year: 2025, - }, - { - time_entry_id: 328, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1748680042047, - end_time: 1748681209534, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1167487, - weekday: 6, - month: 5, - year: 2025, - }, - { - time_entry_id: 329, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1748851462863, - end_time: 1748852263315, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 800452, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 330, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749101068369, - end_time: 1749102683282, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1614913, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 330, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749101068369, - end_time: 1749102683282, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1614913, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 331, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1749366721212, - end_time: 1749367545530, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 824318, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 332, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1751735694151, - end_time: 1751737233139, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1538988, - weekday: 6, - month: 7, - year: 2025, - }, - { - time_entry_id: 333, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1751039911551, - end_time: 1751040975438, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1063887, - weekday: 5, - month: 6, - year: 2025, - }, - { - time_entry_id: 334, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1751096279711, - end_time: 1751097302188, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1022477, - weekday: 6, - month: 6, - year: 2025, - }, - { - time_entry_id: 335, - time_entry_notes: null, - task_id: "task_id_115", - start_time: 1751009699659, - end_time: 1751015889946, - task_name: "Anonymized Task 89", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 6190287, - weekday: 5, - month: 6, - year: 2025, - }, - { - time_entry_id: 336, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1751189460489, - end_time: 1751190293129, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 832640, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 337, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1751700109391, - end_time: 1751701100388, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 990997, - weekday: 6, - month: 7, - year: 2025, - }, - { - time_entry_id: 338, - time_entry_notes: null, - task_id: "task_id_116", - start_time: 1751965890622, - end_time: 1751968356964, - task_name: "Anonymized Task 90", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 2466342, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 339, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1751790578829, - end_time: 1751791286436, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 707607, - weekday: 0, - month: 7, - year: 2025, - }, - { - time_entry_id: 340, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749706777721, - end_time: 1749708227759, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1450038, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 340, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1749706777721, - end_time: 1749708227759, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1450038, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 341, - time_entry_notes: "Anonymized Note", - task_id: "task_id_117", - start_time: 1751194072608, - end_time: 1751194801179, - task_name: "Anonymized Task 91", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 728571, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 341, - time_entry_notes: "Anonymized Note", - task_id: "task_id_117", - start_time: 1751194072608, - end_time: 1751194801179, - task_name: "Anonymized Task 91", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 728571, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 342, - time_entry_notes: null, - task_id: "task_id_118", - start_time: 1751205495939, - end_time: 1751208786945, - task_name: "Anonymized Task 92", - tag_id: "tag_id_3", - tag_name: "low-priority", - tag_color: "#3c6a9f", - tag_dot_text: null, - duration: 3291006, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 342, - time_entry_notes: null, - task_id: "task_id_118", - start_time: 1751205495939, - end_time: 1751208786945, - task_name: "Anonymized Task 92", - tag_id: "tag_id_6", - tag_name: "testing", - tag_color: "#ed7e79", - tag_dot_text: "Anonymized Dot Text", - duration: 3291006, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 343, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1751191630183, - end_time: 1751193439942, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1809759, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 344, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1749887781116, - end_time: 1749888979638, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1198522, - weekday: 6, - month: 6, - year: 2025, - }, - { - time_entry_id: 345, - time_entry_notes: "Anonymized Note", - task_id: "task_id_16", - start_time: 1751264774174, - end_time: 1751267217959, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 2443785, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 345, - time_entry_notes: "Anonymized Note", - task_id: "task_id_16", - start_time: 1751264774174, - end_time: 1751267217959, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 2443785, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 346, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1749975311991, - end_time: 1749976441458, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1129467, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 347, - time_entry_notes: null, - task_id: "task_id_119", - start_time: 1751289913535, - end_time: 1751291467586, - task_name: "Anonymized Task 93", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 1554051, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 348, - time_entry_notes: null, - task_id: "task_id_120", - start_time: 1751291904085, - end_time: 1751297491201, - task_name: "Anonymized Task 94", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 5587116, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 349, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750055190874, - end_time: 1750056627521, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1436647, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 349, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750055190874, - end_time: 1750056627521, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1436647, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 350, - time_entry_notes: null, - task_id: "task_id_119", - start_time: 1751354057335, - end_time: 1751354766209, - task_name: "Anonymized Task 93", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 708874, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 351, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1750091088211, - end_time: 1750092036243, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 948032, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 352, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1750234586647, - end_time: 1750235578614, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 991967, - weekday: 3, - month: 6, - year: 2025, - }, - { - time_entry_id: 353, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1750311232601, - end_time: 1750311235405, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 2804, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 354, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750311237502, - end_time: 1750312620552, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1383050, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 354, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750311237502, - end_time: 1750312620552, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1383050, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 355, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1750494610774, - end_time: 1750495537337, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 926563, - weekday: 6, - month: 6, - year: 2025, - }, - { - time_entry_id: 356, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1750579051368, - end_time: 1750579795432, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 744064, - weekday: 0, - month: 6, - year: 2025, - }, - { - time_entry_id: 357, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750660150321, - end_time: 1750661493684, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1343363, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 357, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750660150321, - end_time: 1750661493684, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1343363, - weekday: 1, - month: 6, - year: 2025, - }, - { - time_entry_id: 358, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1750842766263, - end_time: 1750843518459, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 752196, - weekday: 3, - month: 6, - year: 2025, - }, - { - time_entry_id: 359, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750915945397, - end_time: 1750917331318, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1385921, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 359, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750915945397, - end_time: 1750917331318, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1385921, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 360, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750951126932, - end_time: 1750953799074, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 2672142, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 360, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1750951126932, - end_time: 1750953799074, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 2672142, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 361, - time_entry_notes: null, - task_id: "task_id_18", - start_time: 1750953805699, - end_time: 1750954498289, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 692590, - weekday: 4, - month: 6, - year: 2025, - }, - { - time_entry_id: 362, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1752045644681, - end_time: 1752046534923, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 890242, - weekday: 3, - month: 7, - year: 2025, - }, - { - time_entry_id: 363, - time_entry_notes: null, - task_id: "task_id_120", - start_time: 1751354817496, - end_time: 1751357810387, - task_name: "Anonymized Task 94", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 2992891, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 364, - time_entry_notes: null, - task_id: "task_id_120", - start_time: 1751357851168, - end_time: 1751361039227, - task_name: "Anonymized Task 94", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 3188059, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 365, - time_entry_notes: null, - task_id: "task_id_121", - start_time: 1751361076699, - end_time: 1751362392533, - task_name: "Anonymized Task 95", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 1315834, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 366, - time_entry_notes: null, - task_id: "task_id_120", - start_time: 1751365347252, - end_time: 1751367607822, - task_name: "Anonymized Task 94", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 2260570, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 367, - time_entry_notes: null, - task_id: "task_id_120", - start_time: 1751373529747, - end_time: 1751375909195, - task_name: "Anonymized Task 94", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 2379448, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 368, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1751457505125, - end_time: 1751458363908, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 858783, - weekday: 3, - month: 7, - year: 2025, - }, - { - time_entry_id: 369, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1751461972119, - end_time: 1751465387698, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 3415579, - weekday: 3, - month: 7, - year: 2025, - }, - { - time_entry_id: 370, - time_entry_notes: "Anonymized Note", - task_id: "task_id_16", - start_time: 1751520347199, - end_time: 1751521500207, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1153008, - weekday: 4, - month: 7, - year: 2025, - }, - { - time_entry_id: 370, - time_entry_notes: "Anonymized Note", - task_id: "task_id_16", - start_time: 1751520347199, - end_time: 1751521500207, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1153008, - weekday: 4, - month: 7, - year: 2025, - }, - { - time_entry_id: 371, - time_entry_notes: null, - task_id: "task_id_122", - start_time: 1751526880043, - end_time: 1751535561481, - task_name: "Anonymized Task 96", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 8681438, - weekday: 4, - month: 7, - year: 2025, - }, - { - time_entry_id: 372, - time_entry_notes: null, - task_id: "task_id_123", - start_time: 1751544564706, - end_time: 1751553519244, - task_name: "Anonymized Task 97", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 8954538, - weekday: 4, - month: 7, - year: 2025, - }, - { - time_entry_id: 373, - time_entry_notes: null, - task_id: "task_id_124", - start_time: 1751613031894, - end_time: 1751614893806, - task_name: "Anonymized Task 98", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 1861912, - weekday: 5, - month: 7, - year: 2025, - }, - { - time_entry_id: 374, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1751868904444, - end_time: 1751870518065, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1613621, - weekday: 1, - month: 7, - year: 2025, - }, - { - time_entry_id: 374, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1751868904444, - end_time: 1751870518065, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1613621, - weekday: 1, - month: 7, - year: 2025, - }, - { - time_entry_id: 375, - time_entry_notes: "Anonymized Note", - task_id: "task_id_18", - start_time: 1751906771670, - end_time: 1751908260319, - task_name: "Administrative Work", - tag_id: "tag_id_4", - tag_name: "urgent", - tag_color: "#8135bd", - tag_dot_text: "Anonymized Dot Text", - duration: 1488649, - weekday: 1, - month: 7, - year: 2025, - }, - { - time_entry_id: 376, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1751953071628, - end_time: 1751954403373, - task_name: "Commute", - tag_id: "tag_id_1", - tag_name: "meeting", - tag_color: "#a945a1", - tag_dot_text: null, - duration: 1331745, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 376, - time_entry_notes: null, - task_id: "task_id_16", - start_time: 1751953071628, - end_time: 1751954403373, - task_name: "Commute", - tag_id: "tag_id_2", - tag_name: "deployment", - tag_color: "#d9551b", - tag_dot_text: null, - duration: 1331745, - weekday: 2, - month: 7, - year: 2025, - }, - { - time_entry_id: 377, - time_entry_notes: null, - task_id: "task_id_125", - start_time: 1751962541332, - end_time: 1751965834665, - task_name: "Anonymized Task 99", - tag_id: "tag_id_8", - tag_name: "billable", - tag_color: "#3f93b9", - tag_dot_text: "Anonymized Dot Text", - duration: 3293333, - weekday: 2, - month: 7, - year: 2025, - }, -]; diff --git a/frontend/simple-tracker/src/common/charts/charts.supabase.ts b/frontend/simple-tracker/src/common/charts/charts.supabase.ts new file mode 100644 index 0000000..86f8180 --- /dev/null +++ b/frontend/simple-tracker/src/common/charts/charts.supabase.ts @@ -0,0 +1,23 @@ +import { supabase } from "../../main"; +import type { DataPoint } from "./charts.types"; + +const DATA_TABLE_NAME = "time_entry_report"; + +export async function fetchRawData( + startPeriod?: Date, + endPeriod?: Date +): Promise { + try { + const { data, error } = await supabase + .from(DATA_TABLE_NAME) + .select("*") + .gte("start_time", startPeriod?.toISOString() || "1970-01-01T00:00:00Z") + .lt("end_time", endPeriod?.toISOString() || "9999-12-31T23:59:59Z") + .order("start_time", { ascending: true }); + if (error) throw error; + return data as DataPoint[]; + } catch (error) { + console.error("Error in fetchRawData:", error); + throw error; + } +} diff --git a/frontend/simple-tracker/src/common/charts/charts.ts b/frontend/simple-tracker/src/common/charts/charts.ts index dd735e9..13a94b7 100644 --- a/frontend/simple-tracker/src/common/charts/charts.ts +++ b/frontend/simple-tracker/src/common/charts/charts.ts @@ -1,4 +1,3 @@ -import { data as rawData } from "./charts.mockdata"; import { generateRandomColor } from "../colorUtils"; import { type ChartConfig, @@ -12,7 +11,7 @@ import { } from "./charts.types"; import { getDateIntevealFromPeriodType } from "./charts.utils"; -function selectData(config: ChartConfig): DataPoint[] { +function filterData(config: ChartConfig, rawData: DataPoint[]): DataPoint[] { const { start, end } = getDateIntevealFromPeriodType(config.periodType); return rawData.filter( (item) => @@ -82,8 +81,11 @@ function aggregateData( return aggregatedData; } -export function getChartData(config: ChartConfig): ChartData { - const selectedData: DataPoint[] = selectData(config); +export function getChartData( + config: ChartConfig, + rawData: DataPoint[] +): ChartData { + const selectedData: DataPoint[] = filterData(config, rawData); const groupedData: Record = groupData( config, selectedData diff --git a/frontend/simple-tracker/src/components/charts/AppNewChart.vue b/frontend/simple-tracker/src/components/charts/AppNewChart.vue index d2b0f5a..619ee42 100644 --- a/frontend/simple-tracker/src/components/charts/AppNewChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppNewChart.vue @@ -112,7 +112,7 @@ diff --git a/frontend/simple-tracker/src/components/charts/AppNewChart.vue b/frontend/simple-tracker/src/components/charts/AppNewChart.vue index c8d41a2..baec6b0 100644 --- a/frontend/simple-tracker/src/components/charts/AppNewChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppNewChart.vue @@ -26,51 +26,77 @@
- - - +
- + +
- +
- +
@@ -127,6 +153,7 @@ import AppBarChart from "./AppBarChart.vue"; import AppDoughnutChart from "./AppDoughnutChart.vue"; import AppLineChart from "./AppLineChart.vue"; import { useChartDataStore } from "../../stores/chartData"; +import AppSelect from "../AppSelect.vue"; const chartDataStore = useChartDataStore(); onMounted(async () => { From 4fe6b3e5389e47b040c11234f699e3398684d336 Mon Sep 17 00:00:00 2001 From: OrangeII Date: Sun, 20 Jul 2025 13:06:15 +0200 Subject: [PATCH 24/44] improve style --- .../src/components/AppSelect.vue | 2 +- .../src/components/charts/AppNewChart.vue | 27 ++++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/frontend/simple-tracker/src/components/AppSelect.vue b/frontend/simple-tracker/src/components/AppSelect.vue index 431447c..e3590f3 100644 --- a/frontend/simple-tracker/src/components/AppSelect.vue +++ b/frontend/simple-tracker/src/components/AppSelect.vue @@ -1,5 +1,5 @@ @@ -48,7 +48,7 @@ import TagsManager from "./TagsManager.vue"; import { usePreferencesStore } from "../stores/preferences"; import { useFavoriteTasksStore } from "../stores/favoriteTasks.ts"; import InsightsDashboard from "./InsightsDashboard.vue"; -import AppNewChart from "./charts/AppEditChart.vue"; +import AppPageCharts from "./charts/AppPageCharts.vue"; const preferencesStore = usePreferencesStore(); const favoriteTasksStore = useFavoriteTasksStore(); diff --git a/frontend/simple-tracker/src/components/charts/AppEditChart.vue b/frontend/simple-tracker/src/components/charts/AppEditChart.vue index f97563d..54f5bb1 100644 --- a/frontend/simple-tracker/src/components/charts/AppEditChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppEditChart.vue @@ -28,13 +28,13 @@
- + SAVE - + @@ -155,7 +155,6 @@ import { PeriodType, type ChartConfig, GroupKey, - DataPointValue, ChartType, DataPointValueAesthetics, GroupKeysAesthetics, @@ -171,10 +170,28 @@ import { useChartDataStore } from "../../stores/chartData"; import AppSelect from "../AppSelect.vue"; import AppButton from "../AppButton.vue"; import { CheckCircleIcon, TrashIcon } from "@heroicons/vue/24/solid"; +import type { ChartConfigRecord } from "../../common/charts/charts.supabase"; +import { useChartsStore } from "../../stores/charts"; +const chartsStore = useChartsStore(); const chartDataStore = useChartDataStore(); onMounted(async () => { - await chartDataStore.refreshChartData(); + if (!chartDataStore.rawChartData) { + await chartDataStore.refreshChartData(); + } +}); + +const props = defineProps<{ + chartConfigRecord: ChartConfigRecord; +}>(); +const emit = defineEmits<{ + close: []; + "chart-created": [chartConfigRecord: ChartConfigRecord]; + "chart-updated": [chartConfigRecord: ChartConfigRecord]; +}>(); + +const isNew = computed(() => { + return !props.chartConfigRecord.id; }); const chartData = computed(() => { @@ -182,13 +199,7 @@ const chartData = computed(() => { }); const chartConfig = ref({ - title: "", - description: "", - chartType: ChartType.BAR, - periodType: PeriodType.THIS_WEEK, - groupBy: [GroupKey.TASK], - xAxisField: DataPointValue.TASK_NAME, - yAxisField: DataPointValue.DURATION, + ...props.chartConfigRecord.chart_config, }); const allowedXFields = computed(() => { @@ -212,4 +223,22 @@ watch( } } ); + +const saveChartConfig = async () => { + const chartConfigRecord: ChartConfigRecord = { + ...props.chartConfigRecord, + chart_config: chartConfig.value, + }; + const success = await chartsStore.saveConfig(chartConfigRecord); + if (!success) { + return; + } + props.chartConfigRecord.chart_config = chartConfig.value; + if (isNew.value) { + emit("chart-created", chartConfigRecord); + } else { + emit("chart-updated", chartConfigRecord); + } + emit("close"); +}; diff --git a/frontend/simple-tracker/src/components/charts/AppPageCharts.vue b/frontend/simple-tracker/src/components/charts/AppPageCharts.vue new file mode 100644 index 0000000..87035e1 --- /dev/null +++ b/frontend/simple-tracker/src/components/charts/AppPageCharts.vue @@ -0,0 +1,59 @@ + + + diff --git a/frontend/simple-tracker/src/stores/charts.ts b/frontend/simple-tracker/src/stores/charts.ts index 3e157dc..e0d2e6c 100644 --- a/frontend/simple-tracker/src/stores/charts.ts +++ b/frontend/simple-tracker/src/stores/charts.ts @@ -10,26 +10,29 @@ import { * this store holds the users chart configurations. * It allows to fetch, save and update chart configurations. */ -export const useChartStore = defineStore("charts", () => { +export const useChartsStore = defineStore("charts", () => { const chartConfigs = ref([]); async function fetchConfigs() { chartConfigs.value = await fetchChartConfigs(); } - async function saveConfig(chartConfig: ChartConfigRecord) { - const success = await saveChartConfig(chartConfig); - if (success) { + async function saveConfig( + chartConfig: ChartConfigRecord + ): Promise { + const updatedRecord = await saveChartConfig(chartConfig); + if (updatedRecord) { // upsert to the local store const index = chartConfigs.value.findIndex( - (config) => config.id === chartConfig.id + (config) => config.id === updatedRecord.id ); if (index !== -1) { - chartConfigs.value[index] = chartConfig; + chartConfigs.value[index] = updatedRecord; } else { - chartConfigs.value.push(chartConfig); + chartConfigs.value.push(updatedRecord); } } + return updatedRecord; } return { diff --git a/frontend/simple-tracker/src/stores/tests/charts.test.ts b/frontend/simple-tracker/src/stores/tests/charts.test.ts index 4f23181..7791562 100644 --- a/frontend/simple-tracker/src/stores/tests/charts.test.ts +++ b/frontend/simple-tracker/src/stores/tests/charts.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; import { createPinia, setActivePinia } from "pinia"; -import { useChartStore } from "../charts"; +import { useChartsStore } from "../charts"; import * as chartsSupabase from "../../common/charts/charts.supabase"; import type { ChartConfigRecord } from "../../common/charts/charts.supabase"; import { @@ -37,7 +37,7 @@ describe("useChartStore", () => { }); it("should initialize with an empty chartConfigs array", () => { - const store = useChartStore(); + const store = useChartsStore(); expect(store.chartConfigs).toEqual([]); }); @@ -51,7 +51,7 @@ describe("useChartStore", () => { mockConfigs ); - const store = useChartStore(); + const store = useChartsStore(); await store.fetchConfigs(); expect(chartsSupabase.fetchChartConfigs).toHaveBeenCalledTimes(1); @@ -61,7 +61,7 @@ describe("useChartStore", () => { it("should handle an empty array from fetchChartConfigs", async () => { vi.mocked(chartsSupabase.fetchChartConfigs).mockResolvedValue([]); - const store = useChartStore(); + const store = useChartsStore(); await store.fetchConfigs(); expect(store.chartConfigs).toEqual([]); @@ -71,13 +71,17 @@ describe("useChartStore", () => { describe("saveConfig", () => { it("should add a new config when saveChartConfig succeeds", async () => { const newConfig = createMockChartConfig("1"); - vi.mocked(chartsSupabase.saveChartConfig).mockResolvedValue(true); + const mockResponse = { + ...newConfig, + created_at: new Date().toISOString(), + }; + vi.mocked(chartsSupabase.saveChartConfig).mockResolvedValue(mockResponse); - const store = useChartStore(); + const store = useChartsStore(); await store.saveConfig(newConfig); expect(chartsSupabase.saveChartConfig).toHaveBeenCalledWith(newConfig); - expect(store.chartConfigs).toContainEqual(newConfig); + expect(store.chartConfigs).toContainEqual(mockResponse); expect(store.chartConfigs).toHaveLength(1); }); @@ -90,9 +94,11 @@ describe("useChartStore", () => { title: "Updated Chart", }, }; - vi.mocked(chartsSupabase.saveChartConfig).mockResolvedValue(true); + vi.mocked(chartsSupabase.saveChartConfig).mockResolvedValue( + updatedConfig + ); - const store = useChartStore(); + const store = useChartsStore(); store.chartConfigs = [existingConfig]; await store.saveConfig(updatedConfig); @@ -107,11 +113,11 @@ describe("useChartStore", () => { it("should not modify the store if saveChartConfig fails", async () => { const newConfig = createMockChartConfig("1"); - vi.mocked(chartsSupabase.saveChartConfig).mockResolvedValue(false); - - const store = useChartStore(); - await store.saveConfig(newConfig); - + vi.mocked(chartsSupabase.saveChartConfig).mockRejectedValue( + new Error("Save failed") + ); + const store = useChartsStore(); + await expect(store.saveConfig(newConfig)).rejects.toThrow("Save failed"); expect(chartsSupabase.saveChartConfig).toHaveBeenCalledWith(newConfig); expect(store.chartConfigs).toEqual([]); }); From 32e2a52494f079874b4036d6e95233bd5c8017eb Mon Sep 17 00:00:00 2001 From: OrangeII Date: Wed, 23 Jul 2025 14:06:34 +0200 Subject: [PATCH 38/44] fix chart save --- .../src/common/charts/charts.supabase.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/frontend/simple-tracker/src/common/charts/charts.supabase.ts b/frontend/simple-tracker/src/common/charts/charts.supabase.ts index 77e9d04..ce276a4 100644 --- a/frontend/simple-tracker/src/common/charts/charts.supabase.ts +++ b/frontend/simple-tracker/src/common/charts/charts.supabase.ts @@ -4,9 +4,9 @@ import type { ChartConfig, DataPoint } from "./charts.types"; const DATA_TABLE_NAME = "time_entry_report"; export interface ChartConfigRecord { - id: string | null; - user_id: string | null; - created_at: string | null; + id?: string; + user_id?: string; + created_at?: string; chart_config: ChartConfig; } @@ -63,15 +63,13 @@ export async function saveChartConfig( chartConfig: ChartConfigRecord ): Promise { try { + // If the chartConfig does not have an id, it means it's a new chart. + // I clear everything except the chart_config field so that a new record will use default values. if (!chartConfig.id) { - chartConfig.id = null; - } - if (!chartConfig.user_id) { - chartConfig.user_id = null; - } - if (!chartConfig.created_at) { - chartConfig.created_at = null; + chartConfig = { chart_config: chartConfig.chart_config }; } + + console.log("Saving chart config:", chartConfig); const { data, error } = await supabase .from("charts") .upsert(chartConfig, { onConflict: "id" }) From 158a6d484635e8ab5e1161eb805d11266a85d4b9 Mon Sep 17 00:00:00 2001 From: OrangeII Date: Wed, 23 Jul 2025 14:27:43 +0200 Subject: [PATCH 39/44] improve breadcrumbs style --- .../src/components/charts/AppEditChart.vue | 2 +- .../src/components/charts/AppPageCharts.vue | 24 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/frontend/simple-tracker/src/components/charts/AppEditChart.vue b/frontend/simple-tracker/src/components/charts/AppEditChart.vue index 54f5bb1..279e939 100644 --- a/frontend/simple-tracker/src/components/charts/AppEditChart.vue +++ b/frontend/simple-tracker/src/components/charts/AppEditChart.vue @@ -1,6 +1,6 @@