mapcomplete/UI/StatisticsGUI.ts

102 lines
3.2 KiB
TypeScript

/**
* The statistics-gui shows statistics from previous MapComplete-edits
*/
import {UIEventSource} from "../Logic/UIEventSource";
import {VariableUiElement} from "./Base/VariableUIElement";
import ChartJs from "./Base/ChartJs";
import Loading from "./Base/Loading";
import {Utils} from "../Utils";
import Combine from "./Base/Combine";
export default class StatisticsGUI {
public static setup(): void{
new VariableUiElement(index.map(paths => {
if (paths === undefined) {
return new Loading("Loading overview...")
}
const downloaded = new UIEventSource<{ features: ChangeSetData[] }[]>([])
for (const filepath of paths) {
Utils.downloadJson(homeUrl + filepath).then(data => {
downloaded.data.push(data)
downloaded.ping()
})
}
return new VariableUiElement(downloaded.map(downloaded => {
const themeBreakdown = new Map<string, number>()
for (const feats of downloaded) {
console.log("Feats:", feats)
for (const feat of feats.features) {
const key = feat.properties.metadata.theme
const count = themeBreakdown.get(key) ?? 0
themeBreakdown.set(key, count + 1)
}
}
const keys = Array.from(themeBreakdown.keys())
const values = keys.map( k => themeBreakdown.get(k))
console.log(keys, values)
return new Combine([
"Got " + downloaded.length + " files out of " + paths.length,
new ChartJs({
type: "pie",
data: {
datasets: [{data: values}],
labels: keys
}
}).SetClass("w-1/3 h-full")
]).SetClass("block w-full h-full")
})).SetClass("block w-full h-full")
})).SetClass("block w-full h-full").AttachTo("maindiv")
}
}
const homeUrl = "https://raw.githubusercontent.com/pietervdvn/MapComplete/develop/Docs/Tools/stats/"
const stats_files = "file-overview.json"
const index = UIEventSource.FromPromise(Utils.downloadJson(homeUrl + stats_files))
interface ChangeSetData {
"id": number,
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [number, number][][]
},
"properties": {
"check_user": null,
"reasons": [],
"tags": [],
"features": [],
"user": string,
"uid": string,
"editor": string,
"comment": string,
"comments_count": number,
"source": string,
"imagery_used": string,
"date": string,
"reviewed_features": [],
"create": number,
"modify": number,
"delete": number,
"area": number,
"is_suspect": boolean,
"harmful": any,
"checked": boolean,
"check_date": any,
"metadata": {
"host": string,
"theme": string,
"imagery": string,
"language": string
}
}
}