diff options
Diffstat (limited to 'Aamukampa.Core')
| -rw-r--r-- | Aamukampa.Core/Aamukampa.Core.fsproj | 18 | ||||
| -rw-r--r-- | Aamukampa.Core/Library.fs | 27 | ||||
| -rw-r--r-- | Aamukampa.Core/Types.fs | 42 | ||||
| -rw-r--r-- | Aamukampa.Core/Views.fs | 88 |
4 files changed, 175 insertions, 0 deletions
diff --git a/Aamukampa.Core/Aamukampa.Core.fsproj b/Aamukampa.Core/Aamukampa.Core.fsproj new file mode 100644 index 0000000..bc6029f --- /dev/null +++ b/Aamukampa.Core/Aamukampa.Core.fsproj @@ -0,0 +1,18 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net9.0</TargetFramework> + <GenerateDocumentationFile>true</GenerateDocumentationFile> + </PropertyGroup> + + <ItemGroup> + <Compile Include="Types.fs" /> + <Compile Include="Views.fs" /> + <Compile Include="Library.fs" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Falco.Markup" Version="1.2.0" /> + </ItemGroup> + +</Project> diff --git a/Aamukampa.Core/Library.fs b/Aamukampa.Core/Library.fs new file mode 100644 index 0000000..aa7b7ea --- /dev/null +++ b/Aamukampa.Core/Library.fs @@ -0,0 +1,27 @@ +namespace TJLaskuri.Core + +open System + +module Domain = + // TODO: More precise time: hours, minutes + // TODO: Time until service starts + + let getStartDate kontingent = + match serviceStartDates.TryGetValue(kontingent) with + | true, startDate -> Some startDate + | false, _ -> None + + let getEndDate kontingent serviceTime = + getStartDate kontingent + |> Option.map (fun startDate -> + ServiceTime.getDays serviceTime + |> fun x -> x - 1 // Count start date as well + |> startDate.AddDays) + + let getTimeCompleted kontingent (now : DateTime) = + getStartDate kontingent + |> Option.map (fun date -> now.AddDays(1) - date) + + let getTimeLeft kontingent serviceTime (now : DateTime) = + getEndDate kontingent serviceTime + |> Option.map (fun date -> date - now) diff --git a/Aamukampa.Core/Types.fs b/Aamukampa.Core/Types.fs new file mode 100644 index 0000000..0c5b2d4 --- /dev/null +++ b/Aamukampa.Core/Types.fs @@ -0,0 +1,42 @@ +namespace TJLaskuri.Core + +open System +open System.Collections.Generic + +[<AutoOpen>] +module Types = + /// Saapumiserä/kontingent N/Year + /// For example, 2/25 is { N = 2; Year = 2025 } + // Year field is first so that kontingents are sorted year first + type Kontingent = { Year : int; N : int } + + type ServiceTime = + | OneSixFive + | TwoFiveFive + | ThreeFourSeven + + module ServiceTime = + let getDays = function + | OneSixFive -> 165 + | TwoFiveFive -> 255 + | ThreeFourSeven -> 347 + + let kontingent n year = { N = n; Year = year } + + let serviceStartDates = + let date day month year = + DateTime((year : int), month, day) + let entry n year endDate = + let k = kontingent n year + KeyValuePair<Kontingent, DateTime>( + k, endDate) + + Dictionary<Kontingent, DateTime>([ + entry 2 2024 (date 8 7 2024) + entry 1 2025 (date 6 1 2025) + entry 2 2025 (date 7 7 2025) + entry 1 2026 (date 5 1 2026) + entry 2 2026 (date 6 7 2026) + entry 1 2027 (date 4 1 2027) + entry 2 2027 (date 5 7 2027) + ]) diff --git a/Aamukampa.Core/Views.fs b/Aamukampa.Core/Views.fs new file mode 100644 index 0000000..939acec --- /dev/null +++ b/Aamukampa.Core/Views.fs @@ -0,0 +1,88 @@ +namespace TJLaskuri.Core.Views + +open System +open Falco.Markup +open Elem +open Attr +open Text + +module Document = + let view documentBody = + html [ lang "fi" ] [ + head [] [ + meta [ charset "utf-8" ] + meta [ name "viewport"; content "width=device-width" ] + Elem.title [] [ raw "TJ-laskuri" ] + script [ type' "module"; src "/js/app.js" ] [] + link [ rel "stylesheet"; href "/styles.css" ] + ] + body [] [ + documentBody + ] + ] + +module Main = + type Model = { + TimeLeft : TimeSpan + TimeCompleted : TimeSpan + } + + let view model = + main [] [ + div [ class' "counter" ] [ + Elem.span [ class' "counter_title" ] [ + raw "Tänään jäljellä" + ] + Elem.span [ class' "counter_value" ] [ + enc (string <| Math.Ceiling model.TimeLeft.TotalDays) + ] + Elem.span [ class' "counter_mornings" ] [ + raw " aamua" + ] + ] + + div [ class' "progress-bar" ] [ + let p = 100.0 * (1.0 - model.TimeLeft / (model.TimeLeft + model.TimeCompleted)) + let cssWidth = sprintf "%s%%" (p.ToString("F2")) + + div [ + class' "progress-bar_value" + style <| + sprintf "background-color: green; width: %s" + cssWidth + ] [ + span <| sprintf "%s %%" (p.ToString("F2")) + ] + ] + + Elem.p [ + style "text-align: center; font-size: 1.5rem;" + ] [ + enc "2/25 347" + ] + + // div [] [ + // Elem.label [ for' "kontingent-select" ] [ raw "Saapumiserä:" ] + // select [ id "kontingent-select" ] [ + // option [ value "1/25" ] [ enc "1/25" ] + // option [ value "2/25" ] [ enc "2/25" ] + // option [ value "1/26" ] [ enc "1/26" ] + // option [ value "2/26" ] [ enc "2/26" ] + // ] + // ] + + // div [] [ + // Elem.p [] [ + // span "Tunteina" + // enc (string model.TimeLeft.TotalHours) + // ] + // Elem.p [] [ + // span "Sekunteina" + // enc (string model.TimeLeft.TotalSeconds) + // ] + // Elem.p [] [ + // span "Aamuja ohi " + // enc (string <| Math.Floor model.TimeCompleted.TotalDays) + // ] + // ] + ] |
