diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2023-05-09 18:25:02 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2023-05-10 09:02:53 +0200 |
| commit | dfd5a9acc134f1ea849a49efee7dd7f50c836e75 (patch) | |
| tree | ac41d021e09d5b8ac2c70938d59432092415e798 /pkg/html | |
| parent | 1964022bd4ae3c35688b98f6a4db45076c7d002c (diff) | |
dashboard: support filtering over multiple labels
For each label, allow only one value to be specified.
At the same time, allow multiple different labels (subsystem, origin,
prio, etc) be specified together.
Diffstat (limited to 'pkg/html')
| -rw-r--r-- | pkg/html/html.go | 29 | ||||
| -rw-r--r-- | pkg/html/html_test.go | 49 |
2 files changed, 76 insertions, 2 deletions
diff --git a/pkg/html/html.go b/pkg/html/html.go index 72c2956e0..930fdd923 100644 --- a/pkg/html/html.go +++ b/pkg/html/html.go @@ -194,6 +194,30 @@ func commitLink(repo, commit string) string { } func AmendURL(baseURL, key, value string) string { + return TransformURL(baseURL, key, func(_ []string) []string { + if value == "" { + return nil + } + return []string{value} + }) +} + +func DropParam(baseURL, key, value string) string { + return TransformURL(baseURL, key, func(oldValues []string) []string { + if value == "" { + return nil + } + var newValues []string + for _, iterVal := range oldValues { + if iterVal != value { + newValues = append(newValues, iterVal) + } + } + return newValues + }) +} + +func TransformURL(baseURL, key string, f func([]string) []string) string { if baseURL == "" { return "" } @@ -202,10 +226,11 @@ func AmendURL(baseURL, key, value string) string { return "" } values := parsed.Query() - if value == "" { + ret := f(values[key]) + if len(ret) == 0 { values.Del(key) } else { - values.Set(key, value) + values[key] = ret } parsed.RawQuery = values.Encode() return parsed.String() diff --git a/pkg/html/html_test.go b/pkg/html/html_test.go new file mode 100644 index 000000000..d824e0246 --- /dev/null +++ b/pkg/html/html_test.go @@ -0,0 +1,49 @@ +// Copyright 2023 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package html + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDropParam(t *testing.T) { + tests := []struct { + in string + key string + value string + out string + }{ + { + in: `/upstream?first=a&second=b`, + key: `first`, + value: ``, + out: `/upstream?second=b`, + }, + { + in: `/upstream?first=a&first=b&second=c`, + key: `second`, + value: ``, + out: `/upstream?first=a&first=b`, + }, + { + in: `/upstream?first=a&first=b&second=c`, + key: `first`, + value: ``, + out: `/upstream?second=c`, + }, + { + in: `/upstream?first=a&first=b&second=c`, + key: `first`, + value: `b`, + out: `/upstream?first=a&second=c`, + }, + } + + for _, test := range tests { + got := DropParam(test.in, test.key, test.value) + assert.Equal(t, test.out, got) + } +} |
