import * as all_layers from "../../../public/assets/generated/themes/personal.json" import ThemeConfig from "../../Models/ThemeConfig/ThemeConfig" import { OsmObject } from "../../Logic/Osm/OsmObject" export class HistoryUtils { public static readonly personalTheme = new ThemeConfig(all_layers, true) private static ignoredLayers = new Set(["fixme"]) public static determineLayer(properties: Record) { return this.personalTheme.getMatchingLayer(properties, this.ignoredLayers) } public static tagHistoryDiff( step: OsmObject, history: OsmObject[] ): { key: string value?: string oldValue?: string step: OsmObject }[] { const previous = history[step.version - 2] if (!previous) { return Object.keys(step.tags) .filter((key) => !key.startsWith("_") && key !== "id") .map((key) => ({ key, value: step.tags[key], step, })) } const previousTags = previous.tags return Object.keys(step.tags) .filter((key) => !key.startsWith("_")) .map((key) => { const value = step.tags[key] const oldValue = previousTags[key] return { key, value, oldValue, step, } }) .filter((ch) => ch.oldValue !== ch.value) } public static fullHistoryDiff( histories: OsmObject[][], onlyShowUsername?: Set ): { key: string value?: string oldValue?: string step: OsmObject }[] { const allDiffs: { key: string value?: string oldValue?: string step: OsmObject }[] = [] for (const history of histories) { const filtered = history.filter( (step) => !onlyShowUsername || onlyShowUsername?.has(step.tags["_last_edit:contributor"]) ) for (const step of filtered) { const diff: { key: string value?: string oldValue?: string step: OsmObject }[] = HistoryUtils.tagHistoryDiff(step, history) allDiffs.push(...diff) } } return allDiffs } }