103 lines
2.7 KiB
Vue
103 lines
2.7 KiB
Vue
<template>
|
|
<div class="container-fluid">
|
|
<div v-if="errorMessage" class="container">
|
|
<div class="alert alert-danger d-flex align-items-center" role="alert">
|
|
<svg
|
|
class="bi flex-shrink-0 me-2"
|
|
width="24"
|
|
height="24"
|
|
role="img"
|
|
aria-label="Danger:"
|
|
>
|
|
<use xlink:href="#exclamation-triangle-fill--sprite" />
|
|
</svg>
|
|
<span v-text="errorMessage"></span>
|
|
</div>
|
|
</div>
|
|
<h2>Список баз</h2>
|
|
<div
|
|
v-if="isLoadingError"
|
|
class="m-4 alert alert-danger d-flex align-items-center"
|
|
role="alert"
|
|
>
|
|
<svg
|
|
class="bi flex-shrink-0 me-2"
|
|
width="32"
|
|
height="32"
|
|
role="img"
|
|
aria-label="Danger:"
|
|
>
|
|
<use xlink:href="#exclamation-triangle-fill--sprite" />
|
|
</svg>
|
|
<span>Ошибка загрузки</span>
|
|
</div>
|
|
<div v-else-if="isLoading" class="container">
|
|
<div class="spinner-border text-primary" role="status">
|
|
<span class="visually-hidden">Loading...</span>
|
|
</div>
|
|
</div>
|
|
<div v-else-if="0 == allInfobases.length" class="container">
|
|
<div class="alert alert-warning" role="alert">
|
|
<svg class="m-2" width="32" height="32">
|
|
<use xlink:href="#exclamation-triangle-fill--sprite"></use>
|
|
</svg>
|
|
<span>Нет ни одной базы</span>
|
|
</div>
|
|
</div>
|
|
<table v-else class="table table-striped">
|
|
<colgroup>
|
|
<col style="width: 3%" />
|
|
<col style="width: 32%" />
|
|
<col style="width: 50%" />
|
|
<col style="width: 15%" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="col text-end">#</th>
|
|
<th scope="col" class="col text-center">Имя</th>
|
|
<th scope="col" class="col text-start">Ссылка</th>
|
|
<th scope="col" class="col text-end">Действия</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<InfobaseListItem
|
|
v-for="(infobase, index) in allInfobases"
|
|
:key="infobase.name"
|
|
:infobase="infobase"
|
|
:index="index"
|
|
/>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import "bootstrap-icons/icons/exclamation-triangle-fill.svg?sprite";
|
|
import { mapGetters } from "vuex";
|
|
|
|
import InfobaseListItem from "@/components/InfobaseListItem.vue";
|
|
|
|
export default {
|
|
name: "InfobaseList",
|
|
components: {
|
|
InfobaseListItem,
|
|
},
|
|
data: () => ({
|
|
is_loading: true,
|
|
loading_error: false,
|
|
infobases: [],
|
|
}),
|
|
computed: mapGetters([
|
|
"allInfobases",
|
|
"getInfobaseByName",
|
|
"isLoading",
|
|
"isLoadingError",
|
|
"errorMessage",
|
|
]),
|
|
methods: {},
|
|
async mounted() {
|
|
this.$store.dispatch("fetchInfobases");
|
|
},
|
|
};
|
|
</script>
|