| 
									
										
										
										
											2021-04-07 01:32:39 +02:00
										 |  |  | import Combine from "../Base/Combine"; | 
					
						
							|  |  |  | import Translations from "../i18n/Translations"; | 
					
						
							|  |  |  | import Attribution from "./Attribution"; | 
					
						
							|  |  |  | import State from "../../State"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import LayoutConfig from "../../Customizations/JSON/LayoutConfig"; | 
					
						
							|  |  |  | import {FixedUiElement} from "../Base/FixedUiElement"; | 
					
						
							| 
									
										
										
										
											2021-04-09 02:57:06 +02:00
										 |  |  | import * as licenses from "../../assets/generated/license_info.json" | 
					
						
							|  |  |  | import SmallLicense from "../../Models/smallLicense"; | 
					
						
							| 
									
										
										
										
											2021-04-10 03:53:48 +02:00
										 |  |  | import {Utils} from "../../Utils"; | 
					
						
							| 
									
										
										
										
											2021-04-23 17:22:01 +02:00
										 |  |  | import Link from "../Base/Link"; | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  | import {VariableUiElement} from "../Base/VariableUIElement"; | 
					
						
							| 
									
										
										
										
											2021-04-07 01:32:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * The attribution panel shown on mobile | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export default class AttributionPanel extends Combine { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 02:57:06 +02:00
										 |  |  |     private static LicenseObject = AttributionPanel.GenerateLicenses(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  |     constructor(layoutToUse: UIEventSource<LayoutConfig>, contributions: UIEventSource<Map<string, number>>) { | 
					
						
							| 
									
										
										
										
											2021-04-07 01:32:39 +02:00
										 |  |  |         super([ | 
					
						
							|  |  |  |             Translations.t.general.attribution.attributionContent, | 
					
						
							| 
									
										
										
										
											2021-04-09 17:56:13 +02:00
										 |  |  |             ((layoutToUse.data.maintainer ?? "") == "") ? "" : Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.data.maintainer}), | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  |             layoutToUse.data.credits, | 
					
						
							| 
									
										
										
										
											2021-04-07 01:32:39 +02:00
										 |  |  |             "<br/>", | 
					
						
							|  |  |  |             new Attribution(undefined, undefined, State.state.layoutToUse, undefined), | 
					
						
							|  |  |  |             "<br/>", | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             new VariableUiElement(contributions.map(contributions => { | 
					
						
							|  |  |  |                 const sorted = Array.from(contributions, ([name, value]) => ({name, value})); | 
					
						
							|  |  |  |                 if (sorted.length === 0) { | 
					
						
							|  |  |  |                     return ""; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 sorted.sort((a, b) => b.value - a.value); | 
					
						
							|  |  |  |                 let hiddenCount = 0; | 
					
						
							|  |  |  |                 if (sorted.length > 10) { | 
					
						
							|  |  |  |                     hiddenCount = sorted.length - 10 | 
					
						
							|  |  |  |                     sorted.splice(10, sorted.length - 10) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 const links = sorted.map(kv => `<a href="https://openstreetmap.org/user/${kv.name}" target="_blank">${kv.name}</a>`) | 
					
						
							|  |  |  |                 const contribs = links.join(", ") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (hiddenCount == 0) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     return Translations.t.general.attribution.mapContributionsBy.Subs({ | 
					
						
							|  |  |  |                         contributors: contribs | 
					
						
							|  |  |  |                     }).InnerRender() | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     return Translations.t.general.attribution.mapContributionsByAndHidden.Subs({ | 
					
						
							|  |  |  |                         contributors: contribs, | 
					
						
							|  |  |  |                         hiddenCount: hiddenCount | 
					
						
							|  |  |  |                     }).InnerRender(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             })), | 
					
						
							|  |  |  |             "<br/>", | 
					
						
							|  |  |  |             "<h3>", Translations.t.general.attribution.iconAttribution.title.Clone().SetClass("pt-6 pb-3"), "</h3>", | 
					
						
							| 
									
										
										
										
											2021-04-10 03:53:48 +02:00
										 |  |  |             ...Utils.NoNull(Array.from(layoutToUse.data.ExtractImages())) | 
					
						
							|  |  |  |                 .map(AttributionPanel.IconAttribution) | 
					
						
							| 
									
										
										
										
											2021-04-07 01:32:39 +02:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2021-04-12 13:05:30 +02:00
										 |  |  |         this.SetClass("flex flex-col link-underline") | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  |         this.SetStyle("max-width: calc(100vw - 5em); width: 40em;") | 
					
						
							| 
									
										
										
										
											2021-04-09 02:57:06 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static IconAttribution(iconPath: string) { | 
					
						
							|  |  |  |         if (iconPath.startsWith("http")) { | 
					
						
							|  |  |  |             iconPath = "." + new URL(iconPath).pathname; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const license: SmallLicense = AttributionPanel.LicenseObject[iconPath] | 
					
						
							|  |  |  |         if (license == undefined) { | 
					
						
							|  |  |  |             return undefined; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  |         if (license.license.indexOf("trivial") >= 0) { | 
					
						
							| 
									
										
										
										
											2021-04-09 02:57:06 +02:00
										 |  |  |             return undefined; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  |         const sources = Utils.NoNull(Utils.NoEmpty(license.sources)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 02:57:06 +02:00
										 |  |  |         return new Combine([ | 
					
						
							|  |  |  |             `<img src='${iconPath}' style="width: 50px; height: 50px; margin-right: 0.5em;">`, | 
					
						
							|  |  |  |             new Combine([ | 
					
						
							|  |  |  |                 new FixedUiElement(license.authors.join("; ")).SetClass("font-bold"), | 
					
						
							| 
									
										
										
										
											2021-05-10 23:48:00 +02:00
										 |  |  |                 new Combine([license.license, | 
					
						
							|  |  |  |                         sources.length > 0 ? " - " : "", | 
					
						
							|  |  |  |                         ...sources.map(lnk => { | 
					
						
							|  |  |  |                             let sourceLinkContent = lnk; | 
					
						
							|  |  |  |                             try { | 
					
						
							|  |  |  |                                 sourceLinkContent = new URL(lnk).hostname | 
					
						
							|  |  |  |                             } catch { | 
					
						
							|  |  |  |                                 console.error("Not a valid URL:", lnk) | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                             return new Link(sourceLinkContent, lnk, true); | 
					
						
							|  |  |  |                         }) | 
					
						
							|  |  |  |                     ] | 
					
						
							| 
									
										
										
										
											2021-04-23 17:22:01 +02:00
										 |  |  |                 ).SetClass("block") | 
					
						
							| 
									
										
										
										
											2021-04-09 02:57:06 +02:00
										 |  |  |             ]).SetClass("flex flex-col") | 
					
						
							|  |  |  |         ]).SetClass("flex") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static GenerateLicenses() { | 
					
						
							|  |  |  |         const allLicenses = {} | 
					
						
							|  |  |  |         for (const key in licenses) { | 
					
						
							|  |  |  |             const license: SmallLicense = licenses[key]; | 
					
						
							|  |  |  |             allLicenses[license.path] = license | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return allLicenses; | 
					
						
							| 
									
										
										
										
											2021-04-07 01:32:39 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |