diff --git a/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js b/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js new file mode 100644 index 000000000..dc4f9da6c --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js @@ -0,0 +1,41 @@ + +const _fetchAction = (page, uri, params) => { + const item_per_page = 50; + if (params === undefined) { + params = {}; + } + let url = uri + '?' + new URLSearchParams({ item_per_page, page, ...params }); + + return fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json;charset=utf-8' + }, + }).then(response => { + if (response.ok) { return response.json(); } + throw Error({ m: response.statusText }); + }); +}; + +const fetchResults = async (uri, params) => { + let promises = [], + page = 1; + let firstData = await _fetchAction(page, uri, params); + console.log('firstData', firstData); + + promises.push(Promise.resolve(firstData.results)); + console.log('more ?', firstData.pagination.more); + + if (firstData.pagination.more) { + do { + page = ++page; + promises.push(_fetchAction(page, uri, params).then(r => Promise.resolve(r.results))); + } while (page * firstData.pagination.items_per_page < firstData.count) + } + + return Promise.all(promises).then(values => values.flat()); +}; + +export { + fetchResults +}; diff --git a/src/Bundle/ChillMainBundle/Resources/public/lib/api/scope.js b/src/Bundle/ChillMainBundle/Resources/public/lib/api/scope.js index 9073822bb..4c4223d77 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/lib/api/scope.js +++ b/src/Bundle/ChillMainBundle/Resources/public/lib/api/scope.js @@ -1,15 +1,7 @@ +import { fetchResults } from 'ChillMainAssets/lib/api/download.js'; + const fetchScopes = () => { - return window.fetch('/api/1.0/main/scope.json').then(response => { - if (response.ok) { - return response.json(); - } - }).then(data => { - //console.log(data); - return new Promise((resolve, reject) => { - //console.log(data); - resolve(data.results); - }); - }); + return fetchResults('/api/1.0/main/scope.json'); }; export { diff --git a/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js b/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js index cd9a31d3f..52754fa97 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js @@ -1,44 +1,8 @@ -const _fetchHouseholdByAddressReference = (reference, page) => { - const perPage = 50; - const url = `/api/1.0/person/household/by-address-reference/${reference.id}.json?` - + new URLSearchParams({item_per_page: perPage, page }); - - return fetch(url, { - method: 'GET', - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - }).then(response => { - if (response.ok()) { return response.json(); } - throw Error({m: response.statusText }); - }); -} +import { fetchResults } from 'ChillMainAssets/lib/api/download.js'; const fetchHouseholdByAddressReference = async (reference) => { - const url = `/api/1.0/person/household/by-address-reference/${reference.id}.json?` - + new URLSearchParams({}); - - return _fetchHouseholdByAddressReference(reference, 1).then(data => { - let promises = []; - promises.push(Promise.resolve(data.results)); - if (data.pagination.more) { - let count = data.count; - let per_page = data.pagination.item_per_page; - let at_end = data.count - let page = 1; - while ((at_end + per_page) < count) { - page = page + 1; - at_end = at_end + per_page; - promises.push(_fetchHouseholdByAddressReference(reference, page).then(data => { - return Promise.resolve(data.results); - })); - } - - } - return Promise.all(promises).then(results => { - return results.flat(); - }); - }); + const url = `/api/1.0/person/household/by-address-reference/${reference.id}.json` + return fetchResults(url); }; export { diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js index 8826d0c97..e4b9250f4 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js @@ -1,6 +1,6 @@ import { createStore } from 'vuex'; import { householdMove, fetchHouseholdSuggestionByAccompanyingPeriod, fetchAddressSuggestionByPerson} from './../api.js'; -import { fetchHouseholdByAddressReference } from 'ChillPersonAssets/chill/lib/household.js'; +import { fetchHouseholdByAddressReference } from 'ChillPersonAssets/lib/household.js'; import { datetimeToISO } from 'ChillMainAssets/chill/js/date.js'; const debug = process.env.NODE_ENV !== 'production'; @@ -83,7 +83,6 @@ const store = createStore({ getSuggestions(state) { let suggestions = []; state.householdSuggestionByAccompanyingPeriod.forEach(h => { - console.log(h); suggestions.push({household: h}); }); @@ -335,7 +334,7 @@ const store = createStore({ state.mode = "existing"; state.forceLeaveWithoutHousehold = false; }, - setHouseholdSuggestionByAccompanyingPeriod(state, households) { + addHouseholdSuggestionByAccompanyingPeriod(state, households) { let existingIds = state.householdSuggestionByAccompanyingPeriod .map(h => h.id); for (let i in households) { @@ -424,27 +423,33 @@ const store = createStore({ fetchHouseholdSuggestionForConcerned({ commit, state }, person) { fetchHouseholdSuggestionByAccompanyingPeriod(person.id) .then(households => { - commit('setHouseholdSuggestionByAccompanyingPeriod', households); + commit('addHouseholdSuggestionByAccompanyingPeriod', households); }); }, - fetchAddressSuggestions({ commit, state }) { + fetchAddressSuggestions({ commit, state, dispatch }) { for (let i in state.concerned) { fetchAddressSuggestionByPerson(state.concerned[i].person.id) .then(addresses => { commit('addAddressesSuggestion', addresses); - let promises = []; - addresses.forEach(a => { - if (a.addressReference !== null) { - let households = fetchHouseholdByAddressReference(a.addressReference); - } - }) - + dispatch('fetchHouseholdSuggestionByAddresses', addresses); }) .catch(e => { console.log(e); }); } }, + async fetchHouseholdSuggestionByAddresses({commit}, addresses) { + console.log('fetchHouseholdSuggestionByAddresses', addresses); + // foreach address, find household suggestions + addresses.forEach(async a => { + if (a.addressReference !== null) { + let households = await fetchHouseholdByAddressReference(a.addressReference); + commit('addHouseholdSuggestionByAccompanyingPeriod', households); + } else { + console.log('not an adresse reference') + } + }); + }, computeWarnings({ commit, state, getters }) { let warnings = [], payload;