From 983cfb646cd456472d59a01926ae989f3f28bc91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 25 Nov 2021 12:11:22 +0100 Subject: [PATCH] Merge add_toasters: handle 422 method and add toaster into course editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/221 Squashed commit of the following: commit 4f68f83aba74a88898779037aeb24d45c622759e Author: Julien Fastré Date: Thu Nov 25 12:07:37 2021 +0100 scope in course editor: show toast when error, instead of restoring the previous state commit fdca8c1c87a4972bb6107bb16ab76844a28cae72 Merge: 53d6e68f8 b97f49782 Author: Julien Fastré Date: Wed Nov 24 17:39:27 2021 +0100 Merge remote-tracking branch 'origin/add_toasters' into add_toasters commit 53d6e68f8c5e158ac1848403d18146690ffeacf2 Author: Julien Fastré Date: Wed Nov 24 17:38:52 2021 +0100 better validation messages commit b97f497822fa6f6057e3b1cf3697044192ea9052 Author: Julie Lenaerts Date: Wed Nov 24 17:36:59 2021 +0100 methods added to api.js again so they can be imported in other bundles still. To be refactored later with general makeFetch method? commit e6089f75b4f66669cbd84f496c3b867901de9c8c Author: Julien Fastré Date: Wed Nov 24 17:20:05 2021 +0100 fix validator for participation overlaps commit e47e6741b9f179dae63f39a596b7ba7410b3ac88 Merge: 25a80fcb2 05385509e Author: Julien Fastré Date: Wed Nov 24 16:31:50 2021 +0100 Merge remote-tracking branch 'origin/master' into add_toasters commit 25a80fcb26cfb3ab7afab0abc1fcb6c0d0af7a6d Author: Julie Lenaerts Date: Tue Nov 23 18:22:35 2021 +0100 error object/message changed if not 422 or 403 commit 0c602cee8c127ab7f0723819a691a98c4e0615e2 Author: Julie Lenaerts Date: Tue Nov 23 17:13:47 2021 +0100 Toasts displayed with differentiation between different errors error objects created accordingly commit 252e57a06da1101e4ebc025974b247c472b8c2ed Author: Julie Lenaerts Date: Tue Nov 23 17:12:55 2021 +0100 generic makeFetch implemented almost everywhere api.js file no longer needs to contain a separate function to make an api call. commit 8532eeee7656f6f9761168fb5e2102778ee932b7 Author: Julie Lenaerts Date: Tue Nov 23 17:10:48 2021 +0100 Moved generic api methods into one file apiMethods.js imports adapted throughout bundles commit c44bd5e75b32d5fbc8951247324ebf5fb85f3b37 Author: Julie Lenaerts Date: Tue Nov 23 11:27:24 2021 +0100 migration deleted commit dbeee090f46b3653c306a1825dcb05637e1f9b31 Author: Julie Lenaerts Date: Tue Nov 23 11:27:13 2021 +0100 toast plugin initialized with options in the root commit ec3919e357ee26f6c5016360d2083d19688217f4 Merge: 1ab401b5d b8889ed58 Author: Julie Lenaerts Date: Tue Nov 23 10:52:24 2021 +0100 merge conflicts fixed commit 1ab401b5d55a28f9c027ee539da58ef1da3d797c Author: Julie Lenaerts Date: Tue Nov 23 10:40:02 2021 +0100 add options when vue toast plugin is loaded commit ad4e630bdd87c8ec16455bab0c2b053c1d838050 Author: Julie Lenaerts Date: Mon Nov 22 18:58:44 2021 +0100 fixes to throw and catch error commit 1c19748866d738bcb9e336f1035d9d78c6941d34 Author: Julie Lenaerts Date: Wed Nov 17 20:22:06 2021 +0100 toast added to banner commit 35949b90532b60161e14e815a78b3b69b053b62d Author: Julie Lenaerts Date: Wed Nov 17 20:16:35 2021 +0100 few more actions using makeFetch commit e94c13e396f496565955294aec360db37f92374b Author: Julie Lenaerts Date: Wed Nov 17 19:48:58 2021 +0100 For accompanyingcourse app general makeFetch + displayToast implemented commit 35eac75edf2c8d39ee2a04f119bb99a946fe3ea9 Author: Julie Lenaerts Date: Wed Nov 17 17:12:31 2021 +0100 general makeFetch method implemented + toasts displayed in progress commit 541bb10547bd7b96815a22a755ecf7f809d8cc87 Author: Julie Lenaerts Date: Wed Nov 17 12:36:20 2021 +0100 general fetch method adjusted and tested on addParticipation: works commit b7f27e8079bc815d88ffc925ec7a4fae3fba5f02 Author: Julie Lenaerts Date: Wed Nov 17 11:50:09 2021 +0100 changelog updated commit 028519ee3e93991aeb3131656e5f17e728ebdb1c Author: Julie Lenaerts Date: Wed Nov 17 11:42:55 2021 +0100 adjustment of error message using templating render commit 508139b4476a46028a40b0b5300a8c65f79414a9 Author: Julie Lenaerts Date: Wed Nov 17 11:41:52 2021 +0100 toast display for 422 errors on participations, requestor, resources + bugfix in requestor component (display of 'remove' btn if non-anonymous commit 3e5d4862fcbbf5708f52c0038bf030dc0cbae5bb Author: Julie Lenaerts Date: Tue Nov 16 15:38:03 2021 +0100 debugging fetch method commit 8b971a2357aac952ea6cd9487da20f4064c26a8d Author: Julie Lenaerts Date: Tue Nov 16 14:31:45 2021 +0100 general fetch method in _abstratAPI and testcase implementation; still needs to take care of commit into store commit 05488740ab138ed279a4626310c5427d9f732793 Author: Julie Lenaerts Date: Tue Nov 16 11:13:28 2021 +0100 testcase: toaster working when adding a resource to an accompanying course. Needs to be generalized commit 5050e8a516107710216fa11aafcf852c52e1eb03 Author: Julie Lenaerts Date: Tue Nov 16 09:22:36 2021 +0100 start of toaster popup commit b8889ed58d3abb68d1c2859b31bf7428addda36e Author: Julie Lenaerts Date: Mon Nov 22 18:58:44 2021 +0100 fixes to throw and catch error commit 0c017eb908e65919876d3bed69d3daa27699f2cc Author: Julie Lenaerts Date: Wed Nov 17 20:22:06 2021 +0100 toast added to banner commit 80d8c5f12be4b0cfcded2948f385b4e3627e9afb Author: Julie Lenaerts Date: Wed Nov 17 20:16:35 2021 +0100 few more actions using makeFetch commit 9cfcc61d995f75651902af97fe640f00f994ce9b Author: Julie Lenaerts Date: Wed Nov 17 19:48:58 2021 +0100 For accompanyingcourse app general makeFetch + displayToast implemented commit 2855b0293a4a3fef2baf22fa035316bac13abf3f Author: Julie Lenaerts Date: Wed Nov 17 17:12:31 2021 +0100 general makeFetch method implemented + toasts displayed in progress commit febbc8b9cdd9ec811546ce2948e2e1bded7c2116 Author: Julie Lenaerts Date: Wed Nov 17 12:36:20 2021 +0100 general fetch method adjusted and tested on addParticipation: works commit 16b59681b97cf995689aa464ae2a310c3efbb603 Author: Julie Lenaerts Date: Wed Nov 17 11:50:09 2021 +0100 changelog updated commit 41df29bdef84af010892708bfd0e37ff826f7aee Author: Julie Lenaerts Date: Wed Nov 17 11:42:55 2021 +0100 adjustment of error message using templating render commit 8c98fe602c26e61285f12f5f7d58d646655f4caa Author: Julie Lenaerts Date: Wed Nov 17 11:41:52 2021 +0100 toast display for 422 errors on participations, requestor, resources + bugfix in requestor component (display of 'remove' btn if non-anonymous commit 689ca8aa0ac249d577fe2ead5b3fcc0298dbad90 Author: Julie Lenaerts Date: Tue Nov 16 15:38:03 2021 +0100 debugging fetch method commit 07234c5fa996fb9f0352719ee366b34b093807eb Author: Julie Lenaerts Date: Tue Nov 16 14:31:45 2021 +0100 general fetch method in _abstratAPI and testcase implementation; still needs to take care of commit into store commit 2a482516e952aa720b5aa8b4cb68ab33f93ce47b Author: Julie Lenaerts Date: Tue Nov 16 11:13:28 2021 +0100 testcase: toaster working when adding a resource to an accompanying course. Needs to be generalized commit b7dcc5e7d4b1489a8edc175a0c2c1b0d649c6c0f Author: Julie Lenaerts Date: Tue Nov 16 09:22:36 2021 +0100 start of toaster popup --- CHANGELOG.md | 8 + .../Resources/public/lib/api/apiMethods.js | 106 +++++ .../Resources/public/lib/api/download.js | 64 +-- .../Resources/public/lib/api/scope.js | 14 +- .../public/vuejs/_components/Confidential.vue | 1 - .../Entity/AccompanyingPeriod.php | 4 +- .../Resources/public/lib/household.js | 2 +- .../public/vuejs/AccompanyingCourse/App.vue | 2 +- .../public/vuejs/AccompanyingCourse/api.js | 226 +--------- .../components/Banner/ToggleFlags.vue | 27 +- .../components/ButtonLocation.vue | 10 +- .../AccompanyingCourse/components/Comment.vue | 20 +- .../AccompanyingCourse/components/Confirm.vue | 11 +- .../components/CourseLocation.vue | 19 +- .../components/OriginDemand.vue | 26 +- .../components/PersonsAssociated.vue | 36 +- .../PersonsAssociated/ParticipationItem.vue | 9 +- .../components/Referrer.vue | 26 +- .../components/Requestor.vue | 38 +- .../components/Resources.vue | 18 +- .../components/Resources/ResourceItem.vue | 9 +- .../AccompanyingCourse/components/Scopes.vue | 20 +- .../components/SocialIssue.vue | 28 +- .../public/vuejs/AccompanyingCourse/index.js | 11 +- .../vuejs/AccompanyingCourse/store/index.js | 390 +++++++++++------- .../ParticipationOverlap.php | 2 +- .../ParticipationOverlapValidator.php | 48 ++- .../ResourceDuplicateCheckValidator.php | 4 + .../translations/validators.fr.yml | 4 +- 29 files changed, 713 insertions(+), 470 deletions(-) create mode 100644 src/Bundle/ChillMainBundle/Resources/public/lib/api/apiMethods.js diff --git a/CHANGELOG.md b/CHANGELOG.md index c98d7db27..8256536da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,14 @@ and this project adheres to * [person suggest] In widget "add person", improve the pertinence of persons when one of the names starts with the pattern; * [person] do not ask for center any more on person creation * [3party] do not ask for center any more on 3party creation +<<<<<<< HEAD +<<<<<<< HEAD +======= +* [validation] toasts are displayed for errors when modifying accompanying course (generalization required). +>>>>>>> 16b59681 (changelog updated) +======= +* [validation] toasts are displayed for errors when modifying accompanying course (generalization required). +>>>>>>> b8889ed58d3abb68d1c2859b31bf7428addda36e ## Test releases diff --git a/src/Bundle/ChillMainBundle/Resources/public/lib/api/apiMethods.js b/src/Bundle/ChillMainBundle/Resources/public/lib/api/apiMethods.js new file mode 100644 index 000000000..5b49ba546 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/public/lib/api/apiMethods.js @@ -0,0 +1,106 @@ +/** + * Generic api method that can be adapted to any fetch request + */ + const makeFetch = (method, url, body) => { + return fetch(url, { + method: method, + headers: { + 'Content-Type': 'application/json;charset=utf-8' + }, + body: (body !== null) ? JSON.stringify(body) : null + }) + .then(response => { + + if (response.ok) { + return response.json(); + } + + if (response.status === 422) { + return response.json().then(response => { + throw ValidationException(response) + }); + } + + if (response.status === 403) { + return response.json().then(() => { + throw AccessException(); + }); + } + + throw { + name: 'Exception', + sta: response.status, + txt: response.statusText, + err: new Error(), + violations: response.body + }; + }); +} + +/** + * Fetch results with certain parameters + */ +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); + + promises.push(Promise.resolve(firstData.results)); + + 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()); +}; + +const fetchScopes = () => { + return fetchResults('/api/1.0/main/scope.json'); +}; + + +/** + * Error objects to be thrown + */ +const ValidationException = (response) => { + const error = {}; + error.name = 'ValidationException'; + error.violations = response.violations.map((violation) => `${violation.title}`); + + return error; +} + +const AccessException = () => { + const error = {}; + error.name = 'AccessException'; + error.violations = ['You are no longer permitted to perform this action']; + + return error; +} + +export { + makeFetch, + fetchResults, + fetchScopes +} diff --git a/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js b/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js index 625103ebe..dec8ba727 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js +++ b/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js @@ -1,39 +1,39 @@ -const _fetchAction = (page, uri, params) => { - const item_per_page = 50; - if (params === undefined) { - params = {}; - } - let url = uri + '?' + new URLSearchParams({ item_per_page, page, ...params }); +// 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 }); - }); -}; +// 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); +// const fetchResults = async (uri, params) => { +// let promises = [], +// page = 1; +// let firstData = await _fetchAction(page, uri, params); - promises.push(Promise.resolve(firstData.results)); +// promises.push(Promise.resolve(firstData.results)); - 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) - } +// 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()); -}; +// return Promise.all(promises).then(values => values.flat()); +// }; -export { - fetchResults -}; +// 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 4c4223d77..a155c84a2 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/lib/api/scope.js +++ b/src/Bundle/ChillMainBundle/Resources/public/lib/api/scope.js @@ -1,9 +1,9 @@ -import { fetchResults } from 'ChillMainAssets/lib/api/download.js'; +// import { fetchResults } from 'ChillMainAssets/lib/api/download.js'; -const fetchScopes = () => { - return fetchResults('/api/1.0/main/scope.json'); -}; +// const fetchScopes = () => { +// return fetchResults('/api/1.0/main/scope.json'); +// }; -export { - fetchScopes -}; +// export { +// fetchScopes +// }; diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Confidential.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Confidential.vue index 5fe040e14..efdf62926 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Confidential.vue +++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/_components/Confidential.vue @@ -13,7 +13,6 @@ export default { methods : { toggleBlur: function(e){ if(e.target.matches('.toggle')){ - console.log(e); e.target.previousElementSibling.classList.toggle("blur"); e.target.classList.toggle("fa-eye"); e.target.classList.toggle("fa-eye-slash"); diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php index 958d7d58b..6b0c5d768 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php @@ -277,7 +277,7 @@ class AccompanyingPeriod implements * inverseJoinColumns={@ORM\JoinColumn(name="scope_id", referencedColumnName="id")} * ) * @Groups({"read"}) - * @Assert\Count(min=1, groups={AccompanyingPeriod::STEP_CONFIRMED}) + * @Assert\Count(min=1, groups={AccompanyingPeriod::STEP_CONFIRMED}, minMessage="A course must be associated to at least one scope") */ private $scopes; @@ -289,7 +289,7 @@ class AccompanyingPeriod implements * name="chill_person_accompanying_period_social_issues" * ) * @Groups({"read"}) - * @Assert\Count(min=1, groups={AccompanyingPeriod::STEP_CONFIRMED}) + * @Assert\Count(min=1, groups={AccompanyingPeriod::STEP_CONFIRMED}, minMessage="A course must contains at least one social issue") */ private Collection $socialIssues; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js b/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js index 52754fa97..c96694dcb 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/lib/household.js @@ -1,4 +1,4 @@ -import { fetchResults } from 'ChillMainAssets/lib/api/download.js'; +import { fetchResults } from 'ChillMainAssets/lib/api/apiMethods.js'; const fetchHouseholdByAddressReference = async (reference) => { const url = `/api/1.0/person/household/by-address-reference/${reference.id}.json` diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue index c559ae56e..30a8bbf2a 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/App.vue @@ -59,7 +59,7 @@ export default { 'accompanyingCourse', 'addressContext' ]), - }, + } }; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/api.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/api.js index c372ac7a7..4eb6f2a33 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/api.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/api.js @@ -1,4 +1,4 @@ -import { fetchResults } from 'ChillMainAssets/lib/api/download.js'; +import { fetchResults } from 'ChillMainAssets/lib/api/apiMethods.js'; /* * Endpoint v.2 chill_api_single_accompanying_course__entity @@ -15,44 +15,17 @@ const getAccompanyingCourse = (id) => { }); }; -/* -* Endpoint v.2 chill_api_single_accompanying_course__entity -* method PATCH, patch AccompanyingCourse Instance -* -* @id integer - id of accompanyingCourse -* @body Object - dictionary with changes to post -*/ -const patchAccompanyingCourse = (id, body) => { - //console.log('body', body); - const url = `/api/1.0/person/accompanying-course/${id}.json`; - return fetch(url, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - body: JSON.stringify(body) - }) - .then(response => { - if (response.ok) { return response.json(); } - console.log(response); - throw { msg: 'Error while updating AccompanyingPeriod Course.', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); +const getUsers = () => { + const url = `/api/1.0/main/user.json`; + + return fetchResults(url); }; -/* -* Endpoint to change 'DRAFT' step to 'CONFIRMED' -*/ -const confirmAccompanyingCourse = (id) => { - const url = `/api/1.0/person/accompanying-course/${id}/confirm.json` - return fetch(url, { - method: 'POST', - headers: {'Content-Type': 'application/json;charset=utf-8'} - }) - .then(response => { - if (response.ok) { return response.json(); } - throw { msg: 'Error while confirming AccompanyingPeriod Course.', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; +const getReferrersSuggested = (course) => { + const url = `/api/1.0/person/accompanying-course/${course.id}/referrers-suggested.json`; + + return fetchResults(url); +} /* * Endpoint @@ -66,115 +39,6 @@ const getSocialIssues = () => { }); }; -/* -* Endpoint v.2 chill_api_single_accompanying_course_participation, -* method POST/DELETE, add/close a participation to the accompanyingCourse -* -* @id integer - id of accompanyingCourse -* @payload integer - id of person -* @method string - POST or DELETE -*/ -const postParticipation = (id, payload, method) => { - const body = { type: payload.type, id: payload.id }; - const url = `/api/1.0/person/accompanying-course/${id}/participation.json`; - return fetch(url, { - method: method, - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - body: JSON.stringify(body) - }) - .then(response => { - if (response.ok) { return response.json(); } - // TODO: adjust message according to status code? Or how to access the message from the violation array? - throw { msg: 'Error while sending AccompanyingPeriod Course participation', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; - -/* -* Endpoint v.2 chill_api_single_accompanying_course_requestor, -* method POST/DELETE, add/close a requestor to the accompanyingCourse -* -* @id integer - id of accompanyingCourse -* @payload object of type person|thirdparty -* @method string - POST or DELETE -*/ -const postRequestor = (id, payload, method) => { - //console.log('payload', payload); - const body = (payload)? { type: payload.type, id: payload.id } : {}; - //console.log('body', body); - const url = `/api/1.0/person/accompanying-course/${id}/requestor.json`; - return fetch(url, { - method: method, - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - body: JSON.stringify(body) - }) - .then(response => { - if (response.ok) { return response.json(); } - throw { msg: 'Error while sending AccompanyingPeriod Course requestor', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; - -/* -* Endpoint v.2 chill_api_single_accompanying_course_resource, -* method POST/DELETE, add/remove a resource to the accompanyingCourse -* -* @id integer - id of accompanyingCourse -* @payload object of type person|thirdparty -* @method string - POST or DELETE -*/ -const postResource = (id, payload, method) => { - //console.log('payload', payload); - const body = { type: "accompanying_period_resource" }; - switch (method) { - case 'DELETE': - body['id'] = payload.id; - break; - default: - body['resource'] = { type: payload.type, id: payload.id }; - } - //console.log('body', body); - const url = `/api/1.0/person/accompanying-course/${id}/resource.json`; - return fetch(url, { - method: method, - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - body: JSON.stringify(body) - }) - .then(response => { - if (response.ok) { return response.json(); } - throw { msg: 'Error while sending AccompanyingPeriod Course resource.', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; - -/* -* Endpoint to Add/remove SocialIssue -*/ -const postSocialIssue = (id, body, method) => { - //console.log('api body and method', body, method); - const url = `/api/1.0/person/accompanying-course/${id}/socialissue.json`; - return fetch(url, { - method: method, - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - body: JSON.stringify(body) - }) - .then(response => { - if (response.ok) { return response.json(); } - throw { msg: 'Error while updating SocialIssue.', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; - -const getUsers = () => { - const url = `/api/1.0/main/user.json`; - - return fetchResults(url); -}; - const whoami = () => { const url = `/api/1.0/main/whoami.json`; return fetch(url) @@ -184,74 +48,10 @@ const whoami = () => { }); }; -const getListOrigins = () => { - const url = `/api/1.0/person/accompanying-period/origin.json`; - return fetch(url) - .then(response => { - if (response.ok) { return response.json(); } - throw { msg: 'Error while retriving origin\'s list.', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; - -const addScope = (id, scope) => { - const url = `/api/1.0/person/accompanying-course/${id}/scope.json`; - console.log(url); - console.log(scope); - - return fetch(url, { - method: 'POST', - body: JSON.stringify({ - id: scope.id, - type: scope.type, - }), - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - }) - .then(response => { - if (response.ok) { return response.json(); } - throw { msg: 'Error while adding scope', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; - -const removeScope = (id, scope) => { - const url = `/api/1.0/person/accompanying-course/${id}/scope.json`; - - return fetch(url, { - method: 'DELETE', - body: JSON.stringify({ - id: scope.id, - type: scope.type, - }), - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - }) - .then(response => { - if (response.ok) { return response.json(); } - throw { msg: 'Error while adding scope', sta: response.status, txt: response.statusText, err: new Error(), body: response.body }; - }); -}; - -const getReferrersSuggested = (course) => { - const url = `/api/1.0/person/accompanying-course/${course.id}/referrers-suggested.json`; - - return fetchResults(url); -} - export { - getAccompanyingCourse, - patchAccompanyingCourse, - confirmAccompanyingCourse, - getSocialIssues, - postParticipation, - postRequestor, - postResource, - getUsers, whoami, - getListOrigins, - postSocialIssue, - addScope, - removeScope, + getSocialIssues, + getAccompanyingCourse, + getUsers, getReferrersSuggested, }; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner/ToggleFlags.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner/ToggleFlags.vue index fca3cee20..459e5e758 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner/ToggleFlags.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Banner/ToggleFlags.vue @@ -53,13 +53,34 @@ export default { //temporaire (modif backend) value = "occasional"; } - this.$store.dispatch('toggleIntensity', value); + this.$store.dispatch('toggleIntensity', value) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); }, toggleEmergency() { - this.$store.dispatch('toggleEmergency', (!this.isEmergency)); + this.$store.dispatch('toggleEmergency', (!this.isEmergency)) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); }, toggleConfidential() { - this.$store.dispatch('toggleConfidential', (!this.isConfidential)); + this.$store.dispatch('toggleConfidential', (!this.isConfidential)) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); } } } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue index b9e52f300..344119c44 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue @@ -59,7 +59,15 @@ export default { locationStatusTo: 'person', personId: this.person.id }; - this.$store.dispatch('updateLocation', payload); + this.$store.dispatch('updateLocation', payload) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); + window.location.assign('#section-20'); this.modal.showModal = false; } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Comment.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Comment.vue index 1bff3f44d..7f5b04f99 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Comment.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Comment.vue @@ -83,12 +83,24 @@ export default { }, methods: { submitform() { - //console.log('submit'); - this.$store.dispatch('postFirstComment', this.formdata); + this.$store.dispatch('postFirstComment', this.formdata) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); }, removeComment() { - //console.log('remove'); - this.$store.dispatch('postFirstComment', {}); + this.$store.dispatch('postFirstComment', {}) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); } } } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Confirm.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Confirm.vue index 4142b4f50..d3e0ae4d7 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Confirm.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Confirm.vue @@ -115,9 +115,14 @@ export default { }, methods: { confirmCourse() { - //console.log('@@ CLICK confirmCourse'); - this.$store.dispatch('confirmAccompanyingCourse'); - //console.log('confirm last'); + this.$store.dispatch('confirmAccompanyingCourse') + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); } } } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/CourseLocation.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/CourseLocation.vue index 79e983301..ae85af6a9 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/CourseLocation.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/CourseLocation.vue @@ -187,7 +187,14 @@ export default { locationStatusTo: 'none' }; //console.log('remove address'); - this.$store.dispatch('updateLocation', payload); + this.$store.dispatch('updateLocation', payload) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); }, displayErrors() { return this.$refs.addAddress.errorMsg; @@ -195,7 +202,15 @@ export default { submitTemporaryAddress(payload) { //console.log('@@@ click on Submit Temporary Address Button', payload); payload['locationStatusTo'] = 'address'; // <== temporary, not none, not person - this.$store.dispatch('updateLocation', payload); + this.$store.dispatch('updateLocation', payload) + .catch(({name, violations}) => { + if (name === 'ValidationException' || name === 'AccessException') { + violations.forEach((violation) => this.$toast.open({message: violation})); + } else { + this.$toast.open({message: 'An error occurred'}) + } + }); + this.$store.commit('setEditContextTrue', payload); } }, diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/OriginDemand.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/OriginDemand.vue index b88bf0747..ee5ad469a 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/OriginDemand.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/OriginDemand.vue @@ -29,7 +29,7 @@ diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/SocialIssue.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/SocialIssue.vue index 41fd85f0e..5046e641d 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/SocialIssue.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/SocialIssue.vue @@ -30,7 +30,7 @@