From ec9599ec2eb0671830cb813c9b62eb00143e23bd Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 11:43:25 +0100 Subject: [PATCH 01/88] refactor: updates page imports from /stores to /state as deprecated in sveltekit 2.12 --- frontend_svelte/src/components/Guard.spec.ts | 38 ++++++++++++------- frontend_svelte/src/components/Guard.svelte | 4 +- .../(protected)/dashboard/+page.svelte | 4 +- .../protected/sessiondata/+page.svelte | 14 +++---- .../protected/socketio/+page.svelte | 6 +-- .../src/routes/(layout)/+layout.svelte | 12 +++--- frontend_svelte/src/routes/+layout.svelte | 12 +++--- 7 files changed, 51 insertions(+), 39 deletions(-) diff --git a/frontend_svelte/src/components/Guard.spec.ts b/frontend_svelte/src/components/Guard.spec.ts index 5a1b2c38..22cda4e0 100644 --- a/frontend_svelte/src/components/Guard.spec.ts +++ b/frontend_svelte/src/components/Guard.spec.ts @@ -2,15 +2,25 @@ import { describe, test, expect, vi } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import { createRawSnippet, type Snippet } from 'svelte'; import Guard from './Guard.svelte'; -import { page } from '$app/stores'; +import { page } from '$app/state'; // Svelte has no way to fill slots programmatically yet, // https://github.com/sveltejs/svelte/pull/4296 -vi.mock('$app/stores', () => ({ - page: { - subscribe: vi.fn() - } +// vi.mock('$app/state', () => ({ +// page: { +// subscribe: vi.fn() +// } +// })); + +vi.mock('$app/state', () => ({ + page: { + data: { + session: { + loggedIn: false // or true, depending on the test case + } + } + } })); const protectedContent: Snippet = createRawSnippet(() => { @@ -26,10 +36,11 @@ describe('Guard', () => { // const sessionData = { // loggedIn: false // } - page.subscribe = vi.fn((callback) => { - callback({ data: { session: { loggedIn: false } } }); - return () => {}; - }); + // page.subscribe = vi.fn((callback) => { + // callback({ data: { session: { loggedIn: false } } }); + // return () => {}; + // }); + vi.mocked(page).data.session.loggedIn = false; render(Guard, { props: { children: protectedContent } }); @@ -38,10 +49,11 @@ describe('Guard', () => { }); test('should show content as user is logged in', () => { - page.subscribe = vi.fn((callback) => { - callback({ data: { session: { loggedIn: true } } }); - return () => {}; - }); + // page.subscribe = vi.fn((callback) => { + // callback({ data: { session: { loggedIn: true } } }); + // return () => {}; + // }); + vi.mocked(page).data.session.loggedIn = true; render(Guard, { props: { children: protectedContent } }); diff --git a/frontend_svelte/src/components/Guard.svelte b/frontend_svelte/src/components/Guard.svelte index aa6c4526..677b378a 100644 --- a/frontend_svelte/src/components/Guard.svelte +++ b/frontend_svelte/src/components/Guard.svelte @@ -1,12 +1,12 @@ Welcome inside {$page.data.session.microsoftProfile.displayName} - this is your DashboardWelcome inside {page.data.session.microsoftProfile.displayName} - this is your Dashboard diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/sessiondata/+page.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/sessiondata/+page.svelte index 5610e722..8fd1a2ee 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/sessiondata/+page.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/sessiondata/+page.svelte @@ -1,24 +1,24 @@ Current page.data.sessionData -> console -$page data session data - +page data session data + Page - + diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/socketio/+page.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/socketio/+page.svelte index 86b8b805..87aec839 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/socketio/+page.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/socketio/+page.svelte @@ -7,7 +7,7 @@ import '@material/web/button/filled-button.js'; import Heading from '$components/Heading.svelte'; import Chat from './Chat.svelte'; - import { page } from '$app/stores'; + import { page } from '$app/state'; // const socketio_client_from_lib = new SocketIO(); @@ -15,14 +15,14 @@ event: 'public_message', namespace: '/public-namespace', room: '', - cookie_session_id: $page.data.session.sessionId + cookie_session_id: page.data.session.sessionId }; const demo_message_connection = { event: 'demo_message', namespace: '/demo-namespace', // namespace: '', room: '', - cookie_session_id: $page.data.session.sessionId + cookie_session_id: page.data.session.sessionId }; // let { data }: { data: PageData } = $props(); diff --git a/frontend_svelte/src/routes/(layout)/+layout.svelte b/frontend_svelte/src/routes/(layout)/+layout.svelte index f67e0ed6..db9d8025 100644 --- a/frontend_svelte/src/routes/(layout)/+layout.svelte +++ b/frontend_svelte/src/routes/(layout)/+layout.svelte @@ -10,7 +10,7 @@ import NavButton from '$components/NavButton.svelte'; import UserButton from '$components/UserButton.svelte'; import { type Snippet } from 'svelte'; - import { page } from '$app/stores'; + import { page } from '$app/state'; import Guard from '$components/Guard.svelte'; import ThemePicker from '$components/ThemePicker.svelte'; import { themeStore } from '$lib/stores'; @@ -86,9 +86,9 @@ mode = mode === 'dark' ? 'light' : 'dark'; }; - const { loggedIn } = $page.data.session || false; + const { loggedIn } = page.data.session || false; - // const { session } = $page.data; + // const { session } = page.data; // let userPictureURL: URL | undefined = $state(undefined); // onMount(async () => { @@ -146,7 +146,7 @@ you - {$page.data.session.microsoftProfile.displayName} + {page.data.session.microsoftProfile.displayName} - + {#if !loggedIn} - + {:else} diff --git a/frontend_svelte/src/routes/+layout.svelte b/frontend_svelte/src/routes/+layout.svelte index f0d2573d..406434d5 100644 --- a/frontend_svelte/src/routes/+layout.svelte +++ b/frontend_svelte/src/routes/+layout.svelte @@ -7,7 +7,7 @@ import { setContext } from 'svelte'; // import type { LayoutData } from './$types'; import type { Snippet } from 'svelte'; - import { page } from '$app/stores'; + import { page } from '$app/state';// TBD: change page to new import import { afterNavigate } from '$app/navigation'; // import 'flyonui/flyonui.js'; // import { HSStaticMethods } from 'flyonui/flyonui.js'; @@ -30,8 +30,8 @@ // const loggedIn = session?.loggedIn || false; // console.log('layout - client - data') // console.log(data) - // console.log('layout - client - $page.data') - // console.log($page.data) + // console.log('layout - client - page.data') + // console.log(page.data) // setContext('backendAPIConfiguration', data.backendAPIConfiguration); // TBD: not working in socketio.ts any more! // $effect(() => { @@ -53,7 +53,7 @@ // at Module.render (/app/node_modules/svelte/src/internal/server/index.js:117:2) // at Function._render [as render] (/app/node_modules/svelte/src/legacy/legacy-server.js:27:18) // so better use the $props with page: PageData approach here! - setContext('backendAPIConfiguration', $page.data.backendAPIConfiguration); + setContext('backendAPIConfiguration', page.data.backendAPIConfiguration); // const initFlyonui = async (_node: HTMLElement) => { // const {HSStaticMethods} = await import('flyonui/flyonui.js') @@ -99,8 +99,8 @@ // } // $effect(async () => { - // // console.log('layout - client - $page.data') - // // console.log($page.data) + // // console.log('layout - client - page.data') + // // console.log(page.data) // const {HStaticMethods} = await import('flyonui/flyonui.js'); // console.log('layout - client - -effect calling - initFlyonui') // HSStaticMethods.autoInit(); From e16e446253272db72fc990daf51641b06227bfc5 Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 11:59:39 +0100 Subject: [PATCH 02/88] chore: fixes formatting and linting --- frontend_svelte/src/components/Guard.spec.ts | 14 +++++++------- .../protected/backend-demo-resource/+page.svelte | 5 ++++- frontend_svelte/src/routes/+layout.svelte | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/frontend_svelte/src/components/Guard.spec.ts b/frontend_svelte/src/components/Guard.spec.ts index 22cda4e0..adcecdf8 100644 --- a/frontend_svelte/src/components/Guard.spec.ts +++ b/frontend_svelte/src/components/Guard.spec.ts @@ -14,13 +14,13 @@ import { page } from '$app/state'; // })); vi.mock('$app/state', () => ({ - page: { - data: { - session: { - loggedIn: false // or true, depending on the test case - } - } - } + page: { + data: { + session: { + loggedIn: false // or true, depending on the test case + } + } + } })); const protectedContent: Snippet = createRawSnippet(() => { diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte index cc9231ca..ebb14c4b 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte @@ -23,7 +23,10 @@ onclick={async () => { const container = document.getElementById('demoResourcesContainer')!; const firstDemoResource = container.childNodes[0]; - mount(DemoResourceCard, { target: container, anchor: firstDemoResource }); + mount(DemoResourceCard, { + target: container, + anchor: firstDemoResource + }); const { HSDropdown } = await import('flyonui/flyonui.js'); HSDropdown.autoInit(); }} diff --git a/frontend_svelte/src/routes/+layout.svelte b/frontend_svelte/src/routes/+layout.svelte index 406434d5..7ac57e81 100644 --- a/frontend_svelte/src/routes/+layout.svelte +++ b/frontend_svelte/src/routes/+layout.svelte @@ -7,7 +7,7 @@ import { setContext } from 'svelte'; // import type { LayoutData } from './$types'; import type { Snippet } from 'svelte'; - import { page } from '$app/state';// TBD: change page to new import + import { page } from '$app/state'; // TBD: change page to new import import { afterNavigate } from '$app/navigation'; // import 'flyonui/flyonui.js'; // import { HSStaticMethods } from 'flyonui/flyonui.js'; From b6d772b74fb9768c7cdb49093a6c44f71b243b2f Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 12:00:29 +0100 Subject: [PATCH 03/88] chore: adds missing teams as props for newly generated demoResource --- .../(protected)/protected/backend-demo-resource/+page.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte index ebb14c4b..8eaada76 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte @@ -25,7 +25,8 @@ const firstDemoResource = container.childNodes[0]; mount(DemoResourceCard, { target: container, - anchor: firstDemoResource + anchor: firstDemoResource, + props: { microsoftTeams: microsoftTeams } }); const { HSDropdown } = await import('flyonui/flyonui.js'); HSDropdown.autoInit(); From f49d5b1d2bc87ae3bdb03354e5661049959ecda6 Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 12:39:32 +0100 Subject: [PATCH 04/88] refactor: add getAttachedTeams to MicrosoftGraph API class --- frontend_svelte/src/lib/server/apis.ts | 21 +++++++++ frontend_svelte/src/lib/types.d.ts | 6 +++ .../protected/identities/+page.server.ts | 45 ++++++++++--------- .../identities/IdentityAccordion.svelte | 11 ++--- 4 files changed, 58 insertions(+), 25 deletions(-) diff --git a/frontend_svelte/src/lib/server/apis.ts b/frontend_svelte/src/lib/server/apis.ts index f807c75f..2c50276b 100644 --- a/frontend_svelte/src/lib/server/apis.ts +++ b/frontend_svelte/src/lib/server/apis.ts @@ -1,5 +1,6 @@ import AppConfig from '$lib/server/config'; import { msalAuthProvider, type BaseOauthProvider } from '$lib/server/oauth'; +import type { MicrosoftTeamBasicInformation } from '$lib/types'; const appConfig = await AppConfig.getInstance(); @@ -241,6 +242,26 @@ class MicrosoftGraph extends BaseAPI { ) { return await super.get(sessionId, path, scopes, options, headers); } + + // TBD: implement put and delete methods + + async getAttachedTeams(sessionId: string, azureGroups: string[]) { + const myTeams: MicrosoftTeamBasicInformation[] = []; + await Promise.all( + azureGroups.map(async (azureGroup) => { + const response = await this.get(sessionId, `/teams/${azureGroup}`, ['Team.ReadBasic.All']); + if (response.status === 200) { + const microsoftTeam = await response.json(); + myTeams.push({ + id: microsoftTeam.id, + displayName: microsoftTeam.displayName, + description: microsoftTeam.description + }); + } + }) + ); + return myTeams; + } } export const microsoftGraph = new MicrosoftGraph(); diff --git a/frontend_svelte/src/lib/types.d.ts b/frontend_svelte/src/lib/types.d.ts index 4fbc6d5e..13864502 100644 --- a/frontend_svelte/src/lib/types.d.ts +++ b/frontend_svelte/src/lib/types.d.ts @@ -79,3 +79,9 @@ export interface DemoResource { export interface DemoResourceWithCreationDate extends DemoResource { creation_date: Date; } + +export interface MicrosoftTeamBasicInformation { + id: string; + displayName: string; + description: string; +} diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts index 318e1544..843f367b 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts @@ -1,33 +1,38 @@ import type { PageServerLoad } from './$types'; import { microsoftGraph } from '$lib/server/apis'; -import type { MicrosoftTeamBasicInformation } from './IdentityAccordion.svelte'; +import type { MicrosoftTeamBasicInformation } from '$lib/types'; // const getAllMicrosoftTeams = async (sessionId: string, azureGroups: string[]) => { // } export const load: PageServerLoad = async ({ locals }) => { const sessionId = locals.sessionData.sessionId; - const myTeams: MicrosoftTeamBasicInformation[] = []; + let myTeams: MicrosoftTeamBasicInformation[] = []; if (locals.sessionData.userProfile) { - const myAzureGroups = locals.sessionData.userProfile.azure_token_groups; - if (myAzureGroups) { - await Promise.all( - myAzureGroups.map(async (azureGroup) => { - const response = await microsoftGraph.get(sessionId, `/teams/${azureGroup}`, [ - 'Team.ReadBasic.All' - ]); - if (response.status === 200) { - const microsoftTeam = await response.json(); - myTeams.push({ - id: microsoftTeam.id, - displayName: microsoftTeam.displayName, - description: microsoftTeam.description - }); - } - }) - ); - } + const myAzureGroupIds = locals.sessionData.userProfile.azure_token_groups; + myTeams = await microsoftGraph.getAttachedTeams(sessionId, myAzureGroupIds); } + // const myTeams: MicrosoftTeamBasicInformation[] = []; + // if (locals.sessionData.userProfile) { + // const myAzureGroups = locals.sessionData.userProfile.azure_token_groups; + // if (myAzureGroups) { + // await Promise.all( + // myAzureGroups.map(async (azureGroup) => { + // const response = await microsoftGraph.get(sessionId, `/teams/${azureGroup}`, [ + // 'Team.ReadBasic.All' + // ]); + // if (response.status === 200) { + // const microsoftTeam = await response.json(); + // myTeams.push({ + // id: microsoftTeam.id, + // displayName: microsoftTeam.displayName, + // description: microsoftTeam.description + // }); + // } + // }) + // ); + // } + // } console.log( '=== src - routes - %28layout%29 - %28protected%29 - protected - identities - %2Bpage.server.ts - myTeams ===' diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte index 86dbe827..a5a76399 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte @@ -2,11 +2,12 @@ import type { Snippet } from 'svelte'; let { title, id, children }: { title: string; id: string; children: Snippet } = $props(); - export interface MicrosoftTeamBasicInformation { - id: string; - displayName: string; - description: string; - } + + // export interface MicrosoftTeamBasicInformation { + // id: string; + // displayName: string; + // description: string; + // }
From 83ba89ae0690397ad8cf74ae3a7745fcdab9792f Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 12:50:46 +0100 Subject: [PATCH 05/88] chore: fixes possibly undefined error --- .../(layout)/(protected)/protected/identities/+page.server.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts index 843f367b..b9cd5377 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts @@ -10,7 +10,9 @@ export const load: PageServerLoad = async ({ locals }) => { let myTeams: MicrosoftTeamBasicInformation[] = []; if (locals.sessionData.userProfile) { const myAzureGroupIds = locals.sessionData.userProfile.azure_token_groups; - myTeams = await microsoftGraph.getAttachedTeams(sessionId, myAzureGroupIds); + if (myAzureGroupIds) { + myTeams = await microsoftGraph.getAttachedTeams(sessionId, myAzureGroupIds); + } } // const myTeams: MicrosoftTeamBasicInformation[] = []; // if (locals.sessionData.userProfile) { From 8c0581657351bff066fd3a3ba58f6a5b6ef923bb Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 12:54:23 +0100 Subject: [PATCH 06/88] chore: removes debugging logs --- .../protected/backend-demo-resource/+page.server.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts index 05680242..3dcd777a 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts @@ -50,15 +50,11 @@ export const actions: Actions = { return fail(response.status, { error: response.statusText }); } else { const payload = await response.json(); - console.log('=== routes - demo-resource - page.server - post function - payload ==='); - console.log(payload); const createdLogResponse = await backendAPI.get( sessionId, `/access/log/${payload.id}/created` ); const createdLogData = await createdLogResponse.json(); - console.log('=== routes - demo-resource - page.server - post function - createdLogData ==='); - console.log(createdLogData); return { id: payload.id, @@ -93,17 +89,11 @@ export const actions: Actions = { share: async ({ locals, request, url }) => { console.log('=== routes - demo-resource - page.server - share function executed ==='); const data = await request.formData(); - // console.log('=== routes - demo-resource - page.server - share function - data ==='); - // console.log(data); - // console.log('=== url. searchParams ==='); - // console.log(url.searchParams.get('teamid')); const accessPolicy = { resource_id: data.get('id'), identity_id: url.searchParams.get('teamid'), action: 'own' // TBD. make this dynamic: own, write, read }; - // console.log('=== routes - demo-resource - page.server - share function - accessPolicy ==='); - // console.log(accessPolicy); const sessionId = locals.sessionData.sessionId; From 7656a72192672cf736a3e67fe7bf4eaa608e9eb9 Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 13:38:11 +0100 Subject: [PATCH 07/88] chore: changes share options from id's to truncated names of MS Teams --- frontend_svelte/src/lib/server/apis.ts | 8 ++++++- frontend_svelte/src/lib/types.d.ts | 5 ---- .../backend-demo-resource/+page.server.ts | 13 ++++++++--- .../DemoResourceCard.svelte | 17 ++++++++++---- .../protected/identities/+page.server.ts | 23 +++++++++++-------- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/frontend_svelte/src/lib/server/apis.ts b/frontend_svelte/src/lib/server/apis.ts index 2c50276b..64dd6dea 100644 --- a/frontend_svelte/src/lib/server/apis.ts +++ b/frontend_svelte/src/lib/server/apis.ts @@ -1,6 +1,5 @@ import AppConfig from '$lib/server/config'; import { msalAuthProvider, type BaseOauthProvider } from '$lib/server/oauth'; -import type { MicrosoftTeamBasicInformation } from '$lib/types'; const appConfig = await AppConfig.getInstance(); @@ -214,6 +213,13 @@ class BackendAPI extends BaseAPI { export const backendAPI = new BackendAPI(); + +export interface MicrosoftTeamBasicInformation { + id: string; + displayName: string; + description: string; +} + class MicrosoftGraph extends BaseAPI { appConfig: AppConfig; diff --git a/frontend_svelte/src/lib/types.d.ts b/frontend_svelte/src/lib/types.d.ts index 13864502..7e21b559 100644 --- a/frontend_svelte/src/lib/types.d.ts +++ b/frontend_svelte/src/lib/types.d.ts @@ -80,8 +80,3 @@ export interface DemoResourceWithCreationDate extends DemoResource { creation_date: Date; } -export interface MicrosoftTeamBasicInformation { - id: string; - displayName: string; - description: string; -} diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts index 3dcd777a..eadff1c8 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts @@ -3,6 +3,7 @@ import type { Actions, PageServerLoad } from './$types'; import { backendAPI } from '$lib/server/apis'; import { fail } from '@sveltejs/kit'; import type { DemoResource, DemoResourceWithCreationDate } from '$lib/types'; +import { microsoftGraph, type MicrosoftTeamBasicInformation } from '$lib/server/apis'; export const load: PageServerLoad = async ({ locals }) => { // console.log('=== routes - demo-resource - page.server - load function executed ==='); @@ -29,10 +30,16 @@ export const load: PageServerLoad = async ({ locals }) => { return a.creation_date < b.creation_date ? 1 : -1; } ); - let microsoftTeams: string[] = []; - if (locals.sessionData.userProfile) { - microsoftTeams = locals.sessionData.userProfile.azure_token_groups || []; + // let microsoftTeams: string[] = []; + // if (locals.sessionData.userProfile) { + // microsoftTeams = locals.sessionData.userProfile.azure_token_groups || []; + // } + + let microsoftTeams: MicrosoftTeamBasicInformation[] = []; + if( locals.sessionData.userProfile && locals.sessionData.userProfile.azure_token_groups ) { + microsoftTeams = await microsoftGraph.getAttachedTeams(sessionId, locals.sessionData.userProfile.azure_token_groups); } + console.log('=== routes - demo-resource - page.server - load function - microsoftTeams ==='); console.log(microsoftTeams); diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte index ccdbaa0d..3288f17f 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte @@ -5,6 +5,7 @@ import type { DemoResourceWithCreationDate } from '$lib/types'; // import { deserialize } from '$app/forms'; import { enhance } from '$app/forms'; + import type { MicrosoftTeamBasicInformation } from '$lib/server/apis'; // let { // id, @@ -26,7 +27,7 @@ let { demoResource, microsoftTeams - }: { demoResource?: DemoResourceWithCreationDate; microsoftTeams?: string[] } = $props(); + }: { demoResource?: DemoResourceWithCreationDate; microsoftTeams?: MicrosoftTeamBasicInformation[] } = $props(); let id = $state(demoResource?.id || 'new_' + Math.random().toString(36).substring(2, 9)); let name = $state(demoResource?.name || undefined); let description = $state(demoResource?.description || undefined); @@ -181,7 +182,7 @@
+
+ Tooltips +
+
+ + + Tooltip on top + +
+
+
+
Theme Picker
From 4b8bc88ed03a3e582a3fbce70e3df53d2b82caf8 Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 14:16:11 +0100 Subject: [PATCH 10/88] chore: changes card shadow from lg to md --- frontend_svelte/src/components/Card.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend_svelte/src/components/Card.svelte b/frontend_svelte/src/components/Card.svelte index a6521c3f..29091e57 100644 --- a/frontend_svelte/src/components/Card.svelte +++ b/frontend_svelte/src/components/Card.svelte @@ -17,7 +17,7 @@
{#if header} From 193d9e0fa5397b6d986e1747a04e71e0c35ba6eb Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Mon, 13 Jan 2025 15:42:07 +0100 Subject: [PATCH 11/88] chore: removes card from getting deleted on share, closses the menu after share and prepares rights dropdown meny for each team --- .../DemoResourceCard.svelte | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte index 4f348b38..aedc1621 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte @@ -6,6 +6,7 @@ // import { deserialize } from '$app/forms'; import { enhance } from '$app/forms'; import type { MicrosoftTeamBasicInformation } from '$lib/server/apis'; + import { TemperatureCache } from '@material/material-color-utilities'; // let { // id, @@ -58,8 +59,13 @@ let card: Card; let createUpdateForm = $state(null); + let dropdownMenu: HTMLUListElement; const formAction = $derived(id.slice(0, 4) === 'new_' ? '?/post' : '?/put'); + microsoftTeams?.forEach((team) => { + team.rights = 'read'; + }); + const triggerSubmit = async () => { createUpdateForm?.requestSubmit(); }; @@ -145,7 +151,7 @@ {/if} + {/if}
{/snippet} From c3ba965d4f3ce5dac6ee242c035d1e9c8371713a Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Wed, 15 Jan 2025 16:01:43 +0100 Subject: [PATCH 44/88] chore: renames the access lib file on client side into accessHandler --- frontend_svelte/src/lib/accessHandler.ts | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 frontend_svelte/src/lib/accessHandler.ts diff --git a/frontend_svelte/src/lib/accessHandler.ts b/frontend_svelte/src/lib/accessHandler.ts new file mode 100644 index 00000000..684341f0 --- /dev/null +++ b/frontend_svelte/src/lib/accessHandler.ts @@ -0,0 +1,30 @@ +import type { AccessPolicy } from '$lib/types'; + +export enum Action { + Own = 'own', + Write = 'write', + Read = 'read' +} + +export class AccessHandler { + static getRights(identityId: string, accessPolicies: AccessPolicy[]) { + const hasOwnerRights = accessPolicies?.some( + (policy) => policy.identity_id === identityId && policy.action === 'own' + ); + const hasWriteRights = accessPolicies?.some( + (policy) => policy.identity_id === identityId && policy.action === 'write' + ); + const hasReadRights = accessPolicies?.some( + (policy) => policy.identity_id === identityId && policy.action === 'read' + ); + if (hasOwnerRights) { + return Action.Own; + } else if (hasWriteRights) { + return Action.Write; + } else if (hasReadRights) { + return Action.Read; + } else { + return null; + } + } +} From 57c638d0e62fcfb0a469b2e4b3a1cd28e353560e Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Wed, 15 Jan 2025 16:03:53 +0100 Subject: [PATCH 45/88] chore: fixes type error in deomresourceCArd --- .../protected/backend-demo-resource/DemoResourceCard.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte index 8c766335..23c67369 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte @@ -58,7 +58,7 @@ let card: Card; let createUpdateForm = $state(null); - let dropdownMenu: HTMLUListElement; + let dropdownMenu = $state(null); const formAction = $derived(id.slice(0, 4) === 'new_' ? '?/post' : '?/put'); let rights = $state('read'); @@ -211,7 +211,7 @@ aria-labelledby="share-{id}" >
  • -
    dropdownMenu.classList.add('hidden')}> + dropdownMenu?.classList.add('hidden')}> @@ -41,10 +51,25 @@
    {#each demoResources as demoResource} - + { + // // console.log('team.access_policies', demoResource.access_policies); + // return { + // ...team, + // dummy: 'dummy', + // access_policies: demoResource.access_policies?.filter((policy: AccessPolicy) => policy.resource_id === demoResource.id) + // }}) + //return Object.assign(team, { + // access_policies: demoResource.access_policies?.filter((policy: AccessPolicy) => team.id === policy.identity_id) + // }, { dummy: "dummy" }); + // })} + }/>
    {demoResource.name} +

    => demoResource

    +

    => microsoftTeams

    +
    {/each}
    diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte index 23c67369..ce65ec08 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte @@ -5,7 +5,7 @@ import type { DemoResourceExtended, AccessPolicy } from '$lib/types'; // import { deserialize } from '$app/forms'; import { enhance } from '$app/forms'; - import type { MicrosoftTeamBasicInformation } from '$lib/server/apis'; + import type { MicrosoftTeamBasic } from '$lib/types'; import { AccessHandler } from '$lib/accessHandler'; // let { @@ -25,7 +25,7 @@ // category_id?: string; // tags: string[]; // } = $props(); - let { demoResource, microsoftTeams }: { demoResource?: DemoResourceExtended, microsoftTeams?: MicrosoftTeamBasicInformation[] } = $props(); + let { demoResource, microsoftTeams }: { demoResource?: DemoResourceExtended, microsoftTeams?: MicrosoftTeamBasic[] } = $props(); let id = $state(demoResource?.id || 'new_' + Math.random().toString(36).substring(2, 9)); let userRight = $state(demoResource?.user_right || 'read'); let name = $state(demoResource?.name || undefined); diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts index d108f8d0..3bbb50cb 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/+page.server.ts @@ -1,12 +1,12 @@ import type { PageServerLoad } from './$types'; -import { microsoftGraph, type MicrosoftTeamBasicInformation } from '$lib/server/apis'; +import { microsoftGraph, type MicrosoftTeamBasic } from '$lib/server/apis'; // const getAllMicrosoftTeams = async (sessionId: string, azureGroups: string[]) => { // } export const load: PageServerLoad = async ({ locals }) => { const sessionId = locals.sessionData.sessionId; - // const myTeams: MicrosoftTeamBasicInformation[] = []; + // const myTeams: MicrosoftTeamBasic[] = []; // if (locals.sessionData.userProfile) { // const myAzureGroups = locals.sessionData.userProfile.azure_token_groups; // if (myAzureGroups) { @@ -28,7 +28,7 @@ export const load: PageServerLoad = async ({ locals }) => { // } // } - // let myTeams: MicrosoftTeamBasicInformation[] = []; + // let myTeams: MicrosoftTeamBasic[] = []; // if (locals.sessionData.userProfile) { // const myAzureGroupIds = locals.sessionData.userProfile.azure_token_groups; // if (myAzureGroupIds) { @@ -36,7 +36,7 @@ export const load: PageServerLoad = async ({ locals }) => { // } // } - let myTeams: MicrosoftTeamBasicInformation[] = []; + let myTeams: MicrosoftTeamBasic[] = []; if (locals.sessionData.userProfile && locals.sessionData.userProfile.azure_token_groups) { myTeams = await microsoftGraph.getAttachedTeams( sessionId, diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte index 4009d385..3494ae56 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/identities/IdentityAccordion.svelte @@ -2,7 +2,7 @@ import type { Snippet } from 'svelte'; let { title, id, children }: { title: string; id: string; children: Snippet } = $props(); - // export interface MicrosoftTeamBasicInformation { + // export interface MicrosoftTeamBasic { // id: string; // displayName: string; // description: string; From 750e4e5848f4776d811e779813a22ea22813ed2a Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Wed, 15 Jan 2025 19:07:08 +0100 Subject: [PATCH 47/88] chore: fixes missing selection for user_rights on server - rights only, not the resource_id as well --- .../(protected)/protected/backend-demo-resource/+page.server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts index dd1b6ca8..a17366ac 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.server.ts @@ -53,7 +53,7 @@ export const load: PageServerLoad = async ({ locals }) => { return Object.assign({}, { ...resource, creation_date: new Date(creationDates[index]), - user_right: accessRights.find((right: AccessRight) => right.resource_id === resource.id), + user_right: accessRights.find((right: AccessRight) => right.resource_id === resource.id).action, access_policies: accessPolicies.filter((policy: AccessPolicy) => policy.resource_id === resource.id) }); } From edb0306a71b0327b2a502e807a14182a87c12cd1 Mon Sep 17 00:00:00 2001 From: arnoldknott Date: Wed, 15 Jan 2025 19:07:38 +0100 Subject: [PATCH 48/88] chore: prepares for showing shared rights and assigning new rights --- .../backend-demo-resource/+page.svelte | 14 +----- .../DemoResourceCard.svelte | 46 ++++--------------- 2 files changed, 9 insertions(+), 51 deletions(-) diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte index 164b71af..6c382bbb 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/+page.svelte @@ -51,19 +51,7 @@
    {#each demoResources as demoResource} - { - // // console.log('team.access_policies', demoResource.access_policies); - // return { - // ...team, - // dummy: 'dummy', - // access_policies: demoResource.access_policies?.filter((policy: AccessPolicy) => policy.resource_id === demoResource.id) - // }}) - //return Object.assign(team, { - // access_policies: demoResource.access_policies?.filter((policy: AccessPolicy) => team.id === policy.identity_id) - // }, { dummy: "dummy" }); - // })} - }/> +
    {demoResource.name}

    => demoResource

    diff --git a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte index ce65ec08..48e02e8a 100644 --- a/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte +++ b/frontend_svelte/src/routes/(layout)/(protected)/protected/backend-demo-resource/DemoResourceCard.svelte @@ -1,30 +1,11 @@