Skip to content
Snippets Groups Projects
Commit 7a84b759 authored by Timothee P's avatar Timothee P :sunflower:
Browse files

Merge branch 'develop' into redmine-issues/12567

parents 54c031db 1a85f3e4
No related branches found
No related tags found
No related merge requests found
......@@ -9,6 +9,9 @@
"VUE_APP_LOGO_PATH":"/geocontrib/img/logo-neogeo-circle.png",
"VUE_APP_DJANGO_BASE":"http://localhost:8010",
"VUE_APP_DJANGO_API_BASE":"http://localhost:8010/api/",
"VUE_APP_RELOAD_INTERVAL": 15000,
"VUE_APP_DISABLE_LOGIN_BUTTON":false,
"VUE_APP_LOGIN_URL":"",
"DEFAULT_BASE_MAP":{
"SERVICE": "https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png",
"OPTIONS": {
......
......@@ -88,24 +88,30 @@
{{ userFullname || user.username || "Utilisateur inconnu" }}
</router-link>
<div
v-if="user && user.is_administrator"
v-if="USER_LEVEL_PROJECTS && project"
class="item ui label vertical no-hover"
>
<span v-if="USER_LEVEL_PROJECTS && project">
{{ USER_LEVEL_PROJECTS[project.slug] }}</span
>
{{ USER_LEVEL_PROJECTS[project.slug] }}
<br />
<span v-if="user.is_administrator">
Gestionnaire métier
</span>
</div>
<!-- // todo : find out SSO_SETTED in django -->
<a v-if="user && !SSO_SETTED" @click="logout" class="item"
><i class="ui logout icon"></i>
</a>
<router-link v-else-if="!user" to="/connexion/" class="item"
>Se Connecter</router-link
<div
v-if="user && user.is_administrator"
class="item ui label vertical no-hover"
>
Gestionnaire métier
</div>
<div v-frag v-if="!DISABLE_LOGIN_BUTTON">
<a v-if="user" @click="logout" class="item"
><i class="ui logout icon"></i>
</a>
<router-link
v-else-if="!user && !SSO_LOGIN_URL"
to="/connexion/"
class="item"
>Se connecter</router-link
>
<a v-else class="item" :href="SSO_LOGIN_URL">Se connecter</a>
</div>
</div>
</div>
</div>
......@@ -115,22 +121,30 @@
{{ userFullname || user.username || "Utilisateur inconnu" }}
</router-link>
<div
v-if="user || user.is_administrator"
v-if="USER_LEVEL_PROJECTS && project"
class="item ui label vertical no-hover"
>
<span v-if="USER_LEVEL_PROJECTS && project">
{{ USER_LEVEL_PROJECTS[project.slug] }}</span
>
{{ USER_LEVEL_PROJECTS[project.slug] }}
<br />
<span v-if="user.is_administrator"> Gestionnaire métier </span>
</div>
<!-- // todo : find out SSO_SETTED in django -->
<a v-if="user && !SSO_SETTED" @click="logout" class="item"
><i class="ui logout icon"></i>
</a>
<router-link v-else-if="!user" to="/connexion/" class="item"
>Se Connecter</router-link
<div
v-if="user && user.is_administrator"
class="item ui label vertical no-hover"
>
Gestionnaire métier
</div>
<div v-frag v-if="!DISABLE_LOGIN_BUTTON">
<a v-if="user" @click="logout" class="item"
><i class="ui logout icon"></i>
</a>
<router-link
v-else-if="!user && !SSO_LOGIN_URL"
to="/connexion/"
class="item"
>Se Connecter</router-link
>
<a v-else class="item" :href="SSO_LOGIN_URL">Se connecter</a>
</div>
</div>
</div>
</div>
......@@ -200,7 +214,6 @@ export default {
...mapState([
"projects",
"user",
"SSO_SETTED",
"USER_LEVEL_PROJECTS",
"configuration",
"messages",
......@@ -210,6 +223,12 @@ export default {
APPLICATION_NAME() {
return this.configuration.VUE_APP_APPLICATION_NAME;
},
DISABLE_LOGIN_BUTTON() {
return this.configuration.VUE_APP_DISABLE_LOGIN_BUTTON;
},
SSO_LOGIN_URL() {
return this.configuration.VUE_APP_LOGIN_URL;
},
PACKAGE_VERSION: () => process.env.PACKAGE_VERSION || "0",
logo() {
return this.configuration.VUE_APP_LOGO_PATH;
......@@ -306,8 +325,6 @@ footer {
}
.menu.container {
width: auto !important;
margin-left: 1em !important;
margin-right: 1em !important;
}
.push-right-desktop {
margin-left: auto;
......
......@@ -99,9 +99,9 @@ export default {
methods: {
fetchImports() {
this.$store.dispatch(
"feature_type/GET_IMPORTS",
this.$route.params.feature_type_slug
);
"feature_type/GET_IMPORTS", {
feature_type: this.$route.params.feature_type_slug
});
this.$store.dispatch('feature/GET_PROJECT_FEATURES', {
project_slug: this.$route.params.slug
})
......
......@@ -14,8 +14,8 @@ const featureAPI = {
) {
const bbox = response.data;
return [
[bbox[2], bbox[3]],
[bbox[0], bbox[1]],
[bbox.minLat, bbox.minLon],
[bbox.maxLat, bbox.maxLon],
];
} else {
return null;
......
......@@ -6,28 +6,22 @@ import feature_type from "./modules/feature_type"
import feature from "./modules/feature"
import map from "./modules/map"
// axios.defaults.headers.common['X-CSRFToken'] = (name => {
// var re = new RegExp(name + "=([^;]+)");
// var value = re.exec(document.cookie);
// return (value !== null) ? unescape(value[1]) : null;
// })('csrftoken');
Vue.use(Vuex);
// axios.defaults.withCredentials = true; // * add cookies to axios
// function updateAxiosHeader() {
// axios.defaults.headers.common['X-CSRFToken'] = (name => {
// var re = new RegExp(name + "=([^;]+)");
// var value = re.exec(document.cookie);
// return (value !== null) ? unescape(value[1]) : null;
// })('csrftoken');
// }
// // ! À vérifier s'il y a un changement de token pendant l'éxécution de l'appli
// updateAxiosHeader();
const noPermissions = { "can_view_project": true, "can_create_project": false, "can_update_project": false, "can_view_feature": true, "can_view_archived_feature": true, "can_create_feature": false, "can_update_feature": false, "can_delete_feature": false, "can_publish_feature": false, "can_create_feature_type": false, "can_view_feature_type": true, "is_project_administrator": false }
const noPermissions = {
can_view_project: true,
can_create_project: false,
can_update_project: false,
can_view_feature: true,
can_view_archived_feature: true,
can_create_feature: false,
can_update_feature: false,
can_delete_feature: false,
can_publish_feature: false,
can_create_feature_type: false,
can_view_feature_type: true,
is_project_administrator: false
};
export default new Vuex.Store({
modules: {
......@@ -43,7 +37,6 @@ export default new Vuex.Store({
projects: [],
last_comments: [],
staticPages: null,
SSO_SETTED: false,
USER_LEVEL_PROJECTS: null,
user_permissions: null,
levelsPermissions: [],
......@@ -53,7 +46,8 @@ export default new Vuex.Store({
isLoading: false,
message: "En cours de chargement"
},
cancellableSearchRequest: []
cancellableSearchRequest: [],
reloadIntervalId: null
},
mutations: {
......@@ -81,9 +75,6 @@ export default new Vuex.Store({
SET_STATIC_PAGES(state, staticPages) {
state.staticPages = staticPages;
},
SET_SSO(state, SSO_SETTED) {
state.SSO_SETTED = SSO_SETTED;
},
SET_USER_LEVEL_PROJECTS(state, USER_LEVEL_PROJECTS) {
state.USER_LEVEL_PROJECTS = USER_LEVEL_PROJECTS;
},
......@@ -121,13 +112,21 @@ export default new Vuex.Store({
message: "En cours de chargement"
};
},
SET_CANCELLABLE_SEARCH_REQUEST(state, payload) {
state.cancellableSearchRequest.push(payload);
},
RESET_CANCELLABLE_SEARCH_REQUEST(state) {
state.cancellableSearchRequest = [];
},
SET_RELOAD_INTERVAL_ID(state, payload) {
state.reloadIntervalId = payload;
},
CLEAR_RELOAD_INTERVAL_ID(state) {
clearInterval(state.reloadIntervalId);
state.reloadIntervalId = null;
}
},
getters: {
......@@ -202,11 +201,13 @@ export default new Vuex.Store({
if (response && response.status === 200) {
const user = response.data.user;
commit("SET_USER", user);
//window.localStorage.setItem("user", JSON.stringify(user)); // ? nécessaire ?
}
})
.catch(() => {
router.push({ name: "login" });
//* if an url to redirect to an external authentification system is present, do not redirect to the login page
if (!state.configuration.VUE_APP_LOGIN_URL) {
router.push({ name: "login" });
}
});
}
},
......@@ -229,7 +230,6 @@ export default new Vuex.Store({
},
LOGOUT({ commit, dispatch }) {
// const pageNoRedirect = ["liste-signalements", "details-type-signalement", "details-signalement", "project_detail", "mentions", "aide", "index"]
axios
.get(`${this.state.configuration.VUE_APP_DJANGO_API_BASE}logout/`)
.then((response) => {
......@@ -237,7 +237,6 @@ export default new Vuex.Store({
commit("SET_USER", false);
commit("SET_USER_LEVEL_PROJECTS", null);
dispatch("GET_USER_LEVEL_PERMISSIONS");
// if (!pageNoRedirect.includes(router.history.current.name)) router.push("/");
if (router.history.current.name !== "index") router.push("/");
}
})
......
......@@ -42,7 +42,9 @@ const feature = {
},
mutations: {
SET_FEATURES(state, features) {
state.features = features;
state.features = features.sort((a, b) => {
return new Date(b.created_on) - new Date(a.created_on); // sort features chronologically
});
},
SET_FEATURES_COUNT(state, features_count) {
state.features_count = features_count;
......@@ -110,7 +112,7 @@ const feature = {
getters: {
},
actions: {
GET_PROJECT_FEATURES({ commit, rootState }, { project_slug, feature_type__slug, search, limit }) {
GET_PROJECT_FEATURES({ commit, rootState }, { project_slug, feature_type__slug, ordering, search, limit }) {
if (rootState.cancellableSearchRequest.length > 0) {
const currentRequestCancelToken =
rootState.cancellableSearchRequest[rootState.cancellableSearchRequest.length - 1];
......@@ -125,6 +127,9 @@ const feature = {
if (feature_type__slug) {
url = url.concat('', `${url.includes('?') ? '&' : '?'}feature_type__slug=${feature_type__slug}`);
}
if (ordering) {
url = url.concat('', `${url.includes('?') ? '&' : '?'}ordering=${ordering}`);
}
if (search) {
url = url.concat('', `${url.includes('?') ? '&' : '?'}title__contains=${search}`);
}
......
......@@ -160,7 +160,6 @@ const feature_type = {
},
SEND_FEATURES_FROM_GEOJSON({ state, dispatch }, payload) {
console.log(payload);
const { feature_type_slug } = payload;
if (state.fileToImport.size > 0) {
......@@ -178,7 +177,9 @@ const feature_type = {
})
.then((response) => {
if (response && response.status === 200) {
dispatch("GET_IMPORTS", feature_type_slug);
dispatch("GET_IMPORTS", {
feature_type: feature_type_slug
});
}
return response
})
......@@ -188,11 +189,14 @@ const feature_type = {
}
},
GET_IMPORTS({ commit }, feature_type) {
let url =
this.state.configuration.VUE_APP_DJANGO_API_BASE +
"import-tasks?feature_type_slug=" +
feature_type;
GET_IMPORTS({ commit }, { project_slug, feature_type }) {
let url = `${this.state.configuration.VUE_APP_DJANGO_API_BASE}import-tasks`;
if (project_slug) {
url = url.concat('', `${url.includes('?') ? '&' : '?'}project_slug=${project_slug}`);
}
if (feature_type) {
url = url.concat('', `${url.includes('?') ? '&' : '?'}feature_type_slug=${feature_type}`);
}
axios
.get(url)
.then((response) => {
......
......@@ -111,7 +111,7 @@
{{ feature.updated_on | formatDate }}
</td>
</tr>
<tr>
<!-- <tr>
<td>Date d'archivage automatique</td>
<td v-if="feature.archived_on">
{{ feature.archived_on }}
......@@ -122,7 +122,7 @@
<td v-if="feature.deletion_on">
{{ feature.deletion_on }}
</td>
</tr>
</tr> -->
</tbody>
</table>
......@@ -297,6 +297,7 @@
</li>
</ul>
<button
v-if="isOffline() !== true"
@click="postComment"
type="button"
class="ui compact green icon button"
......@@ -452,6 +453,9 @@ export default {
},
methods: {
isOffline() {
return navigator.onLine == false;
},
pushNgo(link) {
this.$router.push({
name: "details-signalement",
......@@ -626,15 +630,13 @@ export default {
addFeatureToMap() {
const url = `${this.$store.state.configuration.VUE_APP_DJANGO_API_BASE}projects/${this.$route.params.slug}/feature/` +
`?feature_type__slug=${this.$store.state.feature_type.feature_types[0].slug}&output=geojson`;
`?feature_id=${this.$route.params.slug_signal}&output=geojson`;
axios
.get(url)
.then((response) => {
const feature = response.data.features[0];
if (feature) {
const currentFeature = [feature];
if (response.data.features.length > 0) {
const featureGroup = mapUtil.addFeatures(
currentFeature,
response.data.features,
{},
true,
this.$store.state.feature_type.feature_types
......
......@@ -253,28 +253,36 @@ export default {
...mapState("feature", ["features", "features_count"]),
...mapState("feature_type", ["feature_types", "importFeatureTypeData"]),
structure: function () {
if (this.feature_types) {
return this.feature_types.find(
if (Object.keys(this.feature_types).length) {
let st = this.feature_types.find(
(el) => el.slug === this.$route.params.feature_type_slug
);
if (st)
return st
}
return null;
return {};
},
feature_type_features: function () {
return this.features.filter(
(el) => el.feature_type.slug === this.$route.params.feature_type_slug
);
if(this.features.length)
return this.features.filter(
(el) => el.feature_type.slug === this.$route.params.feature_type_slug
);
return {}
},
lastFeatures: function () {
return this.feature_type_features.slice(0, 5);
if (this.feature_type_features.length)
return this.feature_type_features.slice(0, 5);
return []
},
orderedCustomFields() {
return [...this.structure.customfield_set].sort(
(a, b) => a.position - b.position
);
if (Object.keys(this.structure).length)
return [...this.structure.customfield_set].sort(
(a, b) => a.position - b.position
);
return {}
},
},
......@@ -282,7 +290,9 @@ export default {
toggleShowImport() {
this.showImport = !this.showImport;
if (this.showImport) {
this.$store.dispatch("feature_type/GET_IMPORTS", this.structure.slug);
this.$store.dispatch("feature_type/GET_IMPORTS", {
feature_type: this.structure.slug
});
}
},
......@@ -381,28 +391,29 @@ export default {
const response = await
this.$store.dispatch('feature/GET_PROJECT_FEATURES', {
project_slug: this.$route.params.slug,
feature_type__slug : this.structure.slug,
ordering: '-created_on',
limit: '5'
})
console.log(response)
if (response){
this.featuresLoading = false;
}
}
},
// watch:{
// 'feature_type_features'(newValue){
// console.log(newValue)
// if (newValue){
// this.featuresLoading = false;
// }
// }
// },
watch:{
'structure'(newValue){
if (newValue.slug){
this.$store.dispatch("feature_type/GET_IMPORTS", {
feature_type: this.structure.slug
});
}
}
},
created() {
if (!this.project) {
this.$store.dispatch("GET_PROJECT_INFO", this.$route.params.slug);
}
this.$store.dispatch("feature_type/GET_IMPORTS", this.structure.slug);
this.setCurrentFeatureTypeSlug();
// .then(res => resolve(res))
// .catch(err => reject(err));
......
......@@ -53,7 +53,7 @@
<div class="content">
{{ project.title }}
<div v-if="arraysOffline.length > 0">
{{ arraysOffline.length }} modifications en attente
{{ arraysOffline.length }} modification<span v-if="arraysOffline.length>1">s</span> en attente
<button
:disabled="isOffline()"
@click="sendOfflineFeatures()"
......@@ -154,7 +154,7 @@
{{ type.title }}
</router-link>
<!-- {% if project and feature_types and
permissions|lookup:'can_create_feature' %} -->
permissions|lookup:'can_create_feature' %} -->
<!-- // ? should we get type.is_editable ? -->
<!-- v-if="
project &&
......@@ -162,110 +162,128 @@
type.is_editable
" -->
<div class="middle aligned content">
<router-link
v-if="
project && permissions && permissions.can_create_feature
"
:to="{
name: 'ajouter-signalement',
params: { slug_type_signal: type.slug },
}"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Ajouter un signalement"
data-position="left center"
data-variation="mini"
>
<i class="ui plus icon"></i>
</router-link>
<router-link
:to="{
name: 'dupliquer-type-signalement',
params: { slug_type_signal: type.slug },
}"
v-if="
project &&
permissions &&
permissions.can_create_feature_type &&
isOffline() !== true
"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Dupliquer un type de signalement"
data-position="left center"
data-variation="mini"
>
<i class="inverted grey copy alternate icon"></i>
</router-link>
<router-link
:to="{
name: 'editer-type-signalement',
params: { slug_type_signal: type.slug },
}"
v-if="
project &&
type.is_editable &&
permissions &&
permissions.can_create_feature_type &&
isOffline() !== true
"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Éditer le type de signalement"
data-position="left center"
data-variation="mini"
>
<i class="inverted grey pencil alternate icon"></i>
</router-link>
<router-link
:to="{
name: 'editer-symbologie-signalement',
params: { slug_type_signal: type.slug },
}"
v-if="
project &&
type.is_editable &&
type.geom_type === 'point' &&
permissions &&
permissions.can_create_feature_type &&
isOffline() != true
"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Éditer la symbologie du type de signalement"
data-position="left center"
data-variation="mini"
>
<i class="inverted grey paint brush alternate icon"></i>
</router-link>
<router-link
v-if="
project && permissions && permissions.can_create_feature
"
:to="{
name: 'ajouter-signalement',
params: { slug_type_signal: type.slug },
}"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Ajouter un signalement"
data-position="left center"
data-variation="mini"
>
<i class="ui plus icon"></i>
</router-link>
<router-link
:to="{
name: 'dupliquer-type-signalement',
params: { slug_type_signal: type.slug },
}"
v-if="
project &&
permissions &&
permissions.can_create_feature_type &&
isOffline() !== true
"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Dupliquer un type de signalement"
data-position="left center"
data-variation="mini"
>
<i class="inverted grey copy alternate icon"></i>
</router-link>
<router-link
:to="{
name: 'editer-type-signalement',
params: { slug_type_signal: type.slug },
}"
v-if="
project &&
type.is_editable &&
permissions &&
permissions.can_create_feature_type &&
isOffline() !== true &&
!(
importFeatureTypeData.find(el => el.feature_type_title === type.slug) &&
importFeatureTypeData.find(el => el.feature_type_title === type.slug).status === 'pending'
)
"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Éditer le type de signalement"
data-position="left center"
data-variation="mini"
>
<i class="inverted grey pencil alternate icon"></i>
</router-link>
<router-link
:to="{
name: 'editer-symbologie-signalement',
params: { slug_type_signal: type.slug },
}"
v-if="
project &&
type.is_editable &&
type.geom_type === 'point' &&
permissions &&
permissions.can_create_feature_type &&
isOffline() != true &&
!(
importFeatureTypeData.find(el => el.feature_type_title === type.slug) &&
importFeatureTypeData.find(el => el.feature_type_title === type.slug).status === 'pending'
)
"
class="
ui
compact
small
icon
right
floated
button button-hover-green
"
data-tooltip="Éditer la symbologie du type de signalement"
data-position="left center"
data-variation="mini"
>
<i class="inverted grey paint brush alternate icon"></i>
</router-link>
<div
v-if="
importFeatureTypeData.find(el => el.feature_type_title === type.slug) &&
importFeatureTypeData.find(el => el.feature_type_title === type.slug).status === 'pending'
"
class="import-message"
>
<i class="info circle icon" />
Import en cours
</div>
</div>
</div>
</div>
......@@ -358,7 +376,7 @@
</div>
<div class="ui relaxed list">
<div
v-for="(item, index) in last_features"
v-for="(item, index) in features"
:key="item.title + index"
class="item"
>
......@@ -387,7 +405,7 @@
</div>
</div>
</div>
<i v-if="last_features.length === 0"
<i v-if="features.length === 0"
>Aucun signalement pour le moment.</i
>
</div>
......@@ -549,7 +567,7 @@
<script>
import frag from "vue-frag";
import { mapUtil } from "@/assets/js/map-util.js";
import { mapGetters, mapState } from "vuex";
import { mapGetters, mapState, mapActions, mapMutations } from "vuex";
import projectAPI from "@/services/project-api";
import featureAPI from "@/services/feature-api";
......@@ -579,7 +597,9 @@ export default {
data() {
return {
infoMessage: "",
importMessage: null,
arraysOffline: [],
arraysOfflineErrors: [],
geojsonImport: [],
fileToImport: { name: "", size: 0 },
slug: this.$route.params.slug,
......@@ -593,23 +613,72 @@ export default {
},
computed: {
...mapGetters(["project", "permissions"]),
...mapState("feature_type", ["feature_types"]),
...mapState("feature", ["features"]),
...mapState(["last_comments", "user"]),
...mapGetters([
'project',
'permissions'
]),
...mapState('feature_type', [
'feature_types',
'importFeatureTypeData'
]),
...mapState('feature', [
'features'
]),
...mapState([
'last_comments',
'user',
'reloadIntervalId'
]),
DJANGO_BASE_URL() {
return this.$store.state.configuration.VUE_APP_DJANGO_BASE;
},
API_BASE_URL() {
return this.$store.state.configuration.VUE_APP_DJANGO_API_BASE;
}
},
watch: {
feature_types: {
deep: true,
handler(newValue, oldValue) {
if (newValue && newValue !== oldValue) {
this.GET_IMPORTS({
project_slug: this.$route.params.slug
});
}
}
},
last_features() {
// * limit to last five element of array (looks sorted chronologically, but not sure...)
return this.features.slice(-5);
},
importFeatureTypeData: {
deep: true,
handler(newValue) {
if (newValue && newValue.some(el => el.status === 'pending') && !this.reloadIntervalId) {
this.SET_RELOAD_INTERVAL_ID(setInterval(() => {
this.GET_IMPORTS({
project_slug: this.$route.params.slug
});
}, this.$store.state.configuration.VUE_APP_RELOAD_INTERVAL));
} else if (newValue && !newValue.some(el => el.status === 'pending')) {
this.CLEAR_RELOAD_INTERVAL_ID();
}
}
}
},
methods: {
...mapMutations([
'SET_RELOAD_INTERVAL_ID',
'CLEAR_RELOAD_INTERVAL_ID'
]),
...mapActions([
'GET_PROJECT_INFO'
]),
...mapActions('feature_type', [
'GET_IMPORTS'
]),
...mapActions('feature', [
'GET_PROJECT_FEATURES'
]),
refreshId() {
return "?ver=" + Math.random();
},
......@@ -633,20 +702,25 @@ export default {
sendOfflineFeatures() {
var promises = [];
this.arraysOffline.forEach((feature, index, object) => {
let self = this;
this.arraysOfflineErrors = [];
this.arraysOffline.forEach((feature) => {
console.log(feature);
if (feature.type === "post") {
promises.push(
axios
.post(`${this.API_BASE_URL}features/`, feature.geojson)
.then((response) => {
console.log(response);
if (response.status === 201 && response.data) {
object.splice(index, 1);
return "OK"
}
else{
self.arraysOfflineErrors.push(feature);
}
})
.catch((error) => {
console.log(error);
self.arraysOfflineErrors.push(feature);
})
);
} else if (feature.type === "put") {
......@@ -659,11 +733,15 @@ export default {
.then((response) => {
console.log(response);
if (response.status === 200 && response.data) {
object.splice(index, 1);
return "OK"
}
else{
self.arraysOfflineErrors.push(feature);
}
})
.catch((error) => {
console.log(error);
self.arraysOfflineErrors.push(feature);
})
);
}
......@@ -683,12 +761,12 @@ export default {
let arraysOfflineOtherProject = arraysOffline.filter(
(x) => x.project !== this.project.slug
);
arraysOffline = arraysOfflineOtherProject.concat(this.arraysOffline);
this.arraysOffline = [];
arraysOffline = arraysOfflineOtherProject.concat(this.arraysOfflineErrors);
localStorage.setItem("geocontrib_offline", JSON.stringify(arraysOffline));
},
toNewFeatureType() {
console.log('prout');
this.featureTypeImporting = true;
this.$router.push({
name: "ajouter-type-signalement",
......@@ -790,16 +868,24 @@ export default {
},
mounted() {
this.$store.dispatch("GET_PROJECT_INFO", this.slug).then(() => {
this.featureTypeLoading = false;
setTimeout(this.initMap, 1000);
});
this.$store
.dispatch("feature/GET_PROJECT_FEATURES", {
project_slug: this.slug,
this.GET_PROJECT_INFO(this.slug)
.then(() => {
this.featureTypeLoading = false;
setTimeout(this.initMap, 1000);
})
.catch(() => {
this.featureTypeLoading = false;
});
this.GET_PROJECT_FEATURES({
project_slug: this.slug,
ordering: '-created_on',
limit: 5
})
.then(() => {
this.featuresLoading = false;
})
.catch(() => {
this.featuresLoading = false;
});
if (this.message) {
......@@ -871,4 +957,10 @@ export default {
.text-left {
text-align: left !important;
}
.import-message {
width: fit-content;
line-height: 2em;
color: teal;
}
</style>
......@@ -128,7 +128,7 @@
>Visibilité des signalements publiés</label
>
<Dropdown
:options="levelPermissions"
:options="levelPermissionsPub"
:selected="form.access_level_pub_feature.name"
:selection.sync="form.access_level_pub_feature"
/>
......@@ -259,15 +259,37 @@ export default {
},
levelPermissions(){
let self = this;
let levels = []
this.levelsPermissions.map(function(item) {
if (item.user_type_id != "super_contributor")
levels.push({
'name': self.traslateRoleToFrench(item.user_type_id),
'value': item.user_type_id,
})
let levels = new Array();
if(self.levelsPermissions){
self.levelsPermissions.map(function(item) {
if (item.user_type_id != "super_contributor")
levels.push({
'name': self.traslateRoleToFrench(item.user_type_id),
'value': item.user_type_id,
})
if (!self.form.moderation && item.user_type_id == "moderator"){
levels.pop()
}
});
}
return levels;
},
levelPermissionsPub(){
let self = this;
let levels = new Array();
if(self.levelsPermissions){
self.levelsPermissions.map(function(item) {
if (item.user_type_id != "super_contributor"
&& item.user_type_id != "admin"
&& item.user_type_id != "moderator"){
levels.push({
'name': self.traslateRoleToFrench(item.user_type_id),
'value': item.user_type_id,
})
}
});
return levels
}
return levels;
}
},
......@@ -283,7 +305,7 @@ export default {
},
traslateRoleToFrench(role){
if (role == "admin") return "Administrateur de projet";
if (role == "admin") return "Administrateur projet";
if (role == "moderator") return "Modérateur";
if (role == "contributor") return "Contributeur";
if (role == "logged_user") return "Utilisateur connecté";
......@@ -491,22 +513,40 @@ export default {
this.form.is_project_type = false;
}
//* transform string values to objects for dropdowns display (could be in a computed)
this.form.access_level_pub_feature = {
name: this.project.access_level_pub_feature,
value: this.levelPermissions.find(
(el) => el.name === this.project.access_level_pub_feature
).value,
};
this.form.access_level_arch_feature = {
name: this.project.access_level_arch_feature,
value: this.levelPermissions.find(
(el) => el.name === this.project.access_level_arch_feature
).value,
};
if(this.levelPermissionsPub){
let value = {}
value = this.levelPermissionsPub.find(
(el) => el.name === this.project.access_level_pub_feature
)
if(value){
this.form.access_level_pub_feature = {
name: this.project.access_level_pub_feature,
value: value.value ,
};
}
}
if(this.levelPermissions){
let value = {}
value = this.levelPermissions.find(
(el) => el.name === this.project.access_level_arch_feature
)
if(value){
this.form.access_level_arch_feature = {
name: this.project.access_level_arch_feature,
value: value.value ,
};
}
}
},
},
watch: {
'form.moderation': function (newValue){
if(!newValue){
this.form.access_level_pub_feature = { name: "", value: "" };
this.form.access_level_arch_feature = { name: "", value: "" };
}
}
},
created() {
this.definePageType();
if (this.action === "create") {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment