diff --git a/src/components/CreateGroupDialog.vue b/src/components/CreateGroupDialog.vue index ba7fe6eb7..8bac1ccd0 100644 --- a/src/components/CreateGroupDialog.vue +++ b/src/components/CreateGroupDialog.vue @@ -42,6 +42,9 @@ export default { mounted() { this.modal = new Modal(this.$refs.modal); }, + beforeUnmount() { + this.cleanupModal(); + }, methods: { /** * Show the confirm dialog @@ -58,6 +61,19 @@ export default { this.$emit("added", this.groupName); this.modal.hide(); }, + /** + * Clean up modal and restore scroll behavior + * @returns {void} + */ + cleanupModal() { + if (this.modal) { + try { + this.modal.hide(); + } catch (e) { + console.warn("Modal hide failed:", e); + } + } + } }, }; diff --git a/src/components/NextPingTimer.vue b/src/components/NextPingTimer.vue new file mode 100644 index 000000000..8bb30f0a4 --- /dev/null +++ b/src/components/NextPingTimer.vue @@ -0,0 +1,54 @@ + + ({{ $t("nextCheckIn") }}: {{ formattedTime }}) + + + + + diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index f6d728029..8a747072f 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -232,6 +232,9 @@ export default { mounted() { this.modal = new Modal(this.$refs.modal); }, + beforeUnmount() { + this.cleanupModal(); + }, methods: { /** @@ -336,6 +339,20 @@ export default { }); } while (this.$root.notificationList.find(it => it.name === name)); return name; + }, + + /** + * Clean up modal and restore scroll behavior + * @returns {void} + */ + cleanupModal() { + if (this.modal) { + try { + this.modal.hide(); + } catch (e) { + console.warn("Modal hide failed:", e); + } + } } }, }; diff --git a/src/components/ProxyDialog.vue b/src/components/ProxyDialog.vue index fc92359b9..2f7ed7b61 100644 --- a/src/components/ProxyDialog.vue +++ b/src/components/ProxyDialog.vue @@ -125,11 +125,12 @@ export default { } }; }, - mounted() { this.modal = new Modal(this.$refs.modal); }, - + beforeUnmount() { + this.cleanupModal(); + }, methods: { /** * Show dialog to confirm deletion @@ -209,6 +210,20 @@ export default { } }); }, + + /** + * Clean up modal and restore scroll behavior + * @returns {void} + */ + cleanupModal() { + if (this.modal) { + try { + this.modal.hide(); + } catch (e) { + console.warn("Modal hide failed:", e); + } + } + } }, }; diff --git a/src/components/TagsManager.vue b/src/components/TagsManager.vue index 19c8e481b..368ea18c2 100644 --- a/src/components/TagsManager.vue +++ b/src/components/TagsManager.vue @@ -248,6 +248,9 @@ export default { this.modal = new Modal(this.$refs.modal); this.getExistingTags(); }, + beforeUnmount() { + this.cleanupModal(); + }, methods: { /** * Show the add tag dialog @@ -459,6 +462,19 @@ export default { this.newTags = []; this.deleteTags = []; this.processing = false; + }, + /** + * Clean up modal and restore scroll behavior + * @returns {void} + */ + cleanupModal() { + if (this.modal) { + try { + this.modal.hide(); + } catch (e) { + console.warn("Modal hide failed:", e); + } + } } }, }; diff --git a/src/lang/en.json b/src/lang/en.json index d56e61bdf..0187c0219 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -1059,6 +1059,7 @@ "RabbitMQ Username": "RabbitMQ Username", "RabbitMQ Password": "RabbitMQ Password", "rabbitmqHelpText": "To use the monitor, you will need to enable the Management Plugin in your RabbitMQ setup. For more information, please consult the {rabitmq_documentation}.", + "nextCheckIn": "Next in ", "SendGrid API Key": "SendGrid API Key", "Separate multiple email addresses with commas": "Separate multiple email addresses with commas" } diff --git a/src/pages/Details.vue b/src/pages/Details.vue index 17d32365c..c712fb066 100644 --- a/src/pages/Details.vue +++ b/src/pages/Details.vue @@ -76,7 +76,10 @@