···38 name="spindle"
39 required
40 class="p-1 max-w-64 border border-gray-200 bg-white dark:bg-gray-800 dark:text-white dark:border-gray-700">
41+ {{/* For some reason, we can't use an empty string in a <select> in all scenarios unless it is preceded by a disabled select?? No idea, could just be a Firefox thing? */}}
42+ <option value="[[none]]" class="py-1" {{ if not $.CurrentSpindle }}selected{{ end }}>
43+ {{ if not $.CurrentSpindle }}
44 Choose a spindle
45+ {{ else }}
46+ Disable pipelines
47+ {{ end }}
48 </option>
49 {{ range $.Spindles }}
50 <option value="{{ . }}" class="py-1" {{ if eq . $.CurrentSpindle }}selected{{ end }}>
+25-15
appview/repo/repo.go
···657 }
658659 newSpindle := r.FormValue("spindle")
0660 client, err := rp.oauth.AuthorizedClient(r)
661 if err != nil {
662 fail("Failed to authorize. Try again later.", err)
663 return
664 }
665666- // ensure that this is a valid spindle for this user
667- validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Did)
668- if err != nil {
669- fail("Failed to find spindles. Try again later.", err)
670- return
0000000671 }
672673- if !slices.Contains(validSpindles, newSpindle) {
674- fail("Failed to configure spindle.", fmt.Errorf("%s is not a valid spindle: %q", newSpindle, validSpindles))
675- return
676 }
677678 // optimistic update
679- err = db.UpdateSpindle(rp.db, string(repoAt), newSpindle)
680 if err != nil {
681 fail("Failed to update spindle. Try again later.", err)
682 return
···699 Owner: user.Did,
700 CreatedAt: f.CreatedAt,
701 Description: &f.Description,
702- Spindle: &newSpindle,
703 },
704 },
705 })
···709 return
710 }
711712- // add this spindle to spindle stream
713- rp.spindlestream.AddSource(
714- context.Background(),
715- eventconsumer.NewSpindleSource(newSpindle),
716- )
00717718 rp.pages.HxRefresh(w)
719}
···657 }
658659 newSpindle := r.FormValue("spindle")
660+ removingSpindle := newSpindle == "[[none]]" // see pages/templates/repo/settings/pipelines.html for more info on why we use this value
661 client, err := rp.oauth.AuthorizedClient(r)
662 if err != nil {
663 fail("Failed to authorize. Try again later.", err)
664 return
665 }
666667+ if !removingSpindle {
668+ // ensure that this is a valid spindle for this user
669+ validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Did)
670+ if err != nil {
671+ fail("Failed to find spindles. Try again later.", err)
672+ return
673+ }
674+675+ if !slices.Contains(validSpindles, newSpindle) {
676+ fail("Failed to configure spindle.", fmt.Errorf("%s is not a valid spindle: %q", newSpindle, validSpindles))
677+ return
678+ }
679 }
680681+ spindlePtr := &newSpindle
682+ if removingSpindle {
683+ spindlePtr = nil
684 }
685686 // optimistic update
687+ err = db.UpdateSpindle(rp.db, string(repoAt), spindlePtr)
688 if err != nil {
689 fail("Failed to update spindle. Try again later.", err)
690 return
···707 Owner: user.Did,
708 CreatedAt: f.CreatedAt,
709 Description: &f.Description,
710+ Spindle: spindlePtr,
711 },
712 },
713 })
···717 return
718 }
719720+ if !removingSpindle {
721+ // add this spindle to spindle stream
722+ rp.spindlestream.AddSource(
723+ context.Background(),
724+ eventconsumer.NewSpindleSource(newSpindle),
725+ )
726+ }
727728 rp.pages.HxRefresh(w)
729}