diff --git a/frontend/src/components/shared/TopMenu.vue b/frontend/src/components/shared/TopMenu.vue index 230948868..9cd0d116d 100644 --- a/frontend/src/components/shared/TopMenu.vue +++ b/frontend/src/components/shared/TopMenu.vue @@ -94,11 +94,10 @@ diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 3898f52c8..8510ef701 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -1,5 +1,5 @@ import { createRouter, createWebHistory } from 'vue-router' -import { useAuthStore } from '@/stores' +import { useAuthStore, useGlobalStore } from '@/stores' import { useGlobalConfig } from '@/main' import constants from '@/constants.json' @@ -494,11 +494,16 @@ router.beforeEach(async (to, from, next) => { const previousPage = window.location.href sessionStorage.setItem('previousPage', previousPage) const authStore = useAuthStore() + const globalStore = useGlobalStore() const isAuth = await authStore.validateAccess() if (isAuth) { if (to.meta.allowedRoles !== undefined) { if (to.meta.allowedRoles.indexOf(authStore.authUser.role) === -1) { - next({ name: 'AccountSettings' }) + await globalStore.fetchAvailableApplications() + const nextPage = globalStore.webmailEnabled + ? 'MailboxView' + : 'AccountSettings' + next({ name: nextPage }) return } } diff --git a/frontend/src/stores/global.store.js b/frontend/src/stores/global.store.js index 9d3f24935..f729b7d2a 100644 --- a/frontend/src/stores/global.store.js +++ b/frontend/src/stores/global.store.js @@ -1,11 +1,13 @@ import { computed, ref } from 'vue' import { defineStore } from 'pinia' +import accountApi from '@/api/account' import capabilitiesApi from '@/api/capabilities' import notificationsApi from '@/api/notifications' export const useGlobalStore = defineStore('global', () => { const capabilities = ref([]) const notifications = ref([]) + const applications = ref([]) async function fetchCapabilities() { const response = await capabilitiesApi.getCapabilities() @@ -15,6 +17,12 @@ export const useGlobalStore = defineStore('global', () => { const response = await notificationsApi.getNotifications() notifications.value = response.data } + async function fetchAvailableApplications() { + if (!applications.value.length) { + const response = await accountApi.getAvailableApplications() + applications.value = response.data + } + } function getNotificationById(id) { return notifications.value.find((item) => item.id === id) @@ -33,14 +41,21 @@ export const useGlobalStore = defineStore('global', () => { return notifications.value.filter((notif) => notif.target === 'admin') }) + const webmailEnabled = computed( + () => applications.value.find((app) => app.name === 'webmail') !== undefined + ) + return { + applications, capabilities, notifications, fetchCapabilities, fetchNotifications, + fetchAvailableApplications, getNotificationById, activeNotifications, adminNotifications, + webmailEnabled, $reset, } }) diff --git a/modoboa/core/api/v2/serializers.py b/modoboa/core/api/v2/serializers.py index 791587143..c37134a0e 100644 --- a/modoboa/core/api/v2/serializers.py +++ b/modoboa/core/api/v2/serializers.py @@ -190,19 +190,12 @@ class CoreGlobalParametersSerializer(serializers.Serializer): log_maximum_age = serializers.IntegerField(default=365) message_history_maximum_age = serializers.IntegerField(default=180) items_per_page = serializers.IntegerField(default=30) - default_top_redirection = serializers.ChoiceField( - default="user", choices=[("user", _("User profile"))], required=False - ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) sms_backend_fields = sms_backends.get_all_backend_serializer_settings() for field, definition in sms_backend_fields.items(): self.fields[field] = definition["type"](**definition["attrs"]) - # Choices serializer for default_top_redirection field - self.fields["default_top_redirection"].choices = ( - app_settings.enabled_applications() - ) # Populate choices of password_scheme self.fields["password_scheme"].choices = app_settings.get_password_scheme() diff --git a/modoboa/core/api/v2/tests.py b/modoboa/core/api/v2/tests.py index cf963310a..375d81fdd 100644 --- a/modoboa/core/api/v2/tests.py +++ b/modoboa/core/api/v2/tests.py @@ -74,7 +74,6 @@ CORE_SETTINGS = { "top_notifications_check_interval": 30, "log_maximum_age": 365, "items_per_page": 30, - "default_top_redirection": "user", } diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index 2741107ba..c6aeda466 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -10,18 +10,6 @@ from modoboa.core.password_hashers.utils import cache_available_password_hasher from . import sms_backends -def enabled_applications(): - """Return the list of installed extensions.""" - from modoboa.core.extensions import exts_pool - - result = [("user", _("User profile"))] - for extension in exts_pool.list_all(): - if "topredirection_url" not in extension: - continue - result.append((extension["name"], extension["label"])) - return sorted(result, key=lambda e: e[0]) - - def get_password_scheme(): available_schemes = cache.get("password_scheme_choice") if available_schemes is None: @@ -740,16 +728,6 @@ GLOBAL_PARAMETERS_STRUCT = collections.OrderedDict( ), }, ), - ( - "default_top_redirection", - { - "label": gettext_lazy("Default top redirection"), - "help_text": gettext_lazy( - "The default redirection used when no application is " - "specified" - ), - }, - ), ] ), }, diff --git a/modoboa/lib/tests/__init__.py b/modoboa/lib/tests/__init__.py index abe01e12e..496333fe2 100644 --- a/modoboa/lib/tests/__init__.py +++ b/modoboa/lib/tests/__init__.py @@ -36,7 +36,6 @@ SETTINGS_SAMPLE = { "log_maximum_age": "365", "ldap_auth_method": "searchbind", "send_statistics": "True", - "default_top_redirection": "user", "sender_address": "noreply@modoboa.org", "ldap_server_port": "389", "rounds_number": "70000",