2022-01-21 01:57:16 +01:00
import Combine from "../Base/Combine" ;
import { FlowStep } from "./FlowStep" ;
import { BBox } from "../../Logic/BBox" ;
import LayerConfig from "../../Models/ThemeConfig/LayerConfig" ;
import { UIEventSource } from "../../Logic/UIEventSource" ;
import CreateNoteImportLayer from "../../Models/ThemeConfig/Conversion/CreateNoteImportLayer" ;
import FilteredLayer , { FilterState } from "../../Models/FilteredLayer" ;
import GeoJsonSource from "../../Logic/FeatureSource/Sources/GeoJsonSource" ;
import MetaTagging from "../../Logic/MetaTagging" ;
import RelationsTracker from "../../Logic/Osm/RelationsTracker" ;
import FilteringFeatureSource from "../../Logic/FeatureSource/Sources/FilteringFeatureSource" ;
import Minimap from "../Base/Minimap" ;
import ShowDataLayer from "../ShowDataLayer/ShowDataLayer" ;
import FeatureInfoBox from "../Popup/FeatureInfoBox" ;
import { ImportUtils } from "./ImportUtils" ;
import * as import_candidate from "../../assets/layers/import_candidate/import_candidate.json" ;
import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource" ;
import Title from "../Base/Title" ;
import Loading from "../Base/Loading" ;
import { FixedUiElement } from "../Base/FixedUiElement" ;
import { VariableUiElement } from "../Base/VariableUIElement" ;
import * as known_layers from "../../assets/generated/known_layers.json"
import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" ;
/ * *
* Filters out points for which the import - note already exists , to prevent duplicates
* /
2022-03-24 03:11:29 +01:00
export class CompareToAlreadyExistingNotes extends Combine implements FlowStep < { bbox : BBox , layer : LayerConfig , features : any [ ] , theme : string } > {
2022-01-21 01:57:16 +01:00
public IsValid : UIEventSource < boolean >
2022-03-24 03:11:29 +01:00
public Value : UIEventSource < { bbox : BBox , layer : LayerConfig , features : any [ ] , theme : string } >
2022-01-21 01:57:16 +01:00
2022-03-24 03:11:29 +01:00
constructor ( state , params : { bbox : BBox , layer : LayerConfig , features : any [ ] , theme : string } ) {
2022-01-21 01:57:16 +01:00
2022-01-22 02:56:35 +01:00
const layerConfig = known_layers . layers . filter ( l = > l . id === params . layer . id ) [ 0 ]
2022-01-26 21:40:38 +01:00
if ( layerConfig === undefined ) {
2022-01-22 02:56:35 +01:00
console . error ( "WEIRD: layer not found in the builtin layer overview" )
}
2022-03-24 03:11:29 +01:00
const importLayerJson = new CreateNoteImportLayer ( 150 ) . convertStrict ( < LayerConfigJson > layerConfig , "CompareToAlreadyExistingNotes" )
2022-01-21 01:57:16 +01:00
const importLayer = new LayerConfig ( importLayerJson , "import-layer-dynamic" )
const flayer : FilteredLayer = {
appliedFilters : new UIEventSource < Map < string , FilterState > > ( new Map < string , FilterState > ( ) ) ,
isDisplayed : new UIEventSource < boolean > ( true ) ,
layerDef : importLayer
}
2022-01-22 02:56:35 +01:00
const allNotesWithinBbox = new GeoJsonSource ( flayer , params . bbox . padAbsolute ( 0.0001 ) )
2022-03-24 03:11:29 +01:00
2022-01-22 02:56:35 +01:00
allNotesWithinBbox . features . map ( f = > MetaTagging . addMetatags (
2022-01-21 01:57:16 +01:00
f ,
{
memberships : new RelationsTracker ( ) ,
2022-03-24 03:11:29 +01:00
getFeaturesWithin : ( ) = > [ ] ,
getFeatureById : ( ) = > undefined
2022-01-21 01:57:16 +01:00
} ,
importLayer ,
state ,
{
includeDates : true ,
// We assume that the non-dated metatags are already set by the cache generator
includeNonDates : true
}
)
)
2022-01-22 02:56:35 +01:00
const alreadyOpenImportNotes = new FilteringFeatureSource ( state , undefined , allNotesWithinBbox )
alreadyOpenImportNotes . features . addCallbackD ( features = > console . log ( "Loaded and filtered features are" , features ) )
2022-01-21 01:57:16 +01:00
const map = Minimap . createMiniMap ( )
map . SetClass ( "w-full" ) . SetStyle ( "height: 500px" )
2022-01-22 02:56:35 +01:00
const comparisonMap = Minimap . createMiniMap ( {
2022-01-21 01:57:16 +01:00
location : map.location ,
} )
2022-01-22 02:56:35 +01:00
comparisonMap . SetClass ( "w-full" ) . SetStyle ( "height: 500px" )
2022-01-21 01:57:16 +01:00
new ShowDataLayer ( {
layerToShow : importLayer ,
state ,
zoomToFeatures : true ,
leafletMap : map.leafletMap ,
2022-01-22 02:56:35 +01:00
features : alreadyOpenImportNotes ,
2022-01-21 01:57:16 +01:00
popup : ( tags , layer ) = > new FeatureInfoBox ( tags , layer , state )
} )
2022-03-24 03:11:29 +01:00
const maxDistance = new UIEventSource < number > ( 10 )
2022-01-21 01:57:16 +01:00
2022-03-24 03:11:29 +01:00
const partitionedImportPoints = ImportUtils . partitionFeaturesIfNearby ( params , alreadyOpenImportNotes . features
2022-01-21 01:57:16 +01:00
. map ( ff = > ( { features : ff.map ( ff = > ff . feature ) } ) ) , maxDistance )
new ShowDataLayer ( {
layerToShow : new LayerConfig ( import_candidate ) ,
state ,
zoomToFeatures : true ,
2022-01-22 02:56:35 +01:00
leafletMap : comparisonMap.leafletMap ,
2022-01-21 01:57:16 +01:00
features : new StaticFeatureSource ( partitionedImportPoints . map ( p = > p . hasNearby ) , false ) ,
popup : ( tags , layer ) = > new FeatureInfoBox ( tags , layer , state )
} )
super ( [
new Title ( "Compare with already existing 'to-import'-notes" ) ,
2022-01-22 02:56:35 +01:00
new VariableUiElement (
2022-01-26 21:40:38 +01:00
alreadyOpenImportNotes . features . map ( notesWithImport = > {
2022-03-24 03:11:29 +01:00
if ( allNotesWithinBbox . state . data !== undefined && allNotesWithinBbox . state . data [ "error" ] !== undefined ) {
return new FixedUiElement ( "Loading notes failed: " + allNotesWithinBbox . state . data [ "error" ] )
}
2022-01-26 21:40:38 +01:00
if ( allNotesWithinBbox . features . data === undefined || allNotesWithinBbox . features . data . length === 0 ) {
return new Loading ( "Fetching notes from OSM" )
2022-01-22 02:56:35 +01:00
}
2022-01-26 21:40:38 +01:00
if ( notesWithImport . length === 0 ) {
2022-03-24 03:11:29 +01:00
return new FixedUiElement ( "No previous import notes found" ) . SetClass ( "thanks" )
2022-01-22 02:56:35 +01:00
}
return new Combine ( [
2022-03-24 03:11:29 +01:00
"The red elements on the next map are all the data points from your dataset. There are <b>" + params . features . length + "</b> elements in your dataset." ,
2022-01-22 02:56:35 +01:00
map ,
2022-03-24 03:11:29 +01:00
new VariableUiElement ( partitionedImportPoints . map ( ( { noNearby , hasNearby } ) = > {
if ( noNearby . length === 0 ) {
// Nothing can be imported
return new FixedUiElement ( "All of the proposed points have (or had) an import note already" ) . SetClass ( "alert w-full block" ) . SetStyle ( "padding: 0.5rem" )
}
if ( hasNearby . length === 0 ) {
// All points can be imported
return new FixedUiElement ( "All of the proposed points have don't have a previous import note nearby" ) . SetClass ( "thanks w-full block" ) . SetStyle ( "padding: 0.5rem" )
}
return new Combine ( [
new FixedUiElement ( hasNearby . length + " points do have an already existing import note within " + maxDistance . data + " meter." ) . SetClass ( "alert" ) ,
"These data points will <i>not</i> be imported and are shown as red dots on the map below" ,
comparisonMap . SetClass ( "w-full" )
] ) . SetClass ( "w-full" )
} ) )
2022-01-22 02:56:35 +01:00
] ) . SetClass ( "flex flex-col" )
2022-01-26 21:40:38 +01:00
2022-03-24 03:11:29 +01:00
} , [ allNotesWithinBbox . features , allNotesWithinBbox . state ] )
2022-01-21 01:57:16 +01:00
) ,
] ) ;
this . SetClass ( "flex flex-col" )
this . Value = partitionedImportPoints . map ( ( { noNearby } ) = > ( {
2022-03-24 03:11:29 +01:00
features : noNearby ,
2022-01-21 01:57:16 +01:00
bbox : params.bbox ,
2022-03-24 03:11:29 +01:00
layer : params.layer ,
theme : params.theme
2022-01-21 01:57:16 +01:00
} ) )
2022-01-22 02:56:35 +01:00
this . IsValid = alreadyOpenImportNotes . features . map ( ff = > {
2022-01-26 21:40:38 +01:00
if ( allNotesWithinBbox . features . data . length === 0 ) {
2022-01-22 02:56:35 +01:00
// Not yet loaded
return false
}
2022-01-26 21:40:38 +01:00
if ( ff . length == 0 ) {
2022-01-22 02:56:35 +01:00
// No import notes at all
return true ;
}
2022-01-26 21:40:38 +01:00
2022-01-22 02:56:35 +01:00
return partitionedImportPoints . data . noNearby . length > 0 ; // at least _something_ can be imported
} , [ partitionedImportPoints , allNotesWithinBbox . features ] )
2022-01-21 01:57:16 +01:00
}
}