From 720e2ef5b0e9deeaa691b2412f8c0fcbb1e6cfaf Mon Sep 17 00:00:00 2001 From: "Stein A. Hoem" Date: Fri, 9 Aug 2024 13:52:27 +0200 Subject: [PATCH] Fix bakrunnkart bort med opencache --- Prod.Web/src/components/artskart/Artskart.js | 16 +- .../src/components/artskart/ModalArtskart.js | 16 +- .../components/artskart/RedigerbartKart.js | 223 +- .../assessment/assessment52Utbredelse.js | 1192 ++++--- Prod.Web/src/components/map/MapOpenLayers.js | 1232 ++++--- Prod.Web/src/components/viewModel.js | 2986 +++++++++-------- 6 files changed, 3100 insertions(+), 2565 deletions(-) diff --git a/Prod.Web/src/components/artskart/Artskart.js b/Prod.Web/src/components/artskart/Artskart.js index f3604a72..ae519e8a 100644 --- a/Prod.Web/src/components/artskart/Artskart.js +++ b/Prod.Web/src/components/artskart/Artskart.js @@ -7,12 +7,12 @@ import * as Xcomp from "../observableComponents"; const mapBounds = { S: [ [73, 13], - [83, 23] + [83, 23], ], N: [ [57, 4.3], - [71.5, 32.5] - ] + [71.5, 32.5], + ], }; const Artskart = ({ @@ -29,7 +29,8 @@ const Artskart = ({ artskartAdded, artskartRemoved, onCancel, - showTransferRegionlist + showTransferRegionlist, + token, }) => { // console.log('Artskart', taxonId, scientificNameId, evaluationContext); return ( @@ -40,13 +41,13 @@ const Artskart = ({ top: 16, right: 56, float: "right", - zIndex: 1000 + zIndex: 1000, }} > { + alwaysEnabled={true} + onClick={(e) => { e.preventDefault(); e.stopPropagation(); onCancel(); @@ -72,6 +73,7 @@ const Artskart = ({ artskartSelectionGeometry={artskartSelectionGeometry} onCancel={onCancel} showTransferRegionlist={showTransferRegionlist} + token={token} > ); diff --git a/Prod.Web/src/components/artskart/ModalArtskart.js b/Prod.Web/src/components/artskart/ModalArtskart.js index ca890fe5..a851a8bc 100644 --- a/Prod.Web/src/components/artskart/ModalArtskart.js +++ b/Prod.Web/src/components/artskart/ModalArtskart.js @@ -17,8 +17,8 @@ const ModalArtskart = ({ artskartRemoved, artskartSelectionGeometry, onOverførFraArtskart, - showTransferRegionlist - + showTransferRegionlist, + token, }) => { const ref = useRef(); const [visArtskart, setVisArtskart] = useState(false); @@ -28,7 +28,7 @@ const ModalArtskart = ({
this.handleSave(resultat)} + onSave={(resultat) => this.handleSave(resultat)} onCancel={() => setVisArtskart(false)} showWaterAreas={showWaterAreas} artskartWaterModel={artskartWaterModel} @@ -42,12 +42,20 @@ const ModalArtskart = ({ artskartRemoved={artskartRemoved} artskartSelectionGeometry={artskartSelectionGeometry} showTransferRegionlist={showTransferRegionlist} + token={token} /> )
) : (
- {labels.goTo} setVisArtskart(true)} alwaysEnabled={true}>{labels.speciesMap} + {labels.goTo}{" "} + setVisArtskart(true)} + alwaysEnabled={true} + > + {labels.speciesMap} +
); // return ( diff --git a/Prod.Web/src/components/artskart/RedigerbartKart.js b/Prod.Web/src/components/artskart/RedigerbartKart.js index 36d3bb29..a528503f 100644 --- a/Prod.Web/src/components/artskart/RedigerbartKart.js +++ b/Prod.Web/src/components/artskart/RedigerbartKart.js @@ -3,7 +3,7 @@ import MapOpenLayers from "../map/MapOpenLayers"; import Loading from "../Loading"; import useArtskart from "./useArtskart"; import * as Xcomp from "../observableComponents"; -import artskartModel from "../fylkesforekomst/a" +import artskartModel from "../fylkesforekomst/a"; const RedigerbartKart = ({ artskartModel, @@ -21,16 +21,19 @@ const RedigerbartKart = ({ artskartRemoved, onCancel, children, - showTransferRegionlist + showTransferRegionlist, + token, }) => { - const [selectionGeometry, setSelectionGeometry] = React.useState(artskartSelectionGeometry); + const [selectionGeometry, setSelectionGeometry] = React.useState( + artskartSelectionGeometry + ); const [ artskart, observations, areadata, countylist, handleAddPoint, - handleClickPoint + handleClickPoint, ] = useArtskart({ taxonId, scientificNameId, @@ -42,15 +45,15 @@ const RedigerbartKart = ({ showWaterAreas, artskartWaterModel, }); - + // console.log('RedigerbartKart', artskartAdded, artskartRemoved, taxonId, scientificNameId); - const handleEditSelection = e => { + const handleEditSelection = (e) => { setSelectionGeometry(e); }; const [isLoading, setIsLoading] = useState(false); - const [newWaterAreas, setNewWaterAreas] = useState(''); + const [newWaterAreas, setNewWaterAreas] = useState(""); const [editStats, setEditStats] = useState({}); useEffect(() => { async function summarize() { @@ -70,54 +73,74 @@ const RedigerbartKart = ({ return (
{children} -
+

Arealer og regioner fra Artskart

- +
Forekomstareal:{" "} {areadata.AreaOfOccupancy >= 0 ? ( {areadata.AreaOfOccupancy} km²,{" "} - {areadata.AreaOfOccupancy / 4} ruter på 2 km x 2 km + {areadata.AreaOfOccupancy / 4} ruter på 2 km x 2 km ) : ( - "?" - )} + "?" + )} - {areadata.ExcludedLocalities > 0 && selectionGeometry && - . Ekskludert av polygon: {areadata.ExcludedLocalities} ruter. } -
- {!showWaterAreas && -
- Utbredelsesområde:{" "} - {areadata.AreaExtentOfOccurrence >= 0 ? ( + {areadata.ExcludedLocalities > 0 && selectionGeometry && ( - {areadata.AreaExtentOfOccurrence} km² + . Ekskludert av polygon:{" "} + {areadata.ExcludedLocalities} ruter. - ) : ( + )} +
+ {!showWaterAreas && ( +
+ Utbredelsesområde:{" "} + {areadata.AreaExtentOfOccurrence >= 0 ? ( + + {areadata.AreaExtentOfOccurrence} km² + + ) : ( "?" )} -
- } +
+ )}
{!showWaterAreas && ( - Regioner: {beskrivFylker(countylist)} + + Regioner: {beskrivFylker(countylist)} + )} {showWaterAreas && ( - Vannområde:{" "}{beskrivWaterAreas(newWaterAreas)} + + Vannområde:{" "} + + {beskrivWaterAreas(newWaterAreas)} + + )}
- + {artskart.error && (
Feilmelding fra Artskart: HTTP status {artskart.error.http}{" "} {artskart.error.message}
)} -
+
{ + onClick={(e) => { e.preventDefault(); e.stopPropagation(); onOverførFraArtskart({ @@ -128,62 +151,89 @@ const RedigerbartKart = ({ }); onCancel(); }} - className={artskart.error || (artskart.isLoading || isLoading) ? "" : "elevated"} + className={ + artskart.error || artskart.isLoading || isLoading + ? "" + : "elevated" + } > ✓ Overfør kun arealer til vurderingen -
- { showTransferRegionlist != false && - { - e.preventDefault(); - e.stopPropagation(); - onOverførFraArtskart({ - countylist, - newWaterAreas, - selectionGeometry, - areadata, - observations, - editStats - }); - onCancel(); - }} - className={artskart.error || (artskart.isLoading || isLoading) ? "" : "elevated"} - > - {showWaterAreas && "✓ Overfør arealer og områder tilbake til vurderingen"} - {!showWaterAreas && "✓ Overfør arealer og regioner tilbake til vurderingen"} - } - {selectionGeometry && { - e.preventDefault(); - e.stopPropagation(); - setSelectionGeometry(); - //onCancel(); - }} - className={artskart.error || (artskart.isLoading || isLoading) ? "" : "elevated"} - > - Fjern avgrensende polygon - } +
+ {showTransferRegionlist != false && ( + { + e.preventDefault(); + e.stopPropagation(); + onOverførFraArtskart({ + countylist, + newWaterAreas, + selectionGeometry, + areadata, + observations, + editStats, + }); + onCancel(); + }} + className={ + artskart.error || artskart.isLoading || isLoading + ? "" + : "elevated" + } + > + {showWaterAreas && + "✓ Overfør arealer og områder tilbake til vurderingen"} + {!showWaterAreas && + "✓ Overfør arealer og regioner tilbake til vurderingen"} + + )} + {selectionGeometry && ( + { + e.preventDefault(); + e.stopPropagation(); + setSelectionGeometry(); + //onCancel(); + }} + className={ + artskart.error || artskart.isLoading || isLoading + ? "" + : "elevated" + } + > + Fjern avgrensende polygon + + )}
- {(artskart.isLoading || isLoading) && } + {(artskart.isLoading || isLoading) && ( + + )}
- Merk at ruter (2x2km) basert på funn med dårlig geografisk presisjon (> 1000 m) er ekskludert. - {taxonId ? ( - + + Merk at ruter (2x2km) basert på funn med dårlig geografisk presisjon + (> 1000 m) er ekskludert.{" "} + + {taxonId ? ( + Se Artskart 🔗 - - ) : ( -
- Kan ikke lenke til Artskart fordi vurderingen mangler taxon id -
- )} + + ) : ( +
+ Kan ikke lenke til Artskart fordi vurderingen mangler taxon id +
+ )}
); @@ -207,11 +258,13 @@ const RedigerbartKart = ({ const artskartFilter = (taxonId, kriterier, artskartModel) => { let f = `{"TaxonIds":[${taxonId}],"IncludeSubTaxonIds":true,"Found":[2],"NotRecovered":[2],"UnsureId":[2],"Style":1`; - if (kriterier.AOOyear1 !== undefined) f += `,"YearFrom":"${artskartModel.observationFromYear}"`; - if (kriterier.AOOyear2 !== undefined) f += `,"YearTo":"${artskartModel.observationToYear}"`; //kriterier.AOOendyear2 + if (kriterier.AOOyear1 !== undefined) + f += `,"YearFrom":"${artskartModel.observationFromYear}"`; + if (kriterier.AOOyear2 !== undefined) + f += `,"YearTo":"${artskartModel.observationToYear}"`; //kriterier.AOOendyear2 f += `,"CoordinatePrecisionTo":"1000"}`; return encodeURIComponent(f); -} +}; // Manuelt lagt til 4 ruter og manuelt fjernet 1 rute const EditStats = ({ add, remove }) => { @@ -238,21 +291,21 @@ const EditStats = ({ add, remove }) => { }; // Rogaland, Trøndelag, Vestfold -const beskrivFylker = artskartFylker => { +const beskrivFylker = (artskartFylker) => { if (artskartFylker.length <= 0) return ""; - const hasPresence = artskartFylker.filter(f => f.Status === 2); + const hasPresence = artskartFylker.filter((f) => f.Status === 2); if (hasPresence.length <= 0) return "Ingen"; return hasPresence - .map(f => f.NAVN) + .map((f) => f.NAVN) .sort() .join(", "); }; -const beskrivWaterAreas = areas => { +const beskrivWaterAreas = (areas) => { if (!areas || areas.length === 0) return "Ingen"; return areas - .filter(f => f.intersects) - .map(f => f.name) + .filter((f) => f.intersects) + .map((f) => f.name) .sort() .join(", "); }; diff --git a/Prod.Web/src/components/assessment/assessment52Utbredelse.js b/Prod.Web/src/components/assessment/assessment52Utbredelse.js index 40197999..86ebd40e 100644 --- a/Prod.Web/src/components/assessment/assessment52Utbredelse.js +++ b/Prod.Web/src/components/assessment/assessment52Utbredelse.js @@ -1,511 +1,739 @@ -import React from 'react' -import config from '../../config'; -import {observer, inject} from 'mobx-react' -import * as Xcomp from './observableComponents' -import DistributionTable from './distributionTable' -import UtbredelseshistorikkInnenlands from './35Utbredelseshistorikk/UtbredelseshistorikkInnenlands' -import ModalArtskart from '../artskart/ModalArtskart'; -import ModalSimpleMap from '../artskart/ModalSimpleMap'; -import Fylkesforekomst from '../fylkesforekomst/Fylkesforekomst'; +import React from "react"; +import config from "../../config"; +import { observer, inject } from "mobx-react"; +import * as Xcomp from "./observableComponents"; +import DistributionTable from "./distributionTable"; +import UtbredelseshistorikkInnenlands from "./35Utbredelseshistorikk/UtbredelseshistorikkInnenlands"; +import ModalArtskart from "../artskart/ModalArtskart"; +import ModalSimpleMap from "../artskart/ModalSimpleMap"; +import Fylkesforekomst from "../fylkesforekomst/Fylkesforekomst"; import fylker from "../fylkesforekomst/fylker_2017"; -import Documents from '../documents' -import { action, computed, extendObservable, runInAction } from 'mobx'; -import SimpleMap from '../map/SimpleMap'; -import WaterArea from '../water/WaterArea'; -import { getWaterAreas } from '../water/apiWaterArea'; -import mapOlFunc from '../map/MapOlFunctions'; -import errorhandler from '../errorhandler'; -import ErrorList from '../errorList'; -import { beskrivTidSiden } from '../../formatting'; -@inject('appState') +import Documents from "../documents"; +import { action, computed, extendObservable, runInAction } from "mobx"; +import SimpleMap from "../map/SimpleMap"; +import WaterArea from "../water/WaterArea"; +import { getWaterAreas } from "../water/apiWaterArea"; +import mapOlFunc from "../map/MapOlFunctions"; +import errorhandler from "../errorhandler"; +import ErrorList from "../errorList"; +import { beskrivTidSiden } from "../../formatting"; +@inject("appState") @observer export default class Assessment52Utbredelse extends React.Component { + // code looks unused, but it makes the Artskart-module listen to changes + @computed get isDirty() { + if (!this.props.appState.assessmentId) return false; + const a = JSON.stringify(this.props.appState.assessment); + const b = this.props.appState.assessmentSavedVersionString; + return a != b; + } + GetIsRegionalAssessment = (assessment) => { + return ( + assessment.isAlienSpecies && + assessment.isRegionallyAlien && + assessment.expertGroup == "Fisker" + ); + }; - // code looks unused, but it makes the Artskart-module listen to changes - @computed get isDirty() { - if (!this.props.appState.assessmentId) return false - const a = JSON.stringify(this.props.appState.assessment) - const b = this.props.appState.assessmentSavedVersionString - return a != b + constructor(props) { + super(); + extendObservable(this, { + initialWaterAreas: null, + selectedWaterArea: [], + waterIsChanged: 0, + }); + if (props && props.appState && props.appState.assessment) { + const assessment = props.appState.assessment; + if (this.GetIsRegionalAssessment(assessment)) { + if (assessment.artskartWaterModel === null) + assessment.artskartWaterModel = {}; + if ( + this.initialWaterAreas === null && + this.GetIsRegionalAssessment(assessment) + ) { + const self = this; + getWaterAreas().then((data) => { + action(() => { + self.initialWaterAreas = data; + const ass = assessment; + ass.artskartWaterModel.isWaterArea = ass.artskartWaterModel + .isWaterArea + ? ass.artskartWaterModel.isWaterArea + : false; + self.reCreateartskartWaterModelArea({ + ass, + initialWaterAreas: self.initialWaterAreas, + }); + })(); + }); + } + if ( + assessment.artskartWaterModel && + assessment.artskartWaterModel.areas + ) { + this.selectedWaterArea = assessment.artskartWaterModel.areas + .filter((x) => x.disabled === 0) + .map((x) => x.globalId); + } + } } - GetIsRegionalAssessment = (assessment) => - { - return assessment.isAlienSpecies - && assessment.isRegionallyAlien - && assessment.expertGroup == "Fisker" + } + + reCreateartskartWaterModelArea = ({ ass, initialWaterAreas }) => { + if (ass.artskartWaterModel.areas) return; + const waterObject = ass.artskartWaterModel.isWaterArea + ? initialWaterAreas.areaState + : initialWaterAreas.regionState; + ass.artskartWaterModel.areas = []; + for (var key in waterObject) { + // console.log('adding?', key); + if ( + ass.artskartWaterModel.areas.find((x) => x.globalId === key) === + undefined + ) { + // console.log('adding', key); + ass.artskartWaterModel.areas.push(waterObject[key]); + } else { + console.log("not adding", key); + } } + }; - constructor(props) { - super(); - extendObservable(this, { - initialWaterAreas: null, - selectedWaterArea: [], - waterIsChanged: 0 - }); - if (props && props.appState && props.appState.assessment) { - const assessment = props.appState.assessment; - if (this.GetIsRegionalAssessment(assessment)) { - if (assessment.artskartWaterModel === null) assessment.artskartWaterModel = {}; - if (this.initialWaterAreas === null && this.GetIsRegionalAssessment(assessment)) { - const self = this; - getWaterAreas().then((data) => { - action(() => { - self.initialWaterAreas = data; - const ass = assessment; - ass.artskartWaterModel.isWaterArea = ass.artskartWaterModel.isWaterArea ? ass.artskartWaterModel.isWaterArea : false; - self.reCreateartskartWaterModelArea({ ass, initialWaterAreas: self.initialWaterAreas }); - })(); - }); - } - if (assessment.artskartWaterModel && assessment.artskartWaterModel.areas) { - this.selectedWaterArea = assessment.artskartWaterModel.areas - .filter(x => x.disabled === 0) - .map(x => x.globalId); - } - } - } + getWaterFeatures = (assessment) => { + if (this.initialWaterAreas && assessment && assessment.artskartWaterModel) { + return assessment.artskartWaterModel.isWaterArea + ? this.initialWaterAreas.waterArea + : this.initialWaterAreas.waterRegion; } + }; - reCreateartskartWaterModelArea = ({ ass, initialWaterAreas }) => { - if (ass.artskartWaterModel.areas) return; - const waterObject = ass.artskartWaterModel.isWaterArea ? initialWaterAreas.areaState : initialWaterAreas.regionState; - ass.artskartWaterModel.areas = []; - for (var key in waterObject) { - // console.log('adding?', key); - if (ass.artskartWaterModel.areas.find(x => x.globalId === key) === undefined) { - // console.log('adding', key); - ass.artskartWaterModel.areas.push(waterObject[key]); - } else { - console.log('not adding', key) - } - } + checkArea = (property) => { + // finds all the objects with id's that should be hidden + if (property < 8) { + return "D1D2E"; + } else if (property < 40) { + return "E"; + } else { + return ""; } + }; - getWaterFeatures = (assessment) => { - if (this.initialWaterAreas && assessment && assessment.artskartWaterModel) { - return assessment.artskartWaterModel.isWaterArea ? this.initialWaterAreas.waterArea : this.initialWaterAreas.waterRegion; + addRegion = ({ name, globalId, mapIndex }) => { + // console.log('clicked:', name, globalId, mapIndex); + const { + appState: { assessment }, + appState, + appState: { infoTabs }, + } = this.props; + const waterObject = assessment.artskartWaterModel.areas.find( + (x) => x.globalId === globalId + ); + if (waterObject && !waterObject.disabled) { + const currentState = mapOlFunc.convertMapIndex2State(mapIndex); + const areaValue = waterObject[`state${currentState}`] === 0 ? 1 : 0; + waterObject[`state${currentState}`] = areaValue; + if (areaValue === 1) { + waterObject.state2 = 0; + switch (currentState) { + case 0: + waterObject.state1 = 1; + case 1: + waterObject.state3 = 1; } + } else if ( + waterObject.state0 === 0 && + waterObject.state1 === 0 && + waterObject.state3 === 0 + ) { + waterObject.state2 = 1; + } + this.waterIsChanged++; } - - checkArea = (property) => { - // finds all the objects with id's that should be hidden - if ( property < 8 ) { - return "D1D2E" - } else if (property < 40 ) { - return "E" - } - else { - return "" - } - } + }; - addRegion = ({ name, globalId, mapIndex }) => { - // console.log('clicked:', name, globalId, mapIndex); - const {appState:{assessment}, appState, appState:{infoTabs}} = this.props; - const waterObject = assessment.artskartWaterModel.areas.find(x => x.globalId === globalId); - if (waterObject && !waterObject.disabled) { - const currentState = mapOlFunc.convertMapIndex2State(mapIndex); - const areaValue = waterObject[`state${currentState}`] === 0 ? 1 : 0; - waterObject[`state${currentState}`] = areaValue; - if (areaValue === 1) { - waterObject.state2 = 0; - switch (currentState) { - case 0: - waterObject.state1 = 1; - case 1: - waterObject.state3 = 1; - } - } else if (waterObject.state0 === 0 && waterObject.state1 === 0 && waterObject.state3 === 0) { - waterObject.state2 = 1; - } - this.waterIsChanged++; - } + handleWaterCheck = ({ waterObject, state, value }) => { + // console.log('handleWaterCheck', waterObject, state, value) + const { + appState: { assessment }, + appState, + appState: { infoTabs }, + } = this.props; + const area = assessment.artskartWaterModel.areas.find( + (x) => x.globalId === waterObject.globalId + ); + if (area) { + area.state0 = waterObject.state0; + area.state1 = waterObject.state1; + area.state2 = waterObject.state2; + area.state3 = waterObject.state3; } + this.waterIsChanged++; + }; - handleWaterCheck = ({waterObject, state, value}) => { - // console.log('handleWaterCheck', waterObject, state, value) - const {appState:{assessment}, appState, appState:{infoTabs}} = this.props; - const area = assessment.artskartWaterModel.areas.find(x => x.globalId === waterObject.globalId); - if (area) { - area.state0 = waterObject.state0; - area.state1 = waterObject.state1; - area.state2 = waterObject.state2; - area.state3 = waterObject.state3; + handleOverførFraSimpleMap = ({ selectedItems, newIsWaterArea }) => { + // console.log('handleOverførFraSimpleMap', selectedItems); + const { + appState: { assessment }, + appState, + appState: { infoTabs }, + } = this.props; + // console.log('handleOverførFraSimpleMap', assessment.artskartWaterModel.isWaterArea, newIsWaterArea); + if (assessment.artskartWaterModel.isWaterArea != newIsWaterArea) + assessment.artskartWaterModel.areas = undefined; + assessment.artskartWaterModel.isWaterArea = newIsWaterArea; + this.reCreateartskartWaterModelArea({ + ass: assessment, + initialWaterAreas: this.initialWaterAreas, + }); + const deSelectArea = (area) => { + area.disabled = 1; + area.selected = 0; + area.state0 = 0; + area.state1 = 0; + area.state2 = 1; + area.state3 = 0; + }; + assessment.artskartWaterModel.areas.forEach((area) => { + if (selectedItems) { + if (selectedItems.indexOf(area.globalId) < 0) { + deSelectArea(area); + } else { + area.disabled = 0; + area.selected = 1; } - this.waterIsChanged++; - } + } else { + deSelectArea(area); + } + }); - handleOverførFraSimpleMap = ({selectedItems, newIsWaterArea}) => { - // console.log('handleOverførFraSimpleMap', selectedItems); - const {appState:{assessment}, appState, appState:{infoTabs}} = this.props; - // console.log('handleOverførFraSimpleMap', assessment.artskartWaterModel.isWaterArea, newIsWaterArea); - if (assessment.artskartWaterModel.isWaterArea != newIsWaterArea) assessment.artskartWaterModel.areas = undefined; - assessment.artskartWaterModel.isWaterArea = newIsWaterArea; - this.reCreateartskartWaterModelArea({ ass: assessment, initialWaterAreas: this.initialWaterAreas }); - const deSelectArea = (area) => { - area.disabled = 1; - area.selected = 0; - area.state0 = 0; - area.state1 = 0; - area.state2 = 1; - area.state3 = 0; - }; - assessment.artskartWaterModel.areas.forEach(area => { - if (selectedItems) { - if (selectedItems.indexOf(area.globalId) < 0) { - deSelectArea(area); - } else { - area.disabled = 0; - area.selected = 1; - } - } else { - deSelectArea(area); - } - }); + this.selectedWaterArea = assessment.artskartWaterModel.areas + .filter((x) => x.disabled === 0) + .map((x) => x.globalId); + }; - this.selectedWaterArea = assessment.artskartWaterModel.areas - .filter(x => x.disabled === 0) - .map(x => x.globalId); - } + handleOverførFraArtskart = ({ + selectionGeometry, + countylist, + newWaterAreas, + areadata, + observations, + editStats, + }) => { + const aps = this.props.appState; + const ass = aps.assessment; - handleOverførFraArtskart = ({ selectionGeometry, countylist, newWaterAreas, areadata, observations, editStats }) => { - const aps = this.props.appState; - const ass = aps.assessment; + if (this.GetIsRegionalAssessment(ass)) { + if (newWaterAreas) { + newWaterAreas.forEach((x) => { + const area = ass.artskartWaterModel.areas.find( + (a) => a.globalId === x.globalId + ); + if (area) { + area.state0 = x.intersects ? 1 : 0; + area.state1 = x.intersects ? 1 : 0; + area.state2 = !x.intersects ? 1 : 0; + area.state3 = x.intersects ? 1 : 0; + } + }); + this.selectedWaterArea = ass.artskartWaterModel.areas + .filter((x) => x.disabled === 0) + .map((x) => x.globalId); + this.waterIsChanged++; + } + } - if (this.GetIsRegionalAssessment(ass)) { - if (newWaterAreas) { - newWaterAreas.forEach(x => { - const area = ass.artskartWaterModel.areas.find(a => a.globalId === x.globalId); - if (area) { - area.state0 = x.intersects ? 1 : 0; - area.state1 = x.intersects ? 1 : 0; - area.state2 = !x.intersects ? 1 : 0; - area.state3 = x.intersects ? 1 : 0; - } - }); - this.selectedWaterArea = ass.artskartWaterModel.areas - .filter(x => x.disabled === 0) - .map(x => x.globalId); - this.waterIsChanged++; - } - } + ass.riskAssessment.AOOknownInput = areadata.AreaOfOccupancy; + ass.currentSpreadArea = areadata.AreaExtentOfOccurrence; + ass.artskartExcludedLocalities = areadata.ExcludedLocalities; + ass.artskartManuellAdd = editStats.add; + ass.artskartManuellRemove = editStats.remove; + ass.artskartSistOverført = new Date(); + ass.artskartSelectionGeometry = selectionGeometry; + ass.riskAssessment.AOOendyear1 = ass.artskartModel.observationFromYear; + ass.riskAssessment.AOOendyear2 = ass.artskartModel.observationToYear; + if ( + ass.riskAssessment.AOOyear2 === undefined || + ass.riskAssessment.AOOyear2 == null + ) + ass.riskAssessment.AOOyear2 = ass.artskartModel.observationToYear; + if ( + ass.riskAssessment.AOOknown2 === undefined || + ass.riskAssessment.AOOknown2 == null + ) + ass.riskAssessment.AOOknown2 = ass.riskAssessment.AOOknownInput; - - ass.riskAssessment.AOOknownInput = areadata.AreaOfOccupancy; - ass.currentSpreadArea = areadata.AreaExtentOfOccurrence; - ass.artskartExcludedLocalities = areadata.ExcludedLocalities; - ass.artskartManuellAdd = editStats.add; - ass.artskartManuellRemove = editStats.remove; - ass.artskartSistOverført = new Date(); - ass.artskartSelectionGeometry = selectionGeometry; - ass.riskAssessment.AOOendyear1 = ass.artskartModel.observationFromYear; - ass.riskAssessment.AOOendyear2 = ass.artskartModel.observationToYear; - if (ass.riskAssessment.AOOyear2 === undefined || ass.riskAssessment.AOOyear2 == null) ass.riskAssessment.AOOyear2 = ass.artskartModel.observationToYear; - if (ass.riskAssessment.AOOknown2 === undefined || ass.riskAssessment.AOOknown2 == null) ass.riskAssessment.AOOknown2 = ass.riskAssessment.AOOknownInput; - - // TODO: Fylkesoversikt - avventer data fra API - if (countylist) { - let fo = countylist.reduce((acc, e) => { - acc[e.NAVN] = e.Status; - return acc; - }, {}); - ass.fylkesforekomster.forEach(f => { - f.state0 = fo[fylker[f.fylke]] > 0 ? 1 : 0; - if (f.state0 === 1) { - f.state2 = 0; - f.state1 = 1; - f.state3 = 1; - } else if ((parseInt(f.state0) + parseInt(f.state1) + parseInt(f.state3)) === 0) { - f.state2 = 1; - } - }); - // console.log('ass.fylkesforekomster', ass.fylkesforekomster); + // TODO: Fylkesoversikt - avventer data fra API + if (countylist) { + let fo = countylist.reduce((acc, e) => { + acc[e.NAVN] = e.Status; + return acc; + }, {}); + ass.fylkesforekomster.forEach((f) => { + f.state0 = fo[fylker[f.fylke]] > 0 ? 1 : 0; + if (f.state0 === 1) { + f.state2 = 0; + f.state1 = 1; + f.state3 = 1; + } else if ( + parseInt(f.state0) + parseInt(f.state1) + parseInt(f.state3) === + 0 + ) { + f.state2 = 1; } - - // Vi ønsker bare lagre redigeringer - const points2String = source => - observations.features - .filter(p => p.source === source) - .map(p => p.geometry.coordinates) - .map(p => p[0] + "," + p[1]) - .join(","); - ass.artskartAdded = points2String("add"); - ass.artskartRemoved = points2String("remove"); - // console.log('assessment52...', ass.artskartAdded, ass.artskartRemoved); + }); + // console.log('ass.fylkesforekomster', ass.fylkesforekomster); } - render() { - const renderAgain = this.isDirty; // code looks unused, but it makes the Artskart-module listen to changes - const {appState:{assessment}, appState, appState:{infoTabs}} = this.props; - const koder = appState.koder - const generalLabels = appState.codeLabels - const labels = appState.codeLabels.DistributionHistory + // Vi ønsker bare lagre redigeringer + const points2String = (source) => + observations.features + .filter((p) => p.source === source) + .map((p) => p.geometry.coordinates) + .map((p) => p[0] + "," + p[1]) + .join(","); + ass.artskartAdded = points2String("add"); + ass.artskartRemoved = points2String("remove"); + // console.log('assessment52...', ass.artskartAdded, ass.artskartRemoved); + }; + + render() { + const renderAgain = this.isDirty; // code looks unused, but it makes the Artskart-module listen to changes + const { + appState: { assessment }, + appState, + appState: { infoTabs }, + } = this.props; + const koder = appState.koder; + const generalLabels = appState.codeLabels; + const labels = appState.codeLabels.DistributionHistory; - return ( + return ( +
+
+

Utbredelse i Norge

+ {!this.initialWaterAreas && + this.GetIsRegionalAssessment(assessment) ? ( + <> +

+ Vurderingsområde (beta) +

+
+ ...henter vannregioner og vannområder +
+ + ) : null} + {this.initialWaterAreas && + this.GetIsRegionalAssessment(assessment) ? ( + <> +

+ Vurderingsområde (beta) +

+
+ +
+ + ) : null} +

Forekomstareal

+ {assessment.isDoorKnocker ? (
-
-

Utbredelse i Norge

- {!this.initialWaterAreas && this.GetIsRegionalAssessment(assessment) - ? <> -

Vurderingsområde (beta)

-
...henter vannregioner og vannområder
- - : null} - {this.initialWaterAreas && this.GetIsRegionalAssessment(assessment) - ? <> -

Vurderingsområde (beta)

-
- -
- - : null} -

Forekomstareal

- {assessment.isDoorKnocker - ?
-
-
-

Hvor mange 2 km x 2 km-ruter kan arten kolonisere i løpet av en 10 års-periode basert på én introduksjon til norsk natur (innenfor vurderingsperioden på 50 år)?

-

Hvor mange ytterligere introduksjoner til norsk natur antas arten å få i løpet av samme 10-års periode?

-

Totalt forekomstareal 10 år etter første introduksjon (km2)

-
-
- -
-
- -
-
-

Andel av antatt forekomstareal i sterkt endra natur (%)

- -
-
- :
-
- -
-
- {assessment.artskartSistOverført && (!!assessment.artskartAdded || !!assessment.artskartRemoved || assessment.artskartSelectionGeometry) - ? Sist overført fra Artskart {beskrivTidSiden(assessment.artskartSistOverført, appState.codeLabels.Timing)}. - : null} - {assessment.artskartManuellAdd > 0 - ? {assessment.artskartManuellAdd} {assessment.artskartManuellAdd === 1 ? "rute" : "ruter"} ble manuelt lagt til. - : null} - {assessment.artskartManuellRemove > 0 - ? {assessment.artskartManuellRemove} {assessment.artskartManuellRemove === 1 ? "rute" : "ruter"} ble manuelt fjernet. - : null} - {assessment.artskartSelectionGeometry - ? Et polygon som ekskluderer {assessment.artskartExcludedLocalities} {assessment.artskartExcludedLocalities=== 1 ? "rute" : "ruter"} har blitt lagt til. - : null} -
- {(!!assessment.artskartAdded || !!assessment.artskartRemoved || assessment.artskartSelectionGeometry) - ?
- -
- : null} -

Basert på periode:

-
-
-

f.o.m. år (t0)

- -
-
-

t.o.m. år

- -
-
-
-
-
-

Forekomstareal i dag (km2):

- {!assessment.isDoorKnocker - ?
- Kjent - -
- : null} -
- -

Forekomstareal om 50 år (km2)

-
-
- -
-
- -
-
-

Andel av kjent forekomstareal i sterkt endra natur (%)

- -
- {assessment.speciesStatus == "C3" - ?
-

{assessment.isRegionallyAlien ? generalLabels.SpeciesStatus.statusInNorwayRegionallyAlien : generalLabels.SpeciesStatus.statusInNorway } {generalLabels.SpeciesStatus.highestCategoryPerToday}

-
- -
- : null} -
- } -
- -
- -
-
-
-
-
-

Regionvis utbredelse

- {assessment.fylkesforekomster ? (assessment.fylkesforekomster.map(e => e.state ? '' : '')) : '' /* todo: WHAT??? */ } - {!(this.GetIsRegionalAssessment(assessment)) - ? - : null} - {this.initialWaterAreas && this.GetIsRegionalAssessment(assessment) - ?
- {this.initialWaterAreas - ? +
+

+ Hvor mange 2 km x 2 km-ruter kan arten kolonisere i løpet av + en 10 års-periode basert på én introduksjon til norsk natur + (innenfor vurderingsperioden på 50 år)? +

+

+ Hvor mange ytterligere introduksjoner til norsk natur antas + arten å få i løpet av samme 10-års periode? +

+

+ Totalt forekomstareal{" "} + 10 år etter første introduksjon (km2) +

+
+
+ +
+
+ +
+
+

Andel av antatt forekomstareal i sterkt endra natur (%)

+ +
+
+ ) : ( +
+
+ +
+
+ {assessment.artskartSistOverført && + (!!assessment.artskartAdded || + !!assessment.artskartRemoved || + assessment.artskartSelectionGeometry) ? ( + + Sist overført fra Artskart{" "} + {beskrivTidSiden( + assessment.artskartSistOverført, + appState.codeLabels.Timing + )} + .{" "} + + ) : null} + {assessment.artskartManuellAdd > 0 ? ( + + {assessment.artskartManuellAdd}{" "} + {assessment.artskartManuellAdd === 1 ? "rute" : "ruter"} ble + manuelt lagt til.{" "} + + ) : null} + {assessment.artskartManuellRemove > 0 ? ( + + {assessment.artskartManuellRemove}{" "} + {assessment.artskartManuellRemove === 1 ? "rute" : "ruter"}{" "} + ble manuelt fjernet. + + ) : null} + {assessment.artskartSelectionGeometry ? ( + + Et polygon som ekskluderer{" "} + {assessment.artskartExcludedLocalities}{" "} + {assessment.artskartExcludedLocalities === 1 + ? "rute" + : "ruter"}{" "} + har blitt lagt til. + + ) : null} +
+ {!!assessment.artskartAdded || + !!assessment.artskartRemoved || + assessment.artskartSelectionGeometry ? ( +
+ +
+ ) : null} +

Basert på periode:

+
+
+

+ {" "} + f.o.m. år (t0) +

+ +
+
+

t.o.m. år

+ +
+
+
+
+
+

+ Forekomstareal i dag (km2): +

+ {!assessment.isDoorKnocker ? ( +
+ Kjent + - : null} -
-
-

Kjent utbredelse i dag

- -
-
-

Antatt utbredelse i dag

- -
-
-

Antatt utbredelse om 50 år

- -
-
-
- : null} - - - {assessment.isDoorKnocker - ?

Beskriv antatt utbredelse (overføres til oppsummeringen)

- :

Beskriv utbredelseshistorikk og dagens utbredelse i Norge (overføres til oppsummeringen)

- } - -
- {!assessment.isDoorKnocker - ?
-

Annen informasjon (ikke obligatorisk)

-
-
-

Kjent utbredelsesområde (km2)

- {/*

Bestandsstørrelse

*/} -
-
- - {/* */} -
-
-
- : null } - - {assessment.spreadHistory.length > 0 - ?
-

Utbredelseshistorikk 2018

- - {assessment.spreadHistoryDomesticDocumentation - ?
-

{labels.previousInfo}. {labels.mustTransfer}

-

- { - const existing = assessment.riskAssessment.criteriaDocumentationDomesticSpread - const newstring = !existing - ? assessment.spreadHistoryDomesticDocumentation - : existing + assessment.spreadHistoryDomesticDocumentation - assessment.riskAssessment.criteriaDocumentationDomesticSpread = newstring - assessment.spreadHistoryDomesticDocumentation = null - }}>{labels.transfer} -


-
- : null } -
- : null} - {config.showPageHeaders - ?

{appState.kodeLabels.DistributionHistory.heading}

- :
} +
+ ) : null} +
+ +

+ Forekomstareal om 50 år (km2) +

+ +
+ +
+ + +
+
+

Andel av kjent forekomstareal i sterkt endra natur (%)

+ +
+ {assessment.speciesStatus == "C3" ? ( +
+

+ {" "} + {assessment.isRegionallyAlien + ? generalLabels.SpeciesStatus + .statusInNorwayRegionallyAlien + : generalLabels.SpeciesStatus.statusInNorway}{" "} + {generalLabels.SpeciesStatus.highestCategoryPerToday} +

+
+ +
+ ) : null} - ) - } -} \ No newline at end of file + )} +
+
+ +
+
+ +
+

Regionvis utbredelse

+ { + assessment.fylkesforekomster + ? assessment.fylkesforekomster.map((e) => (e.state ? "" : "")) + : "" /* todo: WHAT??? */ + } + {!this.GetIsRegionalAssessment(assessment) ? ( + + ) : null} + {this.initialWaterAreas && + this.GetIsRegionalAssessment(assessment) ? ( +
+ {this.initialWaterAreas ? ( + + ) : null} +
+
+

Kjent utbredelse i dag

+ +
+
+

Antatt utbredelse i dag

+ +
+
+

Antatt utbredelse om 50 år

+ +
+
+
+ ) : null} + + + {assessment.isDoorKnocker ? ( +

+ Beskriv antatt utbredelse (overføres til oppsummeringen) +

+ ) : ( +

+ Beskriv utbredelseshistorikk og dagens utbredelse i Norge{" "} + (overføres til oppsummeringen) +

+ )} + +
+ {!assessment.isDoorKnocker ? ( +
+

Annen informasjon (ikke obligatorisk)

+
+
+

+ Kjent utbredelsesområde (km2) +

+ {/*

Bestandsstørrelse

*/} +
+
+ + {/* */} +
+
+
+ ) : null} + + {assessment.spreadHistory.length > 0 ? ( +
+

Utbredelseshistorikk 2018

+ + {assessment.spreadHistoryDomesticDocumentation ? ( +
+

+ {labels.previousInfo}. {labels.mustTransfer} +

+

+ { + const existing = + assessment.riskAssessment + .criteriaDocumentationDomesticSpread; + const newstring = !existing + ? assessment.spreadHistoryDomesticDocumentation + : existing + + assessment.spreadHistoryDomesticDocumentation; + assessment.riskAssessment.criteriaDocumentationDomesticSpread = + newstring; + assessment.spreadHistoryDomesticDocumentation = null; + }} + > + {labels.transfer} + +


+
+ ) : null} +
+ ) : null} + {config.showPageHeaders ? ( +

{appState.kodeLabels.DistributionHistory.heading}

+ ) : ( +
+ )} + + ); + } +} diff --git a/Prod.Web/src/components/map/MapOpenLayers.js b/Prod.Web/src/components/map/MapOpenLayers.js index 69975e30..27eb3d05 100644 --- a/Prod.Web/src/components/map/MapOpenLayers.js +++ b/Prod.Web/src/components/map/MapOpenLayers.js @@ -1,581 +1,741 @@ -import React, { useRef, useState, useEffect, useLayoutEffect } from "react" -import 'ol/ol.css'; -import styles from './MapOpenLayers.css'; // don't delete. it's used to move buttons to the right side +import React, { useRef, useState, useEffect, useLayoutEffect } from "react"; +import "ol/ol.css"; +import styles from "./MapOpenLayers.css"; // don't delete. it's used to move buttons to the right side import MapContext from "./MapContext"; -import { intersect, multiPolygon as TurfMultiPolygon } from '@turf/turf'; -import { Feature, Map, Overlay, View } from 'ol'; -import { Control, defaults as defaultControls } from 'ol/control'; -import { Draw } from 'ol/interaction'; -import { Tile as TileLayer, Vector as VectorLayer } from 'ol/layer'; -import { Point, Polygon } from 'ol/geom'; -import { GeoJSON as GeoJSONFormat } from 'ol/format'; -import Proj4 from 'proj4'; -import { addProjection, Projection } from 'ol/proj'; -import { Vector as VectorSource, WMTS as WmtsSource } from 'ol/source'; -import mapOlFunc from './MapOlFunctions'; -import config from '../../config'; +import { intersect, multiPolygon as TurfMultiPolygon } from "@turf/turf"; +import { Feature, Map, Overlay, View } from "ol"; +import { Control, defaults as defaultControls } from "ol/control"; +import { Draw } from "ol/interaction"; +import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer"; +import { Point, Polygon } from "ol/geom"; +import { GeoJSON as GeoJSONFormat } from "ol/format"; +import Proj4 from "proj4"; +import { addProjection, Projection } from "ol/proj"; +import { Vector as VectorSource, WMTS as WmtsSource } from "ol/source"; +import mapOlFunc from "./MapOlFunctions"; +import config from "../../config"; const MapOpenLayers = ({ - showWaterAreas, - artskartWaterModel, - waterFeatures, - onAddPoint, - onEdit, - style, - mapBounds, - geojson, - selectionGeometry, - onClickPoint, - setWaterAreas, - setIsLoading, - isLoading, - onClosed + showWaterAreas, + artskartWaterModel, + waterFeatures, + onAddPoint, + onEdit, + style, + mapBounds, + geojson, + selectionGeometry, + onClickPoint, + setWaterAreas, + setIsLoading, + isLoading, + onClosed, + token, }) => { - const mapRef = useRef(); - const [visibleLegend, setVisibleLegend] = useState(false); - const [map, setMap] = useState(null); - const [lastIsWaterArea, setLastIsWaterArea] = useState(artskartWaterModel ? artskartWaterModel.isWaterArea : undefined); - const [waterLayerName, setWaterLayerName] = useState(undefined); - const [pointerMoveTarget, setPointerMoveTarget] = useState(undefined); - const waterFieldName = artskartWaterModel && artskartWaterModel.isWaterArea ? 'vannomraadenavn' : 'vannregionnavn'; - const mapZoom = 3.7; - const assessmentArea = artskartWaterModel && artskartWaterModel.areas ? artskartWaterModel.areas.filter(x => x.disabled === 0).map(x => x.globalId) : undefined; - let mapObject; - let mapCenter = []; - let mouseoverfeature = null; - let featureOver; - let drawPolygonInteraction; - let waterIntersections = {}; - - //if (!mapBounds) mapBounds = [[57, 4.3], [71.5, 32.5]]; - - // console.log('MapOpenLayers', geojson, selectionGeometry); - - const transformCoordinate = (fromEpsgCode, toEpsgCode, coordinate) => { - if (fromEpsgCode === toEpsgCode) { - // console.log('transformCoordinate unchanged', fromEpsgCode, toEpsgCode); - return coordinate; - } - - if (Array.isArray(coordinate) && typeof coordinate[0] !== 'number') { - if(typeof coordinate[0] === 'string') { - for (let i = 0; i < coordinate.length; ++i) { - coordinate[i] = parseFloat(coordinate[i]); - } - } else { - console.error('unknown coordinate', coordinate[0]); - } - } - return Proj4(`EPSG:${fromEpsgCode}`, `EPSG:${toEpsgCode}`, coordinate); - }; + const mapRef = useRef(); + const [visibleLegend, setVisibleLegend] = useState(false); + const [map, setMap] = useState(null); + const [lastIsWaterArea, setLastIsWaterArea] = useState( + artskartWaterModel ? artskartWaterModel.isWaterArea : undefined + ); + const [waterLayerName, setWaterLayerName] = useState(undefined); + const [pointerMoveTarget, setPointerMoveTarget] = useState(undefined); + const waterFieldName = + artskartWaterModel && artskartWaterModel.isWaterArea + ? "vannomraadenavn" + : "vannregionnavn"; + const mapZoom = 3.7; + const assessmentArea = + artskartWaterModel && artskartWaterModel.areas + ? artskartWaterModel.areas + .filter((x) => x.disabled === 0) + .map((x) => x.globalId) + : undefined; + let mapObject; + let mapCenter = []; + let mouseoverfeature = null; + let featureOver; + let drawPolygonInteraction; + let waterIntersections = {}; + + //if (!mapBounds) mapBounds = [[57, 4.3], [71.5, 32.5]]; + + // console.log('MapOpenLayers', geojson, selectionGeometry); + + const transformCoordinate = (fromEpsgCode, toEpsgCode, coordinate) => { + if (fromEpsgCode === toEpsgCode) { + // console.log('transformCoordinate unchanged', fromEpsgCode, toEpsgCode); + return coordinate; + } - const createMarker = (coordinate) => { - if (mouseoverfeature) { - // console.log('mouseover', mouseoverfeature.getProperties()); - const latlng = mouseoverfeature.get('latlng'); - removeMarker(latlng); - } else { - // console.log('createMarker()', coordinate); - onAddPoint({ - latlng: - { - lng: coordinate[0], - lat: coordinate[1] - } - }); + if (Array.isArray(coordinate) && typeof coordinate[0] !== "number") { + if (typeof coordinate[0] === "string") { + for (let i = 0; i < coordinate.length; ++i) { + coordinate[i] = parseFloat(coordinate[i]); } - }; - const removeMarker = (coordinate) => { - onClickPoint({ - lng: coordinate[0], - lat: coordinate[1] - }); - }; + } else { + console.error("unknown coordinate", coordinate[0]); + } + } + return Proj4(`EPSG:${fromEpsgCode}`, `EPSG:${toEpsgCode}`, coordinate); + }; + + const createMarker = (coordinate) => { + if (mouseoverfeature) { + // console.log('mouseover', mouseoverfeature.getProperties()); + const latlng = mouseoverfeature.get("latlng"); + removeMarker(latlng); + } else { + // console.log('createMarker()', coordinate); + onAddPoint({ + latlng: { + lng: coordinate[0], + lat: coordinate[1], + }, + }); + } + }; + const removeMarker = (coordinate) => { + onClickPoint({ + lng: coordinate[0], + lat: coordinate[1], + }); + }; - const calculateWaterIntersection = (mapObject, fieldName) => { - if (!showWaterAreas) { - setIsLoading(false); - return; - } - setWaterAreas(); - setIsLoading(true); - waterIntersections = {}; - const layers = mapObject.getLayers().getArray(); - // const areaLayer = layers.filter((layer) => layer.get('name') === 'areaLayer' ? true : false)[0]; - const markerLayer = layers.filter((layer) => layer.get('name') === 'markerLayer' ? true : false)[0]; - const waterLayer = layers.filter(layer => layer.get('name') === 'Vatn')[0]; - const waterSelectedLayer = layers.filter(layer => layer.get('name') === 'VatnSelected')[0]; - if (!markerLayer || !waterLayer || !waterSelectedLayer) { - setIsLoading(false); - return; - } + const calculateWaterIntersection = (mapObject, fieldName) => { + if (!showWaterAreas) { + setIsLoading(false); + return; + } + setWaterAreas(); + setIsLoading(true); + waterIntersections = {}; + const layers = mapObject.getLayers().getArray(); + // const areaLayer = layers.filter((layer) => layer.get('name') === 'areaLayer' ? true : false)[0]; + const markerLayer = layers.filter((layer) => + layer.get("name") === "markerLayer" ? true : false + )[0]; + const waterLayer = layers.filter( + (layer) => layer.get("name") === "Vatn" + )[0]; + const waterSelectedLayer = layers.filter( + (layer) => layer.get("name") === "VatnSelected" + )[0]; + if (!markerLayer || !waterLayer || !waterSelectedLayer) { + setIsLoading(false); + return; + } - waterSelectedLayer.getSource().clear(); + waterSelectedLayer.getSource().clear(); + + const features = markerLayer + .getSource() + .getFeatures() + .filter( + (f) => + f.getProperties().properties && + f.getProperties().properties.category && + f.getProperties().properties.category === "inside" + ); + if (features.length === 0) { + setIsLoading(false); + return; + } - const features = markerLayer.getSource().getFeatures().filter(f => f.getProperties().properties && f.getProperties().properties.category && f.getProperties().properties.category === 'inside'); - if (features.length === 0) { - setIsLoading(false); - return; - } + const waterFeatures = waterLayer.getSource().getFeatures(); + if (waterFeatures.length === 0) { + setIsLoading(false); + return; + } - const waterFeatures = waterLayer.getSource().getFeatures(); - if (waterFeatures.length === 0) { - setIsLoading(false); - return; - } + const createTurfPoint = (feature) => { + const coordinate = feature.getGeometry().getCoordinates(); + const coordinates = [ + [ + [coordinate[0], coordinate[1]], + [coordinate[0] + 0.1, coordinate[1]], + [coordinate[0] + 0.1, coordinate[1] + 0.1], + [coordinate[0], coordinate[1] + 0.1], + [coordinate[0], coordinate[1]], + ], + ]; + return new TurfMultiPolygon(coordinates, feature.getProperties()); + // return new TurfPoint(feature.getGeometry().getCoordinates(), feature.getProperties()); + }; + const createTurfMultiPolygon = (feature) => { + return new TurfMultiPolygon( + feature.getGeometry().getCoordinates(), + feature.getProperties() + ); + }; - const createTurfPoint = (feature) => { - const coordinate = feature.getGeometry().getCoordinates(); - const coordinates = [[ - [coordinate[0], coordinate[1]], - [coordinate[0]+0.1, coordinate[1]], - [coordinate[0]+0.1, coordinate[1]+0.1], - [coordinate[0], coordinate[1]+0.1], - [coordinate[0], coordinate[1]], - ]]; - return new TurfMultiPolygon(coordinates, feature.getProperties()); - // return new TurfPoint(feature.getGeometry().getCoordinates(), feature.getProperties()); - } - const createTurfMultiPolygon = (feature) => { - return new TurfMultiPolygon(feature.getGeometry().getCoordinates(), feature.getProperties()); + const theFeatures = features.map((f) => createTurfPoint(f)); + const theWaterFeatures = waterFeatures.map((f) => + createTurfMultiPolygon(f) + ); + + // console.log('calculate intersections..'); + const waterIntersectionFeatures = []; + theFeatures.forEach((theFeature) => { + // console.log('featurecoord', theFeature.getGeometry().getCoordinates()); + theWaterFeatures.forEach((theWaterFeature, j) => { + if (waterFeatures[j].get("disabled") === false) { + const featureName = waterFeatures[j].get(fieldName); + // console.log('intersect', featureName, waterFeatures[j].get('disabled')); + if ( + !waterIntersections.hasOwnProperty(featureName) || + (waterIntersections.hasOwnProperty(featureName) && + !waterIntersections[featureName].intersects) + ) { + const intersects = intersect(theWaterFeature, theFeature); + // console.log('theWaterFeature.properties', theWaterFeature.properties); + waterIntersections[featureName] = { + name: featureName, + isWaterArea: lastIsWaterArea, + intersects: intersects !== null, + globalId: theWaterFeature.properties["globalID"], + }; + if (intersects !== null) + waterIntersectionFeatures.push(waterFeatures[j]); + } } + }); + }); - const theFeatures = features.map(f => createTurfPoint(f)); - const theWaterFeatures = waterFeatures.map(f => createTurfMultiPolygon(f)); - - // console.log('calculate intersections..'); - const waterIntersectionFeatures = []; - theFeatures.forEach(theFeature => { - // console.log('featurecoord', theFeature.getGeometry().getCoordinates()); - theWaterFeatures.forEach((theWaterFeature, j) => { - if (waterFeatures[j].get('disabled') === false) { - const featureName = waterFeatures[j].get(fieldName); - // console.log('intersect', featureName, waterFeatures[j].get('disabled')); - if (!waterIntersections.hasOwnProperty(featureName) || (waterIntersections.hasOwnProperty(featureName) && !waterIntersections[featureName].intersects)) { - const intersects = intersect(theWaterFeature, theFeature); - // console.log('theWaterFeature.properties', theWaterFeature.properties); - waterIntersections[featureName] = { - name: featureName, - isWaterArea: lastIsWaterArea, - intersects: intersects !== null, - globalId: theWaterFeature.properties['globalID'] - }; - if (intersects !== null) waterIntersectionFeatures.push(waterFeatures[j]); - } - } - }); - }); - - setWaterAreas(Object.values(waterIntersections)); - - waterSelectedLayer.getSource().addFeatures(waterIntersectionFeatures); - setIsLoading(false); + setWaterAreas(Object.values(waterIntersections)); + + waterSelectedLayer.getSource().addFeatures(waterIntersectionFeatures); + setIsLoading(false); + }; + + const setPointerMoveForWaterLayer = (mapObject, fieldName) => { + if (!mapObject) return; + + const hoverLayer = mapObject + .getLayers() + .getArray() + .filter((layer) => layer.get("name") === "hoverLayer")[0]; + + const pointermove = (e) => { + if (isLoading) return; + // console.log(`${e.pixel[0]},${e.pixel[1]}`); // check if pointermove is called multiple times + const layerName = "Vatn"; + const vatnLayer = mapObject + .getLayers() + .getArray() + .filter((layer) => (layer.get("name") === layerName ? true : false))[0]; + if (!vatnLayer) return; + const vatnSource = vatnLayer.getSource(); + if (!vatnSource) return; + + const vatn = []; + mapObject.forEachFeatureAtPixel(e.pixel, (f) => { + const featureLayerName = f.get("_layerName"); + if (featureLayerName && featureLayerName === layerName) { + vatn.push(f); + return true; + } + return false; + }); + + const hoverSource = hoverLayer.getSource(); + if (vatn && vatn.length > 0) { + const name = vatn[0].get(fieldName); + if (featureOver && featureOver.get(fieldName) === name) return; + if (featureOver) hoverSource.clear(); + + featureOver = vatn[0]; + mapOlFunc.vectorFeatures[layerName] + .filter((feature) => feature.get(fieldName) === name) + .forEach((sourceFeature) => { + hoverSource.addFeature(sourceFeature); + }); + // setWaterAreas(name); + } else if ( + mapOlFunc.vectorFeatures[layerName] && + mapOlFunc.vectorFeatures[layerName].length > 0 + ) { + featureOver = undefined; + hoverSource.clear(); + // setWaterAreas(); + } }; - const setPointerMoveForWaterLayer = (mapObject, fieldName) => { - if (!mapObject) return; - - const hoverLayer = mapObject.getLayers().getArray().filter(layer => layer.get('name') === 'hoverLayer')[0]; - - const pointermove = (e) => { - if (isLoading) return; - // console.log(`${e.pixel[0]},${e.pixel[1]}`); // check if pointermove is called multiple times - const layerName = 'Vatn'; - const vatnLayer = mapObject.getLayers().getArray().filter((layer) => layer.get('name') === layerName ? true : false)[0]; - if (!vatnLayer) return; - const vatnSource = vatnLayer.getSource(); - if (!vatnSource) return; - - const vatn = []; - mapObject.forEachFeatureAtPixel(e.pixel, (f) => { - const featureLayerName = f.get('_layerName'); - if (featureLayerName && featureLayerName === layerName) { - vatn.push(f); - return true; - } - return false; - }); + if (pointerMoveTarget && pointerMoveTarget.listener) { + mapObject.un("pointermove", pointerMoveTarget.listener); + } - const hoverSource = hoverLayer.getSource(); - if (vatn && vatn.length > 0) { - const name = vatn[0].get(fieldName); - if (featureOver && featureOver.get(fieldName) === name) return; - if (featureOver) hoverSource.clear(); - - featureOver = vatn[0]; - mapOlFunc.vectorFeatures[layerName] - .filter((feature) => feature.get(fieldName) === name) - .forEach((sourceFeature) => { - hoverSource.addFeature(sourceFeature); - }); - // setWaterAreas(name); - } else if (mapOlFunc.vectorFeatures[layerName] && mapOlFunc.vectorFeatures[layerName].length > 0) { - featureOver = undefined; - hoverSource.clear(); - // setWaterAreas(); - } - }; + calculateWaterIntersection(mapObject, fieldName); - if (pointerMoveTarget && pointerMoveTarget.listener) { - mapObject.un('pointermove', pointerMoveTarget.listener); - } + setPointerMoveTarget(mapObject.on("pointermove", pointermove)); + }; - calculateWaterIntersection(mapObject, fieldName); + const cancelDrawPolygon = () => { + if (!mapObject) return; + // console.log('remove interaction'); + mapObject.removeInteraction(drawPolygonInteraction); + drawPolygonInteraction = null; + }; - setPointerMoveTarget(mapObject.on('pointermove', pointermove)); + const drawPolygon = () => { + if (!mapObject) return; + if (drawPolygonInteraction) { + // console.log('remove drawPolygonInteraction'); + cancelDrawPolygon(); + return; } - - const cancelDrawPolygon = () => { - if (!mapObject) return; - // console.log('remove interaction'); - mapObject.removeInteraction(drawPolygonInteraction); - drawPolygonInteraction = null; + // console.log('add drawPolygonInteraction'); + const markerLayer = mapObject + .getLayers() + .getArray() + .filter((layer) => + layer.get("name") === "markerLayer" ? true : false + )[0]; + if (!markerLayer) return; + const markerSource = markerLayer.getSource(); + if (!markerSource) return; + + drawPolygonInteraction = new Draw({ + source: markerSource, + type: "Polygon", + }); + // drawPolygonInteraction.on('change', (e) => { + // console.log('change drawPolygonInteraction'); + // }); + drawPolygonInteraction.on("drawend", (e) => { + // console.log('drawend', e.feature); + // const polygon = (new GeoJSONFormat()).writeFeature(e.feature); + // console.log('polygon', polygon); + setTimeout(() => { + cancelDrawPolygon(); + onEdit(new GeoJSONFormat().writeFeature(e.feature)); + }, 0); + }); + mapObject.addInteraction(drawPolygonInteraction); + }; + + useLayoutEffect(() => { + if (!showWaterAreas) return; + if (map === null) return; + if ( + lastIsWaterArea === undefined || + lastIsWaterArea === + (artskartWaterModel ? artskartWaterModel.isWaterArea : undefined) + ) + return; + + // reDrawWaterLayer(); + setWaterAreas(); + setIsLoading(true); + const waterSelectedLayer = map + .getLayers() + .getArray() + .filter((layer) => layer.get("name") === "VatnSelected")[0]; + if (waterSelectedLayer) waterSelectedLayer.getSource().clear(); + mapOlFunc.reDrawWaterLayer( + map, + 0, + undefined, + waterFeatures, + setLastIsWaterArea, + setPointerMoveForWaterLayer, + setWaterLayerName + ); + }); + + // on component mount + useEffect(() => { + const mapControls = []; + const customElement = document.createElement("div"); + customElement.className = "ol-legend ol-unselectable ol-control"; + + // customElement.appendChild(mapOlFunc.createButton({ + // click: toggleLegend, + // innerHTML: '|||', + // style: 'transform: rotate(90deg);' + // })); + + customElement.appendChild( + mapOlFunc.createButton({ + click: drawPolygon, + innerHTML: + '', + }) + ); + + mapControls.push(new Control({ element: customElement })); + + if (Proj4.defs(`EPSG:${config.mapEpsgCode}`) === undefined) { + Proj4.defs(`EPSG:${config.mapEpsgCode}`, config.mapEpsgDef); } + const projection = new Projection({ + code: `EPSG:${config.mapEpsgCode}`, + extent: mapOlFunc.extent, + units: "m", + }); + addProjection(projection); + + const mapExtent = [ + transformCoordinate(4326, config.mapEpsgCode, [ + mapBounds[0][1], + mapBounds[0][0], + ]), + transformCoordinate(4326, config.mapEpsgCode, [ + mapBounds[1][1], + mapBounds[1][0], + ]), + ].flat(); + mapCenter = [ + mapExtent[0] + (mapExtent[2] - mapExtent[0]) / 2, + mapExtent[1] + (mapExtent[3] - mapExtent[1]) / 2, + ]; + const hoverLayer = new VectorLayer({ + name: "hoverLayer", + source: new VectorSource({ wrapX: false, _text: false }), + style: (feature, resolution) => + mapOlFunc.hoverStyleFunction(feature, resolution, 0), + zIndex: 3, + }); + const areaLayer = new VectorLayer({ + name: "areaLayer", + source: new VectorSource({ wrapX: false }), + zIndex: 5, + }); + const markerLayer = new VectorLayer({ + name: "markerLayer", + source: new VectorSource({ wrapX: false }), + zIndex: 6, + }); + let options = { + view: new View({ + center: mapCenter, + projection: `EPSG:${config.mapEpsgCode}`, + maxZoom: mapOlFunc.numZoomLevels, + zoom: 0, // mapZoom + }), + layers: [ + new TileLayer({ + name: "Europakart", + opacity: 1, + extent: mapOlFunc.extent, + source: new WmtsSource({ + url: + "//gatekeeper3.geonorge.no/BaatGatekeeper/gk/gk.cache_wmts?gkt=" + + token, + // layer: 'europa', + layer: "europa_forenklet", + attributions: "Kartverket", + matrixSet: `EPSG:${config.mapEpsgCode}`, + format: "image/png", + projection: projection, + tileGrid: mapOlFunc.wmtsTileGrid( + mapOlFunc.numZoomLevels, + `EPSG:${config.mapEpsgCode}`, + projection + ), + style: "default", + wrapX: true, + crossOrigin: "anonymous", + }), + visible: true, + zIndex: 0, + }), + new TileLayer({ + name: "Norges grunnkart", + opacity: 1, + extent: mapOlFunc.extent, + source: new WmtsSource({ + url: + "//gatekeeper3.geonorge.no/BaatGatekeeper/gk/gk.cache_wmts?gkt=" + + token, + // layer: 'europa', + layer: "norges_grunnkart", + attributions: "Kartverket", + matrixSet: `EPSG:${config.mapEpsgCode}`, + format: "image/png", + projection: projection, + tileGrid: mapOlFunc.wmtsTileGrid( + mapOlFunc.numZoomLevels, + `EPSG:${config.mapEpsgCode}`, + projection + ), + style: "default", + wrapX: true, + crossOrigin: "anonymous", + }), + visible: true, + zIndex: 1, + }), + ], + controls: defaultControls({ attribution: false }).extend(mapControls), + overlays: [ + new Overlay({ + id: "overlay", + element: mapOlFunc.createPopupElement(true, 0), + }), + ], + }; - const drawPolygon = () => { - if (!mapObject) return; - if (drawPolygonInteraction) { - // console.log('remove drawPolygonInteraction'); - cancelDrawPolygon(); - return; - } - // console.log('add drawPolygonInteraction'); - const markerLayer = mapObject.getLayers().getArray().filter((layer) => layer.get('name') === 'markerLayer' ? true : false)[0]; - if (!markerLayer) return; - const markerSource = markerLayer.getSource(); - if (!markerSource) return; - - drawPolygonInteraction = new Draw({ - source: markerSource, - type: 'Polygon' - }); - // drawPolygonInteraction.on('change', (e) => { - // console.log('change drawPolygonInteraction'); - // }); - drawPolygonInteraction.on('drawend', (e) => { - // console.log('drawend', e.feature); - // const polygon = (new GeoJSONFormat()).writeFeature(e.feature); - // console.log('polygon', polygon); - setTimeout(() => { - cancelDrawPolygon(); - onEdit((new GeoJSONFormat()).writeFeature(e.feature)); - }, 0); - }); - mapObject.addInteraction(drawPolygonInteraction); - } + options.layers.push(hoverLayer); + options.layers.push(areaLayer); + options.layers.push(markerLayer); - useLayoutEffect(() => { - if (!showWaterAreas) return; - if (map === null) return; - if (lastIsWaterArea === undefined || lastIsWaterArea === (artskartWaterModel ? artskartWaterModel.isWaterArea : undefined)) return; - - // reDrawWaterLayer(); - setWaterAreas(); - setIsLoading(true); - const waterSelectedLayer = map.getLayers().getArray().filter(layer => layer.get('name') === 'VatnSelected')[0]; - if (waterSelectedLayer) waterSelectedLayer.getSource().clear(); - mapOlFunc.reDrawWaterLayer(map, 0, undefined, waterFeatures, setLastIsWaterArea, setPointerMoveForWaterLayer, setWaterLayerName); - }); + mapObject = new Map(options); - // on component mount - useEffect(() => { - const mapControls = []; - const customElement = document.createElement('div'); - customElement.className = 'ol-legend ol-unselectable ol-control'; + mapObject.setTarget(mapRef.current); + setMap(mapObject); + // console.log('map initialize', mapObject.getTarget()); - // customElement.appendChild(mapOlFunc.createButton({ - // click: toggleLegend, - // innerHTML: '|||', - // style: 'transform: rotate(90deg);' - // })); + // mapObject.updateSize(); - customElement.appendChild(mapOlFunc.createButton({ - click: drawPolygon, - innerHTML: '' - })); + mapObject.on("click", (e) => { + if (drawPolygonInteraction) return; + const coordinate = mapObject.getCoordinateFromPixel(e.pixel); + // console.log('click', geojson, coordinate, e); + // e.preventDefault(); + // e.originalEvent.preventDefault(); + e.stopPropagation(); + // e.originalEvent.stopPropagation(); - mapControls.push(new Control({ element: customElement })); + // setTimeout(() => { + createMarker(coordinate); + // }, 500); + }); - if (Proj4.defs(`EPSG:${config.mapEpsgCode}`) === undefined) { - Proj4.defs(`EPSG:${config.mapEpsgCode}`, config.mapEpsgDef); - } - const projection = new Projection({ - code: `EPSG:${config.mapEpsgCode}`, - extent: mapOlFunc.extent, - units: 'm' - }); - addProjection(projection); - - const mapExtent = [transformCoordinate(4326, config.mapEpsgCode, [mapBounds[0][1], mapBounds[0][0]]), transformCoordinate(4326, config.mapEpsgCode, [mapBounds[1][1], mapBounds[1][0]])].flat(); - mapCenter = [mapExtent[0] + (mapExtent[2] - mapExtent[0]) / 2, mapExtent[1] + (mapExtent[3] - mapExtent[1]) / 2]; - const hoverLayer = new VectorLayer({ - name: 'hoverLayer', - source: new VectorSource({wrapX: false, _text: false}), - style: (feature, resolution) => mapOlFunc.hoverStyleFunction(feature, resolution, 0), - zIndex: 3 - }); - const areaLayer = new VectorLayer({name: 'areaLayer', source: new VectorSource({wrapX: false}), zIndex: 5}); - const markerLayer = new VectorLayer({name: 'markerLayer', source: new VectorSource({wrapX: false}), zIndex: 6}); - let options = { - view: new View({ - center: mapCenter, - projection: `EPSG:${config.mapEpsgCode}`, - maxZoom: mapOlFunc.numZoomLevels, - zoom: 0// mapZoom - }), - layers: [ - new TileLayer({ - name: 'Europakart', - opacity: 1, - extent: mapOlFunc.extent, - source: new WmtsSource({ - url: '//opencache.statkart.no/gatekeeper/gk/gk.open_wmts?', - // layer: 'europa', - layer: 'europa_forenklet', - attributions: 'Kartverket', - matrixSet: `EPSG:${config.mapEpsgCode}`, - format: 'image/png', - projection: projection, - tileGrid: mapOlFunc.wmtsTileGrid(mapOlFunc.numZoomLevels, `EPSG:${config.mapEpsgCode}`, projection), - style: 'default', - wrapX: true, - crossOrigin: 'anonymous' - }), - visible: true, - zIndex: 0 - }), - new TileLayer({ - name: 'Norges grunnkart', - opacity: 1, - extent: mapOlFunc.extent, - source: new WmtsSource({ - url: '//opencache.statkart.no/gatekeeper/gk/gk.open_wmts?', - // layer: 'europa', - layer: 'norges_grunnkart', - attributions: 'Kartverket', - matrixSet: `EPSG:${config.mapEpsgCode}`, - format: 'image/png', - projection: projection, - tileGrid: mapOlFunc.wmtsTileGrid(mapOlFunc.numZoomLevels, `EPSG:${config.mapEpsgCode}`, projection), - style: 'default', - wrapX: true, - crossOrigin: 'anonymous' - }), - visible: true, - zIndex: 1 - }) - ], - controls: defaultControls({attribution: false}).extend(mapControls), - overlays: [new Overlay({ id: 'overlay', element: mapOlFunc.createPopupElement(true, 0)})] - }; - - options.layers.push(hoverLayer); - options.layers.push(areaLayer); - options.layers.push(markerLayer); - - mapObject = new Map(options); - - mapObject.setTarget(mapRef.current); - setMap(mapObject); - // console.log('map initialize', mapObject.getTarget()); - - // mapObject.updateSize(); - - mapObject.on('click', (e) => { - if (drawPolygonInteraction) return; - const coordinate = mapObject.getCoordinateFromPixel(e.pixel); - // console.log('click', geojson, coordinate, e); - // e.preventDefault(); - // e.originalEvent.preventDefault(); - e.stopPropagation(); - // e.originalEvent.stopPropagation(); - - // setTimeout(() => { - createMarker(coordinate); - // }, 500); - }); + const overlay = mapObject.getOverlayById("overlay"); + if (!overlay.getElement()) { + const elements = document.getElementsByClassName( + `ol-popup ol-popup-${0}` + ); + if (elements.length === 1) { + overlay.setElement(elements[0]); + } else { + overlay.setElement(mapOlFunc.createPopupElement(true, 0)); + } + } - const overlay = mapObject.getOverlayById('overlay'); - if (!overlay.getElement()) { - const elements = document.getElementsByClassName(`ol-popup ol-popup-${0}`); - if (elements.length === 1) { - overlay.setElement(elements[0]); - } else { - overlay.setElement(mapOlFunc.createPopupElement(true, 0)); - } + mapObject.on("pointermove", (e) => { + if (drawPolygonInteraction) return; + + const content = document.getElementsByClassName( + `ol-popup-content ol-popup-content-${0}` + )[0]; + content.innerHTML = ""; + + const markerLayer = mapObject + .getLayers() + .getArray() + .filter((layer) => + layer.get("name") === "markerLayer" ? true : false + )[0]; + if (!markerLayer) return; + const markerSource = markerLayer.getSource(); + if (!markerSource) return; + + const pixelOffset = 3; + const max = mapObject.getCoordinateFromPixel([ + e.pixel[0] + pixelOffset, + e.pixel[1] - pixelOffset, + ]); + const min = mapObject.getCoordinateFromPixel([ + e.pixel[0] - pixelOffset, + e.pixel[1] + pixelOffset, + ]); + const extent = [min[0], min[1], max[0], max[1]]; + const features = markerSource.getFeaturesInExtent(extent); + if (features && features.length > 0) { + // console.log('pointermove', features); + mouseoverfeature = features[0]; + mapObject.getTargetElement().style.cursor = "pointer"; + } else { + mouseoverfeature = null; + mapObject.getTargetElement().style.cursor = "crosshair"; + } + mapObject.forEachFeatureAtPixel(e.pixel, (f) => { + const featureLayerName = f.get("_layerName"); + if (featureLayerName && featureLayerName === "Vatn") { + if (content) { + // Show name with faded font if feature is disabled + let waterClassname = + f.get("disabled") === true + ? " class='ol-popup-feature-disabled'" + : ""; + content.innerHTML = `${f.get( + waterFieldName + )}

`; + overlay.getElement().style.opacity = 1; + overlay.setPosition(e.coordinate); + } + return true; } + return false; + }); - mapObject.on('pointermove', (e) => { - if (drawPolygonInteraction) return; - - const content = document.getElementsByClassName(`ol-popup-content ol-popup-content-${0}`)[0]; - content.innerHTML = ''; - - const markerLayer = mapObject.getLayers().getArray().filter((layer) => layer.get('name') === 'markerLayer' ? true : false)[0]; - if (!markerLayer) return; - const markerSource = markerLayer.getSource(); - if (!markerSource) return; - - const pixelOffset = 3; - const max = mapObject.getCoordinateFromPixel([e.pixel[0] + pixelOffset, e.pixel[1] - pixelOffset]); - const min = mapObject.getCoordinateFromPixel([e.pixel[0] - pixelOffset, e.pixel[1] + pixelOffset]); - const extent = [min[0], min[1], max[0], max[1]]; - const features = markerSource.getFeaturesInExtent(extent); - if (features && features.length > 0) { - // console.log('pointermove', features); - mouseoverfeature = features[0]; - mapObject.getTargetElement().style.cursor = 'pointer'; - } else { - mouseoverfeature = null; - mapObject.getTargetElement().style.cursor = 'crosshair'; - } - mapObject.forEachFeatureAtPixel(e.pixel, (f) => { - const featureLayerName = f.get('_layerName'); - if (featureLayerName && featureLayerName === 'Vatn') { - if (content) { - // Show name with faded font if feature is disabled - let waterClassname = f.get('disabled') === true ? ' class=\'ol-popup-feature-disabled\'' : ''; - content.innerHTML = `${f.get(waterFieldName)}

`; - overlay.getElement().style.opacity = 1; - overlay.setPosition(e.coordinate); - } - return true; - } - return false; - }); + if (content.innerHTML.length === 0) { + overlay.getElement().style.opacity = 0; + } + }); - if (content.innerHTML.length === 0) { - overlay.getElement().style.opacity = 0; - } + if (showWaterAreas) { + // 0: Kommune (0) + // 1: REGINE (1) + // 2: Vannområde (2) + // 3: Vannregion (3) + // 4: Vannregionmyndighet (4) + // 5: Vassdragsområde (5) + // 6: Økoregion kyst (6) + // 7: Økoregion fastland (7) + // 8: Klimasone (8) + // 9: Fylke (9) + + const setWaterLayerNameCallback = (name) => { + setWaterLayerName(name); + setPointerMoveForWaterLayer(mapObject, name); + }; + + // nve.geodataonline.no has new layers + // layerid = 14; // Vannregion + // layerid = 15; // Vannomraade + + setLastIsWaterArea(artskartWaterModel.isWaterArea); + + mapObject.addLayer( + mapOlFunc.createWaterLayer( + "Vatn", + 0, + artskartWaterModel, + waterFeatures, + projection, + undefined, + assessmentArea, + setWaterLayerNameCallback + ) + ); + mapOlFunc + .createWaterSelectedLayer("VatnSelected", projection) + .then((l) => { + mapObject.addLayer(l); }); + } - if (showWaterAreas) { - // 0: Kommune (0) - // 1: REGINE (1) - // 2: Vannområde (2) - // 3: Vannregion (3) - // 4: Vannregionmyndighet (4) - // 5: Vassdragsområde (5) - // 6: Økoregion kyst (6) - // 7: Økoregion fastland (7) - // 8: Klimasone (8) - // 9: Fylke (9) - - const setWaterLayerNameCallback = (name) => { - setWaterLayerName(name); - setPointerMoveForWaterLayer(mapObject, name); - }; - - // nve.geodataonline.no has new layers - // layerid = 14; // Vannregion - // layerid = 15; // Vannomraade - - setLastIsWaterArea(artskartWaterModel.isWaterArea); - - mapObject.addLayer(mapOlFunc.createWaterLayer('Vatn', 0, artskartWaterModel, waterFeatures, projection, undefined, assessmentArea, setWaterLayerNameCallback)); - mapOlFunc.createWaterSelectedLayer('VatnSelected', projection).then(l => { - mapObject.addLayer(l); - }); - } - - // Fit extent - mapObject.getView().fit(mapExtent); + // Fit extent + mapObject.getView().fit(mapExtent); - return () => mapObject.setTarget(undefined); - }, []); + return () => mapObject.setTarget(undefined); + }, []); - const drawUtbredelse = () => { - if (!map) return; + const drawUtbredelse = () => { + if (!map) return; - const layers = map.getLayers().getArray(); - const areaLayer = layers.filter((layer) => layer.get('name') === 'areaLayer' ? true : false)[0]; - const markerLayer = layers.filter((layer) => layer.get('name') === 'markerLayer' ? true : false)[0]; + const layers = map.getLayers().getArray(); + const areaLayer = layers.filter((layer) => + layer.get("name") === "areaLayer" ? true : false + )[0]; + const markerLayer = layers.filter((layer) => + layer.get("name") === "markerLayer" ? true : false + )[0]; - if (!areaLayer || !markerLayer) return; + if (!areaLayer || !markerLayer) return; - const areaSource = areaLayer.getSource(); - const markerSource = markerLayer.getSource(); - // console.log('MapOpenLayers - drawing...', areaSource); + const areaSource = areaLayer.getSource(); + const markerSource = markerLayer.getSource(); + // console.log('MapOpenLayers - drawing...', areaSource); - if (!areaSource || !markerSource) return; + if (!areaSource || !markerSource) return; - areaSource.clear(); - markerSource.clear(); + areaSource.clear(); + markerSource.clear(); - if (geojson && geojson.features && geojson.features.length > 0) { - let geojsonCrsCode = 4326; - if (geojson.crs) { - let geojsonCrsMatch = geojson.crs.properties.name.match(/\d+/); - if (geojsonCrsMatch) { - geojsonCrsCode = parseInt(geojsonCrsMatch[0]); - } - } - // console.log('geojsonCrs', geojsonCrsCode); - geojson.features.forEach(geojsonfeature => { - // console.log('feature', geojsonfeature); - let geometry = null; - const latlng = [...geojsonfeature.geometry.coordinates]; - // console.log(geojsonfeature.geometry.coordinates); - if (geojsonfeature.geometry.type === 'Point') { - const coordinate = transformCoordinate(geojsonCrsCode, config.mapEpsgCode, geojsonfeature.geometry.coordinates); - geometry = new Point(coordinate); - } else if (geojsonfeature.geometry.type === 'Polygon') { - if (assessmentArea === undefined) { - const coordinates = [[]]; - geojsonfeature.geometry.coordinates[0].forEach(coordinate => { - coordinates[0].push(transformCoordinate(geojsonCrsCode, config.mapEpsgCode, coordinate)); - }); - geometry = new Polygon(coordinates); - const polygonFeature = new Feature({ - geometry: geometry - }); - const polygonStyle = mapOlFunc.createStyle(geojsonfeature, style); - if (polygonStyle) { - polygonFeature.setStyle(polygonStyle); - } - // areaSource.addFeature(polygonFeature); - geometry = null; - } - } else { - console.log('Unknown geometry', geojsonfeature.geometry.type); - } - if (geometry) { - const pointFeature = new Feature({ - geometry: geometry, - properties: { - category: geojsonfeature.category, - source: geojsonfeature.source, - } - }); - pointFeature.set('latlng', latlng); - const pointStyle = mapOlFunc.createStyle(geojsonfeature, style); - if (pointStyle) { - pointFeature.setStyle(pointStyle); - } - markerSource.addFeature(pointFeature); - } + if (geojson && geojson.features && geojson.features.length > 0) { + let geojsonCrsCode = 4326; + if (geojson.crs) { + let geojsonCrsMatch = geojson.crs.properties.name.match(/\d+/); + if (geojsonCrsMatch) { + geojsonCrsCode = parseInt(geojsonCrsMatch[0]); + } + } + // console.log('geojsonCrs', geojsonCrsCode); + geojson.features.forEach((geojsonfeature) => { + // console.log('feature', geojsonfeature); + let geometry = null; + const latlng = [...geojsonfeature.geometry.coordinates]; + // console.log(geojsonfeature.geometry.coordinates); + if (geojsonfeature.geometry.type === "Point") { + const coordinate = transformCoordinate( + geojsonCrsCode, + config.mapEpsgCode, + geojsonfeature.geometry.coordinates + ); + geometry = new Point(coordinate); + } else if (geojsonfeature.geometry.type === "Polygon") { + if (assessmentArea === undefined) { + const coordinates = [[]]; + geojsonfeature.geometry.coordinates[0].forEach((coordinate) => { + coordinates[0].push( + transformCoordinate( + geojsonCrsCode, + config.mapEpsgCode, + coordinate + ) + ); }); - calculateWaterIntersection(map, waterLayerName); - // console.log('summary', areaSource.getFeatures(), markerSource.getFeatures()); + geometry = new Polygon(coordinates); + const polygonFeature = new Feature({ + geometry: geometry, + }); + const polygonStyle = mapOlFunc.createStyle(geojsonfeature, style); + if (polygonStyle) { + polygonFeature.setStyle(polygonStyle); + } + // areaSource.addFeature(polygonFeature); + geometry = null; + } + } else { + console.log("Unknown geometry", geojsonfeature.geometry.type); } - if (selectionGeometry) { - // console.log('selectionGeometry', selectionGeometry); - const selectionFeature = (new GeoJSONFormat()).readFeature(selectionGeometry); - // console.log(selectionFeature); - areaSource.addFeature(selectionFeature); + if (geometry) { + const pointFeature = new Feature({ + geometry: geometry, + properties: { + category: geojsonfeature.category, + source: geojsonfeature.source, + }, + }); + pointFeature.set("latlng", latlng); + const pointStyle = mapOlFunc.createStyle(geojsonfeature, style); + if (pointStyle) { + pointFeature.setStyle(pointStyle); + } + markerSource.addFeature(pointFeature); } - }; - - useEffect(drawUtbredelse, [geojson]); - - return ( -
-
{visibleLegend && ({"tegnforklaring"})}
- -
-
-
- ) -} - -export default MapOpenLayers; \ No newline at end of file + }); + calculateWaterIntersection(map, waterLayerName); + // console.log('summary', areaSource.getFeatures(), markerSource.getFeatures()); + } + if (selectionGeometry) { + // console.log('selectionGeometry', selectionGeometry); + const selectionFeature = new GeoJSONFormat().readFeature( + selectionGeometry + ); + // console.log(selectionFeature); + areaSource.addFeature(selectionFeature); + } + }; + + useEffect(drawUtbredelse, [geojson]); + + return ( +
+
{visibleLegend && {"tegnforklaring"}}
+ +
+
+
+ ); +}; + +export default MapOpenLayers; diff --git a/Prod.Web/src/components/viewModel.js b/Prod.Web/src/components/viewModel.js index cb9784fe..643a4cc2 100644 --- a/Prod.Web/src/components/viewModel.js +++ b/Prod.Web/src/components/viewModel.js @@ -1,1507 +1,1591 @@ -import {action, autorun, computed, extendObservable, makeObservable, flow, observable, reaction, runInAction,trace, transaction, toJS, isObservable, isObservableProp} from 'mobx' -import {router} from "./routeMatcher" -import events from './event-pubsub' +import { + action, + autorun, + computed, + extendObservable, + makeObservable, + flow, + observable, + reaction, + runInAction, + trace, + transaction, + toJS, + isObservable, + isObservableProp, +} from "mobx"; +import { router } from "./routeMatcher"; +import events from "./event-pubsub"; // import {HttpTransportType, HubConnectionBuilder, JsonHubProtocol, LogLevel} from "@microsoft/signalr" -import * as signalR from "@microsoft/signalr" +import * as signalR from "@microsoft/signalr"; // import enhanceWithRiskEvaluation from "./CategoryCriteria" // import {codes2labels} from '../utils' -import config from '../config' -import auth from './authService' -import createContext from './createContext' -import errorhandler from './errorhandler'; -import enhanceAssessment from './assessment/enhanceAssassment.js' -import { checkStatus, loadData } from '../apiService' -import tabdefs from './tabdefs' -import assessmentTabdefs from './assessment/assessmentTabdefs' -import {codeLists, isTrueteogsjeldnenaturtype} from './codeLists' - +import config from "../config"; +import auth from "./authService"; +import createContext from "./createContext"; +import errorhandler from "./errorhandler"; +import enhanceAssessment from "./assessment/enhanceAssassment.js"; +import { checkStatus, loadData } from "../apiService"; +import tabdefs from "./tabdefs"; +import assessmentTabdefs from "./assessment/assessmentTabdefs"; +import { codeLists, isTrueteogsjeldnenaturtype } from "./codeLists"; // import { any } from 'prop-types' // import { Console } from 'console' // import { ConfigurationManager } from '../../dist/Prod.Web.e31bb0bc' - class ViewModel { - constructor() { - const options = { - skipNegotiation: true, - transport: signalR.HttpTransportType.WebSockets, - logMessageContent: true, - logger: signalR.LogLevel.Trace - //accessTokenFactory: () => this.props.accessToken, // todo: <---- check this - } - - - - // utkommenterer SignalR foreløpig for å unngå støy i consollog - - // // // // // // console.log("#########################################################") - // // // // // // console.log(JSON.stringify(signalR)) - // // // // // // console.log("#########################################################") - - // // // // // this.hubConnection = new signalR.HubConnectionBuilder() - // // // // // .configureLogging(signalR.LogLevel.Debug) - // // // // // .withUrl(config.getSignalRUrl, { - // // // // // // skipNegotiation: true, - // // // // // // transport: signalR.HttpTransportType.WebSockets, - // // // // // logMessageContent: true, - // // // // // logger: signalR.LogLevel.Trace - // // // // // //accessTokenFactory: () => this.props.accessToken, // todo: <---- check this - // // // // // }) - // // // // // .withAutomaticReconnect() - // // // // // .withHubProtocol(new signalR.JsonHubProtocol()) - // // // // // .build() - // // // // // this.hubConnection.on("ReceiveMessage", (context, message) => { - // // // // // // alert("SignalR: " + context + " - " + message) - // // // // // events.trigger(context, message) - // // // // // }); - - // // // // // this.hubConnection - // // // // // .start() - // // // // // .then(() => console.info('SignalR Connected')) - // // // // // .catch(err => console.error('SignalR Connection Error: ', err)); - - - // ------------------------------------- - extendObservable(this, { - router: null, - viewMode: "choosespecie", - assessmentId: null, - assessment: null, - assessmentSavedVersion: null, - assessmentSavedVersionString: null, - expertGroupModel: null, - language: null, - userContext: { - readonly: false - }, - koder: null, - codeLabels: null, - naturtypeLabels: {}, - livsmediumLabels: null, - livsmediumCodes: null, - trueteogsjeldneCodes: null, - naturtyperNIN2: null, - - comments: [], - newComment: null, - newComments: [], - otherComments: [], - withComments: false, - withNewComments: false, - withPotentialTaxonChanges: false, - withAutomaticNameChanges: false, - kunUbehandlede: false, - hSStatus: false, - kunMine: false, - includeLC: false, - showTheCat: false, - - - artificialAndConstructedSites: ["F4", "F5", "H4", "L7", "L8", "M14", "M15", "T35", "T36", "T37", "T38", "T39", "T40", "T41", "T42", "T43", "T44", "T45", "V11", "V12", "V13"], - assessmentTypeFilter: "riskAssessment", - - expertgroups: null, // [], - expertgroup: null, - roleincurrentgroup: null, - expertgroupAssessmentList: [], - expertgroupAssessmentTotalCount: 0, - expertgroupAssessmentFilterCount: 0, - expertgroupAssessmentAuthors: [], - assessmentsStatistics: observable, - expertgroupAssessmentFilter: "", - expertgroupCategoryFilter: "", - expertgroupCategoryCheckboxFilter: [], - statusCheckboxFilter: [], - - filterType: [], - workStatus: [], - currentFilter:{ - decisiveCriteriaFilter: [], - riskCategoryFilter: [], - riskAssessedFilter: [], - riskNotAssessedFilter: [], - vurdert: false, - ikkevurdert: false - }, - historyFilter:{ - decisiveCriteriaFilter: [], - riskCategoryFilter: [], - riskAssessedFilter: [], - riskNotAssessedFilter: [], - vurdert: false, - ikkevurdert: false - }, - - horizonScanFilter: { - // horizonFilters: false, - hsNotStarted: false, - hsFinished: false, - toAssessment: false, - notAssessed: false, - potentialDoorKnockers: [], - notAssessedDoorKnocker: [] - }, - - responsible: [], // list of lastupdatedbypeople - ekspertgruppeReport: null, - lockedForEditByUser: null, - assessmentIsSaving: false, - showSaveSuccessful: false, - showSaveFailure: false, - antallVurderinger: 0, - antallUbehandlede: 0, - antallTaxonEndring: 0, - antallNavnEndret: 0, - loadingExpertGroup: false, - - // NB! evaluationContext also exist on the assessment. This one is for general taxonSearch, maps++ - evaluationContext: 'N', - //todo: this thing should go to the code file - evaluationContexts: { - 'N': { - name: 'Norge', - nameWithPreposition: 'i Norge', - map: 'norge' - }, - 'S': { - name: 'Svalbard', - nameWithPreposition: 'på Svalbard', - map: 'svalbard' - } - }, - - - livsmediumEnabled: true, // just a manual flag! - spredningsveier: null, - - - // ************************************************ - // ******** Assessment props ********************* - // ************************************************ - - //todo: test if this is actually in use!! artskartModel is also defined(?) on the assessment, which is where it should be! - // artskartModel: {}, - - // påvirkningsfaktorer: [], - // selectedPåvirkningsfaktor: { - // id: null, - // forkortelse: null, - // overordnetTittel: null, - // beskrivelse: null, - // tidspunkt: null, - // omfang: null, - // alvorlighetsgrad: null, - // comment: null - // }, - - - // statusChange: false - }) - - - this.initializeServices() - // --------------- - Object.assign(this,codeLists) - this.isTrueteogsjeldnenaturtype = isTrueteogsjeldnenaturtype - - - - - // // // const codes = require('../FA3CodesNB.json') - // // // this.koder = codes.Children - // // // const clabels = codes2labels(this.koder.labels[0].Children) - // // // this.codeLabels = clabels - - - // // // // load livsmedium codes ---- - // // // const ninlm = require('../nin-livsmedium.json') - // // // const lm = this.transformlivsmedium(ninlm) - // // // // console.log("livsmedium2nt: " + JSON.stringify(lm)) - // // // const lmlabels = this.transformlivsmediumlabels(ninlm, {}) - // // // // console.log(JSON.stringify(lmlabels)) - // // // const grupper = lm.Children - // // // this.livsmediumLabels = lmlabels - // // // this.livsmediumCodes = grupper - // // // // -------------------------- - - // // // // load truede naturtyper codes ---- - // // // const togsnt = require('../TrueteOgSjeldneNaturtyper2018.json') - // // // const nt = this.transformtrueteogsjeldnenaturtyper(togsnt) - // // // // console.log("trueteogsjeldnenaturtyper: " + JSON.stringify(nt)) - // // // const tsgrupper = nt.Children - // // // this.trueteogsjeldneCodes = tsgrupper - - - // // // this.trueteogsjeldnenaturtypercodes = [] - // // // this.gettrueteogsjeldnenaturtypercodes(togsnt) - // // // console.log("!!! gettrueteogsjeldnenaturtypercodes" + JSON.stringify(this.trueteogsjeldnenaturtypercodes)) - - // // // // -------------------------- - - - // // // // load NiN2 codes ---- - // // // const nin2root = require('../Nin2_3.json') - // // // // console.log("nin2naturtyper: " + JSON.stringify(nin2root)) - // // // const nin2grupper = nin2root.Children - // // // this.naturtyperNIN2 = nin2grupper - - // // // const nin2codes = this.koder.naturtyperNIN2 - // // // const nin2 = this.transformnaturtyperNIN2(nin2codes) - // // // // console.log("nin2 transformed: " + JSON.stringify(nin2)) - // // // // const nin2grupper = nin2.Children - // // // // this.naturtyperNIN2 = nin2grupper - // // // // -------------------------- - // // // this.nin2codes = nin2codes - - - - - - - - - // // // // console.log("labels keys: " + JSON.stringify(Object.keys(clabels))) - // // // // console.log("codes keys: " + JSON.stringify(Object.keys(codes.Children))) - // // // // console.log("codes json: " + JSON.stringify(codes)) - // // // // console.log("----------------------------------------------+++") - // // // // console.log(JSON.stringify(clabels)) - - // // // //----------------------------------------------------- - - // // // const mp = this.koder.migrationPathways[0] - // // // this.spredningsveier = this.koder2migrationPathways(mp) - // // // //----------------------------------------------------- - + constructor() { + const options = { + skipNegotiation: true, + transport: signalR.HttpTransportType.WebSockets, + logMessageContent: true, + logger: signalR.LogLevel.Trace, + //accessTokenFactory: () => this.props.accessToken, // todo: <---- check this + }; - this.theUserContext = createContext(this.userContext) + // utkommenterer SignalR foreløpig for å unngå støy i consollog + + // // // // // // console.log("#########################################################") + // // // // // // console.log(JSON.stringify(signalR)) + // // // // // // console.log("#########################################################") + + // // // // // this.hubConnection = new signalR.HubConnectionBuilder() + // // // // // .configureLogging(signalR.LogLevel.Debug) + // // // // // .withUrl(config.getSignalRUrl, { + // // // // // // skipNegotiation: true, + // // // // // // transport: signalR.HttpTransportType.WebSockets, + // // // // // logMessageContent: true, + // // // // // logger: signalR.LogLevel.Trace + // // // // // //accessTokenFactory: () => this.props.accessToken, // todo: <---- check this + // // // // // }) + // // // // // .withAutomaticReconnect() + // // // // // .withHubProtocol(new signalR.JsonHubProtocol()) + // // // // // .build() + // // // // // this.hubConnection.on("ReceiveMessage", (context, message) => { + // // // // // // alert("SignalR: " + context + " - " + message) + // // // // // events.trigger(context, message) + // // // // // }); + + // // // // // this.hubConnection + // // // // // .start() + // // // // // .then(() => console.info('SignalR Connected')) + // // // // // .catch(err => console.error('SignalR Connection Error: ', err)); + + // ------------------------------------- + extendObservable(this, { + router: null, + viewMode: "choosespecie", + assessmentId: null, + assessment: null, + assessmentSavedVersion: null, + assessmentSavedVersionString: null, + expertGroupModel: null, + language: null, + userContext: { + readonly: false, + }, + koder: null, + codeLabels: null, + naturtypeLabels: {}, + livsmediumLabels: null, + livsmediumCodes: null, + trueteogsjeldneCodes: null, + naturtyperNIN2: null, + + comments: [], + newComment: null, + newComments: [], + otherComments: [], + withComments: false, + withNewComments: false, + withPotentialTaxonChanges: false, + withAutomaticNameChanges: false, + kunUbehandlede: false, + hSStatus: false, + kunMine: false, + includeLC: false, + showTheCat: false, + + artificialAndConstructedSites: [ + "F4", + "F5", + "H4", + "L7", + "L8", + "M14", + "M15", + "T35", + "T36", + "T37", + "T38", + "T39", + "T40", + "T41", + "T42", + "T43", + "T44", + "T45", + "V11", + "V12", + "V13", + ], + assessmentTypeFilter: "riskAssessment", + + expertgroups: null, // [], + expertgroup: null, + roleincurrentgroup: null, + expertgroupAssessmentList: [], + expertgroupAssessmentTotalCount: 0, + expertgroupAssessmentFilterCount: 0, + expertgroupAssessmentAuthors: [], + assessmentsStatistics: observable, + expertgroupAssessmentFilter: "", + expertgroupCategoryFilter: "", + expertgroupCategoryCheckboxFilter: [], + statusCheckboxFilter: [], + + filterType: [], + workStatus: [], + currentFilter: { + decisiveCriteriaFilter: [], + riskCategoryFilter: [], + riskAssessedFilter: [], + riskNotAssessedFilter: [], + vurdert: false, + ikkevurdert: false, + }, + historyFilter: { + decisiveCriteriaFilter: [], + riskCategoryFilter: [], + riskAssessedFilter: [], + riskNotAssessedFilter: [], + vurdert: false, + ikkevurdert: false, + }, + + horizonScanFilter: { + // horizonFilters: false, + hsNotStarted: false, + hsFinished: false, + toAssessment: false, + notAssessed: false, + potentialDoorKnockers: [], + notAssessedDoorKnocker: [], + }, + + responsible: [], // list of lastupdatedbypeople + ekspertgruppeReport: null, + lockedForEditByUser: null, + assessmentIsSaving: false, + showSaveSuccessful: false, + showSaveFailure: false, + antallVurderinger: 0, + antallUbehandlede: 0, + antallTaxonEndring: 0, + antallNavnEndret: 0, + loadingExpertGroup: false, + + // NB! evaluationContext also exist on the assessment. This one is for general taxonSearch, maps++ + evaluationContext: "N", + //todo: this thing should go to the code file + evaluationContexts: { + N: { + name: "Norge", + nameWithPreposition: "i Norge", + map: "norge", + }, + S: { + name: "Svalbard", + nameWithPreposition: "på Svalbard", + map: "svalbard", + }, + }, + + livsmediumEnabled: true, // just a manual flag! + spredningsveier: null, + token: null, + + // ************************************************ + // ******** Assessment props ********************* + // ************************************************ + + //todo: test if this is actually in use!! artskartModel is also defined(?) on the assessment, which is where it should be! + // artskartModel: {}, + + // påvirkningsfaktorer: [], + // selectedPåvirkningsfaktor: { + // id: null, + // forkortelse: null, + // overordnetTittel: null, + // beskrivelse: null, + // tidspunkt: null, + // omfang: null, + // alvorlighetsgrad: null, + // comment: null + // }, + + // statusChange: false + }); + + const url = "https://artskart.artsdatabanken.no/appapi/api/token/gettoken"; + const thirtyMinutes = 30 * 60 * 1000; + const downloadToken = async function downloadToken(self) { + // window.setTimeout(downloadToken(self), thirtyMinutes); + try { + const result = await fetch(url); + const t = await result.text(); + self.token = t; // return JSON.parse(t); + console.log("got new token" + t); + } catch (err) { + console.error("token troubles", url, err); + return {}; + } + }; - - //***** pubsub event handlers ***** - let savetimer = null - events.on("saveAssessment", - (tag) => { - if (tag === "savestart") { - console.log("save vurdering starter") - action(() => this.assessmentIsSaving = true)() - savetimer = setTimeout(() => events.trigger("saveAssessment", "timeout"), 30000) - console.log("save vurdering starter -") - } else if (tag === "timeout") { - console.log("save vurdering timeout") - action(() => this.assessmentIsSaving = false)() - } else if (tag === "savesuccess") { - clearTimeout(savetimer) - console.log("save vurdering successfull") - action(() => this.assessmentIsSaving = false)() - action(() => this.showSaveSuccessful = true)() - setTimeout(() => {action(() => this.showSaveSuccessful = false)()}, 3000) - console.log("save vurdering successfull -") - } else if (tag === "savefailure") { - clearTimeout(savetimer) - console.log("save vurdering failure") - action(() => this.assessmentIsSaving = false)() - action(() => this.showSaveFailure = true)() - setTimeout(() => {action(() => this.showSaveFailure = false)()}, 3000) - console.log("save vurdering failure -") - } - }) - - events.on("assessment", - (tag) => { - if (tag === "open") { - console.log("signalR: *open*") - } else if (tag === "save") { - console.log("signalR: *save*") - } - }) - //************************************************* - - - - // autorun(() => { - // console.log("selectedPåvirkningsfaktor: " + (this.selectedPåvirkningsfaktor ? this.selectedPåvirkningsfaktor.id : "None")) - // }); - - - // **** set assessment and assessmentId **** - reaction(() => this.assessmentId, - assessmentId => { - console.log("x: " + this.assessmentId + " " + typeof(this.assessmentId) + " " + (this.assessment ? this.assessment.id : "nix")) - if (assessmentId) { - this.setCurrentAssessment(assessmentId) - } else { - this.setCurrentAssessment(null) - action(() => this.viewMode = "choosespecie") - } - } + downloadToken(this); + window.setInterval(downloadToken, thirtyMinutes, this); + + this.initializeServices(); + // --------------- + Object.assign(this, codeLists); + this.isTrueteogsjeldnenaturtype = isTrueteogsjeldnenaturtype; + + // // // const codes = require('../FA3CodesNB.json') + // // // this.koder = codes.Children + // // // const clabels = codes2labels(this.koder.labels[0].Children) + // // // this.codeLabels = clabels + + // // // // load livsmedium codes ---- + // // // const ninlm = require('../nin-livsmedium.json') + // // // const lm = this.transformlivsmedium(ninlm) + // // // // console.log("livsmedium2nt: " + JSON.stringify(lm)) + // // // const lmlabels = this.transformlivsmediumlabels(ninlm, {}) + // // // // console.log(JSON.stringify(lmlabels)) + // // // const grupper = lm.Children + // // // this.livsmediumLabels = lmlabels + // // // this.livsmediumCodes = grupper + // // // // -------------------------- + + // // // // load truede naturtyper codes ---- + // // // const togsnt = require('../TrueteOgSjeldneNaturtyper2018.json') + // // // const nt = this.transformtrueteogsjeldnenaturtyper(togsnt) + // // // // console.log("trueteogsjeldnenaturtyper: " + JSON.stringify(nt)) + // // // const tsgrupper = nt.Children + // // // this.trueteogsjeldneCodes = tsgrupper + + // // // this.trueteogsjeldnenaturtypercodes = [] + // // // this.gettrueteogsjeldnenaturtypercodes(togsnt) + // // // console.log("!!! gettrueteogsjeldnenaturtypercodes" + JSON.stringify(this.trueteogsjeldnenaturtypercodes)) + + // // // // -------------------------- + + // // // // load NiN2 codes ---- + // // // const nin2root = require('../Nin2_3.json') + // // // // console.log("nin2naturtyper: " + JSON.stringify(nin2root)) + // // // const nin2grupper = nin2root.Children + // // // this.naturtyperNIN2 = nin2grupper + + // // // const nin2codes = this.koder.naturtyperNIN2 + // // // const nin2 = this.transformnaturtyperNIN2(nin2codes) + // // // // console.log("nin2 transformed: " + JSON.stringify(nin2)) + // // // // const nin2grupper = nin2.Children + // // // // this.naturtyperNIN2 = nin2grupper + // // // // -------------------------- + // // // this.nin2codes = nin2codes + + // // // // console.log("labels keys: " + JSON.stringify(Object.keys(clabels))) + // // // // console.log("codes keys: " + JSON.stringify(Object.keys(codes.Children))) + // // // // console.log("codes json: " + JSON.stringify(codes)) + // // // // console.log("----------------------------------------------+++") + // // // // console.log(JSON.stringify(clabels)) + + // // // //----------------------------------------------------- + + // // // const mp = this.koder.migrationPathways[0] + // // // this.spredningsveier = this.koder2migrationPathways(mp) + // // // //----------------------------------------------------- + + this.theUserContext = createContext(this.userContext); + + //***** pubsub event handlers ***** + let savetimer = null; + events.on("saveAssessment", (tag) => { + if (tag === "savestart") { + console.log("save vurdering starter"); + action(() => (this.assessmentIsSaving = true))(); + savetimer = setTimeout( + () => events.trigger("saveAssessment", "timeout"), + 30000 ); - reaction( - () => this.assessmentId, - async assessmentId => { - console.log("ny assessmentId: " + assessmentId) - } - ) - autorun(() => { - if (this.viewMode === "choosespecie") { - this.setCurrentAssessment(null) - } - }); - reaction( - () => this.assessment, - assessment => { - console.log(assessment ? "ny assessment: " + assessment.id : "no assessment") - if (assessment && this.isServicesReady) { - // console.log("viewMode = 'assessment' - before:" + this.viewMode) - this.viewMode = "assessment" - } - } - ) - // *************************************** - - // **** sett expert group **** - reaction( - () => [this.expertgroup, auth.isLoggedIn, this.assessmentTypeFilter, this.expertgroupAssessmentFilter, - this.horizonScanFilter.notAssessedDoorKnocker.length, - this.horizonScanFilter.potentialDoorKnockers.length, - this.horizonScanFilter.hsNotStarted, this.horizonScanFilter.hsFinished, this.horizonScanFilter.toAssessment, this.horizonScanFilter.notAssessed, - this.responsible.length, this.kunUbehandlede, - this.hSStatus, - this.workStatus.length, this.otherComments.length, - - this.historyFilter.riskCategoryFilter.length, this.historyFilter.decisiveCriteriaFilter.length, - this.historyFilter.riskAssessedFilter.length, this.historyFilter.riskNotAssessedFilter.length, this.historyFilter.ikkevurdert, this.historyFilter.vurdert, - - this.currentFilter.riskCategoryFilter.length, this.currentFilter.decisiveCriteriaFilter.length, - this.currentFilter.riskAssessedFilter.length, this.currentFilter.riskNotAssessedFilter.length, this.currentFilter.ikkevurdert, this.currentFilter.vurdert, - - ], - ([expertgroupId, isLoggedIn]) => { - //console.log("react to expertgroup: " + expertgroupId + "," + isLoggedIn) - if(isLoggedIn && expertgroupId) { - this.loadCurrentExpertgroupAssessmentList() - } else { - this.expertgroupAssessmentList = [] - } - } - ) - // *************************************** - - autorun(() => { - console.log("har vurdering: " + this.harVurdering) - }); - - // **** initialize tabs **** - extendObservable(this, tabdefs(this)) - assessmentTabdefs(this) - // **** end initialize tabs **** - - const createRoutes = tablist => { - const items = [] - tablist.forEach(tabitem => { - const item = [tabitem.url + "/:id", params => this.navigate(tabitem.id, params.id)] - items.push(item) - }) - return items + console.log("save vurdering starter -"); + } else if (tag === "timeout") { + console.log("save vurdering timeout"); + action(() => (this.assessmentIsSaving = false))(); + } else if (tag === "savesuccess") { + clearTimeout(savetimer); + console.log("save vurdering successfull"); + action(() => (this.assessmentIsSaving = false))(); + action(() => (this.showSaveSuccessful = true))(); + setTimeout(() => { + action(() => (this.showSaveSuccessful = false))(); + }, 3000); + console.log("save vurdering successfull -"); + } else if (tag === "savefailure") { + clearTimeout(savetimer); + console.log("save vurdering failure"); + action(() => (this.assessmentIsSaving = false))(); + action(() => (this.showSaveFailure = true))(); + setTimeout(() => { + action(() => (this.showSaveFailure = false))(); + }, 3000); + console.log("save vurdering failure -"); + } + }); + + events.on("assessment", (tag) => { + if (tag === "open") { + console.log("signalR: *open*"); + } else if (tag === "save") { + console.log("signalR: *save*"); + } + }); + //************************************************* + + // autorun(() => { + // console.log("selectedPåvirkningsfaktor: " + (this.selectedPåvirkningsfaktor ? this.selectedPåvirkningsfaktor.id : "None")) + // }); + + // **** set assessment and assessmentId **** + reaction( + () => this.assessmentId, + (assessmentId) => { + console.log( + "x: " + + this.assessmentId + + " " + + typeof this.assessmentId + + " " + + (this.assessment ? this.assessment.id : "nix") + ); + if (assessmentId) { + this.setCurrentAssessment(assessmentId); + } else { + this.setCurrentAssessment(null); + action(() => (this.viewMode = "choosespecie")); } + } + ); + reaction( + () => this.assessmentId, + async (assessmentId) => { + console.log("ny assessmentId: " + assessmentId); + } + ); + autorun(() => { + if (this.viewMode === "choosespecie") { + this.setCurrentAssessment(null); + } + }); + reaction( + () => this.assessment, + (assessment) => { + console.log( + assessment ? "ny assessment: " + assessment.id : "no assessment" + ); + if (assessment && this.isServicesReady) { + // console.log("viewMode = 'assessment' - before:" + this.viewMode) + this.viewMode = "assessment"; + } + } + ); + // *************************************** + + // **** sett expert group **** + reaction( + () => [ + this.expertgroup, + auth.isLoggedIn, + this.assessmentTypeFilter, + this.expertgroupAssessmentFilter, + this.horizonScanFilter.notAssessedDoorKnocker.length, + this.horizonScanFilter.potentialDoorKnockers.length, + this.horizonScanFilter.hsNotStarted, + this.horizonScanFilter.hsFinished, + this.horizonScanFilter.toAssessment, + this.horizonScanFilter.notAssessed, + this.responsible.length, + this.kunUbehandlede, + this.hSStatus, + this.workStatus.length, + this.otherComments.length, + + this.historyFilter.riskCategoryFilter.length, + this.historyFilter.decisiveCriteriaFilter.length, + this.historyFilter.riskAssessedFilter.length, + this.historyFilter.riskNotAssessedFilter.length, + this.historyFilter.ikkevurdert, + this.historyFilter.vurdert, + + this.currentFilter.riskCategoryFilter.length, + this.currentFilter.decisiveCriteriaFilter.length, + this.currentFilter.riskAssessedFilter.length, + this.currentFilter.riskNotAssessedFilter.length, + this.currentFilter.ikkevurdert, + this.currentFilter.vurdert, + ], + ([expertgroupId, isLoggedIn]) => { + //console.log("react to expertgroup: " + expertgroupId + "," + isLoggedIn) + if (isLoggedIn && expertgroupId) { + this.loadCurrentExpertgroupAssessmentList(); + } else { + this.expertgroupAssessmentList = []; + } + } + ); + // *************************************** + + autorun(() => { + console.log("har vurdering: " + this.harVurdering); + }); + + // **** initialize tabs **** + extendObservable(this, tabdefs(this)); + assessmentTabdefs(this); + // **** end initialize tabs **** + + const createRoutes = (tablist) => { + const items = []; + tablist.forEach((tabitem) => { + const item = [ + tabitem.url + "/:id", + (params) => this.navigate(tabitem.id, params.id), + ]; + items.push(item); + }); + return items; + }; - const routes = createRoutes(this.assessmentTabs.tabList) - - autorun(() => { - if (this.router && this.assessmentTabs) { - const hash = this.router.hash.substr(1) // when user changes the url hash - - router(hash, routes) // - then navigate - } - }) - - - - - - - - autorun(() => { - // **** Lurer Mobx til å kjøre koden... TODO: Gjør dette på en "riktig" måte **** - this._viewMode = this.viewMode - this._assessment = this.assessment - - - - - - - this._evaluationStatus = !this.assessment || this.assessment.evaluationStatus - // ****************************************************************************** - runInAction(() => { - const lockedUserId = !this.assessment ? null : this.assessment.lockedForEditByUserId - const isLockedByMe = lockedUserId === auth.userId - this.userContext.readonly = ( - this.viewMode === "assessment" && - ( - !isLockedByMe || this.assessment.evaluationStatus === "finished" - ) - ) - }) - if (this.expertgroupAssessmentList) { - let list = this.expertgroupAssessmentList - let countTotal = 0 - let countOpen = 0 - let countNew = 0 - let countTaxon = 0 - let countName = 0 - list.forEach (row => { - if (row.commentClosed > 0 || row.commentOpen > 0) { - countTotal++ - } - if ( row.commentOpen > 0){ - countOpen++ - } - if ( row.commentNew > 0){ - countNew++ - } - if ( row.taxonChange == 2){ - countTaxon++ - } - if ( row.taxonChange == 1){ - countName++ - } - }) - action (() => { - this.antallVurderinger = countTotal - this.antallUbehandlede = countOpen - this.antallNye = countNew - this.antallTaxonEndring = countTaxon - this.antallNavnEndret = countName - })() - } - }); - autorun(() => { - console.log("isServicesReady: " + this.isServicesReady) - console.log("exp" + (this.expertgroups != null)) + const routes = createRoutes(this.assessmentTabs.tabList); + + autorun(() => { + if (this.router && this.assessmentTabs) { + const hash = this.router.hash.substr(1); // when user changes the url hash - + router(hash, routes); // - then navigate + } + }); + + autorun(() => { + // **** Lurer Mobx til å kjøre koden... TODO: Gjør dette på en "riktig" måte **** + this._viewMode = this.viewMode; + this._assessment = this.assessment; + + this._evaluationStatus = + !this.assessment || this.assessment.evaluationStatus; + // ****************************************************************************** + runInAction(() => { + const lockedUserId = !this.assessment + ? null + : this.assessment.lockedForEditByUserId; + const isLockedByMe = lockedUserId === auth.userId; + this.userContext.readonly = + this.viewMode === "assessment" && + (!isLockedByMe || this.assessment.evaluationStatus === "finished"); + }); + if (this.expertgroupAssessmentList) { + let list = this.expertgroupAssessmentList; + let countTotal = 0; + let countOpen = 0; + let countNew = 0; + let countTaxon = 0; + let countName = 0; + list.forEach((row) => { + if (row.commentClosed > 0 || row.commentOpen > 0) { + countTotal++; + } + if (row.commentOpen > 0) { + countOpen++; + } + if (row.commentNew > 0) { + countNew++; + } + if (row.taxonChange == 2) { + countTaxon++; + } + if (row.taxonChange == 1) { + countName++; + } }); - autorun(() => { - console.log("dirty: " + this.isDirty) - }); - autorun(() => { - console.log("viewMode: " + this.viewMode) + action(() => { + this.antallVurderinger = countTotal; + this.antallUbehandlede = countOpen; + this.antallNye = countNew; + this.antallTaxonEndring = countTaxon; + this.antallNavnEndret = countName; + })(); + } + }); + autorun(() => { + console.log("isServicesReady: " + this.isServicesReady); + console.log("exp" + (this.expertgroups != null)); + }); + autorun(() => { + console.log("dirty: " + this.isDirty); + }); + autorun(() => { + console.log("viewMode: " + this.viewMode); + }); + + // ####################################################################################################### + // ####################################################################################################### + // ################################## assessment reactions ############################################# + // ####################################################################################################### + // ####################################################################################################### + + // autorun(() => { + // if(this.assessment && this.assessment.speciesStatus == "C3") { + // runInAction(() => this.assessment.speciesEstablishmentCategory = "C3") + // } + // }) + // autorun(() => { + // if(this.assessment && this.assessment.speciesStatus) { + // reaction( + // () => this.assessment.speciesStatus, + // (speciesStatus, previousSpeciesStatus) => { + // if (speciesStatus === "C3" && previousSpeciesStatus !== "C3") { + // // console.log("¤¤¤ reset speciesEstablishmentCategory") + // if(!this.assessment.speciesEstablishmentCategory) { + // runInAction(() => this.assessment.speciesEstablishmentCategory = "C3") + // } + // } + // } + // ) + // } + // }) + // autorun(() => { + // if(this.assessmentTabs && this.assessmentTabs.activeTab ) { + // console.log("current assessmentTab: " + this.assessmentTabs.activeTab.id ) + // } + // }); + // autorun(() => { + // console.log("skal vurderes: " + this.skalVurderes) + // }); + // ####################################################################################################### + // ####################################################################################################### + } // ########### end constructor ########### + // ####################################### + @computed getStatisticsFor(facets, facetname, facetitem) { + //const facets = this.assessmentsStatistics; + const facet = facets.find((element) => element.name == facetname); + if (facet) { + // found + var count = 0; + if (facetitem && facetitem.length > 1) { + var items = facetitem.split(",").forEach((harry) => { + var item = facet.facetsItems.find((element) => element.name == harry); + if (item) { + count += item.count; + } }); - - - // ####################################################################################################### - // ####################################################################################################### - // ################################## assessment reactions ############################################# - // ####################################################################################################### - // ####################################################################################################### - - - // autorun(() => { - // if(this.assessment && this.assessment.speciesStatus == "C3") { - // runInAction(() => this.assessment.speciesEstablishmentCategory = "C3") - // } - // }) - // autorun(() => { - // if(this.assessment && this.assessment.speciesStatus) { - // reaction( - // () => this.assessment.speciesStatus, - // (speciesStatus, previousSpeciesStatus) => { - // if (speciesStatus === "C3" && previousSpeciesStatus !== "C3") { - // // console.log("¤¤¤ reset speciesEstablishmentCategory") - // if(!this.assessment.speciesEstablishmentCategory) { - // runInAction(() => this.assessment.speciesEstablishmentCategory = "C3") - // } - // } - // } - // ) - // } - // }) - // autorun(() => { - // if(this.assessmentTabs && this.assessmentTabs.activeTab ) { - // console.log("current assessmentTab: " + this.assessmentTabs.activeTab.id ) - // } - // }); - // autorun(() => { - // console.log("skal vurderes: " + this.skalVurderes) - // }); - // ####################################################################################################### - // ####################################################################################################### - - - - - - } // ########### end constructor ########### - // ####################################### - @computed getStatisticsFor(facets, facetname, facetitem) { - //const facets = this.assessmentsStatistics; - const facet = facets.find(element => element.name == facetname) - if (facet) // found - { - var count = 0; - if (facetitem && facetitem.length > 1){ - var items = facetitem.split(",").forEach( harry => { - var item = facet.facetsItems.find(element => element.name == harry) - if (item) - { - count+= item.count - } - } - ) - } else { - var item = facet.facetsItems.find(element => element.name == facetitem) - if (item) - { - count+= item.count - } - } - - - return count; + } else { + var item = facet.facetsItems.find( + (element) => element.name == facetitem + ); + if (item) { + count += item.count; } - return 0 - } - + } - - get UserContext() {return this.theUserContext}; - - initializeServices() { - console.log("start initializeServices") - // this.loadKoder() - // this.loadPåvirkningsfaktorer() - this.loadExpertGroups() + return count; } - - // todo: of some unknown reason this does not seem to work. It is currently used only in routing, so it is not critical - @action navigate(assessmentTabId, id) { - console.log("navigate: " + this.assessmentTabs.activeTab.id + " to:" + assessmentTabId) - const that = this - action(() => { - - that.assessmentTabs.activeTab.id = assessmentTabId - // this.assessmentId = id - }) - console.log("navigate set: " + this.assessmentTabs.activeTab.id) - - } - - - - - - @computed get isServicesReady() { - return ( - this.expertgroups != null ) - // this.koder != null && - // this.expertgroups != null && - // this.codeLabels != null) + return 0; + } + + get UserContext() { + return this.theUserContext; + } + + initializeServices() { + console.log("start initializeServices"); + // this.loadKoder() + // this.loadPåvirkningsfaktorer() + this.loadExpertGroups(); + } + + // todo: of some unknown reason this does not seem to work. It is currently used only in routing, so it is not critical + @action navigate(assessmentTabId, id) { + console.log( + "navigate: " + this.assessmentTabs.activeTab.id + " to:" + assessmentTabId + ); + const that = this; + action(() => { + that.assessmentTabs.activeTab.id = assessmentTabId; + // this.assessmentId = id + }); + console.log("navigate set: " + this.assessmentTabs.activeTab.id); + } + + @computed get isServicesReady() { + return this.expertgroups != null; + // this.koder != null && + // this.expertgroups != null && + // this.codeLabels != null) + } + + @computed get isLockedByMe() { + if (!this.assessment) return false; + return this.assessment.lockedForEditByUser === auth.userId; + } + + @computed get isFinnished() { + if (!this.assessment) return false; + return ( + this.assessment.evaluationStatus && + this.assessment.evaluationStatus === "finished" + ); + } + + @computed get harVurdering() { + return !!this.assessment; + } + + // @computed get unresolvedComments() { + // const comments = this.assessmentComments + // const unresolvedComments = comments.filter(comment => !comment.resolved) + // const count = unresolvedComments.count + // return count + // } + + // ################ Start section expert groups ################## + async loadExpertGroups() { + const json = await this.getExpertGroups(); + // setter ekspertgrupper og fjerner Moser (Svalbard) + const res = json + .map((s) => { + return { value: s, text: s }; + }) + .filter((n) => { + return n.value != "Moser (Svalbard)"; + }); // todo: remove this line when server data is correct + const expertgroups = observable.array(res); + runInAction(() => (this.expertgroups = expertgroups)); + } + + async loadCurrentExpertgroupAssessmentList() { + const expertgroupId = this.expertgroup; + console.log("loadCurrentExpertgroupAssessmentList : " + expertgroupId); + + this.loadExpertgroupAssessmentList(expertgroupId); + } + // ################ End section expert groups ################## + + // ################ Start section current assessment ################## + async setCurrentAssessment(id) { + window.scrollTo(0, 0); + console.log("setCurrentAssessment: " + id); + + const intid = Number(id); + if (intid === this.assessmentId) return; // do not get or change assessment when unless id is different + let json = null; + if (id) { + json = await this.getAssessment(id); + + if (json) { + this.updateCurrentAssessment(json); + } } - - @computed get isLockedByMe() { - if (!this.assessment) return false; - return this.assessment.lockedForEditByUser === auth.userId; - }; - - @computed get isFinnished() { - if (!this.assessment) return false; - return ( - this.assessment.evaluationStatus && - this.assessment.evaluationStatus === "finished" - ); - }; - - - - @computed get harVurdering() { - return !!this.assessment + } + + @action updateAssessmentSavedVersion(assessment) { + if (assessment && assessment.id) { + const assessmentStringCopy = JSON.stringify(assessment, undefined, 2); + const jsoncopy = JSON.parse(assessmentStringCopy); + runInAction(() => { + this.assessmentSavedVersion = jsoncopy; + this.assessmentSavedVersionString = assessmentStringCopy; + }); + } else { + throw "updateAssessmentSavedVersion: Something is seriously wrong"; // Fail fast } - - - // @computed get unresolvedComments() { - // const comments = this.assessmentComments - // const unresolvedComments = comments.filter(comment => !comment.resolved) - // const count = unresolvedComments.count - // return count - // } - - // ################ Start section expert groups ################## - async loadExpertGroups() { - const json = await this.getExpertGroups() - // setter ekspertgrupper og fjerner Moser (Svalbard) - const res = json.map(s => {return {value:s, text:s}}).filter(n => {return n.value != 'Moser (Svalbard)'}) // todo: remove this line when server data is correct - const expertgroups = observable.array(res) - runInAction(() => this.expertgroups = expertgroups) + } + + @action updateCurrentAssessment(json) { + // that is: open new assessment (and replace current) with data from server + // console.log("updateCurrentAssessment: " + JSON.stringify(json)) + const codegroups = this.koder; + if (!codegroups) { + throw "Codes not loaded"; // Fail fast } - async loadCurrentExpertgroupAssessmentList() { - const expertgroupId = this.expertgroup - console.log("loadCurrentExpertgroupAssessmentList : " + expertgroupId) - - this.loadExpertgroupAssessmentList(expertgroupId) - - } - // ################ End section expert groups ################## - - - // ################ Start section current assessment ################## - async setCurrentAssessment(id) { - window.scrollTo(0,0) - console.log("setCurrentAssessment: " + id) - - const intid = Number(id) - if(intid === this.assessmentId) - return; // do not get or change assessment when unless id is different - let json = null - if (id) { - json = await this.getAssessment(id) - - if (json) { - this.updateCurrentAssessment(json) - } - } + if (json && json.id) { + const id = Number(json.id); + console.log("type of id : " + typeof id); + const jsonnew = JSON.parse(JSON.stringify(json)); + const assessment = enhanceAssessment(jsonnew, this); + const assessmentStringCopy = assessment.toJSON; + const assessmentcopy = JSON.parse(assessmentStringCopy); + + runInAction(() => { + this.assessmentSavedVersion = assessmentcopy; + this.assessmentSavedVersionString = assessmentStringCopy; + this.assessment = assessment; + this.assessmentId = id; + this.assessmentTabs.activeTab.id = assessment.horizonDoScanning ? 0 : 1; + }); + // this.navigate(assessment.horizonDoScanning ? 0 : 1) + } else { + runInAction(() => { + this.assessmentSavedVersion = null; + this.assessmentSavedVersionString = ""; + this.assessment = null; + this.assessmentId = null; + this.assessmentTabs.activeTab.id = 1; + }); + // this.navigate(assessment.horizonDoScanning ? 0 : 1) } - - @action updateAssessmentSavedVersion(assessment) { - if (assessment && assessment.id) { - const assessmentStringCopy = JSON.stringify(assessment,undefined,2) - const jsoncopy = JSON.parse(assessmentStringCopy) - runInAction(() => { - this.assessmentSavedVersion = jsoncopy - this.assessmentSavedVersionString = assessmentStringCopy - }) + } + + open(assessmentInfo) { + // used by the selectAssessmentTable + // console.log("########################" + JSON.stringify(assessmentInfo)) + // console.log("########################" + assessmentInfo.id) + this.setCurrentAssessment(assessmentInfo.id); + //this.assessmentTypeFilter == "horizonScanning" ? this.assessmentTabs.activeTab.id = 0 : this.assessmentTabs.activeTab.id = 1 + } + + // assessmentExists( + // expertgroup, + // scientificNameId, + // ) { + // const url = "assessment/ExistsByExpertgroupAndName/" + expertgroup + "/" + scientificNameId + // if (expertgroup && scientificNameId) { + // loadData( + // config.getUrl(url), + // (data) => { + // if (data) { + // console.log("----" + JSON.stringify(data, undefined, 2)) + // } else {console.warn("----= nothing")} + // } + // ) + // } + // } + + checkForExistingAssessment = (expertgroup, scientificNameId) => { + return new Promise((resolve, reject) => { + const url = + "assessment/ExistsByExpertgroupAndName/" + + expertgroup + + "/" + + scientificNameId; + if (!expertgroup || !scientificNameId) { + reject("checkForExistingAssessment missing required parameter"); + } + loadData(config.getUrl(url), (data) => { + if (typeof data === "boolean") { + // console.log("----" + JSON.stringify(data, undefined, 2)) + resolve(data); } else { - throw "updateAssessmentSavedVersion: Something is seriously wrong" // Fail fast + reject("ExistsByExpertgroupAndName - no data"); } + }); + }); + }; + + // checkForExistingAssessment = (sciName, assessmentId) => { + // //this.expertgroupAssessmentList.map(ega => console.log( ega.scientificName)) + // const result = this.expertgroupAssessmentList.some(ega => this.findSciName(ega.scientificName) == sciName && ega.id != assessmentId) + // //console.log("sciname:", sciName, result) + // return result + // } + + // findSciName = (name) => { + // const dividedName = name.split(" ") + // const result = dividedName[0] + " " + dividedName[1] + // return result + // } + + @action finishassessment(statusaction, assessment) { + let status = + statusaction === "finish" + ? "finished" + : statusaction === "unfinish" + ? "inprogress" + : ""; + let userId = statusaction === "unfinish" ? auth.userId : null; + let now = Date.now().toString(); + transaction(() => { + assessment.evaluationStatus = status; + assessment.lockedForEditAt = now; + assessment.lockedForEditByUser = userId; + assessment.lastUpdatedOn = now; + }); + + if (statusaction === "unfinish") { + this.viewMode = "choosespecie"; + this.updateCurrentAssessment(null); + } else { + this.updateAssessmentSavedVersion(assessment); } + } - @action updateCurrentAssessment(json) { // that is: open new assessment (and replace current) with data from server - // console.log("updateCurrentAssessment: " + JSON.stringify(json)) - const codegroups = this.koder - if (!codegroups) { - throw "Codes not loaded" // Fail fast - } - - - if (json && json.id) { - const id = Number(json.id) - console.log("type of id : " + typeof(id)) - const jsonnew = JSON.parse(JSON.stringify(json)) - const assessment = enhanceAssessment(jsonnew, this) - const assessmentStringCopy = assessment.toJSON - const assessmentcopy = JSON.parse(assessmentStringCopy) - - runInAction(() => { - this.assessmentSavedVersion = assessmentcopy - this.assessmentSavedVersionString = assessmentStringCopy - this.assessment = assessment - this.assessmentId = id - this.assessmentTabs.activeTab.id = assessment.horizonDoScanning ? 0 : 1 - }) - // this.navigate(assessment.horizonDoScanning ? 0 : 1) - } else { - runInAction(() => { - this.assessmentSavedVersion = null - this.assessmentSavedVersionString = "" - this.assessment = null - this.assessmentId = null - this.assessmentTabs.activeTab.id = 1 - }) - // this.navigate(assessment.horizonDoScanning ? 0 : 1) - } + @action setAssessmentComplete(statusaction) { + // console.log("#%% ferdigstill") + if (!this.roleincurrentgroup.writeAccess) { + alert("setAssessmentComplete: 'Not allowed'"); + return; } - - open(assessmentInfo) { // used by the selectAssessmentTable - // console.log("########################" + JSON.stringify(assessmentInfo)) - // console.log("########################" + assessmentInfo.id) - this.setCurrentAssessment(assessmentInfo.id) - //this.assessmentTypeFilter == "horizonScanning" ? this.assessmentTabs.activeTab.id = 0 : this.assessmentTabs.activeTab.id = 1 - + if (statusaction !== "finish" && statusaction !== "unfinish") { + alert("Wrong statusaction: " + statusaction); + return; } - - // assessmentExists( - // expertgroup, - // scientificNameId, - // ) { - // const url = "assessment/ExistsByExpertgroupAndName/" + expertgroup + "/" + scientificNameId - // if (expertgroup && scientificNameId) { - // loadData( - // config.getUrl(url), - // (data) => { - // if (data) { - // console.log("----" + JSON.stringify(data, undefined, 2)) - // } else {console.warn("----= nothing")} - // } - // ) - // } - // } - - - checkForExistingAssessment = (expertgroup, scientificNameId, ) => { - return new Promise((resolve, reject) => { - const url = "assessment/ExistsByExpertgroupAndName/" + expertgroup + "/" + scientificNameId - if (!expertgroup || !scientificNameId) { - reject("checkForExistingAssessment missing required parameter" ) - } - loadData( - config.getUrl(url), - (data) => { - if (typeof(data) === 'boolean') { - // console.log("----" + JSON.stringify(data, undefined, 2)) - resolve(data) - } else { - reject("ExistsByExpertgroupAndName - no data") - } - } - ) - }) + if (statusaction === "finish" && errorhandler.hasErrors) { + // console.log("#%% kanikke") + alert("Kan ikke ferdigstille. Vurderingen er ikke korrekt!"); + return; } - // checkForExistingAssessment = (sciName, assessmentId) => { - // //this.expertgroupAssessmentList.map(ega => console.log( ega.scientificName)) - // const result = this.expertgroupAssessmentList.some(ega => this.findSciName(ega.scientificName) == sciName && ega.id != assessmentId) - // //console.log("sciname:", sciName, result) - // return result - // } - - // findSciName = (name) => { - // const dividedName = name.split(" ") - // const result = dividedName[0] + " " + dividedName[1] - // return result - // } - - @action finishassessment(statusaction, assessment) { - let status = statusaction === "finish" ? "finished" : statusaction === "unfinish" ? "inprogress" : "" - let userId = statusaction === "unfinish" ? auth.userId : null - let now = Date.now().toString() - transaction(() => { - assessment.evaluationStatus = status - assessment.lockedForEditAt = now - assessment.lockedForEditByUser = userId - assessment.lastUpdatedOn = now - }) - - if(statusaction === "unfinish") { - this.viewMode = "choosespecie" - this.updateCurrentAssessment(null) + // const status = statusaction === "finish" ? "finished" : "inprogress" // ??? + // this.assessment.evaluationStatus = status + + this.finishCurrentAssessment(statusaction); + } + // ################ end section current assessment ################## + + // // // koder2migrationPathways(mp) { + // // // const r = {} + // // // r.name = mp.Text + // // // // console.log(r.name) + // // // r.value = mp.Value + // // // if(mp.Children) { + // // // r.children = [] + // // // const mpckey = Object.keys(mp.Children)[0] + // // // const mpc = mp.Children[mpckey] + // // // for ( var i = 0; i < mpc.length; ++i ) + // // // { + // // // r.children.push(this.koder2migrationPathways(mpc[i])); + // // // } + // // // } + // // // return r + // // // } + + // // // transformlivsmedium(mp) { + // // // const r = {} + // // // r.Id = mp.Id + // // // r.Value = mp.Id + // // // // console.log(r.name) + // // // r.Text = mp.navn + // // // r.Collapsed = true + // // // r.Children = [] + // // // if(mp.children) { + // // // for ( var i = 0; i < mp.children.length; ++i ) + // // // { + // // // r.Children.push(this.transformlivsmedium(mp.children[i])); + // // // } + // // // } + // // // return r + // // // } + + // // // transformlivsmediumlabels(mp, acc) { + // // // acc[mp.Id] = mp.navn + // // // if(mp.children) { + // // // for ( var i = 0; i < mp.children.length; ++i ) + // // // { + // // // this.transformlivsmediumlabels(mp.children[i], acc) + // // // } + // // // } + // // // return acc + // // // } + + // // // transformtrueteogsjeldnenaturtyper(nt) { + // // // return nt + // // // } + + // // // gettrueteogsjeldnenaturtypercodes(nt) { + // // // this.trueteogsjeldnenaturtypercodes.push("NA " + nt.Value) + // // // if(nt.Children) { + // // // for ( var i = 0; i < nt.Children.length; ++i ) + // // // { + // // // this.gettrueteogsjeldnenaturtypercodes(nt.Children[i]) + // // // } + // // // } + // // // // console.log("!!! trueteogsjeldnenaturtypercodes: " + JSON.stringify(this.trueteogsjeldnenaturtypercodes)) + // // // } + + // // // // isTrueteogsjeldnenaturtype = (ntcode) => { + // // // // const r = {} + // // // // r.Id = [ntcode.niNCode] + // // // // if(ntcode.length > 1) { + // // // // for(var i = 1; i < ntcode.length; ++i) + // // // // { + // // // // r.Id.push(ntcode[i].niNCode) + // // // // } + // // // // } + // // // // // console.log("!!! r.Id: " + JSON.stringify(r.Id)) + // // // // return this.trueteogsjeldnenaturtypercodes.some(element => r.Id.includes(element)) + // // // // } + + // // // isTrueteogsjeldnenaturtype = (ntcode) => { + // // // return this.trueteogsjeldnenaturtypercodes.includes(ntcode) + // // // } + + // // // transformnaturtyperNIN2(nin2codes) { + // // // const r = {} + // // // r.Id = nin2codes.Id + // // // r.Value = nin2codes.Id + // // // r.Text = nin2codes.Text + // // // r.Collapsed = true + // // // if(nin2codes.Redlisted) { + // // // r.Redlisted = nin2codes.Redlisted + // // // } + // // // r.Children = [] + // // // if(nin2codes.Children) { + // // // for ( var i = 0; i < nin2codes.Children.length; ++i ) + // // // { + // // // r.Children.push(this.transformnaturtyperNIN2(nin2codes.Children[i])); + // // // } + // // // } + // // // // console.log("!!! r.Id: " + JSON.stringify(r.Id)) + // // // return r + // // // } + + // ################# start section unused code!! ################## + + // @action forceSyncWithCodes(assessment, codegroups) { + // this.criteriaWithCodes.map(tupple => + // { + // const prop = tupple[0] + // const codekey = tupple[1] + // const codes = codegroups[codekey] + // if(codes == null) { + // console.warn("forceSyncWithCodes: no codes for " + codekey) + // } + // console.log("-" + prop + "¤" + assessment[prop]) + // if (assessment[prop] === []) { + // console.log("*****") + // } + // const existingCode = codes.find(code => code.value === assessment[prop]) + // if (existingCode === undefined ) { + // assessment[prop] = codes[0].value + // } + // } + // ) + // } + + // async loadPåvirkningsfaktorer() { + // const json = await this.getPåvirkningsfaktorer() + // const pvf = observable.object(json) + // runInAction(() => this.påvirkningsfaktorer = pvf) + // } + + // @computed get canAddSelectedPåvirkningsfaktor() { + // var sp = this.selectedPåvirkningsfaktor + // var validsp = (sp.id === "11." || sp.id === "0.") ? // ukjent og ingen trussel + // // sp.tidspunkt === "-" && + // // sp.omfang === "-" && + // // sp.alvorlighetsgrad === "-" + // true : + // // sp.forkortelse && + // sp.beskrivelse && + // sp.tidspunkt != "-" && + // sp.omfang != "-" && + // sp.alvorlighetsgrad != "-" + // return validsp + // } + + // @action clearSelectedPåvirkningsfaktor() { + // transaction(() => { + // const sp = this.selectedPåvirkningsfaktor + // sp.id = null + // sp.forkortelse = null + // sp.overordnetTittel = null + // sp.beskrivelse = null + // sp.tidspunkt = null + // sp.omfang = null + // sp.alvorlighetsgrad = null + // sp.comment = null + // }) + // } + + // @action addSelectedPåvirkningsfaktor() { + // const påv = toJS(this.selectedPåvirkningsfaktor) + // const existing = this.assessment.påvirkningsfaktorer.find(item => + // item.id == påv.id) + // if(existing) { + // // console.log("existing:" + JSON.stringify(existing)) + // this.assessment.påvirkningsfaktorer.remove(existing) + // } + // this.assessment.påvirkningsfaktorer.push(påv) + // this.clearSelectedPåvirkningsfaktor() + // } + + // @action removeSelectedPåvirkningsfaktor(påv) { + // //const påv = this.selectedPåvirkningsfaktor + // this.assessment.påvirkningsfaktorer.remove(påv) + // console.log("Removed " + påv.beskrivelse) + // } + + // @action editPåvirkningsfaktor(påv) { + // console.log("Edit " + JSON.stringify(påv)) + + // transaction(() => { + // const sp = this.selectedPåvirkningsfaktor + // sp.id = påv.id + // sp.forkortelse = påv.forkortelse + // sp.overordnetTittel = påv.overordnetTittel + // sp.beskrivelse = påv.beskrivelse + // sp.tidspunkt = påv.tidspunkt + // sp.omfang = påv.omfang + // sp.alvorlighetsgrad = påv.alvorlighetsgrad + // sp.comment = påv.comment + // }) + // } + // ################# end section unused code!! ################## + + // ################# section API stuff ################## + getUrl = config.getUrl; + + @computed get AssessmentReportLink() { + if (!this.assessment) { + return null; + } + const docid = this.assessmentId; + const url = config.getUrl("artsrapport/assessmentview/") + docid; + // console.log("URL:" + url) + return url; + } + + // addGetters(assessmentObject) { + // console.log("addGetters") + // console.log(JSON.stringify(Object.keys(assessmentObject))) + // } + + async saveCurrentAssessment() { + events.trigger("saveAssessment", "savestart"); + // const data = toJS(this.assessment) + // const json = JSON.stringify(data) + const json = this.assessment.toJSON; + + const currentdata = JSON.parse(json); + const data = JSON.parse(json); + const datastring = JSON.stringify(data); + // this.addGetters(data) + console.log("Y:" + json.length); + const id = data.id; + const url = config.getUrl("assessment/") + id; + fetch(url, { + method: "POST", + // mode: 'no-cors', + body: datastring, // data can be `string` or {object}! (cant get it to work with {object}...) + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: "Bearer " + auth.getAuthToken, + }, + }) + // .then(res => res.json()) + // .then(response => console.log('Success:', JSON.stringify(response))) + .then((response) => checkStatus(response)) + .then(() => this.updateAssessmentSavedVersion(currentdata)) + .then(() => events.trigger("saveAssessment", "savesuccess")) + .catch((error) => { + events.trigger("saveAssessment", "savefailure"); + console.error("Error:", error); + }); + } + + // @action getAssessmentsForFilter() { + // const påv = toJS(this.selectedPåvirkningsfaktor) + // const existing = this.assessment.påvirkningsfaktorer.find(item => + // item.id == påv.id) + // if(existing) { + // // console.log("existing:" + JSON.stringify(existing)) + // this.assessment.påvirkningsfaktorer.remove(existing) + // } + // this.assessment.påvirkningsfaktorer.push(påv) + // // this.clearSelectedPåvirkningsfaktor() + // } + + async loadExpertgroupAssessmentList(expertgroupId) { + runInAction(() => (this.loadingExpertGroup = true)); + const id = expertgroupId.replace("/", "_"); + + var filters = ""; + if (this.assessmentTypeFilter == "horizonScanning") { + filters = filters + "&HorizonScan=true"; + + if ( + this.horizonScanFilter.potentialDoorKnockers.some( + (x) => x == "newPotentialDoorKnocker" + ) + ) + filters = filters + "&Horizon.NR2018=1"; + if ( + this.horizonScanFilter.potentialDoorKnockers.some((x) => x == "NR2018") + ) + filters = filters + "&Horizon.NR2018=5"; + if ( + this.horizonScanFilter.notAssessedDoorKnocker.some( + (x) => x == "notAssessedDoorKnocker" + ) + ) + filters = filters + "&Horizon.NR2018=6"; + if ( + this.horizonScanFilter.notAssessedDoorKnocker.some( + (x) => x == "notEstablishedWithin50Years" + ) + ) + filters = filters + "&Horizon.NR2018=7"; + + if (this.horizonScanFilter.hsNotStarted) + filters = filters + "&Horizon.NotStarted=true"; + if (this.horizonScanFilter.hsFinished) + filters = filters + "&Horizon.Finished=true"; + if (this.horizonScanFilter.toAssessment) + filters = filters + "&Horizon.ToAssessment=true"; + if (this.horizonScanFilter.notAssessed) + filters = filters + "&Horizon.NotAssessed=true"; + + if (this.responsible.length > 0) { + //console.log(this.responsible) + filters = + filters + this.responsible.map((x) => "&Responsible=" + x).join(); + } + + if (this.kunUbehandlede) + filters = filters + "&Comments.KunUbehandlede=true"; + } else { + filters = filters + "&HorizonScan=false"; + if (this.hSStatus) filters = filters + "&HSStatus=true"; + if (this.filterType == "FL2018") { + if (this.historyFilter.vurdert) { + filters = filters + "&History.Status=vurdert"; } else { - this.updateAssessmentSavedVersion(assessment) + if (this.historyFilter.riskAssessedFilter.length > 0) + filters = + filters + + this.historyFilter.riskAssessedFilter + .map((x) => "&History.Status=" + x) + .join(); } - } - - @action setAssessmentComplete(statusaction) { - // console.log("#%% ferdigstill") - if (!this.roleincurrentgroup.writeAccess) { - alert("setAssessmentComplete: 'Not allowed'") - return - } - if (statusaction !== "finish" && statusaction !== "unfinish" ) - { - alert("Wrong statusaction: " + statusaction) - return - } - if (statusaction === "finish" && errorhandler.hasErrors) { - // console.log("#%% kanikke") - alert("Kan ikke ferdigstille. Vurderingen er ikke korrekt!") - return + if (this.historyFilter.ikkevurdert) { + filters = filters + "&History.Status=ikkevurdert"; + } else { + if (this.historyFilter.riskNotAssessedFilter.length > 0) + filters = + filters + + this.historyFilter.riskNotAssessedFilter + .map((x) => "&History.Status=" + x) + .join(); } - - // const status = statusaction === "finish" ? "finished" : "inprogress" // ??? - // this.assessment.evaluationStatus = status - - this.finishCurrentAssessment(statusaction) - } - // ################ end section current assessment ################## - - - - // // // koder2migrationPathways(mp) { - // // // const r = {} - // // // r.name = mp.Text - // // // // console.log(r.name) - // // // r.value = mp.Value - // // // if(mp.Children) { - // // // r.children = [] - // // // const mpckey = Object.keys(mp.Children)[0] - // // // const mpc = mp.Children[mpckey] - // // // for ( var i = 0; i < mpc.length; ++i ) - // // // { - // // // r.children.push(this.koder2migrationPathways(mpc[i])); - // // // } - // // // } - // // // return r - // // // } - - // // // transformlivsmedium(mp) { - // // // const r = {} - // // // r.Id = mp.Id - // // // r.Value = mp.Id - // // // // console.log(r.name) - // // // r.Text = mp.navn - // // // r.Collapsed = true - // // // r.Children = [] - // // // if(mp.children) { - // // // for ( var i = 0; i < mp.children.length; ++i ) - // // // { - // // // r.Children.push(this.transformlivsmedium(mp.children[i])); - // // // } - // // // } - // // // return r - // // // } - - // // // transformlivsmediumlabels(mp, acc) { - // // // acc[mp.Id] = mp.navn - // // // if(mp.children) { - // // // for ( var i = 0; i < mp.children.length; ++i ) - // // // { - // // // this.transformlivsmediumlabels(mp.children[i], acc) - // // // } - // // // } - // // // return acc - // // // } - - - // // // transformtrueteogsjeldnenaturtyper(nt) { - // // // return nt - // // // } - - - // // // gettrueteogsjeldnenaturtypercodes(nt) { - // // // this.trueteogsjeldnenaturtypercodes.push("NA " + nt.Value) - // // // if(nt.Children) { - // // // for ( var i = 0; i < nt.Children.length; ++i ) - // // // { - // // // this.gettrueteogsjeldnenaturtypercodes(nt.Children[i]) - // // // } - // // // } - // // // // console.log("!!! trueteogsjeldnenaturtypercodes: " + JSON.stringify(this.trueteogsjeldnenaturtypercodes)) - // // // } - - // // // // isTrueteogsjeldnenaturtype = (ntcode) => { - // // // // const r = {} - // // // // r.Id = [ntcode.niNCode] - // // // // if(ntcode.length > 1) { - // // // // for(var i = 1; i < ntcode.length; ++i) - // // // // { - // // // // r.Id.push(ntcode[i].niNCode) - // // // // } - // // // // } - // // // // // console.log("!!! r.Id: " + JSON.stringify(r.Id)) - // // // // return this.trueteogsjeldnenaturtypercodes.some(element => r.Id.includes(element)) - // // // // } - - // // // isTrueteogsjeldnenaturtype = (ntcode) => { - // // // return this.trueteogsjeldnenaturtypercodes.includes(ntcode) - // // // } - - // // // transformnaturtyperNIN2(nin2codes) { - // // // const r = {} - // // // r.Id = nin2codes.Id - // // // r.Value = nin2codes.Id - // // // r.Text = nin2codes.Text - // // // r.Collapsed = true - // // // if(nin2codes.Redlisted) { - // // // r.Redlisted = nin2codes.Redlisted - // // // } - // // // r.Children = [] - // // // if(nin2codes.Children) { - // // // for ( var i = 0; i < nin2codes.Children.length; ++i ) - // // // { - // // // r.Children.push(this.transformnaturtyperNIN2(nin2codes.Children[i])); - // // // } - // // // } - // // // // console.log("!!! r.Id: " + JSON.stringify(r.Id)) - // // // return r - // // // } - - - - - - - // ################# start section unused code!! ################## - - - // @action forceSyncWithCodes(assessment, codegroups) { - // this.criteriaWithCodes.map(tupple => - // { - // const prop = tupple[0] - // const codekey = tupple[1] - // const codes = codegroups[codekey] - // if(codes == null) { - // console.warn("forceSyncWithCodes: no codes for " + codekey) - // } - // console.log("-" + prop + "¤" + assessment[prop]) - // if (assessment[prop] === []) { - // console.log("*****") - // } - // const existingCode = codes.find(code => code.value === assessment[prop]) - // if (existingCode === undefined ) { - // assessment[prop] = codes[0].value - // } - // } - // ) - // } - - - // async loadPåvirkningsfaktorer() { - // const json = await this.getPåvirkningsfaktorer() - // const pvf = observable.object(json) - // runInAction(() => this.påvirkningsfaktorer = pvf) - // } - - // @computed get canAddSelectedPåvirkningsfaktor() { - // var sp = this.selectedPåvirkningsfaktor - // var validsp = (sp.id === "11." || sp.id === "0.") ? // ukjent og ingen trussel - // // sp.tidspunkt === "-" && - // // sp.omfang === "-" && - // // sp.alvorlighetsgrad === "-" - // true : - // // sp.forkortelse && - // sp.beskrivelse && - // sp.tidspunkt != "-" && - // sp.omfang != "-" && - // sp.alvorlighetsgrad != "-" - // return validsp - // } - - // @action clearSelectedPåvirkningsfaktor() { - // transaction(() => { - // const sp = this.selectedPåvirkningsfaktor - // sp.id = null - // sp.forkortelse = null - // sp.overordnetTittel = null - // sp.beskrivelse = null - // sp.tidspunkt = null - // sp.omfang = null - // sp.alvorlighetsgrad = null - // sp.comment = null - // }) - // } - - // @action addSelectedPåvirkningsfaktor() { - // const påv = toJS(this.selectedPåvirkningsfaktor) - // const existing = this.assessment.påvirkningsfaktorer.find(item => - // item.id == påv.id) - // if(existing) { - // // console.log("existing:" + JSON.stringify(existing)) - // this.assessment.påvirkningsfaktorer.remove(existing) - // } - // this.assessment.påvirkningsfaktorer.push(påv) - // this.clearSelectedPåvirkningsfaktor() - // } - - // @action removeSelectedPåvirkningsfaktor(påv) { - // //const påv = this.selectedPåvirkningsfaktor - // this.assessment.påvirkningsfaktorer.remove(påv) - // console.log("Removed " + påv.beskrivelse) - // } - - // @action editPåvirkningsfaktor(påv) { - // console.log("Edit " + JSON.stringify(påv)) - - // transaction(() => { - // const sp = this.selectedPåvirkningsfaktor - // sp.id = påv.id - // sp.forkortelse = påv.forkortelse - // sp.overordnetTittel = påv.overordnetTittel - // sp.beskrivelse = påv.beskrivelse - // sp.tidspunkt = påv.tidspunkt - // sp.omfang = påv.omfang - // sp.alvorlighetsgrad = påv.alvorlighetsgrad - // sp.comment = påv.comment - // }) - // } - // ################# end section unused code!! ################## - - - - - // ################# section API stuff ################## - getUrl = config.getUrl - - @computed get AssessmentReportLink() { - if (!this.assessment) { - return null + if (this.historyFilter.riskCategoryFilter.length > 0) + filters = + filters + + this.historyFilter.riskCategoryFilter + .map((x) => "&History.Category=" + x) + .join(); + if (this.historyFilter.decisiveCriteriaFilter.length > 0) + filters = + filters + + this.historyFilter.decisiveCriteriaFilter + .map((x) => "&History.Criteria=" + x.toUpperCase()) + .join(); + } + if (this.filterType == "FL2023") { + if (this.currentFilter.vurdert) { + filters = filters + "&Current.Status=vurdert"; + } else { + if (this.currentFilter.riskAssessedFilter.length > 0) + filters = + filters + + this.currentFilter.riskAssessedFilter + .map((x) => "&Current.Status=" + x) + .join(); } - const docid = this.assessmentId - const url = config.getUrl("artsrapport/assessmentview/") + docid - // console.log("URL:" + url) - return url - } - - // addGetters(assessmentObject) { - // console.log("addGetters") - // console.log(JSON.stringify(Object.keys(assessmentObject))) - // } - - async saveCurrentAssessment() { - events.trigger("saveAssessment", "savestart") - // const data = toJS(this.assessment) - // const json = JSON.stringify(data) - const json = this.assessment.toJSON - - const currentdata = JSON.parse(json) - const data = JSON.parse(json) - const datastring = JSON.stringify(data) - // this.addGetters(data) - console.log("Y:" + json.length) - const id = data.id - const url = config.getUrl("assessment/") + id - fetch(url, { - method: 'POST', - // mode: 'no-cors', - body: datastring, // data can be `string` or {object}! (cant get it to work with {object}...) - headers:{ - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + auth.getAuthToken - - } - }) - // .then(res => res.json()) - // .then(response => console.log('Success:', JSON.stringify(response))) - .then(response => checkStatus(response)) - .then(() => this.updateAssessmentSavedVersion(currentdata)) - .then(() => events.trigger("saveAssessment", "savesuccess")) - .catch(error => - {events.trigger("saveAssessment", "savefailure") - console.error('Error:', error)} - ); - } - - // @action getAssessmentsForFilter() { - // const påv = toJS(this.selectedPåvirkningsfaktor) - // const existing = this.assessment.påvirkningsfaktorer.find(item => - // item.id == påv.id) - // if(existing) { - // // console.log("existing:" + JSON.stringify(existing)) - // this.assessment.påvirkningsfaktorer.remove(existing) - // } - // this.assessment.påvirkningsfaktorer.push(påv) - // // this.clearSelectedPåvirkningsfaktor() - // } - - async loadExpertgroupAssessmentList(expertgroupId) { - runInAction(() => this.loadingExpertGroup = true) - const id = expertgroupId.replace('/','_') - - var filters="" - if (this.assessmentTypeFilter == "horizonScanning") - { - filters=filters + "&HorizonScan=true" - - if (this.horizonScanFilter.potentialDoorKnockers.some(x=> x == "newPotentialDoorKnocker")) filters =filters + "&Horizon.NR2018=1" - if (this.horizonScanFilter.potentialDoorKnockers.some(x=> x == "NR2018")) filters =filters + "&Horizon.NR2018=5" - if (this.horizonScanFilter.notAssessedDoorKnocker.some(x=> x == "notAssessedDoorKnocker")) filters =filters + "&Horizon.NR2018=6" - if (this.horizonScanFilter.notAssessedDoorKnocker.some(x=> x == "notEstablishedWithin50Years")) filters =filters + "&Horizon.NR2018=7" - - if (this.horizonScanFilter.hsNotStarted) filters =filters + "&Horizon.NotStarted=true" - if (this.horizonScanFilter.hsFinished) filters =filters + "&Horizon.Finished=true" - if (this.horizonScanFilter.toAssessment) filters =filters + "&Horizon.ToAssessment=true" - if (this.horizonScanFilter.notAssessed) filters =filters + "&Horizon.NotAssessed=true" - - if (this.responsible.length > 0){ - //console.log(this.responsible) - filters = filters + this.responsible.map((x)=> "&Responsible=" + x ).join() - } - - if (this.kunUbehandlede) filters = filters + "&Comments.KunUbehandlede=true" - }else{ - filters=filters + "&HorizonScan=false" - if (this.hSStatus) filters = filters + "&HSStatus=true" - if (this.filterType == "FL2018"){ - if (this.historyFilter.vurdert) { - filters = filters + "&History.Status=vurdert" - } - else{ - if (this.historyFilter.riskAssessedFilter.length > 0) filters = filters + this.historyFilter.riskAssessedFilter.map((x)=> "&History.Status=" + x ).join() - } - - if (this.historyFilter.ikkevurdert) { - filters = filters + "&History.Status=ikkevurdert" - } - else{ - if (this.historyFilter.riskNotAssessedFilter.length > 0) filters = filters + this.historyFilter.riskNotAssessedFilter.map((x)=> "&History.Status=" + x ).join() - } - - if (this.historyFilter.riskCategoryFilter.length > 0) filters = filters + this.historyFilter.riskCategoryFilter.map((x)=> "&History.Category=" + x ).join() - if (this.historyFilter.decisiveCriteriaFilter.length > 0) filters = filters + this.historyFilter.decisiveCriteriaFilter.map((x)=> "&History.Criteria=" + x.toUpperCase() ).join() - } - if (this.filterType == "FL2023"){ - - if (this.currentFilter.vurdert) { - filters = filters + "&Current.Status=vurdert" - } - else{ - if (this.currentFilter.riskAssessedFilter.length > 0) filters = filters + this.currentFilter.riskAssessedFilter.map((x)=> "&Current.Status=" + x ).join() - } - - if (this.currentFilter.ikkevurdert) { - filters = filters + "&Current.Status=ikkevurdert" - } - else{ - if (this.currentFilter.riskNotAssessedFilter.length > 0) filters = filters + this.currentFilter.riskNotAssessedFilter.map((x)=> "&Current.Status=" + x ).join() - } - if (this.currentFilter.riskCategoryFilter.length > 0) filters = filters + this.currentFilter.riskCategoryFilter.map((x)=> "&Current.Category=" + x ).join() - if (this.currentFilter.decisiveCriteriaFilter.length > 0) filters = filters + this.currentFilter.decisiveCriteriaFilter.map((x)=> "&Current.Criteria=" + x.toUpperCase() ).join() - - } - if (this.filterType == "statusAndCommentFL2023"){ - if (this.workStatus.length > 0){ - filters = filters + this.workStatus.map((x)=> "&Status=" + x ).join() - } - - if (this.responsible.length > 0){ - //console.log(this.responsible) - filters = filters + this.responsible.map((x)=> "&Responsible=" + x ).join() - } - if (this.otherComments.length > 0){ - //console.log(this.responsible) - filters = filters + "&Comments.UserId=" + auth.userId - filters = filters + this.otherComments.map((x)=> "&Comments.CommentType=" + x ).join() - } - } - } - if ( this.expertgroupAssessmentFilter.length > 1){ - filters =filters + "&NameSearch=" + this.expertgroupAssessmentFilter + if (this.currentFilter.ikkevurdert) { + filters = filters + "&Current.Status=ikkevurdert"; + } else { + if (this.currentFilter.riskNotAssessedFilter.length > 0) + filters = + filters + + this.currentFilter.riskNotAssessedFilter + .map((x) => "&Current.Status=" + x) + .join(); } - const url = config.getUrl("expertgroupassessments/") + id + "?page=1" + filters - const expertgroupAssessments = await auth.getJsonRequest(url) - - //console.log("------" + JSON.stringify(expertgroupAssessments)) - - const role = expertgroupAssessments.rolle; - - - - - // role.skriver = true - // role.leser = true - - - const assessments = observable.array(expertgroupAssessments.assessments) - const fixCode = function(author){ - //var parts = author.split(";"); - return { - "text": (author.name + " (" +author.count +")"), - "value": author.name - } + if (this.currentFilter.riskCategoryFilter.length > 0) + filters = + filters + + this.currentFilter.riskCategoryFilter + .map((x) => "&Current.Category=" + x) + .join(); + if (this.currentFilter.decisiveCriteriaFilter.length > 0) + filters = + filters + + this.currentFilter.decisiveCriteriaFilter + .map((x) => "&Current.Criteria=" + x.toUpperCase()) + .join(); + } + if (this.filterType == "statusAndCommentFL2023") { + if (this.workStatus.length > 0) { + filters = filters + this.workStatus.map((x) => "&Status=" + x).join(); } - const authors = expertgroupAssessments.facets[0].facetsItems.map((author) =>fixCode(author)) - console.log("loded " + assessments.length + " assessments") - runInAction(() => { - this.expertgroupAssessmentList = assessments - this.roleincurrentgroup = role - this.loadingExpertGroup = false - this.expertgroupAssessmentTotalCount = expertgroupAssessments.totalCount - this.expertgroupAssessmentFilterCount = expertgroupAssessments.filterCount - this.expertgroupAssessmentAuthors = observable.array(authors) - - if (this.responsible.length > 0) { - for (var i = 0; i < this.responsible.length; i++) { - var isInGroup = false; - for (var j = 0; j < this.expertgroupAssessmentAuthors.length; j++) { - if (this.expertgroupAssessmentAuthors[j].value == this.responsible[i]) { - isInGroup = true; - } - } - if (!isInGroup) { - this.responsible.remove(this.responsible[i]) - } - } - } - this.assessmentsStatistics = observable(expertgroupAssessments.facets) - }) - - } - - //getAssessment = flow(function * (assessmentId) { - async getAssessment(assessmentId) { - const url = config.getUrl("assessment/") + assessmentId - //console.log("assessmentId: " + assessmentId) - // try { - const response = await fetch(url - , { - method: 'GET', - // mode: 'no-cors', - headers: new Headers( { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + auth.getAuthToken - }) - } - ).then((response) => { - if (response.status >= 400 && response.status < 600) { - throw new Error("Bad response from server"); - } - return response; - }).then((returnedResponse) => { - // Your response to manipulate - // const json = await returnedResponse.json() - return returnedResponse; - - }).catch((error) => { - // Your error is here! - console.log(error) - }); - - const json = await response.json() - - return json - } - - @action createNewAssessment(taxinfo) { - console.log("opprett ny vurdering: " + taxinfo.ScientificName + " " + taxinfo.ScientificNameId + " " + taxinfo.Ekspertgruppe) - const url = config.getUrl("assessment/createnew") - fetch(url, { - method: 'PUT', - // mode: 'no-cors', - body: JSON.stringify(taxinfo), - headers:{ - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + auth.getAuthToken - } - }) - .then(response => checkStatus(response)) - .then(() => events.trigger("saveAssessment", "savesuccess")) - .then(() => this.loadCurrentExpertgroupAssessmentList()) - .then(() => this.viewMode = "choosespecie") - - // .then((responsdata) => {if (responsdata && responsdata.message) alert(responsdata.message)}) - .catch(error => - {events.trigger("saveAssessment", "savefailure") - console.error('Error:', error)} - ); - } - - @action moveAssessmentScientificName(taxinfo) { - const id = this.assessmentId - console.log("flytt vurdering til nytt navn: " + taxinfo.ScientificName + " " + taxinfo.ScientificNameId + " " + taxinfo.Ekspertgruppe) - console.log(id + " - " + JSON.stringify(taxinfo)) - const url = config.getUrl("assessment/" + id + "/move") - fetch(url, { - method: 'POST', - // mode: 'no-cors', - body: JSON.stringify(taxinfo), - headers:{ - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + auth.getAuthToken - } - }) - .then(response => checkStatus(response)) - .then(() => events.trigger("saveAssessment", "savesuccess")) - .then(() => this.loadCurrentExpertgroupAssessmentList()) - .then(() => action(() => this.viewMode = "choosespecie")()) - // .then((responsdata) => {if (responsdata && responsdata.message) alert(responsdata.message)}) - .catch(error => - {events.trigger("saveAssessment", "savefailure") - console.error('Error:', error)} - ); - } - - - lockFraHode(v) { - loadData( - config.getUrl("assessment/"+v.id+ "/lock"), - data => { - // Now open the locked - // const id = Number(v.id) - - //todo: there is something fishy going on here. The v.id must be string for this thing to work???!! - // so something must be wrong. this.assessmentId is Number! - - runInAction(()=>this.assessmentId = v.id) - this.loadExpertgroupAssessmentList(this.expertgroup) - }, - error => alert("Feil ved låsing:" +error) - ) + if (this.responsible.length > 0) { + //console.log(this.responsible) + filters = + filters + this.responsible.map((x) => "&Responsible=" + x).join(); + } + if (this.otherComments.length > 0) { + //console.log(this.responsible) + filters = filters + "&Comments.UserId=" + auth.userId; + filters = + filters + + this.otherComments.map((x) => "&Comments.CommentType=" + x).join(); + } + } } - - unlockFraHode(v) { - loadData( - config.getUrl("assessment/"+v.id+ "/unlock"), - data => { - this.loadExpertgroupAssessmentList(this.expertgroup) - }, - error => alert("Feil ved opplåsing:" +error) - ) + if (this.expertgroupAssessmentFilter.length > 1) { + filters = filters + "&NameSearch=" + this.expertgroupAssessmentFilter; } - async getExpertGroups() { - - const url = config.getUrl("expertgroups") - console.log("getExpertGroups: " + url ) - - const response = await fetch(url) - const json = await response.json() - console.log("getExpertGroups: " + JSON.stringify(json) ) - - return json - } + const url = + config.getUrl("expertgroupassessments/") + id + "?page=1" + filters; + const expertgroupAssessments = await auth.getJsonRequest(url); - async getExpertGroupAssessmentList(expertgroupId) { - const id = expertgroupId.value.replace('/','_') - const url = config.getUrl("expertgroupassessments/") + id + //console.log("------" + JSON.stringify(expertgroupAssessments)) - const response = await fetch(url) - const json = await response.json() - //console.log("getExpertGroupAssessmentList: " + JSON.stringify(json)) - return json - } + const role = expertgroupAssessments.rolle; - async finishCurrentAssessment(statusaction) { - const id = this.assessment.id - const url = config.getUrl("assessment/") + id +"/" + statusaction - fetch(url, { - method: 'GET', - headers:{ - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + auth.getAuthToken + // role.skriver = true + // role.leser = true + const assessments = observable.array(expertgroupAssessments.assessments); + const fixCode = function (author) { + //var parts = author.split(";"); + return { + text: author.name + " (" + author.count + ")", + value: author.name, + }; + }; + const authors = expertgroupAssessments.facets[0].facetsItems.map((author) => + fixCode(author) + ); + console.log("loded " + assessments.length + " assessments"); + runInAction(() => { + this.expertgroupAssessmentList = assessments; + this.roleincurrentgroup = role; + this.loadingExpertGroup = false; + this.expertgroupAssessmentTotalCount = expertgroupAssessments.totalCount; + this.expertgroupAssessmentFilterCount = + expertgroupAssessments.filterCount; + this.expertgroupAssessmentAuthors = observable.array(authors); + + if (this.responsible.length > 0) { + for (var i = 0; i < this.responsible.length; i++) { + var isInGroup = false; + for (var j = 0; j < this.expertgroupAssessmentAuthors.length; j++) { + if ( + this.expertgroupAssessmentAuthors[j].value == this.responsible[i] + ) { + isInGroup = true; } - }) - .then(() => console.log("Do the finishing touches")) - .then(() => this.finishassessment(statusaction, this.assessment)) - .then(() => events.trigger("saveAssessment", "savesuccess")) - .then(() => this.loadCurrentExpertgroupAssessmentList()) - .catch(error => - {events.trigger("saveAssessment", "savefailure") - console.error('Error:', error)} - ); - - - - } - - @action copyThisAssessmentToTestarter() { - if (!this.roleincurrentgroup.admin) { - console.warn("copyThisAssessmentToTestarter: 'Not allowed'") - alert("copyThisAssessmentToTestarter: 'Not allowed'") - return + } + if (!isInGroup) { + this.responsible.remove(this.responsible[i]); + } } - const id = this.assessment.id - const url = config.getUrl("assessment/") + id +"/copytotestarter" - fetch(url, { - method: 'GET', - headers:{ - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + auth.getAuthToken - - } - }) - .catch(error => - {console.error('Error:', error)} - ); - } - // ################# end section API stuff ################## - - @computed get isDirty() { - if (!this.assessmentId || !this.assessment) return false - // const a = JSON.stringify(this.assessment) - const a = this.assessment.toJSON - const b = this.assessmentSavedVersionString - return a != b - } - - - // ###################################################################################################################################### - // ###################################################################################################################################### - // ###################################### Move this code to enhance assessment #################################################### - // ###################################################################################################################################### - // ###################################################################################################################################### - - // // // @computed get canEdit() { - // // // return true - // // // // if (!auth.hasAccess) return false; - // // // // if (appState.viewMode === "choosespecie") return false; - // // // // return isLockedByMe() && !isFinished(); - // // // }; - - - // @computed get horizonDoAssessment() { - // if (!this.assessment) return false; - // const result = - // !this.assessment.horizonEstablismentPotential || !this.assessment.horizonEcologicalEffect ? - // false : - // this.assessment.horizonEstablismentPotential == "2" - // || (this.assessment.horizonEstablismentPotential == "1" && this.assessment.horizonEcologicalEffect != "no") - // || (this.assessment.horizonEstablismentPotential == "0" && this.assessment.horizonEcologicalEffect == "yesAfterGone") - // return result - // } - - // @computed get horizonDoScanning() { - // return !this.harVurdering ? false : this.assessment.horizonDoScanning - // } - - // @computed get horizonScanned() { - // return !this.harVurdering ? false : (this.assessment.horizonEstablismentPotential == 2 - // || (this.assessment.horizonEstablismentPotential == 1 && this.assessment.horizonEcologicalEffect != "no") - // || (this.assessment.horizonEstablismentPotential == 0 && this.assessment.horizonEcologicalEffect == "yesAfterGone")) - // } - - // @computed get skalVurderes() { - // // todo. denne er nå knyttet til horisontskanning. Burde kanskje vært generell og hentet verdi fra: assessment.assessmentConclusion - // return !this.harVurdering ? false : this.assessment.isDoorKnocker && this.assessment.skalVurderes ? true : false - // } - // @computed get doFullAssessment() { - // return !this.harVurdering ? false : this.assessment.doFullAssessment - // } - - - // ###################################################################################################################################### - // ###################################################################################################################################### - // ###################################################################################################################################### - - - - - - // ###################################################################################################################################### - // ###################################################################################################################################### - // ############### This code is for FAB assessment and is put her for for UI desitions (!?) ########################################### - // ###################################################################################################################################### - // ###################################################################################################################################### - moveAssessmentHorizon = (riskhorizon) => { - const doorknockerstate = riskhorizon.potensiellDørstokkart - const id = this.assessmentId - console.log("onMoveAssessmentHorizon: " + doorknockerstate) - - - console.log("Show the cat") - action(() => this.showTheCat = true)() - savetimer = setTimeout(() => events.trigger("moveAssessment", "timeout"), 30000) - console.log("Move assessment starter -") - this.movehorizon(id, doorknockerstate) - action(() => { - this.viewMode = "choosespecie" - this.assessmentId = null - })() + } + this.assessmentsStatistics = observable(expertgroupAssessments.facets); + }); + } + + //getAssessment = flow(function * (assessmentId) { + async getAssessment(assessmentId) { + const url = config.getUrl("assessment/") + assessmentId; + //console.log("assessmentId: " + assessmentId) + // try { + const response = await fetch(url, { + method: "GET", + // mode: 'no-cors', + headers: new Headers({ + Accept: "application/json", + "Content-Type": "application/json", + Authorization: "Bearer " + auth.getAuthToken, + }), + }) + .then((response) => { + if (response.status >= 400 && response.status < 600) { + throw new Error("Bad response from server"); + } + return response; + }) + .then((returnedResponse) => { + // Your response to manipulate + // const json = await returnedResponse.json() + return returnedResponse; + }) + .catch((error) => { + // Your error is here! + console.log(error); + }); + + const json = await response.json(); + + return json; + } + + @action createNewAssessment(taxinfo) { + console.log( + "opprett ny vurdering: " + + taxinfo.ScientificName + + " " + + taxinfo.ScientificNameId + + " " + + taxinfo.Ekspertgruppe + ); + const url = config.getUrl("assessment/createnew"); + fetch(url, { + method: "PUT", + // mode: 'no-cors', + body: JSON.stringify(taxinfo), + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: "Bearer " + auth.getAuthToken, + }, + }) + .then((response) => checkStatus(response)) + .then(() => events.trigger("saveAssessment", "savesuccess")) + .then(() => this.loadCurrentExpertgroupAssessmentList()) + .then(() => (this.viewMode = "choosespecie")) + + // .then((responsdata) => {if (responsdata && responsdata.message) alert(responsdata.message)}) + .catch((error) => { + events.trigger("saveAssessment", "savefailure"); + console.error("Error:", error); + }); + } + + @action moveAssessmentScientificName(taxinfo) { + const id = this.assessmentId; + console.log( + "flytt vurdering til nytt navn: " + + taxinfo.ScientificName + + " " + + taxinfo.ScientificNameId + + " " + + taxinfo.Ekspertgruppe + ); + console.log(id + " - " + JSON.stringify(taxinfo)); + const url = config.getUrl("assessment/" + id + "/move"); + fetch(url, { + method: "POST", + // mode: 'no-cors', + body: JSON.stringify(taxinfo), + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: "Bearer " + auth.getAuthToken, + }, + }) + .then((response) => checkStatus(response)) + .then(() => events.trigger("saveAssessment", "savesuccess")) + .then(() => this.loadCurrentExpertgroupAssessmentList()) + .then(() => action(() => (this.viewMode = "choosespecie"))()) + // .then((responsdata) => {if (responsdata && responsdata.message) alert(responsdata.message)}) + .catch((error) => { + events.trigger("saveAssessment", "savefailure"); + console.error("Error:", error); + }); + } + + lockFraHode(v) { + loadData( + config.getUrl("assessment/" + v.id + "/lock"), + (data) => { + // Now open the locked + // const id = Number(v.id) + + //todo: there is something fishy going on here. The v.id must be string for this thing to work???!! + // so something must be wrong. this.assessmentId is Number! + + runInAction(() => (this.assessmentId = v.id)); + this.loadExpertgroupAssessmentList(this.expertgroup); + }, + (error) => alert("Feil ved låsing:" + error) + ); + } + + unlockFraHode(v) { + loadData( + config.getUrl("assessment/" + v.id + "/unlock"), + (data) => { + this.loadExpertgroupAssessmentList(this.expertgroup); + }, + (error) => alert("Feil ved opplåsing:" + error) + ); + } + + async getExpertGroups() { + const url = config.getUrl("expertgroups"); + console.log("getExpertGroups: " + url); + + const response = await fetch(url); + const json = await response.json(); + console.log("getExpertGroups: " + JSON.stringify(json)); + + return json; + } + + async getExpertGroupAssessmentList(expertgroupId) { + const id = expertgroupId.value.replace("/", "_"); + const url = config.getUrl("expertgroupassessments/") + id; + + const response = await fetch(url); + const json = await response.json(); + //console.log("getExpertGroupAssessmentList: " + JSON.stringify(json)) + return json; + } + + async finishCurrentAssessment(statusaction) { + const id = this.assessment.id; + const url = config.getUrl("assessment/") + id + "/" + statusaction; + fetch(url, { + method: "GET", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: "Bearer " + auth.getAuthToken, + }, + }) + .then(() => console.log("Do the finishing touches")) + .then(() => this.finishassessment(statusaction, this.assessment)) + .then(() => events.trigger("saveAssessment", "savesuccess")) + .then(() => this.loadCurrentExpertgroupAssessmentList()) + .catch((error) => { + events.trigger("saveAssessment", "savefailure"); + console.error("Error:", error); + }); + } + + @action copyThisAssessmentToTestarter() { + if (!this.roleincurrentgroup.admin) { + console.warn("copyThisAssessmentToTestarter: 'Not allowed'"); + alert("copyThisAssessmentToTestarter: 'Not allowed'"); + return; } - - movehorizon(id, doorknockerstate) { - loadData( - config.getUrl("assessment/" + id + "/movehorizon/" + doorknockerstate), - data => { - this.loadExpertgroupAssessmentList(this.expertgroup) - }, - error => alert("Feil ved flytting mellom horisontskanning og risikovurdering:" + error) + const id = this.assessment.id; + const url = config.getUrl("assessment/") + id + "/copytotestarter"; + fetch(url, { + method: "GET", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: "Bearer " + auth.getAuthToken, + }, + }).catch((error) => { + console.error("Error:", error); + }); + } + // ################# end section API stuff ################## + + @computed get isDirty() { + if (!this.assessmentId || !this.assessment) return false; + // const a = JSON.stringify(this.assessment) + const a = this.assessment.toJSON; + const b = this.assessmentSavedVersionString; + return a != b; + } + + // ###################################################################################################################################### + // ###################################################################################################################################### + // ###################################### Move this code to enhance assessment #################################################### + // ###################################################################################################################################### + // ###################################################################################################################################### + + // // // @computed get canEdit() { + // // // return true + // // // // if (!auth.hasAccess) return false; + // // // // if (appState.viewMode === "choosespecie") return false; + // // // // return isLockedByMe() && !isFinished(); + // // // }; + + // @computed get horizonDoAssessment() { + // if (!this.assessment) return false; + // const result = + // !this.assessment.horizonEstablismentPotential || !this.assessment.horizonEcologicalEffect ? + // false : + // this.assessment.horizonEstablismentPotential == "2" + // || (this.assessment.horizonEstablismentPotential == "1" && this.assessment.horizonEcologicalEffect != "no") + // || (this.assessment.horizonEstablismentPotential == "0" && this.assessment.horizonEcologicalEffect == "yesAfterGone") + // return result + // } + + // @computed get horizonDoScanning() { + // return !this.harVurdering ? false : this.assessment.horizonDoScanning + // } + + // @computed get horizonScanned() { + // return !this.harVurdering ? false : (this.assessment.horizonEstablismentPotential == 2 + // || (this.assessment.horizonEstablismentPotential == 1 && this.assessment.horizonEcologicalEffect != "no") + // || (this.assessment.horizonEstablismentPotential == 0 && this.assessment.horizonEcologicalEffect == "yesAfterGone")) + // } + + // @computed get skalVurderes() { + // // todo. denne er nå knyttet til horisontskanning. Burde kanskje vært generell og hentet verdi fra: assessment.assessmentConclusion + // return !this.harVurdering ? false : this.assessment.isDoorKnocker && this.assessment.skalVurderes ? true : false + // } + // @computed get doFullAssessment() { + // return !this.harVurdering ? false : this.assessment.doFullAssessment + // } + + // ###################################################################################################################################### + // ###################################################################################################################################### + // ###################################################################################################################################### + + // ###################################################################################################################################### + // ###################################################################################################################################### + // ############### This code is for FAB assessment and is put her for for UI desitions (!?) ########################################### + // ###################################################################################################################################### + // ###################################################################################################################################### + moveAssessmentHorizon = (riskhorizon) => { + const doorknockerstate = riskhorizon.potensiellDørstokkart; + const id = this.assessmentId; + console.log("onMoveAssessmentHorizon: " + doorknockerstate); + + console.log("Show the cat"); + action(() => (this.showTheCat = true))(); + savetimer = setTimeout( + () => events.trigger("moveAssessment", "timeout"), + 30000 + ); + console.log("Move assessment starter -"); + this.movehorizon(id, doorknockerstate); + action(() => { + this.viewMode = "choosespecie"; + this.assessmentId = null; + })(); + }; + + movehorizon(id, doorknockerstate) { + loadData( + config.getUrl("assessment/" + id + "/movehorizon/" + doorknockerstate), + (data) => { + this.loadExpertgroupAssessmentList(this.expertgroup); + }, + (error) => + alert( + "Feil ved flytting mellom horisontskanning og risikovurdering:" + + error ) - } - // ###################################################################################################################################### - // ###################################################################################################################################### - // ###################################################################################################################################### - - - + ); + } + // ###################################################################################################################################### + // ###################################################################################################################################### + // ###################################################################################################################################### } - - -export default new ViewModel() \ No newline at end of file +export default new ViewModel();