From 55bef0dfcdccbe1d95c89e3797148341da32d353 Mon Sep 17 00:00:00 2001 From: Nassim Tabchiche Date: Wed, 22 Jan 2025 15:28:22 +0100 Subject: [PATCH 1/3] Add accessible domains to User type --- backend/iam/views.py | 6 +++++- frontend/src/lib/utils/types.ts | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) 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/utils/types.ts b/frontend/src/lib/utils/types.ts index 5bd08ff3c..f61e0d86f 100644 --- a/frontend/src/lib/utils/types.ts +++ b/frontend/src/lib/utils/types.ts @@ -9,6 +9,12 @@ export interface User { last_name: string; is_active: boolean; date_joined: string; + user_groups: Record[]; + roles: Record[]; + permissions: Record[]; + is_third_party: boolean; + is_admin: boolean; + accessible_domains: string[]; } export interface GlobalSettings { From 96c71d178b7e474cfb83a3d925cbeff2ee7bb909 Mon Sep 17 00:00:00 2001 From: Nassim Tabchiche Date: Wed, 22 Jan 2025 15:28:42 +0100 Subject: [PATCH 2/3] Display guided tour on first time connection --- .../src/lib/components/SideBar/SideBar.svelte | 41 ++++++++----------- frontend/src/lib/utils/stores.ts | 5 ++- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/frontend/src/lib/components/SideBar/SideBar.svelte b/frontend/src/lib/components/SideBar/SideBar.svelte index 92131cc5c..17bc55dff 100644 --- a/frontend/src/lib/components/SideBar/SideBar.svelte +++ b/frontend/src/lib/components/SideBar/SideBar.svelte @@ -4,14 +4,19 @@ 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; + $firstTimeConnection = $firstTimeConnection && user.accessible_domains.length === 0; + // 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 +178,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 +187,15 @@ $driverInstance = driverObj; driverObj.drive(); } + onMount(() => { - if (firstTime) { + if ($firstTimeConnection) { triggerVisit(); + $firstTimeConnection = false; // This will prevent the tour from showing up again on page reload } }); + + $: classesSidebarOpen = (open: boolean) => (open ? '' : '-ml-[14rem] pointer-events-none');