diff --git a/canapGEST/Site/src/components/application/mailDialog.vue b/canapGEST/Site/src/components/application/mailDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..8e94870e589f2d2267d783514183a8c7972c5203 --- /dev/null +++ b/canapGEST/Site/src/components/application/mailDialog.vue @@ -0,0 +1,69 @@ +<template> + <v-dialog v-model="is_open" persistent max-width="600px" id="mail-dialog"> + <v-card> + <v-card-title> + <span class="headline">Contact</span> + </v-card-title> + <v-card-text> + <v-container grid-list-md> + <v-flex xs12> + <v-text-field label="Destinataires" readonly></v-text-field> + </v-flex> + <v-flex xs12> + <v-text-field label="Copie"></v-text-field> + </v-flex> + <v-flex xs12> + <v-textarea label="Contenu" required></v-textarea> + </v-flex> + <v-layout wrap> + <v-flex xs12 sm6> + <v-select + :items="['Refus', 'Dossier incomplet']" + label="Type de réponse" + required + ></v-select> + </v-flex> + </v-layout> + </v-container> + </v-card-text> + <v-card-actions> + <v-spacer></v-spacer> + <v-btn color="red" flat @click="is_open = false">Annuler</v-btn> + <v-btn color="green" flat @click="is_open = false">Envoyer</v-btn> + </v-card-actions> + {{to}} + </v-card> + </v-dialog> +</template> + +<script> +export default { + name: 'mail-dialog', + props: { + opened: Boolean, + to: Array + }, + watch: { + opened () { + this.is_open = this.opened + if (!this.is_open) { + this.$emit('closed') + } + } + }, + created () { + // Get emails + console.log(this.to) + // console.log(this.to.arr.find(o => o.applicant_mail)) + }, + data () { + return { + is_open: false, + mail: { + to: '', + content: '' + } + } + } +} +</script> diff --git a/canapGEST/Site/src/plugins/axios.js b/canapGEST/Site/src/plugins/axios.js index 1ad2a5a8bbc2135530cd115e2a291685dae43d19..85451d9d39afa7af84ccbbf8e06b7236df060497 100644 --- a/canapGEST/Site/src/plugins/axios.js +++ b/canapGEST/Site/src/plugins/axios.js @@ -14,9 +14,11 @@ instance.interceptors.response.use(function (response) { store.commit('moduleSnackbar/toggle', { open: true, message: 'API non atteignable', type: 'warning' }, { root: true }) } else if (error.response.status == 400 || error.response.status == 401) { // Erreur de token - // store.commit('moduleSnackbar/toggle', { open: true, message: error.response.data.error, type: 'warning' }, { root: true }) - // store.dispatch('moduleUser/logout', false) - console.log('token is dead') + if (error.response.data.type === 'expired') { + // Session expirée + // store.commit('moduleSnackbar/toggle', { open: true, message: error.response.data.error, type: 'warning' }, { root: true }) + store.dispatch('moduleUser/logout', false) + } } else if (error.response.status == 403 || error.response.status == 404) { router.push({ name: 'error', params: { status: error.response.data.error, message: error.response.data.message, route: '' } }) } else { diff --git a/canapGEST/Site/src/store/modules/applications/actions.js b/canapGEST/Site/src/store/modules/applications/actions.js index 14769aea72d4fd58450add7c5ac23cf78c26669b..ee8c797f2e51956a12da0ae58f5bc12cb03c19ca 100644 --- a/canapGEST/Site/src/store/modules/applications/actions.js +++ b/canapGEST/Site/src/store/modules/applications/actions.js @@ -1,6 +1,6 @@ import axios from '../../../plugins/axios' -export function getApplications(context) { +export function getApplications (context) { axios({ method: 'get', url: '/applicants' @@ -10,63 +10,54 @@ export function getApplications(context) { }) } -export function getCurrentApplicationData(context, data) { - return new Promise((resolve) => { - axios({ - method: 'get', - url: '/applicant/' + data.id - }) - .then(response => { - context.commit('setCurrentApplicationData', response.data) - resolve() - }) +export function getCurrentApplicationData (context, data) { + return axios({ + method: 'get', + url: '/applicant/' + data.id }) + .then(response => { + context.commit('setCurrentApplicationData', response.data) + }) } -export function getCurrentApplicationComments(context, data) { - return new Promise((resolve) => { - axios({ - method: 'get', - url: '/applicant/' + data.id + '/comments' - }) - .then(response => { - let results = { - public: [], - private: [] - } - response.data.public.forEach(comment => { - getOwnerData(comment.comment_owner_sciper).then(res => { - comment.ownerData = res - results.public.push(comment) - }) +export function getCurrentApplicationComments (context, data) { + return axios({ + method: 'get', + url: '/applicant/' + data.id + '/comments' + }) + .then(response => { + let results = { + public: [], + private: [] + } + response.data.public.forEach(comment => { + getOwnerData(comment.comment_owner_sciper).then(res => { + comment.ownerData = res + results.public.push(comment) }) + }) - response.data.private.forEach(comment => { - getOwnerData(comment.comment_owner_sciper).then(res => { - comment.ownerData = res - results.private.push(comment) - }) + response.data.private.forEach(comment => { + getOwnerData(comment.comment_owner_sciper).then(res => { + comment.ownerData = res + results.private.push(comment) }) - context.commit('setCurrentApplicationComments', results) - resolve() }) - }) + context.commit('setCurrentApplicationComments', results) + }) } -export function getCurrentApplicationMarker(context, data) { - return new Promise((resolve) => { - axios({ - method: 'get', - url: '/applicant/' + data.id + '/marker' - }) - .then(response => { - context.commit('setCurrentApplicationMarker', response.data.marker) - resolve() - }) +export function getCurrentApplicationMarker (context, data) { + return axios({ + method: 'get', + url: '/applicant/' + data.id + '/marker' }) + .then(response => { + context.commit('setCurrentApplicationMarker', response.data.marker) + }) } -export function getAvailableStatus(context) { +export function getAvailableStatus (context) { axios({ method: 'get', url: '/status' @@ -76,7 +67,7 @@ export function getAvailableStatus(context) { }) } -export function changeApplicationStatus(context, data) { +export function changeApplicationStatus (context, data) { axios({ method: 'patch', url: '/status/applicant/' + data.id, @@ -87,7 +78,7 @@ export function changeApplicationStatus(context, data) { }) } -export function deleteApplication(context, data) { +export function deleteApplication (context, data) { axios({ method: 'delete', url: '/applicant/' + data.id, @@ -98,7 +89,7 @@ export function deleteApplication(context, data) { }) } -export function getFile(context, data) { +export function getFile (context, data) { axios({ method: 'get', url: '/file/' + data.id, @@ -109,19 +100,17 @@ export function getFile(context, data) { }) } -function getOwnerData(sciper) { - return new Promise((resolve) => { - axios({ - method: 'get', - url: '/user/data/' + sciper - }) - .then(response => { - resolve(response.data) - }) +function getOwnerData (sciper) { + return axios({ + method: 'get', + url: '/user/data/' + sciper }) + .then(response => { + return response.data + }) } -export function exportData(context, data) { +export function exportData (context, data) { axios({ method: 'get', url: '/applicant/' + data.id + '/export', @@ -132,7 +121,7 @@ export function exportData(context, data) { }) } -function generateBlob(response, filename) { +function generateBlob (response, filename) { const url = window.URL.createObjectURL(new Blob([response.data])) const link = document.createElement('a') link.href = url @@ -141,7 +130,7 @@ function generateBlob(response, filename) { link.click() } -export function createMarker(context, data) { +export function createMarker (context, data) { axios({ method: 'put', url: '/marker', @@ -152,7 +141,7 @@ export function createMarker(context, data) { }) } -export function updateMarker(context, data) { +export function updateMarker (context, data) { axios({ method: 'patch', url: '/marker/' + data.id, @@ -163,57 +152,48 @@ export function updateMarker(context, data) { }) } -export function deleteMarker(context, data) { +export function deleteMarker (context, data) { axios({ method: 'delete', url: '/marker/' + data.id }) } -export function addComment(context, data) { - return new Promise((resolve) => { - axios({ - method: 'put', - url: '/comment', - data: { - applicant_id: data.applicant_id, - content: data.content, - is_private: data.is_private - } - }) - .then(response => { - context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) - resolve() - }) +export function addComment (context, data) { + return axios({ + method: 'put', + url: '/comment', + data: { + applicant_id: data.applicant_id, + content: data.content, + is_private: data.is_private + } }) + .then(response => { + context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) + }) } -export function deleteComment(context, data) { - return new Promise((resolve) => { - axios({ - method: 'delete', - url: '/comment/' + data.id - }) - .then(response => { - context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) - resolve() - }) +export function deleteComment (context, data) { + return axios({ + method: 'delete', + url: '/comment/' + data.id }) + .then(response => { + context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) + }) } -export function updateComment(context, data) { - return new Promise((resolve) => { - axios({ - method: 'patch', - url: '/comment/' + data.id, - data: { - content: data.content, - is_private: data.isPrivate - } - }) - .then(response => { - context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) - resolve() - }) +export function updateComment (context, data) { + return axios({ + method: 'patch', + url: '/comment/' + data.id, + data: { + content: data.content, + is_private: data.isPrivate + } }) + .then(response => { + context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) + }) } \ No newline at end of file diff --git a/canapGEST/Site/src/store/modules/applications/mutations.js b/canapGEST/Site/src/store/modules/applications/mutations.js index b8ce719ecafc9eb5c9767f1c15b3dc69dfb98759..1845e33513de0a5bf58906fe2cdbe7c56b85c797 100644 --- a/canapGEST/Site/src/store/modules/applications/mutations.js +++ b/canapGEST/Site/src/store/modules/applications/mutations.js @@ -28,4 +28,8 @@ export function setFilterStatus (state, data) { export function setFilterSearch (state, data) { state.filters.search = data +} + +export function setMailDialogOpened (state, data) { + state.mail_dialog_opened = data } \ No newline at end of file diff --git a/canapGEST/Site/src/store/modules/positions/actions.js b/canapGEST/Site/src/store/modules/positions/actions.js index 9858b794ac685c68741a891bfd18a70eda42aa77..9a5c5adf61693c63f1d0106fce7d4004a7d2d5f7 100644 --- a/canapGEST/Site/src/store/modules/positions/actions.js +++ b/canapGEST/Site/src/store/modules/positions/actions.js @@ -1,6 +1,6 @@ import axios from '../../../plugins/axios' -export function getPositions(context) { +export function getPositions (context) { axios({ method: 'get', url: '/positions' @@ -10,7 +10,7 @@ export function getPositions(context) { }) } -export function getJobs(context) { +export function getJobs (context) { axios({ method: 'get', url: '/jobs' @@ -20,7 +20,7 @@ export function getJobs(context) { }) } -export function getLocations(context) { +export function getLocations (context) { axios({ method: 'get', url: '/locations' @@ -30,7 +30,7 @@ export function getLocations(context) { }) } -export function getAccessGroups(context) { +export function getAccessGroups (context) { axios({ method: 'get', url: '/groups' @@ -40,7 +40,7 @@ export function getAccessGroups(context) { }) } -export function createPosition(context, data) { +export function createPosition (context, data) { data.new_groups = [] data.access_group_cleared = [] data.access_groups.forEach(group => { @@ -61,7 +61,7 @@ export function createPosition(context, data) { }) } -export function updatePosition(context, data) { +export function updatePosition (context, data) { data.new_groups = [] data.access_group_cleared = [] data.access_groups.forEach(group => { @@ -71,60 +71,44 @@ export function updatePosition(context, data) { data.access_group_cleared.push(group) } }) - return new Promise(resolve => { - axios({ - method: 'patch', - url: '/position/' + data.position_id, - data: data - }) - .then(response => { - context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) - resolve() - }) + return axios({ + method: 'patch', + url: '/position/' + data.position_id, + data: data }) + .then(response => { + context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) + }) } -export function deletePosition(context, data) { - return new Promise(resolve => { - axios({ - method: 'delete', - url: '/position/' + data.position_id - }) - .then(response => { - context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) - resolve() - }) +export function deletePosition (context, data) { + return axios({ + method: 'delete', + url: '/position/' + data.position_id }) + .then(response => { + context.commit('moduleSnackbar/toggle', { open: true, message: response.data.message, type: 'success' }, { root: true }) + }) } -export function createJob(context, data) { - return new Promise((resolve, reject) => { - axios({ - method: 'put', - url: '/job', - data: data - }) - .then(response => { - resolve(response.data) - }) - .catch(err => { - reject(err) - }) +export function createJob (context, data) { + return axios({ + method: 'put', + url: '/job', + data: data }) + .then(response => { + return response.data + }) } -export function createLocation(context, data) { - return new Promise((resolve, reject) => { - axios({ - method: 'put', - url: '/location', - data: data - }) - .then(response => { - resolve(response.data) - }) - .catch(err => { - reject(err) - }) +export function createLocation (context, data) { + return axios({ + method: 'put', + url: '/location', + data: data }) + .then(response => { + return response.data + }) } \ No newline at end of file diff --git a/canapGEST/Site/src/store/modules/user/actions.js b/canapGEST/Site/src/store/modules/user/actions.js index c4212cea0b98354027fd75a6dbb5801f742600e0..fecd82579cade1eed1e3cd543a5ea34cf76f3b55 100644 --- a/canapGEST/Site/src/store/modules/user/actions.js +++ b/canapGEST/Site/src/store/modules/user/actions.js @@ -1,6 +1,6 @@ import axios from '../../../plugins/axios' -export function login(context, key) { +export function login (context, key) { if (key) { axios.get("/auth/login?key=" + key).then(response => { localStorage.setItem('stored_token', response.data) @@ -12,34 +12,37 @@ export function login(context, key) { } } -export function logout(context, fullLogout) { - setLastConnection().then(() => { - localStorage.removeItem('stored_token') - if (fullLogout) { - window.location = 'https://tequila.epfl.ch/logout' - } else { - location.reload() - } - }) +export function logout (context, fullLogout) { + localStorage.removeItem('stored_token') + if (fullLogout) { + // set last conn ? + window.location = 'https://tequila.epfl.ch/logout' + } else { + location.reload() + } + // setLastConnection().then(() => { + // console.log('test') + // localStorage.removeItem('stored_token') + // if (fullLogout) { + // window.location = 'https://tequila.epfl.ch/logout' + // } else { + // location.reload() + // } + // }) } -export function getUserData(context) { - return new Promise((resolve, reject) => { - axios({ - method: 'get', - url: '/user' - }) - .then(response => { - context.commit('setUserData', response.data) - resolve(response.data) - }) - .catch(err => { - reject(err) - }) +export function getUserData (context) { + return axios({ + method: 'get', + url: '/user' }) + .then(response => { + context.commit('setUserData', response.data) + return response.data + }) } -export function getUserPermittedJobs(context) { +export function getUserPermittedJobs (context) { axios({ method: 'get', url: '/user/permittedjobs' @@ -49,7 +52,7 @@ export function getUserPermittedJobs(context) { }) } -export function getLastConnection(context) { +export function getLastConnection (context) { axios({ method: 'get', url: '/user/connection' @@ -59,12 +62,9 @@ export function getLastConnection(context) { }) } -export function setLastConnection() { - return new Promise((resolve) => { - axios({ - method: 'patch', - url: '/user/connection' - }) - .then(resolve()) +export function setLastConnection () { + return axios({ + method: 'patch', + url: '/user/connection' }) } \ No newline at end of file diff --git a/canapGEST/Site/src/views/ApplicationsView.vue b/canapGEST/Site/src/views/ApplicationsView.vue index 1cb5d7d7f7dde89d84131ecf85a0b39b58b488db..7d1121a297828f345c508a385448eb545106d3e8 100644 --- a/canapGEST/Site/src/views/ApplicationsView.vue +++ b/canapGEST/Site/src/views/ApplicationsView.vue @@ -15,6 +15,7 @@ ></v-select> <v-btn round color="primary" @click="updateMultiple">Appliquer</v-btn> <v-btn round color="primary" @click="deleteMultiple">Supprimer</v-btn> + <v-btn round color="primary" @click="toggleMailDialog()">Contacter</v-btn> </div> </v-card-title> <v-data-table @@ -103,21 +104,23 @@ @change="updateStatus(props.item.applicant_id, props.item.fk_status)" v-if="$store.getters['moduleUser/userIsResponsible']" ></v-select> - <span v-else>{{props.item.fk_status}}</span> + <span v-else>{{ props.item.fk_status }}</span> </td> </tr> </template> </v-data-table> </div> + <MailDialog :opened="mail_dialog_opened" :to="selected" @closed="toggleMailDialog()"></MailDialog> </div> </template> <script> import ApplicationsFilters from '@/components/applicationsFilters.vue' +import MailDialog from '@/components/application/mailDialog.vue' export default { name: 'applications-view', - data() { + data () { return { selected: [], multipleEditor: { @@ -139,37 +142,40 @@ export default { { text: 'Date postulation', value: 'applicant_application_date' }, { text: 'Statut', value: 'fk_status' } ], - pagination: { sortBy: 'applicant_application_date', descending: true, rowsPerPage: 25 } + pagination: { sortBy: 'applicant_application_date', descending: true, rowsPerPage: 25 }, + mail_dialog_opened: false } }, - created() { + created () { this.loadApplications() if (!this.$store.getters['moduleUser/userIsResponsible']) { - this.headers.splice(this.headers.length-1, 0, { text: 'Note', value: 'applicant_marker' }) + this.headers.splice(this.headers.length - 1, 0, { text: 'Note', value: 'applicant_marker' }) } }, computed: { - hasSelected() { return this.selected.length > 0 } + hasSelected () { return this.selected.length > 0 } }, methods: { - loadApplications() { + loadApplications () { this.$store.dispatch('moduleApplications/getApplications') this.$store.dispatch('moduleApplications/getAvailableStatus') this.$store.dispatch('moduleUser/getUserPermittedJobs') }, - navigateTo(id) { + navigateTo (id) { this.$router.push('/application/' + id) }, - updateStatus(id, status) { + updateStatus (id, status) { this.$store.dispatch('moduleApplications/changeApplicationStatus', { id: id, status: status }) }, - updateMultiple() { + updateMultiple () { this.selected.forEach(item => { this.updateStatus(item.applicant_id, this.multipleEditor.status) }) + setTimeout(() => { this.$store.dispatch('moduleApplications/getApplications') + }, 300) }, - deleteMultiple() { + deleteMultiple () { if (confirm('Voulez-vous vraiment supprimer les candidatures sélectionnées ? \n Cette action est irréversible.')) { this.selected.forEach(item => { this.$store.dispatch('moduleApplications/deleteApplication', { id: item.applicant_id }) @@ -177,14 +183,17 @@ export default { this.$store.dispatch('moduleApplications/getApplications') } }, - isNew(status, date) { + toggleMailDialog () { + this.mail_dialog_opened = !this.mail_dialog_opened + }, + isNew (status, date) { if (this.$store.getters['moduleUser/userIsResponsible']) { return status === 'Nouveau' } else { return date > this.$store.state.moduleUser.lastConnection.last_connection_date } }, - getFormatedDate(value) { + getFormatedDate (value) { let dateTimeParts = value.split(/[- :]/) dateTimeParts[1]-- let date = new Date(...dateTimeParts) @@ -192,7 +201,8 @@ export default { } }, components: { - ApplicationsFilters + ApplicationsFilters, + MailDialog } } </script> diff --git a/canapGEST/Site/src/views/OpenJobsView.vue b/canapGEST/Site/src/views/OpenJobsView.vue index c6cb3f402ad2668653d8d59f99deac60cb700fa4..60b13eed785efa9bee9cf2f7e9bece210675385e 100644 --- a/canapGEST/Site/src/views/OpenJobsView.vue +++ b/canapGEST/Site/src/views/OpenJobsView.vue @@ -5,7 +5,7 @@ <div> <v-toolbar flat color="white"> <v-spacer></v-spacer> - <v-dialog v-model="dialog" min-height="1700px" max-width="700px"> + <v-dialog v-model="dialog" persistent min-height="1700px" max-width="700px"> <template v-slot:activator="{ on }"> <v-btn color="primary" dark class="mb-2" v-on="on">Ajouter</v-btn> </template>