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
9 changes: 7 additions & 2 deletions apps/web/app/gen2/[workspaceId]/superset/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { notFound } from "next/navigation";
import type { Metadata } from "next";

import { SupersetFilePane } from "@/components/gen2/superset-file-pane";
import { SupersetWorkspaceShell } from "@/components/gen2/superset-workspace-shell";
import { requireUser } from "@/lib/auth/session";
import { Gen2AccessError } from "@/lib/gen2/errors";
import { isGen2SupersetFilePaneEnabled } from "@/lib/gen2/superset-file-feature";
import { isGen2SupersetRuntimeEnabled } from "@/lib/gen2/superset-runtime-feature";
import { getGen2WorkspaceDetail } from "@/lib/gen2/workspaces";

export const metadata: Metadata = { title: "Superset files" };
Expand All @@ -28,6 +29,10 @@ export default async function Gen2SupersetFilesPage({
}

return (
<SupersetFilePane workspaceId={workspaceId} canEdit={role !== "viewer"} />
<SupersetWorkspaceShell
workspaceId={workspaceId}
canEdit={role !== "viewer"}
runtimeEnabled={isGen2SupersetRuntimeEnabled()}
/>
);
}
227 changes: 227 additions & 0 deletions apps/web/app/gen2/workspace.css
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,212 @@

/* --------------------------------------------------- Superset file slice */

.gen2-superset-workspace-shell {
--ss-background: #151110;
--ss-foreground: #eae8e6;
--ss-card: #201e1c;
--ss-secondary: #2a2827;
--ss-muted: #2a2827;
--ss-muted-foreground: #a8a5a3;
--ss-border: #2a2827;
min-height: 100dvh;
background: var(--ss-background);
color: var(--ss-foreground);
font-family: var(--font-geist-sans), Arial, sans-serif;
color-scheme: dark;
}

.gen2-superset-workspace-header {
display: flex;
align-items: center;
gap: 8px;
min-height: 48px;
padding: 6px 12px;
border-bottom: 1px solid var(--ss-border);
background: color-mix(in srgb, var(--ss-muted) 45%, var(--ss-background));
}

.gen2-superset-workspace-header select,
.gen2-superset-worktree-create,
.gen2-superset-workspace-tabs button,
.gen2-superset-worktree-form button {
min-height: 32px;
border: 1px solid var(--ss-border);
border-radius: 6px;
background: var(--ss-secondary);
color: var(--ss-foreground);
font: inherit;
font-size: 0.8125rem;
}

.gen2-superset-workspace-header select {
min-width: 10rem;
padding: 0 8px;
}

.gen2-superset-worktree-create,
.gen2-superset-workspace-tabs button,
.gen2-superset-worktree-form button {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 0 10px;
cursor: pointer;
}

.gen2-superset-workspace-tabs {
display: flex;
gap: 4px;
margin-left: auto;
}

.gen2-superset-workspace-tabs button[aria-selected="true"] {
border-color: color-mix(in srgb, var(--ss-highlight) 65%, var(--ss-border));
background: var(--ss-card);
}

.gen2-superset-workspace-header select:focus-visible,
.gen2-superset-worktree-create:focus-visible,
.gen2-superset-workspace-tabs button:focus-visible,
.gen2-superset-worktree-form input:focus-visible,
.gen2-superset-worktree-form button:focus-visible {
outline: 2px solid var(--ss-highlight);
outline-offset: 2px;
}

.gen2-superset-worktree-form {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)) auto;
gap: 8px;
padding: 10px 12px;
border-bottom: 1px solid var(--ss-border);
background: var(--ss-card);
}

.gen2-superset-worktree-form label {
display: grid;
gap: 4px;
color: var(--ss-muted-foreground);
font-size: 0.75rem;
}

.gen2-superset-worktree-form label span {
font-size: 0.6875rem;
}

.gen2-superset-worktree-form input {
min-width: 0;
min-height: 32px;
padding: 0 8px;
border: 1px solid var(--ss-border);
border-radius: 6px;
background: var(--ss-background);
color: var(--ss-foreground);
font: inherit;
}

.gen2-superset-runtime-notice {
margin: 0;
padding: 8px 12px;
border-bottom: 1px solid var(--ss-border);
background: color-mix(in srgb, var(--ss-highlight) 11%, var(--ss-background));
color: var(--ss-foreground);
font-size: 0.8125rem;
}

.gen2-superset-files-panel .gen2-superset-file-pane {
min-height: calc(100dvh - 48px);
}

.gen2-superset-tool-panel {
min-height: calc(100dvh - 48px);
padding: 16px;
background: var(--ss-background);
}

.gen2-superset-tool-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
max-width: 72rem;
margin: 0 auto;
padding-bottom: 12px;
border-bottom: 1px solid var(--ss-border);
}

.gen2-superset-tool-header h2,
.gen2-superset-tool-header p {
margin: 0;
}

.gen2-superset-tool-header h2 {
font-size: 1rem;
}

.gen2-superset-tool-header p,
.gen2-superset-tool-empty {
color: var(--ss-muted-foreground);
font-size: 0.8125rem;
}

.gen2-superset-tool-error {
max-width: 72rem;
margin: 12px auto;
color: #ffb4a0;
}

.gen2-superset-change-list,
.gen2-superset-diff {
box-sizing: border-box;
width: min(72rem, 100%);
margin: 16px auto;
border: 1px solid var(--ss-border);
border-radius: 8px;
background: var(--ss-card);
}

.gen2-superset-change-list {
padding: 0;
overflow: hidden;
list-style: none;
}

.gen2-superset-change-list li {
display: flex;
gap: 10px;
padding: 8px 10px;
border-bottom: 1px solid var(--ss-border);
font:
0.8125rem var(--font-geist-mono),
monospace;
}

.gen2-superset-change-list li:last-child {
border-bottom: 0;
}

.gen2-superset-change-list code {
min-width: 1.5rem;
color: var(--ss-highlight);
}

.gen2-superset-diff {
min-height: 16rem;
padding: 12px;
overflow: auto;
color: var(--ss-foreground);
font:
0.75rem/1.55 var(--font-geist-mono),
monospace;
white-space: pre-wrap;
}

.gen2-superset-tool-empty {
width: min(72rem, 100%);
margin: 16px auto;
}

.gen2-superset-file-pane {
--ss-background: #151110;
--ss-foreground: #eae8e6;
Expand Down Expand Up @@ -1809,6 +2015,27 @@
}

@media (max-width: 600px) {
.gen2-superset-workspace-header {
flex-wrap: wrap;
min-height: 52px;
}

.gen2-superset-workspace-tabs {
order: 3;
width: 100%;
margin-left: 0;
}

.gen2-superset-workspace-tabs button {
flex: 1;
justify-content: center;
min-height: 40px;
}

.gen2-superset-worktree-form {
grid-template-columns: 1fr;
}

.gen2-superset-files-actions .gen2-superset-icon-button:disabled {
display: none;
}
Expand Down
8 changes: 5 additions & 3 deletions apps/web/components/gen2/superset-file-client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ describe("Superset file client", () => {
);
vi.stubGlobal("fetch", fetchMock);

const loaded = await readSupersetFile(workspaceId, file.path);
const loaded = await readSupersetFile(workspaceId, "main", file.path);
const readCall = fetchMock.mock.calls.at(0);
expect(readCall?.[0]).toContain("path=src%2Fa+file.ts");
const saved = await saveSupersetFile(workspaceId, loaded, "edited");
const saved = await saveSupersetFile(workspaceId, "main", loaded, "edited");
expect(saved.revision).toBe("rev-2");
const saveCall = fetchMock.mock.calls.at(1);
expect(saveCall?.[1]).toMatchObject({ method: "PUT" });
Expand All @@ -53,7 +53,9 @@ describe("Superset file client", () => {
),
);

await expect(saveSupersetFile(workspaceId, file, "edited")).rejects.toEqual(
await expect(
saveSupersetFile(workspaceId, "main", file, "edited"),
).rejects.toEqual(
expect.objectContaining({
status: 409,
currentRevision: "rev-2",
Expand Down
Loading
Loading