evcc-io/assets/js/components/Config/TestResult.vue
andig aef95ce425
Config UI: allow creating and saving devices with setup errors (#24091)
Co-authored-by: Michael Geers <michael@geers.tv>
2025-10-07 12:31:09 +00:00

89 lines
2.4 KiB
Vue

<template>
<div class="test-result my-4 p-4" data-testid="test-result">
<div class="d-flex justify-content-between align-items-center">
<strong>
<span>{{ $t("config.validation.label") }}: </span>
<span v-if="isUnknown">{{ $t("config.validation.unknown") }}</span>
<span v-if="isRunning">{{ $t("config.validation.running") }}</span>
<span v-if="!isRunning && isSuccess" class="text-success">
{{ $t("config.validation.success") }}
</span>
<span v-if="!isRunning && isError" class="text-danger">
{{ $t("config.validation.failed") }}
</span>
</strong>
<div v-if="!showTokenRequired">
<span
v-if="isRunning"
class="spinner-border spinner-border-sm"
role="status"
aria-hidden="true"
></span>
<a v-else href="#" class="alert-link" tabindex="0" @click.prevent="test">
{{ $t("config.validation.validate") }}
</a>
</div>
</div>
<hr v-if="showTokenRequired" class="divider" />
<SponsorTokenRequired v-if="showTokenRequired" compact />
<hr v-if="error" class="divider" />
<div v-if="error" class="text-danger" :class="{ 'opacity-25': isRunning }">
{{ error }}
</div>
<hr v-if="result" class="divider" />
<div v-if="result" :class="{ 'opacity-25': isRunning }">
<DeviceTags :tags="result" class="success-values" />
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, type PropType } from "vue";
import DeviceTags from "./DeviceTags.vue";
import SponsorTokenRequired from "./DeviceModal/SponsorTokenRequired.vue";
export default defineComponent({
name: "TestResult",
components: { DeviceTags, SponsorTokenRequired },
props: {
isUnknown: Boolean,
isSuccess: Boolean,
isError: Boolean,
isRunning: Boolean,
result: Object as PropType<Record<string, any> | null>,
error: String as PropType<string | null>,
sponsorTokenRequired: Boolean,
},
emits: ["test"],
data() {
return {
showTokenRequired: false,
};
},
watch: {
sponsorTokenRequired() {
this.showTokenRequired = false;
},
},
methods: {
test() {
if (this.sponsorTokenRequired) {
this.showTokenRequired = true;
} else {
this.$emit("test");
}
},
},
});
</script>
<style scoped>
.test-result {
border: 1px solid var(--bs-border-color);
border-radius: var(--bs-border-radius);
}
.divider {
border-top-color: 1px solid var(--bs-border-color);
margin-left: -1.5rem;
margin-right: -1.5rem;
}
</style>