forked from MapComplete/MapComplete
		
	Fix #1935
This commit is contained in:
		
							parent
							
								
									6524366eb5
								
							
						
					
					
						commit
						d488f8c9b2
					
				
					 2 changed files with 44 additions and 11 deletions
				
			
		| 
						 | 
					@ -79,7 +79,7 @@
 | 
				
			||||||
    console.log("Applying questions to ask")
 | 
					    console.log("Applying questions to ask")
 | 
				
			||||||
    const qta = questionsToAsk.data
 | 
					    const qta = questionsToAsk.data
 | 
				
			||||||
    firstQuestion.setData(undefined)
 | 
					    firstQuestion.setData(undefined)
 | 
				
			||||||
    allQuestionsToAsk.setData([])
 | 
					    //allQuestionsToAsk.setData([])
 | 
				
			||||||
    await Utils.awaitAnimationFrame()
 | 
					    await Utils.awaitAnimationFrame()
 | 
				
			||||||
    firstQuestion.setData(qta[0])
 | 
					    firstQuestion.setData(qta[0])
 | 
				
			||||||
    allQuestionsToAsk.setData(qta)
 | 
					    allQuestionsToAsk.setData(qta)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export let config: TagRenderingConfig
 | 
					  export let config: TagRenderingConfig
 | 
				
			||||||
  export let tags: UIEventSource<Record<string, string>>
 | 
					  export let tags: UIEventSource<Record<string, string>>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export let selectedElement: Feature
 | 
					  export let selectedElement: Feature
 | 
				
			||||||
  export let state: SpecialVisualizationState
 | 
					  export let state: SpecialVisualizationState
 | 
				
			||||||
  export let layer: LayerConfig | undefined
 | 
					  export let layer: LayerConfig | undefined
 | 
				
			||||||
| 
						 | 
					@ -69,7 +70,10 @@
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Prepares and fills the checkedMappings
 | 
					   * Prepares and fills the checkedMappings
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					  console.log("Initing ", config.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function initialize(tgs: Record<string, string>, confg: TagRenderingConfig): void {
 | 
					  function initialize(tgs: Record<string, string>, confg: TagRenderingConfig): void {
 | 
				
			||||||
 | 
					    console.trace("Initing question state for", confg.id, config.id)
 | 
				
			||||||
    mappings = confg.mappings?.filter((m) => {
 | 
					    mappings = confg.mappings?.filter((m) => {
 | 
				
			||||||
      if (typeof m.hideInAnswer === "boolean") {
 | 
					      if (typeof m.hideInAnswer === "boolean") {
 | 
				
			||||||
        return !m.hideInAnswer
 | 
					        return !m.hideInAnswer
 | 
				
			||||||
| 
						 | 
					@ -77,7 +81,7 @@
 | 
				
			||||||
      return !m.hideInAnswer.matchesProperties(tgs)
 | 
					      return !m.hideInAnswer.matchesProperties(tgs)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    selectedMapping = mappings?.findIndex(mapping => mapping.if.matchesProperties(tgs) || mapping.alsoShowIf?.matchesProperties(tgs))
 | 
					    selectedMapping = mappings?.findIndex(mapping => mapping.if.matchesProperties(tgs) || mapping.alsoShowIf?.matchesProperties(tgs))
 | 
				
			||||||
    if(selectedMapping < 0){
 | 
					    if (selectedMapping < 0) {
 | 
				
			||||||
      selectedMapping = undefined
 | 
					      selectedMapping = undefined
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // We received a new config -> reinit
 | 
					    // We received a new config -> reinit
 | 
				
			||||||
| 
						 | 
					@ -137,11 +141,35 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $: {
 | 
					  let usedKeys: string[] = config.usedTags().flatMap(t => t.usedKeys())
 | 
				
			||||||
    // Even though 'config' is not declared as a store, Svelte uses it as one to update the component
 | 
					  /**
 | 
				
			||||||
    // We want to (re)-initialize whenever the 'tags' or 'config' change - but not when 'checkedConfig' changes
 | 
					   * The 'minimalTags' is a subset of the tags of the feature, only containing the values relevant for this object.
 | 
				
			||||||
    initialize($tags, config)
 | 
					   * The main goal is to be stable and only 'ping' when an actual change is relevant
 | 
				
			||||||
  }
 | 
					   */
 | 
				
			||||||
 | 
					  let minimalTags = new UIEventSource<Record<string, string>>(undefined)
 | 
				
			||||||
 | 
					  tags.addCallbackAndRunD(tags => {
 | 
				
			||||||
 | 
					    const previousMinimal = minimalTags.data
 | 
				
			||||||
 | 
					    const newMinimal: Record<string, string> = {}
 | 
				
			||||||
 | 
					    let somethingChanged = previousMinimal === undefined
 | 
				
			||||||
 | 
					    for (const key of usedKeys) {
 | 
				
			||||||
 | 
					      const newValue = tags[key]
 | 
				
			||||||
 | 
					      somethingChanged ||= previousMinimal?.[key] !== newValue
 | 
				
			||||||
 | 
					      if (newValue !== undefined && newValue !== null) {
 | 
				
			||||||
 | 
					        newMinimal[key] = newValue
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (somethingChanged) {
 | 
				
			||||||
 | 
					      console.log("Updating minimal tags to", newMinimal,"of",config.id)
 | 
				
			||||||
 | 
					      minimalTags.setData(newMinimal)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  minimalTags.addCallbackAndRunD(tgs => {
 | 
				
			||||||
 | 
					    initialize(tgs, config)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onDestroy(
 | 
					  onDestroy(
 | 
				
			||||||
    freeformInput.subscribe((freeformValue) => {
 | 
					    freeformInput.subscribe((freeformValue) => {
 | 
				
			||||||
      if (!mappings || mappings?.length == 0 || config.freeform?.key === undefined) {
 | 
					      if (!mappings || mappings?.length == 0 || config.freeform?.key === undefined) {
 | 
				
			||||||
| 
						 | 
					@ -178,8 +206,13 @@
 | 
				
			||||||
          checkedMappings,
 | 
					          checkedMappings,
 | 
				
			||||||
          tags.data
 | 
					          tags.data
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        if(state.featureSwitches.featureSwitchIsDebugging.data){
 | 
					        if (state.featureSwitches.featureSwitchIsDebugging.data) {
 | 
				
			||||||
          console.log("Constructing change spec from", {freeform: $freeformInput, selectedMapping, checkedMappings, currentTags: tags.data}, " --> ", selectedTags)
 | 
					          console.log("Constructing change spec from", {
 | 
				
			||||||
 | 
					            freeform: $freeformInput,
 | 
				
			||||||
 | 
					            selectedMapping,
 | 
				
			||||||
 | 
					            checkedMappings,
 | 
				
			||||||
 | 
					            currentTags: tags.data
 | 
				
			||||||
 | 
					          }, " --> ", selectedTags)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      } catch (e) {
 | 
					      } catch (e) {
 | 
				
			||||||
        console.error("Could not calculate changeSpecification:", e)
 | 
					        console.error("Could not calculate changeSpecification:", e)
 | 
				
			||||||
| 
						 | 
					@ -194,7 +227,7 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (layer === undefined || (layer?.source === null && layer.id !== "favourite")) {
 | 
					    if (layer === undefined || (layer?.source === null && layer.id !== "favourite")) {
 | 
				
			||||||
      /**
 | 
					      /**
 | 
				
			||||||
       * This is a special, priviliged layer.
 | 
					       * This is a special, privileged layer.
 | 
				
			||||||
       * We simply apply the tags onto the records
 | 
					       * We simply apply the tags onto the records
 | 
				
			||||||
       */
 | 
					       */
 | 
				
			||||||
      const kv = selectedTags.asChange(tags.data)
 | 
					      const kv = selectedTags.asChange(tags.data)
 | 
				
			||||||
| 
						 | 
					@ -277,7 +310,7 @@
 | 
				
			||||||
                  feature={selectedElement}
 | 
					                  feature={selectedElement}
 | 
				
			||||||
                />
 | 
					                />
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
          {/if}
 | 
					            {/if}
 | 
				
			||||||
          {/if}
 | 
					          {/if}
 | 
				
			||||||
        </legend>
 | 
					        </legend>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue