From bd2076798978a1d5fe31cecd3b83c585c9707eb8 Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Tue, 28 Oct 2025 18:55:27 +0100 Subject: [PATCH] Enable to update the name servers used for delegation. --- src/App/Page/Zone.purs | 13 +++++++++++-- src/App/Templates/Modal.purs | 9 +++++---- src/App/Type/Delegation.purs | 2 +- src/App/Type/Form/Delegation.purs | 13 +++++++++++++ 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/App/Page/Zone.purs b/src/App/Page/Zone.purs index d0d6050..1c93fa6 100644 --- a/src/App/Page/Zone.purs +++ b/src/App/Page/Zone.purs @@ -41,7 +41,7 @@ import CSSClasses as C import App.Text.Explanations as Explanations import App.Type.ResourceRecord as RR -import App.Type.Delegation (mkEmptyDelegationForm, update, Form, Field) as Delegation +import App.Type.Delegation (mkUpdateDelegationForm, mkEmptyDelegationForm, update, Form, Field) as Delegation import App.Type.RRModal (RRModal(..)) import App.Type.ResourceRecord.DKIM as DKIM import App.Type.ResourceRecord.DMARC as DMARC @@ -106,6 +106,9 @@ data Action -- | Delegation modal. | CreateDelegationModal + -- | Update Delegation modal. + | UpdateDelegationModal Delegation + -- | Create modal (a form) for a resource record to update. | CreateUpdateRRModal RR.RRId @@ -271,7 +274,9 @@ render state , Web.ul [ HH.li_ [ Web.btn_ro [C.is_warning] delegation.nameserver1 ] , HH.li_ [ Web.btn_ro [C.is_warning] delegation.nameserver2 ] ] - , Web.p "For now the nameservers cannot be updated (but you can delete the domain and start again)." + , Web.level [ + Web.btn "Edit the name servers" (UpdateDelegationModal delegation) + ] [] ] render_zone_records _ = [ Table.resource_records (sorted state._resources) CreateUpdateRRModal DeleteRRModal NewToken @@ -337,6 +342,10 @@ handleAction = case _ of CreateDelegationModal -> do H.modify_ _ { rr_modal = DelegationModal, _delegation_form = Delegation.mkEmptyDelegationForm } + -- | Delegation modal presents a simple form with two entries (chosen nameservers). + UpdateDelegationModal delegation -> do + H.modify_ _ { rr_modal = DelegationModal, _delegation_form = Delegation.mkUpdateDelegationForm delegation } + -- | Initialize the Zone component: ask for the domain zone to `dnsmanagerd`. Initialize -> do { _domain } <- H.get diff --git a/src/App/Templates/Modal.purs b/src/App/Templates/Modal.purs index f202a94..51a6d61 100644 --- a/src/App/Templates/Modal.purs +++ b/src/App/Templates/Modal.purs @@ -58,9 +58,9 @@ delegation_modal selected_domain form action_update_form action_validate action_ modal_title = "Delegation for " <> selected_domain modal_content :: Array (HH.HTML w i) modal_content = - [ HH.div [HP.classes [C.notification, C.is_warning]] - [ Web.p "⚠️​ You are about to delegate your domain to another server, you won't be able to manage entries from netlibre." - ] + [ if form.new then HH.div [HP.classes [C.notification, C.is_warning]] + [ Web.p "⚠️​ You are about to delegate your domain to another server, you won't be able to manage entries from netlibre." ] + else HH.div [] [] , render_errors , Web.box_input "nameserver1" "name server 1" "ns0.example.com" (action_update_form <<< Delegation.NameServer1) @@ -71,7 +71,8 @@ delegation_modal selected_domain form action_update_form action_validate action_ ] modal_foot :: Array (HH.HTML w i) modal_foot = - [ Web.info_btn "Delegate the domain" action_validate + [ if form.new then Web.info_btn "Delegate the domain" action_validate + else Web.info_btn "Update the name servers" action_validate , Web.cancel_button action_cancel_modal ] render_errors = if A.length form.errors > 0 diff --git a/src/App/Type/Delegation.purs b/src/App/Type/Delegation.purs index 426fac0..093397c 100644 --- a/src/App/Type/Delegation.purs +++ b/src/App/Type/Delegation.purs @@ -3,5 +3,5 @@ module App.Type.Delegation , module App.Type.Error.Delegation ) where -import App.Type.Form.Delegation (Form, Field(..), update, mkEmptyDelegationForm) +import App.Type.Form.Delegation (Form, Field(..), update, mkEmptyDelegationForm, mkUpdateDelegationForm) import App.Type.Error.Delegation (Error(..)) diff --git a/src/App/Type/Form/Delegation.purs b/src/App/Type/Form/Delegation.purs index 499aae2..a23c601 100644 --- a/src/App/Type/Form/Delegation.purs +++ b/src/App/Type/Form/Delegation.purs @@ -2,12 +2,15 @@ module App.Type.Form.Delegation where import App.Type.Error.Delegation (Error) +type Delegation = { nameserver1 :: String, nameserver2 :: String } + -- | The required data needed to properly delegate a domain: two name servers. -- | The type also includes potential errors found while validating the data. type Form = { nameserver1 :: String , nameserver2 :: String , errors :: Array Error + , new :: Boolean } -- | Empty delegation form, with default inputs. @@ -16,6 +19,16 @@ mkEmptyDelegationForm = { nameserver1: "ns0.example.com" , nameserver2: "ns1.example.com" , errors: [] + , new: true + } + +-- | Empty delegation form, with default inputs. +mkUpdateDelegationForm :: Delegation -> Form +mkUpdateDelegationForm delegation + = { nameserver1: delegation.nameserver1 + , nameserver2: delegation.nameserver2 + , errors: [] + , new: false } -- | What are the **fields** of our delegation form?