refactor(ui): use watchers to refresh display
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 7 Mar 2024 14:06:31 +0000 (15:06 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 7 Mar 2024 14:06:31 +0000 (15:06 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/Bootstrap.ts
ui/web/src/components/actions/AddChargingStations.vue
ui/web/src/views/ChargingStationsView.vue

index 0c1eeeecb0386a009fba09797b02db651b15ea6e..80470d00f3e5069dcf498111f32cc8b28f009a02 100644 (file)
@@ -537,6 +537,11 @@ export class Bootstrap extends EventEmitter {
     templateFile: string,
     options?: ChargingStationOptions
   ): Promise<void> {
+    if (!this.started && !this.starting) {
+      throw new BaseError(
+        'Cannot add a charging station while charging stations simulator is not started'
+      )
+    }
     await this.workerImplementation?.addElement({
       index,
       templateFile: join(
index 2cac132291276d62c633309c1d0492231118a625..f638232b0162e52b44c23b1ced17c76f48b6b52e 100644 (file)
@@ -1,7 +1,7 @@
 <template>
   <h1 id="action">Add Charging Stations</h1>
   <p>Template:</p>
-  <select v-model="state.template">
+  <select :key="state.renderTemplates" v-model="state.template">
     <option disabled value="">Please select a template</option>
     <option
       v-for="template in $templates.value"
 </template>
 
 <script setup lang="ts">
-import { ref } from 'vue'
+import { getCurrentInstance, ref, watch } from 'vue'
 import Button from '@/components/buttons/Button.vue'
-import { convertToBoolean } from '@/composables'
+import { convertToBoolean, randomUUID } from '@/composables'
 
 const state = ref<{
+  renderTemplates: `${string}-${string}-${string}-${string}-${string}`
   template: string
   numberOfStations: number
   supervisionUrl: string
@@ -107,6 +108,7 @@ const state = ref<{
   ocppStrictCompliance: boolean
   enableStatistics: boolean
 }>({
+  renderTemplates: randomUUID(),
   template: '',
   numberOfStations: 1,
   supervisionUrl: '',
@@ -115,6 +117,10 @@ const state = ref<{
   ocppStrictCompliance: true,
   enableStatistics: false
 })
+
+watch(getCurrentInstance()?.appContext.config.globalProperties.$templates, () => {
+  state.value.renderTemplates = randomUUID()
+})
 </script>
 
 <style>
index c250b9a62207235d9b28aa6ac4813515204de080..320731f71df5b4c2fd5a48727f272d957d481fe2 100644 (file)
@@ -58,7 +58,7 @@
       <ToggleButton
         :id="'simulator'"
         :key="state.renderSimulator"
-        :status="state.simulatorState?.started"
+        :status="simulatorState?.started"
         :on="() => startSimulator()"
         :off="() => stopSimulator()"
         :class="simulatorButtonClass"
 </template>
 
 <script setup lang="ts">
-import { computed, getCurrentInstance, onMounted, onUnmounted, ref } from 'vue'
+import { computed, getCurrentInstance, onMounted, onUnmounted, ref, watch } from 'vue'
 import { useToast } from 'vue-toast-notification'
 import CSTable from '@/components/charging-stations/CSTable.vue'
 import type { ResponsePayload, SimulatorState, UIServerConfigurationSection } from '@/types'
@@ -124,6 +124,16 @@ import {
 } from '@/composables'
 import ToggleButton from '@/components/buttons/ToggleButton.vue'
 
+const simulatorState = ref<SimulatorState | undefined>(undefined)
+
+const simulatorButtonClass = computed<string>(() =>
+  simulatorState.value?.started === true ? 'simulator-stop-button' : 'simulator-start-button'
+)
+const simulatorButtonMessage = computed<string>(
+  () =>
+    `${simulatorState.value?.started === true ? 'Stop' : 'Start'} Simulator${simulatorState.value?.version != null ? ` (${simulatorState.value.version})` : ''}`
+)
+
 const state = ref<{
   renderSimulator: `${string}-${string}-${string}-${string}-${string}`
   renderAddChargingStations: `${string}-${string}-${string}-${string}-${string}`
@@ -131,7 +141,6 @@ const state = ref<{
   gettingSimulatorState: boolean
   gettingTemplates: boolean
   gettingChargingStations: boolean
-  simulatorState?: SimulatorState
   uiServerIndex: number
 }>({
   renderSimulator: randomUUID(),
@@ -143,14 +152,6 @@ const state = ref<{
   uiServerIndex: getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
 })
 
-const simulatorButtonClass = computed<string>(() =>
-  state.value.simulatorState?.started === true ? 'simulator-stop-button' : 'simulator-start-button'
-)
-const simulatorButtonMessage = computed<string>(
-  () =>
-    `${state.value.simulatorState?.started === true ? 'Stop' : 'Start'} Simulator${state.value.simulatorState?.version != null ? ` (${state.value.simulatorState.version})` : ''}`
-)
-
 const clearToggleButtons = (): void => {
   for (const key in getLocalStorage()) {
     if (key.includes('toggle-button')) {
@@ -163,11 +164,24 @@ const clearToggleButtons = (): void => {
 
 const app = getCurrentInstance()
 
+watch(app?.appContext.config.globalProperties.$chargingStations, () => {
+  state.value.renderChargingStations = randomUUID()
+})
+
+watch(simulatorState, () => {
+  state.value.renderSimulator = randomUUID()
+})
+
+const clearTemplates = (): void => {
+  if (app != null) {
+    app.appContext.config.globalProperties.$templates.value = []
+  }
+}
+
 const clearChargingStations = (): void => {
   if (app != null) {
     app.appContext.config.globalProperties.$chargingStations.value = []
   }
-  state.value.renderChargingStations = randomUUID()
 }
 
 const uiClient = useUIClient()
@@ -180,14 +194,13 @@ const getSimulatorState = (): void => {
     uiClient
       .simulatorState()
       .then((response: ResponsePayload) => {
-        state.value.simulatorState = response.state as SimulatorState
+        simulatorState.value = response.state as SimulatorState
       })
       .catch((error: Error) => {
         $toast.error('Error at fetching simulator state')
         console.error('Error at fetching simulator state:', error)
       })
       .finally(() => {
-        state.value.renderSimulator = randomUUID()
         state.value.gettingSimulatorState = false
       })
   }
@@ -204,9 +217,7 @@ const getTemplates = (): void => {
         }
       })
       .catch((error: Error) => {
-        if (app != null) {
-          app.appContext.config.globalProperties.$templates.value = []
-        }
+        clearTemplates()
         $toast.error('Error at fetching charging station templates')
         console.error('Error at fetching charging station templates:', error)
       })
@@ -227,14 +238,11 @@ const getChargingStations = (): void => {
         }
       })
       .catch((error: Error) => {
-        if (app != null) {
-          app.appContext.config.globalProperties.$chargingStations.value = []
-        }
+        clearChargingStations()
         $toast.error('Error at fetching charging stations')
         console.error('Error at fetching charging stations:', error)
       })
       .finally(() => {
-        state.value.renderChargingStations = randomUUID()
         state.value.gettingChargingStations = false
       })
   }
@@ -292,9 +300,7 @@ const stopSimulator = (): void => {
   uiClient
     .stopSimulator()
     .then(() => {
-      if (app != null) {
-        app.appContext.config.globalProperties.$chargingStations.value = []
-      }
+      clearChargingStations()
       $toast.success('Simulator successfully stopped')
     })
     .catch((error: Error) => {