From 7a736f4180d36852d5ef3dc0ec344fc15487810c Mon Sep 17 00:00:00 2001 From: Adam Monikowski Date: Thu, 27 Jun 2024 14:51:32 +0200 Subject: [PATCH 1/4] Add basic structure of the Calendar component --- TutorLizard.Blazor/Components/Calendar.razor | 96 ++++++++++++++++ .../Components/Calendar.razor.css | 108 ++++++++++++++++++ .../Models/DTOs/IScheduleItemSummaryDto.cs | 8 ++ .../DTOs/StudentsScheduleItemSummaryDto.cs | 2 +- .../DTOs/TutorsScheduleItemSummaryDto.cs | 2 +- .../Extensions/ScheduleDtoExtensions.cs | 18 +++ TutorLizard.Web/Views/Browse/Schedule.cshtml | 12 +- TutorLizard.Web/Views/Shared/_Layout.cshtml | 4 +- TutorLizard.sln | 2 +- 9 files changed, 247 insertions(+), 5 deletions(-) create mode 100644 TutorLizard.Blazor/Components/Calendar.razor create mode 100644 TutorLizard.Blazor/Components/Calendar.razor.css create mode 100644 TutorLizard.Shared/Models/DTOs/IScheduleItemSummaryDto.cs create mode 100644 TutorLizard.Web/Extensions/ScheduleDtoExtensions.cs diff --git a/TutorLizard.Blazor/Components/Calendar.razor b/TutorLizard.Blazor/Components/Calendar.razor new file mode 100644 index 00000000..bc5cd4f7 --- /dev/null +++ b/TutorLizard.Blazor/Components/Calendar.razor @@ -0,0 +1,96 @@ +@using System.Text.Json +@using TutorLizard.Shared.Models.DTOs +@inject NavigationManager navigation + +
+
+ +

@Month/@Year

+ +
+
+
+
Poniedziałek
+
Wtorek
+
Środa
+
Czwartek
+
Piątek
+
Sobota
+
Niedziela
+ +
Pn
+
Wt
+
Śr
+
Czw
+
Pt
+
Sb
+
Nd
+
+
+
1
+ @for (int i = 2; i <= DateTime.DaysInMonth(Year, Month); i++) + { +
@i
+ } +
+
+
+ +@code { + [Parameter, EditorRequired] + public int Year { get; set; } + [Parameter, EditorRequired] + public int Month { get; set; } + [Parameter, EditorRequired] + public string? TutorsSchedule { get; set; } + [Parameter, EditorRequired] + public string? StudentsSchedule { get; set; } + + private List schedule = []; + + private string controller = "Browse"; + private string action = "Ads"; + + protected override void OnParametersSet() + { + schedule.Clear(); + try + { + if (String.IsNullOrWhiteSpace(StudentsSchedule) == false) + { + var studentsSchedule = JsonSerializer + .Deserialize>(StudentsSchedule); + schedule.AddRange(studentsSchedule); + } + if (String.IsNullOrWhiteSpace(TutorsSchedule) == false) + { + var tutorsSchedule = JsonSerializer + .Deserialize>(TutorsSchedule); + schedule.AddRange(tutorsSchedule); + } + } + catch + {} + + base.OnParametersSet(); + } + + private string DayOfWeekOnFirst() + { + DateTime first = new DateTime(Year, Month, 1); + return first.DayOfWeek.ToString().ToLower(); + } + + private void Navigate(string controller, string action) + { + navigation.NavigateTo($"{controller}/{action}"); + } +} diff --git a/TutorLizard.Blazor/Components/Calendar.razor.css b/TutorLizard.Blazor/Components/Calendar.razor.css new file mode 100644 index 00000000..d3c500e8 --- /dev/null +++ b/TutorLizard.Blazor/Components/Calendar.razor.css @@ -0,0 +1,108 @@ +.calendar-container{ + display: flex; + flex-direction: column; + background-image: radial-gradient(limegreen, darkgreen); + border-radius: 1rem; + padding: 1rem; +} + + .calendar-container h3 { + text-align: center; + color: white; + margin: 0; + } + +.calendar-header { + display: grid; + grid-template-columns: repeat(3, 1fr); + padding-bottom: 1rem; +} + +.previous { + color: white; + display: flex; + align-items: center; + justify-content: left; + padding-left: 1rem; + font-size: 2rem; +} + +.next { + color: white; + display: flex; + align-items: center; + justify-content: right; + padding-right: 1rem; + font-size: 2rem; +} + +.calendar-main { + border-radius: .5rem; + overflow: hidden; + background-color: whitesmoke; +} + +.seven-column-section { + display: grid; + grid-template-columns: repeat(7, minmax(0, 1fr)); + column-gap: .5rem; + row-gap: .5rem; +} + +.days-header { + padding-bottom: .5rem; +} + + .days-header div { + padding: 1rem 0; + background-color: white; + text-align: center; + font-weight: bold; + } + +.calendar-grid { +} + + .calendar-grid div { + background-color: white; + font-size: 2rem; + display:flex; + align-items: center; + justify-content: center; + height: 5rem; + } + + .calendar-grid div:hover { + background-color: darkgreen; + transition: .35s; + color: white; + font-weight: bold; + } + +.monday { + grid-column: 1; +} + +.tuesday { + grid-column: 2; +} + +.wednesday { + grid-column: 3; +} + +.thursday { + grid-column: 4; +} + +.friday { + grid-column: 5; +} + +.saturday { + grid-column: 6; +} + +.sunday { + grid-column: 7; +} \ No newline at end of file diff --git a/TutorLizard.Shared/Models/DTOs/IScheduleItemSummaryDto.cs b/TutorLizard.Shared/Models/DTOs/IScheduleItemSummaryDto.cs new file mode 100644 index 00000000..6757b5be --- /dev/null +++ b/TutorLizard.Shared/Models/DTOs/IScheduleItemSummaryDto.cs @@ -0,0 +1,8 @@ +namespace TutorLizard.Shared.Models.DTOs; +public interface IScheduleItemSummaryDto +{ + int AdId { get; set; } + string AdTitle { get; set; } + DateTime DateTime { get; set; } + int Id { get; set; } +} \ No newline at end of file diff --git a/TutorLizard.Shared/Models/DTOs/StudentsScheduleItemSummaryDto.cs b/TutorLizard.Shared/Models/DTOs/StudentsScheduleItemSummaryDto.cs index ef9182b2..1795c886 100644 --- a/TutorLizard.Shared/Models/DTOs/StudentsScheduleItemSummaryDto.cs +++ b/TutorLizard.Shared/Models/DTOs/StudentsScheduleItemSummaryDto.cs @@ -1,5 +1,5 @@ namespace TutorLizard.Shared.Models.DTOs; -public class StudentsScheduleItemSummaryDto +public class StudentsScheduleItemSummaryDto : IScheduleItemSummaryDto { public int Id { get; set; } public int AdId { get; set; } diff --git a/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemSummaryDto.cs b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemSummaryDto.cs index c93c4c8e..8977ceaa 100644 --- a/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemSummaryDto.cs +++ b/TutorLizard.Shared/Models/DTOs/TutorsScheduleItemSummaryDto.cs @@ -1,5 +1,5 @@ namespace TutorLizard.Shared.Models.DTOs; -public class TutorsScheduleItemSummaryDto +public class TutorsScheduleItemSummaryDto : IScheduleItemSummaryDto { public int Id { get; set; } public int AdId { get; set; } diff --git a/TutorLizard.Web/Extensions/ScheduleDtoExtensions.cs b/TutorLizard.Web/Extensions/ScheduleDtoExtensions.cs new file mode 100644 index 00000000..1d58408f --- /dev/null +++ b/TutorLizard.Web/Extensions/ScheduleDtoExtensions.cs @@ -0,0 +1,18 @@ +using System.Text.Json; +using TutorLizard.Shared.Models.DTOs; +using TutorLizard.Shared.Models.DTOs.Responses; + +namespace TutorLizard.Web.Extensions; + +public static class ScheduleDtoExtensions +{ + public static string Serialize(this IEnumerable scheduleItemSummaryDtos) + { + return JsonSerializer.Serialize(scheduleItemSummaryDtos); + } + + public static string Serialize(this IEnumerable scheduleItemSummaryDtos) + { + return JsonSerializer.Serialize(scheduleItemSummaryDtos); + } +} diff --git a/TutorLizard.Web/Views/Browse/Schedule.cshtml b/TutorLizard.Web/Views/Browse/Schedule.cshtml index 3049df5f..0a3981cc 100644 --- a/TutorLizard.Web/Views/Browse/Schedule.cshtml +++ b/TutorLizard.Web/Views/Browse/Schedule.cshtml @@ -1,7 +1,17 @@ -@model GetUsersScheduleResponse +@using TutorLizard.Web.Extensions +@model GetUsersScheduleResponse

Twoje terminy

+
+ +
+

Jako uczeń

diff --git a/TutorLizard.Web/Views/Shared/_Layout.cshtml b/TutorLizard.Web/Views/Shared/_Layout.cshtml index 50d37d6e..9700f7a8 100644 --- a/TutorLizard.Web/Views/Shared/_Layout.cshtml +++ b/TutorLizard.Web/Views/Shared/_Layout.cshtml @@ -14,8 +14,10 @@ @ViewData["Title"] - TutorLizard.Web + +
@@ -75,7 +77,7 @@ - @await RenderSectionAsync("Scripts", required: false) + diff --git a/TutorLizard.sln b/TutorLizard.sln index e082ce82..c31f3482 100644 --- a/TutorLizard.sln +++ b/TutorLizard.sln @@ -15,7 +15,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TutorLizard.Web.Tests", "Te EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TutorLizard.Blazor", "TutorLizard.Blazor\TutorLizard.Blazor.csproj", "{C178E212-D193-4128-B9E4-C77341B478BE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TutorLizard.Shared", "TutorLizard.Shared\TutorLizard.Shared.csproj", "{FA2E2928-556A-4868-8C47-50D371E17580}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TutorLizard.Shared", "TutorLizard.Shared\TutorLizard.Shared.csproj", "{FA2E2928-556A-4868-8C47-50D371E17580}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From 57ee63fc6ac45eeaf2fb2bb8cc354449ec7e229e Mon Sep 17 00:00:00 2001 From: Adam Monikowski Date: Thu, 27 Jun 2024 21:43:17 +0200 Subject: [PATCH 2/4] Add ScheduleForDay, reorganize Schedule components --- TutorLizard.Blazor/Components/Calendar.razor | 70 +++++++---------- .../Components/Calendar.razor.css | 1 + TutorLizard.Blazor/Components/Schedule.razor | 75 +++++++++++++++++++ .../Components/Schedule.razor.css | 1 + .../Components/ScheduleForDay.razor | 37 +++++++++ .../Components/ScheduleForDay.razor.css | 18 +++++ .../Components/StudentsScheduleItem.razor | 36 +++++++++ .../Components/StudentsScheduleItem.razor.css | 16 ++++ .../Components/TutorsScheduleItem.razor | 28 +++++++ .../Components/TutorsScheduleItem.razor.css | 16 ++++ TutorLizard.Web/Views/Browse/Schedule.cshtml | 74 +----------------- 11 files changed, 255 insertions(+), 117 deletions(-) create mode 100644 TutorLizard.Blazor/Components/Schedule.razor create mode 100644 TutorLizard.Blazor/Components/Schedule.razor.css create mode 100644 TutorLizard.Blazor/Components/ScheduleForDay.razor create mode 100644 TutorLizard.Blazor/Components/ScheduleForDay.razor.css create mode 100644 TutorLizard.Blazor/Components/StudentsScheduleItem.razor create mode 100644 TutorLizard.Blazor/Components/StudentsScheduleItem.razor.css create mode 100644 TutorLizard.Blazor/Components/TutorsScheduleItem.razor create mode 100644 TutorLizard.Blazor/Components/TutorsScheduleItem.razor.css diff --git a/TutorLizard.Blazor/Components/Calendar.razor b/TutorLizard.Blazor/Components/Calendar.razor index bc5cd4f7..4d3ad155 100644 --- a/TutorLizard.Blazor/Components/Calendar.razor +++ b/TutorLizard.Blazor/Components/Calendar.razor @@ -2,7 +2,7 @@ @using TutorLizard.Shared.Models.DTOs @inject NavigationManager navigation -
+
-
Poniedziałek
-
Wtorek
-
Środa
-
Czwartek
-
Piątek
-
Sobota
-
Niedziela
+
Poniedziałek
+
Wtorek
+
Środa
+
Czwartek
+
Piątek
+
Sobota
+
Niedziela
-
Pn
-
Wt
-
Śr
-
Czw
-
Pt
-
Sb
-
Nd
+
Pn
+
Wt
+
Śr
+
Czw
+
Pt
+
Sb
+
Nd
-
1
+
1
@for (int i = 2; i <= DateTime.DaysInMonth(Year, Month); i++) { -
@i
+ int day = i; +
@day
}
@@ -50,39 +51,13 @@ [Parameter, EditorRequired] public int Month { get; set; } [Parameter, EditorRequired] - public string? TutorsSchedule { get; set; } + public List Schedule { get; set; } = []; [Parameter, EditorRequired] - public string? StudentsSchedule { get; set; } - - private List schedule = []; + public Action? OnDaySelected { get; set; } private string controller = "Browse"; private string action = "Ads"; - protected override void OnParametersSet() - { - schedule.Clear(); - try - { - if (String.IsNullOrWhiteSpace(StudentsSchedule) == false) - { - var studentsSchedule = JsonSerializer - .Deserialize>(StudentsSchedule); - schedule.AddRange(studentsSchedule); - } - if (String.IsNullOrWhiteSpace(TutorsSchedule) == false) - { - var tutorsSchedule = JsonSerializer - .Deserialize>(TutorsSchedule); - schedule.AddRange(tutorsSchedule); - } - } - catch - {} - - base.OnParametersSet(); - } - private string DayOfWeekOnFirst() { DateTime first = new DateTime(Year, Month, 1); @@ -93,4 +68,9 @@ { navigation.NavigateTo($"{controller}/{action}"); } + + private void HandleDaySelected(int day) + { + OnDaySelected?.Invoke(Year, Month, day); + } } diff --git a/TutorLizard.Blazor/Components/Calendar.razor.css b/TutorLizard.Blazor/Components/Calendar.razor.css index d3c500e8..9536babb 100644 --- a/TutorLizard.Blazor/Components/Calendar.razor.css +++ b/TutorLizard.Blazor/Components/Calendar.razor.css @@ -77,6 +77,7 @@ transition: .35s; color: white; font-weight: bold; + cursor: pointer; } .monday { diff --git a/TutorLizard.Blazor/Components/Schedule.razor b/TutorLizard.Blazor/Components/Schedule.razor new file mode 100644 index 00000000..370f2f9a --- /dev/null +++ b/TutorLizard.Blazor/Components/Schedule.razor @@ -0,0 +1,75 @@ +@using System.Text.Json +@using TutorLizard.Shared.Models.DTOs + +
+
+ +
+
+ +
+
+ +@code { + [Parameter, EditorRequired] + public int Year { get; set; } + [Parameter, EditorRequired] + public int Month { get; set; } + [Parameter, EditorRequired] + public string? TutorsSchedule { get; set; } + [Parameter, EditorRequired] + public string? StudentsSchedule { get; set; } + + private List schedule = []; + private List scheduleForDay = []; + + DateTime selectedDay = DateTime.Now; + + protected override void OnParametersSet() + { + schedule.Clear(); + try + { + if (String.IsNullOrWhiteSpace(StudentsSchedule) == false) + { + var studentsSchedule = JsonSerializer + .Deserialize>(StudentsSchedule); + schedule.AddRange(studentsSchedule); + } + if (String.IsNullOrWhiteSpace(TutorsSchedule) == false) + { + var tutorsSchedule = JsonSerializer + .Deserialize>(TutorsSchedule); + schedule.AddRange(tutorsSchedule); + } + } + catch + { } + + if (Year == DateTime.Now.Year && Month == DateTime.Now.Month) + { + DisplayScheduleForDay(Year, Month, DateTime.Now.Day); + } + else + { + DisplayScheduleForDay(Year, Month, 1); + } + + base.OnParametersSet(); + } + + private void DisplayScheduleForDay(int year, int month, int day) + { + selectedDay = new DateTime(year, month, day); + scheduleForDay = schedule + .Where(si => si.DateTime.Date == selectedDay.Date) + .ToList(); + StateHasChanged(); + } +} \ No newline at end of file diff --git a/TutorLizard.Blazor/Components/Schedule.razor.css b/TutorLizard.Blazor/Components/Schedule.razor.css new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/TutorLizard.Blazor/Components/Schedule.razor.css @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/TutorLizard.Blazor/Components/ScheduleForDay.razor b/TutorLizard.Blazor/Components/ScheduleForDay.razor new file mode 100644 index 00000000..34a9766c --- /dev/null +++ b/TutorLizard.Blazor/Components/ScheduleForDay.razor @@ -0,0 +1,37 @@ +@using TutorLizard.Shared.Models.DTOs +
+

@($"{Day}.{Month}.{Year}")

+
+ @if (Schedule.Count == 0) + { +
Brak terminów.
+ } + @foreach (var item in Schedule) + { + if (item is StudentsScheduleItemSummaryDto studentsScheduleItem) + { + + } + if (item is TutorsScheduleItemSummaryDto tutorsScheduleItem) + { + + } + } +
+
+ +@code { + [Parameter, EditorRequired] + public int Day { get; set; } + [Parameter, EditorRequired] + public int Month { get; set; } + [Parameter, EditorRequired] + public int Year { get; set; } + [Parameter, EditorRequired] + public List Schedule { get; set; } = []; + + protected override void OnParametersSet() + { + base.OnParametersSet(); + } +} diff --git a/TutorLizard.Blazor/Components/ScheduleForDay.razor.css b/TutorLizard.Blazor/Components/ScheduleForDay.razor.css new file mode 100644 index 00000000..9be38962 --- /dev/null +++ b/TutorLizard.Blazor/Components/ScheduleForDay.razor.css @@ -0,0 +1,18 @@ +.schedule-container { + background-color: slateblue; + padding: 1rem; + border-radius: 1rem; +} + + .schedule-container h3 { + color:white; + margin: 0; + text-align: center; + padding-bottom: 1rem; +} + +.schedule-list { + border-radius: .5rem; + display: flex; + flex-direction: column; +} \ No newline at end of file diff --git a/TutorLizard.Blazor/Components/StudentsScheduleItem.razor b/TutorLizard.Blazor/Components/StudentsScheduleItem.razor new file mode 100644 index 00000000..8de28d39 --- /dev/null +++ b/TutorLizard.Blazor/Components/StudentsScheduleItem.razor @@ -0,0 +1,36 @@ +@using TutorLizard.Shared.Models.DTOs +@inject NavigationManager navigation + +@if (ScheduleItem is not null) +{ +
+

@ScheduleItem.DateTime.ToString("HH:mm")

+
@ScheduleItem.AdTitle | Jako uczeń
+
Nauczyciel: @ScheduleItem.TutorName
+
Status zgłoszenia: @GetStatusName(ScheduleItem.Status)
+
+} + +@code { + [Parameter, EditorRequired] + public StudentsScheduleItemSummaryDto? ScheduleItem { get; set; } + + private string controller = "Browse"; + private string action = "AdDetails"; + + private void NavigateToAdDetails(int adId) + { + navigation.NavigateTo($"{controller}/{action}/{adId}"); + } + + private string GetStatusName(StudentsScheduleItemSummaryDto.RequestStatus status) + { + return status switch + { + StudentsScheduleItemSummaryDto.RequestStatus.Accepted => "Zaakceptowane", + StudentsScheduleItemSummaryDto.RequestStatus.Pending => "Oczekuje na akceptację", + StudentsScheduleItemSummaryDto.RequestStatus.Rejected => "Odrzucone", + _ => "Wystąpił błąd." + }; + } +} diff --git a/TutorLizard.Blazor/Components/StudentsScheduleItem.razor.css b/TutorLizard.Blazor/Components/StudentsScheduleItem.razor.css new file mode 100644 index 00000000..e5389d9e --- /dev/null +++ b/TutorLizard.Blazor/Components/StudentsScheduleItem.razor.css @@ -0,0 +1,16 @@ +.item { + background-color: white; + padding: .5rem; + margin: .25rem; + border-radius: .5rem; +} + + .item:hover { + background-color: lightblue; + transition: .25s; + cursor: pointer; + } + + .item h4 { + margin: 0; + } diff --git a/TutorLizard.Blazor/Components/TutorsScheduleItem.razor b/TutorLizard.Blazor/Components/TutorsScheduleItem.razor new file mode 100644 index 00000000..5769d368 --- /dev/null +++ b/TutorLizard.Blazor/Components/TutorsScheduleItem.razor @@ -0,0 +1,28 @@ +@using TutorLizard.Shared.Models.DTOs +@inject NavigationManager navigation + +@if (ScheduleItem is not null) +{ +
+

@ScheduleItem.DateTime.ToString("HH:mm")

+
@ScheduleItem.AdTitle | Jako nauczyciel
+ @if (ScheduleItem.AcceptedStudentsName is not null) + { +
Zaakceptowany uczeń: @ScheduleItem.AcceptedStudentsName
+ } +
Liczba zgłoszeń: @ScheduleItem.RequestCount
+
+} + +@code { + [Parameter, EditorRequired] + public TutorsScheduleItemSummaryDto? ScheduleItem { get; set; } + + private string controller = "Browse"; + private string action = "AdDetails"; + + private void NavigateToAdDetails(int adId) + { + navigation.NavigateTo($"{controller}/{action}/{adId}"); + } +} diff --git a/TutorLizard.Blazor/Components/TutorsScheduleItem.razor.css b/TutorLizard.Blazor/Components/TutorsScheduleItem.razor.css new file mode 100644 index 00000000..b8be8ce4 --- /dev/null +++ b/TutorLizard.Blazor/Components/TutorsScheduleItem.razor.css @@ -0,0 +1,16 @@ +.item { + background-color: white; + padding: .5rem; + margin: .25rem; + border-radius: .5rem; +} + +.item:hover { + background-color: lightblue; + transition: .25s; + cursor: pointer; +} + + .item h4 { + margin: 0; + } \ No newline at end of file diff --git a/TutorLizard.Web/Views/Browse/Schedule.cshtml b/TutorLizard.Web/Views/Browse/Schedule.cshtml index 0a3981cc..e16b5d6c 100644 --- a/TutorLizard.Web/Views/Browse/Schedule.cshtml +++ b/TutorLizard.Web/Views/Browse/Schedule.cshtml @@ -4,80 +4,10 @@

Twoje terminy

-
- -
-
-

Jako uczeń

- @if(Model.StudentsSchedule.Count == 0) - { -
- Brak terminów. -
- } - else - { - foreach(var item in Model.StudentsSchedule) - { -
- -
@item.DateTime
-
Nauczyciel: @item.TutorName
-
- Status zgłoszenia: - @if (item.Status == StudentsScheduleItemSummaryDto.RequestStatus.Accepted) - { - Zaakceptowany - } - else if (item.Status == StudentsScheduleItemSummaryDto.RequestStatus.Pending) - { - Oczekuje na akceptację - } - else if (item.Status == StudentsScheduleItemSummaryDto.RequestStatus.Rejected) - { - Odrzucone - } -
-
- } - } -
- -
-

Jako nauczyciel

- @if (Model.TutorsSchedule.Count == 0) - { -
- Brak terminów. -
- } - else - { - foreach (var item in Model.TutorsSchedule) - { -
- -
@item.DateTime
-
Liczba zgłoszeń: @item.RequestCount
-
- Zapisany uczeń: - @if (item.AcceptedStudentsName is null) - { - Brak - } - else - { - @item.AcceptedStudentsName - } -
-
- } - } -
-
\ No newline at end of file From dda28d73f7d1f88370733b65a52ec45712921de7 Mon Sep 17 00:00:00 2001 From: Adam Monikowski Date: Thu, 27 Jun 2024 22:33:41 +0200 Subject: [PATCH 3/4] Add CalendarItemsCountIndicator --- TutorLizard.Blazor/Components/Calendar.razor | 39 ++++++++++++++++++- .../Components/Calendar.razor.css | 12 ++++-- .../CalendarItemsCountIndicator.razor | 17 ++++++++ .../CalendarItemsCountIndicator.razor.css | 6 +++ TutorLizard.Blazor/Components/Schedule.razor | 3 +- 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor create mode 100644 TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor.css diff --git a/TutorLizard.Blazor/Components/Calendar.razor b/TutorLizard.Blazor/Components/Calendar.razor index 4d3ad155..48c91cda 100644 --- a/TutorLizard.Blazor/Components/Calendar.razor +++ b/TutorLizard.Blazor/Components/Calendar.razor @@ -35,11 +35,19 @@
Nd
-
1
+
+ 1 + +
@for (int i = 2; i <= DateTime.DaysInMonth(Year, Month); i++) { int day = i; -
@day
+
+ @day + +
}
@@ -54,6 +62,8 @@ public List Schedule { get; set; } = []; [Parameter, EditorRequired] public Action? OnDaySelected { get; set; } + [Parameter, EditorRequired] + public int DaySelected { get; set; } private string controller = "Browse"; private string action = "Ads"; @@ -73,4 +83,29 @@ { OnDaySelected?.Invoke(Year, Month, day); } + + private int GetScheduleItemCountsAsTutor(int day) + { + DateTime date = new DateTime(Year, Month, day); + return Schedule + .Where(si => + si.DateTime.Date == date.Date && + si is TutorsScheduleItemSummaryDto) + .Count(); + } + + private int GetScheduleItemCountsAsStudent(int day) + { + DateTime date = new DateTime(Year, Month, day); + return Schedule + .Where(si => + si.DateTime.Date == date.Date && + si is StudentsScheduleItemSummaryDto) + .Count(); + } + + private bool IsSelected(int day) + { + return day == DaySelected; + } } diff --git a/TutorLizard.Blazor/Components/Calendar.razor.css b/TutorLizard.Blazor/Components/Calendar.razor.css index 9536babb..acaf605c 100644 --- a/TutorLizard.Blazor/Components/Calendar.razor.css +++ b/TutorLizard.Blazor/Components/Calendar.razor.css @@ -1,7 +1,7 @@ -.calendar-container{ +.calendar-container { display: flex; flex-direction: column; - background-image: radial-gradient(limegreen, darkgreen); + background-color: darkgreen; border-radius: 1rem; padding: 1rem; } @@ -67,9 +67,11 @@ background-color: white; font-size: 2rem; display:flex; + flex-direction: column; align-items: center; justify-content: center; - height: 5rem; + position:relative; + height: 7rem; } .calendar-grid div:hover { @@ -80,6 +82,10 @@ cursor: pointer; } +.selected { + font-weight: bold; +} + .monday { grid-column: 1; } diff --git a/TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor b/TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor new file mode 100644 index 00000000..0b8ba44b --- /dev/null +++ b/TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor @@ -0,0 +1,17 @@ +
+ @if (AsTutor > 0) + { + N: @AsTutor + } + @if (AsStudent > 0) + { + U: @AsStudent + } +
+ +@code { + [Parameter, EditorRequired] + public int AsTutor { get; set; } + [Parameter, EditorRequired] + public int AsStudent { get; set; } +} diff --git a/TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor.css b/TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor.css new file mode 100644 index 00000000..6219f885 --- /dev/null +++ b/TutorLizard.Blazor/Components/CalendarItemsCountIndicator.razor.css @@ -0,0 +1,6 @@ +.indicator-container { + position: absolute; + bottom: 0; + font-size: .75rem; + padding-bottom: .5rem; +} \ No newline at end of file diff --git a/TutorLizard.Blazor/Components/Schedule.razor b/TutorLizard.Blazor/Components/Schedule.razor index 370f2f9a..719de1cc 100644 --- a/TutorLizard.Blazor/Components/Schedule.razor +++ b/TutorLizard.Blazor/Components/Schedule.razor @@ -6,7 +6,8 @@ + OnDaySelected="@DisplayScheduleForDay" + DaySelected="@selectedDay.Day"/>
Date: Fri, 28 Jun 2024 13:01:44 +0200 Subject: [PATCH 4/4] Change Schedule's render mode to WebAssemblyPrerendered --- TutorLizard.Web/Views/Browse/Schedule.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TutorLizard.Web/Views/Browse/Schedule.cshtml b/TutorLizard.Web/Views/Browse/Schedule.cshtml index e16b5d6c..b959e001 100644 --- a/TutorLizard.Web/Views/Browse/Schedule.cshtml +++ b/TutorLizard.Web/Views/Browse/Schedule.cshtml @@ -5,7 +5,7 @@