Skip to content
Snippets Groups Projects
feature.js 10.3 KiB
Newer Older
import router from '../../router'
leandro's avatar
leandro committed
axios.defaults.headers.common['X-CSRFToken'] = (name => {
  var re = new RegExp(name + "=([^;]+)");
  var value = re.exec(document.cookie);
Timothee P's avatar
Timothee P committed
  return (value !== null) ? unescape(value[1]) : null;
leandro's avatar
leandro committed
})('csrftoken');


const feature = {
  namespaced: true,
  state: {
    attachmentFormset: [],
    attachmentsToDelete: [],
    attachmentsToPut: [],
    extra_form: [],
    linked_features: [],
  },
  mutations: {
    SET_FEATURES(state, features) {
      state.features = features;
    },
    UPDATE_FORM(state, payload) {
      state.form = payload;
    },
    UPDATE_EXTRA_FORM(state, extra_form) {
      const index = state.extra_form.findIndex(el => el.label === extra_form.label);
      if (index !== -1) {
        state.extra_form[index] = extra_form;
      }
    },
    SET_EXTRA_FORM(state, extra_form) {
      state.extra_form = extra_form;
    },
    ADD_ATTACHMENT_FORM(state, attachmentFormset) {
      state.attachmentFormset = [...state.attachmentFormset, attachmentFormset];
    },
    UPDATE_ATTACHMENT_FORM(state, payload) {
      const index = state.attachmentFormset.findIndex((el) => el.dataKey === payload.dataKey);
      if (index !== -1) state.attachmentFormset[index] = payload
    },
    REMOVE_ATTACHMENT_FORM(state, payload) {
      state.attachmentFormset = state.attachmentFormset.filter(form => form.dataKey !== payload);
    },
    CLEAR_ATTACHMENT_FORM(state) {
      state.attachmentFormset = [];
    },
    ADD_LINKED_FORM(state, linkedFormset) {
      state.linkedFormset = [...state.linkedFormset, linkedFormset];
    },
    UPDATE_LINKED_FORM(state, payload) {
      const index = state.linkedFormset.findIndex((el) => el.dataKey === payload.dataKey);
      if (index !== -1) state.linkedFormset[index] = payload
    },
    REMOVE_LINKED_FORM(state, payload) {
      state.linkedFormset = state.linkedFormset.filter(form => form.dataKey !== payload);
    },
    SET_LINKED_FEATURES(state, payload) {
      state.linked_features = payload;
    },
    PUT_ATTACHMENTS(state, attachement) {
      state.attachmentsToPut = state.attachmentsToPut.filter(el => el.id !== attachement.id);
      state.attachmentsToPut.push(attachement);
    },
    DELETE_ATTACHMENTS(state, attachementId) {
      // state.attachmentFormset = state.attachmentFormset.filter(el => el.id !== attachementId);
      state.attachmentsToDelete.push(attachementId);
    },
    REMOVE_ATTACHMENTS_ID_TO_PUT(state, attachement) {
      state.attachmentsToPut = state.attachmentsToPut.filter(el => el.id !== attachement.id);
    },
    REMOVE_ATTACHMENTS_ID_TO_DELETE(state, attachementId) {
      state.attachmentsToDelete = state.attachmentsToDelete.filter(el => el !== attachementId);
    },
Timothee P's avatar
Timothee P committed
    GET_PROJECT_FEATURES({ commit, rootState }, project_slug) {
      return axios
Timothee P's avatar
Timothee P committed
        .get(`${rootState.configuration.VUE_APP_DJANGO_API_BASE}projects/${project_slug}/feature/`)
Timothee P's avatar
Timothee P committed
          if (response.status === 200 && response.data) {
            const features = response.data.features;
            commit("SET_FEATURES", features);
            //dispatch("map/ADD_FEATURES", null, { root: true }); //todo: should check if map was initiated
          }
    SEND_FEATURE({ state, rootState, dispatch }, routeName) {
      const message = routeName === "editer-signalement" ? "Le signalement a été mis à jour" : "Le signalement a été crée";
      function redirect(featureId) {
        router.push({
          name: "details-signalement",
          params: {
            slug_type_signal: rootState.feature_type.current_feature_type_slug,
            slug_signal: featureId,
            message,
          },
        });
      }
      async function handleOtherForms(featureId) {
        await dispatch("SEND_ATTACHMENTS", featureId)
        await dispatch("PUT_LINKED_FEATURES", featureId)
        redirect(featureId);
      }

      let extraFormObject = {}; //* prepare an object to be flatten in properties of geojson
      for (const field of state.extra_form) {
        extraFormObject[field.name] = field.value;
      const geojson = {
        "id": state.form.feature_id,
        "type": "Feature",
        "geometry": state.form.geometry,
        "properties": {
          "title": state.form.title,
          "description": state.form.description.value,
          "status": state.form.status.value,
          "project": rootState.project_slug,
          "feature_type": rootState.feature_type.current_feature_type_slug,
      if (routeName === "editer-signalement") {
          .put(`${rootState.configuration.VUE_APP_DJANGO_API_BASE}features/${state.form.feature_id}/?` +
            `feature_type__slug=${rootState.feature_type.current_feature_type_slug}` + 
            `&project__slug=${rootState.project_slug}` 
          , geojson)
Timothee P's avatar
Timothee P committed
            if (response.status === 200 && response.data) {
              if (state.attachmentFormset.length > 0 || state.linkedFormset.length > 0) {
                handleOtherForms(response.data.id)
              } else {
                redirect(response.data.id)
              }
Timothee P's avatar
Timothee P committed
            }
      } else {
        axios
Timothee P's avatar
Timothee P committed
          .post(`${rootState.configuration.VUE_APP_DJANGO_API_BASE}features/`, geojson)
Timothee P's avatar
Timothee P committed
            if (response.status === 201 && response.data) {
              if (state.attachmentFormset.length > 0 || state.linkedFormset.length > 0) {
                handleOtherForms(response.data.id)
              } else {
                redirect(response.data.id)
              }
Timothee P's avatar
Timothee P committed
            }
    async SEND_ATTACHMENTS({ state, rootState, dispatch }, featureId) {
      const DJANGO_API_BASE = rootState.configuration.VUE_APP_DJANGO_API_BASE;

      function postAttachement(attachment) {
        if (!attachment.id) {
          let formdata = new FormData();
          formdata.append("file", attachment.fileToImport, attachment.fileToImport.name);
          const data = {
            title: attachment.title,
            info: attachment.info,
          }
          formdata.append("data", JSON.stringify(data));
          axios
            .post(`${DJANGO_API_BASE}features/${featureId}/attachments/`, formdata)
            .then((response) => response)
            .catch((error) => {
              console.error(error);
              return error
Timothee P's avatar
Timothee P committed
        }

      function putAttachement(attachment, featureId) {
        let formdataToUpdate = new FormData();
        if (attachment.fileToImport)
          formdataToUpdate.append("file", attachment.fileToImport, attachment.fileToImport.name);
        const data = {}
        if (attachment.title)
          data['title'] = attachment.title
        if (attachment.title)
          data['info'] = attachment.info
        formdataToUpdate.append("data", JSON.stringify(data));
        let payload ={
          'attachmentsId': attachment.id,
          'featureId': featureId,
          'formdataToUpdate': formdataToUpdate
        }
        return dispatch("PUT_ATTACHMENTS", payload)
          .then((response) => response);
      }

      function deleteAttachement(attachmentsId, featureId) {
        let payload ={
          'attachmentsId': attachmentsId,
          'featureId': featureId
        }
        return dispatch("DELETE_ATTACHMENTS", payload)
          .then((response) => response);
      }
      const promisesResult = await Promise.all([
        ...state.attachmentFormset.map((attachment) => postAttachement(attachment)),
        ...state.attachmentsToPut.map((attachments) => putAttachement(attachments, featureId)),
        ...state.attachmentsToDelete.map((attachmentsId) => deleteAttachement(attachmentsId, featureId))
        ]
      );
      state.attachmentsToDelete = []
      state.attachmentsToPut = []
      return promisesResult
    },

    PUT_ATTACHMENTS({ commit }, payload) {
      let url = `${this.state.configuration.VUE_APP_DJANGO_API_BASE}features/${payload.featureId}/attachments/${payload.attachmentsId}/`
      return axios
        .put(url, payload.formdataToUpdate)
        .then((response) => {
          if (response && response.status === 204) {
            commit("REMOVE_ATTACHMENTS_ID_TO_PUT", payload.attachmentsId)
            return response
          }
        })
        .catch((error) => {
          console.error(error);
          return error
        });
    },

    DELETE_ATTACHMENTS({ commit }, payload) {
      let url = `${this.state.configuration.VUE_APP_DJANGO_API_BASE}features/${payload.featureId}/attachments/${payload.attachmentsId}/`
      return axios
        .delete(url)
        .then((response) => {
          if (response && response.status === 204) {
            commit("REMOVE_ATTACHMENTS_ID_TO_DELETE", payload.attachmentsId)
            return response
          }
        })
        .catch((error) => {
          console.error(error);
          return error
        });
    PUT_LINKED_FEATURES({ state, rootState }, featureId) {
      return axios
        .put(`${rootState.configuration.VUE_APP_DJANGO_API_BASE}features/${featureId}/feature-links/`, state.linkedFormset)
        .then((response) => {
          if (response.status === 200 && response.data) {
            console.log(response, response.data)
            return "La relation a bien été ajouté"
          }
        })
        .catch((error) => {
          throw error;
        });
    },

Timothee P's avatar
Timothee P committed
    DELETE_FEATURE({ state, rootState }, feature_id) {
leandro's avatar
leandro committed
      console.log("Deleting feature:", feature_id, state)
leandro's avatar
leandro committed
      const url = `${rootState.configuration.VUE_APP_DJANGO_API_BASE}features/${feature_id}/?` +
      `feature_type__slug=${rootState.feature_type.current_feature_type_slug}` + 
      `&project__slug=${rootState.project_slug}`;
      return axios
        .delete(url)
        .then((response) => response)
        .catch(() => {
          return false;
        });
leandro's avatar
leandro committed
    },
export default feature