From acf76ba06ca5bb26445fe95b0a1fa4775811c4d1 Mon Sep 17 00:00:00 2001 From: fastlorenzo <git@bernardi.be> Date: Sun, 1 Dec 2024 00:51:54 +0100 Subject: [PATCH 1/4] Make menu and analytics page usable on mobile Signed-off-by: fastlorenzo <git@bernardi.be> --- .../src/lib/components/DataViz/Card.svelte | 3 +- .../(app)/(internal)/analytics/+page.svelte | 43 ++++++++++++++----- frontend/src/routes/(app)/+layout.svelte | 2 +- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/frontend/src/lib/components/DataViz/Card.svelte b/frontend/src/lib/components/DataViz/Card.svelte index 277b88ed8a..84c1cdc37f 100644 --- a/frontend/src/lib/components/DataViz/Card.svelte +++ b/frontend/src/lib/components/DataViz/Card.svelte @@ -10,11 +10,12 @@ if (emphasis) { cEmphasis = 'border border-y-0 border-r-0 border-l-2 border-l-violet-600'; } + export let customClass: string = ''; </script> <a {href} - class="flex flex-col shadow-lg text-purple-800 p-2 h-28 bg-white hover:bg-violet-50 {cEmphasis}" + class="flex flex-col shadow-lg text-purple-800 p-2 h-28 bg-white hover:bg-violet-50 {cEmphasis} {customClass}" > <div class="text-xs"> <span><i class={icon}></i></span> diff --git a/frontend/src/routes/(app)/(internal)/analytics/+page.svelte b/frontend/src/routes/(app)/(internal)/analytics/+page.svelte index d5445dece6..5ed3c44976 100644 --- a/frontend/src/routes/(app)/(internal)/analytics/+page.svelte +++ b/frontend/src/routes/(app)/(internal)/analytics/+page.svelte @@ -148,6 +148,7 @@ icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} emphasis={true} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.controls.active} @@ -155,6 +156,7 @@ href="/applied-controls/?status=active" icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.controls.deprecated} @@ -162,6 +164,7 @@ href="/applied-controls/?status=deprecated" icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.controls.to_do} @@ -169,8 +172,9 @@ href="/applied-controls/?status=to_do" icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} + customClass="col-span-3 lg:col-span-1" /> - <div class="h-80 col-span-2 row-span-2 bg-white"> + <div class="h-80 col-span-6 lg:col-span-2 row-span-2 bg-white"> <NightingaleChart name="nightingale" values={metrics.csf_functions} /> </div> <Card @@ -179,6 +183,7 @@ href="/applied-controls/?status=in_progress" icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.controls.on_hold} @@ -186,6 +191,7 @@ href="/applied-controls/?status=on_hold" icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.controls.p1} @@ -194,6 +200,7 @@ icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} emphasis={true} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.controls.eta_missed} @@ -202,8 +209,9 @@ icon="fa-solid fa-shield-halved" section={m.sumpageSectionControls()} emphasis={true} + customClass="col-span-3 lg:col-span-1" /> - <div class="col-span-4 row-span-4 bg-white h-96"> + <div class="col-span-6 lg:col-span-4 row-span-4 bg-white h-96"> <StackedBarsNormalized names={metrics.audits_stats.names} data={metrics.audits_stats.data} @@ -218,6 +226,7 @@ icon="fa-solid fa-list-check" section={m.sumpageSectionCompliance()} emphasis={true} + customClass="col-span-3 lg:col-span-1" /> <div></div> <Card @@ -227,6 +236,7 @@ icon="fa-solid fa-list-check" section={m.sumpageSectionCompliance()} emphasis={true} + customClass="col-span-3 lg:col-span-1" /> <Card @@ -235,6 +245,7 @@ href="/compliance-assessments/" icon="fa-solid fa-list-check" section={m.sumpageSectionCompliance()} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.compliance.non_compliant_items} @@ -242,6 +253,7 @@ href="#" icon="fa-solid fa-list-check" section={m.sumpageSectionCompliance()} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.compliance.evidences} @@ -249,11 +261,12 @@ href="/evidences/" icon="fa-solid fa-list-check" section={m.sumpageSectionCompliance()} + customClass="col-span-3 lg:col-span-1" /> <div class=""></div> <div class=""></div> <!----> - <div class=" col-span-2 row-span-2 h-80 bg-white"> + <div class="col-span-6 lg:col-span-2 row-span-2 h-80 bg-white"> <HalfDonutChart name="current_h" title={m.sumpageTitleCurrentRisks()} @@ -268,6 +281,7 @@ emphasis={true} icon="fa-solid fa-biohazard" section={m.sumpageSectionRisk()} + customClass="col-span-3 lg:col-span-1" /> <Card count={metrics.risk.scenarios} @@ -275,8 +289,9 @@ href="/risk-scenarios/" icon="fa-solid fa-biohazard" section={m.sumpageSectionRisk()} + customClass="col-span-3 lg:col-span-1" /> - <div class=" col-span-2 row-span-2 bg-white"> + <div class="col-span-6 lg:col-span-2 row-span-2 h-80 bg-white"> <HalfDonutChart name="residual_h" title={m.sumpageTitleResidualRisks()} @@ -290,6 +305,7 @@ href="/analytics?tab=2" icon="fa-solid fa-biohazard" section={m.sumpageSectionRisk()} + customClass="col-span-3 lg:col-span-1" /> <!----> <Card @@ -298,13 +314,16 @@ href="/risk-acceptances" icon="fa-solid fa-biohazard" section={m.sumpageSectionRisk()} + customClass="col-span-3 lg:col-span-1" /> <div class=""></div> </section> {:else if tabSet === 1} <section id="stats"> <span class="text-xl font-extrabold">{m.statistics()}</span> - <div class="flex justify-between space-x-4"> + <div + class="flex justify-between flex-col lg:flex-row space-y-2 lg:space-y-0 lg:space-x-4" + > <CounterCard count={counters.domains} label={m.domains()} @@ -344,7 +363,9 @@ </div> </section> <section class="space-y-4"> - <div class="flex flex-row space-x-4 h-48 text-sm whitespace-nowrap"> + <div + class="flex flex-col lg:flex-row space-y-2 lg:space-y-0 lg:space-x-4 h-96 lg:h-48 text-sm whitespace-nowrap" + > <BarChart classesContainer="flex-1 card p-4 bg-white" name="complianceAssessmentsPerStatus" @@ -367,7 +388,9 @@ )} /> </div> - <div class="flex flex-row space-x-4 h-48 text-sm whitespace-nowrap"> + <div + class="flex flex-col lg:flex-row space-y-2 lg:space-y-0 lg:space-x-4 h-96 lg:h-48 text-sm whitespace-nowrap" + > <BarChart classesContainer="flex-1 card p-4 bg-white" name="riskAssessmentsPerStatus" @@ -452,8 +475,8 @@ <p class="">{m.noThreatsMapped()}</p> </div> {/if} - <div class="flex"> - <div class="h-96 flex-1"> + <div class="flex flex-wrap lg:flex-nowrap"> + <div class="h-96 flex-col grow lg:flex-1"> <span class="text-sm font-semibold">{m.currentRiskLevelPerScenario()}</span> <DonutChart @@ -463,7 +486,7 @@ colors={data.risks_count_per_level.current.map((object) => object.color)} /> </div> - <div class="h-96 flex-1"> + <div class="h-96 flex-col grow lg:flex-1"> <span class="text-sm font-semibold">{m.residualRiskLevelPerScenario()}</span> <DonutChart diff --git a/frontend/src/routes/(app)/+layout.svelte b/frontend/src/routes/(app)/+layout.svelte index 4082de08a0..da8195b3cc 100644 --- a/frontend/src/routes/(app)/+layout.svelte +++ b/frontend/src/routes/(app)/+layout.svelte @@ -13,7 +13,7 @@ let sidebarOpen = true; - $: classesSidebarOpen = (open: boolean) => (open ? 'ml-64' : 'ml-7'); + $: classesSidebarOpen = (open: boolean) => (open ? 'ml-7 lg:ml-64' : 'ml-7'); $: if (browser) { const fromLogin = getCookie('from_login'); From 2fa1ceb2025bdadb33b455442d5924482599d689 Mon Sep 17 00:00:00 2001 From: fastlorenzo <git@bernardi.be> Date: Sun, 1 Dec 2024 00:54:30 +0100 Subject: [PATCH 2/4] Make my-assignments page responsive Signed-off-by: fastlorenzo <git@bernardi.be> --- .../routes/(app)/(internal)/my-assignments/+page.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/routes/(app)/(internal)/my-assignments/+page.svelte b/frontend/src/routes/(app)/(internal)/my-assignments/+page.svelte index 4143bec259..c73e8040cb 100644 --- a/frontend/src/routes/(app)/(internal)/my-assignments/+page.svelte +++ b/frontend/src/routes/(app)/(internal)/my-assignments/+page.svelte @@ -21,7 +21,7 @@ > {m.controls()} </div> - <div class="text-left col-span-8"> + <div class="text-left col-span-full lg:col-span-8"> <div class="relative overflow-x-auto shadow-lg rounded-lg"> <table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400"> <thead @@ -61,7 +61,7 @@ </div> </div> - <div class=" border-red-50 col-span-4 flex justify-center items-center"> + <div class=" border-red-50 col-span-full lg:col-span-4 flex justify-center items-center"> <ActivityTracker metrics={data.data.metrics} /> </div> @@ -77,7 +77,7 @@ {/each} </div> - <div class="text-left col-span-6"> + <div class="text-left col-span-full lg:col-span-6"> <div class="text-lg font-black underline underline-offset-4 decoration-4 decoration-orange-300"> {m.riskAssessments()} </div> @@ -112,7 +112,7 @@ </div> </div> - <div class="text-left col-span-6"> + <div class="text-left col-span-full lg:col-span-6"> <div class="text-lg font-black underline underline-offset-4 decoration-4 decoration-purple-300"> {m.assignedRisks()} </div> From 63c9445f0e059591997c119220c8b46685ec9a91 Mon Sep 17 00:00:00 2001 From: fastlorenzo <git@bernardi.be> Date: Sun, 1 Dec 2024 00:59:36 +0100 Subject: [PATCH 3/4] Make backup-restore page responsive Signed-off-by: fastlorenzo <git@bernardi.be> --- .../routes/(app)/(internal)/backup-restore/+page.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/routes/(app)/(internal)/backup-restore/+page.svelte b/frontend/src/routes/(app)/(internal)/backup-restore/+page.svelte index d881380471..8aae5d73d2 100644 --- a/frontend/src/routes/(app)/(internal)/backup-restore/+page.svelte +++ b/frontend/src/routes/(app)/(internal)/backup-restore/+page.svelte @@ -28,8 +28,8 @@ </script> {#if canBackup} - <div class="grid grid-cols-2 space-x-4"> - <div class="card bg-white shadow py-4 px-6 space-y-2"> + <div class="grid grid-cols-2 space-y-2 lg:space-y-0 lg:space-x-4"> + <div class="card col-span-full lg:col-span-1 bg-white shadow py-4 px-6 space-y-2"> <h4 class="h4 font-semibold">{m.exportBackup()} <i class="fa-solid fa-download" /></h4> <div class=" py-4"> {m.exportBackupDescription()} @@ -39,7 +39,7 @@ </form> </div> - <div class="card bg-white shadow py-4 px-6 space-y-2"> + <div class="card col-span-full lg:col-span-1 bg-white shadow py-4 px-6 space-y-2"> <h4 class="h4 font-semibold">{m.importBackup()} <i class="fa-solid fa-upload" /></h4> <div class=" py-4"> {m.importBackupDescription()} @@ -54,7 +54,7 @@ bind:value={file} /> <button - class="btn variant-filled {uploadButtonStyles}" + class="btn variant-filled mt-2 lg:mt-0 {uploadButtonStyles}" type="button" on:click={modalConfirmUpload}>{m.upload()}</button > From 891b6cc4676b906deb89f07862a057f0b785f844 Mon Sep 17 00:00:00 2001 From: fastlorenzo <git@bernardi.be> Date: Sun, 1 Dec 2024 01:33:54 +0100 Subject: [PATCH 4/4] Make Compliance analytics more responsive Signed-off-by: fastlorenzo <git@bernardi.be> --- .../(app)/(internal)/analytics/+page.svelte | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/frontend/src/routes/(app)/(internal)/analytics/+page.svelte b/frontend/src/routes/(app)/(internal)/analytics/+page.svelte index 5ed3c44976..f8aabf0a2e 100644 --- a/frontend/src/routes/(app)/(internal)/analytics/+page.svelte +++ b/frontend/src/routes/(app)/(internal)/analytics/+page.svelte @@ -512,12 +512,16 @@ {#each data.projects as project} <div class="flex flex-col items-center"> {#if project.compliance_assessments && project.compliance_assessments.length > 0} - <div class="flex flex-row space-x-2 w-1/2 justify-between items-center"> + <div + class="flex flex-col lg:flex-row lg:space-x-2 w-full mb-2 lg:mb-0 lg:w-1/2 justify-between items-center" + > <a class="text-xl font-bold mb-1 hover:underline text-primary-600" href="/projects/{project.id}">{project.folder.str}/{project.name}</a > - <div class="flex flex-1 bg-gray-200 rounded-full overflow-hidden h-4 shrink"> + <div + class="flex w-full flex-row lg:flex-1 bg-gray-200 rounded-full overflow-hidden h-4 grow lg:shrink" + > {#each project.overallCompliance.values.sort((a, b) => REQUIREMENT_ASSESSMENT_STATUS.indexOf(a.name) - REQUIREMENT_ASSESSMENT_STATUS.indexOf(b.name)) as sp} <div class="flex flex-col justify-center overflow-hidden text-black text-xs text-center" @@ -531,8 +535,10 @@ {/if} {#each project.compliance_assessments as compliance_assessment} - <div class="card w-full bg-white flex flex-row mx-8 p-4 relative"> - <div class="w-1/5 flex flex-col space-y-2"> + <div + class="card w-full bg-white flex flex-row mx-8 p-4 relative flex-wrap lg:flex-nowrap" + > + <div class="w-full lg:w-1/5 flex flex-col space-y-2"> <div> <p class="text-sm font-semibold">{m.name()}</p> <a class="anchor" href="compliance-assessments/{compliance_assessment.id}" @@ -561,23 +567,23 @@ > </div> {/if} - <div class="w-3/5 h-32"> + <div class="w-full lg:w-3/5 h-40 lg:h-32"> <DonutChart s_label={m.complianceAssessments()} name={compliance_assessment.name + '_donut'} values={compliance_assessment.donut.result.values} /> </div> - <div class="absolute top-2 right-4 mt-2 space-x-1"> - <div class="flex flex-col space-y-1"> + <div class="lg:absolute lg:top-2 lg:right-4 mt-2 space-x-1"> + <div class="flex flex-row lg:flex-col space-x-1 lg:space-x-0 lg:space-y-1"> <a href="/compliance-assessments/{compliance_assessment.id}/edit?next=/analytics?tab=3" - class="btn variant-filled-primary" + class="btn variant-filled-primary w-1/2 lg:w-full" ><i class="fa-solid fa-edit mr-2" /> {m.edit()} </a> <a href="/compliance-assessments/{compliance_assessment.id}/export" - class="btn variant-filled-primary" + class="btn variant-filled-primary w-1/2 lg:w-full" ><i class="fa-solid fa-download mr-2" /> {m.exportButton()} </a> </div>