Adeguamento ui per ios

This commit is contained in:
2025-06-16 16:04:55 +02:00
parent 7ca4de628b
commit 3a374baaba
10 changed files with 165 additions and 126 deletions

View File

@@ -51,7 +51,6 @@
<script src="_content/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js"></script> <script src="_content/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js"></script>
<script src="_content/Template.Shared/js/main.js"></script> <script src="_content/Template.Shared/js/main.js"></script>
<script src="_content/Template.Shared/js/calendar.js"></script> <script src="_content/Template.Shared/js/calendar.js"></script>
<script src="_content/Template.Shared/js/bottomSheet.js"></script>
</body> </body>

View File

@@ -7,7 +7,7 @@
<div class="bottom-sheet-backdrop @(IsSheetVisible ? "show" : "")" @onclick="CloseBottomSheet"></div> <div class="bottom-sheet-backdrop @(IsSheetVisible ? "show" : "")" @onclick="CloseBottomSheet"></div>
<div class="bottom-sheet-container @(IsSheetVisible ? "show" : "")"> <div class="bottom-sheet-container @(IsSheetVisible ? "show" : "")">
<div class="bottom-sheet"> <div class="bottom-sheet pb-safe-area">
<div class="title"> <div class="title">
<MudText Typo="Typo.h6"> <MudText Typo="Typo.h6">
<b>Filtri</b> <b>Filtri</b>

View File

@@ -37,7 +37,7 @@
</li> </li>
<li class="nav-item"> <li class="nav-item">
<NavLink class="nav-link" href="Notification" Match="NavLinkMatch.All"> <NavLink class="nav-link" href="Notifications" Match="NavLinkMatch.All">
<div class="d-flex flex-column"> <div class="d-flex flex-column">
<i class="ri-notification-4-line"></i> <i class="ri-notification-4-line"></i>
</div> </div>
@@ -66,7 +66,7 @@
{ {
var location = args.Location.Remove(0, NavigationManager.BaseUri.Length); var location = args.Location.Remove(0, NavigationManager.BaseUri.Length);
IsVisible = new List<string> { "Calendar", "Users", "PersonalInfo" } IsVisible = new List<string> { "Calendar", "Users", "PersonalInfo", "Notifications" }
.Contains(location); .Contains(location);
StateHasChanged(); StateHasChanged();
}; };

View File

@@ -22,14 +22,14 @@
} }
.nav-item ::deep .custom-plus-button .mud-icon-root { .nav-item ::deep .custom-plus-button .mud-icon-root {
transition: .513s; transition: .5s;
transform: rotate(0); transform: rotate(0);
font-size: 2rem; font-size: 2rem;
} }
.nav-item ::deep .custom-plus-button:focus .mud-icon-root { .nav-item ::deep .custom-plus-button:focus .mud-icon-root {
transform: rotate(225deg); transform: rotate(225deg);
} }
.nav-item ::deep a { .nav-item ::deep a {
display: flex; display: flex;
@@ -55,9 +55,7 @@
.nav-item ::deep a.active > div > span { font-weight: 800; } .nav-item ::deep a.active > div > span { font-weight: 800; }
.nav-item ::deep a:not(.active) > div { .nav-item ::deep a:not(.active) > div { color: var(--mud-palette-text-primary); }
color: var(--mud-palette-text-primary);
}
.nav-item ::deep a i { font-size: 1.65rem; } .nav-item ::deep a i { font-size: 1.65rem; }
@@ -66,8 +64,4 @@
font-weight: 500; font-weight: 500;
} }
@supports (-webkit-touch-callout: none) { @supports (-webkit-touch-callout: none) { .navbar { padding-bottom: env(safe-area-inset-bottom); } }
.nav-item { padding-bottom: env(safe-area-inset-bottom) !important; }
.nav-item ::deep > .nav-link { padding-bottom: 0 !important; }
}

View File

@@ -8,97 +8,98 @@
@inject IManageDataService ManageData @inject IManageDataService ManageData
@inject IJSRuntime JS @inject IJSRuntime JS
<HeaderLayout Title="@CurrentMonth.ToString("MMMM yyyy", new System.Globalization.CultureInfo("it-IT")).FirstCharToUpper()" <HeaderLayout Title="@CurrentMonth.ToString("MMMM yyyy", new System.Globalization.CultureInfo("it-IT")).FirstCharToUpper()"
ShowFilter="true" ShowFilter="true"
ShowCalendarToggle="true" ShowCalendarToggle="true"
OnFilterToggle="ToggleFilter" OnFilterToggle="ToggleFilter"
OnCalendarToggle="ToggleExpanded"/> OnCalendarToggle="ToggleExpanded" />
<div @ref="weekSliderRef" class="container week-slider @(Expanded ? "expanded" : "") @(SliderAnimation)"> <div @ref="weekSliderRef" class="container week-slider @(Expanded ? "expanded" : "") @(SliderAnimation)">
@if (Expanded) @if (Expanded)
{
<!-- Vista mensile -->
@foreach (var nomeGiorno in GiorniSettimana)
{ {
<div class="week-day"> <!-- Vista mensile -->
<div>@nomeGiorno</div> @foreach (var nomeGiorno in GiorniSettimana)
</div> {
} <div class="week-day">
<div>@nomeGiorno</div>
</div>
}
@foreach (var unused in Enumerable.Range(0, StartOffset)) @foreach (var unused in Enumerable.Range(0, StartOffset))
{ {
<div class="day" style="visibility: hidden"></div> <div class="day" style="visibility: hidden"></div>
} }
@for (var d = 1; d <= DaysInMonth; d++) @for (var d = 1; d <= DaysInMonth; d++)
{ {
var day = new DateTime(CurrentMonth.Year, CurrentMonth.Month, d); var day = new DateTime(CurrentMonth.Year, CurrentMonth.Month, d);
var isSelected = IsSameDay(day, SelectedDate); var isSelected = IsSameDay(day, SelectedDate);
var isToday = IsSameDay(day, DateTime.Today); var isToday = IsSameDay(day, DateTime.Today);
var events = ReturnFilteredActivity(day); var events = ReturnFilteredActivity(day);
<div class="day @(isSelected ? "selected" : (isToday ? "today" : ""))"
@onclick="() => SelezionaDataDalMese(day)">
<div>@d</div>
@if (events.Any())
{
<div class="event-dot-container" style="margin-top: 2px;">
@foreach (var cat in events.Select(x => x.Category).Distinct())
{
<div class="event-dot @cat.ConvertToHumanReadable()" title="@cat.ConvertToHumanReadable()"></div>
}
</div>
}
</div>
}
@foreach (var unused in Enumerable.Range(0, EndOffset))
{
<div class="day" style="visibility: hidden"></div>
}
}
else
{
<!-- Vista settimanale -->
@foreach (var day in DaysOfWeek)
{
var isSelected = IsSameDay(day, SelectedDate);
var isToday = IsSameDay(day, DateTime.Today);
<div class="week-day">
<div>@day.ToString("ddd", new System.Globalization.CultureInfo("it-IT"))</div>
<div class="day @(isSelected ? "selected" : (isToday ? "today" : ""))" <div class="day @(isSelected ? "selected" : (isToday ? "today" : ""))"
@onclick="() => SelezionaData(day)"> @onclick="() => SelezionaDataDalMese(day)">
<div>@day.Day</div> <div>@d</div>
@if (ReturnFilteredActivity(day).Any()) @if (events.Any())
{ {
<div class="event-dot-container" style="margin-top: 2px;"> <div class="event-dot-container" style="margin-top: 2px;">
@foreach (var cat in ReturnFilteredActivity(day).Select(x => x.Category).Distinct()) @foreach (var cat in events.Select(x => x.Category).Distinct())
{ {
<div class="event-dot @cat.ConvertToHumanReadable()" title="@cat.ConvertToHumanReadable()"></div> <div class="event-dot @cat.ConvertToHumanReadable()" title="@cat.ConvertToHumanReadable()"></div>
} }
</div> </div>
} }
</div> </div>
</div> }
@foreach (var unused in Enumerable.Range(0, EndOffset))
{
<div class="day" style="visibility: hidden"></div>
}
} }
} else
</div> {
<!-- Vista settimanale -->
@foreach (var day in DaysOfWeek)
{
var isSelected = IsSameDay(day, SelectedDate);
var isToday = IsSameDay(day, DateTime.Today);
<div class="week-day">
<div>@day.ToString("ddd", new System.Globalization.CultureInfo("it-IT"))</div>
<div class="day @(isSelected ? "selected" : (isToday ? "today" : ""))"
@onclick="() => SelezionaData(day)">
<div>@day.Day</div>
@if (ReturnFilteredActivity(day).Any())
{
<div class="event-dot-container" style="margin-top: 2px;">
@foreach (var cat in ReturnFilteredActivity(day).Select(x => x.Category).Distinct())
{
<div class="event-dot @cat.ConvertToHumanReadable()" title="@cat.ConvertToHumanReadable()"></div>
}
</div>
}
</div>
</div>
}
}
</div>
<div class="container appointments"> <div class="container appointments">
@if (IsLoading) @if (IsLoading)
{ {
<SpinnerLayout FullScreen="false"/> <SpinnerLayout FullScreen="false" />
} }
else if (FilteredActivities is { Count: > 0 }) else if (FilteredActivities is { Count: > 0 })
{ {
<Virtualize Items="FilteredActivities" Context="activity"> <Virtualize Items="FilteredActivities" Context="activity">
<ActivityCard Activity="activity" ActivityChanged="OnActivityChanged"/> <ActivityCard Activity="activity" ActivityChanged="OnActivityChanged" />
</Virtualize> </Virtualize>
} }
else else
{ {
<NoDataAvailable Text="Nessuna attività trovata" ImageSource="_content/Template.Shared/images/undraw_file-search_cbur.svg"/> <NoDataAvailable Text="Nessuna attività trovata" ImageSource="_content/Template.Shared/images/undraw_file-search_cbur.svg" />
} }
</div> </div>

View File

@@ -119,12 +119,14 @@
gap: 1rem; gap: 1rem;
overflow-y: auto; overflow-y: auto;
flex-direction: column; flex-direction: column;
height: 75vh;
-ms-overflow-style: none; -ms-overflow-style: none;
scrollbar-width: none; scrollbar-width: none;
padding-bottom: 45px; padding-bottom: 60px;
height: calc(100% - 130px);
} }
.appointments.ah-calendar-m { height: calc(100% - 315px) !important; }
.appointments::-webkit-scrollbar { display: none; } .appointments::-webkit-scrollbar { display: none; }
.appointment { .appointment {
@@ -159,4 +161,6 @@
.event-dot.interna { background-color: var(--mud-palette-success-darken); } .event-dot.interna { background-color: var(--mud-palette-success-darken); }
.event-dot.commessa { background-color: var(--mud-palette-warning); } .event-dot.commessa { background-color: var(--mud-palette-warning); }
@supports (-webkit-touch-callout: none) { .appointments { padding-bottom: calc(60px + env(safe-area-inset-bottom)) !important; } }

View File

@@ -0,0 +1,9 @@
@page "/Notifications"
@attribute [Authorize]
@using Template.Shared.Components.Layout
<HeaderLayout Title="Notifiche" />
@code {
}

View File

@@ -1,4 +1,10 @@
html, body { html { overflow: hidden; }
.page, article, main { height: 100% !important; }
#app { height: 100vh; }
html, body {
font-family: "Nunito", sans-serif; font-family: "Nunito", sans-serif;
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
@@ -111,26 +117,6 @@ h1:focus { outline: none; }
margin: 1rem 0; margin: 1rem 0;
} }
@supports (-webkit-touch-callout: none) {
.status-bar-safe-area {
display: flex;
position: fixed;
top: 0;
height: env(safe-area-inset-top);
background-color: #f7f7f7;
width: 100%;
z-index: 1;
}
#app {
padding-top: env(safe-area-inset-top);
height: 100vh;
}
.flex-column, .navbar-brand { padding-left: env(safe-area-inset-left); }
}
/*Spinner*/ /*Spinner*/
.spinner-container { .spinner-container {
@@ -167,14 +153,10 @@ h1:focus { outline: none; }
animation-duration: 2s; animation-duration: 2s;
} }
.loader:after { .loader:after { animation-duration: 4s; }
animation-duration: 4s;
}
@keyframes l24 { @keyframes l24 {
100% { 100% { transform: rotate(1turn) }
transform: rotate(1turn)
}
} }
/*MudBlazor Personalization*/ /*MudBlazor Personalization*/
@@ -194,9 +176,7 @@ h1:focus { outline: none; }
margin: 0; margin: 0;
} }
.custom-item-select { .custom-item-select { padding: 6px 16px; }
padding: 6px 16px;
}
.custom-item-select .mud-typography-body1 { .custom-item-select .mud-typography-body1 {
font-weight: 600; font-weight: 600;
@@ -209,27 +189,24 @@ h1:focus { outline: none; }
position: fixed; position: fixed;
top: 0; top: 0;
height: env(safe-area-inset-top); height: env(safe-area-inset-top);
background-color: #f7f7f7;
width: 100%; width: 100%;
z-index: 1; z-index: 1;
background-color: var(--primary-color); background-color: var(--mud-palette-surface);
} }
.modal { .modal { padding-top: env(safe-area-inset-top); }
padding-top: env(safe-area-inset-top);
}
article { .safe-area-bottom { margin-bottom: env(safe-area-inset-bottom) !important; }
padding-top: 3rem !important;
padding-bottom: calc(7rem + env(safe-area-inset-bottom)) !important; .pb-safe-area { padding-bottom: env(safe-area-inset-bottom) !important; }
}
#app { #app {
padding-top: env(safe-area-inset-top); margin-top: env(safe-area-inset-top);
height: 100vh; margin-bottom: env(safe-area-inset-bottom);
height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom));
} }
.flex-column, .navbar-brand { .flex-column, .navbar-brand { padding-left: env(safe-area-inset-left); }
padding-left: env(safe-area-inset-left);
} .customDialog-form .mud-dialog-content { margin-top: env(safe-area-inset-top); }
} }

View File

@@ -1,3 +1,58 @@
window.goBack = function () { // Funzione goBack
window.goBack = function () {
history.back(); history.back();
}; };
// Funzione per aggiungere tabindex ai bottoni
function addTabindexToButtons() {
document.querySelectorAll('button.custom-plus-button').forEach(btn => {
if (!btn.hasAttribute('tabindex')) {
btn.setAttribute('tabindex', '0');
}
});
}
// Funzione per monitorare la classe expanded e aggiungere ah-calendar-m
function monitorExpandedClass(mutations) {
mutations.forEach(function (mutation) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
const target = mutation.target;
if (target.classList.contains('week-slider') && target.classList.contains('expanded')) {
const appointments = document.querySelector('.appointments');
if (appointments) {
appointments.classList.add('ah-calendar-m');
console.log('Classe "ah-calendar-m" aggiunta a .appointments');
}
}
// Rimuovi la classe quando expanded viene rimossa
else if (target.classList.contains('week-slider') && !target.classList.contains('expanded')) {
const appointments = document.querySelector('.appointments');
if (appointments) {
appointments.classList.remove('ah-calendar-m');
console.log('Classe "ah-calendar-m" rimossa da .appointments');
}
}
}
});
}
// Esegui la funzione tabindex inizialmente
addTabindexToButtons();
// Observer combinato per entrambe le funzionalità
const observer = new MutationObserver((mutations) => {
// Aggiungi tabindex ai nuovi bottoni
addTabindexToButtons();
// Monitora le classi expanded
monitorExpandedClass(mutations);
});
// Osserva sia i cambiamenti nel DOM che gli attributi
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['class']
});