Skip to content
Draft
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
88ffa19
feat: add tags to explore and canvas dashboards for project-level org…
royendo Apr 22, 2026
e1baab5
feat: persist dashboards tag filter in URL
royendo Apr 22, 2026
cc69880
feat: add tagAsFolders feature flag for folder-style dashboard organi…
royendo Apr 22, 2026
1fd640f
fix: hide tag filter in folder mode; unify folders under one parent b…
royendo Apr 22, 2026
3f17d37
fix: hide tag pills on dashboard rows in folder mode
royendo Apr 22, 2026
9381af7
fix: restore dashboard breadcrumb and hide tag pills when tagAsFolder…
royendo Apr 22, 2026
1488ea8
fix: preserve non-explore URL params (e.g. ?tags=) across explore sta…
royendo Apr 22, 2026
98626eb
feat: always show tag folder breadcrumb on dashboard pages
royendo Apr 22, 2026
001fa6d
fix: scope dashboard breadcrumb dropdown to the active tag folder
royendo Apr 22, 2026
bf47792
Update DashboardStateSync.ts
royendo Apr 23, 2026
ab4b206
tags to top level;
royendo Apr 23, 2026
8a51dde
Merge branch 'main' into worktree-feat-project-dashboard-organization
royendo Apr 23, 2026
30acdfa
feat: tag filter for Resources and Tables pages
royendo Apr 23, 2026
3955a43
Merge remote-tracking branch 'origin/main' into worktree-feat-project…
royendo Apr 24, 2026
88bc52d
Update resource-filter-utils.spec.ts
royendo Apr 24, 2026
e4cc524
fix: declare `availableTags` before `filterGroups` reads it
royendo Apr 24, 2026
1a2b3f1
Merge remote-tracking branch 'origin/main' into worktree-feat-project…
royendo Apr 27, 2026
4546946
fix
royendo Apr 27, 2026
0b99483
fix: drop duplicate `onFilterChange` declaration in `ProjectTables`
royendo Apr 27, 2026
2c6c70f
fix: render "Not Tagged" label and add `tags` to `V1ResourceMeta`
royendo Apr 27, 2026
fc452bd
nit: comment update
begelundmuller May 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,687 changes: 854 additions & 833 deletions proto/gen/rill/runtime/v1/resources.pb.go

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions proto/gen/rill/runtime/v1/runtime.swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4403,6 +4403,11 @@ definitions:
items:
type: string
title: Array of dimension or measure names
tags:
type: array
items:
type: string
description: Tags for organizing and filtering the canvas on the project dashboards list.
v1CanvasState:
type: object
properties:
Expand Down Expand Up @@ -5252,6 +5257,11 @@ definitions:
definedInMetricsView:
type: boolean
description: When true, it indicates that the explore was defined in a metrics view either explicitly or emitted because version was not set.
tags:
type: array
items:
type: string
description: Tags for organizing and filtering the explore on the project dashboards list.
v1ExploreState:
type: object
properties:
Expand Down
4 changes: 4 additions & 0 deletions proto/rill/runtime/v1/resources.proto
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,8 @@ message ExploreSpec {
bool allow_custom_time_range = 20;
// When true, it indicates that the explore was defined in a metrics view either explicitly or emitted because version was not set.
bool defined_in_metrics_view = 21;
// Tags for organizing and filtering the explore on the project dashboards list.
repeated string tags = 22;
}

message ExploreState {
Expand Down Expand Up @@ -866,6 +868,8 @@ message CanvasSpec {
repeated SecurityRule security_rules = 6;
// Array of dimension or measure names
repeated string pinned_filters = 16;
// Tags for organizing and filtering the canvas on the project dashboards list.
repeated string tags = 19;
}

message CanvasState {
Expand Down
2 changes: 2 additions & 0 deletions runtime/parser/parse_canvas.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ type CanvasYAML struct {
} `yaml:"items"`
}
Security *SecurityPolicyYAML `yaml:"security"`
Tags []string `yaml:"tags"`
Comment thread
royendo marked this conversation as resolved.
Outdated
}

func (p *Parser) parseCanvas(node *Node) error {
Expand Down Expand Up @@ -288,6 +289,7 @@ func (p *Parser) parseCanvas(node *Node) error {
r.CanvasSpec.Rows = rows
r.CanvasSpec.SecurityRules = rules
r.CanvasSpec.PinnedFilters = tmp.Filters.Pinned
r.CanvasSpec.Tags = tmp.Tags

// Track inline components
for _, def := range inlineComponentDefs {
Expand Down
2 changes: 2 additions & 0 deletions runtime/parser/parse_explore.go
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Handling is missing in the code for unified metrics and explores in parse_metrics_view.go

Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ type ExploreYAML struct {
HidePivot bool `yaml:"hide_pivot"`
} `yaml:"embeds"`
Security *SecurityPolicyYAML `yaml:"security"`
Tags []string `yaml:"tags"`
Comment thread
royendo marked this conversation as resolved.
Outdated
}

// ExploreTimeRangeYAML represents a time range in an ExploreYAML.
Expand Down Expand Up @@ -295,6 +296,7 @@ func (p *Parser) parseExplore(node *Node) error {
r.ExploreSpec.SecurityRules = rules
r.ExploreSpec.LockTimeZone = tmp.LockTimeZone
r.ExploreSpec.AllowCustomTimeRange = allowCustomTimeRange
r.ExploreSpec.Tags = tmp.Tags

return nil
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<script lang="ts">
import { beforeNavigate } from "$app/navigation";
import * as DropdownMenu from "@rilldata/web-common/components/dropdown-menu";
import CaretDownIcon from "@rilldata/web-common/components/icons/CaretDownIcon.svelte";
import CaretUpIcon from "@rilldata/web-common/components/icons/CaretUpIcon.svelte";
import { Search } from "@rilldata/web-common/components/search";

export let availableTags: string[] = [];
export let selectedTags: string[] = [];
export let onTagsChange: (tags: string[]) => void;
export let searchText = "";

let tagsOpen = false;

beforeNavigate(() => {
searchText = "";
});

function toggleTag(tag: string) {
onTagsChange(
selectedTags.includes(tag)
? selectedTags.filter((t) => t !== tag)
: [...selectedTags, tag],
);
}

$: tagsLabel =
selectedTags.length === 0
? "All tags"
: selectedTags.length === 1
? selectedTags[0]
: `${selectedTags[0]}, +${selectedTags.length - 1} other${selectedTags.length > 2 ? "s" : ""}`;
</script>

<div class="flex flex-row items-center gap-x-2">
{#if availableTags.length > 0}
<DropdownMenu.Root bind:open={tagsOpen}>
<DropdownMenu.Trigger
class="min-w-fit min-h-9 flex flex-row gap-1 items-center rounded-sm border bg-input {tagsOpen
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: should this be min-h-7. Height of the tag dropdown and search do not match if it is min-h-9.

? 'bg-gray-200'
: 'hover:bg-surface-hover'} px-2 py-1"
>
<span class="text-fg-secondary font-medium text-sm">{tagsLabel}</span>
{#if tagsOpen}
<CaretUpIcon size="12px" />
{:else}
<CaretDownIcon size="12px" />
{/if}
</DropdownMenu.Trigger>
<DropdownMenu.Content align="start" class="w-48 max-h-72 overflow-y-auto">
{#each availableTags as tag (tag)}
<DropdownMenu.CheckboxItem
checked={selectedTags.includes(tag)}
onCheckedChange={() => toggleTag(tag)}
>
{tag}
</DropdownMenu.CheckboxItem>
{/each}
</DropdownMenu.Content>
</DropdownMenu.Root>
{/if}

<div class="flex-1 min-w-0">
<Search
placeholder="Search"
autofocus={false}
bind:value={searchText}
rounded="lg"
/>
</div>
</div>
Loading
Loading