Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 3 additions & 7 deletions docs/admin-ui.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ The dashboard opens at `/ui` and combines the daily operational view in one plac

## Navigator

The _Navigator_ page links to the main workspace areas: streams, queries, projections, subscriptions, users, operations, observability, and configuration.
The _Navigator_ page links to the main workspace areas: streams, projections, subscriptions, users, operations, observability, and configuration.

## Observability

Expand All @@ -37,15 +37,11 @@ The _Streams_ page lets you find recently created or changed streams and open a

- paged event browsing
- event detail views with data and metadata
- append, metadata, ACL, delete, and query actions

## Query

The _Query_ page runs transient JavaScript projections for short-lived analysis and can stop the generated transient projection from the same page.
- append, metadata, ACL, and delete actions

## Projections

The _Projections_ page shows user, system, and optionally transient projections. It supports creating projections, creating standard projections, bulk enable or disable, and opening a projection for inspection.
The _Projections_ page shows user and system projections. It supports creating projections, creating standard projections, bulk enable or disable, and opening a projection for inspection.

Projection detail pages provide source, status, config, state, result, debug, edit, reset, and delete workflows. Projection features are available when projections are enabled on the node.

Expand Down
3 changes: 1 addition & 2 deletions docs/projections.md
Original file line number Diff line number Diff line change
Expand Up @@ -514,8 +514,7 @@ Once the projection is running, open the Admin UI, go to _Projections_, select t
_Debug_. The debug page shows the current projection source, state payload, and status, with actions to stop or
reset the projection when the runtime state needs to be cleared.

Use _Open in query_ to run the projection source as a transient query, or _Edit source_ to change the persistent
projection definition.
Use _Edit source_ to change the persistent projection definition.

## Projections settings

Expand Down
1 change: 0 additions & 1 deletion src/EventStore.ClusterNode/Components/Layout/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
<p class="px-3 text-xs font-black uppercase tracking-[0.22em] text-es-muted">Data plane</p>
<div class="mt-2 grid gap-1">
<NavLink href="/ui/streams" class="@LinkClass" ActiveClass="@ActiveClass">Streams</NavLink>
<NavLink href="/ui/query" class="@LinkClass" ActiveClass="@ActiveClass">Query</NavLink>
<NavLink href="/ui/projections" class="@LinkClass" ActiveClass="@ActiveClass">Projections</NavLink>
<NavLink href="/ui/subscriptions" class="@LinkClass" ActiveClass="@ActiveClass">Subscriptions</NavLink>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
<section class="mt-8 grid gap-5 md:grid-cols-2 xl:grid-cols-3">
<SurfaceCard Eyebrow="Data" Title="Streams" Description="Browse streams and inspect events." Href="/ui/streams" LinkText="Open streams" />
<SurfaceCard Eyebrow="Data" Title="Append event" Description="Create a JSON event from the Admin UI." Href="/ui/streams/append" LinkText="Add event" />
<SurfaceCard Eyebrow="Data" Title="Query" Description="Run transient projection queries and inspect the created result surfaces." Href="/ui/query" LinkText="Open query" />
<SurfaceCard Eyebrow="Processing" Title="Projections" Description="Inspect projection status, progress, and diagnostics." Href="/ui/projections" LinkText="Open projections" />
<SurfaceCard Eyebrow="Consumers" Title="Subscriptions" Description="Review persistent subscription groups, parked messages, and consumer progress." Href="/ui/subscriptions" LinkText="Open subscriptions" />
<SurfaceCard Eyebrow="Security" Title="Users" Description="Inspect accounts, groups, and the current authenticated request." Href="/ui/users" LinkText="Open users" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@
<AntiforgeryToken />
<button class="rounded-2xl border border-es-ink/10 bg-white px-5 py-3 text-sm font-black text-es-ink transition hover:border-es-green/30 hover:text-es-forest" type="submit">Reset</button>
</EditForm>
<a class="rounded-2xl bg-es-ink px-5 py-3 text-sm font-black text-white shadow-lg shadow-es-ink/15 transition hover:bg-es-green" href="@QueryHref">Open in query</a>
<a class="rounded-2xl border border-es-ink/10 bg-white px-5 py-3 text-sm font-black text-es-ink transition hover:border-es-green/30 hover:text-es-forest" href="@EditHref">Edit source</a>
</div>
</article>
Expand Down Expand Up @@ -105,7 +104,6 @@
private string LinkName => Page?.Name ?? Name;
private string DetailHref => $"/ui/projections/{Uri.EscapeDataString(LinkName)}";
private string EditHref => $"/ui/projections/edit/{Uri.EscapeDataString(LinkName)}";
private string QueryHref => $"/ui/query?location={Uri.EscapeDataString(LinkName)}";

protected override async Task OnParametersSetAsync() {
DisableInput ??= new();
Expand Down
22 changes: 9 additions & 13 deletions src/EventStore.ClusterNode/Components/Pages/Projections.razor
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
<div class="mt-6 flex flex-wrap gap-2">
<a class="rounded-2xl bg-es-ink px-5 py-3 text-sm font-black text-white shadow-lg shadow-es-ink/15 transition hover:bg-es-green" href="/ui/projections/new">New projection</a>
<a class="rounded-2xl border border-es-ink/10 bg-white px-5 py-3 text-sm font-black text-es-ink transition hover:border-es-green/30 hover:text-es-forest" href="/ui/projections/standard">New standard projection</a>
<a class="rounded-2xl border border-es-ink/10 bg-white px-5 py-3 text-sm font-black text-es-ink transition hover:border-es-green/30 hover:text-es-forest" href="@(Page?.ToggleQueriesHref ?? (IncludeQueries ? "/ui/projections" : "/ui/projections?includeQueries=true"))">@(Page?.ToggleQueriesLabel ?? (IncludeQueries ? "Hide transient queries" : "Include transient queries"))</a>
</div>
</div>
<div class="grid gap-3 rounded-[2rem] border border-white/80 bg-white/85 p-6 shadow-[0_20px_70px_rgba(23,32,51,0.09)] sm:grid-cols-3">
Expand Down Expand Up @@ -55,7 +54,7 @@
{
<div class="overflow-hidden rounded-[2rem] border border-white/80 bg-white/85 shadow-[0_20px_70px_rgba(23,32,51,0.09)]">
<div class="flex flex-wrap items-center justify-between gap-3 border-b border-es-ink/10 px-5 py-4">
<p class="text-sm font-bold text-es-muted">Showing @(Page.IncludeQueries ? "all projections including transient queries" : "non-transient projections").</p>
<p class="text-sm font-bold text-es-muted">Showing non-transient projections.</p>
<div class="flex flex-wrap gap-2">
<EditForm Model="EnableAllInput" FormName="projection-enable-all" OnValidSubmit="EnableAll">
<AntiforgeryToken />
Expand Down Expand Up @@ -128,8 +127,6 @@
</section>

@code {
[SupplyParameterFromQuery] public bool IncludeQueries { get; set; }

[SupplyParameterFromForm(FormName = "projection-enable-all")]
private ProjectionBulkInput EnableAllInput { get; set; }

Expand All @@ -138,8 +135,7 @@

private ProjectionListPage Page { get; set; }
private ProjectionBulkCommandResult CommandResult { get; set; }
private string EmptyProjectionsMessage =>
Page?.IncludeQueries == true ? "No projections are available." : "No non-transient projections are available.";
private const string EmptyProjectionsMessage = "No non-transient projections are available.";

protected override async Task OnParametersSetAsync() {
EnableAllInput ??= new();
Expand All @@ -149,21 +145,21 @@

try
{
Page = await ProjectionBrowser.ReadAll(IncludeQueries);
Page = await ProjectionBrowser.ReadAll();
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
Page = ProjectionListPage.Unavailable($"Failed to load projections: {UiMessages.Friendly(ex)}", IncludeQueries);
Page = ProjectionListPage.Unavailable($"Failed to load projections: {UiMessages.Friendly(ex)}");
}
}

private async Task EnableAll() {
try {
CommandResult = await ProjectionBrowser.EnableAll(IncludeQueries);
CommandResult = await ProjectionBrowser.EnableAll();
} catch (OperationCanceledException) {
CommandResult = ProjectionBulkCommandResult.Failure("Enable projections was canceled.");
return;
Expand All @@ -177,7 +173,7 @@

private async Task DisableAll() {
try {
CommandResult = await ProjectionBrowser.DisableAll(IncludeQueries);
CommandResult = await ProjectionBrowser.DisableAll();
} catch (OperationCanceledException) {
CommandResult = ProjectionBulkCommandResult.Failure("Disable projections was canceled.");
return;
Expand All @@ -191,11 +187,11 @@

private async Task RefreshAfterBulkAction() {
try {
Page = await ProjectionBrowser.ReadAll(IncludeQueries);
Page = await ProjectionBrowser.ReadAll();
} catch (OperationCanceledException) {
Page = ProjectionListPage.Unavailable("Projection command completed, but refresh was canceled.", IncludeQueries);
Page = ProjectionListPage.Unavailable("Projection command completed, but refresh was canceled.");
} catch (Exception ex) {
Page = ProjectionListPage.Unavailable($"Projection command completed, but refresh failed: {UiMessages.Friendly(ex)}", IncludeQueries);
Page = ProjectionListPage.Unavailable($"Projection command completed, but refresh failed: {UiMessages.Friendly(ex)}");
}
}

Expand Down
211 changes: 0 additions & 211 deletions src/EventStore.ClusterNode/Components/Pages/Query.razor

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
{
<a class="rounded-2xl border border-red-200 bg-red-50 px-5 py-3 text-sm font-black text-red-800 transition hover:border-red-300 hover:bg-red-100" href="@($"/ui/streams/delete/{Uri.EscapeDataString(StreamId)}")">Delete</a>
}
<a class="rounded-2xl border border-es-ink/10 bg-white px-5 py-3 text-sm font-black text-es-ink transition hover:border-es-green/30 hover:text-es-forest" href="@($"/ui/query?initStreamId={Uri.EscapeDataString(StreamId)}")">Query</a>
</div>
</section>

Expand Down
Loading
Loading