From 62a98fbb9e2f1c353cab7d5bcd1b209ada55477b Mon Sep 17 00:00:00 2001 From: ElaadF Date: Sat, 10 Apr 2021 22:08:01 +0200 Subject: [PATCH] Work in progress --- .../src/main/elm/secret/sources/ApiCalls.elm | 26 +-- .../src/main/elm/secret/sources/DataTypes.elm | 54 +++--- .../src/main/elm/secret/sources/Init.elm | 9 +- .../main/elm/secret/sources/JsonDecoder.elm | 26 +-- .../main/elm/secret/sources/JsonEncoder.elm | 3 +- .../src/main/elm/secret/sources/View.elm | 140 ++++++++------- .../main/elm/secret/sources/rudder-secret.elm | 167 +++++++++++------- .../webapp/style/rudder/rudder-secret.css | 9 +- 8 files changed, 237 insertions(+), 197 deletions(-) diff --git a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/ApiCalls.elm b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/ApiCalls.elm index bff5aad1fbd..71477ed4a63 100644 --- a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/ApiCalls.elm +++ b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/ApiCalls.elm @@ -2,12 +2,12 @@ module ApiCalls exposing (..) import DataTypes exposing (Model, Msg(..), Secret) import Http exposing (emptyBody, expectJson, jsonBody, request, send) -import JsonDecoder exposing (decodeDeleteSecret, decodeGetAllSecrets, decodeOneSecret) +import JsonDecoder exposing (decodeSecretsApi) import JsonEncoder exposing (encodeSecret) getUrl: DataTypes.Model -> String -> String -getUrl m parameter = - m.contextPath ++ "/secure/api/latest/secret" ++ parameter +getUrl m url = + m.contextPath ++ "/secure/api" ++ url getSecret : Model -> String -> Cmd Msg getSecret model secretName = @@ -16,9 +16,9 @@ getSecret model secretName = request { method = "GET" , headers = [] - , url = getUrl model secretName + , url = getUrl model ("/secret/" ++ secretName) , body = emptyBody - , expect = expectJson decodeOneSecret + , expect = expectJson decodeSecretsApi , timeout = Nothing , withCredentials = False } @@ -32,9 +32,9 @@ getAllSecrets model = request { method = "GET" , headers = [] - , url = getUrl model "" + , url = getUrl model "/secret" , body = emptyBody - , expect = expectJson decodeGetAllSecrets + , expect = expectJson decodeSecretsApi , timeout = Nothing , withCredentials = False } @@ -48,9 +48,9 @@ deleteSecret secretName model = request { method = "DELETE" , headers = [] - , url = getUrl model secretName + , url = getUrl model ("/secret/" ++ secretName) , body = emptyBody - , expect = expectJson decodeDeleteSecret + , expect = expectJson decodeSecretsApi , timeout = Nothing , withCredentials = False } @@ -64,9 +64,9 @@ addSecret model secret = request { method = "PUT" , headers = [] - , url = getUrl model "" + , url = getUrl model "/secret" , body = jsonBody (encodeSecret secret) - , expect = expectJson decodeOneSecret + , expect = expectJson decodeSecretsApi , timeout = Nothing , withCredentials = False } @@ -80,9 +80,9 @@ updateSecret model secret = request { method = "POST" , headers = [] - , url = getUrl model "" + , url = getUrl model "/secret" , body = jsonBody (encodeSecret secret) - , expect = expectJson decodeOneSecret + , expect = expectJson decodeSecretsApi , timeout = Nothing , withCredentials = False } diff --git a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/DataTypes.elm b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/DataTypes.elm index a68854f1d20..2c59390edf1 100644 --- a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/DataTypes.elm +++ b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/DataTypes.elm @@ -1,50 +1,50 @@ module DataTypes exposing(..) import Http exposing (Error) -import Toasty -import Toasty.Defaults type alias Secret = - { name : String + { info : SecretInfo , value : String } +type alias SecretInfo = + { name : String + , description : String + } + + type alias Model = - { contextPath : String - , secrets : List Secret - , focusOn : Maybe Secret - , newSecretInput : Maybe Secret - , isOpenCreateModal : Bool - , isOpenEditModal : Bool - , stateInputs : List StateInput + { contextPath : String + , secrets : List SecretInfo + , focusOn : Maybe SecretInfo + , newSecretInput : Maybe Secret + , openModalMode : Mode + , stateInputs : List StateInput , openedDescription : List String } -type WriteAction +type Mode = Edit | Add + | Delete + | Read type StateInput - = InvalidName - | InvalidValue - | InvalidDescription + = EmptyInputName + | EmptyInputValue + | EmptyInputDescription type Msg - = GetAllSecrets (Result Error (List Secret)) - | GetSecret (Result Error Secret) - | AddSecret (Result Error Secret) - | DeleteSecret (Result Error String) - | UpdateSecret (Result Error Secret) + = GetAllSecrets (Result Error (List SecretInfo)) + | GetSecret (Result Error (List SecretInfo)) + | AddSecret (Result Error (List SecretInfo)) + | DeleteSecret (Result Error (List SecretInfo)) + | UpdateSecret (Result Error (List SecretInfo)) | CallApi (Model -> Cmd Msg) - | OpenCreateModal - | OpenEditModal Secret + | OpenModal Mode (Maybe SecretInfo) | CloseModal | InputName String | InputValue String | InputDescription String - | SubmitSecret WriteAction - | OpenDescription Secret - -- - -- -- NOTIFICATIONS - --| ToastyMsg (Toasty.Msg Toasty.Defaults.Toast) - --| Notification (Toasty.Msg Toasty.Defaults.Toast) \ No newline at end of file + | SubmitSecret Mode + | OpenDescription SecretInfo diff --git a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/Init.elm b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/Init.elm index 2ba65e959f8..e5c9335687a 100644 --- a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/Init.elm +++ b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/Init.elm @@ -5,11 +5,8 @@ module Init exposing (..) ------------------------------ import ApiCalls exposing (getAllSecrets) -import DataTypes exposing (Model, Msg(..), StateInput(..)) -import Html.Attributes exposing (style) +import DataTypes exposing (Mode(..), Model, Msg(..), StateInput(..)) import Http -import Toasty -import Toasty.Defaults subscriptions : Model -> Sub Msg subscriptions model = @@ -23,9 +20,7 @@ subscriptions model = init : { contextPath : String } -> ( Model, Cmd Msg ) init flags = let - --secrets = [(DataTypes.Secret "toto" "value1"), (DataTypes.Secret "tata" "value2"),( DataTypes.Secret "cqjdiueq" "value2"), (DataTypes.Secret "tv2rv2revwrata" "value2") ] - - initModel = Model flags.contextPath [] Nothing Nothing False False [] [] + initModel = Model flags.contextPath [] Nothing Nothing Read [] [] in ( initModel , getAllSecrets initModel diff --git a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonDecoder.elm b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonDecoder.elm index 74e9b1105ea..7aadae8e233 100644 --- a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonDecoder.elm +++ b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonDecoder.elm @@ -1,23 +1,15 @@ module JsonDecoder exposing (..) -import DataTypes exposing (Secret) +import DataTypes exposing (Secret, SecretInfo) import Json.Decode as D exposing (Decoder) -import Json.Decode.Pipeline exposing (required) +import Json.Decode.Pipeline exposing (hardcoded, optional, required) -decodeGetAllSecrets : Decoder (List Secret) -decodeGetAllSecrets = - D.at [ "data" ] ( D.at [ "secrets" ] (D.list <| decodeSecret) ) +decodeSecretsApi : Decoder (List SecretInfo) +decodeSecretsApi = + D.at [ "data" ] ( D.at [ "secrets" ] (D.list <| decodeSecretInfo) ) -decodeOneSecret : Decoder Secret -decodeOneSecret = - D.at [ "data" ] ( D.at [ "secret" ] decodeSecret) - -decodeDeleteSecret : Decoder String -decodeDeleteSecret = - D.at [ "data" ] ( D.at [ "secretName" ] D.string ) - -decodeSecret : Decoder Secret -decodeSecret = - D.succeed Secret +decodeSecretInfo : Decoder SecretInfo +decodeSecretInfo = + D.succeed SecretInfo |> required "name" D.string - |> required "value" D.string \ No newline at end of file + |> required "description" D.string diff --git a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonEncoder.elm b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonEncoder.elm index a1e3346007b..556d800fa56 100644 --- a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonEncoder.elm +++ b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/JsonEncoder.elm @@ -6,6 +6,7 @@ import Json.Encode exposing (Value, object, string) encodeSecret: Secret -> Value encodeSecret secret = object - [ ("name", string secret.name) + [ ("name", string secret.info.name) , ("value", string secret.value) + , ("description", string secret.info.description) ] \ No newline at end of file diff --git a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/View.elm b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/View.elm index bd8382e7016..5dd9bda6888 100644 --- a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/View.elm +++ b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/View.elm @@ -1,13 +1,13 @@ module View exposing (..) -import ApiCalls exposing (deleteSecret) -import DataTypes exposing (Model, Msg(..), Secret, WriteAction(..)) +import DataTypes exposing (Mode(..), Model, Msg(..), Secret, SecretInfo, StateInput(..)) import Html exposing (Html, b, button, div, h4, i, input, label, span, table, tbody, td, text, textarea, th, thead, tr, ul) -import Html.Attributes exposing (attribute, class, colspan, disabled, hidden, id, placeholder, style, tabindex, type_) +import Html.Attributes exposing (attribute, class, colspan, disabled, id, placeholder, style, tabindex, type_) import Html.Events exposing (onClick, onInput) -import List exposing (any, concat, foldr, isEmpty, map, member) +import List exposing (concat, isEmpty, map, member) import Markdown +import String exposing (left) -constructTableLine : List Secret -> List String -> Html Msg +constructTableLine : List SecretInfo -> List String -> Html Msg constructTableLine secrets openedDescription = let lines = @@ -21,11 +21,11 @@ constructTableLine secrets openedDescription = tr [ class ("curspoint " ++ isFocused), attribute "role" "row", onClick (OpenDescription s) ] [ td [class "name"][i [class ("chevron fas fa-xs " ++ chevronSide)][],b[][text s.name]] - , td [class "description"][text s.value] + , td [class "description"][text (left 250 s.description)] , td [class "change"] [ - button [style "min-width" "50px", class "btn-edit btn btn-default btn-sm", onClick (OpenEditModal s)] [text "Edit"] - , button [style "min-width" "50px", style "margin-left" "5px", class "btn-del btn btn-danger btn-sm", onClick (CallApi (deleteSecret s.name))] [text "Delete"] + button [style "min-width" "50px", class "btn-edit btn btn-default btn-sm", onClick (OpenModal Edit (Just s))] [text "Edit"] + , button [style "min-width" "50px", style "margin-left" "5px", class "btn-del btn btn-danger btn-sm", onClick (OpenModal Delete (Just s))] [text "Delete"] ] ] @@ -42,9 +42,6 @@ constructTableLine secrets openedDescription = displayTable : Model -> Html Msg displayTable model = - let - secrets = [(DataTypes.Secret "toto" "# Test title"), (DataTypes.Secret "tata" "value2"),( DataTypes.Secret "cqjdiueq" "value2"), (DataTypes.Secret "tv2rv2revwrata" "value2") ] - in div [id "secretsGrid_wrapper", class "dataTables_wrapper no-footer"] [ div [class "dataTables_wrapper_top"] @@ -68,7 +65,7 @@ displayTable model = , th [style "width" "140px;"][text "Change"] ] ] - , constructTableLine secrets model.openedDescription + , constructTableLine model.secrets model.openedDescription ] ] @@ -79,40 +76,52 @@ displayActionZone = [ div [class "createSecret"] [ - button [class "btn btn-success new-icon space-bottom space-top", onClick OpenCreateModal][ text "Create Secret" ] + button [class "btn btn-success new-icon space-bottom space-top", onClick (OpenModal Add Nothing)][ text "Create Secret" ] ] ] displayModal : Model -> Html Msg displayModal model = let - focusedSecret = + descShouldBeDisable = case model.openModalMode of + Delete -> True + _ -> False + focusedSecretName = case model.focusOn of Just s -> s.name - Nothing -> "UNKNOWN" + Nothing -> "" + focusedSecretDescription = + case model.focusOn of + Just s -> s.description + Nothing -> "" + placeholderDescDelete = case model.openModalMode of + Delete -> focusedSecretDescription + _ -> "" title = - if model.isOpenCreateModal then - "Add a Secret" - else if model.isOpenEditModal then - "Update Secret " ++ focusedSecret - else - "Unknown action" + case model.openModalMode of + Read -> "Unknown action should not happend" + Add -> "Add a Secret" + Edit -> "Update Secret " ++ focusedSecretName + Delete -> "Delete Secret " ++ focusedSecretName buttonText = - if model.isOpenCreateModal then - "Create" - else if model.isOpenEditModal then - "Update" - else - "" + case model.openModalMode of + Read -> "" + Add -> "Create" + Edit -> "Update" + Delete -> "Delete" inputName = - if model.isOpenCreateModal then - input [class "rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12", onInput InputName][] - else if model.isOpenEditModal then - input [class "rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12", disabled True, onInput InputName, placeholder focusedSecret][text focusedSecret] - else - div [][] + case model.openModalMode of + Read -> + div[][] + Add -> + input [class ("rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12"), onInput InputName][] + _ -> + input [class "rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12", disabled True, onInput InputName, placeholder focusedSecretName][text focusedSecretName] + in - if model.isOpenEditModal || model.isOpenCreateModal then + case model.openModalMode of + Read -> div [][] + _ -> div [class "modal-dialog"] [ div [class "modal-content"] @@ -127,7 +136,7 @@ displayModal model = ] , div [class "modal-body"] [ - div [class "row wbBaseField form-group name"] + div [class "row wbBaseField form-group"] [ label [class "col-lg-3 col-sm-12 col-xs-12 text-right wbBaseFieldLabel"] [ @@ -138,22 +147,25 @@ displayModal model = inputName ] ] - , div [class "row wbBaseField form-group value"] - [ - label [class "col-lg-3 col-sm-12 col-xs-12 text-right wbBaseFieldLabel"] - [ - span [class "text-fit"][text "Value"] - ] - , div [class "col-lg-9 col-sm-12 col-xs-12"] - [ - textarea [style "height" "4em", tabindex 2, class "rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12", onInput InputValue][] - , div [class "text-muted small"] + , case model.openModalMode of + Delete -> div [][] + _ -> + div [class "row wbBaseField form-group"] [ - text "The value will not be displayed in the interface, make sure to provide to description and a name to precisely identify the secret." + label [class "col-lg-3 col-sm-12 col-xs-12 text-right wbBaseFieldLabel"] + [ + span [class "text-fit"][text "Value"] + ] + , div [class "col-lg-9 col-sm-12 col-xs-12"] + [ + textarea [style "height" "4em", tabindex 2, class "rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12", onInput InputValue][] + , div [class "text-muted small"] + [ + text "The value will not be displayed in the interface, make sure to provide to description and a name to precisely identify the secret." + ] + ] ] - ] - ] - , div [class "row wbBaseField form-group description"] + , div [class "row wbBaseField form-group"] [ label [class "col-lg-3 col-sm-12 col-xs-12 text-right wbBaseFieldLabel"] [ @@ -161,25 +173,28 @@ displayModal model = ] , div [class "col-lg-9 col-sm-12 col-xs-12"] [ - textarea [style "height" "4em", tabindex 2, class "rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12", onInput InputDescription][] + textarea [style "height" "4em", tabindex 2, class "rudderBaseFieldClassName form-control vresize col-lg-12 col-sm-12", placeholder placeholderDescDelete, disabled descShouldBeDisable, onInput InputDescription][] ] ] ] , div [class "modal-footer"] [ button [id "cancel", class "btn btn-default", onClick CloseModal][text "Cancel"] - , if(model.isOpenCreateModal) then - button [id "saveSecretButton", class "btn btn-success", onClick (SubmitSecret Add)][text buttonText] - else - button [id "saveSecretButton", class "btn btn-success", onClick (SubmitSecret Edit)][text buttonText] + , case model.openModalMode of + Add -> + button [id "saveSecretButton", class "btn btn-success", onClick (SubmitSecret Add)][text buttonText] + Edit -> + button [id "saveSecretButton", class "btn btn-success", onClick (SubmitSecret Edit)][text buttonText] + Delete -> + button [id "saveSecretButton", class "btn btn-success", onClick (SubmitSecret Delete)][text buttonText] + Read -> + button [id "error-btn", class "btn btn-success", disabled True][] ] ] - ] - else - div[][] + ] -displayDescriptionDetails : Secret -> Html Msg +displayDescriptionDetails : SecretInfo -> Html Msg displayDescriptionDetails s = tr [class "details secretsDescription"] [ @@ -190,7 +205,7 @@ displayDescriptionDetails s = span [] [ ul [class "evlogviewpad"] ( - Markdown.toHtml Nothing s.value + Markdown.toHtml Nothing s.description ) ] ] @@ -201,10 +216,9 @@ view : Model -> Html Msg view model = let modal = - if model.isOpenEditModal || model.isOpenCreateModal then - div [id "secretForm", class "modal-backdrop fade in"] [] - else - div [][] + case model.openModalMode of + Read -> div [][] + _ -> div [id "secretForm", class "modal-backdrop fade in"] [] in div [] [ diff --git a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/rudder-secret.elm b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/rudder-secret.elm index b0e8009a649..57af2e2294a 100644 --- a/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/rudder-secret.elm +++ b/webapp/sources/rudder/rudder-web/src/main/elm/secret/sources/rudder-secret.elm @@ -1,33 +1,23 @@ port module Secret exposing (..) -import ApiCalls exposing (addSecret, updateSecret) +import ApiCalls exposing (addSecret, deleteSecret, updateSecret) import Browser -import DataTypes exposing (Model, Msg(..), StateInput(..), WriteAction(..)) -import List exposing (filter, length, map) +import DataTypes exposing (Model, Msg(..), StateInput(..), Mode(..)) +import List exposing (filter, head, length) import Http exposing (Error) import Init exposing (init, subscriptions) import List.Extra exposing (setIf) import String exposing (isEmpty) import View exposing (view) ---import Init exposing (createErrorNotification) - - main = - Browser.element - { init = init - , view = view - , update = update - , subscriptions = subscriptions - } + Browser.element + { init = init + , view = view + , update = update + , subscriptions = subscriptions + } - --= GetAllSecrets (Result Error (List Secret)) - --| GetSecret (Result Error Secret) - --| AddSecret (Result Error Secret) - --| DeleteSecret (Result Error String) - --| UpdateSecret (Result Error Secret) - --| ReloadSecrets - --| CallApi (Model -> Cmd Msg) update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of @@ -36,81 +26,128 @@ update msg model = GetAllSecrets secrets -> case secrets of Ok s -> - ({ model | secrets = []}, Cmd.none) + ({ model | secrets = s}, Cmd.none) Err err -> processApiError err model - GetSecret secret -> - case secret of + GetSecret secrets -> + case secrets of Ok s -> - ({model | focusOn = Just s}, Cmd.none) + let + sec = (head s) + in + case sec of + Just _ -> + ({model | focusOn = sec}, Cmd.none) + Nothing -> + (model, Cmd.none) Err err -> processApiError err model - AddSecret secret -> - case secret of + AddSecret secrets -> + case secrets of Ok s -> - ({model | secrets = s :: model.secrets}, Cmd.none) + case (head s) of + Just sec -> + ({model | secrets = sec :: model.secrets, newSecretInput = Nothing}, Cmd.none) + Nothing -> + (model, Cmd.none) Err err -> processApiError err model - DeleteSecret name -> - case name of - Ok n -> - let - filteredSecrets = filter (\s -> s.name /= n) model.secrets - in - ({model | secrets = filteredSecrets}, Cmd.none) + DeleteSecret secrets -> + case secrets of + Ok s -> + case (head s) of + Just sec -> + let + filteredSecrets = filter (\present -> present.name /= sec.name) model.secrets + in + ({model | secrets = filteredSecrets}, Cmd.none) + Nothing -> + (model, Cmd.none) Err err -> processApiError err model - UpdateSecret secret -> - case secret of + UpdateSecret secrets -> + case secrets of Ok newSecret -> - let - updatedSecrets = setIf (\s -> s.name == newSecret.name) newSecret model.secrets - in - ({model | secrets = updatedSecrets}, Cmd.none) + case (head newSecret) of + Just sec -> + let + updatedSecrets = setIf (\s -> s.name == sec.name) sec model.secrets + in + ({model | secrets = updatedSecrets, newSecretInput = Nothing}, Cmd.none) + Nothing -> + (model, Cmd.none) Err err -> processApiError err model - OpenCreateModal -> - ({model | isOpenCreateModal = True, isOpenEditModal = False}, Cmd.none) - OpenEditModal secret -> - ({model | isOpenCreateModal = False, isOpenEditModal = True, focusOn = Just secret}, Cmd.none) + OpenModal action focusedSecret -> + ({model | openModalMode = action, focusOn = focusedSecret}, Cmd.none) CloseModal -> - ({model | isOpenCreateModal = False, isOpenEditModal = False, focusOn = Nothing }, Cmd.none) + ({model | openModalMode = Read, focusOn = Nothing, stateInputs = []}, Cmd.none) InputName name -> case model.newSecretInput of Just s -> - ({model | newSecretInput = Just (DataTypes.Secret name s.value)}, Cmd.none) + let + secInfo = DataTypes.SecretInfo name s.info.description + in + ({model | newSecretInput = Just ((DataTypes.Secret secInfo s.value))}, Cmd.none) Nothing -> - ({model | newSecretInput = Just (DataTypes.Secret name "")}, Cmd.none) + ({model | newSecretInput = Just (DataTypes.Secret (DataTypes.SecretInfo name "") "")}, Cmd.none) InputValue value -> case model.newSecretInput of Just s -> - ({model | newSecretInput = Just (DataTypes.Secret s.name value)}, Cmd.none) + let + secInfo = DataTypes.SecretInfo s.info.name s.info.description + in + ({model | newSecretInput = Just (DataTypes.Secret secInfo value)}, Cmd.none) Nothing -> - ({model | newSecretInput = Just (DataTypes.Secret "" value)}, Cmd.none) + ({model | newSecretInput = Just (DataTypes.Secret (DataTypes.SecretInfo "" "") value)}, Cmd.none) InputDescription description -> - (model , Cmd.none) - SubmitSecret action -> case model.newSecretInput of Just s -> - if (isEmpty s.name) then - ({model | stateInputs = InvalidName :: model.stateInputs}, Cmd.none) - else if (isEmpty s.value) then - ({model | stateInputs = InvalidValue :: model.stateInputs}, Cmd.none) - --else if (isEmpty s.description) then - -- ({model | stateInputs = InvalidDescription :: model.stateInputs}, Cmd.none) - else + let + secInfo = DataTypes.SecretInfo s.info.name description + in + ({model | newSecretInput = Just (DataTypes.Secret secInfo s.value)}, Cmd.none) + Nothing -> + ({model | newSecretInput = Just (DataTypes.Secret (DataTypes.SecretInfo "" description) "")}, Cmd.none) + SubmitSecret action -> + case model.newSecretInput of + Just newSecret -> + let + isEmptyName = isEmpty newSecret.info.name + isEmptyValue = isEmpty newSecret.value + isEmptyDescription = isEmpty newSecret.info.description + in case action of + Read -> (model, Cmd.none) + Delete -> (model, Cmd.none) -- Should never happened Add -> - - ({model | secrets = s :: model.secrets, isOpenCreateModal = False}, addSecret model s) + case (isEmptyName, isEmptyValue, isEmptyDescription) of + (True, _, _) -> + ({ model | stateInputs = EmptyInputName :: model.stateInputs}, Cmd.none) + (_, True, _) -> + (model, Cmd.none) + (_, _, True) -> + (model, Cmd.none) + (False, False, False ) -> + ({model | openModalMode = Read, stateInputs = []}, addSecret model newSecret) Edit -> - let - newSecrets = setIf (\oldS -> oldS.name == s.name) s model.secrets - in - ({model | secrets = newSecrets, isOpenEditModal = False}, updateSecret model s) + case (isEmptyValue, isEmptyDescription) of + (True, True) -> + (model, Cmd.none) + (_, _) -> + case model.focusOn of + Just sec -> ({model | openModalMode = Read, focusOn = Nothing, stateInputs = []}, updateSecret model {newSecret | info = DataTypes.SecretInfo sec.name newSecret.info.description}) + Nothing -> (model, Cmd.none) + Nothing -> - (model, Cmd.none) + case action of + Delete -> + case model.focusOn of + Just sec -> ({model | openModalMode = Read}, deleteSecret sec.name model) + Nothing -> (model, Cmd.none) + + _ -> (model, Cmd.none) OpenDescription s -> let openedDesc = filter (\o -> o /= s.name) model.openedDescription @@ -124,6 +161,6 @@ processApiError : Error -> Model -> ( Model, Cmd Msg ) processApiError err model = --let -- newModel = - ({ model | secrets = []}, Cmd.none) + ({ model | openModalMode = Read, focusOn = Nothing, stateInputs = []}, Cmd.none) --in --( newModel, Cmd.none ) |> createErrorNotification "Error while trying to fetch settings." err \ No newline at end of file diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/style/rudder/rudder-secret.css b/webapp/sources/rudder/rudder-web/src/main/webapp/style/rudder/rudder-secret.css index e13d2d0f1e6..0b25f8ad8fa 100644 --- a/webapp/sources/rudder/rudder-web/src/main/webapp/style/rudder/rudder-secret.css +++ b/webapp/sources/rudder/rudder-web/src/main/webapp/style/rudder/rudder-secret.css @@ -41,9 +41,6 @@ flex-basis : initial !important; flex: auto !important; } - - - .template-sidebar.sidebar-left{ box-shadow : none !important; flex-basis : initial !important; @@ -112,5 +109,9 @@ tr:hover td { } .evlogviewpad { - padding:30px; + padding:15px; +} + +.description { + max-width: 1200px; } \ No newline at end of file