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 getNumberOfProjects: state => {
13 return state.all.length;
14 },
15 getSelectProjects: state => {
16 return state.all.map(project => {
17 return {id: project.url, text: project.name};
18 });
19 },
20 getSelectProjectsForClient: state => client => {
21 return state.all.filter(project => {
22 return project.client === client;
23 }).map(project => {
24 return {id: project.url, text: project.name};
25 });
26 },
27 getSearchProjects: (state, getters, rootState, rootGetters) => search => {
28 return state.all.filter(project => {
29 return project.name.toLowerCase().includes(search) || rootGetters['clients/getClient'](project.client).name.toLowerCase().includes(search);
30 })
31 },
32 getProject: state => url => {
33 const project = state.all.find(project => {
34 return project.url === url;
35 });
36 if (typeof(project) === 'undefined') return {};
37 else return project;
38 },
39 },
40 mutations: {
41 setProjects: (state, projects) => state.all = projects,
42 addProject: (state, project) => state.all.unshift(project),
43 updateProject: (state, opts) => Vue.set(state.all, opts.index, opts.project),
44 removeProject: (state, index) => Vue.delete(state.all, index),
45 },
46 actions: {
47 fetchProjects({commit}) {
48 commit('addLoading', 'projects', {root: true});
49 fetch.get(timestrapConfig.API_URLS.PROJECTS).then(response => {
50 commit('setProjects', response.data);
51 commit('removeLoading', 'projects', {root: true});
52 }).catch(error => console.log(error));
53 },
54 createProject({commit}, project) {
55 fetch.post(timestrapConfig.API_URLS.PROJECTS, project).then(response => {
56 commit('addProject', response.data);
57 }).catch(error => console.log(error));
58 },
59 editProject({commit, state}, project) {
60 fetch.put(project.url, project).then(response => {
61 const index = state.all.findIndex(item => {
62 return item.id === response.data.id;
63 });
64 commit('updateProject', {index: index, project: response.data});
65 }).catch(error => console.log(error));
66 },
67 deleteProject({commit, state}, project) {
68 const index = state.all.findIndex(item => {
69 return item.id === project.id;
70 });
71 fetch.delete(state.all[index].url).then(() => {
72 commit('removeProject', index);
73 }).catch(error => console.log(error));
74 },
75 },
76};