@lax-wp/design-system 0.14.58 → 0.15.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"CellContextMenuPortal.es.js","sources":["../../../../src/components/data-display/infinite-table/CellContextMenuPortal.tsx"],"sourcesContent":["import { useTableConfig } from '../../../providers/design-system-provider/hooks';\nimport { CheckIcon, ContentCopyIcon, LinkIcon, OpenInNewIcon } from '../../icon';\nimport type {\n ICellContextMenuConfig,\n ICellContextMenuContext,\n ICellContextMenuItem,\n ICellContextMenuState,\n IColumn,\n IRowLinkConfig,\n} from './types';\nimport { getRowJson, getSelectedRowsJson } from './copy-text';\nimport cn from 'classnames';\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useHref } from 'react-router-dom';\n\nimport {\n CELL_CONTEXT_MENU_CURSOR_OFFSET,\n COPY_FEEDBACK_DURATION,\n CELL_CONTEXT_MENU_VIEWPORT_MARGIN,\n CELL_CONTEXT_MENU_Z_INDEX,\n} from './constants';\n\ntype TRowOption = { key: string; label: React.ReactNode; isVisible?: boolean };\n\n/** Result of the per-row availability check for row actions. */\ntype TRowOptionsFilter =\n | { status: 'off' }\n | { status: 'loading' }\n | { status: 'ready'; available: Record<string, boolean> }\n | { status: 'failed' };\n\n/** One rendered menu line: a declared item, a row-action node supplied by the table, or the row-action placeholder. */\ntype TMenuRow =\n | { kind: 'item'; key: string; item: ICellContextMenuItem }\n | { kind: 'node'; key: string; node: React.ReactNode; withDividerBefore?: boolean }\n | { kind: 'skeleton'; key: string; withDividerBefore?: boolean };\n\ninterface CellContextMenuPortalProps {\n state: ICellContextMenuState | null;\n config?: ICellContextMenuConfig | null;\n /** The table's row actions, appended to the menu — same list the three-dot cell renders. */\n rowOptions?: TRowOption[] | ((rowData: Record<string, unknown>) => TRowOption[] | null) | null;\n /** Per-row availability check for `rowOptions`, mirroring the three-dot cell so both menus agree. */\n asyncRowOptionsFilter?: ((rowId: string) => Promise<Record<string, boolean>>) | null;\n /** Checked row ids, enabling the \"Copy selected rows\" item. */\n checkedIds?: (string | number)[];\n /** Table rows, used to build the text for selected rows that are scrolled out of view. */\n rows?: Record<string, unknown>[];\n /** Visible columns in display order, used to order the copied values. */\n columns?: IColumn[];\n /** The table's row link, enabling the \"Copy Link\" / \"Open in New Tab\" items. */\n rowLinkConfig?: IRowLinkConfig | null;\n onClose: () => void;\n}\n\n/** Clipboard write with a fallback for browsers / insecure contexts without the async clipboard API. */\nconst writeToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through to the textarea fallback\n }\n\n try {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n const copied = document.execCommand('copy');\n document.body.removeChild(textarea);\n return copied;\n } catch {\n return false;\n }\n};\n\n/** An already basename-resolved href (from `useHref`); the clipboard and a new tab both need a full URL. */\nconst toAbsoluteUrl = (href: string): string => {\n if (!href) return '';\n\n try {\n return new URL(href, window.location.origin).href;\n } catch {\n return '';\n }\n};\n\nconst resolveFlag = (\n flag: boolean | ((context: ICellContextMenuContext) => boolean) | undefined,\n context: ICellContextMenuContext,\n fallback: boolean,\n): boolean => {\n if (flag === undefined) return fallback;\n return typeof flag === 'function' ? flag(context) : flag;\n};\n\nconst MenuItemButton: React.FC<{\n item: ICellContextMenuItem;\n isDisabled: boolean;\n isActive: boolean;\n onSelect: () => void;\n onHover: () => void;\n}> = ({ item, isDisabled, isActive, onSelect, onHover }) => (\n <button\n type='button'\n role='menuitem'\n data-menu-item\n disabled={isDisabled}\n aria-disabled={isDisabled}\n tabIndex={isActive ? 0 : -1}\n className={cn(\n 'flex w-full items-center gap-3 px-3 py-2 text-sm font-medium text-left outline-none',\n isDisabled\n ? 'opacity-50 cursor-not-allowed'\n : cn(\n 'cursor-pointer',\n item.isDanger\n ? 'text-error-600 dark:text-error-400 hover:bg-error-50 dark:hover:bg-error-950 focus-visible:bg-error-50 dark:focus-visible:bg-error-950'\n : 'text-neutral-900 dark:text-white hover:bg-neutral-100 dark:hover:bg-black-600 focus-visible:bg-neutral-100 dark:focus-visible:bg-black-600',\n ),\n )}\n onClick={onSelect}\n onMouseEnter={() => !isDisabled && onHover()}\n >\n {item.icon ? (\n <span className={cn('flex shrink-0 items-center', item.isDanger ? 'text-error-600 dark:text-error-400' : 'text-neutral-500 dark:text-black-300')}>\n {item.icon}\n </span>\n ) : null}\n <span className='flex-1 truncate'>{item.label}</span>\n {item.shortcut ? <span className='shrink-0 text-xs text-neutral-400 dark:text-black-300'>{item.shortcut}</span> : null}\n </button>\n);\n\n/**\n * Right-click menu for data cells. Rendered once per table and positioned at the\n * cursor; `DataCell` opens it through `openCellContextMenu` on the table context.\n */\nexport const CellContextMenuPortal: React.FC<CellContextMenuPortalProps> = ({\n state, config, rowOptions, asyncRowOptionsFilter, checkedIds, rows, columns, rowLinkConfig, onClose,\n}) => {\n const tableConfig = useTableConfig();\n const t = useMemo(() => tableConfig?.t ?? ((key: string) => key), [tableConfig]);\n const menuRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ left: number; top: number } | null>(null);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [copyState, setCopyState] = useState<{ key: string; isCopied: boolean } | null>(null);\n const [rowOptionsFilter, setRowOptionsFilter] = useState<TRowOptionsFilter>({ status: 'off' });\n const closeTimer = useRef<ReturnType<typeof setTimeout>>();\n\n const context = useMemo<ICellContextMenuContext | null>(\n () => (state ? { ...state.target, close: onClose } : null),\n [state, onClose],\n );\n\n const handleCopy = useCallback(\n async (key: string, text: string, menuContext: ICellContextMenuContext) => {\n if (copyState) return;\n\n const isCopied = await writeToClipboard(text);\n\n if (isCopied) {\n config?.onCopy?.(text, menuContext);\n tableConfig?.showNotification?.('success', t('Copied to clipboard'));\n } else {\n tableConfig?.showNotification?.('error', t('Could not copy to clipboard'));\n }\n\n // Confirmed inline instead of with a toast, so the menu owns its own feedback.\n setCopyState({ key, isCopied });\n closeTimer.current = setTimeout(() => onClose(), COPY_FEEDBACK_DURATION);\n },\n [config, tableConfig, t, onClose, copyState],\n );\n\n const buildCopyItem = useCallback(\n (key: string, label: string, text: string, icon?: React.ReactNode): ICellContextMenuItem => {\n const isDone = copyState?.key === key;\n\n return {\n key,\n label: !isDone ? label : copyState?.isCopied ? t('Copied') : t('Copy failed'),\n icon:\n isDone && copyState?.isCopied ? (\n <CheckIcon size={16} className='text-success-600 dark:text-success-400' />\n ) : (\n icon ?? <ContentCopyIcon size={16} />\n ),\n isDisabled: !text,\n keepOpenOnClick: true,\n onClick: (menuContext) => handleCopy(key, text, menuContext),\n };\n },\n [copyState, handleCopy, t],\n );\n\n const rowJson = useMemo(() => getRowJson(state?.target.rowData, columns), [state?.target.rowData, columns]);\n // Only while the menu is open — otherwise every checkbox tick would serialize the selection.\n const selectedRowsJson = useMemo(() => (state ? getSelectedRowsJson(rows, columns, checkedIds) : ''), [state, rows, columns, checkedIds]);\n const selectedCount = checkedIds?.length ?? 0;\n\n /** The router path from `linkTo`, before the router's basename (e.g. `/integrations`) is applied. */\n const rowLinkPath = useMemo(() => {\n if (!state || !rowLinkConfig?.isEnabled || !rowLinkConfig.linkTo || state.target.column?.disableRowClick) return '';\n\n return rowLinkConfig.linkTo(String(state.target.rowId), state.target.rowData) || '';\n }, [state, rowLinkConfig]);\n\n // `useHref` resolves `rowLinkPath` the same way a <Link> would, basename included — a manual\n // `new URL(path, location.href)` would silently drop a router basename like `/integrations`.\n const rowLinkResolvedHref = useHref(rowLinkPath || '/');\n\n /** The row link as an absolute URL — empty unless the table opted in, and never on a cell that opts out of the row link. */\n const rowLinkHref = useMemo(() => {\n if (!rowLinkPath) return '';\n\n return toAbsoluteUrl(rowLinkResolvedHref);\n }, [rowLinkPath, rowLinkResolvedHref]);\n\n const openInNewTab = useCallback(() => {\n if (rowLinkHref) window.open(rowLinkHref, '_blank', 'noopener,noreferrer');\n }, [rowLinkHref]);\n\n const items = useMemo<ICellContextMenuItem[]>(() => {\n if (!context) return [];\n\n const defaultItems: ICellContextMenuItem[] = config?.hideDefaultItems\n ? []\n : [\n buildCopyItem('copy-cell', config?.copyLabel ?? t('Copy Cell'), context.text),\n buildCopyItem('copy-row', t('Copy Row'), rowJson),\n ...(selectedCount > 0\n ? [\n buildCopyItem(\n 'copy-selected-rows',\n selectedCount === 1 ? t('Copy Selected Row') : `${t('Copy Selected Rows')} (${selectedCount})`,\n selectedRowsJson,\n ),\n ]\n : []),\n ...(rowLinkHref && !config?.hideLinkItems\n ? [\n {\n ...buildCopyItem('copy-link', t('Copy Link'), rowLinkHref, <LinkIcon size={16} />),\n withDividerBefore: true,\n },\n {\n key: 'open-in-new-tab',\n label: t('Open in New Tab'),\n icon: <OpenInNewIcon size={16} />,\n onClick: openInNewTab,\n },\n ]\n : []),\n ];\n\n const extraItems = typeof config?.items === 'function' ? config.items(context) : config?.items ?? [];\n\n return [...defaultItems, ...extraItems].filter((item) => resolveFlag(item.isVisible, context, true));\n }, [config, context, buildCopyItem, selectedCount, rowJson, selectedRowsJson, rowLinkHref, openInNewTab, t]);\n\n /** The table's own row actions, resolved for the right-clicked row. */\n const resolvedRowOptions = useMemo<TRowOption[]>(() => {\n if (!state || config?.includeRowOptions === false || !rowOptions) return [];\n\n const list = typeof rowOptions === 'function' ? rowOptions(state.target.rowData) : rowOptions;\n\n return (list ?? []).filter((option) => option.isVisible !== false);\n }, [state, rowOptions, config?.includeRowOptions]);\n\n const hasRowOptions = resolvedRowOptions.length > 0;\n\n /** Row actions can be gated per row by the API — ask before showing them, exactly as the three-dot cell does. */\n useEffect(() => {\n if (!state || !hasRowOptions || !asyncRowOptionsFilter) {\n setRowOptionsFilter({ status: 'off' });\n return;\n }\n\n let isCancelled = false;\n setRowOptionsFilter({ status: 'loading' });\n\n asyncRowOptionsFilter(String(state.target.rowId))\n .then((available) => !isCancelled && setRowOptionsFilter({ status: 'ready', available }))\n .catch(() => !isCancelled && setRowOptionsFilter({ status: 'failed' }));\n\n return () => {\n isCancelled = true;\n };\n }, [state, hasRowOptions, asyncRowOptionsFilter]);\n\n const allowedRowOptions = useMemo<TRowOption[]>(() => {\n if (rowOptionsFilter.status === 'off') return resolvedRowOptions;\n if (rowOptionsFilter.status !== 'ready') return [];\n\n const { available } = rowOptionsFilter;\n\n return resolvedRowOptions.filter((option) => available[option.key] ?? true);\n }, [resolvedRowOptions, rowOptionsFilter]);\n\n const menuRows = useMemo<TMenuRow[]>(() => {\n const itemRows: TMenuRow[] = items.map((item) => ({ kind: 'item', key: item.key, item }));\n const needsDivider = itemRows.length > 0;\n\n if (rowOptionsFilter.status === 'loading') {\n return [...itemRows, { kind: 'skeleton', key: 'row-options-loading', withDividerBefore: needsDivider }];\n }\n\n return [\n ...itemRows,\n ...allowedRowOptions.map<TMenuRow>((option, index) => ({\n kind: 'node',\n key: `row-option-${option.key}`,\n node: option.label,\n withDividerBefore: needsDivider && index === 0,\n })),\n ];\n }, [items, allowedRowOptions, rowOptionsFilter.status]);\n\n const isRowNavigable = useCallback(\n (row: TMenuRow): boolean => (row.kind === 'item' ? !(context && resolveFlag(row.item.isDisabled, context, false)) : row.kind === 'node'),\n [context],\n );\n\n const firstNavigableIndex = useMemo(() => menuRows.findIndex(isRowNavigable), [menuRows, isRowNavigable]);\n\n /** Clamp into the viewport once the menu has been measured; row actions can arrive after the first paint. */\n useLayoutEffect(() => {\n if (!state || !menuRef.current) {\n setPosition(null);\n return;\n }\n\n const { width, height } = menuRef.current.getBoundingClientRect();\n const margin = CELL_CONTEXT_MENU_VIEWPORT_MARGIN;\n const offset = CELL_CONTEXT_MENU_CURSOR_OFFSET;\n\n // Flip to the other side of the cursor when there is no room, then clamp.\n const left = state.x + width + margin > window.innerWidth ? state.x - width - offset : state.x + offset;\n const top = state.y + height + margin > window.innerHeight ? state.y - height - offset : state.y + offset;\n\n setPosition({\n left: Math.max(margin, Math.min(left, window.innerWidth - width - margin)),\n top: Math.max(margin, Math.min(top, window.innerHeight - height - margin)),\n });\n }, [state, menuRows.length]);\n\n useEffect(() => {\n setCopyState(null);\n return () => clearTimeout(closeTimer.current);\n }, [state]);\n\n useEffect(() => {\n if (!state) {\n setActiveIndex(-1);\n return;\n }\n setActiveIndex(firstNavigableIndex);\n }, [state, firstNavigableIndex]);\n\n /** Focus follows the active row so the menu is keyboard operable; row actions bring their own button. */\n useEffect(() => {\n if (!state || activeIndex < 0) return;\n\n const row = menuRef.current?.querySelectorAll<HTMLElement>('[data-menu-item]')[activeIndex];\n const focusTarget = row?.matches('button') ? row : row?.querySelector('button') ?? row;\n\n // preventScroll: a focus-driven scroll would immediately close the menu.\n focusTarget?.focus({ preventScroll: true });\n }, [state, activeIndex]);\n\n const moveActiveIndex = useCallback(\n (direction: 1 | -1) => {\n if (menuRows.length === 0) return;\n setActiveIndex((current) => {\n let next = current;\n for (let step = 0; step < menuRows.length; step += 1) {\n next = (next + direction + menuRows.length) % menuRows.length;\n if (isRowNavigable(menuRows[next])) return next;\n }\n return current;\n });\n },\n [menuRows, isRowNavigable],\n );\n\n useEffect(() => {\n if (!state) return;\n\n const handlePointerDown = (event: MouseEvent | TouchEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) onClose();\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onClose();\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n moveActiveIndex(event.key === 'ArrowDown' ? 1 : -1);\n }\n };\n // Any scroll (table viewport included) detaches the menu from its cell, so close it.\n const handleScroll = () => onClose();\n\n // Deferred so the right click that opened the menu does not immediately close it.\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handlePointerDown);\n document.addEventListener('touchstart', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('scroll', handleScroll, true);\n window.addEventListener('resize', handleScroll);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handlePointerDown);\n document.removeEventListener('touchstart', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('scroll', handleScroll, true);\n window.removeEventListener('resize', handleScroll);\n };\n }, [state, onClose, moveActiveIndex]);\n\n if (!state || !context || menuRows.length === 0) return null;\n\n if (tableConfig?.renderCellContextMenu) {\n return tableConfig.renderCellContextMenu({ state, context, items, rowOptions: allowedRowOptions, onClose }) as JSX.Element;\n }\n\n const handleItemClick = async (item: ICellContextMenuItem): Promise<void> => {\n if (resolveFlag(item.isDisabled, context, false)) return;\n if (!item.keepOpenOnClick) onClose();\n await item.onClick?.(context);\n };\n\n return createPortal(\n <div\n ref={menuRef}\n role='menu'\n aria-label={t('Cell actions')}\n data-testid='cell-context-menu'\n className={cn(\n 'fixed min-w-[180px] max-w-[280px] py-1 rounded-lg font-inter',\n 'bg-white dark:bg-black-700',\n 'border border-neutral-200 dark:border-black-600',\n 'shadow-lg dark:shadow-black/40',\n config?.className,\n )}\n style={{\n left: position?.left ?? state.x,\n top: position?.top ?? state.y,\n zIndex: CELL_CONTEXT_MENU_Z_INDEX,\n // Hidden until measured so the flip/clamp never flashes at the wrong spot.\n visibility: position ? 'visible' : 'hidden',\n }}\n onContextMenu={(event) => event.preventDefault()}\n >\n {menuRows.map((row, index) => (\n <React.Fragment key={row.key}>\n {(row.kind === 'item' ? row.item.withDividerBefore && index > 0 : row.withDividerBefore) ? (\n <div className='my-1 h-px bg-neutral-200 dark:bg-black-600' />\n ) : null}\n {row.kind === 'item' ? (\n <MenuItemButton\n item={row.item}\n isDisabled={resolveFlag(row.item.isDisabled, context, false)}\n isActive={index === activeIndex}\n onSelect={() => void handleItemClick(row.item)}\n onHover={() => setActiveIndex(index)}\n />\n ) : row.kind === 'skeleton' ? (\n <div className='px-3 py-2' data-testid='cell-context-menu-loading'>\n <div className='h-3.5 w-full animate-pulse rounded bg-neutral-200 dark:bg-black-600' />\n </div>\n ) : (\n /* Row actions are rendered as the table supplied them — they carry their own button and handler. */\n <div data-menu-item tabIndex={-1} className='outline-none [&_button]:w-full' onClick={onClose} onMouseEnter={() => setActiveIndex(index)}>\n {row.node}\n </div>\n )}\n </React.Fragment>\n ))}\n </div>,\n document.body,\n );\n};\n"],"names":["writeToClipboard","text","textarea","copied","toAbsoluteUrl","href","resolveFlag","flag","context","fallback","MenuItemButton","item","isDisabled","isActive","onSelect","onHover","jsxs","cn","jsx","CellContextMenuPortal","state","config","rowOptions","asyncRowOptionsFilter","checkedIds","rows","columns","rowLinkConfig","onClose","tableConfig","useTableConfig","t","useMemo","key","menuRef","useRef","position","setPosition","useState","activeIndex","setActiveIndex","copyState","setCopyState","rowOptionsFilter","setRowOptionsFilter","closeTimer","handleCopy","useCallback","menuContext","isCopied","COPY_FEEDBACK_DURATION","buildCopyItem","label","icon","isDone","CheckIcon","ContentCopyIcon","rowJson","getRowJson","selectedRowsJson","getSelectedRowsJson","selectedCount","rowLinkPath","rowLinkResolvedHref","useHref","rowLinkHref","openInNewTab","items","defaultItems","LinkIcon","OpenInNewIcon","extraItems","resolvedRowOptions","option","hasRowOptions","useEffect","isCancelled","available","allowedRowOptions","menuRows","itemRows","needsDivider","index","isRowNavigable","row","firstNavigableIndex","useLayoutEffect","width","height","margin","CELL_CONTEXT_MENU_VIEWPORT_MARGIN","offset","CELL_CONTEXT_MENU_CURSOR_OFFSET","left","top","moveActiveIndex","direction","current","next","step","handlePointerDown","event","handleKeyDown","handleScroll","timeoutId","handleItemClick","createPortal","CELL_CONTEXT_MENU_Z_INDEX","React"],"mappings":"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"}
1
+ {"version":3,"file":"CellContextMenuPortal.es.js","sources":["../../../../src/components/data-display/infinite-table/CellContextMenuPortal.tsx"],"sourcesContent":["import { useTableConfig } from '../../../providers/design-system-provider/hooks';\nimport { CheckIcon, ContentCopyIcon, LinkIcon, OpenInNewIcon } from '../../icon';\nimport type {\n ICellContextMenuConfig,\n ICellContextMenuContext,\n ICellContextMenuItem,\n ICellContextMenuState,\n IColumn,\n IRowLinkConfig,\n} from './types';\nimport { getRowJson, getSelectedRowsJson } from './copy-text';\nimport cn from 'classnames';\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n CELL_CONTEXT_MENU_CURSOR_OFFSET,\n COPY_FEEDBACK_DURATION,\n CELL_CONTEXT_MENU_VIEWPORT_MARGIN,\n CELL_CONTEXT_MENU_Z_INDEX,\n} from './constants';\n\ntype TRowOption = { key: string; label: React.ReactNode; isVisible?: boolean };\n\n/** Result of the per-row availability check for row actions. */\ntype TRowOptionsFilter =\n | { status: 'off' }\n | { status: 'loading' }\n | { status: 'ready'; available: Record<string, boolean> }\n | { status: 'failed' };\n\n/** One rendered menu line: a declared item, a row-action node supplied by the table, or the row-action placeholder. */\ntype TMenuRow =\n | { kind: 'item'; key: string; item: ICellContextMenuItem }\n | { kind: 'node'; key: string; node: React.ReactNode; withDividerBefore?: boolean }\n | { kind: 'skeleton'; key: string; withDividerBefore?: boolean };\n\ninterface CellContextMenuPortalProps {\n state: ICellContextMenuState | null;\n config?: ICellContextMenuConfig | null;\n /** The table's row actions, appended to the menu — same list the three-dot cell renders. */\n rowOptions?: TRowOption[] | ((rowData: Record<string, unknown>) => TRowOption[] | null) | null;\n /** Per-row availability check for `rowOptions`, mirroring the three-dot cell so both menus agree. */\n asyncRowOptionsFilter?: ((rowId: string) => Promise<Record<string, boolean>>) | null;\n /** Checked row ids, enabling the \"Copy selected rows\" item. */\n checkedIds?: (string | number)[];\n /** Table rows, used to build the text for selected rows that are scrolled out of view. */\n rows?: Record<string, unknown>[];\n /** Visible columns in display order, used to order the copied values. */\n columns?: IColumn[];\n /** The table's row link, enabling the \"Copy Link\" / \"Open in New Tab\" items. */\n rowLinkConfig?: IRowLinkConfig | null;\n onClose: () => void;\n}\n\n/** Clipboard write with a fallback for browsers / insecure contexts without the async clipboard API. */\nconst writeToClipboard = async (text: string): Promise<boolean> => {\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through to the textarea fallback\n }\n\n try {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n const copied = document.execCommand('copy');\n document.body.removeChild(textarea);\n return copied;\n } catch {\n return false;\n }\n};\n\n/** `linkTo` returns a router path; the clipboard and a new tab both need a full URL. */\nconst toAbsoluteUrl = (path: string): string => {\n if (!path) return '';\n\n try {\n return new URL(path, window.location.href).href;\n } catch {\n return '';\n }\n};\n\nconst resolveFlag = (\n flag: boolean | ((context: ICellContextMenuContext) => boolean) | undefined,\n context: ICellContextMenuContext,\n fallback: boolean,\n): boolean => {\n if (flag === undefined) return fallback;\n return typeof flag === 'function' ? flag(context) : flag;\n};\n\nconst MenuItemButton: React.FC<{\n item: ICellContextMenuItem;\n isDisabled: boolean;\n isActive: boolean;\n onSelect: () => void;\n onHover: () => void;\n}> = ({ item, isDisabled, isActive, onSelect, onHover }) => (\n <button\n type='button'\n role='menuitem'\n data-menu-item\n disabled={isDisabled}\n aria-disabled={isDisabled}\n tabIndex={isActive ? 0 : -1}\n className={cn(\n 'flex w-full items-center gap-3 px-3 py-2 text-sm font-medium text-left outline-none',\n isDisabled\n ? 'opacity-50 cursor-not-allowed'\n : cn(\n 'cursor-pointer',\n item.isDanger\n ? 'text-error-600 dark:text-error-400 hover:bg-error-50 dark:hover:bg-error-950 focus-visible:bg-error-50 dark:focus-visible:bg-error-950'\n : 'text-neutral-900 dark:text-white hover:bg-neutral-100 dark:hover:bg-black-600 focus-visible:bg-neutral-100 dark:focus-visible:bg-black-600',\n ),\n )}\n onClick={onSelect}\n onMouseEnter={() => !isDisabled && onHover()}\n >\n {item.icon ? (\n <span className={cn('flex shrink-0 items-center', item.isDanger ? 'text-error-600 dark:text-error-400' : 'text-neutral-500 dark:text-black-300')}>\n {item.icon}\n </span>\n ) : null}\n <span className='flex-1 truncate'>{item.label}</span>\n {item.shortcut ? <span className='shrink-0 text-xs text-neutral-400 dark:text-black-300'>{item.shortcut}</span> : null}\n </button>\n);\n\n/**\n * Right-click menu for data cells. Rendered once per table and positioned at the\n * cursor; `DataCell` opens it through `openCellContextMenu` on the table context.\n */\nexport const CellContextMenuPortal: React.FC<CellContextMenuPortalProps> = ({\n state, config, rowOptions, asyncRowOptionsFilter, checkedIds, rows, columns, rowLinkConfig, onClose,\n}) => {\n const tableConfig = useTableConfig();\n const t = useMemo(() => tableConfig?.t ?? ((key: string) => key), [tableConfig]);\n const menuRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ left: number; top: number } | null>(null);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [copyState, setCopyState] = useState<{ key: string; isCopied: boolean } | null>(null);\n const [rowOptionsFilter, setRowOptionsFilter] = useState<TRowOptionsFilter>({ status: 'off' });\n const closeTimer = useRef<ReturnType<typeof setTimeout>>();\n\n const context = useMemo<ICellContextMenuContext | null>(\n () => (state ? { ...state.target, close: onClose } : null),\n [state, onClose],\n );\n\n const handleCopy = useCallback(\n async (key: string, text: string, menuContext: ICellContextMenuContext) => {\n if (copyState) return;\n\n const isCopied = await writeToClipboard(text);\n\n if (isCopied) {\n config?.onCopy?.(text, menuContext);\n tableConfig?.showNotification?.('success', t('Copied to clipboard'));\n } else {\n tableConfig?.showNotification?.('error', t('Could not copy to clipboard'));\n }\n\n // Confirmed inline instead of with a toast, so the menu owns its own feedback.\n setCopyState({ key, isCopied });\n closeTimer.current = setTimeout(() => onClose(), COPY_FEEDBACK_DURATION);\n },\n [config, tableConfig, t, onClose, copyState],\n );\n\n const buildCopyItem = useCallback(\n (key: string, label: string, text: string, icon?: React.ReactNode): ICellContextMenuItem => {\n const isDone = copyState?.key === key;\n\n return {\n key,\n label: !isDone ? label : copyState?.isCopied ? t('Copied') : t('Copy failed'),\n icon:\n isDone && copyState?.isCopied ? (\n <CheckIcon size={16} className='text-success-600 dark:text-success-400' />\n ) : (\n icon ?? <ContentCopyIcon size={16} />\n ),\n isDisabled: !text,\n keepOpenOnClick: true,\n onClick: (menuContext) => handleCopy(key, text, menuContext),\n };\n },\n [copyState, handleCopy, t],\n );\n\n const rowJson = useMemo(() => getRowJson(state?.target.rowData, columns), [state?.target.rowData, columns]);\n // Only while the menu is open — otherwise every checkbox tick would serialize the selection.\n const selectedRowsJson = useMemo(() => (state ? getSelectedRowsJson(rows, columns, checkedIds) : ''), [state, rows, columns, checkedIds]);\n const selectedCount = checkedIds?.length ?? 0;\n\n /** The row link as an absolute URL — empty unless the table opted in, and never on a cell that opts out of the row link. */\n const rowLinkHref = useMemo(() => {\n if (!state || !rowLinkConfig?.isEnabled || !rowLinkConfig.linkTo || state.target.column?.disableRowClick) return '';\n\n return toAbsoluteUrl(rowLinkConfig.linkTo(String(state.target.rowId), state.target.rowData));\n }, [state, rowLinkConfig]);\n\n const openInNewTab = useCallback(() => {\n if (rowLinkHref) window.open(rowLinkHref, '_blank', 'noopener,noreferrer');\n }, [rowLinkHref]);\n\n const items = useMemo<ICellContextMenuItem[]>(() => {\n if (!context) return [];\n\n const defaultItems: ICellContextMenuItem[] = config?.hideDefaultItems\n ? []\n : [\n buildCopyItem('copy-cell', config?.copyLabel ?? t('Copy Cell'), context.text),\n buildCopyItem('copy-row', t('Copy Row'), rowJson),\n ...(selectedCount > 0\n ? [\n buildCopyItem(\n 'copy-selected-rows',\n selectedCount === 1 ? t('Copy Selected Row') : `${t('Copy Selected Rows')} (${selectedCount})`,\n selectedRowsJson,\n ),\n ]\n : []),\n ...(rowLinkHref && !config?.hideLinkItems\n ? [\n {\n ...buildCopyItem('copy-link', t('Copy Link'), rowLinkHref, <LinkIcon size={16} />),\n withDividerBefore: true,\n },\n {\n key: 'open-in-new-tab',\n label: t('Open in New Tab'),\n icon: <OpenInNewIcon size={16} />,\n onClick: openInNewTab,\n },\n ]\n : []),\n ];\n\n const extraItems = typeof config?.items === 'function' ? config.items(context) : config?.items ?? [];\n\n return [...defaultItems, ...extraItems].filter((item) => resolveFlag(item.isVisible, context, true));\n }, [config, context, buildCopyItem, selectedCount, rowJson, selectedRowsJson, rowLinkHref, openInNewTab, t]);\n\n /** The table's own row actions, resolved for the right-clicked row. */\n const resolvedRowOptions = useMemo<TRowOption[]>(() => {\n if (!state || config?.includeRowOptions === false || !rowOptions) return [];\n\n const list = typeof rowOptions === 'function' ? rowOptions(state.target.rowData) : rowOptions;\n\n return (list ?? []).filter((option) => option.isVisible !== false);\n }, [state, rowOptions, config?.includeRowOptions]);\n\n const hasRowOptions = resolvedRowOptions.length > 0;\n\n /** Row actions can be gated per row by the API — ask before showing them, exactly as the three-dot cell does. */\n useEffect(() => {\n if (!state || !hasRowOptions || !asyncRowOptionsFilter) {\n setRowOptionsFilter({ status: 'off' });\n return;\n }\n\n let isCancelled = false;\n setRowOptionsFilter({ status: 'loading' });\n\n asyncRowOptionsFilter(String(state.target.rowId))\n .then((available) => !isCancelled && setRowOptionsFilter({ status: 'ready', available }))\n .catch(() => !isCancelled && setRowOptionsFilter({ status: 'failed' }));\n\n return () => {\n isCancelled = true;\n };\n }, [state, hasRowOptions, asyncRowOptionsFilter]);\n\n const allowedRowOptions = useMemo<TRowOption[]>(() => {\n if (rowOptionsFilter.status === 'off') return resolvedRowOptions;\n if (rowOptionsFilter.status !== 'ready') return [];\n\n const { available } = rowOptionsFilter;\n\n return resolvedRowOptions.filter((option) => available[option.key] ?? true);\n }, [resolvedRowOptions, rowOptionsFilter]);\n\n const menuRows = useMemo<TMenuRow[]>(() => {\n const itemRows: TMenuRow[] = items.map((item) => ({ kind: 'item', key: item.key, item }));\n const needsDivider = itemRows.length > 0;\n\n if (rowOptionsFilter.status === 'loading') {\n return [...itemRows, { kind: 'skeleton', key: 'row-options-loading', withDividerBefore: needsDivider }];\n }\n\n return [\n ...itemRows,\n ...allowedRowOptions.map<TMenuRow>((option, index) => ({\n kind: 'node',\n key: `row-option-${option.key}`,\n node: option.label,\n withDividerBefore: needsDivider && index === 0,\n })),\n ];\n }, [items, allowedRowOptions, rowOptionsFilter.status]);\n\n const isRowNavigable = useCallback(\n (row: TMenuRow): boolean => (row.kind === 'item' ? !(context && resolveFlag(row.item.isDisabled, context, false)) : row.kind === 'node'),\n [context],\n );\n\n const firstNavigableIndex = useMemo(() => menuRows.findIndex(isRowNavigable), [menuRows, isRowNavigable]);\n\n /** Clamp into the viewport once the menu has been measured; row actions can arrive after the first paint. */\n useLayoutEffect(() => {\n if (!state || !menuRef.current) {\n setPosition(null);\n return;\n }\n\n const { width, height } = menuRef.current.getBoundingClientRect();\n const margin = CELL_CONTEXT_MENU_VIEWPORT_MARGIN;\n const offset = CELL_CONTEXT_MENU_CURSOR_OFFSET;\n\n // Flip to the other side of the cursor when there is no room, then clamp.\n const left = state.x + width + margin > window.innerWidth ? state.x - width - offset : state.x + offset;\n const top = state.y + height + margin > window.innerHeight ? state.y - height - offset : state.y + offset;\n\n setPosition({\n left: Math.max(margin, Math.min(left, window.innerWidth - width - margin)),\n top: Math.max(margin, Math.min(top, window.innerHeight - height - margin)),\n });\n }, [state, menuRows.length]);\n\n useEffect(() => {\n setCopyState(null);\n return () => clearTimeout(closeTimer.current);\n }, [state]);\n\n useEffect(() => {\n if (!state) {\n setActiveIndex(-1);\n return;\n }\n setActiveIndex(firstNavigableIndex);\n }, [state, firstNavigableIndex]);\n\n /** Focus follows the active row so the menu is keyboard operable; row actions bring their own button. */\n useEffect(() => {\n if (!state || activeIndex < 0) return;\n\n const row = menuRef.current?.querySelectorAll<HTMLElement>('[data-menu-item]')[activeIndex];\n const focusTarget = row?.matches('button') ? row : row?.querySelector('button') ?? row;\n\n // preventScroll: a focus-driven scroll would immediately close the menu.\n focusTarget?.focus({ preventScroll: true });\n }, [state, activeIndex]);\n\n const moveActiveIndex = useCallback(\n (direction: 1 | -1) => {\n if (menuRows.length === 0) return;\n setActiveIndex((current) => {\n let next = current;\n for (let step = 0; step < menuRows.length; step += 1) {\n next = (next + direction + menuRows.length) % menuRows.length;\n if (isRowNavigable(menuRows[next])) return next;\n }\n return current;\n });\n },\n [menuRows, isRowNavigable],\n );\n\n useEffect(() => {\n if (!state) return;\n\n const handlePointerDown = (event: MouseEvent | TouchEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) onClose();\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onClose();\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n moveActiveIndex(event.key === 'ArrowDown' ? 1 : -1);\n }\n };\n // Any scroll (table viewport included) detaches the menu from its cell, so close it.\n const handleScroll = () => onClose();\n\n // Deferred so the right click that opened the menu does not immediately close it.\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handlePointerDown);\n document.addEventListener('touchstart', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('scroll', handleScroll, true);\n window.addEventListener('resize', handleScroll);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handlePointerDown);\n document.removeEventListener('touchstart', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('scroll', handleScroll, true);\n window.removeEventListener('resize', handleScroll);\n };\n }, [state, onClose, moveActiveIndex]);\n\n if (!state || !context || menuRows.length === 0) return null;\n\n if (tableConfig?.renderCellContextMenu) {\n return tableConfig.renderCellContextMenu({ state, context, items, rowOptions: allowedRowOptions, onClose }) as JSX.Element;\n }\n\n const handleItemClick = async (item: ICellContextMenuItem): Promise<void> => {\n if (resolveFlag(item.isDisabled, context, false)) return;\n if (!item.keepOpenOnClick) onClose();\n await item.onClick?.(context);\n };\n\n return createPortal(\n <div\n ref={menuRef}\n role='menu'\n aria-label={t('Cell actions')}\n data-testid='cell-context-menu'\n className={cn(\n 'fixed min-w-[180px] max-w-[280px] py-1 rounded-lg font-inter',\n 'bg-white dark:bg-black-700',\n 'border border-neutral-200 dark:border-black-600',\n 'shadow-lg dark:shadow-black/40',\n config?.className,\n )}\n style={{\n left: position?.left ?? state.x,\n top: position?.top ?? state.y,\n zIndex: CELL_CONTEXT_MENU_Z_INDEX,\n // Hidden until measured so the flip/clamp never flashes at the wrong spot.\n visibility: position ? 'visible' : 'hidden',\n }}\n onContextMenu={(event) => event.preventDefault()}\n >\n {menuRows.map((row, index) => (\n <React.Fragment key={row.key}>\n {(row.kind === 'item' ? row.item.withDividerBefore && index > 0 : row.withDividerBefore) ? (\n <div className='my-1 h-px bg-neutral-200 dark:bg-black-600' />\n ) : null}\n {row.kind === 'item' ? (\n <MenuItemButton\n item={row.item}\n isDisabled={resolveFlag(row.item.isDisabled, context, false)}\n isActive={index === activeIndex}\n onSelect={() => void handleItemClick(row.item)}\n onHover={() => setActiveIndex(index)}\n />\n ) : row.kind === 'skeleton' ? (\n <div className='px-3 py-2' data-testid='cell-context-menu-loading'>\n <div className='h-3.5 w-full animate-pulse rounded bg-neutral-200 dark:bg-black-600' />\n </div>\n ) : (\n /* Row actions are rendered as the table supplied them — they carry their own button and handler. */\n <div data-menu-item tabIndex={-1} className='outline-none [&_button]:w-full' onClick={onClose} onMouseEnter={() => setActiveIndex(index)}>\n {row.node}\n </div>\n )}\n </React.Fragment>\n ))}\n </div>,\n document.body,\n );\n};\n"],"names":["writeToClipboard","text","textarea","copied","toAbsoluteUrl","path","resolveFlag","flag","context","fallback","MenuItemButton","item","isDisabled","isActive","onSelect","onHover","jsxs","cn","jsx","CellContextMenuPortal","state","config","rowOptions","asyncRowOptionsFilter","checkedIds","rows","columns","rowLinkConfig","onClose","tableConfig","useTableConfig","t","useMemo","key","menuRef","useRef","position","setPosition","useState","activeIndex","setActiveIndex","copyState","setCopyState","rowOptionsFilter","setRowOptionsFilter","closeTimer","handleCopy","useCallback","menuContext","isCopied","COPY_FEEDBACK_DURATION","buildCopyItem","label","icon","isDone","CheckIcon","ContentCopyIcon","rowJson","getRowJson","selectedRowsJson","getSelectedRowsJson","selectedCount","rowLinkHref","openInNewTab","items","defaultItems","LinkIcon","OpenInNewIcon","extraItems","resolvedRowOptions","option","hasRowOptions","useEffect","isCancelled","available","allowedRowOptions","menuRows","itemRows","needsDivider","index","isRowNavigable","row","firstNavigableIndex","useLayoutEffect","width","height","margin","CELL_CONTEXT_MENU_VIEWPORT_MARGIN","offset","CELL_CONTEXT_MENU_CURSOR_OFFSET","left","top","moveActiveIndex","direction","current","next","step","handlePointerDown","event","handleKeyDown","handleScroll","timeoutId","handleItemClick","createPortal","CELL_CONTEXT_MENU_Z_INDEX","React"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),Ts=require("../../../hooks/useCheckbox.cjs.js"),ys=require("../../../providers/design-system-provider/hooks.cjs.js"),Be=require("../../../utils/table.cjs.js"),At=require("../../button/Button.cjs.js"),Rs=require("../../floating-bar/FloatingBar.cjs.js"),xe=require("../typography/Typography.cjs.js"),E=require("@dnd-kit/core"),l=require("react"),js=require("react-virtualized-auto-sizer"),Os=require("react-dom"),_t=require("react-table"),ks=require("./body/index.cjs.js"),Mt=require("./validateCell.cjs.js"),Es=require("./body/rows/row.cjs.js"),Ds=require("./context.cjs.js"),Ns=require("./CellContextMenuPortal.cjs.js"),As=require("./CurrencyDropdownPortal.cjs.js"),_s=require("./head/index.cjs.js"),Ms=require("./PendingEditsFloatingBar.cjs.js"),m=require("./constants.cjs.js"),It=require("./useRowHeight.cjs.js"),Is=require("../empty-state/NoDataFoundWidgets.cjs.js"),Ls=require("../empty-state/NoDataFound.cjs.js"),gs=require("../../icon/icons.generated.cjs.js"),Cs=js.AutoSizer,Lt="Create Column",Vs=(_,T)=>`button-admin-${_.toLowerCase().trim().replace(/\s+/g,"-").replace(/[^a-z0-9-_]/g,"")||T}`,Bs=l.memo(({tableKey:_,searchConfig:T={search:"",handleSearch:()=>null,allowAStarSearch:!1},filterConfig:a={columnFilters:[],onFilter:()=>null,onRemoveFilter:()=>null,onClearFilter:()=>null,onResetFilter:()=>Promise.resolve({}),asyncRowOptionsFilter:()=>Promise.resolve({})},sortConfig:f={onSort:()=>null,columnSort:{field:"",order:""},onRemoveSort:()=>null},headerConfig:i={showExportButton:null,showFilters:!0,showSorts:!0,showSearch:!0,showTableView:!0,showTableViewAsModal:!1,content:null,postContent:null,preContent:null,isLoading:!1,showDivider:!1},hoverConfig:gt=null,columns:R,modelName:J,enableMasterDataEnumSuggestions:G=!1,agreementId:X,enumSuggestionsExtraParams:Y,enumSuggestionsData:Z,data:d=[],onRowClick:Ct,showHeader:ve,showSubHeader:Vt=!0,tableActions:Pe,rowOptions:M,hideRowOptionWidth:qe,checkboxUtilities:I,isLoading:Q=!1,onScroll:Bt,onScrolling:Pt,isColumnConfigurable:K,onAddColumnClick:ee,emptyMessage:We,noDataWidget:He,buttons:$e,onEditColumnClick:ze,onDeleteColumnClick:Ue,onRowTooltipClick:qt,tooltiptext:Wt,cascadingTableConfig:Ht,originalsOnly:$t,disableOptionsForRowIndex:zt,tableHeightClass:te="h-[calc(100vh-220px)]",getFullRowDataOnClick:Ut,selectedRowId:Jt=null,onRowEdit:D,onBulkRowEdit:L,inlineEditColumns:Gt,isResizable:Xt=!0,paginationConfig:le,dndSortableUtils:se,multipleContexts:Je,withSortable:Se,withDraggable:Yt,enableRootDrag:Zt,pageSize:Qt=m.DEFAULT_PAGE_SIZE,onCascadingRowExpand:Kt,totalItems:Ge,showRecordCount:we=!1,getInnerRowData:el,maxLevel:tl,expandedRows:ll={},setExpandedRows:sl,showNewItem:rl,rawData:Xe,dragConfig:nl,isOverlayLoading:al,style:ol={},floatingBarConfig:be,rowWrapper:cl,rowLinkConfig:Ye,isCellClickDisabled:il,setHeaderOnParent:pe,optimizeTable:ul=!1,multiSelectConfig:dl,cellContextMenuConfig:Ze,headerContextOptions:hl,showHeaderContextOptions:ml,setShowHeaderContextOptions:fl,showDataTypeIcon:xl=!1,rowAdditionalActions:re,rowAdditionalActionsWidth:Fe,setVisibleHeaders:Te,cellEditing:vl=null,cellEditingValue:Sl=null,allowInlineEdit:wl=!1,onFieldOperationFlow:bl,fieldOperationLoading:g=null,onTableActionsReady:ye,onPendingEditsChange:Qe,onCancelPendingEdits:C})=>{const c=ys.useTableConfig(),pl=It.getRowSlotHeight(It.useRowHeight()),Fl=!!T?.search,Ke=a?.columnFilters?.length>0,q=Fl||Ke,Tl=!!I,y=c?.getTableView?.(_)??null,[p,W]=l.useState(y||null),et=Be.isModifiedGlobalView(p,c?.getUserId?.()),[Re,je]=l.useState(!1),[Oe,tt]=l.useState(!1),[yl,lt]=l.useState(null),[v,ke]=l.useState(R),st=(d.length===0||!v.length)&&!Q,[rt,ne]=l.useState(null),[Rl,jl]=l.useState(!1),[Ol,kl]=l.useState(null),[El,Dl]=l.useState(!1),[Nl,ae]=l.useState(null),[Al,oe]=l.useState(null),[_l,nt]=l.useState({}),[H,Ee]=l.useState(null),[Ml,at]=l.useState(!1),[j,Il]=l.useState(0),De=l.useRef(null),Ne=l.useRef(null),[ot,Ll]=l.useState({width:0,height:0}),[gl,V]=l.useState(null),[O,ct]=l.useState(null),[Cl,it]=l.useState(null),[ut,dt]=l.useState(null),[Vl,ht]=l.useState(null),[Ae,$]=l.useState({}),_e=l.useRef(!1),ce=l.useRef(!1),Me=l.useRef(p);Me.current=p;const mt=l.useRef(c);mt.current=c;const ft=l.useRef(R);ft.current=R;const ie=l.useRef(a);ie.current=a;const xt=l.useRef(null),vt=l.useRef(()=>({})),St=l.useRef(()=>({})),[h,k]=l.useState({}),Ie=l.useCallback((e,t,r)=>{k(n=>{const o=n[e]?.[t];let u=r.validationError;if(u===void 0){const w=v.find(x=>x.key===t);if(w){const x=Mt.validateCellValue(r.value,w);u=x.isValid?null:x.error||"Invalid"}else u=o?.validationError??null}return{...n,[e]:{...n[e]||{},[t]:{...r,validationError:u??null}}}})},[v]),wt=l.useCallback(()=>Object.values(h).some(e=>Object.keys(e).length>0),[h]);l.useEffect(()=>{ye&&ye({addPendingEdit:Ie,hasPendingEdits:wt})},[ye,Ie,wt]);const Bl=l.useCallback((e,t)=>{k(r=>{const n={...r};if(n[e]){const{[t]:o,...u}=n[e];Object.keys(u).length===0?delete n[e]:n[e]=u}return n})},[]),Pl=l.useCallback((e,t)=>h[e]?.[t],[h]),ql=l.useCallback((e,t)=>!!h[e]?.[t],[h]),bt=l.useCallback(()=>{g||(C&&Object.keys(h).length>0&&C(h),k({}),$({}),V(null))},[g,C,h]),B=l.useCallback((e,t,r)=>{setTimeout(()=>{c?.dispatchEvent?.("SCROLL_TO_TABLE_ROW",{rowIndex:r});const n=v.findIndex(o=>o.key===t);setTimeout(()=>{const o=document.querySelector(`[${m.DATA_ROW_ID_ATTR}="${e}"] [${m.DATA_COLUMN_KEY_ATTR}="${t}"]`);if(o)o.scrollIntoView({behavior:"smooth",block:"center",inline:"center"});else if(n>0){const u=document.querySelector(m.OS_VIEWPORT_SELECTOR);if(u){let w=0;for(let x=0;x<n;x++){const F=v[x];F?.sticky||(w+=F?.width||m.SCROLL_TO_CELL_COLUMN_WIDTH_FALLBACK)}w=Math.max(0,w-m.SCROLL_TO_CELL_LEFT_OFFSET),u.scrollTo({left:w,behavior:"smooth"})}}V({rowId:e,columnKey:t})},350)},100)},[v,c]),z=l.useCallback(e=>{let t=!1,r=null;const n={},o=new Set;return Object.entries(e).forEach(([u,w])=>{n[u]={},Object.entries(w).forEach(([x,F])=>{const A=v.find(b=>b.key===x),S=Mt.validateCellValue(F.value,A);S.isValid?n[u][x]={...F,validationError:null}:(t=!0,S.error&&o.add(S.error),r||(r={rowId:u,columnKey:x}),n[u][x]={...F,validationError:S.error})})}),{hasErrors:t,updatedEdits:n,firstError:r,errorTypes:o}},[v]),ue=l.useCallback(e=>{const t=e.has("Field required"),r=e.size>(t?1:0);return t&&r?"Missing required field(s) and invalid format detected. Please review highlighted field(s).":t?"Missing required field(s). Please review highlighted field(s).":"Invalid field value(s). Please review highlighted field(s)."},[]),pt=l.useCallback(()=>{const{hasErrors:e,updatedEdits:t,firstError:r,errorTypes:n}=z(h);if(e){if(k(t),c?.showNotification?.("error",ue(n)),r){const u=d.findIndex(w=>w.id===r.rowId);B(r.rowId,r.columnKey,u)}return}const o=[];Object.entries(h).forEach(([u,w])=>{const x=d.find(F=>F.id===u);if(x){const F={...x},A={};Object.entries(w).forEach(([S,b])=>{F[S]=b.value,A[S]={value:b.value,meta:b.meta}}),o.push({...F,__editedFields:A})}}),o.length>0&&(L?L(o):D&&D(null,null,null,null,null,{isBulk:!0,rows:o})),k({}),$({}),V(null)},[h,d,D,L,z,ue,B,c]),Wl=l.useCallback(e=>{if(g)return;const t=h[e];t&&C&&C({[e]:t}),k(r=>{const n={...r};return delete n[e],n}),$(r=>{const n={...r};return Object.keys(n).forEach(o=>{o.startsWith(`${e}-`)&&delete n[o]}),n}),V(null)},[g,C,h]),Hl=l.useCallback(e=>{const t=h[e];if(!t||Object.keys(t).length===0)return;const{hasErrors:r,updatedEdits:n,firstError:o,errorTypes:u}=z({[e]:t});if(r){if(k(S=>({...S,[e]:n[e]})),c?.showNotification?.("error",ue(u)),o){const S=d.findIndex(b=>b.id===o.rowId);B(o.rowId,o.columnKey,S)}return}const w=d.find(S=>S.id===e);if(!w)return;const x={...w},F={};Object.entries(t).forEach(([S,b])=>{x[S]=b.value,F[S]={value:b.value,meta:b.meta}});const A={...x,__editedFields:F};L?L([A]):D&&D(null,null,null,null,null,{isBulk:!0,rows:[A]}),k(S=>{const b={...S};return delete b[e],b}),$(S=>{const b={...S};return Object.keys(b).forEach(Nt=>{Nt.startsWith(`${e}-`)&&delete b[Nt]}),b}),V(null)},[h,d,D,L,z,ue,B,c]),P=l.useMemo(()=>Object.values(h).reduce((e,t)=>e+Object.keys(t).length,0),[h]);l.useEffect(()=>{Qe?.(P>0,P)},[P,Qe]);const $l=l.useMemo(()=>{const e=[];return Object.entries(h).forEach(([t,r])=>{const n=d.findIndex(o=>o.id===t);Object.entries(r).forEach(([o,u])=>{const w=v.find(x=>x.key===o);e.push({rowId:t,columnKey:o,fieldName:w?.Header||w?.display_name||o,value:u.value,originalValue:u.originalValue,meta:u.meta,originalMeta:u.originalMeta,rowIndex:n})})}),e},[h,v,d]),zl=l.useMemo(()=>{const e=new Map;return Object.entries(h).forEach(([t,r])=>{const n=d.findIndex(o=>o.id===t);e.set(t,{rowId:t,rowIndex:n,editCount:Object.keys(r).length})}),Array.from(e.values()).sort((t,r)=>t.rowIndex-r.rowIndex)},[h,d]),Ul=l.useCallback(e=>ct(e),[]),de=l.useCallback(()=>ct(null),[]),Jl=l.useCallback((e,t)=>{it({value:e,reference:t}),O?.onSelected&&O.onSelected(e,t),de()},[O,de]),Gl=l.useCallback(()=>it(null),[]),Xl=l.useCallback(e=>dt(e),[]),Ft=l.useCallback(()=>dt(null),[]),Yl=l.useCallback(e=>ht(e),[]),Tt=l.useCallback(()=>ht(null),[]),Zl=l.useCallback((e,t)=>{$(r=>({...r,[e]:t}))},[]),Ql=l.useCallback(e=>Ae[e],[Ae]),Kl=l.useMemo(()=>{const e=te.match(/h-\[(\d+px)\]/);if(e)return e[1];const t=te.match(/h-\[(calc\(.+\))\]/);if(t)return t[1].replace(/([+-])/g," $1 ").replace(/\s+/g," ")},[te]),es={isEmpty:st,isFilters:q,isColumnConfigurable:K,handleOnClick:ee,emptyMessage:We,buttons:$e,noDataWidget:He},ts=c?.t?.(Lt)??Lt,he=q?"No Results Found":We||"No Data Found",ls=typeof he=="string"?c?.t?.(he)??he:he,yt={__isLoading:!0},ss=new Array(1).fill(yt),rs=new Array(Qt).fill(yt),U=l.useMemo(()=>v.filter(e=>!!e?.visible),[v]),ns=_t.useTable({columns:ul?U:v,data:[...d,...Q?d?.length?ss:rs:[]],defaultColumn:{minWidth:m.DEFAULT_COLUMN_MIN_WIDTH,width:m.DEFAULT_COLUMN_WIDTH,maxWidth:m.DEFAULT_COLUMN_MAX_WIDTH}},_t.useResizeColumns),{getTableProps:Rt,getTableBodyProps:jt,headerGroups:me,prepareRow:Ot,rows:N}=ns;xt.current=me;const as=JSON.stringify(me[0]?.headers?.map(e=>e?.Header));l.useEffect(()=>{if(Te){const e=xt.current;Te?.(e?.[0]?.headers?.map(t=>t?.Header)??[])}},[as,Te]);const{checkboxConfig:Le}=Ts.useCheckbox({rows:N,checkedIds:I?.checkedIds,isCheckAllDisabled:I?.isCheckAllDisabled,selectionDisabledRowIds:I?.selectionDisabledRowIds,rawData:Xe,onAllChecked:Dl,setCheckedIds:I?.setCheckedIds,checkboxMetadata:I?.checkboxMetadata}),os=E.useSensors(E.useSensor(E.MouseSensor,{activationConstraint:{distance:m.DND_ACTIVATION_DISTANCE}}),E.useSensor(E.TouchSensor,{activationConstraint:{distance:m.DND_ACTIVATION_DISTANCE}})),cs={easing:m.DROP_ANIMATION_EASING,duration:m.DROP_ANIMATION_DURATION};function is(){return!Je?.length||!Se?N:Je.reduce((e,t)=>(e[t]=N.filter(r=>r.original?.type===t),e),{})}St.current=is;const us=e=>{const{active:t}=e;Ee(N.find(r=>r.original?.id===t?.id)??null)},ds=e=>{const{active:t,over:r}=e;r&&(se?.checkDndDragEnd&&se.checkDndDragEnd(t,r,_l,n=>{nt(n),at(!0),se.onDragSuccess?.({draggedId:t.id,droppedId:r.id,draggedType:t.data.current?.type,droppedType:r.data.current?.type,updatedList:n,cb:()=>at(!1)})}),Ee(null))},hs=()=>Ee(null),ms=e=>{!f?.onSort&&!a?.onFilter||ne(rt===e?null:e)},fs=e=>{kl(e),jl(!Rl),ne(null)},ge=l.useCallback(()=>{f?.onRemoveSort?f.onRemoveSort():f?.onSort&&f.onSort("","")},[f]),fe=l.useCallback((e=null)=>{lt(e),je(t=>e?!0:!t)},[]),Ce=l.useCallback(()=>tt(e=>!e),[]),xs=()=>{const e=me[0]?.headers?.filter(t=>t?.visible!==!1);for(let t=0;t<e.length;t++)if(e[t].sticky)return t-1;return e.length-1},vs=l.useCallback(e=>{let t=0;for(let r=e+1;r<U.length;r++)U[r].visible!==!1&&(t+=U[r].width??0);return re&&(t+=Fe||m.ROW_ADDITIONAL_ACTIONS_DEFAULT_WIDTH),M&&(t+=qe?0:m.ROW_OPTIONS_COLUMN_WIDTH),t},[U,Fe,qe,re,M]),kt=()=>{const e=c?.getUserId?.();return{...p||{},name:p?.name||"Untitled View",created_by:p?.created_by||e,filters:p?.filters||a?.columnFilters,id:p?.id||"untitled-view",table_key:p?.table_key||_,columns:p?.columns||R?.map((t,r)=>({name:t.Header,width:t.width,visible:t.visible,sticky:t.sticky,order:r+1,display_name:t.Header,sequence:r+1,Header:t.Header}))}};vt.current=kt;const Ss=(e,t)=>{const r=kt();W({...r,columns:r?.columns?.map(n=>n.name===e?{...n,width:t}:n),unsaved:!0})};l.useEffect(()=>{a?.columnFilters?.length>0&&je(!0);const e=Me.current;if(JSON.stringify(e?.filters||[])!==JSON.stringify(a?.columnFilters||[])){const t=(e?.filters?.length??0)>0,r=a?.columnFilters?.length>0;if(!(t&&!r&&!ce.current)){const o=vt.current();W({...o,filters:JSON.parse(JSON.stringify(a?.columnFilters||[])),unsaved:!0})}ce.current=!1}},[a?.columnFilters]);const ws=l.useCallback(e=>{ce.current=!0,a?.onRemoveFilter?.(e)},[a?.onRemoveFilter]),bs=l.useCallback(()=>{ce.current=!0,a?.onClearFilter?.()},[a?.onClearFilter]);l.useEffect(()=>{f?.columnSort?.field?(tt(!0),f.columnSort.order==="asc"?(ae(f.columnSort.field),oe(null)):f.columnSort.order==="desc"&&(oe(f.columnSort.field),ae(null))):(ae(null),oe(null))},[f?.columnSort?.field,f?.columnSort?.order]),l.useEffect(()=>{ke(Be.mergeViewColumnsWithTableColumns(Me.current?.columns||[],R))},[R]),l.useEffect(()=>{p?.unsaved&&!et&&mt.current?.persistTableView?.(p)},[p]),l.useEffect(()=>{nt(St.current())},[N.length]),l.useEffect(()=>{et||(W(y||null),y?.columns&&ke(Be.mergeViewColumnsWithTableColumns(y?.columns||[],ft.current)),y?.filters&&y.filters.length>0&&!_e.current?(requestAnimationFrame(()=>{ie.current?.onFilter?.(y.filters)}),_e.current=!0):y?.filters&&_e.current&&JSON.stringify(y.filters)!==JSON.stringify(ie.current?.columnFilters)&&ie.current?.onFilter?.(y.filters))},[y]),l.useEffect(()=>{if(De.current){const e=new ResizeObserver(t=>Il(t[0].contentRect.width));return e.observe(De.current),()=>e.disconnect()}},[]),l.useEffect(()=>{if(!Ne.current)return;const e=new ResizeObserver(t=>{const{width:r,height:n}=t[0].contentRect;Ll({width:r,height:n})});return e.observe(Ne.current),()=>e.disconnect()},[]);const Et=s.jsx(_s.Head,{isResizable:Xt,headerGroups:me,isCheckbox:Tl,checkboxConfig:Le,isAllChecked:El,showHeaderOptions:rt??"",setShowHeaderOptions:ne,isShowSortArrowAsc:Nl,isShowSortArrowDesc:Al,onSort:f?.onSort,onFilter:a?.onFilter,toggleHeaderOption:ms,setIsShowSortArrowAsc:ae,setIsShowSortArrowDesc:oe,toggleDataFilterModal:fe,rowOptions:Array.isArray(M)?M:[],isColumnConfigurable:K??!1,onAddColumnClick:ee,onEditColumnClick:ze,onDeleteColumnClick:Ue,tableActions:Pe||null,isLoading:Q,rowAdditionalActions:re??null,showPendingEditsColumn:P>0}),Dt=s.jsxs(s.Fragment,{children:[Ml||al?s.jsx("div",{className:"absolute left-0 top-0 w-full h-full z-40 flex items-center justify-center bg-neutral-100 dark:bg-black-700"}):null,s.jsx("div",{...Rt(),className:"w-full text-sm text-left text-neutral-500 dark:text-neutral-200 h-full bg-white dark:bg-black-800",children:st?s.jsxs("div",{className:"z-10",children:[Et,s.jsx("div",{className:"absolute w-full",children:c?.renderEmpty?c.renderEmpty(es):s.jsxs("div",{className:"flex flex-col items-center justify-center w-full h-[12rem] text-neutral-900 dark:text-neutral-200 mt-8",children:[He&&!q?s.jsx(Is.NoDataFoundWidgets,{widgetType:"TABLE"}):s.jsx(Ls.NoDataFound,{text:ls}),K&&!q?s.jsx("div",{className:"my-4",children:s.jsxs(At,{id:"btn-table-shell-create-column",status:"primary",appearance:"ghost",onClick:ee,children:[s.jsx(gs.Add2Icon,{className:"text-white dark:text-white"})," ",ts]})}):null,!q&&$e?.map((e,t)=>s.jsx(At,{status:"secondary",id:Vs(e.label,t),onClick:e.onClick,children:c?.t?.(e.label)??e.label},`${e.label}-${t}`))]})})]}):s.jsx(Cs,{style:{width:"100%",height:"100%"},renderProp:({width:e,height:t})=>{const r=e>0?e:ot.width,n=t>0?t:ot.height;return r>0&&n>0?s.jsx(ks.Body,{getTableBodyProps:jt,rows:N,prepareRow:Ot,isLoading:Q,onScroll:Bt,onScrolling:Pt,columns:R,width:r,height:n,withSortable:Se,allowAstarSearch:T?.allowAStarSearch||!1}):null}})})]}),ps=l.forwardRef((e,t)=>s.jsxs("div",{className:"h-full w-full",...e,ref:t,children:[Et,s.jsx("div",{className:"relative w-full h-full",children:e?.children})]})),Fs=l.forwardRef((e,t)=>s.jsx("div",{className:"h-full w-full",...e,ref:t,children:s.jsx("div",{className:"relative w-full h-full",children:e?.children})})),Ve=l.useMemo(()=>c?.renderTableHeader?c.renderTableHeader({tableKey:_,search:T?.search,handleSearch:T?.handleSearch,toggleShowFilters:fe,toggleShowSorts:Ce,filterCounts:a?.columnFilters?.length,columns:R,columnFilters:a?.columnFilters,setSelectedTableView:W,selectedTableView:p,enableTableView:i?.showTableView,modelName:J,enableMasterDataEnumSuggestions:G,onRemoveFilter:a?.onRemoveFilter,onClearFilter:a?.onClearFilter,onFilter:a?.onFilter,data:Z??d,tableHeaders:v,showTableViewAsModal:i?.showTableViewAsModal,additionalOptions:i?.additionalOptions,inlineActions:i?.inlineActions,showFilters:i?.showFilters,showSorts:i?.showSorts,showSearch:i?.showSearch,isLoading:!!i?.isLoading,setTableHeaders:ke,allowAStarSearch:!!T?.allowAStarSearch,withContent:!!i?.content,setShowFilters:je,sort:f?.columnSort,onSort:f?.onSort,onRemoveSort:ge,showExportButton:i?.showExportButton,onExportClick:i?.onExportClick,agreementId:X,enumSuggestionsExtraParams:Y}):null,[_,T?.search,T?.handleSearch,fe,Ce,a?.columnFilters,R,W,p,i,J,a?.onRemoveFilter,a?.onClearFilter,a?.onFilter,d,Z,v,f?.columnSort,f?.onSort,ge,c,T?.allowAStarSearch,G,X,Y]);return l.useEffect(()=>{pe&&pe(Ve)},[Ve,pe]),s.jsxs(Ds.TableContext.Provider,{value:{tableWrapper:ps,tableBodyWrapper:Fs,lastNonStickyColumnIndex:xs,search:T?.search,columnFilters:a?.columnFilters,onRowClick:Ct,onSort:f?.onSort,onFilter:a?.onFilter,toggleShowFilters:fe,toggleShowSorts:Ce,onRemoveFilter:a?.onRemoveFilter,onClearFilter:a?.onClearFilter,rowOptions:M,checkboxConfig:Le,onResetFilter:a?.onResetFilter,isColumnConfigurable:K,onAddColumnClick:ee,onEditColumnClick:ze,onDeleteColumnClick:Ue,onRowTooltipClick:qt,tooltiptext:Wt,cascadingTableConfig:Ht,activeInlineEdit:gl,setActiveInlineEdit:V,originalsOnly:$t,disableOptionsForRowIndex:zt,getFullRowDataOnClick:Ut,selectedRowId:Jt,getSumOfNextVisibleColumnWidth:vs,onRowEdit:D,inlineEditColumns:Gt,tableActions:Pe,dndSortableUtils:se,withSortable:Se,withDraggable:Yt,onCascadingRowExpand:Kt,getInnerRowData:el,tableHeaders:v,maxLevel:tl,expandedRows:ll,setExpandedRows:sl,showNewItem:rl,rawData:Xe,dragConfig:nl,rowWrapper:cl,rowLinkConfig:Ye,isCellClickDisabled:il,asyncRowOptionsFilter:a?.asyncRowOptionsFilter,handleUpdateColumnWidth:Ss,multiSelectConfig:dl,cellContextMenuConfig:Ze,openCellContextMenu:Yl,closeCellContextMenu:Tt,headerContextOptions:hl,showHeaderContextOptions:ml,setShowHeaderContextOptions:fl,headerDivWidth:j,showDataTypeIcon:xl,rowAdditionalActions:re,hoverConfig:gt,rowAdditionalActionsWidth:Fe,cellEditing:vl,cellEditingValue:Sl,openMasterDataModal:Ul,closeMasterDataModal:de,selectedMasterData:Cl,clearSelectedMasterData:Gl,allowInlineEdit:wl,openCurrencyDropdown:Xl,closeCurrencyDropdown:Ft,currencyDropdownConfig:ut,selectedCurrenciesMap:Ae,setCurrencyForCell:Zl,getCurrencyForCell:Ql,pendingEdits:h,addPendingEdit:Ie,removePendingEdit:Bl,getPendingEdit:Pl,hasPendingEdit:ql,clearAllPendingEdits:bt,saveAllPendingEdits:pt,clearRowPendingEdits:Wl,saveRowPendingEdits:Hl,pendingEditsCount:P,scrollToCell:B,onFieldOperationFlow:bl,fieldOperationLoading:g,validateAllPendingEdits:z},children:[ve?s.jsxs("div",{ref:De,className:`mb-2 flex w-full min-w-0 gap-2 justify-end dark:bg-black-800 ${j<m.TOOLBAR_FIRST_BREAKPOINT?"flex-col items-stretch":"flex-row flex-wrap items-center"}`,children:[s.jsxs("div",{className:`flex items-center gap-x-2 gap-y-1 ${j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full flex-wrap":""} ${i?.content?"min-w-0 flex-1":"shrink-0"}`,children:[i?.content?s.jsx("div",{className:`min-w-0 ${j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full":"flex-1"}`,children:i.content}):null,we?s.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[s.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-neutral-500 dark:text-neutral-400 flex-shrink-0","aria-hidden":!0,children:[s.jsx("ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}),s.jsx("path",{d:"M3 5v4c0 1.66 4.03 3 9 3s9-1.34 9-3V5"}),s.jsx("path",{d:"M3 9v4c0 1.66 4.03 3 9 3s9-1.34 9-3V9"}),s.jsx("path",{d:"M3 13v4c0 1.66 4.03 3 9 3s9-1.34 9-3v-4"})]}),s.jsx(xe.Typography,{size:"small",variant:"semibold",appearance:"title",children:(Ge??d.length).toLocaleString()}),s.jsx(xe.Typography,{size:"small",variant:"regular",appearance:"subtitle",children:"total records"})]}):i?.preContent?s.jsx("div",{className:"flex min-w-0 shrink-0 justify-start items-center",children:i.preContent}):null]}),s.jsxs("div",{className:`flex min-w-0 items-center justify-end ${j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full":i?.content?"shrink-0":"flex-1"} ${j<m.TOOLBAR_SECOND_BREAKPOINT?"flex-col":"flex-row flex-wrap"} ${i?.postContent?"gap-2":""}`,children:[we&&i?.preContent?s.jsx("div",{className:"flex w-full justify-start items-center",children:i.preContent}):null,s.jsx("div",{className:`flex justify-end items-center min-w-0 ${j<m.TOOLBAR_SECOND_BREAKPOINT||j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full":""}`,children:Ve}),i?.postContent?s.jsx("div",{className:`flex justify-end items-center ${j<m.TOOLBAR_SECOND_BREAKPOINT?"w-full":""}`,children:i.postContent}):null]})]}):null,i?.showDivider?s.jsx("div",{className:"border-b pb-2 w-full dark:bg-black-800"}):null,Vt&&(Re||Oe)?s.jsx("div",{className:"flex justify-between items-center pb-4 dark:bg-black-800",children:s.jsxs("div",{className:"flex gap-2 items-center",children:[Oe&&c?.renderSortItem?c.renderSortItem({sort:f?.columnSort,onRemoveSort:ge,onSort:f?.onSort,tableHeaders:v,data:d}):null,Re&&Oe&&f?.columnSort?.field!==""?s.jsx("div",{className:"h-8 w-[1px] flex-shrink-0 bg-neutral-200"}):null,Re?s.jsxs("div",{className:"flex gap-2 items-center",children:[(Ke||a?.onResetFilter)&&c?.renderActiveFilters&&c.renderActiveFilters({filters:a?.columnFilters,onRemoveFilter:ws,onClearFilter:bs,onResetFilter:a?.onResetFilter,onFilter:a?.onFilter,tableHeaders:v,columnFilters:a?.columnFilters,modelName:J,enableMasterDataEnumSuggestions:G,noSpacing:!0,notionStyle:a?.notionStyle,context:a?.context,data:Z??d,agreementId:X,enumSuggestionsExtraParams:Y}),c?.renderFilterButtons&&c.renderFilterButtons({onClearFilter:a?.onClearFilter,onClose:fs,modelName:J,enableMasterDataEnumSuggestions:G,defaultFilterColumn:yl,resetDefaultFilterColumn:()=>lt(null),column:Ol,onFilter:a?.onFilter,tableHeaders:v,columnFilters:a?.columnFilters,data:Z??d,notionStyle:a?.notionStyle,context:a?.context,agreementId:X,enumSuggestionsExtraParams:Y})]}):null]})}):null,be&&Object.keys(be).length?s.jsx(Rs.FloatingBar,{...be}):null,!ve&&we?s.jsxs("div",{className:"flex items-center gap-1.5 mb-2",children:[s.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-neutral-500 dark:text-neutral-400 flex-shrink-0","aria-hidden":!0,children:[s.jsx("ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}),s.jsx("path",{d:"M3 5v4c0 1.66 4.03 3 9 3s9-1.34 9-3V5"}),s.jsx("path",{d:"M3 9v4c0 1.66 4.03 3 9 3s9-1.34 9-3V9"}),s.jsx("path",{d:"M3 13v4c0 1.66 4.03 3 9 3s9-1.34 9-3v-4"})]}),s.jsx(xe.Typography,{size:"small",variant:"semibold",appearance:"title",children:(Ge??d.length).toLocaleString()}),s.jsx(xe.Typography,{size:"small",variant:"regular",appearance:"subtitle",children:"total records"})]}):!ve&&i?.preContent?s.jsx("div",{className:"flex items-center mb-2",children:i.preContent}):null,s.jsx("div",{ref:Ne,className:`w-full ${le?"h-auto":te} rounded-lg relative border overflow-x-hidden`,style:{...le?{height:d?.length>0?`${(d?.length+1)*pl+4}px`:"350px"}:{height:Kl},...ol},children:Zt?Dt:s.jsxs(E.DndContext,{sensors:os,onDragEnd:ds,onDragStart:us,onDragCancel:hs,collisionDetection:E.closestCorners,children:[Dt,H?Os.createPortal(s.jsx(E.DragOverlay,{adjustScale:!0,dropAnimation:cs,children:s.jsx("table",{...Rt(),className:"w-full text-sm text-left text-neutral-500 dark:text-neutral-200 bg-white dark:bg-black-700 table-auto border-collapse",children:s.jsxs("tbody",{...jt(),className:"bg-transparent divide-y divide-neutral-200",children:[void Ot(H),s.jsx(Es.Row,{row:H,index:N?.findIndex(e=>e.id===H.original.id)},H.original.id)]})})}),document.getElementById("full-screen-container")||document.body):null]})}),le&&c?.renderPagination?c.renderPagination(le):null,c?.renderMasterDataModal&&c.renderMasterDataModal({isVisible:!!O,onSelected:Jl,onClose:de,masterDataColumnName:O?.masterDataColumnName,masterDataFormula:O?.masterDataFormula,masterDataFilters:O?.masterDataFilters,masterDataName:O?.masterDataName,masterDataId:O?.masterDataName,showFilters:!0}),s.jsx(As.CurrencyDropdownPortal,{config:ut,onClose:Ft}),s.jsx(Ns.CellContextMenuPortal,{state:Vl,config:Ze,rowOptions:M,asyncRowOptionsFilter:a?.asyncRowOptionsFilter,checkedIds:Le?.checkedIds,rows:d,columns:v,rowLinkConfig:Ye,onClose:Tt}),s.jsx(Ms.PendingEditsFloatingBar,{pendingEditsCount:P,pendingEditsList:$l,rowsWithPendingEdits:zl,fieldOperationLoading:g,onClearAll:bt,onSaveAll:pt,onScrollToCell:B})]})});exports.InfiniteTable=Bs;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),Ts=require("../../../hooks/useCheckbox.cjs.js"),ys=require("../../../providers/design-system-provider/hooks.cjs.js"),Be=require("../../../utils/table.cjs.js"),At=require("../../button/Button.cjs.js"),Rs=require("../../floating-bar/FloatingBar.cjs.js"),xe=require("../typography/Typography.cjs.js"),E=require("@dnd-kit/core"),l=require("react"),js=require("react-virtualized-auto-sizer"),Os=require("react-dom"),_t=require("react-table"),ks=require("./body/index.cjs.js"),Mt=require("./validateCell.cjs.js"),Es=require("./body/rows/row.cjs.js"),Ds=require("./context.cjs.js"),Ns=require("./CellContextMenuPortal.cjs.js"),As=require("./CurrencyDropdownPortal.cjs.js"),_s=require("./head/index.cjs.js"),Ms=require("./PendingEditsFloatingBar.cjs.js"),m=require("./constants.cjs.js"),It=require("./useRowHeight.cjs.js"),Is=require("../empty-state/NoDataFoundWidgets.cjs.js"),Ls=require("../empty-state/NoDataFound.cjs.js"),gs=require("../../icon/icons.generated.cjs.js"),Cs=js.AutoSizer,Lt="Create Column",Vs=(_,T)=>`button-admin-${_.toLowerCase().trim().replace(/\s+/g,"-").replace(/[^a-z0-9-_]/g,"")||T}`,Bs=l.memo(({tableKey:_,searchConfig:T={search:"",handleSearch:()=>null,allowAStarSearch:!1},filterConfig:a={columnFilters:[],onFilter:()=>null,onRemoveFilter:()=>null,onClearFilter:()=>null,onResetFilter:()=>Promise.resolve({}),asyncRowOptionsFilter:()=>Promise.resolve({})},sortConfig:f={onSort:()=>null,columnSort:{field:"",order:""},onRemoveSort:()=>null},headerConfig:i={showExportButton:null,showFilters:!0,showSorts:!0,showSearch:!0,showTableView:!0,showTableViewAsModal:!1,content:null,postContent:null,preContent:null,isLoading:!1,showDivider:!1},hoverConfig:gt=null,columns:R,modelName:J,enableMasterDataEnumSuggestions:G=!1,agreementId:X,enumSuggestionsExtraParams:Y,enumSuggestionsData:Z,data:d=[],onRowClick:Ct,showHeader:ve,showSubHeader:Vt=!0,tableActions:Pe,rowOptions:M,hideRowOptionWidth:qe,checkboxUtilities:I,isLoading:Q=!1,onScroll:Bt,onScrolling:Pt,isColumnConfigurable:K,onAddColumnClick:ee,emptyMessage:We,noDataWidget:He,buttons:$e,onEditColumnClick:ze,onDeleteColumnClick:Ue,onRowTooltipClick:qt,tooltiptext:Wt,cascadingTableConfig:Ht,originalsOnly:$t,disableOptionsForRowIndex:zt,tableHeightClass:te="h-[calc(100vh-220px)]",getFullRowDataOnClick:Ut,selectedRowId:Jt=null,onRowEdit:D,onBulkRowEdit:L,inlineEditColumns:Gt,isResizable:Xt=!0,paginationConfig:le,dndSortableUtils:se,multipleContexts:Je,withSortable:Se,withDraggable:Yt,enableRootDrag:Zt,pageSize:Qt=m.DEFAULT_PAGE_SIZE,onCascadingRowExpand:Kt,totalItems:Ge,showRecordCount:we=!1,getInnerRowData:el,maxLevel:tl,expandedRows:ll={},setExpandedRows:sl,showNewItem:rl,rawData:Xe,dragConfig:nl,isOverlayLoading:al,style:ol={},floatingBarConfig:be,rowWrapper:cl,rowLinkConfig:Ye,isCellClickDisabled:il,setHeaderOnParent:pe,optimizeTable:ul=!1,multiSelectConfig:dl,cellContextMenuConfig:Ze,headerContextOptions:hl,showHeaderContextOptions:ml,setShowHeaderContextOptions:fl,showDataTypeIcon:xl=!1,rowAdditionalActions:re,rowAdditionalActionsWidth:Fe,setVisibleHeaders:Te,cellEditing:vl=null,cellEditingValue:Sl=null,allowInlineEdit:wl=!1,onFieldOperationFlow:bl,fieldOperationLoading:g=null,onTableActionsReady:ye,onPendingEditsChange:Qe,onCancelPendingEdits:C})=>{const c=ys.useTableConfig(),pl=It.getRowSlotHeight(It.useRowHeight()),Fl=!!T?.search,Ke=a?.columnFilters?.length>0,q=Fl||Ke,Tl=!!I,y=c?.getTableView?.(_)??null,[p,W]=l.useState(y||null),et=Be.isModifiedGlobalView(p,c?.getUserId?.()),[Re,je]=l.useState(!1),[Oe,tt]=l.useState(!1),[yl,lt]=l.useState(null),[v,ke]=l.useState(R),st=(d.length===0||!v.length)&&!Q,[rt,ne]=l.useState(null),[Rl,jl]=l.useState(!1),[Ol,kl]=l.useState(null),[El,Dl]=l.useState(!1),[Nl,ae]=l.useState(null),[Al,oe]=l.useState(null),[_l,nt]=l.useState({}),[H,Ee]=l.useState(null),[Ml,at]=l.useState(!1),[j,Il]=l.useState(0),De=l.useRef(null),Ne=l.useRef(null),[ot,Ll]=l.useState({width:0,height:0}),[gl,V]=l.useState(null),[O,ct]=l.useState(null),[Cl,it]=l.useState(null),[ut,dt]=l.useState(null),[Vl,ht]=l.useState(null),[Ae,$]=l.useState({}),_e=l.useRef(!1),ce=l.useRef(!1),Me=l.useRef(p);Me.current=p;const mt=l.useRef(c);mt.current=c;const ft=l.useRef(R);ft.current=R;const ie=l.useRef(a);ie.current=a;const xt=l.useRef(null),vt=l.useRef(()=>({})),St=l.useRef(()=>({})),[h,k]=l.useState({}),Ie=l.useCallback((e,t,r)=>{k(n=>{const o=n[e]?.[t];let u=r.validationError;if(u===void 0){const w=v.find(x=>x.key===t);if(w){const x=Mt.validateCellValue(r.value,w);u=x.isValid?null:x.error||"Invalid"}else u=o?.validationError??null}return{...n,[e]:{...n[e]||{},[t]:{...r,validationError:u??null}}}})},[v]),wt=l.useCallback(()=>Object.values(h).some(e=>Object.keys(e).length>0),[h]);l.useEffect(()=>{ye&&ye({addPendingEdit:Ie,hasPendingEdits:wt})},[ye,Ie,wt]);const Bl=l.useCallback((e,t)=>{k(r=>{const n={...r};if(n[e]){const{[t]:o,...u}=n[e];Object.keys(u).length===0?delete n[e]:n[e]=u}return n})},[]),Pl=l.useCallback((e,t)=>h[e]?.[t],[h]),ql=l.useCallback((e,t)=>!!h[e]?.[t],[h]),bt=l.useCallback(()=>{g||(C&&Object.keys(h).length>0&&C(h),k({}),$({}),V(null))},[g,C,h]),B=l.useCallback((e,t,r)=>{setTimeout(()=>{c?.dispatchEvent?.("SCROLL_TO_TABLE_ROW",{rowIndex:r});const n=v.findIndex(o=>o.key===t);setTimeout(()=>{const o=document.querySelector(`[${m.DATA_ROW_ID_ATTR}="${e}"] [${m.DATA_COLUMN_KEY_ATTR}="${t}"]`);if(o)o.scrollIntoView({behavior:"smooth",block:"center",inline:"center"});else if(n>0){const u=document.querySelector(m.OS_VIEWPORT_SELECTOR);if(u){let w=0;for(let x=0;x<n;x++){const F=v[x];F?.sticky||(w+=F?.width||m.SCROLL_TO_CELL_COLUMN_WIDTH_FALLBACK)}w=Math.max(0,w-m.SCROLL_TO_CELL_LEFT_OFFSET),u.scrollTo({left:w,behavior:"smooth"})}}V({rowId:e,columnKey:t})},350)},100)},[v,c]),z=l.useCallback(e=>{let t=!1,r=null;const n={},o=new Set;return Object.entries(e).forEach(([u,w])=>{n[u]={},Object.entries(w).forEach(([x,F])=>{const A=v.find(b=>b.key===x),S=Mt.validateCellValue(F.value,A);S.isValid?n[u][x]={...F,validationError:null}:(t=!0,S.error&&o.add(S.error),r||(r={rowId:u,columnKey:x}),n[u][x]={...F,validationError:S.error})})}),{hasErrors:t,updatedEdits:n,firstError:r,errorTypes:o}},[v]),ue=l.useCallback(e=>{const t=e.has("Field required"),r=e.size>(t?1:0);return t&&r?"Missing required field(s) and invalid format detected. Please review highlighted field(s).":t?"Missing required field(s). Please review highlighted field(s).":"Invalid field value(s). Please review highlighted field(s)."},[]),pt=l.useCallback(()=>{const{hasErrors:e,updatedEdits:t,firstError:r,errorTypes:n}=z(h);if(e){if(k(t),c?.showNotification?.("error",ue(n)),r){const u=d.findIndex(w=>w.id===r.rowId);B(r.rowId,r.columnKey,u)}return}const o=[];Object.entries(h).forEach(([u,w])=>{const x=d.find(F=>F.id===u);if(x){const F={...x},A={};Object.entries(w).forEach(([S,b])=>{F[S]=b.value,A[S]={value:b.value,meta:b.meta}}),o.push({...F,__editedFields:A})}}),o.length>0&&(L?L(o):D&&D(null,null,null,null,null,{isBulk:!0,rows:o})),k({}),$({}),V(null)},[h,d,D,L,z,ue,B,c]),Wl=l.useCallback(e=>{if(g)return;const t=h[e];t&&C&&C({[e]:t}),k(r=>{const n={...r};return delete n[e],n}),$(r=>{const n={...r};return Object.keys(n).forEach(o=>{o.startsWith(`${e}-`)&&delete n[o]}),n}),V(null)},[g,C,h]),Hl=l.useCallback(e=>{const t=h[e];if(!t||Object.keys(t).length===0)return;const{hasErrors:r,updatedEdits:n,firstError:o,errorTypes:u}=z({[e]:t});if(r){if(k(S=>({...S,[e]:n[e]})),c?.showNotification?.("error",ue(u)),o){const S=d.findIndex(b=>b.id===o.rowId);B(o.rowId,o.columnKey,S)}return}const w=d.find(S=>S.id===e);if(!w)return;const x={...w},F={};Object.entries(t).forEach(([S,b])=>{x[S]=b.value,F[S]={value:b.value,meta:b.meta}});const A={...x,__editedFields:F};L?L([A]):D&&D(null,null,null,null,null,{isBulk:!0,rows:[A]}),k(S=>{const b={...S};return delete b[e],b}),$(S=>{const b={...S};return Object.keys(b).forEach(Nt=>{Nt.startsWith(`${e}-`)&&delete b[Nt]}),b}),V(null)},[h,d,D,L,z,ue,B,c]),P=l.useMemo(()=>Object.values(h).reduce((e,t)=>e+Object.keys(t).length,0),[h]);l.useEffect(()=>{Qe?.(P>0,P)},[P,Qe]);const $l=l.useMemo(()=>{const e=[];return Object.entries(h).forEach(([t,r])=>{const n=d.findIndex(o=>o.id===t);Object.entries(r).forEach(([o,u])=>{const w=v.find(x=>x.key===o);e.push({rowId:t,columnKey:o,fieldName:w?.Header||w?.display_name||o,value:u.value,originalValue:u.originalValue,meta:u.meta,originalMeta:u.originalMeta,rowIndex:n})})}),e},[h,v,d]),zl=l.useMemo(()=>{const e=new Map;return Object.entries(h).forEach(([t,r])=>{const n=d.findIndex(o=>o.id===t);e.set(t,{rowId:t,rowIndex:n,editCount:Object.keys(r).length})}),Array.from(e.values()).sort((t,r)=>t.rowIndex-r.rowIndex)},[h,d]),Ul=l.useCallback(e=>ct(e),[]),de=l.useCallback(()=>ct(null),[]),Jl=l.useCallback((e,t)=>{it({value:e,reference:t}),O?.onSelected&&O.onSelected(e,t),de()},[O,de]),Gl=l.useCallback(()=>it(null),[]),Xl=l.useCallback(e=>dt(e),[]),Ft=l.useCallback(()=>dt(null),[]),Yl=l.useCallback(e=>ht(e),[]),Tt=l.useCallback(()=>ht(null),[]),Zl=l.useCallback((e,t)=>{$(r=>({...r,[e]:t}))},[]),Ql=l.useCallback(e=>Ae[e],[Ae]),Kl=l.useMemo(()=>{const e=te.match(/h-\[(\d+px)\]/);if(e)return e[1];const t=te.match(/h-\[(calc\(.+\))\]/);if(t)return t[1].replace(/([+-])/g," $1 ").replace(/\s+/g," ")},[te]),es={isEmpty:st,isFilters:q,isColumnConfigurable:K,handleOnClick:ee,emptyMessage:We,buttons:$e,noDataWidget:He},ts=c?.t?.(Lt)??Lt,he=q?"No Results Found":We||"No Data Found",ls=typeof he=="string"?c?.t?.(he)??he:he,yt={__isLoading:!0},ss=new Array(1).fill(yt),rs=new Array(Qt).fill(yt),U=l.useMemo(()=>v.filter(e=>!!e?.visible),[v]),ns=_t.useTable({columns:ul?U:v,data:[...d,...Q?d?.length?ss:rs:[]],defaultColumn:{minWidth:m.DEFAULT_COLUMN_MIN_WIDTH,width:m.DEFAULT_COLUMN_WIDTH,maxWidth:m.DEFAULT_COLUMN_MAX_WIDTH}},_t.useResizeColumns),{getTableProps:Rt,getTableBodyProps:jt,headerGroups:me,prepareRow:Ot,rows:N}=ns;xt.current=me;const as=JSON.stringify(me[0]?.headers?.map(e=>e?.Header));l.useEffect(()=>{if(Te){const e=xt.current;Te?.(e?.[0]?.headers?.map(t=>t?.Header)??[])}},[as,Te]);const{checkboxConfig:Le}=Ts.useCheckbox({rows:N,checkedIds:I?.checkedIds,isCheckAllDisabled:I?.isCheckAllDisabled,selectionDisabledRowIds:I?.selectionDisabledRowIds,rawData:Xe,onAllChecked:Dl,setCheckedIds:I?.setCheckedIds,checkboxMetadata:I?.checkboxMetadata}),os=E.useSensors(E.useSensor(E.MouseSensor,{activationConstraint:{distance:m.DND_ACTIVATION_DISTANCE}}),E.useSensor(E.TouchSensor,{activationConstraint:{distance:m.DND_ACTIVATION_DISTANCE}})),cs={easing:m.DROP_ANIMATION_EASING,duration:m.DROP_ANIMATION_DURATION};function is(){return!Je?.length||!Se?N:Je.reduce((e,t)=>(e[t]=N.filter(r=>r.original?.type===t),e),{})}St.current=is;const us=e=>{const{active:t}=e;Ee(N.find(r=>r.original?.id===t?.id)??null)},ds=e=>{const{active:t,over:r}=e;r&&(se?.checkDndDragEnd&&se.checkDndDragEnd(t,r,_l,n=>{nt(n),at(!0),se.onDragSuccess?.({draggedId:t.id,droppedId:r.id,draggedType:t.data.current?.type,droppedType:r.data.current?.type,updatedList:n,cb:()=>at(!1)})}),Ee(null))},hs=()=>Ee(null),ms=e=>{!f?.onSort&&!a?.onFilter||ne(rt===e?null:e)},fs=e=>{kl(e),jl(!Rl),ne(null)},ge=l.useCallback(()=>{f?.onRemoveSort?f.onRemoveSort():f?.onSort&&f.onSort("","")},[f]),fe=l.useCallback((e=null)=>{lt(e),je(t=>e?!0:!t)},[]),Ce=l.useCallback(()=>tt(e=>!e),[]),xs=()=>{const e=me[0]?.headers?.filter(t=>t?.visible!==!1);for(let t=0;t<e.length;t++)if(e[t].sticky)return t-1;return e.length-1},vs=l.useCallback(e=>{let t=0;for(let r=e+1;r<U.length;r++)U[r].visible!==!1&&(t+=U[r].width??0);return re&&(t+=Fe||m.ROW_ADDITIONAL_ACTIONS_DEFAULT_WIDTH),M&&(t+=qe?0:m.ROW_OPTIONS_COLUMN_WIDTH),t},[U,Fe,qe,re,M]),kt=()=>{const e=c?.getUserId?.();return{...p||{},name:p?.name||"Untitled View",created_by:p?.created_by||e,filters:p?.filters||a?.columnFilters,id:p?.id||"untitled-view",table_key:p?.table_key||_,columns:p?.columns||R?.map((t,r)=>({name:t.Header,width:t.width,visible:t.visible,sticky:t.sticky,order:r+1,display_name:t.Header,sequence:r+1,Header:t.Header}))}};vt.current=kt;const Ss=(e,t)=>{const r=kt();W({...r,columns:r?.columns?.map(n=>n.name===e?{...n,width:t}:n),unsaved:!0})};l.useEffect(()=>{a?.columnFilters?.length>0&&je(!0);const e=Me.current;if(JSON.stringify(e?.filters||[])!==JSON.stringify(a?.columnFilters||[])){const t=(e?.filters?.length??0)>0,r=a?.columnFilters?.length>0;if(!(t&&!r&&!ce.current)){const o=vt.current();W({...o,filters:JSON.parse(JSON.stringify(a?.columnFilters||[])),unsaved:!0})}ce.current=!1}},[a?.columnFilters]);const ws=l.useCallback(e=>{ce.current=!0,a?.onRemoveFilter?.(e)},[a?.onRemoveFilter]),bs=l.useCallback(()=>{ce.current=!0,a?.onClearFilter?.()},[a?.onClearFilter]);l.useEffect(()=>{f?.columnSort?.field?(tt(!0),f.columnSort.order==="asc"?(ae(f.columnSort.field),oe(null)):f.columnSort.order==="desc"&&(oe(f.columnSort.field),ae(null))):(ae(null),oe(null))},[f?.columnSort?.field,f?.columnSort?.order]),l.useEffect(()=>{ke(Be.mergeViewColumnsWithTableColumns(Me.current?.columns||[],R))},[R]),l.useEffect(()=>{p?.unsaved&&!et&&mt.current?.persistTableView?.(p)},[p]),l.useEffect(()=>{nt(St.current())},[N.length]),l.useEffect(()=>{et||(W(y||null),y?.columns&&ke(Be.mergeViewColumnsWithTableColumns(y?.columns||[],ft.current)),y?.filters&&y.filters.length>0&&!_e.current?(requestAnimationFrame(()=>{ie.current?.onFilter?.(y.filters)}),_e.current=!0):y?.filters&&_e.current&&JSON.stringify(y.filters)!==JSON.stringify(ie.current?.columnFilters)&&ie.current?.onFilter?.(y.filters))},[y]),l.useEffect(()=>{if(De.current){const e=new ResizeObserver(t=>Il(t[0].contentRect.width));return e.observe(De.current),()=>e.disconnect()}},[]),l.useEffect(()=>{if(!Ne.current)return;const e=new ResizeObserver(t=>{const{width:r,height:n}=t[0].contentRect;Ll({width:r,height:n})});return e.observe(Ne.current),()=>e.disconnect()},[]);const Et=s.jsx(_s.Head,{isResizable:Xt,headerGroups:me,isCheckbox:Tl,checkboxConfig:Le,isAllChecked:El,showHeaderOptions:rt??"",setShowHeaderOptions:ne,isShowSortArrowAsc:Nl,isShowSortArrowDesc:Al,onSort:f?.onSort,onFilter:a?.onFilter,toggleHeaderOption:ms,setIsShowSortArrowAsc:ae,setIsShowSortArrowDesc:oe,toggleDataFilterModal:fe,rowOptions:Array.isArray(M)?M:[],isColumnConfigurable:K??!1,onAddColumnClick:ee,onEditColumnClick:ze,onDeleteColumnClick:Ue,tableActions:Pe||null,isLoading:Q,rowAdditionalActions:re??null,showPendingEditsColumn:P>0}),Dt=s.jsxs(s.Fragment,{children:[Ml||al?s.jsx("div",{className:"absolute left-0 top-0 w-full h-full z-40 flex items-center justify-center bg-neutral-100 dark:bg-black-700"}):null,s.jsx("div",{...Rt(),className:"w-full text-sm text-left text-neutral-500 dark:text-neutral-200 h-full bg-white dark:bg-black-800",children:st?s.jsxs("div",{className:"z-10",children:[Et,s.jsx("div",{className:"absolute w-full",children:c?.renderEmpty?c.renderEmpty(es):s.jsxs("div",{className:"flex flex-col items-center justify-center w-full h-[12rem] text-neutral-900 dark:text-neutral-200 mt-8",children:[He&&!q?s.jsx(Is.NoDataFoundWidgets,{widgetType:"TABLE"}):s.jsx(Ls.NoDataFound,{text:ls}),K&&!q?s.jsx("div",{className:"my-4",children:s.jsxs(At,{id:"btn-table-shell-create-column",status:"primary",appearance:"ghost",onClick:ee,children:[s.jsx(gs.Add2Icon,{className:"text-white dark:text-white"})," ",ts]})}):null,!q&&$e?.map((e,t)=>s.jsx(At,{status:"secondary",id:Vs(e.label,t),onClick:e.onClick,children:c?.t?.(e.label)??e.label},`${e.label}-${t}`))]})})]}):s.jsx(Cs,{style:{width:"100%",height:"100%"},renderProp:({width:e,height:t})=>{const r=e>0?e:ot.width,n=t>0?t:ot.height;return r>0&&n>0?s.jsx(ks.Body,{getTableBodyProps:jt,rows:N,prepareRow:Ot,isLoading:Q,onScroll:Bt,onScrolling:Pt,columns:R,width:r,height:n,withSortable:Se,allowAstarSearch:T?.allowAStarSearch||!1}):null}})})]}),ps=l.forwardRef((e,t)=>s.jsxs("div",{className:"h-full w-full",...e,ref:t,children:[Et,s.jsx("div",{className:"relative w-full h-full",children:e?.children})]})),Fs=l.forwardRef((e,t)=>s.jsx("div",{className:"h-full w-full",...e,ref:t,children:s.jsx("div",{className:"relative w-full h-full",children:e?.children})})),Ve=l.useMemo(()=>c?.renderTableHeader?c.renderTableHeader({tableKey:_,search:T?.search,handleSearch:T?.handleSearch,toggleShowFilters:fe,toggleShowSorts:Ce,filterCounts:a?.columnFilters?.length,columns:R,columnFilters:a?.columnFilters,setSelectedTableView:W,selectedTableView:p,onTableViewSelect:i?.onTableViewSelect,enableTableView:i?.showTableView,modelName:J,enableMasterDataEnumSuggestions:G,onRemoveFilter:a?.onRemoveFilter,onClearFilter:a?.onClearFilter,onFilter:a?.onFilter,data:Z??d,tableHeaders:v,showTableViewAsModal:i?.showTableViewAsModal,additionalOptions:i?.additionalOptions,inlineActions:i?.inlineActions,showFilters:i?.showFilters,showSorts:i?.showSorts,showSearch:i?.showSearch,isLoading:!!i?.isLoading,setTableHeaders:ke,allowAStarSearch:!!T?.allowAStarSearch,withContent:!!i?.content,setShowFilters:je,sort:f?.columnSort,onSort:f?.onSort,onRemoveSort:ge,showExportButton:i?.showExportButton,onExportClick:i?.onExportClick,agreementId:X,enumSuggestionsExtraParams:Y}):null,[_,T?.search,T?.handleSearch,fe,Ce,a?.columnFilters,R,W,p,i,J,a?.onRemoveFilter,a?.onClearFilter,a?.onFilter,d,Z,v,f?.columnSort,f?.onSort,ge,c,T?.allowAStarSearch,G,X,Y]);return l.useEffect(()=>{pe&&pe(Ve)},[Ve,pe]),s.jsxs(Ds.TableContext.Provider,{value:{tableWrapper:ps,tableBodyWrapper:Fs,lastNonStickyColumnIndex:xs,search:T?.search,columnFilters:a?.columnFilters,onRowClick:Ct,onSort:f?.onSort,onFilter:a?.onFilter,toggleShowFilters:fe,toggleShowSorts:Ce,onRemoveFilter:a?.onRemoveFilter,onClearFilter:a?.onClearFilter,rowOptions:M,checkboxConfig:Le,onResetFilter:a?.onResetFilter,isColumnConfigurable:K,onAddColumnClick:ee,onEditColumnClick:ze,onDeleteColumnClick:Ue,onRowTooltipClick:qt,tooltiptext:Wt,cascadingTableConfig:Ht,activeInlineEdit:gl,setActiveInlineEdit:V,originalsOnly:$t,disableOptionsForRowIndex:zt,getFullRowDataOnClick:Ut,selectedRowId:Jt,getSumOfNextVisibleColumnWidth:vs,onRowEdit:D,inlineEditColumns:Gt,tableActions:Pe,dndSortableUtils:se,withSortable:Se,withDraggable:Yt,onCascadingRowExpand:Kt,getInnerRowData:el,tableHeaders:v,maxLevel:tl,expandedRows:ll,setExpandedRows:sl,showNewItem:rl,rawData:Xe,dragConfig:nl,rowWrapper:cl,rowLinkConfig:Ye,isCellClickDisabled:il,asyncRowOptionsFilter:a?.asyncRowOptionsFilter,handleUpdateColumnWidth:Ss,multiSelectConfig:dl,cellContextMenuConfig:Ze,openCellContextMenu:Yl,closeCellContextMenu:Tt,headerContextOptions:hl,showHeaderContextOptions:ml,setShowHeaderContextOptions:fl,headerDivWidth:j,showDataTypeIcon:xl,rowAdditionalActions:re,hoverConfig:gt,rowAdditionalActionsWidth:Fe,cellEditing:vl,cellEditingValue:Sl,openMasterDataModal:Ul,closeMasterDataModal:de,selectedMasterData:Cl,clearSelectedMasterData:Gl,allowInlineEdit:wl,openCurrencyDropdown:Xl,closeCurrencyDropdown:Ft,currencyDropdownConfig:ut,selectedCurrenciesMap:Ae,setCurrencyForCell:Zl,getCurrencyForCell:Ql,pendingEdits:h,addPendingEdit:Ie,removePendingEdit:Bl,getPendingEdit:Pl,hasPendingEdit:ql,clearAllPendingEdits:bt,saveAllPendingEdits:pt,clearRowPendingEdits:Wl,saveRowPendingEdits:Hl,pendingEditsCount:P,scrollToCell:B,onFieldOperationFlow:bl,fieldOperationLoading:g,validateAllPendingEdits:z},children:[ve?s.jsxs("div",{ref:De,className:`mb-2 flex w-full min-w-0 gap-2 justify-end dark:bg-black-800 ${j<m.TOOLBAR_FIRST_BREAKPOINT?"flex-col items-stretch":"flex-row flex-wrap items-center"}`,children:[s.jsxs("div",{className:`flex items-center gap-x-2 gap-y-1 ${j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full flex-wrap":""} ${i?.content?"min-w-0 flex-1":"shrink-0"}`,children:[i?.content?s.jsx("div",{className:`min-w-0 ${j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full":"flex-1"}`,children:i.content}):null,we?s.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[s.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-neutral-500 dark:text-neutral-400 flex-shrink-0","aria-hidden":!0,children:[s.jsx("ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}),s.jsx("path",{d:"M3 5v4c0 1.66 4.03 3 9 3s9-1.34 9-3V5"}),s.jsx("path",{d:"M3 9v4c0 1.66 4.03 3 9 3s9-1.34 9-3V9"}),s.jsx("path",{d:"M3 13v4c0 1.66 4.03 3 9 3s9-1.34 9-3v-4"})]}),s.jsx(xe.Typography,{size:"small",variant:"semibold",appearance:"title",children:(Ge??d.length).toLocaleString()}),s.jsx(xe.Typography,{size:"small",variant:"regular",appearance:"subtitle",children:"total records"})]}):i?.preContent?s.jsx("div",{className:"flex min-w-0 shrink-0 justify-start items-center",children:i.preContent}):null]}),s.jsxs("div",{className:`flex min-w-0 items-center justify-end ${j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full":i?.content?"shrink-0":"flex-1"} ${j<m.TOOLBAR_SECOND_BREAKPOINT?"flex-col":"flex-row flex-wrap"} ${i?.postContent?"gap-2":""}`,children:[we&&i?.preContent?s.jsx("div",{className:"flex w-full justify-start items-center",children:i.preContent}):null,s.jsx("div",{className:`flex justify-end items-center min-w-0 ${j<m.TOOLBAR_SECOND_BREAKPOINT||j<m.TOOLBAR_FIRST_BREAKPOINT?"w-full":""}`,children:Ve}),i?.postContent?s.jsx("div",{className:`flex justify-end items-center ${j<m.TOOLBAR_SECOND_BREAKPOINT?"w-full":""}`,children:i.postContent}):null]})]}):null,i?.showDivider?s.jsx("div",{className:"border-b pb-2 w-full dark:bg-black-800"}):null,Vt&&(Re||Oe)?s.jsx("div",{className:"flex justify-between items-center pb-4 dark:bg-black-800",children:s.jsxs("div",{className:"flex gap-2 items-center",children:[Oe&&c?.renderSortItem?c.renderSortItem({sort:f?.columnSort,onRemoveSort:ge,onSort:f?.onSort,tableHeaders:v,data:d}):null,Re&&Oe&&f?.columnSort?.field!==""?s.jsx("div",{className:"h-8 w-[1px] flex-shrink-0 bg-neutral-200"}):null,Re?s.jsxs("div",{className:"flex gap-2 items-center",children:[(Ke||a?.onResetFilter)&&c?.renderActiveFilters&&c.renderActiveFilters({filters:a?.columnFilters,onRemoveFilter:ws,onClearFilter:bs,onResetFilter:a?.onResetFilter,onFilter:a?.onFilter,tableHeaders:v,columnFilters:a?.columnFilters,modelName:J,enableMasterDataEnumSuggestions:G,noSpacing:!0,notionStyle:a?.notionStyle,context:a?.context,data:Z??d,agreementId:X,enumSuggestionsExtraParams:Y}),c?.renderFilterButtons&&c.renderFilterButtons({onClearFilter:a?.onClearFilter,onClose:fs,modelName:J,enableMasterDataEnumSuggestions:G,defaultFilterColumn:yl,resetDefaultFilterColumn:()=>lt(null),column:Ol,onFilter:a?.onFilter,tableHeaders:v,columnFilters:a?.columnFilters,data:Z??d,notionStyle:a?.notionStyle,context:a?.context,agreementId:X,enumSuggestionsExtraParams:Y})]}):null]})}):null,be&&Object.keys(be).length?s.jsx(Rs.FloatingBar,{...be}):null,!ve&&we?s.jsxs("div",{className:"flex items-center gap-1.5 mb-2",children:[s.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-neutral-500 dark:text-neutral-400 flex-shrink-0","aria-hidden":!0,children:[s.jsx("ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}),s.jsx("path",{d:"M3 5v4c0 1.66 4.03 3 9 3s9-1.34 9-3V5"}),s.jsx("path",{d:"M3 9v4c0 1.66 4.03 3 9 3s9-1.34 9-3V9"}),s.jsx("path",{d:"M3 13v4c0 1.66 4.03 3 9 3s9-1.34 9-3v-4"})]}),s.jsx(xe.Typography,{size:"small",variant:"semibold",appearance:"title",children:(Ge??d.length).toLocaleString()}),s.jsx(xe.Typography,{size:"small",variant:"regular",appearance:"subtitle",children:"total records"})]}):!ve&&i?.preContent?s.jsx("div",{className:"flex items-center mb-2",children:i.preContent}):null,s.jsx("div",{ref:Ne,className:`w-full ${le?"h-auto":te} rounded-lg relative border overflow-x-hidden`,style:{...le?{height:d?.length>0?`${(d?.length+1)*pl+4}px`:"350px"}:{height:Kl},...ol},children:Zt?Dt:s.jsxs(E.DndContext,{sensors:os,onDragEnd:ds,onDragStart:us,onDragCancel:hs,collisionDetection:E.closestCorners,children:[Dt,H?Os.createPortal(s.jsx(E.DragOverlay,{adjustScale:!0,dropAnimation:cs,children:s.jsx("table",{...Rt(),className:"w-full text-sm text-left text-neutral-500 dark:text-neutral-200 bg-white dark:bg-black-700 table-auto border-collapse",children:s.jsxs("tbody",{...jt(),className:"bg-transparent divide-y divide-neutral-200",children:[void Ot(H),s.jsx(Es.Row,{row:H,index:N?.findIndex(e=>e.id===H.original.id)},H.original.id)]})})}),document.getElementById("full-screen-container")||document.body):null]})}),le&&c?.renderPagination?c.renderPagination(le):null,c?.renderMasterDataModal&&c.renderMasterDataModal({isVisible:!!O,onSelected:Jl,onClose:de,masterDataColumnName:O?.masterDataColumnName,masterDataFormula:O?.masterDataFormula,masterDataFilters:O?.masterDataFilters,masterDataName:O?.masterDataName,masterDataId:O?.masterDataName,showFilters:!0}),s.jsx(As.CurrencyDropdownPortal,{config:ut,onClose:Ft}),s.jsx(Ns.CellContextMenuPortal,{state:Vl,config:Ze,rowOptions:M,asyncRowOptionsFilter:a?.asyncRowOptionsFilter,checkedIds:Le?.checkedIds,rows:d,columns:v,rowLinkConfig:Ye,onClose:Tt}),s.jsx(Ms.PendingEditsFloatingBar,{pendingEditsCount:P,pendingEditsList:$l,rowsWithPendingEdits:zl,fieldOperationLoading:g,onClearAll:bt,onSaveAll:pt,onScrollToCell:B})]})});exports.InfiniteTable=Bs;
2
2
  //# sourceMappingURL=index.cjs.js.map