From 08dcd6d8755f57f38a79e059ef6a69393a8085e1 Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Sun, 4 Feb 2024 04:30:54 +0100 Subject: [PATCH] WIP: a single entry in the state for all resources. --- src/App/ZoneInterface.purs | 117 ++++++++++++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 15 deletions(-) diff --git a/src/App/ZoneInterface.purs b/src/App/ZoneInterface.purs index 22522ee..0b3ba56 100644 --- a/src/App/ZoneInterface.purs +++ b/src/App/ZoneInterface.purs @@ -141,6 +141,8 @@ data Action | AddRR AcceptedRRTypes ResourceRecord -- Validate a new resource record before adding it. | ValidateRR AcceptedRRTypes + | ValidateLocal RRId AcceptedRRTypes + | SaveLocal ResourceRecord -- Update new entry form (in the `active_new_rr_modal` modal). | UpdateNewRRForm Update_MODAL_Form @@ -166,6 +168,11 @@ type State = -- A modal to present a form for adding a new RR. , active_new_rr_modal :: Maybe AcceptedRRTypes + -- TODO: get all the resources in a single entry. + -- Better that way: simpler code. + , _resources :: Array (SRVRR ()) + , _local_errors :: Hash.HashMap RRId (Array Validation.ValidationError) + -- current entries , _soa :: Maybe (SOARR ()) , _srr :: Array (SimpleRR ()) @@ -211,6 +218,9 @@ initialState domain = , _domain: domain + , _resources: [] + , _local_errors: Hash.empty + , _soa: Nothing , _srr: [] , _mxrr: [] @@ -240,6 +250,8 @@ render state true, Just rr_id, _ -> modal_rr_delete rr_id true, Nothing, Just t -> modal_add_new_rr t true, Nothing, Nothing -> HH.div_ [ Bulma.h1 state._domain + , Bulma.hr + , render_resources state._local_errors $ sorted state._resources , Bulma.hr , render_soa state._soa , render_records state._errors $ sorted state._srr @@ -566,6 +578,35 @@ handleAction = case _ of state <- H.get H.modify_ _ { _srvrr = (update_port rr_id val state._srvrr) } + -- TODO: validate any local RR with the new _resources and _local_errors. + ValidateLocal local_rr_id t -> do + state <- H.get + case first (\rr -> rr.rrid == local_rr_id) state._resources of + Nothing -> H.raise $ Log $ SimpleLog $ "Cannot find RR number: " <> show local_rr_id + Just local_rr -> do + case Validation.validation local_rr t of + Left actual_errors -> do + let new_error_hash = Hash.insert local_rr.rrid actual_errors state._local_errors + H.modify_ _ { _local_errors = new_error_hash } + H.raise $ Log $ SimpleLog $ "[😈] Errors in RR id " <> show local_rr_id + <> ". Please fix them before update." + Right rr -> do + let new_error_hash = Hash.delete local_rr.rrid state._local_errors + H.modify_ _ { _local_errors = new_error_hash } + handleAction $ SaveLocal rr + message <- H.liftEffect + $ DNSManager.serialize + $ DNSManager.MkUpdateRR { domain: state._domain, rr: rr } + H.raise $ MessageToSend message + + SaveLocal rr -> do + state <- H.get + H.raise $ Log $ SimpleLog $ "Updating RR " <> show rr.rrid + message <- H.liftEffect + $ DNSManager.serialize + $ DNSManager.MkUpdateRR { domain: state._domain, rr: rr } + H.raise $ MessageToSend message + SaveSRR local_rr_id -> do state <- H.get let maybe_local_rr = first (\rr -> rr.rrid == local_rr_id) state._srr @@ -738,6 +779,49 @@ render_soa (Just soa) = Bulma.box [ Bulma.zone_rr_title "Start Of Authority (SOA ] ] +-- | Render all Resource Records. +render_resources :: forall (w :: Type). Hash.HashMap RRId (Array Validation.ValidationError) -> Array (SRVRR ()) -> HH.HTML w Action +render_resources _ [] + = Bulma.box [ Bulma.zone_rr_title "All records (TEST)" + , Bulma.subtitle "No records for now" + ] +render_resources errors records + = Bulma.box [ Bulma.zone_rr_title "All records (TEST)" + , Bulma.subtitle "TODO: display the records." + ] +--render_resources errors records +-- = Bulma.box [ Bulma.zone_rr_title "All records (TEST)" +-- , table_rr +-- ] +-- where +-- table_rr = Bulma.table [] [ Bulma.zone_rr_title "XXX", table_content ] +-- table_content = HH.tbody_ $ A.concat $ map rows records +-- rows rr +-- = [ HH.tr_ $ +-- [ Bulma.txt_name rr.rrtype +-- , HH.td_ [ Bulma.input_domain (update_simple rr.rrid Update_SRR_Domain) rr.name rr.valid ] +-- , HH.td_ [ Bulma.input_ttl (update_simple rr.rrid Update_SRR_TTL ) rr.ttl rr.valid ] +-- , HH.td_ [ case rr.rrtype of +-- "TXT" -> Bulma.textarea (update_simple rr.rrid Update_SRR_Target) rr.target rr.valid +-- _ -> Bulma.input_target (update_simple rr.rrid Update_SRR_Target) rr.target rr.valid +-- ] +-- , HH.td_ [ Bulma.btn_change (SaveSRR rr.rrid) (TellSomethingWentWrong rr.rrid "cannot update") rr.modified rr.valid ] +-- , HH.td_ [ Bulma.btn_delete (\_ -> DeleteRRModal rr.rrid) ] +-- ] +-- ] <> error_row rr +-- update_simple rrid v = (UpdateLocalForm rrid) <<< Update_Local_Form_SRR <<< v +-- error_row rr = case Hash.lookup rr.rrid errors of +-- Nothing -> [] +-- Just error_array -> [ HH.tr_ $ +-- [ Bulma.txt_name "" +-- , HH.td_ $ from_error_array_to_td error_array Validation.Name +-- , HH.td_ $ from_error_array_to_td error_array Validation.TTL +-- , HH.td_ $ from_error_array_to_td error_array Validation.Target +-- , HH.td_ [] +-- , HH.td_ [] +-- ] +-- ] + render_records :: forall (w :: Type). Hash.HashMap RRId Validation.Errors -> Array (SimpleRR ()) -> HH.HTML w Action render_records _ [] = Bulma.box [ Bulma.zone_rr_title $ S.joinWith ", " baseRecords @@ -756,16 +840,17 @@ render_records errors records rows rr = [ HH.tr_ $ [ Bulma.txt_name rr.rrtype - , HH.td_ [ Bulma.input_domain ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRR <<< Update_SRR_Domain) rr.name rr.valid ] - , HH.td_ [ Bulma.input_ttl ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRR <<< Update_SRR_TTL ) rr.ttl rr.valid ] + , HH.td_ [ Bulma.input_domain (update_simple rr.rrid Update_SRR_Domain) rr.name rr.valid ] + , HH.td_ [ Bulma.input_ttl (update_simple rr.rrid Update_SRR_TTL ) rr.ttl rr.valid ] , HH.td_ [ case rr.rrtype of - "TXT" -> Bulma.textarea ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRR <<< Update_SRR_Target) rr.target rr.valid - _ -> Bulma.input_target ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRR <<< Update_SRR_Target) rr.target rr.valid + "TXT" -> Bulma.textarea (update_simple rr.rrid Update_SRR_Target) rr.target rr.valid + _ -> Bulma.input_target (update_simple rr.rrid Update_SRR_Target) rr.target rr.valid ] , HH.td_ [ Bulma.btn_change (SaveSRR rr.rrid) (TellSomethingWentWrong rr.rrid "cannot update") rr.modified rr.valid ] , HH.td_ [ Bulma.btn_delete (\_ -> DeleteRRModal rr.rrid) ] ] ] <> error_row rr + update_simple rrid v = (UpdateLocalForm rrid) <<< Update_Local_Form_SRR <<< v error_row rr = case Hash.lookup rr.rrid errors of Nothing -> [] Just error_array -> [ HH.tr_ $ @@ -802,14 +887,15 @@ render_mx_records errors records table_content = HH.tbody_ $ A.concat $ map rows records rows rr = [ HH.tr_ $ - [ HH.td_ [ Bulma.input_domain ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_MXRR <<< Update_MX_Domain) rr.name rr.valid ] - , HH.td_ [ Bulma.input_ttl ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_MXRR <<< Update_MX_TTL) rr.ttl rr.valid ] - , HH.td_ [ Bulma.input_priority ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_MXRR <<< Update_MX_Priority) rr.priority rr.valid ] - , HH.td_ [ Bulma.input_target ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_MXRR <<< Update_MX_Target) rr.target rr.valid ] + [ HH.td_ [ Bulma.input_domain (update_mx rr.rrid Update_MX_Domain) rr.name rr.valid ] + , HH.td_ [ Bulma.input_ttl (update_mx rr.rrid Update_MX_TTL) rr.ttl rr.valid ] + , HH.td_ [ Bulma.input_priority (update_mx rr.rrid Update_MX_Priority) rr.priority rr.valid ] + , HH.td_ [ Bulma.input_target (update_mx rr.rrid Update_MX_Target) rr.target rr.valid ] , HH.td_ [ Bulma.btn_change (SaveMXRR rr.rrid) (TellSomethingWentWrong rr.rrid "cannot update") rr.modified rr.valid ] , HH.td_ [ Bulma.btn_delete (\_ -> DeleteRRModal rr.rrid) ] ] ] <> error_row rr + update_mx rrid v = (UpdateLocalForm rrid) <<< Update_Local_Form_MXRR <<< v error_row rr = case Hash.lookup rr.rrid errors of Nothing -> [] Just error_array -> @@ -839,17 +925,18 @@ render_srv_records errors records rows rr = [ HH.tr_ $ - [ HH.td_ [ Bulma.input_domain ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRVRR <<< Update_SRV_Domain ) rr.name rr.valid ] - , HH.td_ [ Bulma.input_ttl ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRVRR <<< Update_SRV_TTL ) rr.ttl rr.valid ] - , HH.td_ [ Bulma.input_priority ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRVRR <<< Update_SRV_Priority) rr.priority rr.valid ] - , HH.td_ [ Bulma.input_protocol ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRVRR <<< Update_SRV_Protocol) rr.protocol rr.valid ] - , HH.td_ [ Bulma.input_weight ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRVRR <<< Update_SRV_Weight ) rr.weight rr.valid ] - , HH.td_ [ Bulma.input_port ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRVRR <<< Update_SRV_Port ) rr.port rr.valid ] - , HH.td_ [ Bulma.input_target ((UpdateLocalForm rr.rrid) <<< Update_Local_Form_SRVRR <<< Update_SRV_Target ) rr.target rr.valid ] + [ HH.td_ [ Bulma.input_domain (update_srv rr.rrid Update_SRV_Domain ) rr.name rr.valid ] + , HH.td_ [ Bulma.input_ttl (update_srv rr.rrid Update_SRV_TTL ) rr.ttl rr.valid ] + , HH.td_ [ Bulma.input_priority (update_srv rr.rrid Update_SRV_Priority) rr.priority rr.valid ] + , HH.td_ [ Bulma.input_protocol (update_srv rr.rrid Update_SRV_Protocol) rr.protocol rr.valid ] + , HH.td_ [ Bulma.input_weight (update_srv rr.rrid Update_SRV_Weight ) rr.weight rr.valid ] + , HH.td_ [ Bulma.input_port (update_srv rr.rrid Update_SRV_Port ) rr.port rr.valid ] + , HH.td_ [ Bulma.input_target (update_srv rr.rrid Update_SRV_Target ) rr.target rr.valid ] , HH.td_ [ Bulma.btn_change (SaveSRVRR rr.rrid) (TellSomethingWentWrong rr.rrid "cannot update") rr.modified rr.valid ] , HH.td_ [ Bulma.btn_delete (\_ -> DeleteRRModal rr.rrid) ] ] ] <> error_row rr + update_srv rrid v = (UpdateLocalForm rrid) <<< Update_Local_Form_SRVRR <<< v error_row rr = case Hash.lookup rr.rrid errors of Nothing -> [] Just error_array ->