From 55c8c7103614356cd8b88bb0081453be33061491 Mon Sep 17 00:00:00 2001
From: Emmanuel Raviart <emmanuel@raviart.com>
Date: Thu, 13 May 2021 12:42:04 +0200
Subject: [PATCH] Allow to compute a simulation with modified scales.

---
 .../components/parameters/BracketEdit.svelte  |  4 +-
 .../VariableReferredParameter.svelte          |  6 ++-
 .../variables/VariableReferredScale.svelte    | 37 +++++++++++--------
 src/lib/parameters.ts                         |  4 +-
 src/lib/reforms.ts                            | 25 +++++++++++--
 5 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/src/lib/components/parameters/BracketEdit.svelte b/src/lib/components/parameters/BracketEdit.svelte
index fec6bc2d2..1162cce58 100644
--- a/src/lib/components/parameters/BracketEdit.svelte
+++ b/src/lib/components/parameters/BracketEdit.svelte
@@ -1,7 +1,9 @@
 <script lang="ts">
   import { createEventDispatcher } from "svelte"
 
-  export let bracket: { [threshold: string]: number | null } | undefined | null
+  import type { Bracket } from "$lib/parameters"
+
+  export let bracket: Bracket | undefined | null
 
   const dispatch = createEventDispatcher()
 
diff --git a/src/lib/components/variables/VariableReferredParameter.svelte b/src/lib/components/variables/VariableReferredParameter.svelte
index a136aa4cd..2d5bb6f39 100644
--- a/src/lib/components/variables/VariableReferredParameter.svelte
+++ b/src/lib/components/variables/VariableReferredParameter.svelte
@@ -3,7 +3,8 @@
   import type { Writable } from "svelte/store"
 
   import type { Parameter } from "$lib/parameters"
-  import type { Reform } from "$lib/reforms"
+  import type { Reform, ReformChangeParameter } from "$lib/reforms"
+  import { ReformChangeType } from "$lib/reforms"
 
   import VariableReferredParameterHeader from "./VariableReferredParameterHeader.svelte"
 
@@ -18,7 +19,7 @@
   ) as Writable<boolean>
   let validValue = undefined
 
-  $: change = $reform[parameter.name]
+  $: change = $reform[parameter.name] as ReformChangeParameter | undefined
 
   $: latestValue = parameter.values?.[0]
 
@@ -40,6 +41,7 @@
         ...$reform,
         [parameter.name]: {
           start,
+          type: ReformChangeType.Parameter,
           value,
         },
       }
diff --git a/src/lib/components/variables/VariableReferredScale.svelte b/src/lib/components/variables/VariableReferredScale.svelte
index bec1cf73f..25c9b2212 100644
--- a/src/lib/components/variables/VariableReferredScale.svelte
+++ b/src/lib/components/variables/VariableReferredScale.svelte
@@ -3,8 +3,9 @@
   import type { Writable } from "svelte/store"
 
   import BracketEdit from "$lib/components/parameters/BracketEdit.svelte"
-  import type { Scale } from "$lib/parameters"
-  import type { Reform } from "$lib/reforms"
+  import type { Bracket, Scale } from "$lib/parameters"
+  import type { Reform, ReformChangeScale } from "$lib/reforms"
+  import { ReformChangeType } from "$lib/reforms"
 
   import VariableReferredParameterHeader from "./VariableReferredParameterHeader.svelte"
 
@@ -22,6 +23,8 @@
     parameter.brackets,
   ).sort(([instant1], [instant2]) => instant2.localeCompare(instant1))
 
+  $: change = $reform[parameter.name] as ReformChangeScale | undefined
+
   $: latestInstantAndBracket = bracketsArray[0]
 
   $: latestBracket = latestInstantAndBracket[1]
@@ -30,22 +33,26 @@
 
   $: latestInstantSplit = latestInstant.split("-")
 
-  function changeBracket({ detail: bracket }) {
+  function changeBracket({ detail: bracket }: { detail: Bracket }) {
     updateReform(`${date.split("-")[0]}-01-01`, bracket)
   }
 
-  function updateReform(start: string, value) {
-    // TODO
-    // if (start !== undefined && value !== undefined) {
-    //   $reform = {
-    //     ...$reform,
-    //     [parameter.name]: {
-    //       start,
-    //       value,
-    //     },
-    //   }
-    //   $simulationRequested = true
-    // }
+  function updateReform(start: string, bracket: Bracket) {
+    if (
+      start !== undefined &&
+      bracket !== undefined &&
+      Object.keys(bracket).length > 0
+    ) {
+      $reform = {
+        ...$reform,
+        [parameter.name]: {
+          bracket,
+          start,
+          type: ReformChangeType.Scale,
+        },
+      }
+      $simulationRequested = true
+    }
   }
 </script>
 
diff --git a/src/lib/parameters.ts b/src/lib/parameters.ts
index ad6318389..0fdc1b72c 100644
--- a/src/lib/parameters.ts
+++ b/src/lib/parameters.ts
@@ -1,5 +1,7 @@
 export type AnyParameter = Parameter | ParameterNode | Scale
 
+export type Bracket = { [threshold: string]: number | null }
+
 export interface Parameter extends ParameterBase {
   class: ParameterClass.Parameter
   values: ParameterAtInstant[]
@@ -45,7 +47,7 @@ export interface ParameterWithAncestors {
 }
 
 export interface Scale extends ParameterBase {
-  brackets: { [instant: string]: { [threshold: string]: number | null } | null }
+  brackets: { [instant: string]: Bracket | null }
   class: ParameterClass.Scale
   rate_unit?: Unit.Rate
   threshold_unit?: Unit.Currency
diff --git a/src/lib/reforms.ts b/src/lib/reforms.ts
index 10868582e..1bfa78e91 100644
--- a/src/lib/reforms.ts
+++ b/src/lib/reforms.ts
@@ -1,9 +1,28 @@
-export interface ReformChange {
+import type { Bracket } from "./parameters"
+
+export interface Reform {
+  [parameterName: string]: ReformChange
+}
+
+type ReformChange = ReformChangeParameter | ReformChangeScale
+
+export interface ReformChangeBase {
   start: string
   stop?: string
+  type: ReformChangeType
+}
+
+export interface ReformChangeParameter extends ReformChangeBase {
+  type: ReformChangeType.Parameter
   value: number
 }
 
-export interface Reform {
-  [parameterName: string]: ReformChange
+export interface ReformChangeScale extends ReformChangeBase {
+  type: ReformChangeType.Scale
+  bracket: Bracket
+}
+
+export enum ReformChangeType {
+  Parameter = "parameter",
+  Scale = "scale",
 }
-- 
GitLab