@economic/taco 8.1.2 → 8.1.3-EC-82626-test-release.0
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/dist/charts/utils/common.d.ts +1 -1
- package/dist/components/Header/components/Link.cjs.map +1 -1
- package/dist/components/Header/components/Link.js.map +1 -1
- package/dist/components/List/components/Collapsible.d.ts +1 -1
- package/dist/components/Menu/components/Content.d.ts +1 -1
- package/dist/components/Menu/components/SubMenu.d.ts +1 -1
- package/dist/components/Table3/features/useTableEditing.d.ts +4 -4
- package/dist/components/Toast/Toast.cjs.map +1 -1
- package/dist/components/Toast/Toast.d.ts +1 -1
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Toast/util.cjs.map +1 -1
- package/dist/components/Toast/util.d.ts +1 -1
- package/dist/components/Toast/util.js.map +1 -1
- package/dist/hooks/useTacoSettings.d.ts +1 -1
- package/dist/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.cjs +1 -1
- package/dist/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.js +1 -1
- package/dist/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.js.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.cjs +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.cjs.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.js +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.js.map +1 -1
- package/dist/primitives/Table/useTableManager/useTableManager.d.ts +2 -2
- package/dist/primitives/Table/useTableManager/util/settings.d.ts +4 -4
- package/dist/utils/storyutils.d.ts +1 -1
- package/package.json +13 -10
|
@@ -10,7 +10,7 @@ export declare function getAxisProps<TData extends object>(axis: 'x' | 'y', prop
|
|
|
10
10
|
scale: Function | import('recharts/types/util/types').ScaleType | undefined;
|
|
11
11
|
tickLine: boolean;
|
|
12
12
|
tickMargin: number;
|
|
13
|
-
tickFormatter: import('
|
|
13
|
+
tickFormatter: import('../..').TickFormatter | undefined;
|
|
14
14
|
type: any;
|
|
15
15
|
width: number;
|
|
16
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.cjs","sources":["../../../../src/components/Header/components/Link.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Icon, IconName } from '../../Icon/Icon';\nimport { Tooltip } from '../../Tooltip/Tooltip';\nimport { Badge } from '../../Badge/Badge';\nimport { useLocalization } from '../../Provider/Localization';\n\nexport type BaseLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & {\n tooltip?: string;\n};\n\ninterface LinkPropsWithoutIcon extends BaseLinkProps {\n children: JSX.Element | string;\n icon?: never;\n isNew?: never;\n}\n\ninterface LinkPropsWithIcon extends Omit<BaseLinkProps, 'aria-label'> {\n 'aria-label': string;\n children?: never;\n icon: IconName;\n isNew?: boolean;\n}\n\nexport type LinkProps = LinkPropsWithoutIcon | LinkPropsWithIcon;\n\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(function Link(props, ref) {\n const { children, icon, isNew, tooltip, ...otherProps } = props;\n const { texts } = useLocalization();\n const className = cn(getLinkClasses(icon), 'relative', props.className);\n\n const link = (\n <a {...otherProps} className={className} data-taco=\"header-link\" ref={ref} tabIndex={0}>\n {icon ? <Icon name={icon} /> : null}\n {children}\n {isNew ? (\n <Badge\n color=\"blue\"\n small\n className=\"absolute right-0 top-0 -mr-2.5 -mt-1.5 !h-3 !px-0.5 text-[0.55rem] font-normal\">\n {texts.header.new}\n </Badge>\n ) : null}\n </a>\n );\n\n if (tooltip) {\n return <Tooltip title={tooltip}>{link}</Tooltip>;\n }\n\n return link;\n});\n\nexport const getLinkClasses = (icon: IconName | undefined = undefined) =>\n cn(\n 'flex h-8 flex-shrink-0 flex-grow-0 cursor-pointer items-center justify-center ',\n 'focus:!shadow-none focus:!outline-none focus-visible:!yt-focus-dark',\n 'bg-transparent hover:bg-white-subtle focus:bg-white-subtle aria-current-page:bg-white-subtle',\n '!text-white hover:text-white focus:text-white',\n {\n '!rounded-full !h-9 !w-9': icon,\n 'whitespace-nowrap px-3 rounded text-sm hidden lg:flex': !icon,\n }\n );\n"],"names":["Link","useLocalization","Icon","Badge","Tooltip"],"mappings":";;;;;;;;AA0BO,MAAM,OAAO,MAAM,WAAyC,SAASA,MAAK,OAAO,KAAK;AACzF,QAAM,EAAE,UAAU,MAAM,OAAO,SAAS,GAAG,eAAe;AACpD,QAAA,EAAE,MAAM,IAAIC,6BAAgB;AAClC,QAAM,YAAY,GAAG,eAAe,IAAI,GAAG,YAAY,MAAM,SAAS;AAEtE,QAAM,OACD,sBAAA,cAAA,KAAA,EAAG,GAAG,YAAY,WAAsB,aAAU,eAAc,KAAU,UAAU,KAChF,2CAAQC,KAAAA,MAAK,EAAA,MAAM,KAAM,CAAA,IAAK,MAC9B,UACA,QACG,sBAAA;AAAA,IAACC,MAAA;AAAA,IAAA;AAAA,MACG,OAAM;AAAA,MACN,OAAK;AAAA,
|
|
1
|
+
{"version":3,"file":"Link.cjs","sources":["../../../../src/components/Header/components/Link.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Icon, IconName } from '../../Icon/Icon';\nimport { Tooltip } from '../../Tooltip/Tooltip';\nimport { Badge } from '../../Badge/Badge';\nimport { useLocalization } from '../../Provider/Localization';\n\nexport type BaseLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & {\n tooltip?: string;\n};\n\ninterface LinkPropsWithoutIcon extends BaseLinkProps {\n children: JSX.Element | string;\n icon?: never;\n isNew?: never;\n}\n\ninterface LinkPropsWithIcon extends Omit<BaseLinkProps, 'aria-label'> {\n 'aria-label': string;\n children?: never;\n icon: IconName;\n isNew?: boolean;\n}\n\nexport type LinkProps = LinkPropsWithoutIcon | LinkPropsWithIcon;\n\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(function Link(props, ref) {\n const { children, icon, isNew, tooltip, ...otherProps } = props;\n const { texts } = useLocalization();\n const className = cn(getLinkClasses(icon), 'relative', props.className);\n\n const link = (\n <a {...otherProps} className={className} data-taco=\"header-link\" ref={ref} tabIndex={0}>\n {icon ? <Icon name={icon} /> : null}\n {children}\n {isNew ? (\n <Badge\n color=\"blue\"\n small\n // TODO: remove the text-[0.55rem] and replace with a taco approved font size\n // oxlint-disable-next-line class-rules/no-disallowed-color-classes\n className=\"absolute right-0 top-0 -mr-2.5 -mt-1.5 !h-3 !px-0.5 text-[0.55rem] font-normal\">\n {texts.header.new}\n </Badge>\n ) : null}\n </a>\n );\n\n if (tooltip) {\n return <Tooltip title={tooltip}>{link}</Tooltip>;\n }\n\n return link;\n});\n\nexport const getLinkClasses = (icon: IconName | undefined = undefined) =>\n cn(\n 'flex h-8 flex-shrink-0 flex-grow-0 cursor-pointer items-center justify-center ',\n 'focus:!shadow-none focus:!outline-none focus-visible:!yt-focus-dark',\n 'bg-transparent hover:bg-white-subtle focus:bg-white-subtle aria-current-page:bg-white-subtle',\n '!text-white hover:text-white focus:text-white',\n {\n '!rounded-full !h-9 !w-9': icon,\n 'whitespace-nowrap px-3 rounded text-sm hidden lg:flex': !icon,\n }\n );\n"],"names":["Link","useLocalization","Icon","Badge","Tooltip"],"mappings":";;;;;;;;AA0BO,MAAM,OAAO,MAAM,WAAyC,SAASA,MAAK,OAAO,KAAK;AACzF,QAAM,EAAE,UAAU,MAAM,OAAO,SAAS,GAAG,eAAe;AACpD,QAAA,EAAE,MAAM,IAAIC,6BAAgB;AAClC,QAAM,YAAY,GAAG,eAAe,IAAI,GAAG,YAAY,MAAM,SAAS;AAEtE,QAAM,OACD,sBAAA,cAAA,KAAA,EAAG,GAAG,YAAY,WAAsB,aAAU,eAAc,KAAU,UAAU,KAChF,2CAAQC,KAAAA,MAAK,EAAA,MAAM,KAAM,CAAA,IAAK,MAC9B,UACA,QACG,sBAAA;AAAA,IAACC,MAAA;AAAA,IAAA;AAAA,MACG,OAAM;AAAA,MACN,OAAK;AAAA,MAGL,WAAU;AAAA,IAAA;AAAA,IACT,MAAM,OAAO;AAAA,MAElB,IACR;AAGJ,MAAI,SAAS;AACT,WAAQ,sBAAA,cAAAC,QAAA,SAAA,EAAQ,OAAO,QAAA,GAAU,IAAK;AAAA,EAAA;AAGnC,SAAA;AACX,CAAC;AAEY,MAAA,iBAAiB,CAAC,OAA6B,WACxD;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,IACI,2BAA2B;AAAA,IAC3B,yDAAyD,CAAC;AAAA,EAAA;AAElE;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.js","sources":["../../../../src/components/Header/components/Link.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Icon, IconName } from '../../Icon/Icon';\nimport { Tooltip } from '../../Tooltip/Tooltip';\nimport { Badge } from '../../Badge/Badge';\nimport { useLocalization } from '../../Provider/Localization';\n\nexport type BaseLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & {\n tooltip?: string;\n};\n\ninterface LinkPropsWithoutIcon extends BaseLinkProps {\n children: JSX.Element | string;\n icon?: never;\n isNew?: never;\n}\n\ninterface LinkPropsWithIcon extends Omit<BaseLinkProps, 'aria-label'> {\n 'aria-label': string;\n children?: never;\n icon: IconName;\n isNew?: boolean;\n}\n\nexport type LinkProps = LinkPropsWithoutIcon | LinkPropsWithIcon;\n\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(function Link(props, ref) {\n const { children, icon, isNew, tooltip, ...otherProps } = props;\n const { texts } = useLocalization();\n const className = cn(getLinkClasses(icon), 'relative', props.className);\n\n const link = (\n <a {...otherProps} className={className} data-taco=\"header-link\" ref={ref} tabIndex={0}>\n {icon ? <Icon name={icon} /> : null}\n {children}\n {isNew ? (\n <Badge\n color=\"blue\"\n small\n className=\"absolute right-0 top-0 -mr-2.5 -mt-1.5 !h-3 !px-0.5 text-[0.55rem] font-normal\">\n {texts.header.new}\n </Badge>\n ) : null}\n </a>\n );\n\n if (tooltip) {\n return <Tooltip title={tooltip}>{link}</Tooltip>;\n }\n\n return link;\n});\n\nexport const getLinkClasses = (icon: IconName | undefined = undefined) =>\n cn(\n 'flex h-8 flex-shrink-0 flex-grow-0 cursor-pointer items-center justify-center ',\n 'focus:!shadow-none focus:!outline-none focus-visible:!yt-focus-dark',\n 'bg-transparent hover:bg-white-subtle focus:bg-white-subtle aria-current-page:bg-white-subtle',\n '!text-white hover:text-white focus:text-white',\n {\n '!rounded-full !h-9 !w-9': icon,\n 'whitespace-nowrap px-3 rounded text-sm hidden lg:flex': !icon,\n }\n );\n"],"names":["React","Link"],"mappings":";;;;;;AA0BO,MAAM,OAAOA,eAAM,WAAyC,SAASC,MAAK,OAAO,KAAK;AACzF,QAAM,EAAE,UAAU,MAAM,OAAO,SAAS,GAAG,eAAe;AACpD,QAAA,EAAE,MAAM,IAAI,gBAAgB;AAClC,QAAM,YAAY,GAAG,eAAe,IAAI,GAAG,YAAY,MAAM,SAAS;AAEtE,QAAM,OACDD,+BAAA,cAAA,KAAA,EAAG,GAAG,YAAY,WAAsB,aAAU,eAAc,KAAU,UAAU,KAChF,oDAAQ,MAAK,EAAA,MAAM,KAAM,CAAA,IAAK,MAC9B,UACA,QACGA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAM;AAAA,MACN,OAAK;AAAA,
|
|
1
|
+
{"version":3,"file":"Link.js","sources":["../../../../src/components/Header/components/Link.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Icon, IconName } from '../../Icon/Icon';\nimport { Tooltip } from '../../Tooltip/Tooltip';\nimport { Badge } from '../../Badge/Badge';\nimport { useLocalization } from '../../Provider/Localization';\n\nexport type BaseLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & {\n tooltip?: string;\n};\n\ninterface LinkPropsWithoutIcon extends BaseLinkProps {\n children: JSX.Element | string;\n icon?: never;\n isNew?: never;\n}\n\ninterface LinkPropsWithIcon extends Omit<BaseLinkProps, 'aria-label'> {\n 'aria-label': string;\n children?: never;\n icon: IconName;\n isNew?: boolean;\n}\n\nexport type LinkProps = LinkPropsWithoutIcon | LinkPropsWithIcon;\n\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(function Link(props, ref) {\n const { children, icon, isNew, tooltip, ...otherProps } = props;\n const { texts } = useLocalization();\n const className = cn(getLinkClasses(icon), 'relative', props.className);\n\n const link = (\n <a {...otherProps} className={className} data-taco=\"header-link\" ref={ref} tabIndex={0}>\n {icon ? <Icon name={icon} /> : null}\n {children}\n {isNew ? (\n <Badge\n color=\"blue\"\n small\n // TODO: remove the text-[0.55rem] and replace with a taco approved font size\n // oxlint-disable-next-line class-rules/no-disallowed-color-classes\n className=\"absolute right-0 top-0 -mr-2.5 -mt-1.5 !h-3 !px-0.5 text-[0.55rem] font-normal\">\n {texts.header.new}\n </Badge>\n ) : null}\n </a>\n );\n\n if (tooltip) {\n return <Tooltip title={tooltip}>{link}</Tooltip>;\n }\n\n return link;\n});\n\nexport const getLinkClasses = (icon: IconName | undefined = undefined) =>\n cn(\n 'flex h-8 flex-shrink-0 flex-grow-0 cursor-pointer items-center justify-center ',\n 'focus:!shadow-none focus:!outline-none focus-visible:!yt-focus-dark',\n 'bg-transparent hover:bg-white-subtle focus:bg-white-subtle aria-current-page:bg-white-subtle',\n '!text-white hover:text-white focus:text-white',\n {\n '!rounded-full !h-9 !w-9': icon,\n 'whitespace-nowrap px-3 rounded text-sm hidden lg:flex': !icon,\n }\n );\n"],"names":["React","Link"],"mappings":";;;;;;AA0BO,MAAM,OAAOA,eAAM,WAAyC,SAASC,MAAK,OAAO,KAAK;AACzF,QAAM,EAAE,UAAU,MAAM,OAAO,SAAS,GAAG,eAAe;AACpD,QAAA,EAAE,MAAM,IAAI,gBAAgB;AAClC,QAAM,YAAY,GAAG,eAAe,IAAI,GAAG,YAAY,MAAM,SAAS;AAEtE,QAAM,OACDD,+BAAA,cAAA,KAAA,EAAG,GAAG,YAAY,WAAsB,aAAU,eAAc,KAAU,UAAU,KAChF,oDAAQ,MAAK,EAAA,MAAM,KAAM,CAAA,IAAK,MAC9B,UACA,QACGA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAM;AAAA,MACN,OAAK;AAAA,MAGL,WAAU;AAAA,IAAA;AAAA,IACT,MAAM,OAAO;AAAA,MAElB,IACR;AAGJ,MAAI,SAAS;AACT,WAAQA,+BAAA,cAAA,SAAA,EAAQ,OAAO,QAAA,GAAU,IAAK;AAAA,EAAA;AAGnC,SAAA;AACX,CAAC;AAEY,MAAA,iBAAiB,CAAC,OAA6B,WACxD;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,IACI,2BAA2B;AAAA,IAC3B,yDAAyD,CAAC;AAAA,EAAA;AAElE;"}
|
|
@@ -5,7 +5,7 @@ export type ListCollapsibleProps = Omit<ComposableListItemProps<typeof Collapsib
|
|
|
5
5
|
children: JSX.Element | JSX.Element[];
|
|
6
6
|
defaultOpen?: boolean;
|
|
7
7
|
};
|
|
8
|
-
export declare const Collapsible: React.ForwardRefExoticComponent<Omit<ComposableListItemProps<React.ForwardRefExoticComponent<Omit<import('@base-ui/react
|
|
8
|
+
export declare const Collapsible: React.ForwardRefExoticComponent<Omit<ComposableListItemProps<React.ForwardRefExoticComponent<Omit<import('@base-ui/react').CollapsibleRootProps, "ref"> & React.RefAttributes<HTMLDivElement>>>, "children"> & {
|
|
9
9
|
children: JSX.Element | JSX.Element[];
|
|
10
10
|
defaultOpen?: boolean;
|
|
11
11
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -7,7 +7,7 @@ export type MenuContentProps = Omit<React.ComponentPropsWithoutRef<typeof MenuPr
|
|
|
7
7
|
/** Set the position of the Menu relative to its trigger. Default value is `bottom` */
|
|
8
8
|
placement?: Placement;
|
|
9
9
|
};
|
|
10
|
-
export declare const Content: React.ForwardRefExoticComponent<Omit<Omit<Omit<import('@base-ui/react
|
|
10
|
+
export declare const Content: React.ForwardRefExoticComponent<Omit<Omit<Omit<import('@base-ui/react').ContextMenuPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "children" | "side"> & {
|
|
11
11
|
align?: Align;
|
|
12
12
|
children: React.ReactNode;
|
|
13
13
|
/** Set the position of the Menu relative to its trigger. Default value is `bottom` */
|
|
@@ -3,6 +3,6 @@ import * as React from 'react';
|
|
|
3
3
|
export type MenuSubMenuProps = Omit<React.ComponentPropsWithoutRef<typeof MenuPrimitive.Popup>, 'children' | 'side'> & {
|
|
4
4
|
children: React.ReactNode;
|
|
5
5
|
};
|
|
6
|
-
export declare const SubMenu: React.ForwardRefExoticComponent<Omit<Omit<Omit<import('@base-ui/react
|
|
6
|
+
export declare const SubMenu: React.ForwardRefExoticComponent<Omit<Omit<Omit<import('@base-ui/react').ContextMenuPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "children" | "side"> & {
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -12,10 +12,10 @@ export declare function useTableEditing<TType = unknown>(isEnabled: boolean | un
|
|
|
12
12
|
getRowStatus: (rowId: string) => ("saving" | "saved" | "errored") | undefined;
|
|
13
13
|
setRowStatus: (rowId: string, status: ("saving" | "saved" | "errored") | undefined) => void;
|
|
14
14
|
forceValidate: <T extends TType>(table: ReactTable<T>) => Promise<string[]>;
|
|
15
|
-
setCellValue: <T extends TType>(cell: import('@tanstack/
|
|
16
|
-
getCellValue: <T extends TType>(cell: import('@tanstack/
|
|
17
|
-
getCellError: <T extends TType>(cell: import('@tanstack/
|
|
18
|
-
onCellChanged: <T extends TType>(cell: import('@tanstack/
|
|
15
|
+
setCellValue: <T extends TType>(cell: import('@tanstack/table-core').Cell<T, unknown>, rowIndex: number, value: unknown) => void;
|
|
16
|
+
getCellValue: <T extends TType>(cell: import('@tanstack/table-core').Cell<T, unknown>) => unknown | undefined;
|
|
17
|
+
getCellError: <T extends TType>(cell: import('@tanstack/table-core').Cell<T, unknown>) => string | undefined;
|
|
18
|
+
onCellChanged: <T extends TType>(cell: import('@tanstack/table-core').Cell<T, unknown>, rowIndex: number, nextValue: any, shouldRunUpdaters?: boolean, shouldRunValidation?: boolean) => Promise<void>;
|
|
19
19
|
getErrors: () => string[];
|
|
20
20
|
getErrorsShownInAlert: <T extends TType>() => {
|
|
21
21
|
rowId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.cjs","sources":["../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { motion, useAnimation } from 'framer-motion';\nimport { useTimer } from '../../utils/hooks/useTimer';\nimport { getBadgeIcon, getToastEmptyContentWarning } from './util';\nimport { State } from '../../types';\nimport { useLocalization } from '../Provider/Localization';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport type ToastsTexts = {\n /** Aria-label for the close icon button of toast */\n dismiss: string;\n};\n\nexport type ToastType =
|
|
1
|
+
{"version":3,"file":"Toast.cjs","sources":["../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { motion, useAnimation } from 'framer-motion';\nimport { useTimer } from '../../utils/hooks/useTimer';\nimport { getBadgeIcon, getToastEmptyContentWarning } from './util';\nimport type { State } from '../../types';\nimport { useLocalization } from '../Provider/Localization';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport type ToastsTexts = {\n /** Aria-label for the close icon button of toast */\n dismiss: string;\n};\n\nexport type ToastType = Exclude<State, 'default'> | 'loading';\nexport type ToastOptions = {\n /** Provide time in milliseconds after which the toast should autoclose */\n autoClose?: number;\n /**\n * State will change the icon displayed in toast and other characteristics,\n * for e.g. `loading` state will display a progress animation.\n * Default value is `default`\n */\n type?: ToastType;\n};\nexport type ToastContent = Omit<React.ReactNode, 'null' | 'undefined'>;\nexport type ToastProps = {\n /** Provide a unique id for toast */\n id: string;\n /**\n * Content can be any valid react node, for e.g. a `div`, or a simple text.\n */\n content: ToastContent;\n /** Additional options to define your toast */\n options: ToastOptions;\n /**\n * Handler called when toast closes.\n * To read more about how to provide the text, see [Provider](component:provider) component\n */\n onClose: () => void;\n lastUpdated?: number;\n lastDuplicateId?: string;\n};\n\nexport const Toast = ({ content, lastUpdated, onClose: handleClose, options, ...props }: ToastProps): JSX.Element => {\n const { texts } = useLocalization();\n const { autoClose, type = 'default' } = options;\n const className = cn('bg-white relative flex items-center py-1 px-2 mt-3 w-full rounded yt-shadow print:hidden', {\n 'border border-gray-500': type === 'default' || type === 'loading' || !type,\n 'border border-green-500': type === 'success',\n 'border border-blue-500': type === 'information',\n 'border border-yellow-500': type === 'warning',\n 'border border-red-500': type === 'error',\n });\n const timer = useTimer(autoClose, handleClose);\n const controls = useAnimation();\n\n if (!content) {\n // oxlint-disable-next-line no-console\n console.warn(getToastEmptyContentWarning(content));\n }\n\n React.useEffect(() => {\n if (autoClose) {\n timer.start();\n }\n }, [autoClose]);\n\n const triggerUpdateAnimation = async () => {\n await controls.start({ scale: 1.05 });\n await controls.start({ scale: 1 });\n };\n\n React.useEffect(() => {\n if (lastUpdated) {\n triggerUpdateAnimation();\n\n if (timer.running) {\n timer.start();\n }\n }\n }, [lastUpdated]);\n\n return (\n <motion.div\n {...props}\n animate={controls}\n className={className}\n data-taco=\"toast\"\n onMouseEnter={timer.pause}\n onMouseLeave={timer.resume}>\n {getBadgeIcon(type)}\n <div className=\"flex-grow\">{content as React.ReactNode}</div>\n <IconButton\n appearance=\"discrete\"\n className=\"-mr-2 cursor-pointer self-start !px-0 text-gray-700\"\n icon=\"close\"\n aria-label={texts.toasts.dismiss}\n onClick={handleClose}\n />\n </motion.div>\n );\n};\n"],"names":["useLocalization","useTimer","useAnimation","getToastEmptyContentWarning","motion","getBadgeIcon","IconButton"],"mappings":";;;;;;;;;AA4Ca,MAAA,QAAQ,CAAC,EAAE,SAAS,aAAa,SAAS,aAAa,SAAS,GAAG,YAAqC;AAC3G,QAAA,EAAE,MAAM,IAAIA,6BAAgB;AAClC,QAAM,EAAE,WAAW,OAAO,UAAc,IAAA;AAClC,QAAA,YAAY,GAAG,4FAA4F;AAAA,IAC7G,0BAA0B,SAAS,aAAa,SAAS,aAAa,CAAC;AAAA,IACvE,2BAA2B,SAAS;AAAA,IACpC,0BAA0B,SAAS;AAAA,IACnC,4BAA4B,SAAS;AAAA,IACrC,yBAAyB,SAAS;AAAA,EAAA,CACrC;AACK,QAAA,QAAQC,SAAAA,SAAS,WAAW,WAAW;AAC7C,QAAM,WAAWC,aAAAA,aAAa;AAE9B,MAAI,CAAC,SAAS;AAEF,YAAA,KAAKC,iCAA4B,OAAO,CAAC;AAAA,EAAA;AAGrD,QAAM,UAAU,MAAM;AAClB,QAAI,WAAW;AACX,YAAM,MAAM;AAAA,IAAA;AAAA,EAChB,GACD,CAAC,SAAS,CAAC;AAEd,QAAM,yBAAyB,YAAY;AACvC,UAAM,SAAS,MAAM,EAAE,OAAO,MAAM;AACpC,UAAM,SAAS,MAAM,EAAE,OAAO,GAAG;AAAA,EACrC;AAEA,QAAM,UAAU,MAAM;AAClB,QAAI,aAAa;AACU,6BAAA;AAEvB,UAAI,MAAM,SAAS;AACf,cAAM,MAAM;AAAA,MAAA;AAAA,IAChB;AAAA,EACJ,GACD,CAAC,WAAW,CAAC;AAGZ,SAAA,sBAAA;AAAA,IAACC,aAAAA,OAAO;AAAA,IAAP;AAAA,MACI,GAAG;AAAA,MACJ,SAAS;AAAA,MACT;AAAA,MACA,aAAU;AAAA,MACV,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,IAAA;AAAA,IACnBC,KAAAA,aAAa,IAAI;AAAA,IACjB,sBAAA,cAAA,OAAA,EAAI,WAAU,YAAA,GAAa,OAA2B;AAAA,IACvD,sBAAA;AAAA,MAACC,WAAA;AAAA,MAAA;AAAA,QACG,YAAW;AAAA,QACX,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAY,MAAM,OAAO;AAAA,QACzB,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAEjB;AAER;;"}
|
|
@@ -4,7 +4,7 @@ export type ToastsTexts = {
|
|
|
4
4
|
/** Aria-label for the close icon button of toast */
|
|
5
5
|
dismiss: string;
|
|
6
6
|
};
|
|
7
|
-
export type ToastType =
|
|
7
|
+
export type ToastType = Exclude<State, 'default'> | 'loading';
|
|
8
8
|
export type ToastOptions = {
|
|
9
9
|
/** Provide time in milliseconds after which the toast should autoclose */
|
|
10
10
|
autoClose?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.js","sources":["../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { motion, useAnimation } from 'framer-motion';\nimport { useTimer } from '../../utils/hooks/useTimer';\nimport { getBadgeIcon, getToastEmptyContentWarning } from './util';\nimport { State } from '../../types';\nimport { useLocalization } from '../Provider/Localization';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport type ToastsTexts = {\n /** Aria-label for the close icon button of toast */\n dismiss: string;\n};\n\nexport type ToastType =
|
|
1
|
+
{"version":3,"file":"Toast.js","sources":["../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { motion, useAnimation } from 'framer-motion';\nimport { useTimer } from '../../utils/hooks/useTimer';\nimport { getBadgeIcon, getToastEmptyContentWarning } from './util';\nimport type { State } from '../../types';\nimport { useLocalization } from '../Provider/Localization';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport type ToastsTexts = {\n /** Aria-label for the close icon button of toast */\n dismiss: string;\n};\n\nexport type ToastType = Exclude<State, 'default'> | 'loading';\nexport type ToastOptions = {\n /** Provide time in milliseconds after which the toast should autoclose */\n autoClose?: number;\n /**\n * State will change the icon displayed in toast and other characteristics,\n * for e.g. `loading` state will display a progress animation.\n * Default value is `default`\n */\n type?: ToastType;\n};\nexport type ToastContent = Omit<React.ReactNode, 'null' | 'undefined'>;\nexport type ToastProps = {\n /** Provide a unique id for toast */\n id: string;\n /**\n * Content can be any valid react node, for e.g. a `div`, or a simple text.\n */\n content: ToastContent;\n /** Additional options to define your toast */\n options: ToastOptions;\n /**\n * Handler called when toast closes.\n * To read more about how to provide the text, see [Provider](component:provider) component\n */\n onClose: () => void;\n lastUpdated?: number;\n lastDuplicateId?: string;\n};\n\nexport const Toast = ({ content, lastUpdated, onClose: handleClose, options, ...props }: ToastProps): JSX.Element => {\n const { texts } = useLocalization();\n const { autoClose, type = 'default' } = options;\n const className = cn('bg-white relative flex items-center py-1 px-2 mt-3 w-full rounded yt-shadow print:hidden', {\n 'border border-gray-500': type === 'default' || type === 'loading' || !type,\n 'border border-green-500': type === 'success',\n 'border border-blue-500': type === 'information',\n 'border border-yellow-500': type === 'warning',\n 'border border-red-500': type === 'error',\n });\n const timer = useTimer(autoClose, handleClose);\n const controls = useAnimation();\n\n if (!content) {\n // oxlint-disable-next-line no-console\n console.warn(getToastEmptyContentWarning(content));\n }\n\n React.useEffect(() => {\n if (autoClose) {\n timer.start();\n }\n }, [autoClose]);\n\n const triggerUpdateAnimation = async () => {\n await controls.start({ scale: 1.05 });\n await controls.start({ scale: 1 });\n };\n\n React.useEffect(() => {\n if (lastUpdated) {\n triggerUpdateAnimation();\n\n if (timer.running) {\n timer.start();\n }\n }\n }, [lastUpdated]);\n\n return (\n <motion.div\n {...props}\n animate={controls}\n className={className}\n data-taco=\"toast\"\n onMouseEnter={timer.pause}\n onMouseLeave={timer.resume}>\n {getBadgeIcon(type)}\n <div className=\"flex-grow\">{content as React.ReactNode}</div>\n <IconButton\n appearance=\"discrete\"\n className=\"-mr-2 cursor-pointer self-start !px-0 text-gray-700\"\n icon=\"close\"\n aria-label={texts.toasts.dismiss}\n onClick={handleClose}\n />\n </motion.div>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;AA4Ca,MAAA,QAAQ,CAAC,EAAE,SAAS,aAAa,SAAS,aAAa,SAAS,GAAG,YAAqC;AAC3G,QAAA,EAAE,MAAM,IAAI,gBAAgB;AAClC,QAAM,EAAE,WAAW,OAAO,UAAc,IAAA;AAClC,QAAA,YAAY,GAAG,4FAA4F;AAAA,IAC7G,0BAA0B,SAAS,aAAa,SAAS,aAAa,CAAC;AAAA,IACvE,2BAA2B,SAAS;AAAA,IACpC,0BAA0B,SAAS;AAAA,IACnC,4BAA4B,SAAS;AAAA,IACrC,yBAAyB,SAAS;AAAA,EAAA,CACrC;AACK,QAAA,QAAQ,SAAS,WAAW,WAAW;AAC7C,QAAM,WAAW,aAAa;AAE9B,MAAI,CAAC,SAAS;AAEF,YAAA,KAAK,4BAA4B,OAAO,CAAC;AAAA,EAAA;AAGrDA,iBAAM,UAAU,MAAM;AAClB,QAAI,WAAW;AACX,YAAM,MAAM;AAAA,IAAA;AAAA,EAChB,GACD,CAAC,SAAS,CAAC;AAEd,QAAM,yBAAyB,YAAY;AACvC,UAAM,SAAS,MAAM,EAAE,OAAO,MAAM;AACpC,UAAM,SAAS,MAAM,EAAE,OAAO,GAAG;AAAA,EACrC;AAEAA,iBAAM,UAAU,MAAM;AAClB,QAAI,aAAa;AACU,6BAAA;AAEvB,UAAI,MAAM,SAAS;AACf,cAAM,MAAM;AAAA,MAAA;AAAA,IAChB;AAAA,EACJ,GACD,CAAC,WAAW,CAAC;AAGZ,SAAAA,+BAAA;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACI,GAAG;AAAA,MACJ,SAAS;AAAA,MACT;AAAA,MACA,aAAU;AAAA,MACV,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,IAAA;AAAA,IACnB,aAAa,IAAI;AAAA,IACjBA,+BAAA,cAAA,OAAA,EAAI,WAAU,YAAA,GAAa,OAA2B;AAAA,IACvDA,+BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,YAAW;AAAA,QACX,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAY,MAAM,OAAO;AAAA,QACzB,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAEjB;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.cjs","sources":["../../../src/components/Toast/util.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from '../Spinner/Spinner';\nimport { ToastContent, ToastType } from './Toast';\nimport { BadgeIcon } from '../BadgeIcon/BadgeIcon';\n\nexport const getBadgeIcon = (type: ToastType): JSX.Element | null => {\n return (\n <div className=\"mr-2 mt-[5px] flex-shrink-0 self-start\">\n {(() => {\n switch (type) {\n case 'success':\n return <BadgeIcon icon=\"tick\" color=\"green\" />;\n case 'error':\n return <BadgeIcon icon=\"close\" color=\"red\" />;\n case 'warning':\n return <BadgeIcon icon=\"warning\" color=\"yellow\" />;\n case 'information':\n return <BadgeIcon icon=\"info\" color=\"blue\" />;\n case 'loading':\n return <Spinner delay={0} className=\"h-5 w-5\" />;\n default:\n return null;\n }\n })()}\n </div>\n );\n};\n\nexport const getToastEmptyContentWarning = (content?: ToastContent) =>\n `Toast requires 'content' property, which can't be empty string, null or undefined. Current content value is set to ${\n content === '' ? 'empty string' : content\n }.`;\n"],"names":["BadgeIcon","Spinner"],"mappings":";;;;;AAKa,MAAA,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"util.cjs","sources":["../../../src/components/Toast/util.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from '../Spinner/Spinner';\nimport { ToastContent, ToastType } from './Toast';\nimport { BadgeIcon } from '../BadgeIcon/BadgeIcon';\n\nexport const getBadgeIcon = (type: ToastType | 'default'): JSX.Element | null => {\n return (\n <div className=\"mr-2 mt-[5px] flex-shrink-0 self-start\">\n {(() => {\n switch (type) {\n case 'success':\n return <BadgeIcon icon=\"tick\" color=\"green\" />;\n case 'error':\n return <BadgeIcon icon=\"close\" color=\"red\" />;\n case 'warning':\n return <BadgeIcon icon=\"warning\" color=\"yellow\" />;\n case 'information':\n return <BadgeIcon icon=\"info\" color=\"blue\" />;\n case 'loading':\n return <Spinner delay={0} className=\"h-5 w-5\" />;\n default:\n return null;\n }\n })()}\n </div>\n );\n};\n\nexport const getToastEmptyContentWarning = (content?: ToastContent) =>\n `Toast requires 'content' property, which can't be empty string, null or undefined. Current content value is set to ${\n content === '' ? 'empty string' : content\n }.`;\n"],"names":["BadgeIcon","Spinner"],"mappings":";;;;;AAKa,MAAA,eAAe,CAAC,SAAoD;AAC7E,SACK,sBAAA,cAAA,OAAA,EAAI,WAAU,yCAAA,IACT,MAAM;AACJ,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,eAAQ,sBAAA,cAAAA,qBAAA,EAAU,MAAK,QAAO,OAAM,SAAQ;AAAA,MAChD,KAAK;AACD,eAAQ,sBAAA,cAAAA,qBAAA,EAAU,MAAK,SAAQ,OAAM,OAAM;AAAA,MAC/C,KAAK;AACD,eAAQ,sBAAA,cAAAA,qBAAA,EAAU,MAAK,WAAU,OAAM,UAAS;AAAA,MACpD,KAAK;AACD,eAAQ,sBAAA,cAAAA,qBAAA,EAAU,MAAK,QAAO,OAAM,QAAO;AAAA,MAC/C,KAAK;AACD,eAAQ,sBAAA,cAAAC,iBAAA,EAAQ,OAAO,GAAG,WAAU,WAAU;AAAA,MAClD;AACW,eAAA;AAAA,IAAA;AAAA,EACf,IAER;AAER;AAEO,MAAM,8BAA8B,CAAC,YACxC,sHACI,YAAY,KAAK,iBAAiB,OACtC;;;"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { ToastContent, ToastType } from './Toast';
|
|
2
|
-
export declare const getBadgeIcon: (type: ToastType) => JSX.Element | null;
|
|
2
|
+
export declare const getBadgeIcon: (type: ToastType | "default") => JSX.Element | null;
|
|
3
3
|
export declare const getToastEmptyContentWarning: (content?: ToastContent) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sources":["../../../src/components/Toast/util.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from '../Spinner/Spinner';\nimport { ToastContent, ToastType } from './Toast';\nimport { BadgeIcon } from '../BadgeIcon/BadgeIcon';\n\nexport const getBadgeIcon = (type: ToastType): JSX.Element | null => {\n return (\n <div className=\"mr-2 mt-[5px] flex-shrink-0 self-start\">\n {(() => {\n switch (type) {\n case 'success':\n return <BadgeIcon icon=\"tick\" color=\"green\" />;\n case 'error':\n return <BadgeIcon icon=\"close\" color=\"red\" />;\n case 'warning':\n return <BadgeIcon icon=\"warning\" color=\"yellow\" />;\n case 'information':\n return <BadgeIcon icon=\"info\" color=\"blue\" />;\n case 'loading':\n return <Spinner delay={0} className=\"h-5 w-5\" />;\n default:\n return null;\n }\n })()}\n </div>\n );\n};\n\nexport const getToastEmptyContentWarning = (content?: ToastContent) =>\n `Toast requires 'content' property, which can't be empty string, null or undefined. Current content value is set to ${\n content === '' ? 'empty string' : content\n }.`;\n"],"names":["React"],"mappings":";;;AAKa,MAAA,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"util.js","sources":["../../../src/components/Toast/util.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from '../Spinner/Spinner';\nimport { ToastContent, ToastType } from './Toast';\nimport { BadgeIcon } from '../BadgeIcon/BadgeIcon';\n\nexport const getBadgeIcon = (type: ToastType | 'default'): JSX.Element | null => {\n return (\n <div className=\"mr-2 mt-[5px] flex-shrink-0 self-start\">\n {(() => {\n switch (type) {\n case 'success':\n return <BadgeIcon icon=\"tick\" color=\"green\" />;\n case 'error':\n return <BadgeIcon icon=\"close\" color=\"red\" />;\n case 'warning':\n return <BadgeIcon icon=\"warning\" color=\"yellow\" />;\n case 'information':\n return <BadgeIcon icon=\"info\" color=\"blue\" />;\n case 'loading':\n return <Spinner delay={0} className=\"h-5 w-5\" />;\n default:\n return null;\n }\n })()}\n </div>\n );\n};\n\nexport const getToastEmptyContentWarning = (content?: ToastContent) =>\n `Toast requires 'content' property, which can't be empty string, null or undefined. Current content value is set to ${\n content === '' ? 'empty string' : content\n }.`;\n"],"names":["React"],"mappings":";;;AAKa,MAAA,eAAe,CAAC,SAAoD;AAC7E,SACKA,+BAAA,cAAA,OAAA,EAAI,WAAU,yCAAA,IACT,MAAM;AACJ,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,eAAQA,+BAAA,cAAA,WAAA,EAAU,MAAK,QAAO,OAAM,SAAQ;AAAA,MAChD,KAAK;AACD,eAAQA,+BAAA,cAAA,WAAA,EAAU,MAAK,SAAQ,OAAM,OAAM;AAAA,MAC/C,KAAK;AACD,eAAQA,+BAAA,cAAA,WAAA,EAAU,MAAK,WAAU,OAAM,UAAS;AAAA,MACpD,KAAK;AACD,eAAQA,+BAAA,cAAA,WAAA,EAAU,MAAK,QAAO,OAAM,QAAO;AAAA,MAC/C,KAAK;AACD,eAAQA,+BAAA,cAAA,SAAA,EAAQ,OAAO,GAAG,WAAU,WAAU;AAAA,MAClD;AACW,eAAA;AAAA,IAAA;AAAA,EACf,IAER;AAER;AAEO,MAAM,8BAA8B,CAAC,YACxC,sHACI,YAAY,KAAK,iBAAiB,OACtC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function useTacoSettings(): import('
|
|
1
|
+
export declare function useTacoSettings(): import('..').TacoSettings;
|
|
@@ -99,7 +99,7 @@ const DisplayRow = React.memo(
|
|
|
99
99
|
attributes["data-row-selected"] = row.getIsSelected() || row.getIsAllSubRowsSelected() ? true : void 0;
|
|
100
100
|
}
|
|
101
101
|
let expandedRow;
|
|
102
|
-
if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded()) {
|
|
102
|
+
if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded() && !row.getIsGrouped()) {
|
|
103
103
|
attributes["data-row-expanded"] = true;
|
|
104
104
|
expandedRow = (_c = (_b = (_a = tableMeta.rowExpansion).rowExpansionRenderer) == null ? void 0 : _b.call(_a, row.original)) == null ? void 0 : _c();
|
|
105
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisplayRow.cjs","sources":["../../../../../../../src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.tsx"],"sourcesContent":["import React from 'react';\nimport { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport cn from 'clsx';\nimport { Cell } from '../../Columns/Cell/Cell';\nimport { TableRowRendererProps } from '../../../types';\nimport { TableRowWithMetaData } from '../../../../types';\nimport { isElementInteractive } from '../../../../../../utils/dom';\nimport { useDropTarget } from '../../../../../../utils/hooks/useDropTarget';\nimport { useResizeObserver } from '../../../../../../hooks/useResizeObserver';\nimport { mergeRefs } from '../../../../../../utils/mergeRefs';\n\nexport type DisplayRowProps<TType = unknown> = React.HTMLAttributes<HTMLTableRowElement> &\n TableRowRendererProps<TType> & {\n remeasureDependencies?: React.DependencyList;\n };\n\nexport const DisplayRow = React.memo(\n React.forwardRef<HTMLTableRowElement, DisplayRowProps>(function DisplayRow<TType = unknown>(\n props: DisplayRowProps<TType>,\n externalRef: React.Ref<HTMLTableRowElement>\n ) {\n const {\n children,\n cellRenderer: CellRenderer,\n index,\n measureRow,\n row,\n table,\n remeasureDependencies = [],\n ...otherAttributes\n } = props;\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const attributes: any = {\n ...otherAttributes,\n 'data-row-id': row.id,\n 'data-row-index': index,\n tabIndex: -1,\n };\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLTableRowElement>) => {\n const clickedElement = event.target as HTMLElement;\n\n if (!event.currentTarget?.contains(event.target as HTMLElement) || isElementInteractive(clickedElement)) {\n return;\n }\n\n tableMeta.rowClick.handleClick(event, row.original);\n },\n [row.original]\n );\n const handlePointerDown = React.useCallback(() => {\n requestAnimationFrame(() => tableMeta.rowActive.setRowActiveIndex(index));\n }, [index]);\n\n // row active\n if (tableMeta.rowActive.isEnabled) {\n attributes['data-row-active'] = tableMeta.rowActive.rowActiveIndex === index ? true : undefined;\n // we use pointerdown because it let's us picks up clicks on components inside the row, e.g. checkboxes\n attributes.onPointerDown = handlePointerDown;\n }\n\n // row click\n if (tableMeta.rowClick.isEnabled(row.original)) {\n attributes.onClick = handleClick;\n }\n\n // row drag\n if (tableMeta.rowDrag.isEnabled) {\n attributes['aria-grabbed'] = !!tableMeta.rowDrag.dragging[row.id];\n attributes.draggable = true;\n const GHOST_ELEMENT_ID = 'taco_table_dragging';\n\n attributes.onDragStart = (event: React.DragEvent): void => {\n let rows = [row];\n\n if (row.getCanSelect()) {\n rows = row.getIsSelected() ? table.getSelectedRowModel().rows : [row, ...table.getSelectedRowModel().rows];\n }\n\n const data = rows.map(row => row.original);\n\n tableMeta.rowDrag.setDragging?.(\n rows.reduce((dragging, rowBeingDragged) => ({ ...dragging, [rowBeingDragged.id]: true }), {})\n );\n\n // set a default data value so that the consumer doesn't have to\n event.dataTransfer.setData('text', JSON.stringify(data));\n\n const showPlaceholder = (text: string) => {\n const ghost = document.createElement('div');\n ghost.id = GHOST_ELEMENT_ID;\n ghost.className = 'wcag-blue rounded flex w-48 p-4 absolute -ml-[100vw]';\n ghost.innerText = text;\n document.body.append(ghost);\n event.dataTransfer.setDragImage(ghost, 0, 0);\n };\n\n const setDataTransfer = (text: string) => event.dataTransfer.setData('text', text);\n\n tableMeta.rowDrag.handleRowDrag?.(data, showPlaceholder, setDataTransfer);\n };\n\n attributes.onDragEnd = (): void => {\n document.getElementById(GHOST_ELEMENT_ID)?.remove();\n tableMeta.rowDrag.setDragging?.({});\n };\n }\n\n // row drop\n const [isDraggedOver, dropTargetProps] = useDropTarget(event => tableMeta.rowDrop.handleDrop?.(event, row.original));\n\n if (tableMeta.rowDrop.isEnabled) {\n attributes.onDragEnter = dropTargetProps?.onDragEnter;\n attributes.onDragLeave = dropTargetProps?.onDragLeave;\n attributes.onDragOver = dropTargetProps?.onDragOver;\n attributes.onDrop = dropTargetProps?.onDrop;\n attributes['data-row-dragged-over'] = isDraggedOver;\n }\n\n // row grouping\n if (table.options.enableGrouping) {\n attributes['data-row-group'] = row.getIsGrouped() ? true : undefined;\n }\n\n // row selection\n if (row.getCanSelect()) {\n attributes['data-row-selected'] = row.getIsSelected() || row.getIsAllSubRowsSelected() ? true : undefined;\n }\n\n // row expansion\n let expandedRow;\n\n if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded()) {\n attributes['data-row-expanded'] = true;\n expandedRow = tableMeta.rowExpansion.rowExpansionRenderer?.(row.original)?.();\n }\n\n const rowMeta = (row.original as TableRowWithMetaData<TType>)._meta;\n\n if (rowMeta?.layout) {\n attributes['data-row-meta-layout'] = rowMeta.layout;\n }\n\n const ref = React.useRef<HTMLTableRowElement>(null);\n const expansionRef = React.useRef<HTMLTableRowElement>(null);\n const expandedRowSize = useResizeObserver(expansionRef, !!expandedRow);\n\n React.useEffect(() => {\n const rowHeight = ref.current?.getBoundingClientRect().height ?? 0;\n const expansionHeight = expansionRef.current?.getBoundingClientRect().height ?? 0;\n\n measureRow(rowHeight + expansionHeight);\n }, [expansionRef.current, expandedRowSize?.height, ...remeasureDependencies]);\n\n const className = cn('group/row', otherAttributes.className, {\n 'hover:cursor-grab': tableMeta.rowDrag.isEnabled && typeof attributes.onClick !== 'function',\n 'hover:cursor-pointer': typeof attributes.onClick === 'function',\n });\n\n const isGrouped = row.getIsGrouped();\n\n const mergedRef = mergeRefs([ref, externalRef]);\n\n return (\n <>\n <tr {...attributes} className={className} ref={mergedRef}>\n {children}\n {row\n .getVisibleCells()\n // Filter out the row actions cell from rendering in Grouped Row\n .filter(cell => !(isGrouped && cell.column.id === '__actions'))\n .map((cell, cellIndex) => (\n <Cell key={cell.id} cell={cell} index={cellIndex} renderer={CellRenderer} />\n ))}\n </tr>\n {expandedRow ? (\n <tr data-row-parent-id={row.id} ref={expansionRef}>\n <td className=\"col-span-full\">{expandedRow}</td>\n </tr>\n ) : null}\n </>\n );\n })\n) as <TType = unknown>(props: DisplayRowProps<TType> & { ref?: React.Ref<HTMLTableRowElement> }) => JSX.Element;\n"],"names":["DisplayRow","_a","isElementInteractive","row","_b","_c","useDropTarget","useResizeObserver","mergeRefs","Cell"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DisplayRow.cjs","sources":["../../../../../../../src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.tsx"],"sourcesContent":["import React from 'react';\nimport { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport cn from 'clsx';\nimport { Cell } from '../../Columns/Cell/Cell';\nimport { TableRowRendererProps } from '../../../types';\nimport { TableRowWithMetaData } from '../../../../types';\nimport { isElementInteractive } from '../../../../../../utils/dom';\nimport { useDropTarget } from '../../../../../../utils/hooks/useDropTarget';\nimport { useResizeObserver } from '../../../../../../hooks/useResizeObserver';\nimport { mergeRefs } from '../../../../../../utils/mergeRefs';\n\nexport type DisplayRowProps<TType = unknown> = React.HTMLAttributes<HTMLTableRowElement> &\n TableRowRendererProps<TType> & {\n remeasureDependencies?: React.DependencyList;\n };\n\nexport const DisplayRow = React.memo(\n React.forwardRef<HTMLTableRowElement, DisplayRowProps>(function DisplayRow<TType = unknown>(\n props: DisplayRowProps<TType>,\n externalRef: React.Ref<HTMLTableRowElement>\n ) {\n const {\n children,\n cellRenderer: CellRenderer,\n index,\n measureRow,\n row,\n table,\n remeasureDependencies = [],\n ...otherAttributes\n } = props;\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const attributes: any = {\n ...otherAttributes,\n 'data-row-id': row.id,\n 'data-row-index': index,\n tabIndex: -1,\n };\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLTableRowElement>) => {\n const clickedElement = event.target as HTMLElement;\n\n if (!event.currentTarget?.contains(event.target as HTMLElement) || isElementInteractive(clickedElement)) {\n return;\n }\n\n tableMeta.rowClick.handleClick(event, row.original);\n },\n [row.original]\n );\n const handlePointerDown = React.useCallback(() => {\n requestAnimationFrame(() => tableMeta.rowActive.setRowActiveIndex(index));\n }, [index]);\n\n // row active\n if (tableMeta.rowActive.isEnabled) {\n attributes['data-row-active'] = tableMeta.rowActive.rowActiveIndex === index ? true : undefined;\n // we use pointerdown because it let's us picks up clicks on components inside the row, e.g. checkboxes\n attributes.onPointerDown = handlePointerDown;\n }\n\n // row click\n if (tableMeta.rowClick.isEnabled(row.original)) {\n attributes.onClick = handleClick;\n }\n\n // row drag\n if (tableMeta.rowDrag.isEnabled) {\n attributes['aria-grabbed'] = !!tableMeta.rowDrag.dragging[row.id];\n attributes.draggable = true;\n const GHOST_ELEMENT_ID = 'taco_table_dragging';\n\n attributes.onDragStart = (event: React.DragEvent): void => {\n let rows = [row];\n\n if (row.getCanSelect()) {\n rows = row.getIsSelected() ? table.getSelectedRowModel().rows : [row, ...table.getSelectedRowModel().rows];\n }\n\n const data = rows.map(row => row.original);\n\n tableMeta.rowDrag.setDragging?.(\n rows.reduce((dragging, rowBeingDragged) => ({ ...dragging, [rowBeingDragged.id]: true }), {})\n );\n\n // set a default data value so that the consumer doesn't have to\n event.dataTransfer.setData('text', JSON.stringify(data));\n\n const showPlaceholder = (text: string) => {\n const ghost = document.createElement('div');\n ghost.id = GHOST_ELEMENT_ID;\n ghost.className = 'wcag-blue rounded flex w-48 p-4 absolute -ml-[100vw]';\n ghost.innerText = text;\n document.body.append(ghost);\n event.dataTransfer.setDragImage(ghost, 0, 0);\n };\n\n const setDataTransfer = (text: string) => event.dataTransfer.setData('text', text);\n\n tableMeta.rowDrag.handleRowDrag?.(data, showPlaceholder, setDataTransfer);\n };\n\n attributes.onDragEnd = (): void => {\n document.getElementById(GHOST_ELEMENT_ID)?.remove();\n tableMeta.rowDrag.setDragging?.({});\n };\n }\n\n // row drop\n const [isDraggedOver, dropTargetProps] = useDropTarget(event => tableMeta.rowDrop.handleDrop?.(event, row.original));\n\n if (tableMeta.rowDrop.isEnabled) {\n attributes.onDragEnter = dropTargetProps?.onDragEnter;\n attributes.onDragLeave = dropTargetProps?.onDragLeave;\n attributes.onDragOver = dropTargetProps?.onDragOver;\n attributes.onDrop = dropTargetProps?.onDrop;\n attributes['data-row-dragged-over'] = isDraggedOver;\n }\n\n // row grouping\n if (table.options.enableGrouping) {\n attributes['data-row-group'] = row.getIsGrouped() ? true : undefined;\n }\n\n // row selection\n if (row.getCanSelect()) {\n attributes['data-row-selected'] = row.getIsSelected() || row.getIsAllSubRowsSelected() ? true : undefined;\n }\n\n // row expansion\n // When grouping is enabled, a group header row also reports getIsExpanded() === true\n // when its children are visible. Skip the renderer in that case — otherwise row.original\n // (the first child's data) gets rendered as expansion content under the header.\n let expandedRow;\n\n if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded() && !row.getIsGrouped()) {\n attributes['data-row-expanded'] = true;\n expandedRow = tableMeta.rowExpansion.rowExpansionRenderer?.(row.original)?.();\n }\n\n const rowMeta = (row.original as TableRowWithMetaData<TType>)._meta;\n\n if (rowMeta?.layout) {\n attributes['data-row-meta-layout'] = rowMeta.layout;\n }\n\n const ref = React.useRef<HTMLTableRowElement>(null);\n const expansionRef = React.useRef<HTMLTableRowElement>(null);\n const expandedRowSize = useResizeObserver(expansionRef, !!expandedRow);\n\n React.useEffect(() => {\n const rowHeight = ref.current?.getBoundingClientRect().height ?? 0;\n const expansionHeight = expansionRef.current?.getBoundingClientRect().height ?? 0;\n\n measureRow(rowHeight + expansionHeight);\n }, [expansionRef.current, expandedRowSize?.height, ...remeasureDependencies]);\n\n const className = cn('group/row', otherAttributes.className, {\n 'hover:cursor-grab': tableMeta.rowDrag.isEnabled && typeof attributes.onClick !== 'function',\n 'hover:cursor-pointer': typeof attributes.onClick === 'function',\n });\n\n const isGrouped = row.getIsGrouped();\n\n const mergedRef = mergeRefs([ref, externalRef]);\n\n return (\n <>\n <tr {...attributes} className={className} ref={mergedRef}>\n {children}\n {row\n .getVisibleCells()\n // Filter out the row actions cell from rendering in Grouped Row\n .filter(cell => !(isGrouped && cell.column.id === '__actions'))\n .map((cell, cellIndex) => (\n <Cell key={cell.id} cell={cell} index={cellIndex} renderer={CellRenderer} />\n ))}\n </tr>\n {expandedRow ? (\n <tr data-row-parent-id={row.id} ref={expansionRef}>\n <td className=\"col-span-full\">{expandedRow}</td>\n </tr>\n ) : null}\n </>\n );\n })\n) as <TType = unknown>(props: DisplayRowProps<TType> & { ref?: React.Ref<HTMLTableRowElement> }) => JSX.Element;\n"],"names":["DisplayRow","_a","isElementInteractive","row","_b","_c","useDropTarget","useResizeObserver","mergeRefs","Cell"],"mappings":"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"}
|
|
@@ -97,7 +97,7 @@ const DisplayRow = React__default.memo(
|
|
|
97
97
|
attributes["data-row-selected"] = row.getIsSelected() || row.getIsAllSubRowsSelected() ? true : void 0;
|
|
98
98
|
}
|
|
99
99
|
let expandedRow;
|
|
100
|
-
if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded()) {
|
|
100
|
+
if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded() && !row.getIsGrouped()) {
|
|
101
101
|
attributes["data-row-expanded"] = true;
|
|
102
102
|
expandedRow = (_c = (_b = (_a = tableMeta.rowExpansion).rowExpansionRenderer) == null ? void 0 : _b.call(_a, row.original)) == null ? void 0 : _c();
|
|
103
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisplayRow.js","sources":["../../../../../../../src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.tsx"],"sourcesContent":["import React from 'react';\nimport { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport cn from 'clsx';\nimport { Cell } from '../../Columns/Cell/Cell';\nimport { TableRowRendererProps } from '../../../types';\nimport { TableRowWithMetaData } from '../../../../types';\nimport { isElementInteractive } from '../../../../../../utils/dom';\nimport { useDropTarget } from '../../../../../../utils/hooks/useDropTarget';\nimport { useResizeObserver } from '../../../../../../hooks/useResizeObserver';\nimport { mergeRefs } from '../../../../../../utils/mergeRefs';\n\nexport type DisplayRowProps<TType = unknown> = React.HTMLAttributes<HTMLTableRowElement> &\n TableRowRendererProps<TType> & {\n remeasureDependencies?: React.DependencyList;\n };\n\nexport const DisplayRow = React.memo(\n React.forwardRef<HTMLTableRowElement, DisplayRowProps>(function DisplayRow<TType = unknown>(\n props: DisplayRowProps<TType>,\n externalRef: React.Ref<HTMLTableRowElement>\n ) {\n const {\n children,\n cellRenderer: CellRenderer,\n index,\n measureRow,\n row,\n table,\n remeasureDependencies = [],\n ...otherAttributes\n } = props;\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const attributes: any = {\n ...otherAttributes,\n 'data-row-id': row.id,\n 'data-row-index': index,\n tabIndex: -1,\n };\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLTableRowElement>) => {\n const clickedElement = event.target as HTMLElement;\n\n if (!event.currentTarget?.contains(event.target as HTMLElement) || isElementInteractive(clickedElement)) {\n return;\n }\n\n tableMeta.rowClick.handleClick(event, row.original);\n },\n [row.original]\n );\n const handlePointerDown = React.useCallback(() => {\n requestAnimationFrame(() => tableMeta.rowActive.setRowActiveIndex(index));\n }, [index]);\n\n // row active\n if (tableMeta.rowActive.isEnabled) {\n attributes['data-row-active'] = tableMeta.rowActive.rowActiveIndex === index ? true : undefined;\n // we use pointerdown because it let's us picks up clicks on components inside the row, e.g. checkboxes\n attributes.onPointerDown = handlePointerDown;\n }\n\n // row click\n if (tableMeta.rowClick.isEnabled(row.original)) {\n attributes.onClick = handleClick;\n }\n\n // row drag\n if (tableMeta.rowDrag.isEnabled) {\n attributes['aria-grabbed'] = !!tableMeta.rowDrag.dragging[row.id];\n attributes.draggable = true;\n const GHOST_ELEMENT_ID = 'taco_table_dragging';\n\n attributes.onDragStart = (event: React.DragEvent): void => {\n let rows = [row];\n\n if (row.getCanSelect()) {\n rows = row.getIsSelected() ? table.getSelectedRowModel().rows : [row, ...table.getSelectedRowModel().rows];\n }\n\n const data = rows.map(row => row.original);\n\n tableMeta.rowDrag.setDragging?.(\n rows.reduce((dragging, rowBeingDragged) => ({ ...dragging, [rowBeingDragged.id]: true }), {})\n );\n\n // set a default data value so that the consumer doesn't have to\n event.dataTransfer.setData('text', JSON.stringify(data));\n\n const showPlaceholder = (text: string) => {\n const ghost = document.createElement('div');\n ghost.id = GHOST_ELEMENT_ID;\n ghost.className = 'wcag-blue rounded flex w-48 p-4 absolute -ml-[100vw]';\n ghost.innerText = text;\n document.body.append(ghost);\n event.dataTransfer.setDragImage(ghost, 0, 0);\n };\n\n const setDataTransfer = (text: string) => event.dataTransfer.setData('text', text);\n\n tableMeta.rowDrag.handleRowDrag?.(data, showPlaceholder, setDataTransfer);\n };\n\n attributes.onDragEnd = (): void => {\n document.getElementById(GHOST_ELEMENT_ID)?.remove();\n tableMeta.rowDrag.setDragging?.({});\n };\n }\n\n // row drop\n const [isDraggedOver, dropTargetProps] = useDropTarget(event => tableMeta.rowDrop.handleDrop?.(event, row.original));\n\n if (tableMeta.rowDrop.isEnabled) {\n attributes.onDragEnter = dropTargetProps?.onDragEnter;\n attributes.onDragLeave = dropTargetProps?.onDragLeave;\n attributes.onDragOver = dropTargetProps?.onDragOver;\n attributes.onDrop = dropTargetProps?.onDrop;\n attributes['data-row-dragged-over'] = isDraggedOver;\n }\n\n // row grouping\n if (table.options.enableGrouping) {\n attributes['data-row-group'] = row.getIsGrouped() ? true : undefined;\n }\n\n // row selection\n if (row.getCanSelect()) {\n attributes['data-row-selected'] = row.getIsSelected() || row.getIsAllSubRowsSelected() ? true : undefined;\n }\n\n // row expansion\n let expandedRow;\n\n if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded()) {\n attributes['data-row-expanded'] = true;\n expandedRow = tableMeta.rowExpansion.rowExpansionRenderer?.(row.original)?.();\n }\n\n const rowMeta = (row.original as TableRowWithMetaData<TType>)._meta;\n\n if (rowMeta?.layout) {\n attributes['data-row-meta-layout'] = rowMeta.layout;\n }\n\n const ref = React.useRef<HTMLTableRowElement>(null);\n const expansionRef = React.useRef<HTMLTableRowElement>(null);\n const expandedRowSize = useResizeObserver(expansionRef, !!expandedRow);\n\n React.useEffect(() => {\n const rowHeight = ref.current?.getBoundingClientRect().height ?? 0;\n const expansionHeight = expansionRef.current?.getBoundingClientRect().height ?? 0;\n\n measureRow(rowHeight + expansionHeight);\n }, [expansionRef.current, expandedRowSize?.height, ...remeasureDependencies]);\n\n const className = cn('group/row', otherAttributes.className, {\n 'hover:cursor-grab': tableMeta.rowDrag.isEnabled && typeof attributes.onClick !== 'function',\n 'hover:cursor-pointer': typeof attributes.onClick === 'function',\n });\n\n const isGrouped = row.getIsGrouped();\n\n const mergedRef = mergeRefs([ref, externalRef]);\n\n return (\n <>\n <tr {...attributes} className={className} ref={mergedRef}>\n {children}\n {row\n .getVisibleCells()\n // Filter out the row actions cell from rendering in Grouped Row\n .filter(cell => !(isGrouped && cell.column.id === '__actions'))\n .map((cell, cellIndex) => (\n <Cell key={cell.id} cell={cell} index={cellIndex} renderer={CellRenderer} />\n ))}\n </tr>\n {expandedRow ? (\n <tr data-row-parent-id={row.id} ref={expansionRef}>\n <td className=\"col-span-full\">{expandedRow}</td>\n </tr>\n ) : null}\n </>\n );\n })\n) as <TType = unknown>(props: DisplayRowProps<TType> & { ref?: React.Ref<HTMLTableRowElement> }) => JSX.Element;\n"],"names":["React","DisplayRow","_a","row","_b","_c"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DisplayRow.js","sources":["../../../../../../../src/primitives/Table/Core/components/Row/BuiltIns/DisplayRow.tsx"],"sourcesContent":["import React from 'react';\nimport { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport cn from 'clsx';\nimport { Cell } from '../../Columns/Cell/Cell';\nimport { TableRowRendererProps } from '../../../types';\nimport { TableRowWithMetaData } from '../../../../types';\nimport { isElementInteractive } from '../../../../../../utils/dom';\nimport { useDropTarget } from '../../../../../../utils/hooks/useDropTarget';\nimport { useResizeObserver } from '../../../../../../hooks/useResizeObserver';\nimport { mergeRefs } from '../../../../../../utils/mergeRefs';\n\nexport type DisplayRowProps<TType = unknown> = React.HTMLAttributes<HTMLTableRowElement> &\n TableRowRendererProps<TType> & {\n remeasureDependencies?: React.DependencyList;\n };\n\nexport const DisplayRow = React.memo(\n React.forwardRef<HTMLTableRowElement, DisplayRowProps>(function DisplayRow<TType = unknown>(\n props: DisplayRowProps<TType>,\n externalRef: React.Ref<HTMLTableRowElement>\n ) {\n const {\n children,\n cellRenderer: CellRenderer,\n index,\n measureRow,\n row,\n table,\n remeasureDependencies = [],\n ...otherAttributes\n } = props;\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n\n const attributes: any = {\n ...otherAttributes,\n 'data-row-id': row.id,\n 'data-row-index': index,\n tabIndex: -1,\n };\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLTableRowElement>) => {\n const clickedElement = event.target as HTMLElement;\n\n if (!event.currentTarget?.contains(event.target as HTMLElement) || isElementInteractive(clickedElement)) {\n return;\n }\n\n tableMeta.rowClick.handleClick(event, row.original);\n },\n [row.original]\n );\n const handlePointerDown = React.useCallback(() => {\n requestAnimationFrame(() => tableMeta.rowActive.setRowActiveIndex(index));\n }, [index]);\n\n // row active\n if (tableMeta.rowActive.isEnabled) {\n attributes['data-row-active'] = tableMeta.rowActive.rowActiveIndex === index ? true : undefined;\n // we use pointerdown because it let's us picks up clicks on components inside the row, e.g. checkboxes\n attributes.onPointerDown = handlePointerDown;\n }\n\n // row click\n if (tableMeta.rowClick.isEnabled(row.original)) {\n attributes.onClick = handleClick;\n }\n\n // row drag\n if (tableMeta.rowDrag.isEnabled) {\n attributes['aria-grabbed'] = !!tableMeta.rowDrag.dragging[row.id];\n attributes.draggable = true;\n const GHOST_ELEMENT_ID = 'taco_table_dragging';\n\n attributes.onDragStart = (event: React.DragEvent): void => {\n let rows = [row];\n\n if (row.getCanSelect()) {\n rows = row.getIsSelected() ? table.getSelectedRowModel().rows : [row, ...table.getSelectedRowModel().rows];\n }\n\n const data = rows.map(row => row.original);\n\n tableMeta.rowDrag.setDragging?.(\n rows.reduce((dragging, rowBeingDragged) => ({ ...dragging, [rowBeingDragged.id]: true }), {})\n );\n\n // set a default data value so that the consumer doesn't have to\n event.dataTransfer.setData('text', JSON.stringify(data));\n\n const showPlaceholder = (text: string) => {\n const ghost = document.createElement('div');\n ghost.id = GHOST_ELEMENT_ID;\n ghost.className = 'wcag-blue rounded flex w-48 p-4 absolute -ml-[100vw]';\n ghost.innerText = text;\n document.body.append(ghost);\n event.dataTransfer.setDragImage(ghost, 0, 0);\n };\n\n const setDataTransfer = (text: string) => event.dataTransfer.setData('text', text);\n\n tableMeta.rowDrag.handleRowDrag?.(data, showPlaceholder, setDataTransfer);\n };\n\n attributes.onDragEnd = (): void => {\n document.getElementById(GHOST_ELEMENT_ID)?.remove();\n tableMeta.rowDrag.setDragging?.({});\n };\n }\n\n // row drop\n const [isDraggedOver, dropTargetProps] = useDropTarget(event => tableMeta.rowDrop.handleDrop?.(event, row.original));\n\n if (tableMeta.rowDrop.isEnabled) {\n attributes.onDragEnter = dropTargetProps?.onDragEnter;\n attributes.onDragLeave = dropTargetProps?.onDragLeave;\n attributes.onDragOver = dropTargetProps?.onDragOver;\n attributes.onDrop = dropTargetProps?.onDrop;\n attributes['data-row-dragged-over'] = isDraggedOver;\n }\n\n // row grouping\n if (table.options.enableGrouping) {\n attributes['data-row-group'] = row.getIsGrouped() ? true : undefined;\n }\n\n // row selection\n if (row.getCanSelect()) {\n attributes['data-row-selected'] = row.getIsSelected() || row.getIsAllSubRowsSelected() ? true : undefined;\n }\n\n // row expansion\n // When grouping is enabled, a group header row also reports getIsExpanded() === true\n // when its children are visible. Skip the renderer in that case — otherwise row.original\n // (the first child's data) gets rendered as expansion content under the header.\n let expandedRow;\n\n if (tableMeta.rowExpansion.isEnabled && row.getIsExpanded() && !row.getIsGrouped()) {\n attributes['data-row-expanded'] = true;\n expandedRow = tableMeta.rowExpansion.rowExpansionRenderer?.(row.original)?.();\n }\n\n const rowMeta = (row.original as TableRowWithMetaData<TType>)._meta;\n\n if (rowMeta?.layout) {\n attributes['data-row-meta-layout'] = rowMeta.layout;\n }\n\n const ref = React.useRef<HTMLTableRowElement>(null);\n const expansionRef = React.useRef<HTMLTableRowElement>(null);\n const expandedRowSize = useResizeObserver(expansionRef, !!expandedRow);\n\n React.useEffect(() => {\n const rowHeight = ref.current?.getBoundingClientRect().height ?? 0;\n const expansionHeight = expansionRef.current?.getBoundingClientRect().height ?? 0;\n\n measureRow(rowHeight + expansionHeight);\n }, [expansionRef.current, expandedRowSize?.height, ...remeasureDependencies]);\n\n const className = cn('group/row', otherAttributes.className, {\n 'hover:cursor-grab': tableMeta.rowDrag.isEnabled && typeof attributes.onClick !== 'function',\n 'hover:cursor-pointer': typeof attributes.onClick === 'function',\n });\n\n const isGrouped = row.getIsGrouped();\n\n const mergedRef = mergeRefs([ref, externalRef]);\n\n return (\n <>\n <tr {...attributes} className={className} ref={mergedRef}>\n {children}\n {row\n .getVisibleCells()\n // Filter out the row actions cell from rendering in Grouped Row\n .filter(cell => !(isGrouped && cell.column.id === '__actions'))\n .map((cell, cellIndex) => (\n <Cell key={cell.id} cell={cell} index={cellIndex} renderer={CellRenderer} />\n ))}\n </tr>\n {expandedRow ? (\n <tr data-row-parent-id={row.id} ref={expansionRef}>\n <td className=\"col-span-full\">{expandedRow}</td>\n </tr>\n ) : null}\n </>\n );\n })\n) as <TType = unknown>(props: DisplayRowProps<TType> & { ref?: React.Ref<HTMLTableRowElement> }) => JSX.Element;\n"],"names":["React","DisplayRow","_a","row","_b","_c"],"mappings":"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"}
|
|
@@ -114,7 +114,7 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
|
|
|
114
114
|
return /* @__PURE__ */ React.createElement(SkeletonRow.SkeletonRow, { key: skeletonKey, index: virtualRow.index, table });
|
|
115
115
|
}
|
|
116
116
|
const measureRow = (rowHeight) => {
|
|
117
|
-
virtualiser.resizeItem(virtualRow, rowHeight);
|
|
117
|
+
virtualiser.resizeItem(virtualRow.index, rowHeight);
|
|
118
118
|
};
|
|
119
119
|
return /* @__PURE__ */ React.createElement(
|
|
120
120
|
Row.Row,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableRenderer.cjs","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["ROW_HEIGHT_ESTIMATES","rows","useVirtualizer","_a","SkeletonRow","Row","defaultRangeExtractor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTableRenderer.cjs","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow.index, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["ROW_HEIGHT_ESTIMATES","rows","useVirtualizer","_a","SkeletonRow","Row","defaultRangeExtractor"],"mappings":";;;;;;;;;AAkBA,SAAS,0BAA2C,OAA0B;AACpE,QAAA,YAAY,MAAM,QAAQ;AAChC,MAAI,SAAS;AAET,MAAA,UAAU,OAAO,WAAW;AAClB,cAAA;AAAA,EAAA;AAGd,MAAI,MAAM,kBAAkB,SAAS,GAAG;AAC1B,cAAA,MAAM,gBAAgB,EAAE,SAAS;AAAA,EAAA;AAG3C,MAAA,SAASA,0BAAqB,SAAS;AAErC,QAAA,aAAa,MAAM,cAAc;AAEvC,MAAI,WAAW,QAAQ;AAEnB,cAAUA,0BAAqB,UAAU,UAAU,MAAM,IAAI,MAAM,WAAW;AAAA,EAAA;AAG3E,SAAA;AACX;AAGA,SAAS,oBAAqC,OAA0B;AACpE,QAAM,aAAa,MAAM,cAAc,KAAK,CAAC;AACtC,SAAAA,0BAAqB,SAAS,IAAI,WAAW;AACxD;AAGA,MAAM,qBAAqB;AAEpB,SAAS,iBACZ,WACA,OACA,UACA,QACA,uBACF;;AACQ,QAAA,YAAY,MAAM,QAAQ;AAChC,QAAM,oBAAoB,CAAC,GAAC,WAAM,WAAW,aAAjB,mBAA2B;AACvD,QAAMC,SAAO,MAAM,cAAc,KAAK,CAAC;AAGjC,QAAA,iBAAiB,0BAAiC,KAAK;AAG7D,QAAM,qBAAqBD,KAAAA,qBAAqB;AAE1C,QAAA,QAAQ,UAAU,OAAO,aAAa,UAAU,OAAO,2BAA2B,SAASC,OAAK;AAEtG,QAAM,cAAcC,aAAAA,eAAe;AAAA,IAC/B;AAAA,IACA,cAAc,MAAM;AACT,aAAA,UAAU,UAAU,SAASF,KAAA,qBAAqB,UAAU,UAAU,MAAM,IAAIA,KAAAA,qBAAqB;AAAA,IAChH;AAAA,IACA,kBAAkB,MAAM,SAAS;AAAA,IACjC,UAAU,UAAU,SAAS,aAAa,QAAQ;AAAA,IAClD;AAAA;AAAA,IAEA;AAAA,IACA,kBAAkB,0BAA0B,KAAK;AAAA,IACjD,YAAY,oBAAoB,KAAK;AAAA,EAAA,CACxC;AAEK,QAAA,gBAAgB,MAAM,SAAA,EAAW;AACjC,QAAA,2BAA2B,MAAM,OAAO,KAAK;AAEnD,QAAM,UAAU,MAAM;AAElB,UAAM,UAAU,KAAK,UAAU,aAAa,MAAM;AAElD,QAAI,kBAAkB,QAAS,WAAW,yBAAyB,YAAY,MAAO;AAClF,+BAAyB,UAAU,kBAAkB;AACrD,kBAAY,QAAQ;AAAA,IAAA;AAAA,EACxB,GACD,CAAC,aAAa,CAAC;AAEZ,QAAA,YAAY,YAAY,aAAa;AACrC,QAAA,eAAe,YAAY,gBAAgB;AAEjD,QAAM,gBAAgB,MAAM;AAAA,IACxB,CAAC,OAAe,UAAuC,EAAE,OAAO,QAAQ,UAAU,eAAe;AAC7F,YAAM,YAAyC,EAAE,GAAG,SAAS,UAAU,OAAO;AAE9E,UAAI,SAAS,SAAS;AAClB,YAAI,UAAU,GAAG;AACD,sBAAA,eAAe,GAAG,SAAS;AAAA,QAAA,WAChC,UAAU,QAAQ,GAAG;AAEnB,mBAAA,QAAQ,YAAY,SAAS,QAAQ;AAAA,QAAA,OAC3C;AACS,sBAAA,cAAc,OAAO,OAAO;AAAA,QAAA;AAAA,MAC5C;AAAA,IAER;AAAA,IACA,CAAC,aAAa,QAAQ,SAAS,SAAS,WAAW,KAAK;AAAA,EAC5D;AAGA,QAAM,oBAAoB,qBAAqB,QAAQ,IAAI,IAAI;AAE/D,QAAM,aAAa,uBACZ,kBAAa,iBAAiB,MAA9B,mBAAiC,UAAS,QAAM,kBAAa,iBAAiB,MAA9B,mBAAiC,SAAQ,MAC1F,kBAAa,iBAAiB,MAA9B,mBAAiC;AAGvC,QAAM,CAAC,YAAY,aAAa,IAC5B,aAAa,SAAS,IAChB,CAAC,KAAK,IAAI,GAAG,cAAc,CAAC,GAAG,KAAK,IAAI,GAAG,eAAa,kBAAa,aAAa,SAAS,CAAC,MAApC,mBAAuC,QAAO,EAAE,CAAC,IACzG,CAAC,GAAG,CAAC;AAGf,QAAM,UAAU,MAAM;AAClB,QAAI,uBAAuB;AACvB,oBAAc,uBAAuB,EAAE,OAAO,UAAU,UAAU,QAAQ;AAAA,IAAA;AAAA,EAElF,GAAG,EAAE;AAGL,MAAI,QAAuB,CAAC;AAC5B,MAAI,UAAyC;AAG7C,MAAI,SAAS,MAAM,cAAc,EAAE,QAAQ;AAC/B,YAAA;AAAA,MACJ,QAAQ;AAAA,MACR,eAAe,OAAO,MAAM,aAAa,IAAI,IAAI;AAAA,MACjD,YAAY,OAAO,MAAM,UAAU,IAAI,IAAI;AAAA,IAC/C;AAAA,EAAA;AAIJ,MAAI,OAAO;AACG,cAAA,aAAa,IAAI,CAAc,eAAA;;AAErC,UAAI,CAAC,YAAY;AACN,eAAA;AAAA,MAAA;AAGP,UAAA;AAEJ,UAAI,UAAU,OAAO,aAAa,UAAU,OAAO,0BAA0B;AACzE,cAAM,mBACD,KAAK,MAAM,WAAW,QAAQ,UAAU,OAAO,QAAQ,IAAI,UAAU,OAAO,WAC7E,UAAU,OAAO;AACrB,cAAM,iBAAeG,MAAA,UAAU,OAAO,UAAjB,gBAAAA,IAAwB,QAAQ,sBAAqB;AAE1E,YAAI,eAAe,IAAI;AAIb,gBAAA,YAAY,eAAe,UAAU,OAAO,WAAY,WAAW,QAAQ,UAAU,OAAO;AAClG,gBAAMF,OAAK,SAAS;AAAA,QAAA;AAAA,MACxB,OACG;AACG,cAAAA,OAAK,WAAW,KAAK;AAAA,MAAA;AAG3B,UAAA,EAAC,2BAAK,WAAU;AAEV,cAAA,cAAc,YAAY,WAAW,KAAK;AAChD,mDAAQG,YAAY,aAAA,EAAA,KAAK,aAAa,OAAO,WAAW,OAAO,OAAc;AAAA,MAAA;AAG3E,YAAA,aAAa,CAAC,cAAsB;AAC1B,oBAAA,WAAW,WAAW,OAAO,SAAS;AAAA,MACtD;AAGI,aAAA,sBAAA;AAAA,QAACC,IAAA;AAAA,QAAA;AAAA,UACG,KAAK,IAAI;AAAA,UACT;AAAA,UACA,OAAO,WAAW;AAAA,UAClB;AAAA,UACA;AAAA,UACA,UAAU,UAAU;AAAA,UACpB,cAAc,UAAU;AAAA,QAAA;AAAA,MAC5B;AAAA,IAAA,CAEP;AAAA,EAAA;AAGE,SAAA;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACJ;AACJ;AAGA,SAAS,0BAA2C,OAA0B;AACpE,QAAAJ,QAAO,MAAM,YAAA,EAAc;AACjC,QAAM,iBAAiB,CAAC,CAAC,MAAM,WAAW,SAAS;AAE7C,QAAA,kBAAkB,MAAM,QAAQ,MAAM;AACxC,UAAM,UAAoB,CAAC;AAE3B,QAAI,gBAAgB;AACX,MAAAA,MAAA,QAAQ,CAAC,KAAK,UAAU;AACrB,YAAA,IAAI,gBAAgB;AACpB,kBAAQ,KAAK,KAAK;AAAA,QAAA;AAAA,MACtB,CACH;AAAA,IAAA;AAGE,WAAA;AAAA,EAAA,GACR,CAACA,KAAI,CAAC;AAGT,QAAM,iBAAiB,MAAM;AAAA,IACzB,CAAC,UAAiB;AACd,YAAM,sBACF,CAAC,GAAG,eAAe,EAAE,QAAQ,EAAE,KAAK,CAAA,UAAS,MAAM,cAAc,KAAK,KAAK,gBAAgB,CAAC;AAEhG,aAAO,wBAAwB,SACzBK,aAAAA,sBAAsB,KAAK,IAC3B,OAAO,CAAC,qBAAqB,GAAG,QAAQA,aAAAA,sBAAsB,KAAK,GAAG,mBAAmB,CAAC,GAAG,OAAK,CAAC;AAAA,IAC7G;AAAA,IACA,CAAC,eAAe;AAAA,EACpB;AAEA,SAAO,iBAAiB,iBAAiB;AAC7C;;"}
|
|
@@ -112,7 +112,7 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
|
|
|
112
112
|
return /* @__PURE__ */ React__default.createElement(SkeletonRow, { key: skeletonKey, index: virtualRow.index, table });
|
|
113
113
|
}
|
|
114
114
|
const measureRow = (rowHeight) => {
|
|
115
|
-
virtualiser.resizeItem(virtualRow, rowHeight);
|
|
115
|
+
virtualiser.resizeItem(virtualRow.index, rowHeight);
|
|
116
116
|
};
|
|
117
117
|
return /* @__PURE__ */ React__default.createElement(
|
|
118
118
|
Row,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableRenderer.js","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["React","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTableRenderer.js","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow.index, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["React","_a"],"mappings":"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"}
|
|
@@ -64,7 +64,7 @@ declare module '@tanstack/table-core' {
|
|
|
64
64
|
}
|
|
65
65
|
export declare function useTableManager<TType = unknown, TMeta = object>(props: TableProps<TType>, ref: React.RefObject<TableRef>, meta?: Partial<ReactTableMeta<TType>> & TMeta, internalColumns?: useTableManagerInternalColumns<TType>): {
|
|
66
66
|
id: string;
|
|
67
|
-
instance: import('@tanstack/
|
|
67
|
+
instance: import('@tanstack/table-core').Table<TType>;
|
|
68
68
|
meta: ReactTableMeta<TType> & TMeta;
|
|
69
|
-
state: import('@tanstack/
|
|
69
|
+
state: import('@tanstack/table-core').TableState;
|
|
70
70
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ColumnSizingState, Table as ReactTable } from '@tanstack/react-table';
|
|
2
2
|
export declare function getSettings<TType = unknown>(table: ReactTable<TType>): {
|
|
3
|
-
columnOrder: import('@tanstack/
|
|
4
|
-
columnPinning: import('@tanstack/
|
|
3
|
+
columnOrder: import('@tanstack/table-core').ColumnOrderState | undefined;
|
|
4
|
+
columnPinning: import('@tanstack/table-core').ColumnPinningState;
|
|
5
5
|
columnSizing: {};
|
|
6
|
-
columnVisibility: import('@tanstack/
|
|
6
|
+
columnVisibility: import('@tanstack/table-core').VisibilityState | undefined;
|
|
7
7
|
excludeUnmatchedRecordsInSearch: boolean | undefined;
|
|
8
8
|
fontSize: "small" | "medium" | "large" | undefined;
|
|
9
9
|
rowHeight: import('../../types').TableRowHeight | undefined;
|
|
10
|
-
sorting: import('@tanstack/
|
|
10
|
+
sorting: import('@tanstack/table-core').SortingState;
|
|
11
11
|
};
|
|
12
12
|
export declare function ignoreInternalColumns(data: ColumnSizingState): {};
|
|
@@ -4,5 +4,5 @@ export declare const createFakeData: (creator: (faker: Faker) => any, ...length:
|
|
|
4
4
|
export declare const getRandomNumber: (max: number, min?: number) => number;
|
|
5
5
|
export declare const iconNames: string[];
|
|
6
6
|
export declare const generateId: () => string;
|
|
7
|
-
export declare const sleep: (ms: number) => Promise<
|
|
7
|
+
export declare const sleep: (ms: number) => Promise<void>;
|
|
8
8
|
export { sort };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@economic/taco",
|
|
3
|
-
"version": "8.1.
|
|
3
|
+
"version": "8.1.3-EC-82626-test-release.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -29,13 +29,16 @@
|
|
|
29
29
|
"scripts/stylelint-plugin"
|
|
30
30
|
],
|
|
31
31
|
"scripts": {
|
|
32
|
-
"build": "
|
|
32
|
+
"build": "vite build",
|
|
33
|
+
"prebuild": "npx tsc --noEmit",
|
|
33
34
|
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
34
36
|
"lint": "npm run lint:styles && oxlint --quiet",
|
|
35
37
|
"lint:styles": "stylelint \"src/**/*.css\" --config ./stylelint.config.mjs --allow-empty-input",
|
|
36
38
|
"pree2e": "npx playwright install chromium --with-deps",
|
|
37
39
|
"e2e": "npx playwright test",
|
|
38
|
-
"generate-icons": "node scripts/generate-icons.cjs"
|
|
40
|
+
"generate-icons": "node scripts/generate-icons.cjs",
|
|
41
|
+
"typecheck": "npx tsc --noEmit"
|
|
39
42
|
},
|
|
40
43
|
"dependencies": {
|
|
41
44
|
"@base-ui/react": "1.5.0",
|
|
@@ -43,13 +46,13 @@
|
|
|
43
46
|
"@dnd-kit/modifiers": "^7.0.0",
|
|
44
47
|
"@dnd-kit/sortable": "^7.0.2",
|
|
45
48
|
"@dnd-kit/utilities": "^3.2.2",
|
|
46
|
-
"@economic/taco-tokens": "^2.2.
|
|
49
|
+
"@economic/taco-tokens": "^2.2.5-EC-82626-test-release.0",
|
|
47
50
|
"@radix-ui/react-popover": "1.0.2",
|
|
48
51
|
"@radix-ui/react-scroll-area": "1.2.10",
|
|
49
52
|
"@react-aria/focus": "^3.19.0",
|
|
50
53
|
"@react-aria/interactions": "^3.12.0",
|
|
51
54
|
"@tanstack/react-table": "^8.21.3",
|
|
52
|
-
"@tanstack/react-virtual": "3.
|
|
55
|
+
"@tanstack/react-virtual": "3.13.23",
|
|
53
56
|
"clsx": "^2.1.1",
|
|
54
57
|
"date-fns": "^3.6.0",
|
|
55
58
|
"framer-motion": "12.38.0",
|
|
@@ -71,13 +74,13 @@
|
|
|
71
74
|
"tailwindcss": ">=3.4.19"
|
|
72
75
|
},
|
|
73
76
|
"devDependencies": {
|
|
74
|
-
"@oxlint/plugins": "^1.
|
|
77
|
+
"@oxlint/plugins": "^1.70.0",
|
|
75
78
|
"@svgr/cli": "^5.5.0",
|
|
76
79
|
"@testing-library/jest-dom": "6.9.1",
|
|
77
80
|
"@testing-library/react": "16.3.2",
|
|
78
81
|
"@testing-library/user-event": "14.6.1",
|
|
79
82
|
"@types/lodash": "^4.17.24",
|
|
80
|
-
"@types/node": "^22.19.
|
|
83
|
+
"@types/node": "^22.19.21",
|
|
81
84
|
"@types/react": "18.3.31",
|
|
82
85
|
"@types/react-dom": "18.3.7",
|
|
83
86
|
"@types/react-table": "^7.7.20",
|
|
@@ -87,7 +90,7 @@
|
|
|
87
90
|
"jsdom": "^26.1.0",
|
|
88
91
|
"resize-observer-polyfill": "^1.5.1",
|
|
89
92
|
"rimraf": "^3.0.2",
|
|
90
|
-
"stylelint": "^17.
|
|
93
|
+
"stylelint": "^17.13.0",
|
|
91
94
|
"svgo": "^1.3.2",
|
|
92
95
|
"tailwindcss": "^3.4.19",
|
|
93
96
|
"typescript": "^5.9.3",
|
|
@@ -97,7 +100,7 @@
|
|
|
97
100
|
"vitest": "^3.2.6"
|
|
98
101
|
},
|
|
99
102
|
"optionalDependencies": {
|
|
100
|
-
"@rollup/rollup-linux-x64-gnu": "^4.
|
|
103
|
+
"@rollup/rollup-linux-x64-gnu": "^4.62.0"
|
|
101
104
|
},
|
|
102
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "a0b09caea77b51063aef06ebbea567e324244a9a"
|
|
103
106
|
}
|