forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

appview/pages: show labels in repository settings page

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li 45e331ab d252ce0b

verified
Changed files
+103
appview
db
pages
templates
repo
settings
repo
+24
appview/db/repos.go
···
Created time.Time
Description string
Spindle string
+
Labels []string
// optionally, populate this when querying for reverse mappings
RepoStats *RepoStats
···
for _, r := range repoMap {
args[i] = r.RepoAt()
i++
+
}
+
+
// Get labels for all repos
+
labelsQuery := fmt.Sprintf(
+
`select repo_at, label_at from repo_labels where repo_at in (%s)`,
+
inClause,
+
)
+
rows, err = e.Query(labelsQuery, args...)
+
if err != nil {
+
return nil, fmt.Errorf("failed to execute labels query: %w ", err)
+
}
+
for rows.Next() {
+
var repoat, labelat string
+
if err := rows.Scan(&repoat, &labelat); err != nil {
+
log.Println("err", "err", err)
+
continue
+
}
+
if r, ok := repoMap[syntax.ATURI(repoat)]; ok {
+
r.Labels = append(r.Labels, labelat)
+
}
+
}
+
if err = rows.Err(); err != nil {
+
return nil, fmt.Errorf("failed to execute labels query: %w ", err)
}
languageQuery := fmt.Sprintf(
+1
appview/pages/pages.go
···
type RepoGeneralSettingsParams struct {
LoggedInUser *oauth.User
RepoInfo repoinfo.RepoInfo
+
Labels []db.LabelDefinition
Active string
Tabs []map[string]any
Tab string
+28
appview/pages/templates/repo/settings/fragments/labelListing.html
···
+
{{ define "repo/settings/fragments/labelListing" }}
+
{{ $root := index . 0 }}
+
{{ $label := index . 1 }}
+
<div id="label-{{$label.Id}}" class="flex items-center justify-between p-2 pl-4">
+
<div class="flex flex-col gap-1 text-sm min-w-0 max-w-[80%]">
+
{{ template "labels/fragments/labelDef" $label }}
+
<div class="flex flex-wrap text items-center gap-1 text-gray-500 dark:text-gray-400">
+
{{ $label.ValueType.Type }}
+
{{ if $label.ValueType.IsEnumType }}
+
<span class="before:content-['·'] before:select-none"></span>
+
{{ join $label.ValueType.Enum ", " }}
+
{{ end }}
+
</div>
+
</div>
+
<button
+
class="btn text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 gap-2 group"
+
title="Delete label"
+
hx-delete="/{{ $root.RepoInfo.FullName }}/settings/label"
+
hx-swap="none"
+
hx-vals='{"label-id": "{{ $label.Id }}"}'
+
hx-confirm="Are you sure you want to delete the label `{{ $label.Name }}`?"
+
>
+
{{ i "trash-2" "w-5 h-5" }}
+
<span class="hidden md:inline">delete</span>
+
{{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
+
</button>
+
</div>
+
{{ end }}
+42
appview/pages/templates/repo/settings/general.html
···
</div>
<div class="col-span-1 md:col-span-3 flex flex-col gap-6 p-2">
{{ template "branchSettings" . }}
+
{{ template "labelSettings" . }}
{{ template "deleteRepo" . }}
<div id="operation-error" class="text-red-500 dark:text-red-400"></div>
</div>
···
</div>
{{ end }}
+
{{ define "labelSettings" }}
+
<div class="flex flex-col gap-2">
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 items-center">
+
<div class="col-span-1 md:col-span-2">
+
<h2 class="text-sm pb-2 uppercase font-bold">Labels</h2>
+
<p class="text-gray-500 dark:text-gray-400">
+
Manage your issues and pulls by creating labels to categorize them.
+
Only repository owners may configure labels.
+
</p>
+
</div>
+
<div class="col-span-1 md:col-span-1 md:justify-self-end">
+
<button
+
class="btn flex items-center gap-2"
+
popovertarget="add-labeldef-modal"
+
{{ if not (or .RepoInfo.Roles.IsOwner .RepoInfo.Roles.IsCollaborator) }}disabled{{ end }}
+
popovertargetaction="toggle">
+
{{ i "plus" "size-4" }}
+
add label
+
</button>
+
<div
+
id="add-labeldef-modal"
+
popover
+
class="bg-white w-full sm:w-96 dark:bg-gray-800 p-6 rounded border border-gray-200 dark:border-gray-700 drop-shadow dark:text-white backdrop:bg-gray-400/50 dark:backdrop:bg-gray-800/50">
+
{{ template "repo/settings/fragments/addLabelDefModal" . }}
+
</div>
+
</div>
+
</div>
+
<div class="flex flex-col rounded border border-gray-200 dark:border-gray-700 divide-y divide-gray-200 dark:divide-gray-700 w-full">
+
{{ range .Labels }}
+
{{ template "repo/settings/fragments/labelListing" (list $ .) }}
+
{{ else }}
+
<div class="flex items-center justify-center p-2 text-gray-500">
+
no labels added yet
+
</div>
+
{{ end }}
+
</div>
+
<div id="label-operation" class="error"></div>
+
</div>
+
{{ end }}
+
{{ define "deleteRepo" }}
{{ if .RepoInfo.Roles.RepoDeleteAllowed }}
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 items-center">
···
</div>
{{ end }}
{{ end }}
+
+8
appview/repo/repo.go
···
return
+
labels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", f.Repo.Labels))
+
if err != nil {
+
log.Println("failed to fetch labels", err)
+
rp.pages.Error503(w)
+
return
+
}
+
rp.pages.RepoGeneralSettings(w, pages.RepoGeneralSettingsParams{
LoggedInUser: user,
RepoInfo: f.RepoInfo(user),
Branches: result.Branches,
+
Labels: labels,
Tabs: settingsTabs,
Tab: "general",
})