forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			No EOL
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			No EOL
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 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";
 | |
| import * as licenses from "../../assets/generated/license_info.json"
 | |
| import SmallLicense from "../../Models/smallLicense";
 | |
| import {Utils} from "../../Utils";
 | |
| import Link from "../Base/Link";
 | |
| 
 | |
| /**
 | |
|  * The attribution panel shown on mobile
 | |
|  */
 | |
| export default class AttributionPanel extends Combine {
 | |
| 
 | |
|     private static LicenseObject = AttributionPanel.GenerateLicenses();
 | |
| 
 | |
|     constructor(layoutToUse: UIEventSource<LayoutConfig>) {
 | |
|         super([
 | |
|             Translations.t.general.attribution.attributionContent,
 | |
| 
 | |
|             ((layoutToUse.data.maintainer ?? "") == "") ? "" : Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.data.maintainer}),
 | |
|             layoutToUse.data.credits ,
 | |
|             "<br/>",
 | |
|             new Attribution(undefined, undefined, State.state.layoutToUse, undefined),
 | |
|             "<br/>",
 | |
|             "<h3>",Translations.t.general.attribution.iconAttribution.title.Clone().SetClass("pt-6 pb-3"),"</h3>",
 | |
|             ...Utils.NoNull(Array.from(layoutToUse.data.ExtractImages()))
 | |
|                 .map(AttributionPanel.IconAttribution)
 | |
|         ]);
 | |
|         this.SetClass("flex flex-col link-underline")
 | |
|     }
 | |
| 
 | |
|     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;
 | |
|         }
 | |
|         if(license.license.indexOf("trivial")>=0){
 | |
|             return undefined;
 | |
|         }
 | |
| 
 | |
|         const sources =Utils.NoNull(Utils.NoEmpty(license.sources))
 | |
|        
 | |
|         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"),
 | |
|                 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);
 | |
|                     })
 | |
|                 ]
 | |
|                 ).SetClass("block")
 | |
|             ]).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;
 | |
|     }
 | |
| } |