From 695131efbf19afac06e8f329e72a22e281f52e35 Mon Sep 17 00:00:00 2001 From: Developing-Gamer Date: Wed, 27 May 2026 12:31:13 -0700 Subject: [PATCH 01/66] Polish analytics query editor surface. Co-authored-by: Cursor --- .../projects/[projectId]/analytics/queries/page-client.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/queries/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/queries/page-client.tsx index 0e40542852..b82052353e 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/queries/page-client.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/queries/page-client.tsx @@ -612,7 +612,7 @@ function QueriesContent() { value={sqlQuery} onChange={(e) => setSqlQuery(e.target.value)} placeholder="SELECT * FROM default.events ORDER BY event_at DESC LIMIT 100" - className="font-mono text-sm min-h-[80px] resize-y bg-background/60" + className="min-h-[80px] resize-y border-black/[0.08] bg-white/95 font-mono text-sm shadow-sm ring-1 ring-black/[0.06] dark:border-border/40 dark:bg-background/60 dark:ring-white/[0.06]" onKeyDown={(e) => { if (e.key === "Enter" && (e.metaKey || e.ctrlKey) && !loading) { e.preventDefault(); From d9177cba243d963bd8f89e4bfc67d904ff3ea12c Mon Sep 17 00:00:00 2001 From: Developing-Gamer Date: Wed, 27 May 2026 12:31:13 -0700 Subject: [PATCH 02/66] Refresh analytics AI query controls. Co-authored-by: Cursor --- .../projects/[projectId]/analytics/tables/ai-query-bar.tsx | 5 +++-- .../[projectId]/analytics/tables/ai-query-dialog.tsx | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/ai-query-bar.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/ai-query-bar.tsx index 70ea162234..dfacb087e9 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/ai-query-bar.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/ai-query-bar.tsx @@ -60,10 +60,11 @@ export function AiQueryBar({
-
+
From a4a7b0f2c974330a2d59c59d950ca9322af6ae31 Mon Sep 17 00:00:00 2001 From: Developing-Gamer Date: Wed, 27 May 2026 12:31:13 -0700 Subject: [PATCH 03/66] Tighten analytics table layout. Co-authored-by: Cursor --- .../analytics/tables/page-client.tsx | 17 ++++++++++++++--- .../analytics/tables/query-data-grid.tsx | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/page-client.tsx index 18d70181bd..f238c53e1d 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/page-client.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/page-client.tsx @@ -231,7 +231,7 @@ export default function PageClient() { -
+
{/* Left sidebar — hidden on mobile */}
- {/* Right content */} -
+ {/* Right content — flush to card edge; companion gap is on
in sidebar-layout */} +
div:first-child>div]:pt-3", + "[&_[role=grid]_.sticky>div:first-child>div]:pb-2.5", + "[&_[role=grid]_.sticky>div:first-child>div]:pr-0", + "[&_[role=grid]_.sticky>div:first-child>div]:pl-2.5", + )} + > {selectedTable ? ( ) : ( diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/query-data-grid.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/query-data-grid.tsx index 3d7c30a657..94d841c412 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/query-data-grid.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/analytics/tables/query-data-grid.tsx @@ -637,7 +637,7 @@ export const QueryDataGrid = forwardRef )} {!showEmptyError && ( -
+
columns={columns} rows={gridData.rows} From 3a2186d349c9ddeb075af02439df62df46b014cf Mon Sep 17 00:00:00 2001 From: Developing-Gamer Date: Wed, 27 May 2026 12:31:13 -0700 Subject: [PATCH 04/66] Improve auth method review surfaces. Co-authored-by: Cursor --- .../[projectId]/auth-methods/page-client.tsx | 64 ++++++++++++------- .../[projectId]/auth-methods/providers.tsx | 4 -- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/page-client.tsx index f8535d189b..e9c51d3ed3 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/page-client.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/page-client.tsx @@ -162,7 +162,7 @@ function DisabledProvidersDialog({ open, onOpenChange }: { open?: boolean, onOpe placeholder="Search for a provider..." value={providerSearch} onChange={(e) => setProviderSearch(e.target.value)} - leadingIcon={} + leadingIcon={} />
{filteredProviders @@ -448,6 +448,7 @@ function useEmailVerificationToggle() { open={!!pendingChange} onClose={() => setPendingChange(null)} title="Enable email verification requirement" + size="2xl" danger okButton={{ label: "Apply Change", @@ -468,35 +469,50 @@ function useEmailVerificationToggle() { Affected users -
- - +
+
+ + + + + + - + - - {pendingChange.affectedUsers.map((user) => ( - - - - - - ))} -
User EmailReasonReason
- {user.displayName || No name} - - {user.primaryEmail || No email} - - -
+
+ + + + + + + + {pendingChange.affectedUsers.map((user) => ( + + + + + + ))} + +
+ {user.displayName || No name} + + {user.primaryEmail || No email} + + +
+
{pendingChange.totalAffectedCount > pendingChange.affectedUsers.length && ( diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx index 65c202b082..74e6efbe53 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/auth-methods/providers.tsx @@ -80,9 +80,6 @@ export const providerFormSchema = yupObject({ export type ProviderFormValues = yup.InferType -/** Modal chrome — "Floating soft" (variant G). */ -const PROVIDER_DIALOG_CHROME_CLASS = "border-0 rounded-3xl bg-background shadow-2xl shadow-black/30 dark:shadow-black/60"; - function ProviderHeader({ providerId }: { providerId: string }) { return (
@@ -329,7 +326,6 @@ export function ProviderSettingDialog(props: Props & { open: boolean, onClose: ( title={`${toTitle(props.id)} OAuth provider`} cancelButton okButton={{ label: 'Save' }} - contentClassName={PROVIDER_DIALOG_CHROME_CLASS} render={(form) => ( Date: Wed, 27 May 2026 12:31:13 -0700 Subject: [PATCH 05/66] Refresh support conversations UI. Co-authored-by: Cursor --- .../[projectId]/conversations/page-client.tsx | 326 +++++++++--------- 1 file changed, 161 insertions(+), 165 deletions(-) diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/conversations/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/conversations/page-client.tsx index 0eac87f8bd..d1ed9052da 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/conversations/page-client.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/conversations/page-client.tsx @@ -3,18 +3,22 @@ import { useAdminApp } from "@/app/(main)/(protected)/projects/[projectId]/use-admin-app"; import { UserPickerTable } from "@/components/data-table/user-picker-table"; import { useRouter } from "@/components/router"; -import { DesignAlert, DesignBadge, DesignCard, DesignCategoryTabs, DesignInput, DesignSelectorDropdown } from "@/components/design-components"; +import { + DesignAlert, + DesignBadge, + DesignButton, + DesignCard, + DesignCategoryTabs, + DesignDialog, + DesignDialogClose, + DesignInput, + DesignSelectorDropdown, +} from "@/components/design-components"; import { Avatar, AvatarFallback, AvatarImage, Button, - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - Input, Select, SelectContent, SelectItem, @@ -582,7 +586,6 @@ function NewConversationDialog(props: { const [subject, setSubject] = useState(""); const [initialMessage, setInitialMessage] = useState(""); const [priority, setPriority] = useState("normal"); - const [isSubmitting, setIsSubmitting] = useState(false); const [errorMessage, setErrorMessage] = useState(null); useEffect(() => { @@ -600,36 +603,72 @@ function NewConversationDialog(props: { const canSubmit = subject.trim() !== "" && initialMessage.trim() !== ""; return ( - - - - Create conversation - - Start a support conversation for a user and keep replies, notes, and context in one place. - - - -
-
- - User - - {selectedUserLabel != null ? ( -
- {selectedUserLabel} - -
- ) : ( + + + + Cancel + + + { + if (!canSubmit) { + return; + } + const nextUserId = selectedUserId ?? throwErr("A support conversation must be attached to a selected user."); + + setErrorMessage(null); + const result = await createConversation(props.currentUser, { + projectId: props.projectId, + userId: nextUserId, + subject: subject.trim(), + initialMessage: initialMessage.trim(), + priority, + }); + props.onCreated(result.conversationId, nextUserId); + props.onOpenChange(false); + }} + > + + Create Conversation + +
+ )} + > +
+
+ + User + + {selectedUserLabel != null ? ( +
+ {selectedUserLabel} + +
+ ) : ( +
(
- -
-
- - Subject - - setSubject(event.target.value)} - placeholder="Password reset loop on mobile" - /> -
-
- - Priority - -
-
+ )} +
+
- Initial message + Subject -