forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			103 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			103 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 | ||
|  |         } | ||
|  |     } | ||
|  | } |