@@ -31,6 +31,7 @@ const (
3131 modeCreate
3232 modeEdit
3333 modeClone
34+ modeCloneCluster
3435 modeWorkbench
3536)
3637
@@ -143,6 +144,9 @@ type Model struct {
143144 formDryRun bool
144145 wbTemplate bool
145146 confirmName string
147+
148+ pickingCloneDest bool
149+ cloneDest servicesbridge.Cluster
146150}
147151
148152type formField struct {
@@ -262,6 +266,8 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
262266 m .cursor = 0
263267 m .err = nil
264268 m .needsAuth = false
269+ m .pickingCloneDest = false
270+ m .cloneDest = servicesbridge.Cluster {}
265271 if m .loader == nil {
266272 m .loading = false
267273 return m , nil
@@ -277,7 +283,11 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
277283 if msg .err == nil {
278284 m .clusters = msg .clusters
279285 m .clusterCursor = clampCursor (m .clusterCursor , len (m .clusters ))
280- m .mode = modeClusters
286+ if m .pickingCloneDest {
287+ m .mode = modeCloneCluster
288+ } else {
289+ m .mode = modeClusters
290+ }
281291 }
282292 return m , nil
283293 case listedMsg :
@@ -374,6 +384,8 @@ func (m Model) updateKey(key tea.KeyPressMsg) (Model, tea.Cmd) {
374384 return m .updateTarball (action , key )
375385 case modeCreate , modeEdit , modeClone :
376386 return m .updateForm (action , key )
387+ case modeCloneCluster :
388+ return m .updateCloneCluster (action )
377389 case modeWorkbench :
378390 return m .updateWorkbench (action , key , text )
379391 case modeDetail :
@@ -409,19 +421,26 @@ func (m Model) updateKey(key tea.KeyPressMsg) (Model, tea.Cmd) {
409421func (m Model ) updateFilter (action keyAction , key tea.KeyPressMsg ) (Model , tea.Cmd ) {
410422 switch action {
411423 case keyActionBack :
412- m .mode = modeList
413- if m .filteringCluster {
424+ m .filterInput .Blur ()
425+ if m .pickingCloneDest {
426+ m .mode = modeCloneCluster
427+ } else if m .filteringCluster {
414428 m .mode = modeClusters
429+ } else {
430+ m .mode = modeList
415431 }
416- m .filterInput .Blur ()
417432 return m , nil
418433 case keyActionConfirm :
419434 value := strings .TrimSpace (m .filterInput .Value ())
420435 m .filterInput .Blur ()
421- if m .filteringCluster {
436+ if m .pickingCloneDest || m . filteringCluster {
422437 m .clusterFilter = value
423- m .mode = modeClusters
424438 m .clusterCursor = 0
439+ if m .pickingCloneDest {
440+ m .mode = modeCloneCluster
441+ } else {
442+ m .mode = modeClusters
443+ }
425444 return m , m .beginClusters ()
426445 }
427446 m .serviceFilter = value
@@ -495,7 +514,7 @@ func (m Model) openAction(a detailAction) (Model, tea.Cmd) {
495514 case actionEdit :
496515 return m .beginEditForm (), nil
497516 case actionClone :
498- return m .beginCloneForm (), nil
517+ return m .beginClone ()
499518 case actionWorkbench :
500519 m .mode = modeWorkbench
501520 m .wbTemplate = true
@@ -650,21 +669,63 @@ func (m Model) beginEditForm() Model {
650669 return m
651670}
652671
672+ func (m Model ) beginClone () (Model , tea.Cmd ) {
673+ m .pickingCloneDest = true
674+ m .cloneDest = servicesbridge.Cluster {}
675+ m .clusterFilter = ""
676+ m .clusterCursor = 0
677+ m .err = nil
678+ m .mode = modeCloneCluster
679+ m .loading = true
680+ return m , m .beginClusters ()
681+ }
682+
683+ func (m Model ) updateCloneCluster (action keyAction ) (Model , tea.Cmd ) {
684+ switch action {
685+ case keyActionBack :
686+ m .pickingCloneDest = false
687+ m .clusterFilter = ""
688+ m .mode = modeDetail
689+ m .err = nil
690+ return m , nil
691+ case keyActionMoveUp :
692+ m .clusterCursor = clampCursor (m .clusterCursor - 1 , len (m .clusters ))
693+ case keyActionMoveDown :
694+ m .clusterCursor = clampCursor (m .clusterCursor + 1 , len (m .clusters ))
695+ case keyActionConfirm :
696+ if len (m .clusters ) == 0 {
697+ return m , nil
698+ }
699+ m .cloneDest = m .clusters [m .clusterCursor ]
700+ m .pickingCloneDest = false
701+ m .clusterFilter = ""
702+ return m .beginCloneForm (), nil
703+ case keyActionRefresh :
704+ return m , m .beginClusters ()
705+ case keyActionFilter :
706+ m .mode = modeFilter
707+ m .filteringCluster = true
708+ m .filterInput .Placeholder = "filter destination clusters"
709+ m .filterInput .SetValue (m .clusterFilter )
710+ m .filterInput .Focus ()
711+ m .formInput = m .filterInput
712+ }
713+ return m , nil
714+ }
715+
653716func (m Model ) beginCloneForm () Model {
654717 m .mode = modeClone
655718 m .formFields = []formField {
656- {label : "Dest cluster ID" , key : "cluster" },
657719 {label : "Name" , key : "name" },
658720 {label : "Namespace" , key : "namespace" },
659721 }
660722 m .formIndex = 0
661723 m .formValues = map [string ]string {
662724 "name" : m .detail .Name + "-clone" ,
663- "namespace" : m .detail .Namespace ,
664- "cluster" : m .detail .ClusterID ,
725+ "namespace" : loCoalesce (m .detail .Namespace , "default" ),
665726 }
666- m .formInput .SetValue (m .formValues ["cluster " ])
667- m .formInput .Placeholder = "destination cluster id "
727+ m .formInput .SetValue (m .formValues ["name " ])
728+ m .formInput .Placeholder = "cloned service name "
668729 m .formInput .Focus ()
669730 m .err = nil
670731 return m
@@ -674,9 +735,13 @@ func (m Model) updateForm(action keyAction, key tea.KeyPressMsg) (Model, tea.Cmd
674735 switch action {
675736 case keyActionBack :
676737 m .formInput .Blur ()
677- if m .mode == modeCreate {
738+ switch m .mode {
739+ case modeCreate :
678740 m .mode = modeList
679- } else {
741+ case modeClone :
742+ m .pickingCloneDest = true
743+ m .mode = modeCloneCluster
744+ default :
680745 m .mode = modeDetail
681746 }
682747 return m , nil
@@ -794,19 +859,20 @@ func (m Model) submitForm() (Model, tea.Cmd) {
794859 case modeClone :
795860 input := servicesbridge.CloneInput {
796861 SourceID : m .detail .ID ,
797- DestClusterID : m .formValues [ "cluster" ] ,
862+ DestClusterID : m .cloneDest . ID ,
798863 Name : m .formValues ["name" ],
799864 Namespace : m .formValues ["namespace" ],
800865 }
866+ dest := clusterLabel (m .cloneDest )
801867 m .pending = pendingOp {
802868 kind : actionClone ,
803869 title : "Clone · " + m .detail .Name ,
804- cli : "plural cd services clone " + input . DestClusterID + " " + m .detail .ID + " --name " + input .Name ,
870+ cli : fmt . Sprintf ( "plural cd services clone %s %s --name %s --namespace %s" , dest , m .detail .ID , input .Name , input . Namespace ) ,
805871 clone : & input ,
806872 lines : []string {
807873 "Action Clone service" ,
808- "Source " + m .detail .Name ,
809- "Dest " + input . DestClusterID ,
874+ "Source " + m .detail .Name + " · " + clusterLabel ( m . cluster ) ,
875+ "Dest " + dest ,
810876 "Name " + input .Name ,
811877 "Namespace " + input .Namespace ,
812878 },
0 commit comments