2022-11-02 14:44:06 +01:00
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"
2023-03-28 05:13:48 +02:00
import { SpecialVisualization , SpecialVisualizationState } from "../SpecialVisualization"
2022-10-28 04:33:05 +02:00
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 ,
} ,
]
2023-03-28 05:13:48 +02:00
constr ( state : SpecialVisualizationState , featureTags , args ) {
2022-10-28 04:33:05 +02:00
const [ featureIdKey , layerAndtagRenderingIds ] = args
const tagRenderings : [ LayerConfig , TagRenderingConfig ] [ ] = [ ]
for ( const layerAndTagRenderingId of layerAndtagRenderingIds . split ( ";" ) ) {
const [ layerId , tagRenderingId ] = layerAndTagRenderingId . trim ( ) . split ( "." )
2023-03-28 05:13:48 +02:00
const layer = state . layout . layers . find ( ( l ) = > l . id === layerId )
2022-11-02 14:44:06 +01:00
const tagRendering = layer . tagRenderings . find ( ( tr ) = > tr . id === tagRenderingId )
2022-10-28 04:33:05 +02:00
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
}
2023-03-28 05:13:48 +02:00
const otherTags = state . featureProperties . getStore ( featureId )
2022-10-28 04:33:05 +02:00
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 ]
}
}