diff --git a/frontend/src/app/context-switcher.tsx b/frontend/src/app/context-switcher.tsx
index ed45c6108d..61ac53c214 100644
--- a/frontend/src/app/context-switcher.tsx
+++ b/frontend/src/app/context-switcher.tsx
@@ -428,7 +428,14 @@ function ProjectSegmentPopover({
project: currentProject,
}),
);
- const label = projectData?.displayName ?? currentProject;
+ const { data: projects } = useInfiniteQuery(
+ useCloudDataProvider().currentOrgProjectsQueryOptions(),
+ );
+ const label =
+ projectData?.displayName ??
+ projects?.find((project) => project.name === currentProject)
+ ?.displayName ??
+ currentProject;
return (
@@ -451,19 +458,20 @@ function ProjectSegmentPopover({
}),
});
}}
- className="flex h-auto items-center gap-2 px-2 py-1 text-sm font-medium text-foreground rounded-lg hover:bg-foreground/[0.06]"
+ className="flex h-auto items-center gap-2 px-1 py-1 text-sm font-medium text-foreground rounded-lg hover:bg-foreground/[0.06]"
>
{label}
@@ -501,7 +509,16 @@ function NamespaceSegmentPopover({
namespace: currentNamespace,
}),
);
- const label = nsData?.displayName ?? currentNamespace;
+ const { data: namespaces } = useInfiniteQuery(
+ useCloudDataProvider().currentOrgProjectNamespacesQueryOptions({
+ project: currentProject,
+ }),
+ );
+ const label =
+ nsData?.displayName ??
+ namespaces?.find((namespace) => namespace.name === currentNamespace)
+ ?.displayName ??
+ currentNamespace;
return (
@@ -568,7 +585,14 @@ function EngineNamespaceSegmentPopover({
const { data: nsData } = useQuery(
useEngineCompatDataProvider().namespaceQueryOptions(currentNamespace),
);
- const label = nsData?.displayName ?? currentNamespace;
+ const { data: namespaces } = useInfiniteQuery(
+ useEngineCompatDataProvider().namespacesQueryOptions(),
+ );
+ const label =
+ nsData?.displayName ??
+ namespaces?.find((namespace) => namespace.name === currentNamespace)
+ ?.displayName ??
+ currentNamespace;
return (
diff --git a/frontend/src/app/help-button.tsx b/frontend/src/app/help-button.tsx
index bc1b0c5353..99cfc00d83 100644
--- a/frontend/src/app/help-button.tsx
+++ b/frontend/src/app/help-button.tsx
@@ -155,7 +155,7 @@ export function HelpButton({ source = "web" }: { source?: string }) {
-
+
{(Object.keys(IMPACT_LABELS) as Impact[]).map(
(k) => (
diff --git a/frontend/src/app/images-table.tsx b/frontend/src/app/images-table.tsx
index 5e2eef4514..3051022935 100644
--- a/frontend/src/app/images-table.tsx
+++ b/frontend/src/app/images-table.tsx
@@ -62,7 +62,9 @@ export function ImagesTable({
Tag
- Deployed To
+
+ Deployed To
+
Date
diff --git a/frontend/src/app/new-org-page.tsx b/frontend/src/app/new-org-page.tsx
index cf6ced42cd..ff35357983 100644
--- a/frontend/src/app/new-org-page.tsx
+++ b/frontend/src/app/new-org-page.tsx
@@ -139,7 +139,7 @@ function GradientAvatar({
}) {
return (
-
+
(
-
+
diff --git a/frontend/src/components/actors/actor-details-iframe.tsx b/frontend/src/components/actors/actor-details-iframe.tsx
index 3f497f2b31..17991ae828 100644
--- a/frontend/src/components/actors/actor-details-iframe.tsx
+++ b/frontend/src/components/actors/actor-details-iframe.tsx
@@ -623,7 +623,7 @@ function ActorDetailsIframePath({
ref={tabListRef}
className="flex-1 min-w-0 overflow-hidden h-full"
>
-
+
{displayedTabs.map((t) => (
-
+
{displayedTabs.map((t) => (
-
+
{PLACEHOLDER_TABS.map((t) => (
(
+
+
+
+
Stale retry timestamp
+
+
+
+);
diff --git a/frontend/src/components/actors/actor-status-label.tsx b/frontend/src/components/actors/actor-status-label.tsx
index 5d08591928..f9f46e6140 100644
--- a/frontend/src/components/actors/actor-status-label.tsx
+++ b/frontend/src/components/actors/actor-status-label.tsx
@@ -1,8 +1,8 @@
import { useQuery } from "@tanstack/react-query";
import { formatISO } from "date-fns";
import { isObject } from "lodash";
-import { formatValue } from "@/lib/format-value";
import { match, P } from "ts-pattern";
+import { formatValue } from "@/lib/format-value";
import type { RivetActorError } from "@/queries/types";
import { CodePreview } from "../code-preview/code-preview";
import { cn } from "../lib/utils";
@@ -67,15 +67,7 @@ export function QueriedActorStatusAdditionalInfo({
);
if (rescheduleTs) {
- return (
-
- Will try to start again{" "}
-
- (
- {formatISO(rescheduleTs)}){" "}
-
-
- );
+ return ;
}
if (error) {
@@ -85,6 +77,24 @@ export function QueriedActorStatusAdditionalInfo({
return null;
}
+export function ActorRescheduleStatus({
+ rescheduleTs,
+}: {
+ rescheduleTs: Date | number;
+}) {
+ const rescheduleAt = new Date(rescheduleTs);
+ const isOverdue = rescheduleAt.getTime() <= Date.now();
+
+ return (
+
+ {isOverdue ? "Retry was scheduled " : "Will try to start again "}
+
+ ({formatISO(rescheduleAt)}){" "}
+
+
+ );
+}
+
export function ActorError({ error }: { error: object | string }) {
return match(error)
.with(P.string, (errMsg) =>
diff --git a/frontend/src/components/actors/database/database-table.stories.tsx b/frontend/src/components/actors/database/database-table.stories.tsx
new file mode 100644
index 0000000000..47b9ba2602
--- /dev/null
+++ b/frontend/src/components/actors/database/database-table.stories.tsx
@@ -0,0 +1,79 @@
+import type { Story } from "@ladle/react";
+import { faTable, faTableCells, Icon } from "@rivet-gg/icons";
+import "../../../../.ladle/ladle.css";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "../../ui/select";
+import type { DatabaseColumn } from "../actor-inspector-context";
+import { DatabaseTable } from "./database-table";
+
+const columns: DatabaseColumn[] = [
+ {
+ cid: 0,
+ name: "id",
+ type: "INTEGER",
+ notnull: true,
+ dflt_value: null,
+ pk: true,
+ },
+ {
+ cid: 1,
+ name: "has_initialized",
+ type: "INTEGER",
+ notnull: true,
+ dflt_value: null,
+ pk: false,
+ },
+ {
+ cid: 2,
+ name: "input",
+ type: "BLOB",
+ notnull: false,
+ dflt_value: null,
+ pk: false,
+ },
+];
+
+export const SchemaTypesAndBlob: Story = () => (
+
+
+
+
+
+
+
+
+ main._rivet_actor
+
+ (3 columns, 1 row)
+
+
+
+
+
+
+);
diff --git a/frontend/src/components/actors/database/database-table.tsx b/frontend/src/components/actors/database/database-table.tsx
index b65d4f9e64..50dc224381 100644
--- a/frontend/src/components/actors/database/database-table.tsx
+++ b/frontend/src/components/actors/database/database-table.tsx
@@ -134,7 +134,7 @@ export function DatabaseTable({
width: table.getTotalSize(),
}}
>
-
+
{table.getHeaderGroups().map((headerGroup) => (
{headerGroup.headers.map((header) => {
@@ -168,6 +168,7 @@ export function DatabaseTable({
icon={
faArrowUpWideShort
}
+ className="size-3 shrink-0 text-muted-foreground"
/>
) : header.column.getIsSorted() ===
"desc" ? (
@@ -175,10 +176,12 @@ export function DatabaseTable({
icon={
faArrowDownWideShort
}
+ className="size-3 shrink-0 text-muted-foreground"
/>
) : (
)
) : null}
@@ -334,9 +337,9 @@ function createColumns(
...columns.map((col) =>
ch.accessor(col.name, {
header: () => (
-
- {col.name}{" "}
-
+
+ {col.name}
+
{col.type}
@@ -356,14 +359,14 @@ export function renderDatabaseCellValue(
): ReactNode {
if (isBlobColumn(column, value)) {
return (
-
+
BINARY
);
}
if (value === null) {
return (
-
+
NULL
);
diff --git a/frontend/src/routes/_context/orgs.$organization/projects.$project/ns.$namespace/deployments.tsx b/frontend/src/routes/_context/orgs.$organization/projects.$project/ns.$namespace/deployments.tsx
index 9af44dfcbb..d2f3b49483 100644
--- a/frontend/src/routes/_context/orgs.$organization/projects.$project/ns.$namespace/deployments.tsx
+++ b/frontend/src/routes/_context/orgs.$organization/projects.$project/ns.$namespace/deployments.tsx
@@ -143,7 +143,7 @@ function Deployments() {
});
return (
-