juggl/src/store/modules/juggl.js

519 lines
14 KiB
JavaScript

import { jugglService } from "@/services/juggl.service.js";
export const juggl = {
state: {
apiUrl: "https://juggl.giller.dev/api",
projects: [],
records: [],
tags: [],
statistics: [],
user: undefined,
auth: undefined,
recordsLimit: 0
},
mutations: {
setProjects(state, projects) {
state.projects = projects;
},
setRecords(state, records) {
state.records = records;
},
setTags(state, tags) {
state.tags = tags;
},
setStatistics(state, statistics) {
state.statistics = statistics;
},
setRecordsLimit(state, limit) {
state.recordsLimit = limit;
},
setUser(state, user) {
state.user = user;
},
logout(state) {
state.auth = undefined;
localStorage.removeItem("apiKey");
localStorage.removeItem("userId");
},
login(state, { apiKey, userId }) {
state.auth = { apiKey: apiKey, userId: userId };
localStorage.setItem("apiKey", apiKey);
localStorage.setItem("userId", userId);
}
},
getters: {
runningRecords: state => {
return Object.values(state.records).filter(record => record.running);
},
finishedRecords: state => {
return Object.values(state.records).filter(record => !record.running);
},
getFilteredRecords: (state, getters) => ({
running = undefined,
projectVisible = undefined,
records = undefined
}) => {
if (records == undefined) {
records = getters.records;
}
var visibleProjects = getters.visibleProjects;
var visibleIds = [];
Object.values(visibleProjects)
.filter(p => p.visible)
.forEach(p => {
visibleIds.push(p.project_id);
});
return Object.values(records).filter(rec => {
if (running !== undefined && running !== rec.running) {
return false;
}
var recProjectVisible = visibleIds.includes(rec.project_id);
if (
projectVisible !== undefined &&
projectVisible !== recProjectVisible
) {
return false;
}
return true;
});
},
getFilteredStatistics: (state, getters) => ({
projectVisible = undefined
}) => {
return Object.values(getters.statistics).filter(statistic => {
if (
projectVisible !== undefined &&
statistic.visible !== projectVisible
) {
return false;
}
return true;
});
},
auth: state => state.auth,
apiUrl: state => state.apiUrl,
user: state => state.user,
isLoggedIn: state => !!state.auth,
statistics: state => state.statistics,
records: state => state.records,
projects: state => state.projects,
tags: state => state.tags,
projectIds: state => {
var projectIds = [];
Object.values(state.projects).forEach(project => {
projectIds.push(project.project_id);
});
return projectIds;
},
runningProjectIds: (state, getters) => {
var runningProjectIds = [];
Object.values(getters.runningRecords).forEach(record => {
var projectId = record.project_id;
if (runningProjectIds.includes(runningProjectIds) === false) {
runningProjectIds.push(projectId);
}
});
return runningProjectIds;
},
finishedProjectIds: (state, getters) => {
var runningProjectIds = getters.runningProjectIds;
return getters.projectIds.filter(id => !runningProjectIds.includes(id));
},
finishedProjects: (state, getters) => {
return getters.getFilteredProjects({ finished: true });
},
visibleProjects: (state, getters) => {
return getters.getFilteredProjects({ visible: true });
},
runningProjects: (state, getters) => {
var ids = getters.runningProjectIds;
return Object.values(state.projects).filter(project =>
ids.includes(project.project_id)
);
},
getProjectById: (state, getters) => id => {
return Object.values(getters.projects).find(
project => project.project_id === id
);
},
getFilteredProjects: (state, getters) => ({
finished = undefined,
visible = undefined,
projects = undefined
}) => {
if (projects == undefined) {
projects = getters.projects;
}
var runningIds = getters.runningProjectIds;
return Object.values(projects).filter(project => {
var projectFinished = !runningIds.includes(project.project_id);
if (finished !== undefined && finished !== projectFinished) {
return false;
}
if (visible !== undefined && visible !== project.visible) {
return false;
}
return true;
});
},
getFilteredTags: (state, getters) => ({
visible = undefined,
tags = undefined
}) => {
if (tags == undefined) {
tags = getters.tags;
}
return Object.values(tags).filter(tag => {
if (visible != undefined && visible !== tag.visible) {
return false;
}
return true;
});
},
getTagById: (state, getters) => id => {
return Object.values(getters.tags).find(tag => tag.record_tag_id === id);
},
getRecordById: (state, getters) => id => {
return Object.values(getters.records).find(
record => record.record_id === id
);
},
getRecordsExceptId: (state, getters) => id => {
return Object.values(getters.records).filter(
record => record.record_id !== id
);
},
getProjectsExceptId: (state, getters) => id => {
return Object.values(getters.projects).filter(
project => project.project_id !== id
);
},
getTagsExceptId: (state, getters) => id => {
return Object.values(getters.tags).filter(
tag => tag.record_tag_id !== id
);
}
},
actions: {
loadProjects({ commit }) {
return jugglService.getProjects().then(r => {
commit("setProjects", r.data.projects);
});
},
loadTags({ commit }) {
return jugglService.getTags().then(r => {
commit("setTags", r.data.record_tags);
});
},
loadUser({ commit }) {
return jugglService
.getUser()
.catch(() => {
return false;
})
.then(r => {
commit("setUser", r.data.users[0]);
return true;
});
},
loadRecords({ commit, state, getters }, { limit, finished, visible }) {
if (limit !== undefined) {
commit("setRecordsLimit", limit);
}
var payload = {
limit: state.recordsLimit,
finished: finished,
visible: visible
};
return jugglService.getRecords(payload).then(r => {
var allRecords = Object.values(r.data.records);
if (finished === true) {
allRecords = [...allRecords, ...getters.runningRecords];
} else if (finished === false) {
allRecords = [...allRecords, ...getters.finishedRecords];
}
commit("setRecords", allRecords);
});
},
loadDailyStatistics({ dispatch }, { date }) {
dispatch("loadStatistics", [{ from: date, until: date }]);
},
loadMonthlyStatistics(
{ dispatch },
{ startYear, startMonth, endYear, endMonth }
) {
var frames = [];
// Count all the months until end year and month
while (
startYear < endYear ||
(startYear == endYear && startMonth <= endMonth)
) {
// Create frame
frames.push({
from: new Date(startYear, startMonth, 1),
until: new Date(startYear, startMonth, 0) // 0 leads to the last day of the given month
});
// Count up
if (startMonth >= 12) {
startMonth = 1;
startYear++;
} else {
startMonth++;
}
}
dispatch("loadStatistics", frames);
},
async loadStatistics({ commit }, frames) {
var statistics = [];
for (const frame of frames) {
var result = Object.values(
(await jugglService.getStatistics(frame)).data.statistics
);
if (result.length > 0) {
statistics = [...statistics, ...result];
}
}
commit("setStatistics", statistics);
},
loadRunningRecords({ commit, getters }) {
return jugglService.getRunningRecords().then(r => {
var allRecords = {
...getters.finishedRecords,
...r.data.records
};
commit("setRecords", allRecords);
});
},
login({ commit, getters }, { userId, apiKey }) {
// Is already logged in?
if (getters.isLoggedIn) {
this.dispatch("logout");
}
commit("login", { apiKey: apiKey, userId: userId });
return this.dispatch("loadUser")
.catch(() => {
this.dispatch("logout");
return false;
})
.then(r => {
if (r === false) {
this.dispatch("logout");
return false;
} else {
return true;
}
});
},
logout({ commit }) {
commit("setUser", undefined);
commit("setProjects", []);
commit("setRecords", []);
commit("logout");
},
endRecord({ getters }, recordId) {
if (recordId === undefined) {
return false;
}
return jugglService
.endRecord(recordId)
.catch(() => {
return false;
})
.then(() => {
// TODO: Return ended record from API
var record = getters.getRecordById(recordId);
record.running = false;
return true;
});
},
addProject(context, { name }) {
return jugglService
.addProject(name)
.catch(() => {
return false;
})
.then(() => {
this.dispatch("loadProjects");
return true;
});
},
addTag(context, { name }) {
return jugglService
.addTag(name)
.catch(() => {
return false;
})
.then(() => {
this.dispatch("loadTags");
return true;
});
},
addTagToRecord(context, { tagId, recordId }) {
return jugglService
.addTagToRecord(tagId, recordId)
.catch(() => {
return false;
})
.then(() => {
// TODO: Manualy add tag
return true;
});
},
removeTagFromRecord(context, { tagId, recordId }) {
return jugglService
.removeTagFromRecord(tagId, recordId)
.catch(() => {
return false;
})
.then(() => {
// TODO: Manualy remove tag
return true;
});
},
startRecord(context, projectId) {
if (projectId === undefined) {
return false;
}
return jugglService
.startRecord(projectId)
.catch(() => {
return false;
})
.then(() => {
this.dispatch("loadRunningRecords");
return true;
});
},
removeRecord({ commit, getters }, recordId) {
if (recordId === undefined) {
return false;
}
return jugglService
.removeRecord(recordId)
.catch(() => {
return false;
})
.then(() => {
commit("setRecords", getters.getRecordsExceptId(recordId));
return true;
});
},
removeProject({ commit, getters }, projectId) {
if (projectId === undefined) {
return false;
}
return jugglService
.removeProject(projectId)
.catch(() => {
return false;
})
.then(() => {
commit("setProjects", getters.getProjectsExceptId(projectId));
return true;
});
},
removeTag({ commit, getters }, tagId) {
if (tagId === undefined) {
return false;
}
return jugglService
.removeRecordTag(tagId)
.catch(() => {
return false;
})
.then(() => {
commit("setTags", getters.getTagsExceptId(tagId));
return true;
});
},
loadSavedLogin() {
var userId = localStorage.getItem("userId");
var apiKey = localStorage.getItem("apiKey");
if (userId == undefined || apiKey == undefined) {
return;
}
this.dispatch("login", { apiKey: apiKey, userId: userId });
},
removeLocalRecords({ commit }) {
commit("setRecords", []);
},
updateRecord({ commit, getters }, record) {
if (record.record_id === undefined) {
return;
}
return jugglService
.updateRecord(record)
.catch(() => {
return false;
})
.then(() => {
// TODO: Return updated record from API
var records = getters.getRecordsExceptId(record.record_id);
records.push(record);
commit("setRecords", records);
return true;
});
},
updateTag({ commit, getters }, tag) {
if (tag.record_tag_id === undefined) {
return;
}
return jugglService
.updateRecordTag(tag)
.catch(() => {
return false;
})
.then(() => {
// TODO: Return updated tag from API
var tags = getters.getTagsExceptId(tag.record_tag_id);
tags.push(tag);
commit("setTags", tags);
return true;
});
},
updateProject({ commit, getters }, project) {
if (project.project_id === undefined) {
return;
}
return jugglService
.updateProject(project)
.catch(() => {
return false;
})
.then(() => {
// TODO: Return updated project from API
var projects = getters.getProjectsExceptId(project.project_id);
projects.push(project);
commit("setProjects", projects);
return true;
});
}
}
};