-
Tor-Einar Skog authoredTor-Einar Skog authored
Observation.vue 31.90 KiB
<!--
Copyright (c) 2022 NIBIO <http://www.nibio.no/>.
This file is part of VIPSObservationApp.
VIPSObservationApp is free software: you can redistribute it and/or modify
it under the terms of the NIBIO Open Source License as published by
NIBIO, either version 1 of the License, or (at your option) any
later version.
VIPSObservationApp is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
NIBIO Open Source License for more details.
You should have received a copy of the NIBIO Open Source License
along with VIPSObservationApp. If not, see <http://www.nibio.no/licenses/>.
Author: Bhabesh Bhabani Mukhopadhyay
Author: Tor-Einar Skog <tor-einar.skog@nibio.no>
Dated : 19-Aug-2021
-->
<template>
<div id="observation">
<div><router-link class="vips-btn" to="/">{{ $t("back.label") }}</router-link></div>
<div v-if="observation.deleted">
<div class="alert alert-warning" role="alert">
{{ $t("err.observation.remove.warn") }}
</div>
</div>
<div class="form-group">
<select required class="form-control" id="divCropId" ref='divCropId' v-model="selectedCropId" v-on:change="selectCrop($event)">
<option v-for="crop in crops" :value='crop.organismId' >{{crop.localName}}</option>
</select>
</div>
<div class="form-group">
<select :disabled="selectedCropId <= 0" required class="form-control" v-model="pest.pestId" id='divPestId' ref='divPestId'>
<option v-for="pest in pests" v-bind:value='pest.pestId'>{{pest.pestName}}</option>
</select>
</div>
<div class="form-group row">
<label for="strDateObservation" class="col-1 col-form-label"><font-awesome-icon style="font-size: x-large;" icon="calendar-days" /></label>
<div class="col-7">
<input class="form-control" id="strDateObservation" ref="strDateObservation" type="datetime-local" :max="maxObservationDate" :min="minObservationDate" v-model="strDateObservation" v-on:change="capturedTime($event)"/>
</div>
</div>
<div v-if="pest.pestId" class="row">
<div class="col-1"><font-awesome-icon style="font-size: x-large; margin-top: 7px;" icon="map-location" /></div>
<div class="col-7">
<router-link
id="linkMap"
class="vips-btn"
ref='linkMap'
:to="{name:'MapObservation', params: {observationId:observation.observationId,geoinfo:mapGeoinfo,isMapPanelVisible:newMapPanel,locationPointOfInterestId:mapLocationPointOfInterestId, observation:observation}}"
>{{ $t("observation.map.label") }}</router-link>
</div>
</div>
<div v-if="mapGeoinfo" id="divMapGeoInfo">
<div class="col" style="margin-top: 15px;">
<map-observation :geoinfo="mapGeoinfo" :isMapPanelVisible="isMapPanelVisible" :locationIsPrivate="observation.locationIsPrivate" :polygonService="observation.polygonService" v-on:visibilityObservationAction="visibilityObservationAction" ></map-observation>
</div>
</div>
<div>
<div><font-awesome-icon style="font-size: x-large; vertical-align:middle;" icon="scale-balanced" /><a class="vips-btn" v-on:click="toggleShowQuantification">{{ $t("observation.quantification.label") }}</a></div>
<div v-if="isQuantification">
<fieldset v-if="isMounted" id='divSchemaForm' class="form-group border" >
<legend style="font-size: 1em !important;">{{ $t("observation.quantification.form.label") }}</legend>
<quantification :isEditable="false" :observationId="observation.observationId" :organismId="observation.organismId" :schemaData="observation.observationData" v-on:updateQuntificationData="updateQuntificationData"> </quantification>
</fieldset>
</div>
</div>
<observation-illustration-board
v-if="isMounted"
v-bind:initialObservationIllustrations="observation.observationIllustrationSet"
v-bind:observationId="observation.observationId"
@observationIllustrationSetUpdated = "handleObservationIllustrationSetUpdated"
/>
<div ref='divObservationText' class="form-group">
<div><font-awesome-icon icon="fa-regular fa-file-lines" style="font-size: x-large;"/></div>
<div><input ref="observationHeader" type="text" class="form-control" v-model="observationHeader" :placeholder="$t('observation.detail.heading.placeholder')"/></div>
<div><textarea v-model="observationText" class="form-control" rows="4" :placeholder="$t('observation.detail.body.placeholder')"/></div>
</div>
<div v-show="isSync"><sync ref="sync" :isSyncNeeded="isSync"/></div>
<div v-if="observation.deleted"></div>
<div v-else class="float-right">
<a class="vips-btn" v-on:click="saveObservation">{{$t("save.label")}}</a>
<a v-show="isDeleteBttnVisible" class="vips-btn danger" v-on:click="callForRemoveObservation">{{$t("delete.label")}}</a>
</div>
</div>
</template>
<script>
import CommonUtil from '@/components/CommonUtil'
import { DateTime } from 'luxon'
import MapObservation from '@/components/MapObservation'
import Quantification from '@/components/Quantification.vue'
import Sync from '@/components/Sync'
import ObservationIllustrationBoard from "@/components/ObservationIllustrationBoard"
export default {
name: 'Observation',
props: ['observationId','paramGeoinfo','locationPointOfInterestId','paramObservation'],
components: {MapObservation,Quantification,Sync,ObservationIllustrationBoard},
data () {
return {
isGeoInfoNotAvailable : false,
isStrDateObservationEmpty : false,
isObservationHeaderEmpty : false,
isDeleteBttnVisible : true,
isSync : false,
isQuantification : false,
isMounted : false,
msg : this.$i18n.t("observation.msg"),
observation : {},
selectedCropId : -1,
crops : [],
pests : [],
crop : {'cropId':'','cropName':this.$i18n.t("observation.selectcrop")},
pest : {'pestId':'','pestName':this.$i18n.t("observation.selectpest")},
isActive : false,
dateObservation : DateTime,
strDateObservation : null,
maxObservationDate : null,
minObservationDate : null,
observationHeader : '',
observationText : '',
mapGeoinfo : null,
mapLocationPointOfInterestId : '',
isMapPanelVisible : false,
newMapPanel : true,
observationForStore :
{
observationId: '',
timeOfObservation: '',
statusChangedTime: '',
organismId: '',
cropOrganismId: '',
observationHeading: '',
observationText: '',
uploaded:false
}
}
},
methods:{
handleObservationIllustrationSetUpdated(newList)
{
this.observation.observationIllustrationSet = newList;
},
callForRemoveObservation()
{
if(confirm(this.$i18n.t("err.observation.remove.msg")))
{
this.prepareForRemove();
}
},
prepareForRemove(){
if(this.observationId)
{
if(this.observationId < 0)
{
/** Just remove it locally */
this.removeLocalObservation(this.observationId);
this.$router.push('/');
}
else
{
/** Mark the record - for sending to server */
this.observationForStore.deleted=true;
this.saveObservation();
}
}
},
/** Remove local Observation */
removeLocalObservation(id)
{
let lstObservations = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_OBSERVATION_LIST));
let indexPosition = null;
$.each(lstObservations, function(index, observation){
if(observation.observationId===id)
{
indexPosition = index;
return false;
}
});
if(indexPosition || indexPosition === 0)
{
this.removeImageRecord(id);
lstObservations.splice(indexPosition,1);
localStorage.setItem(CommonUtil.CONST_STORAGE_OBSERVATION_LIST,JSON.stringify(lstObservations));
}
},
/**
* Remove image data from indexed DB
*/
removeImageRecord(observationId){
let entityName = CommonUtil.CONST_DB_ENTITY_PHOTO;
let dbRequest = indexedDB.open(CommonUtil.CONST_DB_NAME, CommonUtil.CONST_DB_VERSION);
let indexName = CommonUtil.CONST_DB_INDEX_NAME_OBSERVATION_ID;
dbRequest.onsuccess = function(evt) {
let db = evt.target.result;
let transaction = db.transaction([entityName],'readwrite');
let objectstore = transaction.objectStore(entityName);
let indexStore = objectstore.index(indexName);
let keyRange = IDBKeyRange.only(observationId);
let cursorRequest = indexStore.openCursor(keyRange);
cursorRequest.onsuccess = function(event){
let cursor = event.target.result;
if(cursor)
{
cursor.delete();
cursor.continue();
}
}
}
},
/** Validation on save */
validate()
{
let result = true;
let msg = "";
if(!this.strDateObservation)
{
msg += this.$i18n.t("err.observation.date.empty") + "\n";
result = false;
}
if(!this.mapGeoinfo)
{
msg += this.$i18n.t("err.observation.geoinfo") + "\n";
result = false;
}
if(!this.observationHeader)
{
msg += this.$i18n.t("err.observation.header.empty") + "\n";
result = false;
}
if(! result)
{
alert(msg);
}
return result;
},
visibilityObservationAction(paramPrivate, paramPolygonService){
this.observationForStore.locationIsPrivate=paramPrivate;
if(paramPolygonService)
{
this.observationForStore.polygonService=paramPolygonService;
}
else{
this.observationForStore.polygonService='';
}
},
toggleShowQuantification()
{
this.isQuantification = ! this.isQuantification;
},
/** Get observation from local storage system */
getObservationFromStore(id)
{
// For existing observation
if(id)
{
let jsonObservation = {};
let lstObservations = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_OBSERVATION_LIST)); // Observation List
/*
Check availability of observation object
- mainly from map component
- to hold crop, pest data
*/
if(this.paramObservation)
{
this.getObservationCrops(this.paramObservation);
this.getObservationPests(this.paramObservation);
this.strDateObservation = DateTime.fromISO(this.paramObservation.timeOfObservation).toFormat('yyyy-MM-dd\'T\'HH:mm:ss');
}
else
{
jsonObservation = lstObservations.find(({observationId})=> observationId === id); // Selection Observation
this.observation = jsonObservation;
this.observation.observationData = JSON.parse(jsonObservation.observationData);
if(jsonObservation.statusTypeId) {}
else
{
this.observation.statusTypeId = CommonUtil.CONST_STATUS_PENDING;
}
/* For related Crop and Crop list */
this.getObservationCrops(jsonObservation);
/* For related Pest and Pest list */
this.getObservationPests(jsonObservation);
this.strDateObservation = DateTime.fromISO(jsonObservation.timeOfObservation).toFormat('yyyy-MM-dd\'T\'HH:mm:ss');
this.observationHeader = jsonObservation.observationHeading;
this.observationText = jsonObservation.observationText;
}
if(this.paramGeoinfo)
{
this.mapGeoinfo = this.paramGeoinfo;
}
else if(jsonObservation.geoinfo)
{
this.mapGeoinfo = JSON.parse(jsonObservation.geoinfo);
}
else
{
if(jsonObservation.location && jsonObservation.location.geoJSON)
{
this.mapGeoinfo = JSON.parse(jsonObservation.location.geoJSON);
this.mapLocationPointOfInterestId = jsonObservation.locationPointOfInterestId;
}
}
this.selectedCropId = this.observation.cropOrganismId;
}
else {
//TODO for new Observation
}
},
/** Get related crop and crop list for a selected Observation */
getObservationCrops(jsonObservation){
//console.info(jsonObservation);
let lstCrops = [];
let lstCropIds = [];
let lstCropList = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_LIST));
/** Try to get list of crops from crop category ids */
let lstCropCategories = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_CATEGORY));
/** For Selected Observation We require List of related crop ids for dropdown */
// Iterating crop categories
$.each(lstCropCategories, function(index,category){
// Iterating each category data
$.each(category, function(key, data){
//find the key meant for crop id/ids
if(key === 'cropOrganismIds')
{
this.isActive = true;
// iterate and get the required cropids relaed to selected observation id
$.each (data, function(index, item){
if(parseInt(item)===parseInt(jsonObservation.cropOrganismId))
{
lstCropIds = data;
return false;
}
});
}
})
});
/* Get list of related crops with their id and name */
this.getCrops(lstCropIds);
let jsonSelectedCrop= this.crops.find(({organismId}) => organismId === parseInt(jsonObservation.cropOrganismId));
if(jsonSelectedCrop)
{
this.crop = {"cropId":jsonSelectedCrop.organismId, "cropName":jsonSelectedCrop.latinName};
}
},
/** Get related pests for a particular crop of a observation */
getObservationPests(jsonObservation){
let lstPests = [];
let lstPestIds = [];
let lstPestList = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_PEST_LIST));
let lstCropPestList = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_PEST_LIST));
$.each(lstCropPestList, function(index,cropPests){
if(parseInt(cropPests.cropOrganismId) === parseInt(jsonObservation.cropOrganismId))
{
lstPestIds = cropPests.pestOrganismIds;
}
});
this.getPests(lstPestIds);
let jsonSelectedPest = this.pests.find(({pestId}) => pestId === jsonObservation.organismId);
if(jsonSelectedPest)
{
this.pest = {"pestId":jsonSelectedPest.pestId, "pestName":jsonSelectedPest.pestName};
}
},
/** On selecting a particular crop */
selectCrop(event)
{
this.observation.cropOrganismId=this.selectedCropId;
var selectedCropId = this.selectedCropId;
let crop = this.crop;
let lstPestIds = [];
let lstCropPestList = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_PEST_LIST));
$.each(lstCropPestList, function(cropId, cropPest){
if(selectedCropId == cropId)
{
let jsonPestId = cropPest.pestOrganismIds;
lstPestIds = lstPestIds.concat(jsonPestId);
}
});
this.getPests(lstPestIds);
},
capturedTime(event)
{
this.observation.timeOfObservation=this.strDateObservation;
},
/** Get New Observation */
getNewObservation()
{
this.isDeleteBttnVisible = false;
let lstCropIds = [];
let cropCategoryIdProp = CommonUtil.CONST_CROP_CATEGORY_ID;
let jsonCrops = [];
let arrCropCatIds = localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_ID_LIST).split(",");
let jsonCropCategoryList = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_CATEGORY));
/* Iterate Selected Crop Ids */
$.each(arrCropCatIds, function(index, cropCatId){
if(cropCatId != "")
{
let jsonCropCategory = jsonCropCategoryList.find(({cropCategoryId}) => cropCategoryId === JSON.parse(cropCatId));
let jsonCropIds = jsonCropCategory.cropOrganismIds;
lstCropIds = lstCropIds.concat(jsonCropIds);
}
});
this.getCrops(lstCropIds);
this.pest = {"pestId":'', "pestName":this.$i18n.t("observation.selectpest")};
this.pests = [this.pest];
this.getNewObservationId();
},
/** Get Crops */
getCrops(lstCropIds)
{
let This = this;
let lstCrops = [];
if(! this.observationId)
{
lstCrops.push({"organismId":-1, "localName":this.$i18n.t("observation.selectcrop")});
}
let lstCropList = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_LIST));
$.each(lstCropIds, function(index, cropId){
let jsonDetailCrop = lstCropList.find(({organismId}) => organismId === cropId);
let organismLocaleSet = jsonDetailCrop.organismLocaleSet;
let cropName = jsonDetailCrop.latinName;
if(organismLocaleSet)
{
let strLocale = This.getSystemLocale();
organismLocaleSet.forEach(function(localObj) {
if(localObj.organismLocalePK.locale === strLocale)
{
if(localObj.localName)
{
cropName = localObj.localName;
}
return false;
}
});
}
let jsonCrop = {'organismId':cropId, 'localName':cropName};
lstCrops.push(jsonCrop);
});
this.crops = lstCrops;
},
/** Get Pests */
getPests(lstPestIds)
{
let This = this;
let lstPests = [];
if(! this.observationId)
{
lstPests.push({"pestId":'', "pestName":this.$i18n.t("observation.selectpest")});
}
if(lstPestIds.length===0)
{
lstPests.push({"pestId":'', "pestName":'Not found in database'});
}
else{
let lstPestList = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_PEST_LIST));
$.each(lstPestIds, function(index, pestId){
let jsonDetailPest = lstPestList.find(({organismId}) => organismId === pestId);
let jsonPest = {};
if(jsonDetailPest)
{
let pestName = jsonDetailPest.latinName;
let organismLocaleSet = jsonDetailPest.organismLocaleSet;
if(organismLocaleSet)
{
let strLocale = This.getSystemLocale();
organismLocaleSet.forEach(localObj => {
if(localObj.organismLocalePK.locale === strLocale)
{
if(localObj.localName)
{
pestName = localObj.localName;
}
return false;
}
});
}
jsonPest = {"pestId":jsonDetailPest.organismId, "pestName":pestName};
}
else
{
jsonPest = {"pestId":pestId, "pestName":'Not Available -- '+pestId};
}
lstPests.push(jsonPest);
});
}
this.pests = lstPests;
},
/** Get new observation Id */
getNewObservationId(lstObservations)
{
let newId = 0;
let observationIds=[];
if(lstObservations)
{
$.each(lstObservations, function(index, observation){
if(observation.observationId < 0)
{
observationIds.push(Math.abs(observation.observationId));
}
});
if(observationIds.length === 0)
{
newId = CommonUtil.CONST_OBSERVATION_COUNT_START_ID;
}
else
{
let largestValue = Math.max.apply(null, observationIds);
newId = -Math.abs(largestValue + 1);
}
}
else
{
newId = CommonUtil.CONST_OBSERVATION_COUNT_START_ID;
}
return newId;
},
/** Save Observation */
saveObservation()
{
if(! this.validate()) { return false; }
let This = this;
let lstObservations = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_OBSERVATION_LIST));
/** Whether record to be updated */
let isRecordAvailable = null;
if(lstObservations)
{
isRecordAvailable = lstObservations.find(({observationId})=> observationId === this.observationId);
}
this.observationForStore.cropOrganismId = this.crop.cropId;
this.observationForStore.organismId = this.pest.pestId;
this.observationForStore.timeOfObservation = this.strDateObservation;
this.observationForStore.statusChangedTime = this.strDateObservation;
if(this.observation.statusTypeId)
{
this.observationForStore.statusTypeId = this.observation.statusTypeId;
}
else
{
this.observationForStore.statusTypeId = CommonUtil.CONST_STATUS_PENDING;
}
this.observationForStore.isQuantified = this.observation.isQuantified;
this.observationForStore.userId = this.observation.userId;
this.observationForStore.geoinfo = JSON.stringify(this.mapGeoinfo); //this.observation.geoinfo;
this.observationForStore.locationPointOfInterestId = this.observation.locationPointOfInterestId;
this.observationForStore.broadcastMessage = this.observation.broadcastMessage;
this.observationForStore.statusRemarks = this.observation.statusRemarks;
this.observationForStore.observationHeading = this.observationHeader;
this.observationForStore.observationText = this.observationText;
this.observationForStore.observationData = JSON.stringify(this.observation.observationData)//'{"number":0,"unit":"Number"}'; //"{\"number\":0,\"unit\":\"Number\"}";
this.observationForStore.observationIllustrationSet = this.observation.observationIllustrationSet;
if(this.observationId && isRecordAvailable)
{
this.observationForStore.observationId = this.observationId;
let localObservationForStore = this.observationForStore;
let selectedObservationId = this.observationId;
$.each(lstObservations, function(index, jobservation)
{
if(jobservation.observationId === selectedObservationId)
{
jobservation.cropOrganismId = localObservationForStore.cropOrganismId;
jobservation.organismId = localObservationForStore.organismId;
jobservation.timeOfObservation = localObservationForStore.timeOfObservation;
jobservation.statusChangedTime = localObservationForStore.statusChangedTime;
jobservation.statusTypeId = localObservationForStore.statusTypeId;
jobservation.isQuantified = localObservationForStore.isQuantified;
jobservation.userId = localObservationForStore.userId;
jobservation.geoinfo = localObservationForStore.geoinfo;
jobservation.locationPointOfInterestId = localObservationForStore.locationPointOfInterestId;
jobservation.broadcastMessage = localObservationForStore.broadcastMessage;
jobservation.observationIllustrationSet = localObservationForStore.observationIllustrationSet;
jobservation.observationData = localObservationForStore.observationData;
jobservation.observationHeading = localObservationForStore.observationHeading;
jobservation.observationText = localObservationForStore.observationText;
jobservation.locationIsPrivate = localObservationForStore.locationIsPrivate;
jobservation.polygonService = localObservationForStore.polygonService;
jobservation.uploaded = localObservationForStore.uploaded;
if(localObservationForStore.deleted)
{
jobservation.deleted = localObservationForStore.deleted;
}
return false;
}
});
}
else
{
this.observationForStore.observationId = this.getNewObservationId(lstObservations);
if(! lstObservations)
{
lstObservations = [];
}
this.observationForStore.statusTypeId=CommonUtil.CONST_STATUS_PENDING;
lstObservations.push(this.observationForStore);
}
localStorage.setItem(CommonUtil.CONST_STORAGE_OBSERVATION_LIST, JSON.stringify(lstObservations) );
this.$router.replace({path:'/'});
},
updateQuntificationData(schemaData){
this.observation.observationData = schemaData;
},
getSystemLocale()
{
var localePrefer = null;
var localePrefer2 = null;
if(typeof navigator.language != 'undefined')
{
localePrefer = navigator.language;
localePrefer2 = localePrefer.trim().substring(0,2);
}
return localePrefer2;
},
},
filters: {
dateFormat: function(timeStr) {
return DateTime.fromISO(timeStr).toFormat('yyyy-MM-dd\'T\'hh:mm:ss');
}
},
watch: {
pest: {
handler (val)
{
if(this.pest.pestId)
{
this.observation.organismId=this.pest.pestId;
this.isMounted = true;
}
},
deep : true,
immediate : true
}
} ,
mounted(){
CommonUtil.setHeaderTitle(this.$i18n.t("observation.msg"));
var dtToday = new Date();
var month = dtToday.getMonth() + 1;
var day = dtToday.getDate();
var year = dtToday.getFullYear();
var hh = dtToday.getHours();
var min = dtToday.getMinutes();
if(month < 10)
month = '0' + month.toString();
if(day < 10)
day = '0' + day.toString();
if(hh<10)
hh = '0' + hh.toString();
if(min<10)
min = '0' + min.toString();
var maxDate = year + '-' + month + '-' + day;
var minDate = year + '-' + '01' + '-' + '01';
this.maxObservationDate = maxDate+'T00:00';
this.minObservationDate = minDate+'T00:00';
this.strDateObservation = maxDate+'T'+hh+':'+min;
/* Check existing Observation Object - Mainly from Map component
It helps to retain the data back to Observation from Map
*/
if(this.paramObservation)
{
this.observation = this.paramObservation;
if(this.paramObservation.observationText)
{
this.observationText = this.paramObservation.observationText;
}
if(this.paramObservation.observationHeader)
{
this.observationHeader = this.paramObservation.observationHeader;
}
}
if(this.paramGeoinfo)
{
this.mapGeoinfo = this.paramGeoinfo;
}
/* Get details of existing Observation */
if(this.observationId)
{
this.getObservationFromStore(this.observationId);
this.observation.observationId=this.observationId;
}
else{
let isCropIdsAvailable = false;
if(localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_ID_LIST))
{
let lstCropIds = localStorage.getItem(CommonUtil.CONST_STORAGE_CROP_ID_LIST).split(",");
if(lstCropIds.length > 0)
{
isCropIdsAvailable = true;
}
}
if(isCropIdsAvailable)
{
let newObservationId = 0;
let lstObservations = JSON.parse(localStorage.getItem(CommonUtil.CONST_STORAGE_OBSERVATION_LIST));
newObservationId = this.getNewObservationId(lstObservations);
this.observation.observationId = newObservationId;
this.observation.observationData='';
this.getNewObservation();
}
else
{
this.$router.push('/cropCategory');
}
if(this.locationPointOfInterestId)
{
this.mapLocationPointOfInterestId = this.locationPointOfInterestId;
}
}
if(!this.paramObservation)
{
this.observationForStore.locationIsPrivate=this.observation.locationIsPrivate;
this.observationForStore.polygonService=this.observation.polygonService;
}
}
}
</script>
<style scoped>
#btnCloseQuantification {
float: right;
top: 0px;
right: 0px;
}
#divSchemaForm {
padding: 10px;
}
</style>