2022-01-22 02:56:35 +01:00
import Combine from "../Base/Combine"
2022-06-05 02:24:14 +02:00
import { Store , UIEventSource } from "../../Logic/UIEventSource"
2022-01-22 02:56:35 +01:00
import UserRelatedState from "../../Logic/State/UserRelatedState"
import Translations from "../i18n/Translations"
import { Utils } from "../../Utils"
import { FlowStep } from "./FlowStep"
import Title from "../Base/Title"
import BaseUIElement from "../BaseUIElement"
import Histogram from "../BigComponents/Histogram"
import Toggleable from "../Base/Toggleable"
import List from "../Base/List"
import CheckBoxes from "../Input/Checkboxes"
2023-01-12 01:16:22 +01:00
import { Feature , Point } from "geojson"
2022-01-22 02:56:35 +01:00
/ * *
2022-04-14 01:32:04 +02:00
* Shows the attributes by value , requests to check them of
2022-01-22 02:56:35 +01:00
* /
2022-04-14 01:32:04 +02:00
export class PreviewAttributesPanel
extends Combine
2023-01-12 01:16:22 +01:00
implements FlowStep < { features : Feature < Point > [ ] } >
2022-04-14 01:32:04 +02:00
{
2022-06-05 02:24:14 +02:00
public readonly IsValid : Store < boolean >
2023-01-12 01:16:22 +01:00
public readonly Value : Store < { features : Feature < Point > [ ] } >
2022-01-24 00:19:01 +01:00
2023-01-12 01:16:22 +01:00
constructor ( state : UserRelatedState , geojson : { features : Feature < Point > [ ] } ) {
2022-04-14 01:32:04 +02:00
const t = Translations . t . importHelper . previewAttributes
2022-09-08 21:40:48 +02:00
2022-01-22 02:56:35 +01:00
const propertyKeys = new Set < string > ( )
for ( const f of geojson . features ) {
Object . keys ( f . properties ) . forEach ( ( key ) = > propertyKeys . add ( key ) )
}
2022-01-24 00:19:01 +01:00
const attributeOverview : BaseUIElement [ ] = [ ]
2022-01-22 02:56:35 +01:00
const n = geojson . features . length
for ( const key of Array . from ( propertyKeys ) ) {
const values = Utils . NoNull ( geojson . features . map ( ( f ) = > f . properties [ key ] ) )
const allSame = ! values . some ( ( v ) = > v !== values [ 0 ] )
2022-01-24 00:19:01 +01:00
let countSummary : BaseUIElement
if ( values . length === n ) {
countSummary = t . allAttributesSame
} else {
countSummary = t . someHaveSame . Subs ( {
count : values.length ,
percentage : Math.floor ( ( 100 * values . length ) / n ) ,
} )
}
if ( allSame ) {
attributeOverview . push ( new Title ( key + "=" + values [ 0 ] ) )
attributeOverview . push ( countSummary )
2022-01-22 02:56:35 +01:00
continue
}
const uniqueCount = new Set ( values ) . size
2022-01-24 01:41:57 +01:00
if ( uniqueCount !== values . length && uniqueCount < 15 ) {
2022-01-22 02:56:35 +01:00
attributeOverview . push ( )
// There are some overlapping values: histogram time!
2022-01-24 00:19:01 +01:00
let hist : BaseUIElement = new Combine ( [
countSummary ,
new Histogram ( new UIEventSource < string [ ] > ( values ) , "Value" , "Occurence" , {
sortMode : "count-rev" ,
} ) ,
] ) . SetClass ( "flex flex-col" )
const title = new Title ( key + "=*" )
if ( uniqueCount > 15 ) {
hist = new Toggleable ( title , hist . SetClass ( "block" ) ) . Collapse ( )
} else {
2022-01-22 02:56:35 +01:00
attributeOverview . push ( title )
}
2022-01-24 00:19:01 +01:00
2022-01-22 02:56:35 +01:00
attributeOverview . push ( hist )
continue
}
2022-01-24 00:19:01 +01:00
2022-01-24 01:41:57 +01:00
// All values are different or too much unique values, we add a boring (but collapsable) list
2022-01-22 02:56:35 +01:00
attributeOverview . push (
2022-01-24 00:19:01 +01:00
new Toggleable ( new Title ( key + "=*" ) , new Combine ( [ countSummary , new List ( values ) ] ) )
)
2022-01-22 02:56:35 +01:00
}
2022-01-24 00:19:01 +01:00
2022-01-22 02:56:35 +01:00
const confirm = new CheckBoxes ( [ t . inspectLooksCorrect ] )
2022-01-24 00:19:01 +01:00
2022-01-22 02:56:35 +01:00
super ( [
2022-01-24 00:19:01 +01:00
new Title ( t . inspectDataTitle . Subs ( { count : geojson.features.length } ) ) ,
2022-01-25 00:48:05 +01:00
"Extra remark: An attribute with 'source' or 'src' will be added as 'source' into the map pin; an attribute 'note' will be added into the map pin as well. These values won't be imported" ,
2022-01-22 02:56:35 +01:00
. . . attributeOverview ,
confirm ,
] )
2022-01-24 00:19:01 +01:00
2023-01-12 01:16:22 +01:00
this . Value = new UIEventSource < { features : Feature < Point > [ ] } > ( geojson )
2022-01-22 02:56:35 +01:00
this . IsValid = confirm . GetValue ( ) . map ( ( selected ) = > selected . length == 1 )
}
}