Fix negative duration (#1132)

* Validate ends at

* Update bindata.go
This commit is contained in:
Andrey Kuzmin 2017-12-14 16:16:42 +01:00 committed by stuart nelson
parent 06f9a4ad1d
commit 50394569f5
5 changed files with 65 additions and 43 deletions

View File

@ -48,21 +48,25 @@ term =
|. Parser.ignore Parser.zeroOrMore ((==) ' ') |. Parser.ignore Parser.zeroOrMore ((==) ' ')
durationFormat : Time.Time -> String durationFormat : Time.Time -> Maybe String
durationFormat time = durationFormat time =
List.foldl if time >= 0 then
(\( unit, ms ) ( result, curr ) -> List.foldl
( if curr // ms == 0 then (\( unit, ms ) ( result, curr ) ->
result ( if curr // ms == 0 then
else result
result ++ toString (curr // ms) ++ unit ++ " " else
, curr % ms result ++ toString (curr // ms) ++ unit ++ " "
, curr % ms
)
) )
) ( "", round time )
( "", round time ) units
units |> Tuple.first
|> Tuple.first |> String.trim
|> String.trim |> Just
else
Nothing
dateFormat : Time.Time -> String dateFormat : Time.Time -> String
@ -86,10 +90,13 @@ encode =
timeFromString : String -> Result String Time.Time timeFromString : String -> Result String Time.Time
timeFromString = timeFromString string =
ISO8601.fromString if string == "" then
>> Result.map (ISO8601.toTime >> toFloat) Err "Should not be empty"
>> Result.mapError (always "Wrong ISO8601 format") else
ISO8601.fromString string
|> Result.map (ISO8601.toTime >> toFloat)
|> Result.mapError (always "Wrong ISO8601 format")
fromTime : Time.Time -> Types.Time fromTime : Time.Time -> Types.Time

View File

@ -11,6 +11,7 @@ module Views.SilenceForm.Types
, initSilenceForm , initSilenceForm
, emptyMatcher , emptyMatcher
, validateForm , validateForm
, parseEndsAt
) )
import Silences.Types exposing (Silence, SilenceId, nullSilence) import Silences.Types exposing (Silence, SilenceId, nullSilence)
@ -70,11 +71,9 @@ type SilenceFormFieldMsg
= AddMatcher = AddMatcher
| DeleteMatcher Int | DeleteMatcher Int
| UpdateStartsAt String | UpdateStartsAt String
| ValidateStartsAt
| UpdateEndsAt String | UpdateEndsAt String
| ValidateEndsAt
| UpdateDuration String | UpdateDuration String
| ValidateDuration | ValidateTime
| UpdateCreatedBy String | UpdateCreatedBy String
| ValidateCreatedBy | ValidateCreatedBy
| UpdateComment String | UpdateComment String
@ -111,7 +110,7 @@ toSilence { id, comment, matchers, createdBy, startsAt, endsAt } =
(List.foldr appendMatcher (Ok []) matchers) (List.foldr appendMatcher (Ok []) matchers)
(stringNotEmpty createdBy.value) (stringNotEmpty createdBy.value)
(timeFromString startsAt.value) (timeFromString startsAt.value)
(timeFromString endsAt.value) (parseEndsAt startsAt.value endsAt.value)
|> Result.toMaybe |> Result.toMaybe
@ -122,7 +121,7 @@ fromSilence { id, createdBy, comment, startsAt, endsAt, matchers } =
, comment = initialField comment , comment = initialField comment
, startsAt = initialField (timeToString startsAt) , startsAt = initialField (timeToString startsAt)
, endsAt = initialField (timeToString endsAt) , endsAt = initialField (timeToString endsAt)
, duration = initialField (durationFormat (endsAt - startsAt)) , duration = initialField (durationFormat (endsAt - startsAt) |> Maybe.withDefault "")
, matchers = List.map fromMatcher matchers , matchers = List.map fromMatcher matchers
} }
@ -133,12 +132,25 @@ validateForm { id, createdBy, comment, startsAt, endsAt, duration, matchers } =
, createdBy = validate stringNotEmpty createdBy , createdBy = validate stringNotEmpty createdBy
, comment = validate stringNotEmpty comment , comment = validate stringNotEmpty comment
, startsAt = validate timeFromString startsAt , startsAt = validate timeFromString startsAt
, endsAt = validate timeFromString endsAt , endsAt = validate (parseEndsAt startsAt.value) endsAt
, duration = validate parseDuration duration , duration = validate parseDuration duration
, matchers = List.map validateMatcherForm matchers , matchers = List.map validateMatcherForm matchers
} }
parseEndsAt : String -> String -> Result String Time.Time
parseEndsAt startsAt endsAt =
case ( timeFromString startsAt, timeFromString endsAt ) of
( Ok starts, Ok ends ) ->
if starts > ends then
Err "Can't be in the past"
else
Ok ends
( _, endsResult ) ->
endsResult
validateMatcherForm : MatcherForm -> MatcherForm validateMatcherForm : MatcherForm -> MatcherForm
validateMatcherForm { name, value, isRegex } = validateMatcherForm { name, value, isRegex } =
{ name = validate stringNotEmpty name { name = validate stringNotEmpty name
@ -177,7 +189,7 @@ fromMatchersAndTime defaultCreator matchers now =
{ empty { empty
| startsAt = initialField (timeToString now) | startsAt = initialField (timeToString now)
, endsAt = initialField (timeToString (now + defaultDuration)) , endsAt = initialField (timeToString (now + defaultDuration))
, duration = initialField (durationFormat defaultDuration) , duration = initialField (durationFormat defaultDuration |> Maybe.withDefault "")
, createdBy = initialField defaultCreator , createdBy = initialField defaultCreator
, matchers = , matchers =
-- If no matchers were specified, add an empty row -- If no matchers were specified, add an empty row

View File

@ -19,6 +19,7 @@ import Views.SilenceForm.Types
, SilenceFormFieldMsg(..) , SilenceFormFieldMsg(..)
, fromMatchersAndTime , fromMatchersAndTime
, fromSilence , fromSilence
, parseEndsAt
, validateForm , validateForm
, toSilence , toSilence
, emptyMatcher , emptyMatcher
@ -42,7 +43,12 @@ updateForm msg form =
durationValue = durationValue =
case Result.map2 (-) endsAt startsAt of case Result.map2 (-) endsAt startsAt of
Ok duration -> Ok duration ->
Utils.Date.durationFormat duration case Utils.Date.durationFormat duration of
Just value ->
value
Nothing ->
form.duration.value
Err _ -> Err _ ->
form.duration.value form.duration.value
@ -52,11 +58,6 @@ updateForm msg form =
, duration = updateValue durationValue form.duration , duration = updateValue durationValue form.duration
} }
ValidateStartsAt ->
{ form
| startsAt = validate Utils.Date.timeFromString form.startsAt
}
UpdateEndsAt time -> UpdateEndsAt time ->
let let
endsAt = endsAt =
@ -68,7 +69,12 @@ updateForm msg form =
durationValue = durationValue =
case Result.map2 (-) endsAt startsAt of case Result.map2 (-) endsAt startsAt of
Ok duration -> Ok duration ->
Utils.Date.durationFormat duration case Utils.Date.durationFormat duration of
Just value ->
value
Nothing ->
form.duration.value
Err _ -> Err _ ->
form.duration.value form.duration.value
@ -78,11 +84,6 @@ updateForm msg form =
, duration = updateValue durationValue form.duration , duration = updateValue durationValue form.duration
} }
ValidateEndsAt ->
{ form
| endsAt = validate Utils.Date.timeFromString form.endsAt
}
UpdateDuration time -> UpdateDuration time ->
let let
duration = duration =
@ -104,9 +105,11 @@ updateForm msg form =
, duration = updateValue time form.duration , duration = updateValue time form.duration
} }
ValidateDuration -> ValidateTime ->
{ form { form
| duration = validate Utils.Date.parseDuration form.duration | startsAt = validate Utils.Date.timeFromString form.startsAt
, endsAt = validate (parseEndsAt form.startsAt.value) form.endsAt
, duration = validate Utils.Date.parseDuration form.duration
} }
UpdateCreatedBy createdBy -> UpdateCreatedBy createdBy ->

View File

@ -59,19 +59,19 @@ timeInput startsAt endsAt duration =
"Start" "Start"
"col-5" "col-5"
(UpdateStartsAt >> UpdateField) (UpdateStartsAt >> UpdateField)
(ValidateStartsAt |> UpdateField) (ValidateTime |> UpdateField)
startsAt startsAt
, validatedField input , validatedField input
"Duration" "Duration"
"col-2" "col-2"
(UpdateDuration >> UpdateField) (UpdateDuration >> UpdateField)
(ValidateDuration |> UpdateField) (ValidateTime |> UpdateField)
duration duration
, validatedField input , validatedField input
"End" "End"
"col-5" "col-5"
(UpdateEndsAt >> UpdateField) (UpdateEndsAt >> UpdateField)
(ValidateEndsAt |> UpdateField) (ValidateTime |> UpdateField)
endsAt endsAt
] ]

File diff suppressed because one or more lines are too long