diff --git a/webclient-vue/src/features/areas/pages/AreaDetailPage.vue b/webclient-vue/src/features/areas/pages/AreaDetailPage.vue index c2e0694..6da2843 100644 --- a/webclient-vue/src/features/areas/pages/AreaDetailPage.vue +++ b/webclient-vue/src/features/areas/pages/AreaDetailPage.vue @@ -121,16 +121,22 @@ - + > +

{{ removeDialogMessage }}

+
+ {{ removeError }} +
+ + @@ -148,7 +154,6 @@ GnInput, GnAlert, GnSelect, - GnConfirmDialog, } from "gnexus-ui-kit/vue"; import AppLoadingState from "../../../components/feedback/AppLoadingState.vue"; import AppErrorState from "../../../components/feedback/AppErrorState.vue"; @@ -228,6 +233,8 @@ const showRemoveDialog = ref(false); const removeDialogMessage = ref(""); +const removeLoading = ref(false); +const removeError = ref(""); function openRename() { if (!area.value) return; @@ -255,12 +262,24 @@ function openRemove() { if (!area.value) return; removeDialogMessage.value = `Are you sure you want to remove area "${area.value.display_name}"?`; + removeError.value = ""; showRemoveDialog.value = true; } async function submitRemove() { if (!area.value) return; - await areasStore.removeArea(area.value.id); + removeLoading.value = true; + removeError.value = ""; + + const result = await areasStore.removeArea(area.value.id); + removeLoading.value = false; + + if (!result.ok) { + removeError.value = result.error?.message || "Failed to remove area"; + return; + } + + showRemoveDialog.value = false; router.push({ name: "areas-tree" }); } diff --git a/webclient-vue/src/features/devices/pages/DeviceDetailPage.vue b/webclient-vue/src/features/devices/pages/DeviceDetailPage.vue index 2d97298..6d11878 100644 --- a/webclient-vue/src/features/devices/pages/DeviceDetailPage.vue +++ b/webclient-vue/src/features/devices/pages/DeviceDetailPage.vue @@ -60,6 +60,10 @@ @assign="openAssign" /> +
+ {{ rebootError }} +
+
Description

{{ device.description }}

@@ -147,16 +151,22 @@ - + > +

{{ removeDialogMessage }}

+
+ {{ removeError }} +
+ + @@ -175,7 +185,6 @@ GnAlert, GnTable, GnSelect, - GnConfirmDialog, } from "gnexus-ui-kit/vue"; import AppEmptyState from "../../../components/feedback/AppEmptyState.vue"; import AppErrorState from "../../../components/feedback/AppErrorState.vue"; @@ -221,6 +230,9 @@ const showRemoveDialog = ref(false); const removeDialogMessage = ref(""); +const removeLoading = ref(false); +const removeError = ref(""); +const rebootError = ref(""); const channelColumns = [ { key: "channel", label: "Channel" }, @@ -291,18 +303,36 @@ function remove() { if (!device.value) return; removeDialogMessage.value = `Are you sure you want to remove device "${device.value.name || device.value.alias}"?`; + removeError.value = ""; showRemoveDialog.value = true; } async function submitRemove() { const id = deviceId.value; - await devicesStore.removeDevice(id); + removeLoading.value = true; + removeError.value = ""; + + const result = await devicesStore.removeDevice(id); + removeLoading.value = false; + + if (!result.ok) { + removeError.value = result.error?.message || "Failed to remove device"; + return; + } + + showRemoveDialog.value = false; router.push({ name: "devices" }); } -function reboot() { +async function reboot() { if (!device.value) return; - devicesStore.rebootDevice(device.value.id); + rebootError.value = ""; + + const result = await devicesStore.rebootDevice(device.value.id); + + if (!result.ok) { + rebootError.value = result.error?.message || "Failed to reboot device"; + } } async function loadStatus() { diff --git a/webclient-vue/src/features/scripts/pages/ScriptDetailPage.vue b/webclient-vue/src/features/scripts/pages/ScriptDetailPage.vue index c6f994f..9dbc287 100644 --- a/webclient-vue/src/features/scripts/pages/ScriptDetailPage.vue +++ b/webclient-vue/src/features/scripts/pages/ScriptDetailPage.vue @@ -334,12 +334,26 @@ const id = scriptId.value; if (!id) return; + let result; if (isAction.value) { - await scriptsStore.setActionState(id, enabled); + result = await scriptsStore.setActionState(id, enabled); } else if (isRegular.value) { - await scriptsStore.setRegularState(id, enabled); + result = await scriptsStore.setRegularState(id, enabled); } else if (isScope.value) { - await scriptsStore.setScopeState(id, enabled); + result = await scriptsStore.setScopeState(id, enabled); + } + + if (result && !result.ok) { + resultAlert.value = { + variant: "danger", + title: `Failed to ${enabled ? "enable" : "disable"} ${script.value?.alias || id}`, + message: result.error?.message || "Unknown error", + }; + } else if (result) { + resultAlert.value = { + variant: "success", + title: `${enabled ? "Enabled" : "Disabled"} ${script.value?.alias || id}`, + }; } }