mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-07-03 07:26:12 +00:00
390 lines
13 KiB
JavaScript
390 lines
13 KiB
JavaScript
import "es6-promise/auto";
|
|
import { createStore } from "vuex";
|
|
import { postLocation } from "./api";
|
|
import prepareLocations from "./store.locations.js";
|
|
import {fetchResults, makeFetch} from "ChillMainAssets/lib/api/apiMethods";
|
|
|
|
const debug = process.env.NODE_ENV !== "production";
|
|
//console.log('window.activity', window.activity);
|
|
|
|
const addIdToValue = (string, id) => {
|
|
let array = string ? string.split(",") : [];
|
|
array.push(id.toString());
|
|
let str = array.join();
|
|
return str;
|
|
};
|
|
|
|
const removeIdFromValue = (string, id) => {
|
|
let array = string.split(",");
|
|
array = array.filter((el) => el !== id.toString());
|
|
let str = array.join();
|
|
return str;
|
|
};
|
|
|
|
const store = createStore({
|
|
strict: debug,
|
|
state: {
|
|
me: null,
|
|
activity: window.activity,
|
|
accompanyingPeriodWorks: [],
|
|
socialIssuesOther: [],
|
|
socialActionsList: [],
|
|
availableLocations: [],
|
|
},
|
|
getters: {
|
|
suggestedEntities(state) {
|
|
if (
|
|
typeof state.activity.accompanyingPeriod === "undefined" ||
|
|
state.activity.accompanyingPeriod === null
|
|
) {
|
|
return [];
|
|
}
|
|
const allEntities = [
|
|
...store.getters.suggestedPersons,
|
|
...store.getters.suggestedRequestor,
|
|
...store.getters.suggestedUsers,
|
|
...store.getters.suggestedResources,
|
|
];
|
|
const uniqueIds = [
|
|
...new Set(allEntities.map((i) => `${i.type}-${i.id}`)),
|
|
];
|
|
return Array.from(
|
|
uniqueIds,
|
|
(id) => allEntities.filter((r) => `${r.type}-${r.id}` === id)[0],
|
|
);
|
|
},
|
|
suggestedPersons(state) {
|
|
const existingPersonIds = state.activity.persons.map((p) => p.id);
|
|
return state.activity.activityType.personsVisible === 0
|
|
? []
|
|
: state.activity.accompanyingPeriod.participations
|
|
.filter((p) => p.endDate === null)
|
|
.map((p) => p.person)
|
|
.filter((p) => !existingPersonIds.includes(p.id));
|
|
},
|
|
suggestedRequestor(state) {
|
|
if (state.activity.accompanyingPeriod.requestor === null) {
|
|
return [];
|
|
}
|
|
const existingPersonIds = state.activity.persons.map((p) => p.id);
|
|
const existingThirdPartyIds = state.activity.thirdParties.map(
|
|
(p) => p.id,
|
|
);
|
|
|
|
return [state.activity.accompanyingPeriod.requestor].filter(
|
|
(r) =>
|
|
(r.type === "person" &&
|
|
!existingPersonIds.includes(r.id) &&
|
|
state.activity.activityType.personsVisible !== 0) ||
|
|
(r.type === "thirdparty" &&
|
|
!existingThirdPartyIds.includes(r.id) &&
|
|
state.activity.activityType.thirdPartiesVisible !== 0),
|
|
);
|
|
},
|
|
suggestedUsers(state) {
|
|
const existingUserIds = state.activity.users.map((p) => p.id);
|
|
let suggestedUsers =
|
|
state.activity.activityType.usersVisible === 0
|
|
? []
|
|
: [state.activity.accompanyingPeriod.user].filter(
|
|
(u) => u !== null && !existingUserIds.includes(u.id),
|
|
);
|
|
|
|
state.accompanyingPeriodWorks.forEach((work) => {
|
|
work.referrers.forEach((r) => {
|
|
if (!existingUserIds.includes(r.id)) {
|
|
suggestedUsers.push(r);
|
|
}
|
|
});
|
|
});
|
|
// Add the current user from the state
|
|
if (state.me && !existingUserIds.includes(state.me.id)) {
|
|
suggestedUsers.push(state.me);
|
|
}
|
|
// console.log("suggested users", suggestedUsers);
|
|
|
|
return suggestedUsers;
|
|
},
|
|
suggestedResources(state) {
|
|
// const resources = state.activity.accompanyingPeriod.resources;
|
|
const existingPersonIds = state.activity.persons.map((p) => p.id);
|
|
const existingThirdPartyIds = state.activity.thirdParties.map(
|
|
(p) => p.id,
|
|
);
|
|
return state.activity.accompanyingPeriod.resources
|
|
.map((r) => r.resource)
|
|
.filter(
|
|
(r) =>
|
|
(r.type === "person" &&
|
|
!existingPersonIds.includes(r.id) &&
|
|
state.activity.activityType.personsVisible !== 0) ||
|
|
(r.type === "thirdparty" &&
|
|
!existingThirdPartyIds.includes(r.id) &&
|
|
state.activity.activityType.thirdPartiesVisible !== 0),
|
|
);
|
|
},
|
|
socialActionsListSorted(state) {
|
|
return [...state.socialActionsList]
|
|
.sort((a, b) => a.ordering - b.ordering)
|
|
.reduce((acc, action) => {
|
|
const issueText = action.issue?.text || "Uncategorized";
|
|
// Find if the group for the issue already exists
|
|
let group = acc.find((item) => item.issue === issueText);
|
|
if (!group) {
|
|
group = { issue: issueText, actions: [] };
|
|
acc.push(group);
|
|
}
|
|
group.actions.push(action);
|
|
return acc;
|
|
}, []);
|
|
},
|
|
},
|
|
mutations: {
|
|
setWhoAmI(state, me) {
|
|
state.me = me;
|
|
},
|
|
// SocialIssueAcc
|
|
addIssueInList(state, issue) {
|
|
//console.log('add issue list', issue.id);
|
|
state.activity.accompanyingPeriod.socialIssues.push(issue);
|
|
},
|
|
addIssueSelected(state, issue) {
|
|
//console.log('add issue selected', issue.id);
|
|
state.activity.socialIssues.push(issue);
|
|
},
|
|
updateIssuesSelected(state, issues) {
|
|
//console.log('update issues selected', issues);
|
|
state.activity.socialIssues = issues;
|
|
},
|
|
updateIssuesOther(state, payload) {
|
|
//console.log('update issues other');
|
|
state.socialIssuesOther = payload;
|
|
},
|
|
removeIssueInOther(state, issue) {
|
|
//console.log('remove issue other', issue.id);
|
|
state.socialIssuesOther = state.socialIssuesOther.filter(
|
|
(i) => i.id !== issue.id,
|
|
);
|
|
},
|
|
resetActionsList(state) {
|
|
//console.log('reset list actions');
|
|
state.socialActionsList = [];
|
|
},
|
|
addActionInList(state, action) {
|
|
state.socialActionsList.push(action);
|
|
},
|
|
updateActionsSelected(state, actions) {
|
|
//console.log('update actions selected', actions);
|
|
state.activity.socialActions = actions;
|
|
},
|
|
filterList(state, list) {
|
|
const filterList = (list) => {
|
|
// remove duplicates entries
|
|
list = list.filter(
|
|
(value, index) =>
|
|
list.findIndex((array) => array.id === value.id) === index,
|
|
);
|
|
// alpha sort
|
|
list.sort((a, b) => (a.text > b.text ? 1 : b.text > a.text ? -1 : 0));
|
|
return list;
|
|
};
|
|
if (list === "issues") {
|
|
state.activity.accompanyingPeriod.socialIssues = filterList(
|
|
state.activity.accompanyingPeriod.socialIssues,
|
|
);
|
|
}
|
|
if (list === "actions") {
|
|
state.socialActionsList = filterList(state.socialActionsList);
|
|
}
|
|
},
|
|
|
|
// ConcernedGroups
|
|
addPersonsInvolved(state, payload) {
|
|
console.log("### mutation addPersonsInvolved", payload);
|
|
switch (payload.result.type) {
|
|
case "person":
|
|
state.activity.persons.push(payload.result);
|
|
break;
|
|
case "thirdparty":
|
|
state.activity.thirdParties.push(payload.result);
|
|
break;
|
|
case "user":
|
|
state.activity.users.push(payload.result);
|
|
break;
|
|
}
|
|
},
|
|
removePersonInvolved(state, payload) {
|
|
//console.log('### mutation removePersonInvolved', payload.type);
|
|
switch (payload.type) {
|
|
case "person":
|
|
state.activity.persons = state.activity.persons.filter(
|
|
(person) => person !== payload,
|
|
);
|
|
break;
|
|
case "thirdparty":
|
|
state.activity.thirdParties = state.activity.thirdParties.filter(
|
|
(thirdparty) => thirdparty !== payload,
|
|
);
|
|
break;
|
|
case "user":
|
|
state.activity.users = state.activity.users.filter(
|
|
(user) => user !== payload,
|
|
);
|
|
break;
|
|
}
|
|
},
|
|
updateLocation(state, value) {
|
|
console.log("### mutation: updateLocation", value);
|
|
state.activity.location = value;
|
|
},
|
|
addAvailableLocationGroup(state, group) {
|
|
state.availableLocations.push(group);
|
|
},
|
|
setAccompanyingPeriodWorks(state, works) {
|
|
state.accompanyingPeriodWorks = works;
|
|
},
|
|
},
|
|
actions: {
|
|
addIssueSelected({ commit }, issue) {
|
|
let aSocialIssues = document.getElementById(
|
|
"chill_activitybundle_activity_socialIssues",
|
|
);
|
|
aSocialIssues.value = addIdToValue(aSocialIssues.value, issue.id);
|
|
commit("addIssueSelected", issue);
|
|
},
|
|
updateIssuesSelected({ commit }, payload) {
|
|
let aSocialIssues = document.getElementById(
|
|
"chill_activitybundle_activity_socialIssues",
|
|
);
|
|
aSocialIssues.value = "";
|
|
payload.forEach((item) => {
|
|
aSocialIssues.value = addIdToValue(aSocialIssues.value, item.id);
|
|
});
|
|
commit("updateIssuesSelected", payload);
|
|
},
|
|
updateActionsSelected({ commit }, payload) {
|
|
let aSocialActions = document.getElementById(
|
|
"chill_activitybundle_activity_socialActions",
|
|
);
|
|
aSocialActions.value = "";
|
|
payload.forEach((item) => {
|
|
aSocialActions.value = addIdToValue(aSocialActions.value, item.id);
|
|
});
|
|
commit("updateActionsSelected", payload);
|
|
},
|
|
addAvailableLocationGroup({ commit }, payload) {
|
|
commit("addAvailableLocationGroup", payload);
|
|
},
|
|
addPersonsInvolved({ commit }, payload) {
|
|
//console.log('### action addPersonsInvolved', payload.result.type);
|
|
switch (payload.result.type) {
|
|
case "person":
|
|
let aPersons = document.getElementById(
|
|
"chill_activitybundle_activity_persons",
|
|
);
|
|
aPersons.value = addIdToValue(aPersons.value, payload.result.id);
|
|
break;
|
|
case "thirdparty":
|
|
let aThirdParties = document.getElementById(
|
|
"chill_activitybundle_activity_thirdParties",
|
|
);
|
|
aThirdParties.value = addIdToValue(
|
|
aThirdParties.value,
|
|
payload.result.id,
|
|
);
|
|
break;
|
|
case "user":
|
|
let aUsers = document.getElementById(
|
|
"chill_activitybundle_activity_users",
|
|
);
|
|
aUsers.value = addIdToValue(aUsers.value, payload.result.id);
|
|
break;
|
|
}
|
|
commit("addPersonsInvolved", payload);
|
|
},
|
|
removePersonInvolved({ commit }, payload) {
|
|
//console.log('### action removePersonInvolved', payload);
|
|
switch (payload.type) {
|
|
case "person":
|
|
let aPersons = document.getElementById(
|
|
"chill_activitybundle_activity_persons",
|
|
);
|
|
aPersons.value = removeIdFromValue(aPersons.value, payload.id);
|
|
break;
|
|
case "thirdparty":
|
|
let aThirdParties = document.getElementById(
|
|
"chill_activitybundle_activity_thirdParties",
|
|
);
|
|
aThirdParties.value = removeIdFromValue(
|
|
aThirdParties.value,
|
|
payload.id,
|
|
);
|
|
break;
|
|
case "user":
|
|
let aUsers = document.getElementById(
|
|
"chill_activitybundle_activity_users",
|
|
);
|
|
aUsers.value = removeIdFromValue(aUsers.value, payload.id);
|
|
break;
|
|
}
|
|
commit("removePersonInvolved", payload);
|
|
},
|
|
updateLocation({ commit }, value) {
|
|
console.log("### action: updateLocation", value);
|
|
let hiddenLocation = document.getElementById(
|
|
"chill_activitybundle_activity_location",
|
|
);
|
|
if (value.onthefly) {
|
|
const body = {
|
|
type: "location",
|
|
name:
|
|
value.name === "__AccompanyingCourseLocation__" ? null : value.name,
|
|
locationType: {
|
|
id: value.locationType.id,
|
|
type: "location-type",
|
|
},
|
|
};
|
|
if (value.address.id) {
|
|
Object.assign(body, {
|
|
address: {
|
|
id: value.address.id,
|
|
},
|
|
});
|
|
}
|
|
postLocation(body)
|
|
.then((location) => (hiddenLocation.value = location.id))
|
|
.catch((err) => {
|
|
console.log(err.message);
|
|
});
|
|
} else {
|
|
hiddenLocation.value = value.id;
|
|
}
|
|
commit("updateLocation", value);
|
|
},
|
|
async fetchAccompanyingPeriodWorks({ state, commit }) {
|
|
const accompanyingPeriodId = state.activity.accompanyingPeriod.id;
|
|
const url = `/api/1.0/person/accompanying-course/${accompanyingPeriodId}/works.json`;
|
|
try {
|
|
const works = await fetchResults(url);
|
|
// console.log('works', works);
|
|
commit("setAccompanyingPeriodWorks", works);
|
|
} catch (error) {
|
|
console.error('Failed to fetch works:', error);
|
|
}
|
|
},
|
|
getWhoAmI({ commit }) {
|
|
const url = `/api/1.0/main/whoami.json`;
|
|
makeFetch("GET", url).then((user) => {
|
|
commit("setWhoAmI", user);
|
|
});
|
|
},
|
|
},
|
|
});
|
|
|
|
store.dispatch("getWhoAmI");
|
|
|
|
prepareLocations(store);
|
|
store.dispatch("fetchAccompanyingPeriodWorks");
|
|
|
|
export default store;
|