From 4ca1b39a247ba90c7721078f4dc60d9ad4baf940 Mon Sep 17 00:00:00 2001 From: keppere <2keppere@gmail.com> Date: Tue, 28 Jan 2025 15:38:05 +0700 Subject: [PATCH 1/4] fix: deselect removed rows #277 --- .../gui/table-optimized/OptimizeTableState.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/gui/table-optimized/OptimizeTableState.tsx b/src/components/gui/table-optimized/OptimizeTableState.tsx index 91ed47a0..22c6b1f1 100644 --- a/src/components/gui/table-optimized/OptimizeTableState.tsx +++ b/src/components/gui/table-optimized/OptimizeTableState.tsx @@ -1,11 +1,11 @@ -import { OptimizeTableHeaderProps } from "."; -import deepEqual from "deep-equal"; -import { formatNumber } from "@/lib/convertNumber"; -import { selectArrayFromIndexList } from "@/lib/export-helper"; import { buildTableResultHeader, BuildTableResultProps, } from "@/lib/build-table-result"; +import { formatNumber } from "@/lib/convertNumber"; +import { selectArrayFromIndexList } from "@/lib/export-helper"; +import deepEqual from "deep-equal"; +import { OptimizeTableHeaderProps } from "."; export interface OptimizeTableRowValue { raw: Record; @@ -321,6 +321,8 @@ export default class OptimizeTableState { if (removedRows.length > 0) { this.data = this.data.filter((row) => !removedRows.includes(row)); + // after rows were removed, we need to deselect them + this.selectionRanges = []; } this.changeLogs = {}; From 97d19abf21ed88353e29a8e2edb49952a344855a Mon Sep 17 00:00:00 2001 From: keppere <2keppere@gmail.com> Date: Tue, 28 Jan 2025 15:54:47 +0700 Subject: [PATCH 2/4] fix: prevent to paste clipboard with extra enter from excel --- src/components/gui/query-result-table.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/gui/query-result-table.tsx b/src/components/gui/query-result-table.tsx index e45e389a..0f4f716f 100644 --- a/src/components/gui/query-result-table.tsx +++ b/src/components/gui/query-result-table.tsx @@ -256,6 +256,12 @@ export default function ResultTable({ const data = pasteValue.split("\r\n").map((row) => row.split("\t")); for (let row = 0; row < data.length; row++) { + //filter out the additional enter from excel copy + if (row === data.length - 1) { + if (data[row].length === 1 && data[row][0] === "") { + break; + } + } for (let col = 0; col < data[row].length; col++) { state.changeValue( y + row, From aba467ce62101023318d6182f3afe78d207bba04 Mon Sep 17 00:00:00 2001 From: keppere <2keppere@gmail.com> Date: Wed, 29 Jan 2025 17:41:11 +0700 Subject: [PATCH 3/4] feat: set prefers-color-scheme --- src/app/(theme)/theme_layout.tsx | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/app/(theme)/theme_layout.tsx b/src/app/(theme)/theme_layout.tsx index 0a8cc229..d925432c 100644 --- a/src/app/(theme)/theme_layout.tsx +++ b/src/app/(theme)/theme_layout.tsx @@ -1,16 +1,15 @@ +"use client"; +import PageTracker from "@/components/page-tracker"; +import { Toaster } from "@/components/ui/sonner"; +import ThemeProvider from "@/context/theme-provider"; +import { cn } from "@/lib/utils"; import { Analytics } from "@vercel/analytics/react"; +import { getCookie } from "cookies-next"; import { Inter } from "next/font/google"; -import ThemeProvider from "@/context/theme-provider"; -import { cookies } from "next/headers"; -import { Toaster } from "@/components/ui/sonner"; -import { Fragment, PropsWithChildren } from "react"; import Script from "next/script"; -import { cn } from "@/lib/utils"; -import PageTracker from "@/components/page-tracker"; - +import { Fragment, PropsWithChildren } from "react"; const inter = Inter({ subsets: ["latin"] }); - -export default async function ThemeLayout({ +export default function ThemeLayout({ children, overrideTheme, disableToggle, @@ -20,10 +19,11 @@ export default async function ThemeLayout({ disableToggle?: boolean; overrideThemeVariables?: Record; }>) { - const cookieStore = await cookies(); - const theme = - overrideTheme ?? - (cookieStore.get("theme")?.value === "dark" ? "dark" : "light"); + const cookieTheme = getCookie("theme"); + const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light"; + const theme = overrideTheme ?? cookieTheme ?? systemTheme; const style = overrideThemeVariables ?? {}; return ( @@ -32,7 +32,10 @@ export default async function ThemeLayout({ style={style} suppressHydrationWarning > - + {children} From 07ffc4f6663a3eaf6a85c541593f43d9c67f7d2a Mon Sep 17 00:00:00 2001 From: keppere <2keppere@gmail.com> Date: Wed, 29 Jan 2025 17:41:49 +0700 Subject: [PATCH 4/4] refactor: improve dark mode data table colors --- .../gui/table-cell/generic-cell.tsx | 24 +++++++++---------- .../gui/table-optimized/table-cell.tsx | 14 +++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/components/gui/table-cell/generic-cell.tsx b/src/components/gui/table-cell/generic-cell.tsx index 1f73d2ac..8113f7d5 100644 --- a/src/components/gui/table-cell/generic-cell.tsx +++ b/src/components/gui/table-cell/generic-cell.tsx @@ -1,18 +1,18 @@ -import { useEffect, useMemo, useState } from "react"; -import { isLinkString } from "@/lib/validation"; -import DisplayLinkCell from "./display-link-cell"; -import { cn } from "@/lib/utils"; -import { OptimizeTableHeaderWithIndexProps } from "../table-optimized"; -import { LucideArrowUpRight, LucideLoader } from "lucide-react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; -import { DatabaseResultSet, DatabaseValue } from "@/drivers/base-driver"; import { useDatabaseDriver } from "@/context/driver-provider"; +import { DatabaseResultSet, DatabaseValue } from "@/drivers/base-driver"; import { convertDatabaseValueToString } from "@/drivers/sqlite/sql-helper"; +import { cn } from "@/lib/utils"; +import { isLinkString } from "@/lib/validation"; import { ColumnType } from "@outerbase/sdk-transform"; +import { LucideArrowUpRight, LucideLoader } from "lucide-react"; +import { useEffect, useMemo, useState } from "react"; +import { OptimizeTableHeaderWithIndexProps } from "../table-optimized"; +import DisplayLinkCell from "./display-link-cell"; interface TableCellProps { align?: "left" | "right"; @@ -79,7 +79,7 @@ function SnippetRow({
@@ -108,7 +108,7 @@ function ForeignKeyColumnSnippet(props: SneakpeakProps) {
{props.fkTableName}
-
+
{open && }
@@ -143,7 +143,7 @@ function BlobCellValue({ return (
- + vec({floatArray.length})
@@ -159,7 +159,7 @@ function BlobCellValue({ {prettifyBytes(bytes.subarray(0, 64))}
- + {bytes.length.toLocaleString(undefined, { maximumFractionDigits: 0, })} @@ -225,7 +225,7 @@ export default function GenericCell({ {value} diff --git a/src/components/gui/table-optimized/table-cell.tsx b/src/components/gui/table-optimized/table-cell.tsx index 5a4a795c..fe031402 100644 --- a/src/components/gui/table-optimized/table-cell.tsx +++ b/src/components/gui/table-optimized/table-cell.tsx @@ -1,8 +1,8 @@ -import OptimizeTableState from "./OptimizeTableState"; +import { cn } from "@/lib/utils"; +import { useMemo } from "react"; import { OptimizeTableHeaderWithIndexProps } from "."; import tableResultCellRenderer from "../table-result/render-cell"; -import { useMemo } from "react"; -import { cn } from "@/lib/utils"; +import OptimizeTableState from "./OptimizeTableState"; export default function OptimizeTableCell({ state, @@ -34,14 +34,14 @@ export default function OptimizeTableCell({ if (isRemoved) { cellBackgroundColor = "bg-red-200 dark:bg-red-800"; } else if (isChanged) { - cellBackgroundColor = "bg-yellow-200 dark:bg-orange-600"; + cellBackgroundColor = "bg-yellow-200 dark:bg-orange-800"; } else if (isNew) { - cellBackgroundColor = "bg-green-200 dark:bg-green-700"; + cellBackgroundColor = "bg-green-200 dark:bg-green-800"; } else { - cellBackgroundColor = "bg-blue-100 dark:bg-sky-900"; + cellBackgroundColor = "bg-blue-50 dark:bg-neutral-900"; } } else if (isChanged) { - cellBackgroundColor = "bg-yellow-100 dark:bg-orange-700"; + cellBackgroundColor = "bg-yellow-100 dark:bg-orange-900"; } else if (isNew) { cellBackgroundColor = "bg-green-100 dark:bg-green-900"; } else if (isRemoved) {