BulmaDrawer failed property

This commit is contained in:
Jörn-Michael Miehe 2023-09-13 15:58:15 +00:00
parent 421f7d185c
commit 5b4e057279
4 changed files with 42 additions and 13 deletions

View file

@ -4,6 +4,7 @@
<BulmaDrawer <BulmaDrawer
header="Kalender-Assistent" header="Kalender-Assistent"
:ready="is_loaded" :ready="is_loaded"
:failed="is_failed"
@open="on_open" @open="on_open"
refreshable refreshable
> >
@ -64,6 +65,8 @@ import MultiModal from "./calendar/MultiModal.vue";
}) })
export default class extends Vue { export default class extends Vue {
public is_loaded = false; public is_loaded = false;
public is_failed = false;
public day_parts: DayStrModel[] = []; public day_parts: DayStrModel[] = [];
public day_image_names: DayStrModel[] = []; public day_image_names: DayStrModel[] = [];
@ -73,6 +76,7 @@ export default class extends Vue {
public on_open(): void { public on_open(): void {
this.is_loaded = false; this.is_loaded = false;
this.is_failed = false;
Promise.all([ Promise.all([
this.$advent22.api_get<DayStrModel[]>("admin/day_parts"), this.$advent22.api_get<DayStrModel[]>("admin/day_parts"),
@ -83,7 +87,7 @@ export default class extends Vue {
this.day_image_names = day_image_names; this.day_image_names = day_image_names;
this.is_loaded = true; this.is_loaded = true;
}) })
.catch(console.error); .catch(() => (this.is_failed = true));
} }
public door_click(day: number) { public door_click(day: number) {

View file

@ -2,6 +2,7 @@
<BulmaDrawer <BulmaDrawer
header="Konfiguration" header="Konfiguration"
:ready="is_loaded" :ready="is_loaded"
:failed="is_failed"
@open="on_open" @open="on_open"
refreshable refreshable
> >
@ -144,6 +145,8 @@ interface Credentials {
}) })
export default class extends Vue { export default class extends Vue {
public is_loaded = false; public is_loaded = false;
public is_failed = true;
public config_model: ConfigModel = { public config_model: ConfigModel = {
puzzle: { puzzle: {
title: "Advent22", title: "Advent22",
@ -175,6 +178,7 @@ export default class extends Vue {
public on_open(): void { public on_open(): void {
this.is_loaded = false; this.is_loaded = false;
this.is_failed = false;
Promise.all([ Promise.all([
this.$advent22.api_get<ConfigModel>("admin/config_model"), this.$advent22.api_get<ConfigModel>("admin/config_model"),
@ -188,7 +192,7 @@ export default class extends Vue {
this.is_loaded = true; this.is_loaded = true;
}) })
.catch(console.error); .catch(() => (this.is_failed = true));
} }
public load_dav_credentials(): void { public load_dav_credentials(): void {
@ -200,7 +204,7 @@ export default class extends Vue {
password: password, password: password,
}; };
}) })
.catch(console.error); .catch(() => {});
} }
public load_ui_credentials(): void { public load_ui_credentials(): void {
@ -212,7 +216,7 @@ export default class extends Vue {
password: password, password: password,
}; };
}) })
.catch(console.error); .catch(() => {});
} }
} }
</script> </script>

View file

@ -1,5 +1,10 @@
<template> <template>
<BulmaDrawer header="Türchen bearbeiten" :ready="is_loaded" @open="on_open"> <BulmaDrawer
header="Türchen bearbeiten"
:ready="is_loaded"
:failed="is_failed"
@open="on_open"
>
<div class="is-flex is-align-items-center is-justify-content-space-between"> <div class="is-flex is-align-items-center is-justify-content-space-between">
<BulmaButton <BulmaButton
:disabled="current_step === 0" :disabled="current_step === 0"
@ -71,6 +76,7 @@ import DoorPlacer from "./editor/DoorPlacer.vue";
}) })
export default class extends Vue { export default class extends Vue {
public is_loaded = false; public is_loaded = false;
public is_failed = false;
public readonly steps: Step[] = [ public readonly steps: Step[] = [
{ label: "Platzieren", icon: "fa-solid fa-crosshairs" }, { label: "Platzieren", icon: "fa-solid fa-crosshairs" },
@ -97,8 +103,8 @@ export default class extends Vue {
this.is_loaded = true; this.is_loaded = true;
resolve(data); resolve(data);
}) })
.catch(([reason, endpoint]) => { .catch((error) => {
alert(`Fehler: ${reason} in ${endpoint}`); alert(this.$advent22.format_user_error(error));
reject(); reject();
}); });
}); });
@ -115,8 +121,8 @@ export default class extends Vue {
this.$advent22 this.$advent22
.api_put("admin/doors", data) .api_put("admin/doors", data)
.then(resolve) .then(resolve)
.catch(([reason, endpoint]) => { .catch((error) => {
alert(`Fehler: ${reason} in ${endpoint}`); alert(this.$advent22.format_user_error(error));
reject(); reject();
}); });
}); });
@ -124,7 +130,9 @@ export default class extends Vue {
public on_open(): void { public on_open(): void {
this.is_loaded = false; this.is_loaded = false;
this.load_doors().catch(() => {}); this.is_failed = false;
this.load_doors().catch(() => (this.is_failed = true));
} }
public on_download() { public on_download() {

View file

@ -2,14 +2,16 @@
<div class="card"> <div class="card">
<header class="card-header has-background-grey-lighter is-unselectable"> <header class="card-header has-background-grey-lighter is-unselectable">
<p class="card-header-title" @click="toggle">{{ header }}</p> <p class="card-header-title" @click="toggle">{{ header }}</p>
<p v-if="refreshable" class="card-header-icon px-0"> <p v-if="refreshable" class="card-header-icon px-0">
<button class="tag button icon is-info" @click="refresh"> <button class="tag button icon is-info" @click="refresh">
<font-awesome-icon <font-awesome-icon
icon="fa-solid fa-arrows-rotate" icon="fa-solid fa-arrows-rotate"
:spin="is_open && !ready" :spin="is_open && !ready && !failed"
/> />
</button> </button>
</p> </p>
<button class="card-header-icon" @click="toggle"> <button class="card-header-icon" @click="toggle">
<span class="icon"> <span class="icon">
<font-awesome-icon <font-awesome-icon
@ -20,10 +22,15 @@
</header> </header>
<template v-if="is_open"> <template v-if="is_open">
<slot v-if="ready" name="default" /> <div v-if="failed" class="card-content has-text-danger has-text-centered">
<div v-else class="card-content"> <span class="icon is-large">
<font-awesome-icon icon="fa-solid fa-ban" size="3x" />
</span>
</div>
<div v-else-if="!ready" class="card-content">
<progress class="progress is-info" max="100" /> <progress class="progress is-info" max="100" />
</div> </div>
<slot v-else name="default" />
</template> </template>
</div> </div>
</template> </template>
@ -39,6 +46,11 @@ import { Options, Vue } from "vue-class-component";
default: "", default: "",
}, },
ready: Boolean, ready: Boolean,
failed: {
type: Boolean,
required: false,
default: false,
},
refreshable: { refreshable: {
type: Boolean, type: Boolean,
required: false, required: false,
@ -50,6 +62,7 @@ import { Options, Vue } from "vue-class-component";
export default class extends Vue { export default class extends Vue {
public header!: string; public header!: string;
public ready!: boolean; public ready!: boolean;
public failed!: boolean;
public refreshable!: boolean; public refreshable!: boolean;
public is_open = false; public is_open = false;