forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			75 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { UIEventSource } from "../../Logic/UIEventSource"
 | |
| import Combine from "../Base/Combine"
 | |
| import Translations from "../i18n/Translations"
 | |
| import { VariableUiElement } from "../Base/VariableUIElement"
 | |
| import FilteredLayer from "../../Models/FilteredLayer"
 | |
| import { TagUtils } from "../../Logic/Tags/TagUtils"
 | |
| import Svg from "../../Svg"
 | |
| 
 | |
| /**
 | |
|  * The icon with the 'plus'-sign and the preset icons spinning
 | |
|  *
 | |
|  */
 | |
| export default class AddNewMarker extends Combine {
 | |
|     constructor(filteredLayers: UIEventSource<FilteredLayer[]>) {
 | |
|         const icons = new VariableUiElement(
 | |
|             filteredLayers.map((filteredLayers) => {
 | |
|                 const icons = []
 | |
|                 let last = undefined
 | |
|                 for (const filteredLayer of filteredLayers) {
 | |
|                     const layer = filteredLayer.layerDef
 | |
|                     if (layer.name === undefined && !filteredLayer.isDisplayed.data) {
 | |
|                         continue
 | |
|                     }
 | |
|                     for (const preset of filteredLayer.layerDef.presets) {
 | |
|                         const tags = TagUtils.KVtoProperties(preset.tags)
 | |
|                         const icon = layer.mapRendering[0]
 | |
|                             .GenerateLeafletStyle(new UIEventSource<any>(tags), false)
 | |
|                             .html.SetClass("block relative")
 | |
|                             .SetStyle("width: 42px; height: 42px;")
 | |
|                         icons.push(icon)
 | |
|                         if (last === undefined) {
 | |
|                             last = layer.mapRendering[0]
 | |
|                                 .GenerateLeafletStyle(new UIEventSource<any>(tags), false)
 | |
|                                 .html.SetClass("block relative")
 | |
|                                 .SetStyle("width: 42px; height: 42px;")
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 if (icons.length === 0) {
 | |
|                     return undefined
 | |
|                 }
 | |
|                 if (icons.length === 1) {
 | |
|                     return icons[0]
 | |
|                 }
 | |
|                 icons.push(last)
 | |
|                 const elem = new Combine(icons).SetClass("flex")
 | |
|                 elem.SetClass("slide min-w-min").SetStyle(
 | |
|                     "animation: slide " + icons.length + "s linear infinite;"
 | |
|                 )
 | |
|                 return elem
 | |
|             })
 | |
|         )
 | |
|         const label = Translations.t.general.add.addNewMapLabel
 | |
|             .Clone()
 | |
|             .SetClass(
 | |
|                 "block center absolute text-sm min-w-min pl-1 pr-1 bg-gray-400 rounded-3xl text-white opacity-65 whitespace-nowrap"
 | |
|             )
 | |
|             .SetStyle("top: 65px; transform: translateX(-50%)")
 | |
|         super([
 | |
|             new Combine([
 | |
|                 Svg.add_pin_svg()
 | |
|                     .SetClass("absolute")
 | |
|                     .SetStyle("width: 50px; filter: drop-shadow(grey 0 0 10px"),
 | |
|                 new Combine([icons])
 | |
|                     .SetStyle("width: 50px")
 | |
|                     .SetClass("absolute p-1 rounded-full overflow-hidden"),
 | |
|                 Svg.addSmall_svg()
 | |
|                     .SetClass("absolute animate-pulse")
 | |
|                     .SetStyle("width: 30px; left: 30px; top: 35px;"),
 | |
|             ]).SetClass("absolute"),
 | |
|             new Combine([label]).SetStyle("position: absolute; left: 50%"),
 | |
|         ])
 | |
|         this.SetClass("block relative")
 | |
|     }
 | |
| }
 |