From 0ac7a6be5f849b6260e38e68e6f0610f39a1a729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20K=C3=B6ninger?= Date: Fri, 9 Dec 2022 11:56:51 +0100 Subject: [PATCH] feat: allow to opt-in toast notifications (#2177) * feat: allow to opt-in toast notifications * Extended docs with configuration of opt-in toast notifications Co-authored-by: ulrichschulte --- .../src/main/asciidoc/server.adoc | 4 +++ .../src/main/frontend/utils/axios.js | 33 +++++++++++-------- .../AdminServerUiAutoConfiguration.java | 2 +- .../ui/config/AdminServerUiProperties.java | 5 +++ .../admin/server/ui/web/UiController.java | 2 ++ 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/spring-boot-admin-docs/src/main/asciidoc/server.adoc b/spring-boot-admin-docs/src/main/asciidoc/server.adoc index 7dfaf94510e..46d8275b340 100644 --- a/spring-boot-admin-docs/src/main/asciidoc/server.adoc +++ b/spring-boot-admin-docs/src/main/asciidoc/server.adoc @@ -135,6 +135,10 @@ In addition when the reverse proxy terminates the https connection, it may be ne | Polling duration in ms to fetch new threads data. | `2500` +| spring.boot.admin.ui.enable-toasts +| Allows to enable toast notifications. +| `false` + |=== include::server-discovery.adoc[] diff --git a/spring-boot-admin-server-ui/src/main/frontend/utils/axios.js b/spring-boot-admin-server-ui/src/main/frontend/utils/axios.js index 04771b56617..be40b5424fd 100644 --- a/spring-boot-admin-server-ui/src/main/frontend/utils/axios.js +++ b/spring-boot-admin-server-ui/src/main/frontend/utils/axios.js @@ -13,32 +13,39 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import sbaConfig from '@/sba-config' +import sbaConfig from '@/sba-config'; import axios from 'axios'; import Vue from 'vue'; axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; axios.defaults.xsrfHeaderName = sbaConfig.csrf.headerName; -export const redirectOn401 = (predicate = () => true) => error => { +export const redirectOn401 = (predicate = () => true) => (error) => { if (error.response && error.response.status === 401 && predicate(error)) { - window.location.assign(`login?redirectTo=${encodeURIComponent(window.location.href)}`); + window.location.assign( + `login?redirectTo=${encodeURIComponent(window.location.href)}` + ); } return Promise.reject(error); }; -const instance = axios.create({withCredentials: true, headers: {'Accept': 'application/json'}}); -instance.interceptors.response.use(response => response, redirectOn401()); +const instance = axios.create({ + withCredentials: true, + headers: { Accept: 'application/json' }, +}); +instance.interceptors.response.use((response) => response, redirectOn401()); instance.create = axios.create; export default instance; export const registerErrorToastInterceptor = (axios) => { - axios.interceptors.response.use( - response => response, - error => { - let data = error.request; - Vue.$toast.error(`Request failed: ${data.status} - ${data.statusText}`); - } - ) -} + if (sbaConfig.uiSettings.enableToasts === true) { + axios.interceptors.response.use( + (response) => response, + (error) => { + let data = error.request; + Vue.$toast.error(`Request failed: ${data.status} - ${data.statusText}`); + } + ); + } +}; diff --git a/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiAutoConfiguration.java b/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiAutoConfiguration.java index 0ab1bed32f2..1de5913041a 100644 --- a/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiAutoConfiguration.java +++ b/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiAutoConfiguration.java @@ -90,7 +90,7 @@ public UiController homeUiController(UiExtensions uiExtensions) throws IOExcepti Settings uiSettings = Settings.builder().brand(this.adminUi.getBrand()).title(this.adminUi.getTitle()) .loginIcon(this.adminUi.getLoginIcon()).favicon(this.adminUi.getFavicon()) - .faviconDanger(this.adminUi.getFaviconDanger()) + .faviconDanger(this.adminUi.getFaviconDanger()).enableToasts(this.adminUi.getEnableToasts()) .notificationFilterEnabled( !this.applicationContext.getBeansOfType(NotificationFilterController.class).isEmpty()) .routes(routes).rememberMeEnabled(this.adminUi.isRememberMeEnabled()) diff --git a/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiProperties.java b/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiProperties.java index badad46faf6..f1f103b9efa 100644 --- a/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiProperties.java +++ b/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiProperties.java @@ -126,6 +126,11 @@ public class AdminServerUiProperties { */ private List additionalRouteExcludes = new ArrayList<>(); + /** + * Allows to enable toast notifications in SBA. + */ + private Boolean enableToasts = false; + @lombok.Data public static class PollTimer { diff --git a/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/web/UiController.java b/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/web/UiController.java index fed976b5dda..bb425115395 100644 --- a/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/web/UiController.java +++ b/spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/web/UiController.java @@ -139,6 +139,8 @@ public static class Settings { private final List viewSettings; + private final Boolean enableToasts; + } @lombok.Data