diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f7c8f34b08ba2e23c64b5801f6885b3c1768ac72..bd01e22edd47c77eb35b09eff7b41198f1463721 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,5 @@ stages: + - test-build - Static analysis - build - deploy @@ -8,6 +9,17 @@ variables: SONAR_HOST_URL: "https://sonarqube.neogeo.fr" GIT_DEPTH: 0 +test build: + stage: test-build + image: node:14 + script: + - npm install + - npm run build + except: + - master + - develop + - ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$ + build testing docker image: stage: build only: diff --git a/src/assets/js/utils.js b/src/assets/js/utils.js index 4b01c67ef07d0bf803528976e6708657894fa821..0680fcdfad82586d6325e4cc501bf9873abf4d7c 100644 --- a/src/assets/js/utils.js +++ b/src/assets/js/utils.js @@ -24,14 +24,18 @@ export function csvToJson(csv, delimiter) { const [, ...lines] = allLines; for (const line of lines) { - const obj = {}; - const currentLine = line.split(delimiter); + if (line) { + const obj = {}; + const currentLine = line.split(delimiter).map(el => { + return el.replace('\r', ''); + }); - for (let i = 0; i < headers.length; i++) { - obj[headers[i]] = currentLine[i]; - } + for (let i = 0; i < headers.length; i++) { + obj[headers[i]] = currentLine[i]; + } - result.push(obj); + result.push(obj); + } } return JSON.parse(JSON.stringify(result)); } diff --git a/src/services/map-service.js b/src/services/map-service.js index 7a9afd5e6c7d5643bb181dec4c62aa067b78472b..e88fceab2a2c826dca7ab2a0baa32258168f09bc 100644 --- a/src/services/map-service.js +++ b/src/services/map-service.js @@ -116,7 +116,7 @@ const mapService = { overlay.setPosition(undefined); closer.blur(); return false; - }; + }; } this.map.addOverlay(this.overlay); @@ -244,8 +244,11 @@ const mapService = { addLayers: function (layers, serviceMap, optionsMap, schemaType) { this.layers = layers; if (layers) { //* if admin has defined basemaps for this project + let count = 0; layers.forEach((layer) => { + if (layer) { + count +=1; const options = layer.options; if (options) { options.noWrap = true; @@ -268,6 +271,7 @@ const mapService = { dictLayersToLeaflet[layer.id] = layerTms; } } + dictLayersToLeaflet[layer.id].setZIndex(count); } }); } else { //* else when no basemaps defined @@ -358,6 +362,7 @@ const mapService = { }); this.mvtLayer.featureTypes = featureTypes; this.mvtLayer.project_slug = projectSlug; + this.mvtLayer.setZIndex(30); this.map.addLayer(this.mvtLayer); window.layerMVT = this.mvtLayer; }, @@ -462,7 +467,7 @@ const mapService = { source: drawSource, style: styleFunction, }); - + olLayer.setZIndex(29); this.map.addLayer(olLayer); return drawSource; }, diff --git a/src/views/Feature/FeatureDetail.vue b/src/views/Feature/FeatureDetail.vue index e261563f07a8fb039fc2890283cfd6b91ef87382..946b4629a960d30fa743f8ddb91a28f4139bdde2 100644 --- a/src/views/Feature/FeatureDetail.vue +++ b/src/views/Feature/FeatureDetail.vue @@ -54,7 +54,7 @@ </div> <div v-if="isCanceling" - class="ui dimmer modals page transition visible active" + class="ui dimmer modals transition visible active" style="display: flex !important" > <div @@ -236,9 +236,9 @@ export default { deleteFeature() { this.$store .dispatch('feature/DELETE_FEATURE', { feature_id: this.currentFeature.feature_id }) - .then((response) => { + .then(async (response) => { if (response.status === 204) { - this.GET_PROJECT_FEATURES({ + await this.GET_PROJECT_FEATURES({ project_slug: this.$route.params.slug }); this.goBackToProject(); diff --git a/src/views/Feature/FeatureEdit.vue b/src/views/Feature/FeatureEdit.vue index 1802af4d68f33d5f4b3015e4c3f7ffb41eade8a9..45fa9b8afbb7029e394bf208a53098ef9019b498 100644 --- a/src/views/Feature/FeatureEdit.vue +++ b/src/views/Feature/FeatureEdit.vue @@ -381,7 +381,7 @@ export default { errors: [], id_for_label: 'name', field: { - max_length: 140, + max_length: 128, }, html_name: 'name', label: 'Nom', diff --git a/src/views/FeatureType/FeatureTypeDetail.vue b/src/views/FeatureType/FeatureTypeDetail.vue index b82834fc4baa103d8655a8f8b2bd8ba20160f915..58303368fb891af77f861fecb6985e2ed83d9ac8 100644 --- a/src/views/FeatureType/FeatureTypeDetail.vue +++ b/src/views/FeatureType/FeatureTypeDetail.vue @@ -663,7 +663,8 @@ export default { //* if field type is list, it's not possible to guess from value type if (field_type === 'list') { //*then check if the value is an available option - if (!options.includes(fieldInFeature)) { + if (fieldInFeature && !options.includes(fieldInFeature)) { + this.importError = `Le champ ${name} contient une valeur invalide.`; return false; } } else if (customType !== field_type) { @@ -693,7 +694,7 @@ export default { reader.addEventListener('load', (e) => { // bypass json check for files larger then 10 Mo let jsonValidity; - if (parseFloat(fileConvertSizeToMo(files[0])) <= 10) { + if (parseFloat(fileConvertSizeToMo(files[0].size)) <= 10) { jsonValidity = this.checkJsonValidity(JSON.parse(e.target.result)); } else { jsonValidity = true; diff --git a/src/views/FeatureType/FeatureTypeEdit.vue b/src/views/FeatureType/FeatureTypeEdit.vue index 67d6def4ac8f5dab0ad86109b2c411d25e4f0afa..303f3d2f59107f7d8e031dae3e24aa8308d13d28 100644 --- a/src/views/FeatureType/FeatureTypeEdit.vue +++ b/src/views/FeatureType/FeatureTypeEdit.vue @@ -244,6 +244,7 @@ export default { slug: this.$route.params.slug, reservedKeywords: [ // todo : add keywords for mapstyle (strokewidth...) + 'id', 'title', 'description', 'status',