Time tracking you can host anywhere, built on Django. Full export support in multiple formats and easily extensible.
djangodockerhandcodedpythonself-hostedtime-trackingtimetracker
1import Vue from 'vue';
2
3import fetch from '../../fetch';
4
5
6export default {
7 namespaced: true,
8 state: {
9 all: [],
10 },
11 getters: {
12 getNumberOfTasks: state => {
13 return state.all.length;
14 },
15 getSelectTasks: state => {
16 return state.all.map(task => {
17 return {id: task.url, text: task.name};
18 });
19 },
20 getSearchTasks: state => search => {
21 return state.all.filter(task => {
22 return task.name.toLowerCase().includes(search);
23 });
24 },
25 getTask: state => url => {
26 const task = state.all.find(task => {
27 return task.url == url;
28 });
29 if (typeof(task) === 'undefined') return {};
30 else return task;
31 },
32 },
33 mutations: {
34 setTasks: (state, tasks) => state.all = tasks,
35 addTask: (state, task) => state.all.unshift(task),
36 updateTask: (state, opts) => Vue.set(state.all, opts.index, opts.task),
37 removeTask: (state, index) => Vue.delete(state.all, index),
38 },
39 actions: {
40 fetchTasks({commit}) {
41 commit('addLoading', 'tasks', {root: true});
42 fetch.get(timestrapConfig.API_URLS.TASKS).then(response => {
43 commit('setTasks', response.data);
44 commit('removeLoading', 'tasks', {root: true});
45 }).catch(error => console.log(error));
46 },
47 createTask({commit}, task) {
48 fetch.post(timestrapConfig.API_URLS.TASKS, task).then(response => {
49 commit('addTask', response.data);
50 }).catch(error => console.log(error));
51 },
52 editTask({commit, state}, task) {
53 fetch.put(task.url, task).then(response => {
54 const index = state.all.findIndex(item => {
55 return item.id === response.data.id;
56 });
57 commit('updateTask', {index: index, task: response.data});
58 }).catch(error => console.log(error));
59 },
60 deleteTask({commit, state}, task) {
61 const index = state.all.findIndex(item => {
62 return item.id === task.id;
63 });
64 fetch.delete(state.all[index].url).then(() => {
65 commit('removeTask', index);
66 }).catch(error => console.log(error));
67 },
68 },
69};