aboutsummaryrefslogtreecommitdiff
path: root/Aamukampa.Core
diff options
context:
space:
mode:
Diffstat (limited to 'Aamukampa.Core')
-rw-r--r--Aamukampa.Core/Aamukampa.Core.fsproj18
-rw-r--r--Aamukampa.Core/Library.fs27
-rw-r--r--Aamukampa.Core/Types.fs42
-rw-r--r--Aamukampa.Core/Views.fs88
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)
+ // ]
+ // ]
+ ]