Path: blob/master/web/client/src/components/Scanner.vue
1660 views
<template>
<b-container class="mb-3">
<b-row align-h="between" align-v="center">
<h3>{{ name }}</h3>
<b-button
v-if="!error && !loading && !data"
@click="runScan"
variant="dark"
size="lg"
>Run</b-button
>
<b-spinner v-if="loading && !error" type="grow"></b-spinner>
<b-row v-if="error && !loading">
<b-alert class="m-0" show variant="danger" fade>{{ error }}</b-alert>
<b-button
v-if="!dryrunError"
@click="runScan"
variant="danger"
size="lg"
>Retry</b-button
>
</b-row>
</b-row>
<b-collapse :id="collapseId" class="mt-2 text-left">
<JsonViewer :value="data"></JsonViewer>
</b-collapse>
</b-container>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
import axios from "axios";
import { mapState, mapMutations } from "vuex";
import JsonViewer from "vue-json-viewer";
import config from "@/config";
@Component({
components: {
JsonViewer,
},
})
export default class Scanner extends Vue {
data = null;
loading = false;
dryrunError = false;
error: unknown = null;
computed = {
...mapState(["number"]),
...mapMutations(["pushError"]),
};
@Prop() scanId!: string;
@Prop() name!: string;
collapseId = "scanner-collapse" + this.scanId;
mounted(): void {
this.dryRun();
}
private async dryRun(): Promise<void> {
try {
const res = await axios.post(
`${config.apiUrl}/v2/scanners/${this.scanId}/dryrun`,
{
number: this.$store.state.number,
},
{
validateStatus: () => true,
}
);
if (!res.data.success && res.data.error) {
throw res.data.error;
}
} catch (error: unknown) {
this.dryrunError = true;
this.error = error;
}
}
private async runScan(): Promise<void> {
this.error = null;
this.loading = true;
try {
const res = await axios.post(
`${config.apiUrl}/v2/scanners/${this.scanId}/run`,
{
number: this.$store.state.number,
},
{
validateStatus: () => true,
}
);
if (!res.data.success && res.data.error) {
throw res.data.error;
}
this.data = res.data.result;
this.$root.$emit("bv::toggle::collapse", this.collapseId);
} catch (error) {
this.error = error;
}
this.loading = false;
}
}
</script>