@stackframe/stack-ui 2.6.20 → 2.6.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @stackframe/stack-ui
2
2
 
3
+ ## 2.6.23
4
+
5
+ ### Patch Changes
6
+
7
+ - Bugfixes
8
+ - Updated dependencies
9
+ - @stackframe/stack-shared@2.6.23
10
+
11
+ ## 2.6.22
12
+
13
+ ### Patch Changes
14
+
15
+ - Bugfixes
16
+ - Updated dependencies
17
+ - @stackframe/stack-shared@2.6.22
18
+
19
+ ## 2.6.21
20
+
21
+ ### Patch Changes
22
+
23
+ - Fixed inviteUser
24
+ - Updated dependencies
25
+ - @stackframe/stack-shared@2.6.21
26
+
3
27
  ## 2.6.20
4
28
 
5
29
  ### Patch Changes
@@ -4,6 +4,7 @@ export declare function TableView<TData, TValue>(props: {
4
4
  table: TableType<TData>;
5
5
  columns: ColumnDef<TData, TValue>[];
6
6
  toolbarRender?: (table: TableType<TData>) => React.ReactNode;
7
+ showDefaultToolbar?: boolean;
7
8
  }): import("react/jsx-runtime").JSX.Element;
8
9
  type DataTableProps<TData, TValue> = {
9
10
  columns: ColumnDef<TData, TValue>[];
@@ -12,8 +13,9 @@ type DataTableProps<TData, TValue> = {
12
13
  defaultVisibility?: VisibilityState;
13
14
  defaultColumnFilters?: ColumnFiltersState;
14
15
  defaultSorting?: SortingState;
16
+ showDefaultToolbar?: boolean;
15
17
  };
16
- export declare function DataTable<TData, TValue>({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
18
+ export declare function DataTable<TData, TValue>({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, showDefaultToolbar, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
17
19
  type DataTableManualPaginationProps<TData, TValue> = DataTableProps<TData, TValue> & {
18
20
  onUpdate: (options: {
19
21
  cursor: string;
@@ -25,5 +27,5 @@ type DataTableManualPaginationProps<TData, TValue> = DataTableProps<TData, TValu
25
27
  nextCursor: string | null;
26
28
  }>;
27
29
  };
28
- export declare function DataTableManualPagination<TData, TValue>({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, onUpdate, }: DataTableManualPaginationProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
30
+ export declare function DataTableManualPagination<TData, TValue>({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, onUpdate, showDefaultToolbar, }: DataTableManualPaginationProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
29
31
  export {};
@@ -6,13 +6,13 @@ import React from "react";
6
6
  import { DataTablePagination } from "./pagination";
7
7
  import { DataTableToolbar } from "./toolbar";
8
8
  export function TableView(props) {
9
- return (_jsxs("div", { className: "space-y-4", children: [_jsx(DataTableToolbar, { table: props.table, toolbarRender: props.toolbarRender }), _jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: props.table.getHeaderGroups().map((headerGroup) => (_jsx(TableRow, { children: headerGroup.headers.map((header) => {
9
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(DataTableToolbar, { table: props.table, toolbarRender: props.toolbarRender, showDefaultToolbar: props.showDefaultToolbar }), _jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: props.table.getHeaderGroups().map((headerGroup) => (_jsx(TableRow, { children: headerGroup.headers.map((header) => {
10
10
  return (_jsx(TableHead, { colSpan: header.colSpan, children: header.isPlaceholder
11
11
  ? null
12
12
  : flexRender(header.column.columnDef.header, header.getContext()) }, header.id));
13
13
  }) }, headerGroup.id))) }), _jsx(TableBody, { children: props.table.getRowModel().rows.length ? (props.table.getRowModel().rows.map((row) => (_jsx(TableRow, { "data-state": row.getIsSelected() && "selected", children: row.getVisibleCells().map((cell) => (_jsx(TableCell, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))) }, row.id)))) : (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: props.columns.length, className: "h-24 text-center", children: "No results." }) })) })] }) }), _jsx(DataTablePagination, { table: props.table })] }));
14
14
  }
15
- export function DataTable({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, }) {
15
+ export function DataTable({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, showDefaultToolbar = true, }) {
16
16
  const [sorting, setSorting] = React.useState(defaultSorting || []);
17
17
  const [columnFilters, setColumnFilters] = React.useState(defaultColumnFilters || []);
18
18
  const [pagination, setPagination] = React.useState({
@@ -20,9 +20,9 @@ export function DataTable({ columns, data, toolbarRender, defaultVisibility, def
20
20
  pageSize: 10,
21
21
  });
22
22
  const [globalFilter, setGlobalFilter] = React.useState();
23
- return _jsx(DataTableBase, { columns: columns, data: data, toolbarRender: toolbarRender, defaultVisibility: defaultVisibility, sorting: sorting, setSorting: setSorting, columnFilters: columnFilters, setColumnFilters: setColumnFilters, manualPagination: false, manualFiltering: false, pagination: pagination, setPagination: setPagination, globalFilter: globalFilter, setGlobalFilter: setGlobalFilter });
23
+ return _jsx(DataTableBase, { columns: columns, data: data, toolbarRender: toolbarRender, defaultVisibility: defaultVisibility, sorting: sorting, setSorting: setSorting, columnFilters: columnFilters, setColumnFilters: setColumnFilters, manualPagination: false, manualFiltering: false, pagination: pagination, setPagination: setPagination, globalFilter: globalFilter, setGlobalFilter: setGlobalFilter, showDefaultToolbar: showDefaultToolbar });
24
24
  }
25
- export function DataTableManualPagination({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, onUpdate, }) {
25
+ export function DataTableManualPagination({ columns, data, toolbarRender, defaultVisibility, defaultColumnFilters, defaultSorting, onUpdate, showDefaultToolbar = true, }) {
26
26
  const [sorting, setSorting] = React.useState(defaultSorting || []);
27
27
  const [pagination, setPagination] = React.useState({ pageIndex: 0, pageSize: 10 });
28
28
  const [cursors, setCursors] = React.useState({});
@@ -52,9 +52,9 @@ export function DataTableManualPagination({ columns, data, toolbarRender, defaul
52
52
  }, 500);
53
53
  return () => clearTimeout(timer);
54
54
  }, [globalFilter]);
55
- return _jsx(DataTableBase, { columns: columns, data: data, toolbarRender: toolbarRender, sorting: sorting, setSorting: setSorting, pagination: pagination, setPagination: setPagination, columnFilters: columnFilters, setColumnFilters: setColumnFilters, rowCount: pagination.pageSize * Object.keys(cursors).length + (cursors[pagination.pageIndex + 1] ? 1 : 0), globalFilter: globalFilter, setGlobalFilter: setGlobalFilter, defaultColumnFilters: defaultColumnFilters, defaultSorting: defaultSorting, defaultVisibility: defaultVisibility });
55
+ return _jsx(DataTableBase, { columns: columns, data: data, toolbarRender: toolbarRender, sorting: sorting, setSorting: setSorting, pagination: pagination, setPagination: setPagination, columnFilters: columnFilters, setColumnFilters: setColumnFilters, rowCount: pagination.pageSize * Object.keys(cursors).length + (cursors[pagination.pageIndex + 1] ? 1 : 0), globalFilter: globalFilter, setGlobalFilter: setGlobalFilter, defaultColumnFilters: defaultColumnFilters, defaultSorting: defaultSorting, defaultVisibility: defaultVisibility, showDefaultToolbar: showDefaultToolbar });
56
56
  }
57
- function DataTableBase({ columns, data, toolbarRender, defaultVisibility, sorting, setSorting, pagination, setPagination, rowCount, columnFilters, setColumnFilters, globalFilter, setGlobalFilter, manualPagination = true, manualFiltering = true, }) {
57
+ function DataTableBase({ columns, data, toolbarRender, defaultVisibility, sorting, setSorting, pagination, setPagination, rowCount, columnFilters, setColumnFilters, globalFilter, setGlobalFilter, manualPagination = true, manualFiltering = true, showDefaultToolbar = true, }) {
58
58
  const [rowSelection, setRowSelection] = React.useState({});
59
59
  const [columnVisibility, setColumnVisibility] = React.useState(defaultVisibility || {});
60
60
  const table = useReactTable({
@@ -87,5 +87,5 @@ function DataTableBase({ columns, data, toolbarRender, defaultVisibility, sortin
87
87
  manualFiltering,
88
88
  rowCount,
89
89
  });
90
- return _jsx(TableView, { table: table, columns: columns, toolbarRender: toolbarRender });
90
+ return _jsx(TableView, { table: table, columns: columns, toolbarRender: toolbarRender, showDefaultToolbar: showDefaultToolbar });
91
91
  }
@@ -3,4 +3,5 @@ export declare function SearchToolbarItem<TData>(props: {
3
3
  table: Table<TData>;
4
4
  keyName?: string | null;
5
5
  placeholder: string;
6
+ className?: string;
6
7
  }): import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Input } from "../..";
2
+ import { Input, cn } from "../..";
3
3
  export function SearchToolbarItem(props) {
4
- return (_jsx(Input, { placeholder: props.placeholder, value: props.keyName ? `${props.table.getColumn(props.keyName)?.getFilterValue() ?? ""}` : props.table.getState().globalFilter ?? "", onChange: (event) => props.keyName ? props.table.getColumn(props.keyName)?.setFilterValue(event.target.value) : props.table.setGlobalFilter(event.target.value), className: "h-8 w-[150px] lg:w-[250px]" }));
4
+ return (_jsx(Input, { placeholder: props.placeholder, value: props.keyName ? `${props.table.getColumn(props.keyName)?.getFilterValue() ?? ""}` : props.table.getState().globalFilter ?? "", onChange: (event) => props.keyName ? props.table.getColumn(props.keyName)?.setFilterValue(event.target.value) : props.table.setGlobalFilter(event.target.value), className: cn("h-8 w-[250px]", props.className) }));
5
5
  }
@@ -3,6 +3,7 @@ import { Table } from "@tanstack/react-table";
3
3
  interface DataTableToolbarProps<TData> {
4
4
  table: Table<TData>;
5
5
  toolbarRender?: (table: Table<TData>) => React.ReactNode;
6
+ showDefaultToolbar?: boolean;
6
7
  }
7
- export declare function DataTableToolbar<TData>({ table, toolbarRender }: DataTableToolbarProps<TData>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function DataTableToolbar<TData>({ table, toolbarRender, showDefaultToolbar }: DataTableToolbarProps<TData>): import("react/jsx-runtime").JSX.Element;
8
9
  export {};
@@ -1,45 +1,45 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { Cross2Icon } from "@radix-ui/react-icons";
4
4
  import { Button } from "@stackframe/stack-ui";
5
5
  import { DataTableViewOptions } from "./view-options";
6
6
  import { DownloadIcon } from "lucide-react";
7
7
  import { mkConfig, generateCsv, download } from 'export-to-csv';
8
- export function DataTableToolbar({ table, toolbarRender }) {
8
+ export function DataTableToolbar({ table, toolbarRender, showDefaultToolbar }) {
9
9
  const isFiltered = table.getState().columnFilters.length > 0;
10
10
  const isSorted = table.getState().sorting.length > 0;
11
- return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [toolbarRender?.(table), (isFiltered || isSorted) && (_jsxs(Button, { variant: "ghost", onClick: () => {
11
+ return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2 flex-wrap flex-1", children: [toolbarRender?.(table), (isFiltered || isSorted) && (_jsxs(Button, { variant: "ghost", onClick: () => {
12
12
  table.resetColumnFilters();
13
13
  table.resetSorting();
14
- }, className: "h-8 px-2 lg:px-3", children: ["Reset", _jsx(Cross2Icon, { className: "ml-2 h-4 w-4" })] }))] }), _jsx("div", { className: "flex-1" }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsx(DataTableViewOptions, { table: table }), _jsxs(Button, { variant: "outline", size: "sm", className: "ml-auto hidden h-8 lg:flex", onClick: () => {
15
- const csvConfig = mkConfig({
16
- fieldSeparator: ',',
17
- filename: 'data',
18
- decimalSeparator: '.',
19
- useKeysAsHeaders: true,
20
- });
21
- const renderCellValue = (cell) => {
22
- const rendered = cell.renderValue();
23
- if (rendered === null) {
24
- return undefined;
14
+ }, className: "h-8 px-2 lg:px-3", children: ["Reset", _jsx(Cross2Icon, { className: "ml-2 h-4 w-4" })] }))] }), showDefaultToolbar && (_jsx(_Fragment, { children: _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsx(DataTableViewOptions, { table: table }), _jsxs(Button, { variant: "outline", size: "sm", className: "ml-auto hidden h-8 lg:flex", onClick: () => {
15
+ const csvConfig = mkConfig({
16
+ fieldSeparator: ',',
17
+ filename: 'data',
18
+ decimalSeparator: '.',
19
+ useKeysAsHeaders: true,
20
+ });
21
+ const renderCellValue = (cell) => {
22
+ const rendered = cell.renderValue();
23
+ if (rendered === null) {
24
+ return undefined;
25
+ }
26
+ if (['string', 'number', 'boolean', 'undefined'].includes(typeof rendered)) {
27
+ return rendered;
28
+ }
29
+ if (rendered instanceof Date) {
30
+ return rendered.toISOString();
31
+ }
32
+ if (typeof rendered === 'object') {
33
+ return JSON.stringify(rendered);
34
+ }
35
+ };
36
+ const rowModel = table.getCoreRowModel();
37
+ const rows = rowModel.rows.map(row => Object.fromEntries(row.getAllCells().map(c => [c.column.id, renderCellValue(c)]).filter(([_, v]) => v !== undefined)));
38
+ if (rows.length === 0) {
39
+ alert("No data to export");
40
+ return;
25
41
  }
26
- if (['string', 'number', 'boolean', 'undefined'].includes(typeof rendered)) {
27
- return rendered;
28
- }
29
- if (rendered instanceof Date) {
30
- return rendered.toISOString();
31
- }
32
- if (typeof rendered === 'object') {
33
- return JSON.stringify(rendered);
34
- }
35
- };
36
- const rowModel = table.getCoreRowModel();
37
- const rows = rowModel.rows.map(row => Object.fromEntries(row.getAllCells().map(c => [c.column.id, renderCellValue(c)]).filter(([_, v]) => v !== undefined)));
38
- if (rows.length === 0) {
39
- alert("No data to export");
40
- return;
41
- }
42
- const csv = generateCsv(csvConfig)(rows);
43
- download(csvConfig)(csv);
44
- }, children: [_jsx(DownloadIcon, { className: "mr-2 h-4 w-4" }), "Export CSV"] })] })] }));
42
+ const csv = generateCsv(csvConfig)(rows);
43
+ download(csvConfig)(csv);
44
+ }, children: [_jsx(DownloadIcon, { className: "mr-2 h-4 w-4" }), "Export CSV"] })] }) }))] }));
45
45
  }
@@ -9,6 +9,6 @@ const AccordionItem = forwardRefIfNeeded(({ className, ...props }, ref) => (_jsx
9
9
  AccordionItem.displayName = "AccordionItem";
10
10
  const AccordionTrigger = forwardRefIfNeeded(({ className, children, disabled, ...props }, ref) => (_jsx(AccordionPrimitive.Header, { className: "flex", children: _jsxs(AccordionPrimitive.Trigger, { ref: ref, className: cn("flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", className), ...props, children: [children, !disabled && _jsx(ChevronDownIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" })] }) })));
11
11
  AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
12
- const AccordionContent = forwardRefIfNeeded(({ className, children, ...props }, ref) => (_jsx(AccordionPrimitive.Content, { ref: ref, className: "overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", ...props, children: _jsx("div", { className: cn("pb-4 pt-0", className), children: children }) })));
12
+ const AccordionContent = forwardRefIfNeeded(({ className, children, ...props }, ref) => (_jsx(AccordionPrimitive.Content, { ref: ref, className: "text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", ...props, children: _jsx("div", { className: cn("pb-4 pt-0", className), children: children }) })));
13
13
  AccordionContent.displayName = AccordionPrimitive.Content.displayName;
14
14
  export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -1,10 +1,10 @@
1
1
  import React from "react";
2
2
  export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
3
+ prefixItem?: React.ReactNode;
3
4
  }
4
- declare const Input: React.FC<InputProps & {
5
+ export declare const Input: React.FC<InputProps & {
5
6
  ref?: React.Ref<HTMLInputElement> | undefined;
6
7
  }>;
7
- export { Input };
8
8
  export interface DelayedInputProps extends InputProps {
9
9
  delay?: number;
10
10
  }
@@ -1,12 +1,17 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
3
  import { forwardRefIfNeeded } from "@stackframe/stack-shared/dist/utils/react";
4
4
  import { cn } from "../../lib/utils";
5
- const Input = forwardRefIfNeeded(({ className, type, ...props }, ref) => {
6
- return (_jsx("input", { type: type, className: cn("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50", className), ref: ref, ...props }));
5
+ export const Input = forwardRefIfNeeded(({ className, type, prefixItem, ...props }, ref) => {
6
+ const baseClasses = "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50";
7
+ if (prefixItem) {
8
+ return (_jsxs("div", { className: "flex flex-row items-center", children: [_jsx("div", { className: 'flex self-stretch justify-center items-center text-muted-foreground pl-3 select-none bg-muted/70 pr-3 border-r border-input rounded-l-md', children: prefixItem }), _jsx("input", { type: type, className: cn(baseClasses, 'rounded-l-none', className), ref: ref, ...props })] }));
9
+ }
10
+ else {
11
+ return (_jsx("input", { type: type, className: cn(baseClasses, className), ref: ref, ...props }));
12
+ }
7
13
  });
8
14
  Input.displayName = "Input";
9
- export { Input };
10
15
  export const DelayedInput = forwardRefIfNeeded(({ delay = 500, defaultValue, ...props }, ref) => {
11
16
  const [value, setValue] = React.useState(defaultValue ?? "");
12
17
  const timeout = React.useRef(null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackframe/stack-ui",
3
- "version": "2.6.20",
3
+ "version": "2.6.23",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [
@@ -16,11 +16,11 @@
16
16
  }
17
17
  },
18
18
  "peerDependencies": {
19
- "react": ">=18.2",
20
- "react-dom": ">=18.2",
21
- "@types/react": ">=18.2.12",
22
- "@types/react-dom": ">=18.2.12",
23
- "next": ">=14.1.0",
19
+ "react": ">=18.2 || >=19.0.0-rc.0",
20
+ "react-dom": ">=18.2 || >=19.0.0-rc.0",
21
+ "@types/react": ">=18.2.12 || >=19.0.0-rc.0",
22
+ "@types/react-dom": ">=18.2.12 || >=19.0.0-rc.0",
23
+ "next": ">=14.1.0 || >=15.0.0-rc.0",
24
24
  "yup": "^1.4.0"
25
25
  },
26
26
  "peerDependenciesMeta": {
@@ -76,7 +76,7 @@
76
76
  "react-hook-form": "^7.53.1",
77
77
  "react-resizable-panels": "^2.1.6",
78
78
  "tailwind-merge": "^2.5.4",
79
- "@stackframe/stack-shared": "2.6.20"
79
+ "@stackframe/stack-shared": "2.6.23"
80
80
  },
81
81
  "devDependencies": {
82
82
  "rimraf": "^5.0.10",