Let the browser remember the creator of a silence ()

* wire default creator through Elm

* wire defaultCreator into localStorage

* add ui/bindata.go

* fix indentation

* change defaultCreator type from (Maybe String) to String

use an empty string as default value

* update ui/bindata.go
This commit is contained in:
Christopher Taylor 2017-12-08 12:54:44 +01:00 committed by Andrey Kuzmin
parent 266baa089c
commit af63c85161
10 changed files with 54 additions and 29 deletions

View File

@ -15,6 +15,11 @@
} }
</script> </script>
<script src="script.js"></script> <script src="script.js"></script>
<script>Elm.Main.embed(document.body, { production: true })</script> <script>
var app = Elm.Main.embed(document.body, { production: true, defaultCreator: window.localStorage.getItem('defaultCreator') });
app.ports.persistDefaultCreator.subscribe(function(name) {
window.localStorage.setItem('defaultCreator', name);
});
</script>
</body> </body>
</html> </html>

View File

@ -62,6 +62,11 @@ init flags location =
|> Json.decodeValue (Json.field "production" Json.bool) |> Json.decodeValue (Json.field "production" Json.bool)
|> Result.withDefault False |> Result.withDefault False
defaultCreator =
flags
|> Json.decodeValue (Json.field "defaultCreator" Json.string)
|> Result.withDefault ""
apiUrl = apiUrl =
if prod then if prod then
Api.makeApiUrl location.pathname Api.makeApiUrl location.pathname
@ -88,6 +93,7 @@ init flags location =
libUrl libUrl
Loading Loading
Loading Loading
defaultCreator
) )

View File

@ -23,6 +23,7 @@ type alias Model =
, libUrl : String , libUrl : String
, bootstrapCSS : ApiData String , bootstrapCSS : ApiData String
, fontAwesomeCSS : ApiData String , fontAwesomeCSS : ApiData String
, defaultCreator : String
} }
@ -45,6 +46,7 @@ type Msg
| UpdateFilter String | UpdateFilter String
| BootstrapCSSLoaded (ApiData String) | BootstrapCSSLoaded (ApiData String)
| FontAwesomeCSSLoaded (ApiData String) | FontAwesomeCSSLoaded (ApiData String)
| SetDefaultCreator String
type Route type Route

View File

@ -31,9 +31,9 @@ update msg ({ basePath, apiUrl } as model) =
List.map (\( k, v ) -> Matcher False k v) labels List.map (\( k, v ) -> Matcher False k v) labels
( silenceForm, cmd ) = ( silenceForm, cmd ) =
Views.SilenceForm.Updates.update (NewSilenceFromMatchers matchers) model.silenceForm basePath apiUrl Views.SilenceForm.Updates.update (NewSilenceFromMatchers model.defaultCreator matchers) model.silenceForm basePath apiUrl
in in
( { model | silenceForm = silenceForm }, Cmd.map MsgForSilenceForm cmd ) ( { model | silenceForm = silenceForm }, cmd )
NavigateToAlerts filter -> NavigateToAlerts filter ->
let let
@ -68,7 +68,7 @@ update msg ({ basePath, apiUrl } as model) =
, if keep then , if keep then
Cmd.none Cmd.none
else else
Task.perform (NewSilenceFromMatchers >> MsgForSilenceForm) (Task.succeed []) Task.perform (NewSilenceFromMatchers model.defaultCreator >> MsgForSilenceForm) (Task.succeed [])
) )
NavigateToSilenceFormEdit uuid -> NavigateToSilenceFormEdit uuid ->
@ -125,10 +125,13 @@ update msg ({ basePath, apiUrl } as model) =
( silenceForm, cmd ) = ( silenceForm, cmd ) =
Views.SilenceForm.Updates.update msg model.silenceForm basePath apiUrl Views.SilenceForm.Updates.update msg model.silenceForm basePath apiUrl
in in
( { model | silenceForm = silenceForm }, Cmd.map MsgForSilenceForm cmd ) ( { model | silenceForm = silenceForm }, cmd )
BootstrapCSSLoaded css -> BootstrapCSSLoaded css ->
( { model | bootstrapCSS = css }, Cmd.none ) ( { model | bootstrapCSS = css }, Cmd.none )
FontAwesomeCSSLoaded css -> FontAwesomeCSSLoaded css ->
( { model | fontAwesomeCSS = css }, Cmd.none ) ( { model | fontAwesomeCSS = css }, Cmd.none )
SetDefaultCreator name ->
( { model | defaultCreator = name }, Cmd.none )

View File

@ -82,10 +82,10 @@ currentView model =
SilenceList.view model.silenceList SilenceList.view model.silenceList
SilenceFormNewRoute keep -> SilenceFormNewRoute keep ->
SilenceForm.view Nothing model.silenceForm |> Html.map MsgForSilenceForm SilenceForm.view Nothing model.defaultCreator model.silenceForm |> Html.map MsgForSilenceForm
SilenceFormEditRoute silenceId -> SilenceFormEditRoute silenceId ->
SilenceForm.view (Just silenceId) model.silenceForm |> Html.map MsgForSilenceForm SilenceForm.view (Just silenceId) "" model.silenceForm |> Html.map MsgForSilenceForm
TopLevelRoute -> TopLevelRoute ->
Utils.Views.loading Utils.Views.loading

View File

@ -60,8 +60,8 @@ type SilenceFormMsg
| PreviewSilence | PreviewSilence
| AlertGroupsPreview (ApiData (List Alert)) | AlertGroupsPreview (ApiData (List Alert))
| FetchSilence String | FetchSilence String
| NewSilenceFromMatchers (List Matcher) | NewSilenceFromMatchers String (List Matcher)
| NewSilenceFromMatchersAndTime (List Matcher) Time | NewSilenceFromMatchersAndTime String (List Matcher) Time
| SilenceFetch (ApiData Silence) | SilenceFetch (ApiData Silence)
| SilenceCreate (ApiData SilenceId) | SilenceCreate (ApiData SilenceId)
@ -172,12 +172,13 @@ defaultDuration =
2 * Time.hour 2 * Time.hour
fromMatchersAndTime : List Matcher -> Time -> SilenceForm fromMatchersAndTime : String -> List Matcher -> Time -> SilenceForm
fromMatchersAndTime matchers now = 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)
, createdBy = initialField defaultCreator
, matchers = , matchers =
-- If no matchers were specified, add an empty row -- If no matchers were specified, add an empty row
if List.isEmpty matchers then if List.isEmpty matchers then

View File

@ -1,9 +1,10 @@
module Views.SilenceForm.Updates exposing (update) port module Views.SilenceForm.Updates exposing (update)
import Alerts.Api import Alerts.Api
import Silences.Api import Silences.Api
import Task import Task
import Time import Time
import Types exposing (Msg(MsgForSilenceForm, SetDefaultCreator))
import Navigation import Navigation
import Utils.Date exposing (timeFromString) import Utils.Date exposing (timeFromString)
import Utils.List import Utils.List
@ -169,14 +170,18 @@ updateForm msg form =
{ form | matchers = matchers } { form | matchers = matchers }
update : SilenceFormMsg -> Model -> String -> String -> ( Model, Cmd SilenceFormMsg ) update : SilenceFormMsg -> Model -> String -> String -> ( Model, Cmd Msg )
update msg model basePath apiUrl = update msg model basePath apiUrl =
case msg of case msg of
CreateSilence -> CreateSilence ->
case toSilence model.form of case toSilence model.form of
Just silence -> Just silence ->
( { model | silenceId = Loading } ( { model | silenceId = Loading }
, Silences.Api.create apiUrl silence |> Cmd.map SilenceCreate , Cmd.batch
[ Silences.Api.create apiUrl silence |> Cmd.map (SilenceCreate >> MsgForSilenceForm)
, persistDefaultCreator silence.createdBy
, Task.succeed silence.createdBy |> Task.perform SetDefaultCreator
]
) )
Nothing -> Nothing ->
@ -199,11 +204,11 @@ update msg model basePath apiUrl =
in in
( { model | silenceId = silenceId }, cmd ) ( { model | silenceId = silenceId }, cmd )
NewSilenceFromMatchers matchers -> NewSilenceFromMatchers defaultCreator matchers ->
( model, Task.perform (NewSilenceFromMatchersAndTime matchers) Time.now ) ( model, Task.perform (NewSilenceFromMatchersAndTime defaultCreator matchers >> MsgForSilenceForm) Time.now )
NewSilenceFromMatchersAndTime matchers time -> NewSilenceFromMatchersAndTime defaultCreator matchers time ->
( { form = fromMatchersAndTime matchers time ( { form = fromMatchersAndTime defaultCreator matchers time
, alerts = Initial , alerts = Initial
, silenceId = Initial , silenceId = Initial
} }
@ -211,11 +216,11 @@ update msg model basePath apiUrl =
) )
FetchSilence silenceId -> FetchSilence silenceId ->
( model, Silences.Api.getSilence apiUrl silenceId SilenceFetch ) ( model, Silences.Api.getSilence apiUrl silenceId (SilenceFetch >> MsgForSilenceForm) )
SilenceFetch (Success silence) -> SilenceFetch (Success silence) ->
( { model | form = fromSilence silence } ( { model | form = fromSilence silence }
, Task.perform identity (Task.succeed PreviewSilence) , Task.perform identity (Task.succeed (MsgForSilenceForm PreviewSilence))
) )
SilenceFetch _ -> SilenceFetch _ ->
@ -228,7 +233,7 @@ update msg model basePath apiUrl =
, Alerts.Api.fetchAlerts , Alerts.Api.fetchAlerts
apiUrl apiUrl
{ nullFilter | text = Just (Utils.List.mjoin silence.matchers) } { nullFilter | text = Just (Utils.List.mjoin silence.matchers) }
|> Cmd.map AlertGroupsPreview |> Cmd.map (AlertGroupsPreview >> MsgForSilenceForm)
) )
Nothing -> Nothing ->
@ -251,3 +256,6 @@ update msg model basePath apiUrl =
} }
, Cmd.none , Cmd.none
) )
port persistDefaultCreator : String -> Cmd msg

View File

@ -13,8 +13,8 @@ import Utils.FormValidation exposing (ValidationState(..), ValidatedField)
import Views.SilenceForm.Types exposing (Model, SilenceFormMsg(..), SilenceFormFieldMsg(..), SilenceForm) import Views.SilenceForm.Types exposing (Model, SilenceFormMsg(..), SilenceFormFieldMsg(..), SilenceForm)
view : Maybe SilenceId -> Model -> Html SilenceFormMsg view : Maybe SilenceId -> String -> Model -> Html SilenceFormMsg
view maybeId { form, silenceId, alerts } = view maybeId defaultCreator { form, silenceId, alerts } =
let let
( title, resetClick ) = ( title, resetClick ) =
case maybeId of case maybeId of
@ -22,7 +22,7 @@ view maybeId { form, silenceId, alerts } =
( "Edit Silence", FetchSilence silenceId ) ( "Edit Silence", FetchSilence silenceId )
Nothing -> Nothing ->
( "New Silence", NewSilenceFromMatchers [] ) ( "New Silence", NewSilenceFromMatchers defaultCreator [] )
in in
div [] div []
[ h1 [] [ text title ] [ h1 [] [ text title ]

View File

@ -100,7 +100,7 @@ editButton silence =
a a
[ class "btn btn-outline-info border-0" [ class "btn btn-outline-info border-0"
, href "#/silences/new?keep=1" , href "#/silences/new?keep=1"
, onClick (NewSilenceFromMatchers silence.matchers |> MsgForSilenceForm) , onClick (NewSilenceFromMatchers silence.createdBy silence.matchers |> MsgForSilenceForm)
] ]
[ text "Recreate" [ text "Recreate"
] ]

File diff suppressed because one or more lines are too long