appview/repo: make pipelines page actually reflect if no spindle is selected, allow removing a spindle from a repo #439

merged
opened by winter.bsky.social targeting master from winter.bsky.social/core: push-pxstrpokmqmn
Changed files
+33 -18
appview
db
pages
templates
repo
settings
repo
+2 -2
appview/db/repos.go
···
var description, spindle sql.NullString
row := e.QueryRow(`
-
select did, name, knot, created, at_uri, description, spindle
+
select did, name, knot, created, at_uri, description, spindle
from repos
where did = ? and name = ?
`,
···
return err
}
-
func UpdateSpindle(e Execer, repoAt, spindle string) error {
+
func UpdateSpindle(e Execer, repoAt string, spindle *string) error {
_, err := e.Exec(
`update repos set spindle = ? where at_uri = ?`, spindle, repoAt)
return err
+6 -1
appview/pages/templates/repo/settings/pipelines.html
···
name="spindle"
required
class="p-1 max-w-64 border border-gray-200 bg-white dark:bg-gray-800 dark:text-white dark:border-gray-700">
-
<option value="" disabled>
+
{{/* 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? */}}
+
<option value="[[none]]" class="py-1" {{ if not $.CurrentSpindle }}selected{{ end }}>
+
{{ if not $.CurrentSpindle }}
Choose a spindle
+
{{ else }}
+
Disable pipelines
+
{{ end }}
</option>
{{ range $.Spindles }}
<option value="{{ . }}" class="py-1" {{ if eq . $.CurrentSpindle }}selected{{ end }}>
+25 -15
appview/repo/repo.go
···
}
newSpindle := r.FormValue("spindle")
+
removingSpindle := newSpindle == "[[none]]" // see pages/templates/repo/settings/pipelines.html for more info on why we use this value
client, err := rp.oauth.AuthorizedClient(r)
if err != nil {
fail("Failed to authorize. Try again later.", err)
return
}
-
// ensure that this is a valid spindle for this user
-
validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Did)
-
if err != nil {
-
fail("Failed to find spindles. Try again later.", err)
-
return
+
if !removingSpindle {
+
// ensure that this is a valid spindle for this user
+
validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Did)
+
if err != nil {
+
fail("Failed to find spindles. Try again later.", err)
+
return
+
}
+
+
if !slices.Contains(validSpindles, newSpindle) {
+
fail("Failed to configure spindle.", fmt.Errorf("%s is not a valid spindle: %q", newSpindle, validSpindles))
+
return
+
}
}
-
if !slices.Contains(validSpindles, newSpindle) {
-
fail("Failed to configure spindle.", fmt.Errorf("%s is not a valid spindle: %q", newSpindle, validSpindles))
-
return
+
spindlePtr := &newSpindle
+
if removingSpindle {
+
spindlePtr = nil
}
// optimistic update
-
err = db.UpdateSpindle(rp.db, string(repoAt), newSpindle)
+
err = db.UpdateSpindle(rp.db, string(repoAt), spindlePtr)
if err != nil {
fail("Failed to update spindle. Try again later.", err)
return
···
Owner: user.Did,
CreatedAt: f.CreatedAt,
Description: &f.Description,
-
Spindle: &newSpindle,
+
Spindle: spindlePtr,
},
},
})
···
return
}
-
// add this spindle to spindle stream
-
rp.spindlestream.AddSource(
-
context.Background(),
-
eventconsumer.NewSpindleSource(newSpindle),
-
)
+
if !removingSpindle {
+
// add this spindle to spindle stream
+
rp.spindlestream.AddSource(
+
context.Background(),
+
eventconsumer.NewSpindleSource(newSpindle),
+
)
+
}
rp.pages.HxRefresh(w)
}