| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import PointRenderingConfigJson from "./Json/PointRenderingConfigJson" | 
					
						
							|  |  |  | import TagRenderingConfig from "./TagRenderingConfig" | 
					
						
							|  |  |  | import { TagsFilter } from "../../Logic/Tags/TagsFilter" | 
					
						
							|  |  |  | import SharedTagRenderings from "../../Customizations/SharedTagRenderings" | 
					
						
							|  |  |  | import { TagUtils } from "../../Logic/Tags/TagUtils" | 
					
						
							|  |  |  | import { Utils } from "../../Utils" | 
					
						
							|  |  |  | import Svg from "../../Svg" | 
					
						
							|  |  |  | import WithContextLoader from "./WithContextLoader" | 
					
						
							|  |  |  | import { UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  | import BaseUIElement from "../../UI/BaseUIElement" | 
					
						
							|  |  |  | import { FixedUiElement } from "../../UI/Base/FixedUiElement" | 
					
						
							|  |  |  | import Img from "../../UI/Base/Img" | 
					
						
							|  |  |  | import Combine from "../../UI/Base/Combine" | 
					
						
							|  |  |  | import { VariableUiElement } from "../../UI/Base/VariableUIElement" | 
					
						
							| 
									
										
										
										
											2022-12-16 13:45:07 +01:00
										 |  |  | import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" | 
					
						
							| 
									
										
										
										
											2022-06-04 18:10:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | export default class PointRenderingConfig extends WithContextLoader { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     private static readonly allowed_location_codes = new Set<string>([ | 
					
						
							|  |  |  |         "point", | 
					
						
							|  |  |  |         "centroid", | 
					
						
							|  |  |  |         "start", | 
					
						
							|  |  |  |         "end", | 
					
						
							|  |  |  |         "projected_centerpoint", | 
					
						
							|  |  |  |     ]) | 
					
						
							|  |  |  |     public readonly location: Set< | 
					
						
							|  |  |  |         "point" | "centroid" | "start" | "end" | "projected_centerpoint" | string | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |     public readonly icon?: TagRenderingConfig | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     public readonly iconBadges: { if: TagsFilter; then: TagRenderingConfig }[] | 
					
						
							|  |  |  |     public readonly iconSize: TagRenderingConfig | 
					
						
							|  |  |  |     public readonly label: TagRenderingConfig | 
					
						
							|  |  |  |     public readonly rotation: TagRenderingConfig | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |     public readonly cssDef: TagRenderingConfig | 
					
						
							|  |  |  |     public readonly cssClasses?: TagRenderingConfig | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     constructor(json: PointRenderingConfigJson, context: string) { | 
					
						
							|  |  |  |         super(json, context) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (typeof json.location === "string") { | 
					
						
							| 
									
										
										
										
											2021-10-28 03:15:36 +02:00
										 |  |  |             json.location = [json.location] | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-22 01:07:32 +02:00
										 |  |  |         this.location = new Set(json.location) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.location.forEach((l) => { | 
					
						
							| 
									
										
										
										
											2021-10-28 03:15:36 +02:00
										 |  |  |             const allowed = PointRenderingConfig.allowed_location_codes | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             if (!allowed.has(l)) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 throw `A point rendering has an invalid location: '${l}' is not one of ${Array.from( | 
					
						
							|  |  |  |                     allowed | 
					
						
							|  |  |  |                 ).join(", ")} (at ${context}.location)`
 | 
					
						
							| 
									
										
										
										
											2021-10-28 03:15:36 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (json.icon === undefined && json.label === undefined) { | 
					
						
							| 
									
										
										
										
											2021-11-05 01:19:27 +01:00
										 |  |  |             throw `A point rendering should define at least an icon or a label` | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-22 01:07:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         if (this.location.size == 0) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             throw ( | 
					
						
							|  |  |  |                 "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " + | 
					
						
							|  |  |  |                 context + | 
					
						
							|  |  |  |                 ".location)" | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2021-10-22 01:07:32 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.icon = this.tr("icon", undefined) | 
					
						
							| 
									
										
										
										
											2022-12-16 13:45:07 +01:00
										 |  |  |         if (json.css !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |             this.cssDef = this.tr("css", undefined) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         this.cssClasses = this.tr("cssClasses", undefined) | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         this.iconBadges = (json.iconBadges ?? []).map((overlay, i) => { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             let tr: TagRenderingConfig | 
					
						
							|  |  |  |             if ( | 
					
						
							|  |  |  |                 typeof overlay.then === "string" && | 
					
						
							|  |  |  |                 SharedTagRenderings.SharedIcons.get(overlay.then) !== undefined | 
					
						
							|  |  |  |             ) { | 
					
						
							|  |  |  |                 tr = SharedTagRenderings.SharedIcons.get(overlay.then) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 tr = new TagRenderingConfig(overlay.then, `iconBadges.${i}`) | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             return { | 
					
						
							|  |  |  |                 if: TagUtils.Tag(overlay.if), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 then: tr, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const iconPath = this.icon?.GetRenderValue({ id: "node/-1" })?.txt | 
					
						
							| 
									
										
										
										
											2021-11-22 00:50:29 +01:00
										 |  |  |         if (iconPath !== undefined && iconPath.startsWith(Utils.assets_path)) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const iconKey = iconPath.substr(Utils.assets_path.length) | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             if (Svg.All[iconKey] === undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 throw context + ": builtin SVG asset not found: " + iconPath | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.iconSize = this.tr("iconSize", "40,40,center") | 
					
						
							|  |  |  |         this.label = this.tr("label", undefined) | 
					
						
							|  |  |  |         this.rotation = this.tr("rotation", "0") | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Given a single HTML spec (either a single image path OR "image_path_to_known_svg:fill-colour", returns a fixedUIElement containing that | 
					
						
							|  |  |  |      * The element will fill 100% and be positioned absolutely with top:0 and left: 0 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private static FromHtmlSpec(htmlSpec: string, style: string, isBadge = false): BaseUIElement { | 
					
						
							|  |  |  |         if (htmlSpec === undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return undefined | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const match = htmlSpec.match(/([a-zA-Z0-9_]*):([^;]*)/) | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         if (match !== null && Svg.All[match[1] + ".svg"] !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const svg = Svg.All[match[1] + ".svg"] as string | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |             const targetColor = match[2] | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const img = new Img( | 
					
						
							|  |  |  |                 svg.replace(/(rgb\(0%,0%,0%\)|#000000|#000)/g, targetColor), | 
					
						
							|  |  |  |                 true | 
					
						
							|  |  |  |             ).SetStyle(style) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             if (isBadge) { | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |                 img.SetClass("badge") | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return img | 
					
						
							| 
									
										
										
										
											2022-02-11 02:03:33 +01:00
										 |  |  |         } else if (Svg.All[htmlSpec + ".svg"] !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const svg = Svg.All[htmlSpec + ".svg"] as string | 
					
						
							|  |  |  |             const img = new Img(svg, true).SetStyle(style) | 
					
						
							| 
									
										
										
										
											2022-02-11 02:03:33 +01:00
										 |  |  |             if (isBadge) { | 
					
						
							|  |  |  |                 img.SetClass("badge") | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return img | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return new FixedUiElement(`<img src="${htmlSpec}" style="${style}" />`) | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     private static FromHtmlMulti( | 
					
						
							|  |  |  |         multiSpec: string, | 
					
						
							|  |  |  |         rotation: string, | 
					
						
							|  |  |  |         isBadge: boolean, | 
					
						
							|  |  |  |         defaultElement: BaseUIElement = undefined | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         if (multiSpec === undefined) { | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |             return defaultElement | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const style = `width:100%;height:100%;transform: rotate( ${rotation} );display:block;position: absolute; top: 0; left: 0` | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const htmlDefs = multiSpec.trim()?.split(";") ?? [] | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const elements = Utils.NoEmpty(htmlDefs).map((def) => | 
					
						
							|  |  |  |             PointRenderingConfig.FromHtmlSpec(def, style, isBadge) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         if (elements.length === 0) { | 
					
						
							|  |  |  |             return defaultElement | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return new Combine(elements).SetClass("relative block w-full h-full") | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 22:37:21 +01:00
										 |  |  |     public GetBaseIcon(tags?: any): BaseUIElement { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         tags = tags ?? { id: "node/-1" } | 
					
						
							| 
									
										
										
										
											2022-02-09 22:37:21 +01:00
										 |  |  |         let defaultPin: BaseUIElement = undefined | 
					
						
							|  |  |  |         if (this.label === undefined) { | 
					
						
							|  |  |  |             defaultPin = Svg.teardrop_with_hole_green_svg() | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         if (this.icon === undefined) { | 
					
						
							|  |  |  |             return defaultPin | 
					
						
							| 
									
										
										
										
											2022-06-04 18:10:09 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const rotation = Utils.SubstituteKeys( | 
					
						
							|  |  |  |             this.rotation?.GetRenderValue(tags)?.txt ?? "0deg", | 
					
						
							|  |  |  |             tags | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-06-04 18:10:09 +02:00
										 |  |  |         const htmlDefs = Utils.SubstituteKeys(this.icon?.GetRenderValue(tags)?.txt, tags) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         if (htmlDefs === undefined) { | 
					
						
							| 
									
										
										
										
											2022-06-04 18:10:09 +02:00
										 |  |  |             // This layer doesn't want to show an icon right now
 | 
					
						
							|  |  |  |             return undefined | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         return PointRenderingConfig.FromHtmlMulti(htmlDefs, rotation, false, defaultPin) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-02-11 02:03:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |     public GetSimpleIcon(tags: UIEventSource<any>): BaseUIElement { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const self = this | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         if (this.icon === undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return undefined | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         return new VariableUiElement(tags.map((tags) => self.GetBaseIcon(tags))).SetClass( | 
					
						
							|  |  |  |             "w-full h-full block" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |     public GenerateLeafletStyle( | 
					
						
							|  |  |  |         tags: UIEventSource<any>, | 
					
						
							| 
									
										
										
										
											2021-10-30 02:34:16 +02:00
										 |  |  |         clickable: boolean, | 
					
						
							|  |  |  |         options?: { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             noSize?: false | boolean | 
					
						
							| 
									
										
										
										
											2022-02-01 04:14:54 +01:00
										 |  |  |             includeBadges?: true | boolean | 
					
						
							| 
									
										
										
										
											2021-10-30 02:34:16 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     ): { | 
					
						
							|  |  |  |         html: BaseUIElement | 
					
						
							|  |  |  |         iconSize: [number, number] | 
					
						
							|  |  |  |         iconAnchor: [number, number] | 
					
						
							|  |  |  |         popupAnchor: [number, number] | 
					
						
							|  |  |  |         iconUrl: string | 
					
						
							|  |  |  |         className: string | 
					
						
							|  |  |  |     } { | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         function num(str, deflt = 40) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const n = Number(str) | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             if (isNaN(n)) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 return deflt | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return n | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         function render(tr: TagRenderingConfig, deflt?: string) { | 
					
						
							|  |  |  |             if (tags === undefined) { | 
					
						
							|  |  |  |                 return deflt | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             const str = tr?.GetRenderValue(tags.data)?.txt ?? deflt | 
					
						
							|  |  |  |             return Utils.SubstituteKeys(str, tags.data).replace(/{.*}/g, "") | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const iconSize = render(this.iconSize, "40,40,center").split(",") | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const iconW = num(iconSize[0]) | 
					
						
							|  |  |  |         let iconH = num(iconSize[1]) | 
					
						
							|  |  |  |         const mode = iconSize[2]?.trim()?.toLowerCase() ?? "center" | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         let anchorW = iconW / 2 | 
					
						
							|  |  |  |         let anchorH = iconH / 2 | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         if (mode === "left") { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             anchorW = 0 | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (mode === "right") { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             anchorW = iconW | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (mode === "top") { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             anchorH = 0 | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (mode === "bottom") { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             anchorH = iconH | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 00:50:29 +01:00
										 |  |  |         const icon = this.GetSimpleIcon(tags) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         let badges = undefined | 
					
						
							| 
									
										
										
										
											2022-02-11 02:03:33 +01:00
										 |  |  |         if (options?.includeBadges ?? true) { | 
					
						
							| 
									
										
										
										
											2022-01-27 01:23:04 +01:00
										 |  |  |             badges = this.GetBadges(tags) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const iconAndBadges = new Combine([icon, badges]).SetClass("block relative") | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         if (!options?.noSize) { | 
					
						
							| 
									
										
										
										
											2021-10-30 02:34:16 +02:00
										 |  |  |             iconAndBadges.SetStyle(`width: ${iconW}px; height: ${iconH}px`) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2021-10-30 02:34:16 +02:00
										 |  |  |             iconAndBadges.SetClass("w-full h-full") | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-16 13:45:07 +01:00
										 |  |  |         const css = this.cssDef?.GetRenderValue(tags, undefined)?.txt | 
					
						
							|  |  |  |         const cssClasses = this.cssClasses?.GetRenderValue(tags, undefined)?.txt | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 00:50:29 +01:00
										 |  |  |         let label = this.GetLabel(tags) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         let htmlEl: BaseUIElement | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         if (icon === undefined && label === undefined) { | 
					
						
							| 
									
										
										
										
											2021-11-22 00:50:29 +01:00
										 |  |  |             htmlEl = undefined | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         } else if (icon === undefined) { | 
					
						
							| 
									
										
										
										
											2021-12-05 05:17:29 +01:00
										 |  |  |             htmlEl = new Combine([label]) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         } else if (label === undefined) { | 
					
						
							|  |  |  |             htmlEl = new Combine([iconAndBadges]) | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2021-11-22 00:50:29 +01:00
										 |  |  |             htmlEl = new Combine([iconAndBadges, label]).SetStyle("flex flex-col") | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-16 13:45:07 +01:00
										 |  |  |         if (css !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |             htmlEl?.SetStyle(css) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-16 13:45:07 +01:00
										 |  |  |         if (cssClasses !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |             htmlEl?.SetClass(cssClasses) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         return { | 
					
						
							| 
									
										
										
										
											2021-11-22 00:50:29 +01:00
										 |  |  |             html: htmlEl, | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  |             iconSize: [iconW, iconH], | 
					
						
							|  |  |  |             iconAnchor: [anchorW, anchorH], | 
					
						
							|  |  |  |             popupAnchor: [0, 3 - anchorH], | 
					
						
							|  |  |  |             iconUrl: undefined, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             className: clickable ? "leaflet-div-icon" : "leaflet-div-icon unclickable", | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-10-21 21:41:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     private GetBadges(tags: UIEventSource<any>): BaseUIElement { | 
					
						
							|  |  |  |         if (this.iconBadges.length === 0) { | 
					
						
							|  |  |  |             return undefined | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return new VariableUiElement( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             tags.map((tags) => { | 
					
						
							|  |  |  |                 const badgeElements = this.iconBadges.map((badge) => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                     if (!badge.if.matchesProperties(tags)) { | 
					
						
							|  |  |  |                         // Doesn't match...
 | 
					
						
							|  |  |  |                         return undefined | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                     const htmlDefs = Utils.SubstituteKeys( | 
					
						
							|  |  |  |                         badge.then.GetRenderValue(tags)?.txt, | 
					
						
							|  |  |  |                         tags | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     const badgeElement = PointRenderingConfig.FromHtmlMulti( | 
					
						
							|  |  |  |                         htmlDefs, | 
					
						
							|  |  |  |                         "0", | 
					
						
							|  |  |  |                         true | 
					
						
							|  |  |  |                     )?.SetClass("block relative") | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                     if (badgeElement === undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                         return undefined | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  |                     return new Combine([badgeElement]).SetStyle("width: 1.5rem").SetClass("block") | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return new Combine(badgeElements).SetClass("inline-flex h-full") | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             }) | 
					
						
							|  |  |  |         ).SetClass("absolute bottom-0 right-1/3 h-1/2 w-0") | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private GetLabel(tags: UIEventSource<any>): BaseUIElement { | 
					
						
							|  |  |  |         if (this.label === undefined) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             return undefined | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const self = this | 
					
						
							|  |  |  |         return new VariableUiElement( | 
					
						
							|  |  |  |             tags.map((tags) => { | 
					
						
							|  |  |  |                 const label = self.label | 
					
						
							|  |  |  |                     ?.GetRenderValue(tags) | 
					
						
							|  |  |  |                     ?.Subs(tags) | 
					
						
							|  |  |  |                     ?.SetClass("block text-center") | 
					
						
							|  |  |  |                 return new Combine([label]).SetClass("flex flex-col items-center mt-1") | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } |