From d66a474522e6f0ea3fc598c0a9afbef56de791a2 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Mon, 15 Sep 2025 09:13:06 +0000 Subject: [PATCH] appview/pages: display DID format labels handles Signed-off-by: oppiliappan --- appview/labels/labels.go | 49 +++++++++++++++++++++++++------------------------ appview/pages/templates/repo/fragments/addLabelModal.html | 48 ++++++++++++++++++++++++++++-------------------- appview/pages/templates/repo/issues/fragments/commentList.html | 8 ++++---- appview/pages/templates/repo/settings/fragments/addLabelDefModal.html | 17 +++++++++++++---- appview/pages/templates/repo/settings/fragments/labelListing.html | 32 +++++++++++++++++++------------- appview/pages/templates/repo/settings/general.html | 4 ++-- 6 file(s) changed, 91 insertion(s)(+), 67 deletion(s)(-) diff --git a/appview/labels/labels.go b/appview/labels/labels.go --- a/appview/labels/labels.go +++ b/appview/labels/labels.go @@ -15,48 +15,38 @@ lexutil "github.com/bluesky-social/indigo/lex/util" "github.com/go-chi/chi/v5" "tangled.sh/tangled.sh/core/api/tangled" - "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" "tangled.sh/tangled.sh/core/appview/middleware" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" - "tangled.sh/tangled.sh/core/appview/reporesolver" + "tangled.sh/tangled.sh/core/appview/validator" "tangled.sh/tangled.sh/core/appview/xrpcclient" - "tangled.sh/tangled.sh/core/eventconsumer" - "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/log" - "tangled.sh/tangled.sh/core/rbac" "tangled.sh/tangled.sh/core/tid" ) type Labels struct { - repoResolver *reporesolver.RepoResolver - idResolver *idresolver.Resolver - oauth *oauth.OAuth - pages *pages.Pages - db *db.DB - logger *slog.Logger + oauth *oauth.OAuth + pages *pages.Pages + db *db.DB + logger *slog.Logger + validator *validator.Validator } func New( oauth *oauth.OAuth, - repoResolver *reporesolver.RepoResolver, pages *pages.Pages, - spindlestream *eventconsumer.Consumer, - idResolver *idresolver.Resolver, db *db.DB, - config *config.Config, - enforcer *rbac.Enforcer, + validator *validator.Validator, ) *Labels { logger := log.New("labels") return &Labels{ - oauth: oauth, - repoResolver: repoResolver, - pages: pages, - idResolver: idResolver, - db: db, - logger: logger, + oauth: oauth, + pages: pages, + db: db, + logger: logger, + validator: validator, } } @@ -107,8 +97,6 @@ IndexedAt: indexedAt, }) } - // TODO: validate the operations - // find all the labels that this repo subscribes to repoLabels, err := db.GetRepoLabels(l.db, db.FilterEq("repo_at", repoAt)) if err != nil { @@ -127,6 +115,17 @@ http.Error(w, "Invalid form data", http.StatusBadRequest) return } + for i := range labelOps { + def := actx.Defs[labelOps[i].OperandKey] + if err := l.validator.ValidateLabelOp(def, &labelOps[i]); err != nil { + l.logger.Error("form failed to validate", "err", err) + http.Error(w, "Invalid form data", http.StatusBadRequest) + return + } + + l.logger.Info("value changed to: ", "v", labelOps[i].OperandValue) + } + // calculate the start state by applying already known labels existingOps, err := db.GetLabelOps(l.db, db.FilterEq("subject", subjectUri)) if err != nil { @@ -136,6 +135,8 @@ } labelState := db.NewLabelState() actx.ApplyLabelOps(labelState, existingOps) + + l.logger.Info("state", "state", labelState) // next, apply all ops introduced in this request and filter out ones that are no-ops validLabelOps := labelOps[:0] diff --git a/appview/pages/templates/repo/fragments/addLabelModal.html b/appview/pages/templates/repo/fragments/addLabelModal.html --- a/appview/pages/templates/repo/fragments/addLabelModal.html +++ b/appview/pages/templates/repo/fragments/addLabelModal.html @@ -5,7 +5,7 @@ {{ $state := .state }} {{ with $root }}
-
+
{{ $id := 0 }} {{ range $k, $valset := $state.Inner }} {{ $d := index $root.LabelDefs $k }} {{ range $v, $s := $valset }} -
- - {{ template "valueTypeInput" (dict "valueType" $d.ValueType "value" $v "key" $k) }} - - {{ $id = add $id 1 }} -
+ {{ template "labelCheckbox" (dict "def" $d "key" $k "val" $v "id" $id "isChecked" true) }} + {{ $id = add $id 1 }} {{ end }} {{ end }} {{ range $k, $d := $root.LabelDefs }} {{ if not ($state.ContainsLabel $k) }} -
- - {{ template "valueTypeInput" (dict "valueType" $d.ValueType "value" "" "key" $k) }} - - {{ $id = add $id 1 }} -
+ {{ template "labelCheckbox" (dict "def" $d "key" $k "val" "" "id" $id "isChecked" false) }} + {{ $id = add $id 1 }} {{ end }} + {{ else }} + + No labels defined yet. You can define custom labels in settings. + {{ end }}
@@ -68,6 +58,20 @@ {{ end }} {{ end }} +{{ define "labelCheckbox" }} + {{ $key := .key }} + {{ $val := .val }} + {{ $def := .def }} + {{ $id := .id }} + {{ $isChecked := .isChecked }} +
+ + + + +
+{{ end }} + {{ define "valueTypeInput" }} {{ $valueType := .valueType }} {{ $value := .value }} @@ -110,7 +114,11 @@ {{ end }} {{ define "stringTypeInput" }} + {{ $valueType := .valueType }} {{ $value := .value }} + {{ if $valueType.IsDidFormat }} + {{ $value = resolve .value }} + {{ end }} {{ end }} diff --git a/appview/pages/templates/repo/issues/fragments/commentList.html b/appview/pages/templates/repo/issues/fragments/commentList.html --- a/appview/pages/templates/repo/issues/fragments/commentList.html +++ b/appview/pages/templates/repo/issues/fragments/commentList.html @@ -3,7 +3,7 @@
{{ range $item := .CommentList }} {{ template "commentListing" (list $ .) }} {{ end }} -
+
{{ end }} {{ define "commentListing" }} @@ -16,14 +16,14 @@ "LoggedInUser" $root.LoggedInUser "Issue" $root.Issue "Comment" $comment.Self) }} -
+
{{ template "topLevelComment" $params }} -
+
{{ range $index, $reply := $comment.Replies }}
-
+
{{ diff --git a/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html b/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html --- a/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html +++ b/appview/pages/templates/repo/settings/fragments/addLabelDefModal.html @@ -3,6 +3,7 @@

Labels can have a name and a value. Set the value type to "none" to create a simple label.

@@ -16,19 +17,27 @@
-
+
@@ -87,7 +96,7 @@ document.getElementById('value-type').addEventListener('change', function() { const constrainValues = document.getElementById('constrain-values'); const selectedValue = this.value; - if (selectedValue === 'string' || selectedValue === 'integer') { + if (selectedValue === 'string') { constrainValues.classList.remove('hidden'); } else { constrainValues.classList.add('hidden'); diff --git a/appview/pages/templates/repo/settings/fragments/labelListing.html b/appview/pages/templates/repo/settings/fragments/labelListing.html --- a/appview/pages/templates/repo/settings/fragments/labelListing.html +++ b/appview/pages/templates/repo/settings/fragments/labelListing.html @@ -5,24 +5,30 @@
{{ template "labels/fragments/labelDef" $label }}
- {{ $label.ValueType.Type }} + {{ $label.ValueType.Type }} type {{ if $label.ValueType.IsEnumType }} {{ join $label.ValueType.Enum ", " }} {{ end }} + {{ if $label.ValueType.IsDidFormat }} + + DID format + {{ end }}
- + {{ if $root.RepoInfo.Roles.IsOwner }} + + {{ end }}
{{ end }} diff --git a/appview/pages/templates/repo/settings/general.html b/appview/pages/templates/repo/settings/general.html --- a/appview/pages/templates/repo/settings/general.html +++ b/appview/pages/templates/repo/settings/general.html @@ -57,7 +57,7 @@
+ class="bg-white w-full sm:w-[30rem] 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" . }}
-- tangled.sh