appview: pages: fix star hx-target bug #336

merged
opened by boltless.me targeting master from boltless.me/core: push-lnnlktvkuluq

POST /star's template was whole repoActions fragment but hx-target was set to #starBtn only. Resulting wrapper div copied every time when user starred/unstarred the repo.

This wasn't noticeable because fork button next to it was invisible due to undefined .DisableFork field on RepoStarFragment

Signed-off-by: Seongmin Lee boltlessengineer@proton.me

Changed files
+54 -54
appview
pages
templates
state
+3 -3
appview/pages/pages.go
···
return p.executePlain("user/fragments/editPins", w, params)
}
-
type RepoActionsFragmentParams struct {
+
type RepoStarFragmentParams struct {
IsStarred bool
RepoAt syntax.ATURI
Stats db.RepoStats
}
-
func (p *Pages) RepoActionsFragment(w io.Writer, params RepoActionsFragmentParams) error {
-
return p.executePlain("repo/fragments/repoActions", w, params)
+
func (p *Pages) RepoStarFragment(w io.Writer, params RepoStarFragmentParams) error {
+
return p.executePlain("repo/fragments/repoStar", w, params)
}
type RepoDescriptionParams struct {
+23 -1
appview/pages/templates/layouts/repobase.html
···
<a href="/{{ .RepoInfo.FullName }}" class="font-bold">{{ .RepoInfo.Name }}</a>
</div>
-
{{ template "repo/fragments/repoActions" .RepoInfo }}
+
<div class="flex items-center gap-2 z-auto">
+
{{ template "repo/fragments/repoStar" .RepoInfo }}
+
{{ if .RepoInfo.DisableFork }}
+
<button
+
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
+
disabled
+
title="Empty repositories cannot be forked"
+
>
+
{{ i "git-fork" "w-4 h-4" }}
+
fork
+
</button>
+
{{ else }}
+
<a
+
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 group"
+
hx-boost="true"
+
href="/{{ .RepoInfo.FullName }}/fork"
+
>
+
{{ i "git-fork" "w-4 h-4" }}
+
fork
+
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+
</a>
+
{{ end }}
+
</div>
</div>
{{ template "repo/fragments/repoDescription" . }}
</section>
-48
appview/pages/templates/repo/fragments/repoActions.html
···
-
{{ define "repo/fragments/repoActions" }}
-
<div class="flex items-center gap-2 z-auto">
-
<button
-
id="starBtn"
-
class="btn disabled:opacity-50 disabled:cursor-not-allowed flex gap-2 items-center group"
-
{{ if .IsStarred }}
-
hx-delete="/star?subject={{ .RepoAt }}&countHint={{ .Stats.StarCount }}"
-
{{ else }}
-
hx-post="/star?subject={{ .RepoAt }}&countHint={{ .Stats.StarCount }}"
-
{{ end }}
-
-
hx-trigger="click"
-
hx-target="#starBtn"
-
hx-swap="outerHTML"
-
hx-disabled-elt="#starBtn"
-
>
-
{{ if .IsStarred }}
-
{{ i "star" "w-4 h-4 fill-current" }}
-
{{ else }}
-
{{ i "star" "w-4 h-4" }}
-
{{ end }}
-
<span class="text-sm">
-
{{ .Stats.StarCount }}
-
</span>
-
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
-
</button>
-
{{ if .DisableFork }}
-
<button
-
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
-
disabled
-
title="Empty repositories cannot be forked"
-
>
-
{{ i "git-fork" "w-4 h-4" }}
-
fork
-
</button>
-
{{ else }}
-
<a
-
class="btn text-sm no-underline hover:no-underline flex items-center gap-2 group"
-
hx-boost="true"
-
href="/{{ .FullName }}/fork"
-
>
-
{{ i "git-fork" "w-4 h-4" }}
-
fork
-
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
-
</a>
-
{{ end }}
-
</div>
-
{{ end }}
+26
appview/pages/templates/repo/fragments/repoStar.html
···
+
{{ define "repo/fragments/repoStar" }}
+
<button
+
id="starBtn"
+
class="btn disabled:opacity-50 disabled:cursor-not-allowed flex gap-2 items-center group"
+
{{ if .IsStarred }}
+
hx-delete="/star?subject={{ .RepoAt }}&countHint={{ .Stats.StarCount }}"
+
{{ else }}
+
hx-post="/star?subject={{ .RepoAt }}&countHint={{ .Stats.StarCount }}"
+
{{ end }}
+
+
hx-trigger="click"
+
hx-target="this"
+
hx-swap="outerHTML"
+
hx-disabled-elt="#starBtn"
+
>
+
{{ if .IsStarred }}
+
{{ i "star" "w-4 h-4 fill-current" }}
+
{{ else }}
+
{{ i "star" "w-4 h-4" }}
+
{{ end }}
+
<span class="text-sm">
+
{{ .Stats.StarCount }}
+
</span>
+
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+
</button>
+
{{ end }}
+2 -2
appview/state/star.go
···
s.notifier.NewStar(r.Context(), star)
-
s.pages.RepoActionsFragment(w, pages.RepoActionsFragmentParams{
+
s.pages.RepoStarFragment(w, pages.RepoStarFragmentParams{
IsStarred: true,
RepoAt: subjectUri,
Stats: db.RepoStats{
···
s.notifier.DeleteStar(r.Context(), star)
-
s.pages.RepoActionsFragment(w, pages.RepoActionsFragmentParams{
+
s.pages.RepoStarFragment(w, pages.RepoStarFragmentParams{
IsStarred: false,
RepoAt: subjectUri,
Stats: db.RepoStats{