forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
 | |
| import TagRenderingConfig from "../../Models/ThemeConfig/TagRenderingConfig"
 | |
| import { VariableUiElement } from "../Base/VariableUIElement"
 | |
| import BaseUIElement from "../BaseUIElement"
 | |
| import EditableTagRendering from "./EditableTagRendering"
 | |
| import Combine from "../Base/Combine"
 | |
| import { SpecialVisualization } from "../SpecialVisualization"
 | |
| 
 | |
| export class StealViz implements SpecialVisualization {
 | |
|     funcName = "steal"
 | |
|     docs = "Shows a tagRendering from a different object as if this was the object itself"
 | |
|     args = [
 | |
|         {
 | |
|             name: "featureId",
 | |
|             doc: "The key of the attribute which contains the id of the feature from which to use the tags",
 | |
|             required: true,
 | |
|         },
 | |
|         {
 | |
|             name: "tagRenderingId",
 | |
|             doc: "The layer-id and tagRenderingId to render. Can be multiple value if ';'-separated (in which case every value must also contain the layerId, e.g. `layerId.tagRendering0; layerId.tagRendering1`). Note: this can cause layer injection",
 | |
|             required: true,
 | |
|         },
 | |
|     ]
 | |
|     constr(state, featureTags, args) {
 | |
|         const [featureIdKey, layerAndtagRenderingIds] = args
 | |
|         const tagRenderings: [LayerConfig, TagRenderingConfig][] = []
 | |
|         for (const layerAndTagRenderingId of layerAndtagRenderingIds.split(";")) {
 | |
|             const [layerId, tagRenderingId] = layerAndTagRenderingId.trim().split(".")
 | |
|             const layer = state.layoutToUse.layers.find((l) => l.id === layerId)
 | |
|             const tagRendering = layer.tagRenderings.find((tr) => tr.id === tagRenderingId)
 | |
|             tagRenderings.push([layer, tagRendering])
 | |
|         }
 | |
|         if (tagRenderings.length === 0) {
 | |
|             throw "Could not create stolen tagrenddering: tagRenderings not found"
 | |
|         }
 | |
|         return new VariableUiElement(
 | |
|             featureTags.map((tags) => {
 | |
|                 const featureId = tags[featureIdKey]
 | |
|                 if (featureId === undefined) {
 | |
|                     return undefined
 | |
|                 }
 | |
|                 const otherTags = state.allElements.getEventSourceById(featureId)
 | |
|                 const elements: BaseUIElement[] = []
 | |
|                 for (const [layer, tagRendering] of tagRenderings) {
 | |
|                     const el = new EditableTagRendering(
 | |
|                         otherTags,
 | |
|                         tagRendering,
 | |
|                         layer.units,
 | |
|                         state,
 | |
|                         {}
 | |
|                     )
 | |
|                     elements.push(el)
 | |
|                 }
 | |
|                 if (elements.length === 1) {
 | |
|                     return elements[0]
 | |
|                 }
 | |
|                 return new Combine(elements).SetClass("flex flex-col")
 | |
|             })
 | |
|         )
 | |
|     }
 | |
| 
 | |
|     getLayerDependencies(args): string[] {
 | |
|         const [_, tagRenderingId] = args
 | |
|         if (tagRenderingId.indexOf(".") < 0) {
 | |
|             throw "Error: argument 'layerId.tagRenderingId' of special visualisation 'steal' should contain a dot"
 | |
|         }
 | |
|         const [layerId, __] = tagRenderingId.split(".")
 | |
|         return [layerId]
 | |
|     }
 | |
| }
 |