forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { VariableUiElement } from "../Base/VariableUIElement"
 | |
| import Loading from "../Base/Loading"
 | |
| import Title from "../Base/Title"
 | |
| import TagRenderingChart from "./TagRenderingChart"
 | |
| import Combine from "../Base/Combine"
 | |
| import Locale from "../i18n/Locale"
 | |
| import { UIEventSource } from "../../Logic/UIEventSource"
 | |
| import { OsmFeature } from "../../Models/OsmFeature"
 | |
| import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
 | |
| import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"
 | |
| 
 | |
| export default class StatisticsPanel extends VariableUiElement {
 | |
|     constructor(
 | |
|         elementsInview: UIEventSource<{ element: OsmFeature; layer: LayerConfig }[]>,
 | |
|         state: {
 | |
|             layoutToUse: LayoutConfig
 | |
|         }
 | |
|     ) {
 | |
|         super(
 | |
|             elementsInview.stabilized(1000).map(
 | |
|                 (features) => {
 | |
|                     if (features === undefined) {
 | |
|                         return new Loading("Loading data")
 | |
|                     }
 | |
|                     if (features.length === 0) {
 | |
|                         return "No elements in view"
 | |
|                     }
 | |
|                     const els = []
 | |
|                     for (const layer of state.layoutToUse.layers) {
 | |
|                         if (layer.name === undefined) {
 | |
|                             continue
 | |
|                         }
 | |
|                         const featuresForLayer = features
 | |
|                             .filter((f) => f.layer === layer)
 | |
|                             .map((f) => f.element)
 | |
|                         if (featuresForLayer.length === 0) {
 | |
|                             continue
 | |
|                         }
 | |
|                         els.push(new Title(layer.name.Clone(), 1).SetClass("mt-8"))
 | |
| 
 | |
|                         const layerStats = []
 | |
|                         for (const tagRendering of layer?.tagRenderings ?? []) {
 | |
|                             const chart = new TagRenderingChart(featuresForLayer, tagRendering, {
 | |
|                                 chartclasses: "w-full",
 | |
|                                 chartstyle: "height: 60rem",
 | |
|                                 includeTitle: false,
 | |
|                             })
 | |
|                             const title = new Title(
 | |
|                                 tagRendering.question?.Clone() ?? tagRendering.id,
 | |
|                                 4
 | |
|                             ).SetClass("mt-8")
 | |
|                             if (!chart.HasClass("hidden")) {
 | |
|                                 layerStats.push(
 | |
|                                     new Combine([title, chart]).SetClass(
 | |
|                                         "flex flex-col w-full lg:w-1/3"
 | |
|                                     )
 | |
|                                 )
 | |
|                             }
 | |
|                         }
 | |
|                         els.push(new Combine(layerStats).SetClass("flex flex-wrap"))
 | |
|                     }
 | |
|                     return new Combine(els)
 | |
|                 },
 | |
|                 [Locale.language]
 | |
|             )
 | |
|         )
 | |
|     }
 | |
| }
 |