From e2191b5b577e9739099103eeaf193ab55be42d50 Mon Sep 17 00:00:00 2001
From: David Smadja <david.smadja@assemblee-nationale.fr>
Date: Mon, 24 Mar 2025 13:40:43 +0100
Subject: [PATCH] rework linkedvariables for compare view

---
 .../compare_mode/LinkedVariables.svelte       | 136 -------------
 .../LinkedVariablesCompareView.svelte         | 180 ++++++++++++++++++
 .../compare_mode/PaySlipCompareView.svelte    |   6 +-
 3 files changed, 182 insertions(+), 140 deletions(-)
 delete mode 100644 src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariables.svelte
 create mode 100644 src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariablesCompareView.svelte

diff --git a/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariables.svelte b/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariables.svelte
deleted file mode 100644
index 788f0c73..00000000
--- a/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariables.svelte
+++ /dev/null
@@ -1,136 +0,0 @@
-<script lang="ts">
-  import {
-    type Decomposition,
-    type EvaluationByName,
-  } from "$lib/decompositions"
-  import type { DisplayMode } from "$lib/displays"
-  import { billName, revaluationName, shared } from "$lib/shared.svelte"
-  import { variableSummaryByNameByReformName } from "$lib/variables"
-  import type {
-    DecompositionReference,
-    VariableByName,
-  } from "@openfisca/json-model"
-  import VariableValueChange from "$lib/components/impacts_view/ValueChange.svelte"
-  import {
-    isNullVariableValueByCalculationName,
-    variableValueByCalculationNameFromEvaluation,
-  } from "$lib/calculations.svelte"
-  import { newSimulationUrl } from "$lib/urls"
-  import { removeNegativeZero } from "$lib/values"
-
-  interface Props {
-    displayMode: DisplayMode
-    evaluationByNameArray: EvaluationByName[]
-    situationsToCompareIndex: number[]
-    variableSummaryByName: VariableByName
-    decomposition: Decomposition
-    visibleChildren: DecompositionReference[] | undefined
-  }
-
-  let {
-    displayMode,
-    evaluationByNameArray,
-    decomposition,
-    situationsToCompareIndex,
-    variableSummaryByName,
-    visibleChildren,
-  }: Props = $props()
-
-  const variableSummary =
-    billName === undefined
-      ? variableSummaryByName[displayMode.parametersVariableName!]
-      : variableSummaryByNameByReformName[billName][
-          displayMode.parametersVariableName!
-        ]
-
-  const linkedVariables = variableSummary.linked_other_variables
-
-  const deltaFormatter = (value: number): string =>
-    new Intl.NumberFormat("fr-FR", {
-      currency: "EUR",
-      maximumFractionDigits: 0,
-      minimumFractionDigits: 0,
-      signDisplay: "never",
-      style: "currency",
-    }).format(removeNegativeZero(value))
-</script>
-
-{#if linkedVariables !== undefined}
-  <div class="fond flex pr-4">
-    <!--Indentation pour chaque niveau de l'arbre, illustré par une bordure-->
-
-    <div
-      class="w-full border-dashed border-black"
-      class:border-l-0={!decomposition.open}
-      class:border-l-2={decomposition.open && visibleChildren !== undefined}
-      class:pl-0.5={!decomposition.open}
-    >
-      <div
-        class="mb-2 flex w-full grow flex-col justify-end lg:flex-row"
-        id="situation_{situationsToCompareIndex}_totalimpact"
-      >
-        <div class="flex w-full grow py-3 pl-5">
-          {#if linkedVariables !== undefined}
-            {@const linkedVariablesValueByCalculationName = linkedVariables.map(
-              (name) =>
-                variableValueByCalculationNameFromEvaluation(
-                  evaluationByNameArray[name],
-                  revaluationName,
-                  billName,
-                  shared.parametricReform,
-                ),
-            )}
-            {#if shared.showNulls || !linkedVariablesValueByCalculationName.every(isNullVariableValueByCalculationName)}
-              <ul
-                class="flex h-fit flex-col rounded-md border bg-white p-2 text-gray-800"
-              >
-                {#each linkedVariables as linkedVariableName, index}
-                  {@const linkedVariableValueByCalculationName =
-                    linkedVariablesValueByCalculationName[index]}
-                  {#if shared.showNulls || !isNullVariableValueByCalculationName(linkedVariableValueByCalculationName)}
-                    {@const linkedVariableSummary =
-                      billName === undefined
-                        ? variableSummaryByName[linkedVariableName]
-                        : variableSummaryByNameByReformName[billName][
-                            linkedVariableName
-                          ]}
-                    <li class="flex justify-between gap-2 text-sm">
-                      <a
-                        class="2xl:text-md max-w-32 cursor-pointer overflow-x-hidden text-ellipsis text-nowrap hover:underline sm:max-w-none lg:max-w-44 xl:max-w-none"
-                        href={newSimulationUrl({
-                          ...displayMode,
-                          parametersVariableName: linkedVariableName,
-                        })}
-                        data-sveltekit-noscroll
-                        ><span class="text-gray-600"
-                          >{linkedVariableSummary.short_label ??
-                            linkedVariableSummary.label ??
-                            linkedVariableName}&nbsp;:&nbsp;</span
-                        ></a
-                      >
-                      <VariableValueChange
-                        {evaluationByNameArray}
-                        name={linkedVariableName}
-                        valueByCalculationName={linkedVariableValueByCalculationName}
-                        inline
-                        bold
-                      />
-                    </li>
-                  {/if}
-                {/each}
-              </ul>
-            {/if}
-          {/if}
-        </div>
-      </div>
-    </div>
-  </div>
-{/if}
-
-<style lang="postcss">
-  .fond {
-    background-color: #ffffff;
-    /* Polka dots - Heropatterns.com échelle réduite */
-    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3E%3Cpath fill='%23A0A0A0' fill-opacity='0.4' d='M1 3h1v1H1V3zm2-2h1v1H3V1z'%3E%3C/path%3E%3C/svg%3E");
-  }
-</style>
diff --git a/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariablesCompareView.svelte b/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariablesCompareView.svelte
new file mode 100644
index 00000000..c6321c6e
--- /dev/null
+++ b/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariablesCompareView.svelte
@@ -0,0 +1,180 @@
+<script lang="ts">
+  import {
+    type Decomposition,
+    type EvaluationByName,
+  } from "$lib/decompositions"
+  import type { DisplayMode } from "$lib/displays"
+  import { billName, revaluationName, shared } from "$lib/shared.svelte"
+  import { variableSummaryByNameByReformName } from "$lib/variables"
+  import type {
+    DecompositionReference,
+    VariableByName,
+  } from "@openfisca/json-model"
+  import VariableValueChange from "$lib/components/impacts_view/ValueChange.svelte"
+  import {
+    isNullVariableValueByCalculationName,
+    variableValueByCalculationNameFromEvaluation,
+  } from "$lib/calculations.svelte"
+  import { newSimulationUrl } from "$lib/urls"
+
+  interface Props {
+    displayMode: DisplayMode
+    evaluationByNameArray: EvaluationByName[]
+    situationsToCompareIndex: number[]
+    variableSummaryByName: VariableByName
+    decomposition: Decomposition
+    visibleChildren: DecompositionReference[] | undefined
+  }
+
+  let {
+    displayMode,
+    evaluationByNameArray,
+    situationsToCompareIndex,
+    variableSummaryByName,
+    decomposition,
+    visibleChildren,
+  }: Props = $props()
+
+  const variableSummary =
+    billName === undefined
+      ? variableSummaryByName[displayMode.parametersVariableName!]
+      : variableSummaryByNameByReformName[billName][
+          displayMode.parametersVariableName!
+        ]
+
+  const linkedVariables = variableSummary.linked_other_variables
+  const situationIndexLeft = situationsToCompareIndex[0]
+  const situationIndexRight = situationsToCompareIndex[1]
+  let evaluationByNameLeft: EvaluationByName = $derived(
+    evaluationByNameArray[situationIndexLeft],
+  )
+  let evaluationByNameRight: EvaluationByName = $derived(
+    evaluationByNameArray[situationIndexRight],
+  )
+</script>
+
+{#if linkedVariables !== undefined}
+  <div
+    class="fond flex w-full grow border-dashed border-black px-4"
+    class:border-l-0={!decomposition.open}
+    class:border-l-2={decomposition.open && visibleChildren !== undefined}
+    class:pl-0.5={!decomposition.open}
+  >
+    <!-- <div
+      class="mb-2 flex w-full grow flex-col justify-end lg:flex-row"
+      id="situation_{situationIndexLeft}_totalimpact"
+    > -->
+    <div class="flex w-full grow justify-around py-3 pl-5">
+      {#if linkedVariables !== undefined}
+        {@const linkedVariablesValueByCalculationNameLeft = linkedVariables.map(
+          (name) =>
+            variableValueByCalculationNameFromEvaluation(
+              evaluationByNameLeft[name],
+              revaluationName,
+              billName,
+              shared.parametricReform,
+            ),
+        )}
+        {#if shared.showNulls || !linkedVariablesValueByCalculationNameLeft.every(isNullVariableValueByCalculationName)}
+          <ul
+            class="flex h-fit flex-col rounded-md border bg-white p-2 text-gray-800"
+          >
+            {#each linkedVariables as linkedVariableName, index}
+              {@const linkedVariableValueByCalculationNameLeft =
+                linkedVariablesValueByCalculationNameLeft[index]}
+              {#if shared.showNulls || !isNullVariableValueByCalculationName(linkedVariableValueByCalculationNameLeft)}
+                {@const linkedVariableSummary =
+                  billName === undefined
+                    ? variableSummaryByName[linkedVariableName]
+                    : variableSummaryByNameByReformName[billName][
+                        linkedVariableName
+                      ]}
+                <li class="flex justify-between gap-2 text-sm">
+                  <a
+                    class="2xl:text-md max-w-32 cursor-pointer overflow-x-hidden text-ellipsis text-nowrap hover:underline sm:max-w-none lg:max-w-44 xl:max-w-none"
+                    href={newSimulationUrl({
+                      ...displayMode,
+                      parametersVariableName: linkedVariableName,
+                    })}
+                    data-sveltekit-noscroll
+                    ><span class="text-gray-600"
+                      >{linkedVariableSummary.short_label ??
+                        linkedVariableSummary.label ??
+                        linkedVariableName}&nbsp;:&nbsp;</span
+                    ></a
+                  >
+                  <VariableValueChange
+                    {evaluationByNameLeft}
+                    name={linkedVariableName}
+                    valueByCalculationName={linkedVariableValueByCalculationNameLeft}
+                    inline
+                    bold
+                  />
+                </li>
+              {/if}
+            {/each}
+          </ul>
+        {/if}
+
+        {@const linkedVariablesValueByCalculationNameRight =
+          linkedVariables.map((name) =>
+            variableValueByCalculationNameFromEvaluation(
+              evaluationByNameRight[name],
+              revaluationName,
+              billName,
+              shared.parametricReform,
+            ),
+          )}
+        {#if shared.showNulls || !linkedVariablesValueByCalculationNameRight.every(isNullVariableValueByCalculationName)}
+          <ul
+            class="flex h-fit flex-col rounded-md border bg-white p-2 text-gray-800"
+          >
+            {#each linkedVariables as linkedVariableName, index}
+              {@const linkedVariableValueByCalculationNameRight =
+                linkedVariablesValueByCalculationNameRight[index]}
+              {#if shared.showNulls || !isNullVariableValueByCalculationName(linkedVariableValueByCalculationNameRight)}
+                {@const linkedVariableSummary =
+                  billName === undefined
+                    ? variableSummaryByName[linkedVariableName]
+                    : variableSummaryByNameByReformName[billName][
+                        linkedVariableName
+                      ]}
+                <li class="flex justify-between gap-2 text-sm">
+                  <a
+                    class="2xl:text-md max-w-32 cursor-pointer overflow-x-hidden text-ellipsis text-nowrap hover:underline sm:max-w-none lg:max-w-44 xl:max-w-none"
+                    href={newSimulationUrl({
+                      ...displayMode,
+                      parametersVariableName: linkedVariableName,
+                    })}
+                    data-sveltekit-noscroll
+                    ><span class="text-gray-600"
+                      >{linkedVariableSummary.short_label ??
+                        linkedVariableSummary.label ??
+                        linkedVariableName}&nbsp;:&nbsp;</span
+                    ></a
+                  >
+                  <VariableValueChange
+                    {evaluationByNameRight}
+                    name={linkedVariableName}
+                    valueByCalculationName={linkedVariableValueByCalculationNameRight}
+                    inline
+                    bold
+                  />
+                </li>
+              {/if}
+            {/each}
+          </ul>
+        {/if}
+      {/if}
+    </div>
+    <!-- </div> -->
+  </div>
+{/if}
+
+<style lang="postcss">
+  .fond {
+    background-color: #ffffff;
+    /* Polka dots - Heropatterns.com échelle réduite */
+    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3E%3Cpath fill='%23A0A0A0' fill-opacity='0.4' d='M1 3h1v1H1V3zm2-2h1v1H3V1z'%3E%3C/path%3E%3C/svg%3E");
+  }
+</style>
diff --git a/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/PaySlipCompareView.svelte b/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/PaySlipCompareView.svelte
index 90339e76..6f731343 100644
--- a/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/PaySlipCompareView.svelte
+++ b/src/lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/PaySlipCompareView.svelte
@@ -1,6 +1,4 @@
 <script lang="ts">
-  import { preventDefault } from "svelte/legacy"
-
   import type { VariableByName } from "@openfisca/json-model"
 
   import { goto } from "$app/navigation"
@@ -18,7 +16,7 @@
   import type { Situation } from "$lib/situations"
   import { newSimulationUrl } from "$lib/urls"
   import { removeNegativeZero } from "$lib/values"
-  import LinkedVariables from "$lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariables.svelte"
+  import LinkedVariablesCompareView from "$lib/components/impacts_view/test_cases_view/test_case_selected/compare_mode/LinkedVariablesCompareView.svelte"
 
   interface Props {
     displayMode: DisplayMode
@@ -588,7 +586,7 @@
               </div>
               <!--Affichage des variables liées s'il y en a-->
               {#if displayMode.parametersVariableName !== undefined && decomposition.name === displayMode.parametersVariableName}
-                <LinkedVariables
+                <LinkedVariablesCompareView
                   {displayMode}
                   {evaluationByNameArray}
                   {situationsToCompareIndex}
-- 
GitLab