import 'es6-promise/auto'; import { createStore } from 'vuex'; import { postLocation } from 'ChillActivityAssets/vuejs/Activity/api'; import { getLocations, getLocationTypeByDefaultFor, getUserCurrentLocation } from "../../../../../ChillActivityBundle/Resources/public/vuejs/Activity/api"; const debug = process.env.NODE_ENV !== 'production'; 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; }; /* * Assign missing keys for the ConcernedGroups component */ const mapEntity = (entity) => { Object.assign(entity, {thirdParties: entity.professionals, users: entity.invites}); return entity; }; const store = createStore({ strict: debug, state: { activity: mapEntity(window.entity), // activity is the calendar entity actually currentEvent: null }, getters: { suggestedEntities(state) { if (typeof(state.activity.accompanyingPeriod) === 'undefined') { return []; } const allEntities = [ ...store.getters.suggestedPersons, ...store.getters.suggestedRequestor, ...store.getters.suggestedUser, ...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.accompanyingPeriod.participations .filter(p => p.endDate === null) .map(p => p.person) .filter(p => !existingPersonIds.includes(p.id)) }, suggestedRequestor(state) { 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)) || (r.type === 'thirdparty' && !existingThirdPartyIds.includes(r.id)) ); }, suggestedUser(state) { const existingUserIds = state.activity.users.map(p => p.id); return [state.activity.accompanyingPeriod.user] .filter( u => !existingUserIds.includes(u.id) ); }, 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)) || (r.type === 'thirdparty' && !existingThirdPartyIds.includes(r.id)) ); } }, mutations: { // ConcernedGroups addPersonsInvolved(state, payload) { //console.log('### mutation addPersonsInvolved', payload.result.type); 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; }; }, // Calendar setEvents(state, payload) { console.log(payload) state.currentEvent = {start: payload.start, end: payload.end} }, // Location updateLocation(state, value) { console.log('### mutation: updateLocation', value); state.activity.location = value; } }, actions: { addPersonsInvolved({ commit }, payload) { console.log('### action addPersonsInvolved', payload.result.type); switch (payload.result.type) { case 'person': let aPersons = document.getElementById("chill_calendarbundle_calendar_persons"); aPersons.value = addIdToValue(aPersons.value, payload.result.id); break; case 'thirdparty': let aThirdParties = document.getElementById("chill_calendarbundle_calendar_professionals"); aThirdParties.value = addIdToValue(aThirdParties.value, payload.result.id); break; case 'user': let aUsers = document.getElementById("chill_calendarbundle_calendar_invites"); 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_calendarbundle_calendar_persons"); aPersons.value = removeIdFromValue(aPersons.value, payload.id); break; case 'thirdparty': let aThirdParties = document.getElementById("chill_calendarbundle_calendar_professionals"); aThirdParties.value = removeIdFromValue(aThirdParties.value, payload.id); break; case 'user': let aUsers = document.getElementById("chill_calendarbundle_calendar_invites"); aUsers.value = removeIdFromValue(aUsers.value, payload.id); break; }; commit('removePersonInvolved', payload); }, // Calendar createEvent({ commit }, payload) { console.log('### action createEvent', payload); let startDateInput = document.getElementById("chill_calendarbundle_calendar_startDate"); startDateInput.value = payload.startStr; let endDateInput = document.getElementById("chill_calendarbundle_calendar_endDate"); endDateInput.value = payload.endStr; let mainUserInput = document.getElementById("chill_calendarbundle_calendar_mainUser"); mainUserInput.value = payload.users.logged.id; commit('setEvents', payload); }, updateEvent({ commit }, payload) { console.log('### action updateEvent', payload); let startDateInput = document.getElementById("chill_calendarbundle_calendar_startDate"); startDateInput.value = payload.event.start.toISOString(); let endDateInput = document.getElementById("chill_calendarbundle_calendar_endDate"); endDateInput.value = payload.event.end.toISOString(); let calendarRangeInput = document.getElementById("chill_calendarbundle_calendar_calendarRange"); calendarRangeInput.value = Number(payload.event.extendedProps.calendarRangeId); let mainUserInput = document.getElementById("chill_calendarbundle_calendar_mainUser"); mainUserInput.value = Number(payload.event.source.id); commit('setEvents', payload); }, // Location updateLocation({ commit }, value) { console.log('### action: updateLocation', value); let hiddenLocation = document.getElementById("chill_calendarbundle_calendar_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); } } }); export default store;