diff --git a/backend/iam/views.py b/backend/iam/views.py index ee057dea4..91843a946 100644 --- a/backend/iam/views.py +++ b/backend/iam/views.py @@ -21,7 +21,7 @@ from ciso_assistant.settings import EMAIL_HOST, EMAIL_HOST_RESCUE -from .models import Role, RoleAssignment +from .models import Folder, Role, RoleAssignment from .serializers import ( ChangePasswordSerializer, LoginSerializer, @@ -70,6 +70,9 @@ def get(self, request) -> Response: {"error": "You are not logged in. Please ensure you are logged in."}, status=HTTP_401_UNAUTHORIZED, ) + accessible_domains = RoleAssignment.get_accessible_folders( + Folder.get_root_folder(), request.user, Folder.ContentType.DOMAIN + ) res_data = { "id": request.user.id, "email": request.user.email, @@ -82,6 +85,7 @@ def get(self, request) -> Response: "permissions": request.user.permissions, "is_third_party": request.user.is_third_party, "is_admin": request.user.is_admin(), + "accessible_domains": [str(f) for f in accessible_domains], } return Response(res_data, status=HTTP_200_OK) diff --git a/frontend/src/lib/components/SideBar/SideBar.svelte b/frontend/src/lib/components/SideBar/SideBar.svelte index 92131cc5c..1c002e1a6 100644 --- a/frontend/src/lib/components/SideBar/SideBar.svelte +++ b/frontend/src/lib/components/SideBar/SideBar.svelte @@ -4,14 +4,18 @@ import SideBarNavigation from './SideBarNavigation.svelte'; import SideBarToggle from './SideBarToggle.svelte'; import { onMount } from 'svelte'; - export let open: boolean; - export let firstTime = false; // this needs to come from the db ; we also need to make room for variable about the specialized guided tours - import { driverInstance } from '$lib/utils/stores'; - $: classesSidebarOpen = (open: boolean) => (open ? '' : '-ml-[14rem] pointer-events-none'); - import { safeTranslate } from '$lib/utils/i18n'; + import { driverInstance, firstTimeConnection } from '$lib/utils/stores'; import * as m from '$paraglide/messages'; + import { driver } from 'driver.js'; + import 'driver.js/dist/driver.css'; + import { page } from '$app/stores'; + + export let open: boolean; + + const user = $page.data?.user; + // id is not needed, just to help us with authoring // this is not great, but couldn't find a way for i18n while separating the file. const steps = [ @@ -173,26 +177,8 @@ } ]; - function wrapStepWithTranslation(step: any) { - const { popover, ...rest } = step; - - if (!popover) return step; - - return { - ...rest, - popover: { - ...popover, - title: safeTranslate(popover.title), - description: safeTranslate(popover.description) - } - }; - } - import { driver } from 'driver.js'; - import 'driver.js/dist/driver.css'; - import { description } from '$paraglide/messages/ro'; - function triggerVisit() { - const translatedSteps = steps; //steps.map(wrapStepWithTranslation); + const translatedSteps = steps; const driverObj = driver({ showProgress: true, steps: translatedSteps @@ -200,11 +186,21 @@ $driverInstance = driverObj; driverObj.drive(); } + onMount(() => { - if (firstTime) { + if (displayGuidedTour) { triggerVisit(); + $firstTimeConnection = false; // This will prevent the tour from showing up again on page reload } }); + + $: classesSidebarOpen = (open: boolean) => (open ? '' : '-ml-[14rem] pointer-events-none'); + + $: $firstTimeConnection = $firstTimeConnection && user.accessible_domains.length === 0; + + // NOTE: For now, there is only a single guided tour, which is targeted at an administrator. + // Later, we will have tours for domain managers, analysts etc. + $: displayGuidedTour = $firstTimeConnection && user.is_admin;