Skip to content

Commit

Permalink
Allow week to start at Monday or Sunday
Browse files Browse the repository at this point in the history
Signed-off-by: Martin Schimandl <martin.schimandl@gmail.com>
  • Loading branch information
Git-Jiro committed Oct 6, 2022
1 parent 5455296 commit 208d3f9
Show file tree
Hide file tree
Showing 18 changed files with 243 additions and 40 deletions.
8 changes: 4 additions & 4 deletions asset/assets_vfsdata.go

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions ui/app/index.html
Expand Up @@ -20,6 +20,7 @@
var app = Elm.Main.init({
flags: {
production: true,
startWeekAtMonday: JSON.parse(localStorage.getItem('startWeekAtMonday')),
defaultCreator: localStorage.getItem('defaultCreator'),
groupExpandAll: JSON.parse(localStorage.getItem('groupExpandAll'))
}
Expand All @@ -30,6 +31,9 @@
app.ports.persistGroupExpandAll.subscribe(function(expanded) {
localStorage.setItem('groupExpandAll', JSON.stringify(expanded));
});
app.ports.persistStartWeekAtMonday.subscribe(function(monday) {
localStorage.setItem('startWeekAtMonday', JSON.stringify(monday));
});
</script>
</body>
</html>
24 changes: 23 additions & 1 deletion ui/app/src/Main.elm
Expand Up @@ -86,12 +86,24 @@ init flags url key =

else
"/"

startWeekAtMonday =
flags
|> Json.decodeValue (Json.field "startWeekAtMonday" Json.bool)
|> Result.withDefault False
in
update (urlUpdate url)
(Model
(initSilenceList key)
(initSilenceView key)
(initSilenceForm key)
(initSilenceForm key
(if startWeekAtMonday then
1

else
7
)
)
(initAlertList key groupExpandAll)
route
filter
Expand All @@ -105,6 +117,13 @@ init flags url key =
defaultCreator
groupExpandAll
key
{ startOfWeek =
if startWeekAtMonday then
1

else
7
}
)


Expand Down Expand Up @@ -133,6 +152,9 @@ urlUpdate url =
StatusRoute ->
NavigateToStatus

SettingsRoute ->
NavigateToSettings

TopLevelRoute ->
RedirectAlerts

Expand Down
2 changes: 2 additions & 0 deletions ui/app/src/Parsing.elm
Expand Up @@ -5,6 +5,7 @@ import Types exposing (Route(..))
import Url exposing (Url)
import Url.Parser exposing (Parser, map, oneOf, parse, top)
import Views.AlertList.Parsing exposing (alertsParser)
import Views.Settings.Parsing exposing (settingsViewParser)
import Views.SilenceForm.Parsing exposing (silenceFormEditParser, silenceFormNewParser)
import Views.SilenceList.Parsing exposing (silenceListParser)
import Views.SilenceView.Parsing exposing (silenceViewParser)
Expand Down Expand Up @@ -46,6 +47,7 @@ routeParser =
oneOf
[ map SilenceListRoute silenceListParser
, map StatusRoute statusParser
, map SettingsRoute settingsViewParser
, map SilenceFormNewRoute silenceFormNewParser
, map SilenceViewRoute silenceViewParser
, map SilenceFormEditRoute silenceFormEditParser
Expand Down
5 changes: 5 additions & 0 deletions ui/app/src/Types.elm
Expand Up @@ -4,6 +4,7 @@ import Browser.Navigation exposing (Key)
import Utils.Filter exposing (Filter, SilenceFormGetParams)
import Utils.Types exposing (ApiData)
import Views.AlertList.Types as AlertList exposing (AlertListMsg)
import Views.Settings.Types as SettingsView exposing (SettingsMsg)
import Views.SilenceForm.Types as SilenceForm exposing (SilenceFormMsg)
import Views.SilenceList.Types as SilenceList exposing (SilenceListMsg)
import Views.SilenceView.Types as SilenceView exposing (SilenceViewMsg)
Expand All @@ -27,6 +28,7 @@ type alias Model =
, defaultCreator : String
, expandAll : Bool
, key : Key
, settings : SettingsView.Model
}


Expand All @@ -36,13 +38,15 @@ type Msg
| MsgForSilenceForm SilenceFormMsg
| MsgForSilenceList SilenceListMsg
| MsgForStatus StatusMsg
| MsgForSettings SettingsMsg
| NavigateToAlerts Filter
| NavigateToNotFound
| NavigateToSilenceView String
| NavigateToSilenceFormEdit String
| NavigateToSilenceFormNew SilenceFormGetParams
| NavigateToSilenceList Filter
| NavigateToStatus
| NavigateToSettings
| NavigateToInternalUrl String
| NavigateToExternalUrl String
| RedirectAlerts
Expand All @@ -62,3 +66,4 @@ type Route
| SilenceViewRoute String
| StatusRoute
| TopLevelRoute
| SettingsRoute
12 changes: 12 additions & 0 deletions ui/app/src/Updates.elm
Expand Up @@ -5,6 +5,8 @@ import Task
import Types exposing (Model, Msg(..), Route(..))
import Views.AlertList.Types exposing (AlertListMsg(..))
import Views.AlertList.Updates
import Views.Settings.Types exposing (SettingsMsg(..))
import Views.Settings.Updates
import Views.SilenceForm.Types exposing (SilenceFormMsg(..))
import Views.SilenceForm.Updates
import Views.SilenceList.Types exposing (SilenceListMsg(..))
Expand Down Expand Up @@ -66,6 +68,9 @@ update msg ({ basePath, apiUrl } as model) =
RedirectAlerts ->
( model, Navigation.pushUrl model.key (basePath ++ "#/alerts") )

NavigateToSettings ->
( { model | route = SettingsRoute }, Cmd.none )

MsgForStatus subMsg ->
Views.Status.Updates.update subMsg model

Expand All @@ -83,6 +88,13 @@ update msg ({ basePath, apiUrl } as model) =
in
( { model | silenceList = silenceList }, Cmd.map MsgForSilenceList cmd )

MsgForSettings subMsg ->
let
( settingsView, cmd ) =
Views.Settings.Updates.update subMsg model.settings
in
( { model | settings = settingsView }, cmd )

MsgForSilenceView subMsg ->
let
( silenceView, cmd ) =
Expand Down
11 changes: 7 additions & 4 deletions ui/app/src/Utils/DateTimePicker/Types.elm
Expand Up @@ -18,6 +18,7 @@ type alias DateTimePicker =
, endDate : Maybe Posix
, startTime : Maybe Posix
, endTime : Maybe Posix
, firstDayOfWeek : Int
}


Expand All @@ -41,19 +42,20 @@ type InputHourOrMinute
| InputMinute


initDateTimePicker : DateTimePicker
initDateTimePicker =
initDateTimePicker : Int -> DateTimePicker
initDateTimePicker firstDayOfWeek =
{ month = Nothing
, mouseOverDay = Nothing
, startDate = Nothing
, endDate = Nothing
, startTime = Nothing
, endTime = Nothing
, firstDayOfWeek = firstDayOfWeek
}


initFromStartAndEndTime : Maybe Posix -> Maybe Posix -> DateTimePicker
initFromStartAndEndTime start end =
initFromStartAndEndTime : Maybe Posix -> Maybe Posix -> Int -> DateTimePicker
initFromStartAndEndTime start end firstDayOfWeek =
let
startTime =
Maybe.map (\s -> floorMinute s) start
Expand All @@ -67,4 +69,5 @@ initFromStartAndEndTime start end =
, endDate = end
, startTime = startTime
, endTime = endTime
, firstDayOfWeek = firstDayOfWeek
}
25 changes: 21 additions & 4 deletions ui/app/src/Utils/DateTimePicker/Utils.elm
Expand Up @@ -21,8 +21,8 @@ import Time exposing (Month(..), Posix, Weekday(..), utc)
import Time.Extra as Time exposing (Interval(..))


listDaysOfMonth : Posix -> List Posix
listDaysOfMonth time =
listDaysOfMonth : Posix -> Int -> List Posix
listDaysOfMonth time firstDayOfWeek =
let
firstOfMonth =
Time.floor Time.Month utc time
Expand All @@ -33,17 +33,34 @@ listDaysOfMonth time =
padFront =
weekToInt (Time.toWeekday utc firstOfMonth)
|> (\wd ->
if wd == 7 then
if firstDayOfWeek == 7 then
if wd == 7 then
0

else
wd

else if wd == 1 then
0

else
wd
wd - 1
)
|> (\w -> Time.add Time.Day -w utc firstOfMonth)
|> (\d -> Time.range Time.Day 1 utc d firstOfMonth)

padBack =
weekToInt (Time.toWeekday utc firstOfNextMonth)
|> (\wd ->
if firstDayOfWeek == 7 then
wd

else if wd == 1 then
7

else
wd - 1
)
|> (\w -> Time.add Time.Day (7 - w) utc firstOfNextMonth)
|> Time.range Time.Day 1 utc firstOfNextMonth
in
Expand Down
9 changes: 7 additions & 2 deletions ui/app/src/Utils/DateTimePicker/Views.elm
Expand Up @@ -80,14 +80,19 @@ viewMonth : DateTimePicker -> Posix -> Html Msg
viewMonth dateTimePicker justViewTime =
let
days =
listDaysOfMonth justViewTime
listDaysOfMonth justViewTime dateTimePicker.firstDayOfWeek

weeks =
splitWeek days []
in
div [ class "row justify-content-center" ]
[ div [ class "weekheader" ]
(List.map viewWeekHeader [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ])
(if dateTimePicker.firstDayOfWeek == 7 then
List.map viewWeekHeader [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]

else
List.map viewWeekHeader [ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" ]
)
, div
[ class "date-container"
, onMouseOut ClearMouseOverDay
Expand Down
4 changes: 4 additions & 0 deletions ui/app/src/Views.elm
Expand Up @@ -11,6 +11,7 @@ import Utils.Views
import Views.AlertList.Views as AlertList
import Views.NavBar.Views exposing (navBar)
import Views.NotFound.Views as NotFound
import Views.Settings.Views as SettingsView
import Views.SilenceForm.Views as SilenceForm
import Views.SilenceList.Views as SilenceList
import Views.SilenceView.Views as SilenceView
Expand Down Expand Up @@ -74,6 +75,9 @@ cssNode url msg =
currentView : Model -> Html Msg
currentView model =
case model.route of
SettingsRoute ->
SettingsView.view model.settings |> Html.map MsgForSettings

StatusRoute ->
Status.view model.status

Expand Down
9 changes: 7 additions & 2 deletions ui/app/src/Views/NavBar/Types.elm
@@ -1,4 +1,4 @@
module Views.NavBar.Types exposing (Tab, alertsTab, noneTab, silencesTab, statusTab, tabs)
module Views.NavBar.Types exposing (Tab, alertsTab, noneTab, settingsTab, silencesTab, statusTab, tabs)


type alias Tab =
Expand All @@ -22,6 +22,11 @@ statusTab =
{ link = "#/status", name = "Status" }


settingsTab : Tab
settingsTab =
{ link = "#/settings", name = "Settings" }


helpTab : Tab
helpTab =
{ link = "https://prometheus.io/docs/alerting/alertmanager/", name = "Help" }
Expand All @@ -34,4 +39,4 @@ noneTab =

tabs : List Tab
tabs =
[ alertsTab, silencesTab, statusTab, helpTab ]
[ alertsTab, silencesTab, statusTab, settingsTab, helpTab ]
5 changes: 4 additions & 1 deletion ui/app/src/Views/NavBar/Views.elm
Expand Up @@ -3,7 +3,7 @@ module Views.NavBar.Views exposing (navBar)
import Html exposing (Html, a, div, header, li, nav, text, ul)
import Html.Attributes exposing (class, href, style, title)
import Types exposing (Route(..))
import Views.NavBar.Types exposing (Tab, alertsTab, noneTab, silencesTab, statusTab, tabs)
import Views.NavBar.Types exposing (Tab, alertsTab, noneTab, settingsTab, silencesTab, statusTab, tabs)


navBar : Route -> Html msg
Expand Down Expand Up @@ -82,3 +82,6 @@ routeToTab currentRoute =

TopLevelRoute ->
noneTab

SettingsRoute ->
settingsTab
8 changes: 8 additions & 0 deletions ui/app/src/Views/Settings/Parsing.elm
@@ -0,0 +1,8 @@
module Views.Settings.Parsing exposing (settingsViewParser)

import Url.Parser exposing (Parser, s)


settingsViewParser : Parser a a
settingsViewParser =
s "settings"
10 changes: 10 additions & 0 deletions ui/app/src/Views/Settings/Types.elm
@@ -0,0 +1,10 @@
module Views.Settings.Types exposing (..)


type alias Model =
{ startOfWeek : Int
}


type SettingsMsg
= UpdateStartWeekAtMonday String
44 changes: 44 additions & 0 deletions ui/app/src/Views/Settings/Updates.elm
@@ -0,0 +1,44 @@
port module Views.Settings.Updates exposing (..)

import Maybe
import String
import Task
import Types exposing (Msg(..))
import Views.Settings.Types exposing (..)
import Views.SilenceForm.Types exposing (SilenceFormMsg(..))


update : SettingsMsg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
UpdateStartWeekAtMonday startOfWeekString ->
let
monday =
if startOfWeekString == "1" then
True

else
False

startOfWeek =
Maybe.withDefault 7
(String.toInt
startOfWeekString
)
in
( { model | startOfWeek = startOfWeek }
, Cmd.batch
[ Task.perform identity
(Task.succeed
(MsgForSilenceForm
(UpdateFirstDayOfWeek
startOfWeek
)
)
)
, persistStartWeekAtMonday monday
]
)


port persistStartWeekAtMonday : Bool -> Cmd msg

0 comments on commit 208d3f9

Please sign in to comment.