<template>
<Container id="charging-stations-container">
+ <Container
+ v-show="Array.isArray(uiServerConfigurations) && uiServerConfigurations.length > 1"
+ id="ui-server-container"
+ >
+ <select
+ id="ui-server-selector"
+ v-model="state.uiServerIndex"
+ @change="
+ () => {
+ if (
+ getFromLocalStorage<number>('uiServerConfigurationIndex', 0) !== state.uiServerIndex
+ ) {
+ app?.appContext.config.globalProperties.$uiClient.setConfiguration(
+ app?.appContext.config.globalProperties.$configuration.uiServer[state.uiServerIndex]
+ )
+ initializeWSEventListeners()
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
+ 'open',
+ () => {
+ setToLocalStorage<number>('uiServerConfigurationIndex', state.uiServerIndex)
+ $router.currentRoute.value.name !== 'charging-stations' &&
+ $router.push({ name: 'charging-stations' })
+ },
+ { once: true }
+ )
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
+ 'error',
+ () => {
+ state.uiServerIndex = getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
+ app?.appContext.config.globalProperties.$uiClient.setConfiguration(
+ app?.appContext.config.globalProperties.$configuration.uiServer[
+ getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
+ ]
+ )
+ initializeWSEventListeners()
+ },
+ { once: true }
+ )
+ }
+ }
+ "
+ >
+ <option
+ v-for="uiServerConfiguration in uiServerConfigurations"
+ :value="uiServerConfiguration.index"
+ >
+ {{ uiServerConfiguration.configuration.name ?? uiServerConfiguration.configuration.host }}
+ </option>
+ </select>
+ </Container>
<Container id="buttons-container">
- <Button id="button" @click="startSimulator()">Start Simulator</Button>
- <Button id="button" @click="stopSimulator()">Stop Simulator</Button>
- <Button id="button" @click="$router.push({ name: 'add-charging-stations' })"
- >Add Charging Stations</Button
+ <Button @click="startSimulator()">Start Simulator</Button>
+ <Button @click="stopSimulator()">Stop Simulator</Button>
+ <ToggleButton
+ :id="'add-charging-stations'"
+ :key="state.renderAddChargingStations"
+ :shared="true"
+ :on="
+ () => {
+ $router.push({ name: 'add-charging-stations' })
+ }
+ "
+ :off="
+ () => {
+ $router.push({ name: 'charging-stations' })
+ }
+ "
+ @clicked="
+ () => {
+ state.renderChargingStations = randomUUID()
+ }
+ "
>
+ Add Charging Stations
+ </ToggleButton>
<ReloadButton
id="reload-button"
- :loading="state.isLoading"
- @click="loadChargingStations(() => $router.go(0))"
+ :loading="state.loading"
+ @click="loadChargingStations(() => (state.renderChargingStations = randomUUID()))"
/>
</Container>
- <CSTable :charging-stations="app?.appContext.config.globalProperties.$chargingStations ?? []" />
+ <CSTable
+ v-show="
+ Array.isArray(app?.appContext.config.globalProperties.$chargingStations) &&
+ app.appContext.config.globalProperties.$chargingStations.length > 0
+ "
+ :key="state.renderChargingStations"
+ :charging-stations="app?.appContext.config.globalProperties.$chargingStations"
+ @need-refresh="
+ () => {
+ state.renderAddChargingStations = randomUUID()
+ state.renderChargingStations = randomUUID()
+ }
+ "
+ />
</Container>
</template>
<script setup lang="ts">
-import { getCurrentInstance, reactive } from 'vue'
+import { getCurrentInstance, onMounted, ref } from 'vue'
import { useToast } from 'vue-toast-notification'
import CSTable from '@/components/charging-stations/CSTable.vue'
-import type { ResponsePayload } from '@/types'
+import type { ResponsePayload, UIServerConfigurationSection } from '@/types'
import Container from '@/components/Container.vue'
import ReloadButton from '@/components/buttons/ReloadButton.vue'
import Button from '@/components/buttons/Button.vue'
+import {
+ getFromLocalStorage,
+ getLocalStorage,
+ randomUUID,
+ removeFromLocalStorage,
+ setToLocalStorage
+} from '@/composables'
+import ToggleButton from '@/components/buttons/ToggleButton.vue'
+
+const app = getCurrentInstance()
+
+const clearToggleButtons = (): void => {
+ for (const key in getLocalStorage()) {
+ if (key.includes('toggle-button')) {
+ removeFromLocalStorage(key)
+ }
+ }
+}
+
+const clearChargingStations = (): void => {
+ clearToggleButtons()
+ app!.appContext.config.globalProperties.$chargingStations = []
+ state.value.renderAddChargingStations = randomUUID()
+ state.value.renderChargingStations = randomUUID()
+}
-const state = reactive({
- isLoading: false
+const initializeWSEventListeners = () => {
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener('open', () => {
+ uiClient
+ .listTemplates()
+ .then((response: ResponsePayload) => {
+ if (app != null) {
+ app.appContext.config.globalProperties.$templates = response.templates
+ }
+ })
+ .catch((error: Error) => {
+ if (app != null) {
+ app.appContext.config.globalProperties.$templates = []
+ }
+ $toast.error('Error at fetching charging station templates')
+ console.error('Error at fetching charging station templates:', error)
+ })
+ loadChargingStations(() => {
+ state.value.renderAddChargingStations = randomUUID()
+ state.value.renderChargingStations = randomUUID()
+ })
+ })
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
+ 'error',
+ clearChargingStations
+ )
+ app?.appContext.config.globalProperties.$uiClient.registerWSEventListener(
+ 'close',
+ clearChargingStations
+ )
+}
+
+onMounted(() => {
+ initializeWSEventListeners()
+})
+
+const state = ref({
+ renderAddChargingStations: randomUUID(),
+ renderChargingStations: randomUUID(),
+ loading: false,
+ uiServerIndex: getFromLocalStorage<number>('uiServerConfigurationIndex', 0)
})
-const app = getCurrentInstance()
const uiClient = app?.appContext.config.globalProperties.$uiClient
+const uiServerConfigurations: { configuration: UIServerConfigurationSection; index: number }[] =
+ app?.appContext.config.globalProperties.$configuration.uiServer.map(
+ (configuration: UIServerConfigurationSection, index: number) => ({
+ configuration,
+ index
+ })
+ )
const $toast = useToast()
-const loadChargingStations = (reloadCallback?: () => void): void => {
- if (state.isLoading === false) {
- state.isLoading = true
+const loadChargingStations = (renderCallback?: () => void): void => {
+ if (state.value.loading === false) {
+ state.value.loading = true
uiClient
.listChargingStations()
.then((response: ResponsePayload) => {
}
})
.catch((error: Error) => {
+ if (app != null) {
+ app.appContext.config.globalProperties.$chargingStations = []
+ }
$toast.error('Error at fetching charging stations')
console.error('Error at fetching charging stations:', error)
})
.finally(() => {
- if (reloadCallback != null) {
- reloadCallback()
+ if (renderCallback != null) {
+ renderCallback()
}
- state.isLoading = false
+ state.value.loading = false
})
}
}
uiClient
.stopSimulator()
.then(() => {
+ if (app != null) {
+ app.appContext.config.globalProperties.$chargingStations = []
+ }
$toast.success('Simulator successfully stopped')
})
.catch((error: Error) => {
flex-direction: column;
}
+#ui-server-container {
+ display: flex;
+ flex-direction: row;
+}
+
+#ui-server-selector {
+ width: 100%;
+ text-align: center;
+}
+
#buttons-container {
display: flex;
flex-direction: row;
}
-#button {
- flex: auto;
+#action-button {
+ flex: none;
}
#reload-button {
#reload-button:active {
background-color: red;
}
+
+#action {
+ color: white;
+ background-color: black;
+ padding: 1%;
+}
</style>