Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1import fetch from '../../fetch';
2
3
4export default {
5 namespaced: true,
6 state: {
7 all: [],
8 subtotal: 0,
9 total: 0,
10
11 orderBy: null,
12 orderDir: null,
13
14 minDate: null,
15 maxDate: null,
16 user: null,
17 client: null,
18 project: null,
19 task: null,
20 },
21 getters: {
22 getSelectEntries: state => {
23 return state.all.map(entry => {
24 return {id: entry.url, text: entry.name};
25 });
26 },
27 isFiltered: state => {
28 return state.minDate != null || state.maxDate != null || state.task != null
29 || state.user != null || state.client != null || state.project != null
30 }
31 },
32 mutations: {
33 reset: state => {
34 state.orderBy = null;
35 state.orderDir = null;
36 state.minDate = null;
37 state.maxDate = null;
38 state.user = null;
39 state.client = null;
40 state.project = null;
41 state.task = null;
42 },
43
44 setEntries: (state, entries) => state.all = entries,
45 setSubtotal: (state, subtotal) => state.subtotal = subtotal,
46 setTotal: (state, total) => state.total = total,
47
48 setOrderBy: (state, orderBy) => state.orderBy = orderBy,
49 setOrderDir: (state, orderDir) => state.orderDir = orderDir,
50
51 setMinDate: (state, minDate) => state.minDate = minDate,
52 setMaxDate: (state, maxDate) => state.maxDate = maxDate,
53 setUser: (state, user) => state.user = user,
54 setClient: (state, client) => state.client = client,
55 setProject: (state, project) => state.project = project,
56 setTask: (state, task) => state.task = task,
57 },
58 actions: {
59 getReport({commit, state}) {
60 commit('addLoading', 'reports', {root: true});
61
62 let ordering = (state.orderDir == 'desc' ? '-' : '') + state.orderBy;
63 if (state.orderBy != 'date') ordering += ',-date';
64
65 function urlToId(url) {
66 if (url !== null) {
67 let splitUrl = url.split('/');
68 return splitUrl[splitUrl.length - 2];
69 } else {
70 return "";
71 }
72 }
73
74 let getOptions = {
75 params: {
76 ordering: ordering,
77 min_date: state.minDate,
78 max_date:state.maxDate,
79 user: urlToId(state.user),
80 project: urlToId(state.project),
81 project__client: urlToId(state.client),
82 task: urlToId(state.task),
83 },
84 };
85
86 fetch.get(timestrapConfig.API_URLS.ENTRIES, getOptions).then(response => {
87 commit('setEntries', response.data.results);
88 commit('setTotal', response.data.total_duration);
89 commit('setSubtotal', response.data.subtotal_duration);
90 commit('removeLoading', 'reports', {root: true});
91 }).catch(error => {
92 console.log(error);
93 commit('setEntries', []);
94 commit('setTotal', 0);
95 commit('setSubtotal', 0);
96 commit('removeLoading', 'reports', {root: true});
97 });
98 },
99 },
100};