@lax-wp/design-system 0.14.37 → 0.14.38
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/components/data-display/infinite-table/CellContextMenuPortal.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.es.js +75 -75
- package/dist/components/data-display/infinite-table/CellContextMenuPortal.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js +32 -33
- package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/copy-text.cjs.js +1 -2
- package/dist/components/data-display/infinite-table/copy-text.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/copy-text.d.ts +5 -5
- package/dist/components/data-display/infinite-table/copy-text.es.js +52 -15
- package/dist/components/data-display/infinite-table/copy-text.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/types.d.ts +2 -4
- package/package.json +1 -1
|
@@ -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 } from '../../icon';\nimport type {\n ICellContextMenuConfig,\n ICellContextMenuContext,\n ICellContextMenuItem,\n ICellContextMenuState,\n IColumn,\n} from './types';\nimport { getSelectedRowsText } 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 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\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, 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): 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 <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 selectedRowsText = useMemo(() => getSelectedRowsText(rows, columns, checkedIds), [rows, columns, checkedIds]);\n const selectedCount = checkedIds?.length ?? 0;\n\n const items = useMemo<ICellContextMenuItem[]>(() => {\n if (!context) return [];\n\n const defaultItems: ICellContextMenuItem[] = config?.hideDefaultItems\n ? []\n : [\n buildCopyItem('copy-content', config?.copyLabel ?? t('Copy content'), context.text),\n buildCopyItem('copy-row', t('Copy row'), context.rowText),\n ...(selectedCount > 0\n ? [\n buildCopyItem(\n 'copy-selected-rows',\n selectedCount === 1 ? t('Copy selected row') : `${t('Copy selected rows')} (${selectedCount})`,\n selectedRowsText,\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, selectedRowsText, 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","resolveFlag","flag","context","fallback","MenuItemButton","item","isDisabled","isActive","onSelect","onHover","jsxs","cn","jsx","CellContextMenuPortal","state","config","rowOptions","asyncRowOptionsFilter","checkedIds","rows","columns","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","isDone","CheckIcon","ContentCopyIcon","selectedRowsText","getSelectedRowsText","selectedCount","items","defaultItems","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 } from '../../icon';\nimport type {\n ICellContextMenuConfig,\n ICellContextMenuContext,\n ICellContextMenuItem,\n ICellContextMenuState,\n IColumn,\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 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\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, 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): 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 <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 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 ];\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, 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","resolveFlag","flag","context","fallback","MenuItemButton","item","isDisabled","isActive","onSelect","onHover","jsxs","cn","jsx","CellContextMenuPortal","state","config","rowOptions","asyncRowOptionsFilter","checkedIds","rows","columns","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","isDone","CheckIcon","ContentCopyIcon","rowJson","getRowJson","selectedRowsJson","getSelectedRowsJson","selectedCount","items","defaultItems","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":";;;;;;;;AAqDA,MAAMA,KAAmB,OAAOC,MAAmC;AACjE,MAAI;AACF,QAAI,WAAW,WAAW;AACxB,mBAAM,UAAU,UAAU,UAAUA,CAAI,GACjC;AAAA,EAEX,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,UAAMC,IAAW,SAAS,cAAc,UAAU;AAClD,IAAAA,EAAS,QAAQD,GACjBC,EAAS,aAAa,YAAY,EAAE,GACpCA,EAAS,MAAM,WAAW,SAC1BA,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAYA,CAAQ,GAClCA,EAAS,OAAA;AACT,UAAMC,IAAS,SAAS,YAAY,MAAM;AAC1C,oBAAS,KAAK,YAAYD,CAAQ,GAC3BC;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAEMC,IAAc,CAClBC,GACAC,GACAC,MAEIF,MAAS,SAAkBE,IACxB,OAAOF,KAAS,aAAaA,EAAKC,CAAO,IAAID,GAGhDG,KAMD,CAAC,EAAE,MAAAC,GAAM,YAAAC,GAAY,UAAAC,GAAU,UAAAC,GAAU,SAAAC,QAC5C,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,MAAK;AAAA,IACL,kBAAc;AAAA,IACd,UAAUJ;AAAA,IACV,iBAAeA;AAAA,IACf,UAAUC,IAAW,IAAI;AAAA,IACzB,WAAWI;AAAA,MACT;AAAA,MACAL,IACI,kCACAK;AAAA,QACE;AAAA,QACAN,EAAK,WACD,2IACA;AAAA,MAAA;AAAA,IACN;AAAA,IAEN,SAASG;AAAA,IACT,cAAc,MAAM,CAACF,KAAcG,EAAA;AAAA,IAElC,UAAA;AAAA,MAAAJ,EAAK,OACJ,gBAAAO,EAAC,QAAA,EAAK,WAAWD,EAAG,8BAA8BN,EAAK,WAAW,uCAAuC,sCAAsC,GAC5I,UAAAA,EAAK,MACR,IACE;AAAA,MACJ,gBAAAO,EAAC,QAAA,EAAK,WAAU,mBAAmB,YAAK,OAAM;AAAA,MAC7CP,EAAK,WAAW,gBAAAO,EAAC,QAAA,EAAK,WAAU,yDAAyD,UAAAP,EAAK,UAAS,IAAU;AAAA,IAAA;AAAA,EAAA;AACpH,GAOWQ,KAA8D,CAAC;AAAA,EAC1E,OAAAC;AAAA,EAAO,QAAAC;AAAA,EAAQ,YAAAC;AAAA,EAAY,uBAAAC;AAAA,EAAuB,YAAAC;AAAA,EAAY,MAAAC;AAAA,EAAM,SAAAC;AAAA,EAAS,SAAAC;AAC/E,MAAM;AACJ,QAAMC,IAAcC,EAAA,GACdC,IAAIC,EAAQ,MAAMH,GAAa,MAAM,CAACI,MAAgBA,IAAM,CAACJ,CAAW,CAAC,GACzEK,IAAUC,EAAuB,IAAI,GACrC,CAACC,GAAUC,CAAW,IAAIC,EAA+C,IAAI,GAC7E,CAACC,GAAaC,CAAc,IAAIF,EAAS,EAAE,GAC3C,CAACG,GAAWC,CAAY,IAAIJ,EAAoD,IAAI,GACpF,CAACK,GAAkBC,CAAmB,IAAIN,EAA4B,EAAE,QAAQ,OAAO,GACvFO,IAAaV,EAAA,GAEb1B,IAAUuB;AAAA,IACd,MAAOX,IAAQ,EAAE,GAAGA,EAAM,QAAQ,OAAOO,MAAY;AAAA,IACrD,CAACP,GAAOO,CAAO;AAAA,EAAA,GAGXkB,IAAaC;AAAA,IACjB,OAAOd,GAAa7B,GAAc4C,MAAyC;AACzE,UAAIP,EAAW;AAEf,YAAMQ,IAAW,MAAM9C,GAAiBC,CAAI;AAE5C,MAAI6C,KACF3B,GAAQ,SAASlB,GAAM4C,CAAW,GAClCnB,GAAa,mBAAmB,WAAWE,EAAE,qBAAqB,CAAC,KAEnEF,GAAa,mBAAmB,SAASE,EAAE,6BAA6B,CAAC,GAI3EW,EAAa,EAAE,KAAAT,GAAK,UAAAgB,GAAU,GAC9BJ,EAAW,UAAU,WAAW,MAAMjB,EAAA,GAAWsB,EAAsB;AAAA,IACzE;AAAA,IACA,CAAC5B,GAAQO,GAAaE,GAAGH,GAASa,CAAS;AAAA,EAAA,GAGvCU,IAAgBJ;AAAA,IACpB,CAACd,GAAamB,GAAehD,MAAuC;AAClE,YAAMiD,IAASZ,GAAW,QAAQR;AAElC,aAAO;AAAA,QACL,KAAAA;AAAA,QACA,OAAQoB,IAAiBZ,GAAW,WAAWV,EAAE,QAAQ,IAAIA,EAAE,aAAa,IAA3DqB;AAAA,QACjB,MACEC,KAAUZ,GAAW,6BAClBa,IAAA,EAAU,MAAM,IAAI,WAAU,yCAAA,CAAyC,IAExE,gBAAAnC,EAACoC,IAAA,EAAgB,MAAM,IAAI;AAAA,QAE/B,YAAY,CAACnD;AAAA,QACb,iBAAiB;AAAA,QACjB,SAAS,CAAC4C,MAAgBF,EAAWb,GAAK7B,GAAM4C,CAAW;AAAA,MAAA;AAAA,IAE/D;AAAA,IACA,CAACP,GAAWK,GAAYf,CAAC;AAAA,EAAA,GAGrByB,IAAUxB,EAAQ,MAAMyB,EAAWpC,GAAO,OAAO,SAASM,CAAO,GAAG,CAACN,GAAO,OAAO,SAASM,CAAO,CAAC,GAEpG+B,IAAmB1B,EAAQ,MAAOX,IAAQsC,EAAoBjC,GAAMC,GAASF,CAAU,IAAI,IAAK,CAACJ,GAAOK,GAAMC,GAASF,CAAU,CAAC,GAClImC,IAAgBnC,GAAY,UAAU,GAEtCoC,IAAQ7B,EAAgC,MAAM;AAClD,QAAI,CAACvB,EAAS,QAAO,CAAA;AAErB,UAAMqD,IAAuCxC,GAAQ,mBACjD,KACA;AAAA,MACE6B,EAAc,aAAa7B,GAAQ,aAAaS,EAAE,WAAW,GAAGtB,EAAQ,IAAI;AAAA,MAC5E0C,EAAc,YAAYpB,EAAE,UAAU,GAAGyB,CAAO;AAAA,MAChD,GAAII,IAAgB,IAChB;AAAA,QACET;AAAA,UACE;AAAA,UACAS,MAAkB,IAAI7B,EAAE,mBAAmB,IAAI,GAAGA,EAAE,oBAAoB,CAAC,KAAK6B,CAAa;AAAA,UAC3FF;AAAA,QAAA;AAAA,MACF,IAEF,CAAA;AAAA,IAAC,GAGLK,IAAa,OAAOzC,GAAQ,SAAU,aAAaA,EAAO,MAAMb,CAAO,IAAIa,GAAQ,SAAS,CAAA;AAElG,WAAO,CAAC,GAAGwC,GAAc,GAAGC,CAAU,EAAE,OAAO,CAACnD,MAASL,EAAYK,EAAK,WAAWH,GAAS,EAAI,CAAC;AAAA,EACrG,GAAG,CAACa,GAAQb,GAAS0C,GAAeS,GAAeJ,GAASE,GAAkB3B,CAAC,CAAC,GAG1EiC,IAAqBhC,EAAsB,MAC3C,CAACX,KAASC,GAAQ,sBAAsB,MAAS,CAACC,IAAmB,CAAA,MAE5D,OAAOA,KAAe,aAAaA,EAAWF,EAAM,OAAO,OAAO,IAAIE,MAEnE,CAAA,GAAI,OAAO,CAAC0C,MAAWA,EAAO,cAAc,EAAK,GAChE,CAAC5C,GAAOE,GAAYD,GAAQ,iBAAiB,CAAC,GAE3C4C,IAAgBF,EAAmB,SAAS;AAGlD,EAAAG,EAAU,MAAM;AACd,QAAI,CAAC9C,KAAS,CAAC6C,KAAiB,CAAC1C,GAAuB;AACtD,MAAAoB,EAAoB,EAAE,QAAQ,OAAO;AACrC;AAAA,IACF;AAEA,QAAIwB,IAAc;AAClB,WAAAxB,EAAoB,EAAE,QAAQ,WAAW,GAEzCpB,EAAsB,OAAOH,EAAM,OAAO,KAAK,CAAC,EAC7C,KAAK,CAACgD,MAAc,CAACD,KAAexB,EAAoB,EAAE,QAAQ,SAAS,WAAAyB,EAAA,CAAW,CAAC,EACvF,MAAM,MAAM,CAACD,KAAexB,EAAoB,EAAE,QAAQ,SAAA,CAAU,CAAC,GAEjE,MAAM;AACX,MAAAwB,IAAc;AAAA,IAChB;AAAA,EACF,GAAG,CAAC/C,GAAO6C,GAAe1C,CAAqB,CAAC;AAEhD,QAAM8C,IAAoBtC,EAAsB,MAAM;AACpD,QAAIW,EAAiB,WAAW,MAAO,QAAOqB;AAC9C,QAAIrB,EAAiB,WAAW,QAAS,QAAO,CAAA;AAEhD,UAAM,EAAE,WAAA0B,MAAc1B;AAEtB,WAAOqB,EAAmB,OAAO,CAACC,MAAWI,EAAUJ,EAAO,GAAG,KAAK,EAAI;AAAA,EAC5E,GAAG,CAACD,GAAoBrB,CAAgB,CAAC,GAEnC4B,IAAWvC,EAAoB,MAAM;AACzC,UAAMwC,IAAuBX,EAAM,IAAI,CAACjD,OAAU,EAAE,MAAM,QAAQ,KAAKA,EAAK,KAAK,MAAAA,EAAA,EAAO,GAClF6D,IAAeD,EAAS,SAAS;AAEvC,WAAI7B,EAAiB,WAAW,YACvB,CAAC,GAAG6B,GAAU,EAAE,MAAM,YAAY,KAAK,uBAAuB,mBAAmBC,GAAc,IAGjG;AAAA,MACL,GAAGD;AAAA,MACH,GAAGF,EAAkB,IAAc,CAACL,GAAQS,OAAW;AAAA,QACrD,MAAM;AAAA,QACN,KAAK,cAAcT,EAAO,GAAG;AAAA,QAC7B,MAAMA,EAAO;AAAA,QACb,mBAAmBQ,KAAgBC,MAAU;AAAA,MAAA,EAC7C;AAAA,IAAA;AAAA,EAEN,GAAG,CAACb,GAAOS,GAAmB3B,EAAiB,MAAM,CAAC,GAEhDgC,IAAiB5B;AAAA,IACrB,CAAC6B,MAA4BA,EAAI,SAAS,SAAS,EAAEnE,KAAWF,EAAYqE,EAAI,KAAK,YAAYnE,GAAS,EAAK,KAAKmE,EAAI,SAAS;AAAA,IACjI,CAACnE,CAAO;AAAA,EAAA,GAGJoE,IAAsB7C,EAAQ,MAAMuC,EAAS,UAAUI,CAAc,GAAG,CAACJ,GAAUI,CAAc,CAAC;AAGxG,EAAAG,GAAgB,MAAM;AACpB,QAAI,CAACzD,KAAS,CAACa,EAAQ,SAAS;AAC9B,MAAAG,EAAY,IAAI;AAChB;AAAA,IACF;AAEA,UAAM,EAAE,OAAA0C,GAAO,QAAAC,EAAA,IAAW9C,EAAQ,QAAQ,sBAAA,GACpC+C,IAASC,IACTC,IAASC,IAGTC,IAAOhE,EAAM,IAAI0D,IAAQE,IAAS,OAAO,aAAa5D,EAAM,IAAI0D,IAAQI,IAAS9D,EAAM,IAAI8D,GAC3FG,IAAMjE,EAAM,IAAI2D,IAASC,IAAS,OAAO,cAAc5D,EAAM,IAAI2D,IAASG,IAAS9D,EAAM,IAAI8D;AAEnG,IAAA9C,EAAY;AAAA,MACV,MAAM,KAAK,IAAI4C,GAAQ,KAAK,IAAII,GAAM,OAAO,aAAaN,IAAQE,CAAM,CAAC;AAAA,MACzE,KAAK,KAAK,IAAIA,GAAQ,KAAK,IAAIK,GAAK,OAAO,cAAcN,IAASC,CAAM,CAAC;AAAA,IAAA,CAC1E;AAAA,EACH,GAAG,CAAC5D,GAAOkD,EAAS,MAAM,CAAC,GAE3BJ,EAAU,OACRzB,EAAa,IAAI,GACV,MAAM,aAAaG,EAAW,OAAO,IAC3C,CAACxB,CAAK,CAAC,GAEV8C,EAAU,MAAM;AACd,QAAI,CAAC9C,GAAO;AACV,MAAAmB,EAAe,EAAE;AACjB;AAAA,IACF;AACA,IAAAA,EAAeqC,CAAmB;AAAA,EACpC,GAAG,CAACxD,GAAOwD,CAAmB,CAAC,GAG/BV,EAAU,MAAM;AACd,QAAI,CAAC9C,KAASkB,IAAc,EAAG;AAE/B,UAAMqC,IAAM1C,EAAQ,SAAS,iBAA8B,kBAAkB,EAAEK,CAAW;AAI1F,KAHoBqC,GAAK,QAAQ,QAAQ,IAAIA,IAAMA,GAAK,cAAc,QAAQ,KAAKA,IAGtE,MAAM,EAAE,eAAe,GAAA,CAAM;AAAA,EAC5C,GAAG,CAACvD,GAAOkB,CAAW,CAAC;AAEvB,QAAMgD,IAAkBxC;AAAA,IACtB,CAACyC,MAAsB;AACrB,MAAIjB,EAAS,WAAW,KACxB/B,EAAe,CAACiD,MAAY;AAC1B,YAAIC,IAAOD;AACX,iBAASE,IAAO,GAAGA,IAAOpB,EAAS,QAAQoB,KAAQ;AAEjD,cADAD,KAAQA,IAAOF,IAAYjB,EAAS,UAAUA,EAAS,QACnDI,EAAeJ,EAASmB,CAAI,CAAC,EAAG,QAAOA;AAE7C,eAAOD;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAClB,GAAUI,CAAc;AAAA,EAAA;AA0C3B,MAvCAR,EAAU,MAAM;AACd,QAAI,CAAC9C,EAAO;AAEZ,UAAMuE,IAAoB,CAACC,MAAmC;AAC5D,MAAI3D,EAAQ,WAAW,CAACA,EAAQ,QAAQ,SAAS2D,EAAM,MAAc,KAAGjE,EAAA;AAAA,IAC1E,GACMkE,IAAgB,CAACD,MAAyB;AAC9C,UAAIA,EAAM,QAAQ,UAAU;AAC1B,QAAAA,EAAM,gBAAA,GACNjE,EAAA;AACA;AAAA,MACF;AACA,OAAIiE,EAAM,QAAQ,eAAeA,EAAM,QAAQ,eAC7CA,EAAM,eAAA,GACNN,EAAgBM,EAAM,QAAQ,cAAc,IAAI,EAAE;AAAA,IAEtD,GAEME,IAAe,MAAMnE,EAAA,GAGrBoE,IAAY,WAAW,MAAM;AACjC,eAAS,iBAAiB,aAAaJ,CAAiB,GACxD,SAAS,iBAAiB,cAAcA,CAAiB,GACzD,SAAS,iBAAiB,WAAWE,CAAa,GAClD,SAAS,iBAAiB,UAAUC,GAAc,EAAI,GACtD,OAAO,iBAAiB,UAAUA,CAAY;AAAA,IAChD,GAAG,CAAC;AAEJ,WAAO,MAAM;AACX,mBAAaC,CAAS,GACtB,SAAS,oBAAoB,aAAaJ,CAAiB,GAC3D,SAAS,oBAAoB,cAAcA,CAAiB,GAC5D,SAAS,oBAAoB,WAAWE,CAAa,GACrD,SAAS,oBAAoB,UAAUC,GAAc,EAAI,GACzD,OAAO,oBAAoB,UAAUA,CAAY;AAAA,IACnD;AAAA,EACF,GAAG,CAAC1E,GAAOO,GAAS2D,CAAe,CAAC,GAEhC,CAAClE,KAAS,CAACZ,KAAW8D,EAAS,WAAW,EAAG,QAAO;AAExD,MAAI1C,GAAa;AACf,WAAOA,EAAY,sBAAsB,EAAE,OAAAR,GAAO,SAAAZ,GAAS,OAAAoD,GAAO,YAAYS,GAAmB,SAAA1C,GAAS;AAG5G,QAAMqE,IAAkB,OAAOrF,MAA8C;AAC3E,IAAIL,EAAYK,EAAK,YAAYH,GAAS,EAAK,MAC1CG,EAAK,mBAAiBgB,EAAA,GAC3B,MAAMhB,EAAK,UAAUH,CAAO;AAAA,EAC9B;AAEA,SAAOyF;AAAA,IACL,gBAAA/E;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKe;AAAA,QACL,MAAK;AAAA,QACL,cAAYH,EAAE,cAAc;AAAA,QAC5B,eAAY;AAAA,QACZ,WAAWb;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACAI,GAAQ;AAAA,QAAA;AAAA,QAEV,OAAO;AAAA,UACL,MAAMc,GAAU,QAAQf,EAAM;AAAA,UAC9B,KAAKe,GAAU,OAAOf,EAAM;AAAA,UAC5B,QAAQ8E;AAAA;AAAA,UAER,YAAY/D,IAAW,YAAY;AAAA,QAAA;AAAA,QAErC,eAAe,CAACyD,MAAUA,EAAM,eAAA;AAAA,QAE/B,UAAAtB,EAAS,IAAI,CAACK,GAAKF,MAClB,gBAAAzD,EAACmF,EAAM,UAAN,EACG,UAAA;AAAA,WAAAxB,EAAI,SAAS,SAASA,EAAI,KAAK,qBAAqBF,IAAQ,IAAIE,EAAI,qBACpE,gBAAAzD,EAAC,OAAA,EAAI,WAAU,8CAA6C,IAC1D;AAAA,UACHyD,EAAI,SAAS,SACZ,gBAAAzD;AAAA,YAACR;AAAA,YAAA;AAAA,cACC,MAAMiE,EAAI;AAAA,cACV,YAAYrE,EAAYqE,EAAI,KAAK,YAAYnE,GAAS,EAAK;AAAA,cAC3D,UAAUiE,MAAUnC;AAAA,cACpB,UAAU,MAAM,KAAK0D,EAAgBrB,EAAI,IAAI;AAAA,cAC7C,SAAS,MAAMpC,EAAekC,CAAK;AAAA,YAAA;AAAA,UAAA,IAEnCE,EAAI,SAAS,+BACd,OAAA,EAAI,WAAU,aAAY,eAAY,6BACrC,UAAA,gBAAAzD,EAAC,OAAA,EAAI,WAAU,uEAAsE,GACvF;AAAA;AAAA,8BAGC,OAAA,EAAI,kBAAc,IAAC,UAAU,IAAI,WAAU,kCAAiC,SAASS,GAAS,cAAc,MAAMY,EAAekC,CAAK,GACpI,YAAI,KAAA,CACP;AAAA;AAAA,QAAA,EAAA,GApBiBE,EAAI,GAsBzB,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,SAAS;AAAA,EAAA;AAEb;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),Ve=require("../../../../../hooks/useTheme.cjs.js"),S=require("../../../../../utils/formatters.cjs.js"),Fe=require("../../../../../constants/table.cjs.js"),ze=require("../../../../../providers/design-system-provider/hooks.cjs.js"),X=require("../../../../tooltip/Tooltip.cjs.js"),Ae=require("../../../typography/Typography.cjs.js"),Ee=require("@mui/icons-material"),k=require("../../../../../_virtual/index.cjs.js"),a=require("react"),Ke=require("react-router-dom"),We=require("../../context.cjs.js"),ue=require("../../copy-text.cjs.js"),Ue=require("./InlineEditField.cjs.js"),T=require("../../constants.cjs.js"),g=require("../../../../icon/icons.generated.cjs.js");let P;const ie=e=>{const t=Number(e);if(Number.isNaN(t)||e===null||e===void 0)return"0ms";if(t>=864e5){const p=Math.floor(t/864e5),f=Math.floor(t%864e5/36e5),i=Math.floor(t%36e5/6e4),x=Math.floor(t%6e4/1e3);return`${p}d ${f}h ${i}m ${x}s`}if(t>=36e5){const p=Math.floor(t/36e5),f=Math.floor(t%36e5/6e4),i=Math.floor(t%6e4/1e3);return`${p}h ${f}m ${i}s`}if(t>=6e4){const p=Math.floor(t/6e4),f=Math.floor(t%6e4/1e3);return`${p}m ${f}s`}return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${t}ms`},Ye=({children:e,withLink:t,linkTo:p,rowData:f,disableRowClick:i})=>t&&!i?o.jsx(Ke.Link,{to:p?.(f?.id,f)||"",children:e}):e,Be=({cell:e,id:t,nextWidthSum:p,isLastCell:f,rowHovering:i,index:x,isFirstStickyCell:le,handleCellClick:ce,currentData:y,highlightSubstring:M,is_read:Pe,is_modified:G,is_row_modified:H,is_deleted:I,is_added:O,level:b,inlineEditing:v,isInlineEditing:c,setRowHovering:D,handleCellValueChange:me,cellRef:de,handleUpdateCellData:fe,registerValidation:we,loadingExpand:pe,toggleRowExpand:J,isDraggingOver:he,isLoading:$,is_incomplete:Q,pendingEdit:u,hasPendingEdit:l,pendingValidationError:xe})=>{const{cascadingTableConfig:Z,originalsOnly:ye,maxLevel:be,showNewItem:Ge,expandedRows:ve,rowLinkConfig:q,multiSelectConfig:ke,cellEditing:V,cellEditingValue:F,allowInlineEdit:ee,fieldOperationLoading:Ce,pendingEdits:Te,selectedRowId:z,cellContextMenuConfig:A,openCellContextMenu:E}=a.useContext(We.TableContext),ge=z!=null&&String(z)===String(t),_e=ze.useTableConfig(),K=(e?.column?.key?e?.row?.original?.__cellMetadata?.[e.column.key]:void 0)?.is_locked??e?.column?.is_locked,W=(e?.column?.key?Te?.[t]?.[e.column.key]?.validationError:null)||xe||null,R=v===e.column.key&&e?.column?.canEdit&&!K&&!e?.column?.is_disabled,je=Ce===`${t}-${e?.column?.id}`,{theme:Le}=Ve.useTheme(),Ne=Le==="dark",Se=a.useCallback(()=>D(t),[D,t]),Me=a.useCallback(()=>D(null),[D]),_=_e?.formatDuration,[s,w]=a.useState(e?.column?.dataType==="duration"&&e?.value?_?_(e.value):ie(e.value):e.value),[h,oe]=a.useState(null),[U,De]=a.useState(!1),[$e,te]=a.useState(!1),[Re,re]=a.useState(!1),j=a.useRef(null),L=a.useRef(),N=a.useRef(),{selectedColumnIds:ae=[]}=ke||{},ne=!Object.prototype.hasOwnProperty.call(e?.column?.meta??{},"shouldHighlight")||e?.column?.meta?.shouldHighlight,se=a.useCallback(()=>{j.current&&De(j.current.scrollWidth>j.current.clientWidth)},[]),Y=a.useCallback(r=>{L.current&&clearTimeout(L.current),r?te(!0):L.current=setTimeout(()=>te(!1),200)},[]),B=a.useCallback(r=>{N.current&&clearTimeout(N.current),r?re(!0):N.current=setTimeout(()=>re(!1),200)},[]),C=k({"bg-amber-100 dark:bg-amber-900/30":l,"bg-neutral-100 dark:bg-black-600":i===t&&!c&&!l&&!(I||y?.is_deleted)&&!(O||y?.is_added),"bg-error-200 dark:bg-error-900":i===t&&!c&&!l&&(I||y?.is_deleted),"bg-success-100 dark:bg-success-800":i===t&&!c&&!l&&(O||y?.is_added),"bg-warning-100 dark:bg-warning-950":i===t&&!c&&!l&&(Q||G||H||y?.is_row_modified),"bg-warning-50 dark:bg-orange-900":(Q||G||H||y?.is_row_modified)&&!$&&i!==t&&!c&&!l,"bg-error-100 dark:bg-error-975":(I||y?.is_deleted)&&!$&&i!==t&&!c&&!l,"bg-success-50 dark:bg-success-900":(O||y?.is_added)&&!$&&i!==t&&!c&&!l,"bg-primary-50 dark:bg-primary-900":(he||c)&&!l,"bg-primary-50 dark:bg-primary-800":ae?.includes(e.column.id)&&!c&&!l,"bg-primary-50 dark:bg-primary-700":ge&&i!==t&&!c&&!l&&!$,[Fe.getTableRowBgClassNamesByStatus[e?.row?.original?.__rowBgStatus]]:e?.row?.original?.__rowBgStatus&&!c&&!l}),Ie=r=>{e.column?.disableRowClick||ce(r)},Oe=a.useCallback(r=>{if(A?.isEnabled===!1||!E||R)return;const n={rowId:t,rowData:e?.row?.original??{},columnKey:e?.column?.key??"",column:e.column,value:e?.value,text:ue.getCellText(s,e?.value,r.currentTarget),rowText:ue.getRowText(r.currentTarget),cell:e};A?.isDisabledForCell?.(n)||(r.preventDefault(),r.stopPropagation(),E({x:r.clientX,y:r.clientY,target:n}))},[A,E,R,t,e,s]);a.useEffect(()=>(e?.row?.original?.status==="running"&&e.column?.dataType==="duration"&&(P=setInterval(()=>{const n=new Date(S.formatDate(e?.row?.original?.created_at||e?.row?.original?.executed_on,{withTime:!0,format:"yyyy-MM-dd HH:mm:ss"})),d=Math.abs(new Date().getTime()-new Date(n).getTime());w(_?_(d):ie(d))},500)),()=>{P&&clearInterval(P)}),[s,e.value,e?.row?.original?.created_at,e?.row?.original?.executed_on,e?.row?.original?.status,e.column?.dataType,_]),a.useEffect(()=>{(e?.column?.tooltipCellKey||e?.column?.type?.toLowerCase()==="url")&&(e?.column?.type?.toLowerCase()==="url"?oe(e?.value):oe(e?.row?.original?.[String(e?.column?.tooltipCellKey)]))},[e?.column?.tooltipCellKey,e?.row?.original,e?.column?.type,e?.value]),a.useEffect(()=>{if(e?.column?.type?.toLowerCase()==="currency")if(u?.value!==void 0){const r=e?.row?.original?.__rawData,n=e?.column?.Header,d=u?.meta?.currency_code||r?.[n]?.currency_code||"USD";w(S.formatCurrency(u.value,d))}else{const r=e?.row?.original?.__rawData,n=e?.column?.Header;w(S.formatCurrency(e?.value,r?.[n]?.currency_code||"USD"))}},[e?.value,e?.column?.type,e?.column?.Header,e?.row?.original?.__rawData,u?.value,u?.meta?.currency_code]),a.useEffect(()=>{e?.column?.type?.toLowerCase()==="percentage"&&(u?.value!==void 0?w(u.value?.toString()+"%"||""):w(e?.value?.toString()+"%"||""))},[e?.value,e?.column?.type,u?.value]),a.useEffect(()=>{const r=e?.column?.type?.toLowerCase()||"";if(["date","datetime"].includes(r))if(u?.value!==void 0){const n=r==="datetime",d=S.formatDate(u.value,{withTime:n,skipTimezone:!0});w(d||u.value)}else w(e.value)},[e?.value,e?.column?.type,u?.value]),a.useEffect(()=>{const r=e?.column?.type?.toLowerCase()||"";["currency","percentage","duration","boolean","date","datetime"].includes(r)||(u?.value!==void 0?w(u.value):e?.column?.dataType!=="duration"&&w(e.value))},[e?.value,e?.column?.type,e?.column?.dataType,u?.value]),a.useEffect(()=>{if(e?.column?.type?.toLowerCase()==="boolean"&&ee){const r=u?.value!==void 0?u.value:e?.value;w(r===!0||r==="true"||r==="True"||r==="Yes"||r===1?"Yes":"No")}},[e?.value,e?.column?.type,ee,u?.value]),a.useEffect(()=>()=>{L.current&&clearTimeout(L.current),N.current&&clearTimeout(N.current)},[]);const m=a.isValidElement(s);return o.jsxs("td",{id:e.value,"data-column-key":e?.column?.key,...e.getCellProps(),onClick:q?.isEnabled?void 0:Ie,className:k("h-row",{"sticky left-0":e?.column?.sticky,relative:!e?.column?.sticky,"w-full":f,"overflow-visible":v===e.column.key,"overflow-x-hidden overflow-y-visible":v!==e.column.key&&m,"overflow-hidden":v!==e.column.key&&!m},W&&!R?"outline outline-2 outline-error-500 -outline-offset-2 z-[5]":"",`${C||"bg-white dark:bg-black-800"}`),style:{minWidth:`${e.column.width}px`,maxWidth:`${e.column.width}px`,right:e?.column?.sticky?`${p}px`:T.CELL_DEFAULT_RIGHT_OFFSET,paddingLeft:b>0&&x===0?`${b*T.CELL_INDENT_PER_LEVEL_PX}px`:void 0},onMouseEnter:Se,onMouseLeave:Me,onContextMenu:Oe,children:[o.jsx(Ye,{withLink:q?.isEnabled,linkTo:q?.linkTo||void 0,rowData:e?.row?.original,disableRowClick:e?.column?.disableRowClick,children:(Array.isArray(V)?V.includes(`${t}-${e?.column?.id}`):V===`${t}-${e?.column?.id}`)?o.jsxs("div",{className:"h-row top-0 font-medium font-inter w-full absolute flex items-center px-4",children:[o.jsx("span",{className:"text-neutral-400 dark:text-black-400 truncate",children:(()=>{const r=`${t}-${e?.column?.id}`,n=typeof F=="object"?F?.[r]:F,d=e?.column?.type?.toLowerCase();if(d==="boolean")return n===!0||n==="true"||n==="True"?"Yes":"No";if((d==="date"||d==="datetime")&&n){const qe=d==="datetime";return S.formatDate(n,{withTime:qe,skipTimezone:!0})||String(n)}return n!=null?String(n):s})()}),o.jsx("div",{className:"ml-2 flex items-center gap-1.5",children:o.jsx(g.LoadingSpinnerIcon,{className:"spinner text-neutral-600 dark:text-white",size:12})})]}):v===e.column.key&&e?.column?.canEdit&&!K&&!e?.column?.is_disabled?o.jsx("div",{className:"h-row w-full absolute top-0 left-0 flex items-center",style:{marginLeft:b>0&&x===0?`-${b*T.CELL_INDENT_PER_LEVEL_PX}px`:void 0,width:b>0&&x===0?`calc(100% + ${b*T.CELL_INDENT_PER_LEVEL_PX}px)`:"100%"},children:o.jsx(Ue.InlineEditField,{cell:e,id:t,inlineEditing:v,cellRef:de,handleCellValueChange:me,handleUpdateCellData:fe,registerValidation:we})}):o.jsxs(o.Fragment,{children:[b>0&&x===0&&o.jsx("div",{className:"h-row border-l border-neutral-300 dark:border-black-600 ml-2"}),o.jsx("div",{className:"min-h-6",children:o.jsx(X,{title:h&&e?.column?.type?.toLowerCase()!=="url"?h:void 0,hideTooltip:!h||e?.column?.type?.toLowerCase()==="url",delayShow:!0,placement:"top",children:o.jsxs("div",{className:k(`h-row top-0 font-medium font-inter overflow-index-auto whitespace-nowrap text-ellipsis dark:text-black-200 w-full absolute flex items-center ${C||"bg-white dark:bg-black-800"}`,m?"overflow-x-hidden overflow-y-visible":"overflow-x-hidden",{"border border-b-0 border-t-0 border-primary-600 dark:border-blue-800":ae?.includes(e.column.id)}),style:e?.column?.sticky&&le?{boxShadow:Ne?T.CELL_STICKY_SHADOW_DARK:T.CELL_STICKY_SHADOW_LIGHT}:{},children:[Z?.isCascading&&!ye&&x===0&&o.jsx("div",{className:k("w-[22px] h-row flex items-center px-4",`${C||"bg-white dark:bg-black-800"}`),id:"cascading",children:be>b&&(e?.row?.original?.__has_children||Z?.showAllDropdown)&&o.jsx("div",{children:pe?o.jsx(g.LoadingSpinnerIcon,{className:"text-neutral-600 dark:text-white",size:8}):o.jsx("div",{children:ve?.[t]?.isOpen?o.jsx(g.KeyboardArrowDownIcon,{size:20,className:"text-neutral-400 dark:text-neutral-400",onClick:r=>{J(),r.stopPropagation()}}):o.jsx(g.KeyboardArrowRightFilledIcon,{size:20,className:"text-neutral-400 dark:text-neutral-400",onClick:r=>{J(),r.stopPropagation()}})})})}),e?.column?.type?.toLowerCase()==="url"&&h?o.jsx(X,{title:o.jsx("div",{onMouseEnter:()=>Y(!0),onMouseLeave:()=>Y(!1),children:o.jsx("a",{href:h,target:"_blank",rel:"noopener noreferrer",onClick:r=>r.stopPropagation(),children:o.jsxs("div",{className:"flex gap-1 items-center w-full",children:[o.jsx("div",{className:"w-4 h-4",children:o.jsx(g.LinkIcon,{height:16,width:16})}),o.jsx(Ae.Typography,{variant:"medium",size:"small",className:"truncate",appearance:"custom",children:h}),o.jsx(Ee.OpenInNewRounded,{sx:{height:"16px",width:"16px",color:"#016DCF"}})]})})}),placement:"top",open:$e,onOpenChange:Y,className:"block w-full min-w-0 overflow-hidden",children:o.jsx("div",{className:"w-full h-row flex items-center px-4 min-w-0 overflow-hidden text-primary-400",children:o.jsx("span",{ref:j,"data-cell-content":!0,onMouseEnter:se,className:"truncate w-full",children:M&&ne&&!a.isValidElement(s)&&typeof s!="object"?M(s):s})})}):o.jsx(X,{title:U&&s&&!m?o.jsx("div",{onMouseEnter:()=>B(!0),onMouseLeave:()=>B(!1),className:"max-h-96 overflow-y-auto whitespace-pre-wrap break-words no-scroll",children:String(s)}):void 0,placement:"top",delayShow:!0,hideTooltip:!!h,open:U&&!h&&!m?Re:void 0,onOpenChange:U&&!h&&!m?B:void 0,className:k("block w-full min-w-0",m?"overflow-x-hidden overflow-y-visible":"overflow-hidden"),children:o.jsx("div",{className:k("w-full h-row flex items-center px-4 min-w-0",m?"overflow-x-hidden overflow-y-visible":"overflow-hidden"),children:o.jsx("span",{ref:m?void 0:j,"data-cell-content":!0,onMouseEnter:m?void 0:se,className:k(m?"flex min-w-0 max-w-full items-center justify-start gap-1":"truncate w-full"),children:M&&ne&&!a.isValidElement(s)&&typeof s!="object"?M(s):a.isValidElement(s)?typeof s.type=="string"?s:a.cloneElement(s,{...s.props,containerWidth:e.column.width}):s})})})]})})})]})}),W&&!R&&o.jsx("div",{className:"absolute bottom-0 left-0 right-0 h-row flex items-end pointer-events-none z-[5]",children:o.jsx("div",{className:"w-full bg-error-50 dark:bg-error-975 px-1.5 py-0.5 truncate",children:o.jsx("span",{className:"text-error-600 text-2xs font-medium leading-none",children:W})})}),je&&!(v===e.column.key&&e?.column?.canEdit&&!K&&!e?.column?.is_disabled)&&o.jsx("div",{className:"absolute top-0 right-0 bg-white dark:bg-black-800 rounded-full w-5 h-5 flex items-center justify-center border border-primary-300 dark:border-primary-600 shadow-sm z-10",children:o.jsx(g.LoadingSpinnerIcon,{className:"text-primary-600 dark:text-white",size:8})})]},x)},Xe=a.memo(Be);exports.DataCell=Xe;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),qe=require("../../../../../hooks/useTheme.cjs.js"),S=require("../../../../../utils/formatters.cjs.js"),Ve=require("../../../../../constants/table.cjs.js"),Fe=require("../../../../../providers/design-system-provider/hooks.cjs.js"),X=require("../../../../tooltip/Tooltip.cjs.js"),ze=require("../../../typography/Typography.cjs.js"),Ae=require("@mui/icons-material"),k=require("../../../../../_virtual/index.cjs.js"),a=require("react"),Ee=require("react-router-dom"),Ke=require("../../context.cjs.js"),We=require("../../copy-text.cjs.js"),Ue=require("./InlineEditField.cjs.js"),T=require("../../constants.cjs.js"),g=require("../../../../icon/icons.generated.cjs.js");let P;const ue=e=>{const t=Number(e);if(Number.isNaN(t)||e===null||e===void 0)return"0ms";if(t>=864e5){const w=Math.floor(t/864e5),f=Math.floor(t%864e5/36e5),i=Math.floor(t%36e5/6e4),x=Math.floor(t%6e4/1e3);return`${w}d ${f}h ${i}m ${x}s`}if(t>=36e5){const w=Math.floor(t/36e5),f=Math.floor(t%36e5/6e4),i=Math.floor(t%6e4/1e3);return`${w}h ${f}m ${i}s`}if(t>=6e4){const w=Math.floor(t/6e4),f=Math.floor(t%6e4/1e3);return`${w}m ${f}s`}return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${t}ms`},Ye=({children:e,withLink:t,linkTo:w,rowData:f,disableRowClick:i})=>t&&!i?o.jsx(Ee.Link,{to:w?.(f?.id,f)||"",children:e}):e,Be=({cell:e,id:t,nextWidthSum:w,isLastCell:f,rowHovering:i,index:x,isFirstStickyCell:ie,handleCellClick:le,currentData:y,highlightSubstring:M,is_read:Pe,is_modified:G,is_row_modified:H,is_deleted:R,is_added:O,level:b,inlineEditing:v,isInlineEditing:c,setRowHovering:D,handleCellValueChange:ce,cellRef:me,handleUpdateCellData:de,registerValidation:fe,loadingExpand:pe,toggleRowExpand:J,isDraggingOver:we,isLoading:$,is_incomplete:Q,pendingEdit:u,hasPendingEdit:l,pendingValidationError:he})=>{const{cascadingTableConfig:Z,originalsOnly:xe,maxLevel:ye,showNewItem:Ge,expandedRows:be,rowLinkConfig:q,multiSelectConfig:ve,cellEditing:V,cellEditingValue:F,allowInlineEdit:ee,fieldOperationLoading:ke,pendingEdits:Ce,selectedRowId:z,cellContextMenuConfig:A,openCellContextMenu:E}=a.useContext(Ke.TableContext),Te=z!=null&&String(z)===String(t),ge=Fe.useTableConfig(),K=(e?.column?.key?e?.row?.original?.__cellMetadata?.[e.column.key]:void 0)?.is_locked??e?.column?.is_locked,W=(e?.column?.key?Ce?.[t]?.[e.column.key]?.validationError:null)||he||null,I=v===e.column.key&&e?.column?.canEdit&&!K&&!e?.column?.is_disabled,_e=ke===`${t}-${e?.column?.id}`,{theme:je}=qe.useTheme(),Le=je==="dark",Ne=a.useCallback(()=>D(t),[D,t]),Se=a.useCallback(()=>D(null),[D]),_=ge?.formatDuration,[s,p]=a.useState(e?.column?.dataType==="duration"&&e?.value?_?_(e.value):ue(e.value):e.value),[h,oe]=a.useState(null),[U,Me]=a.useState(!1),[De,te]=a.useState(!1),[$e,re]=a.useState(!1),j=a.useRef(null),L=a.useRef(),N=a.useRef(),{selectedColumnIds:ae=[]}=ve||{},ne=!Object.prototype.hasOwnProperty.call(e?.column?.meta??{},"shouldHighlight")||e?.column?.meta?.shouldHighlight,se=a.useCallback(()=>{j.current&&Me(j.current.scrollWidth>j.current.clientWidth)},[]),Y=a.useCallback(r=>{L.current&&clearTimeout(L.current),r?te(!0):L.current=setTimeout(()=>te(!1),200)},[]),B=a.useCallback(r=>{N.current&&clearTimeout(N.current),r?re(!0):N.current=setTimeout(()=>re(!1),200)},[]),C=k({"bg-amber-100 dark:bg-amber-900/30":l,"bg-neutral-100 dark:bg-black-600":i===t&&!c&&!l&&!(R||y?.is_deleted)&&!(O||y?.is_added),"bg-error-200 dark:bg-error-900":i===t&&!c&&!l&&(R||y?.is_deleted),"bg-success-100 dark:bg-success-800":i===t&&!c&&!l&&(O||y?.is_added),"bg-warning-100 dark:bg-warning-950":i===t&&!c&&!l&&(Q||G||H||y?.is_row_modified),"bg-warning-50 dark:bg-orange-900":(Q||G||H||y?.is_row_modified)&&!$&&i!==t&&!c&&!l,"bg-error-100 dark:bg-error-975":(R||y?.is_deleted)&&!$&&i!==t&&!c&&!l,"bg-success-50 dark:bg-success-900":(O||y?.is_added)&&!$&&i!==t&&!c&&!l,"bg-primary-50 dark:bg-primary-900":(we||c)&&!l,"bg-primary-50 dark:bg-primary-800":ae?.includes(e.column.id)&&!c&&!l,"bg-primary-50 dark:bg-primary-700":Te&&i!==t&&!c&&!l&&!$,[Ve.getTableRowBgClassNamesByStatus[e?.row?.original?.__rowBgStatus]]:e?.row?.original?.__rowBgStatus&&!c&&!l}),Ie=r=>{e.column?.disableRowClick||le(r)},Re=a.useCallback(r=>{if(A?.isEnabled===!1||!E||I)return;const n={rowId:t,rowData:e?.row?.original??{},columnKey:e?.column?.key??"",column:e.column,value:e?.value,text:We.getCellText(s,e?.value,r.currentTarget),cell:e};A?.isDisabledForCell?.(n)||(r.preventDefault(),r.stopPropagation(),E({x:r.clientX,y:r.clientY,target:n}))},[A,E,I,t,e,s]);a.useEffect(()=>(e?.row?.original?.status==="running"&&e.column?.dataType==="duration"&&(P=setInterval(()=>{const n=new Date(S.formatDate(e?.row?.original?.created_at||e?.row?.original?.executed_on,{withTime:!0,format:"yyyy-MM-dd HH:mm:ss"})),d=Math.abs(new Date().getTime()-new Date(n).getTime());p(_?_(d):ue(d))},500)),()=>{P&&clearInterval(P)}),[s,e.value,e?.row?.original?.created_at,e?.row?.original?.executed_on,e?.row?.original?.status,e.column?.dataType,_]),a.useEffect(()=>{(e?.column?.tooltipCellKey||e?.column?.type?.toLowerCase()==="url")&&(e?.column?.type?.toLowerCase()==="url"?oe(e?.value):oe(e?.row?.original?.[String(e?.column?.tooltipCellKey)]))},[e?.column?.tooltipCellKey,e?.row?.original,e?.column?.type,e?.value]),a.useEffect(()=>{if(e?.column?.type?.toLowerCase()==="currency")if(u?.value!==void 0){const r=e?.row?.original?.__rawData,n=e?.column?.Header,d=u?.meta?.currency_code||r?.[n]?.currency_code||"USD";p(S.formatCurrency(u.value,d))}else{const r=e?.row?.original?.__rawData,n=e?.column?.Header;p(S.formatCurrency(e?.value,r?.[n]?.currency_code||"USD"))}},[e?.value,e?.column?.type,e?.column?.Header,e?.row?.original?.__rawData,u?.value,u?.meta?.currency_code]),a.useEffect(()=>{e?.column?.type?.toLowerCase()==="percentage"&&(u?.value!==void 0?p(u.value?.toString()+"%"||""):p(e?.value?.toString()+"%"||""))},[e?.value,e?.column?.type,u?.value]),a.useEffect(()=>{const r=e?.column?.type?.toLowerCase()||"";if(["date","datetime"].includes(r))if(u?.value!==void 0){const n=r==="datetime",d=S.formatDate(u.value,{withTime:n,skipTimezone:!0});p(d||u.value)}else p(e.value)},[e?.value,e?.column?.type,u?.value]),a.useEffect(()=>{const r=e?.column?.type?.toLowerCase()||"";["currency","percentage","duration","boolean","date","datetime"].includes(r)||(u?.value!==void 0?p(u.value):e?.column?.dataType!=="duration"&&p(e.value))},[e?.value,e?.column?.type,e?.column?.dataType,u?.value]),a.useEffect(()=>{if(e?.column?.type?.toLowerCase()==="boolean"&&ee){const r=u?.value!==void 0?u.value:e?.value;p(r===!0||r==="true"||r==="True"||r==="Yes"||r===1?"Yes":"No")}},[e?.value,e?.column?.type,ee,u?.value]),a.useEffect(()=>()=>{L.current&&clearTimeout(L.current),N.current&&clearTimeout(N.current)},[]);const m=a.isValidElement(s);return o.jsxs("td",{id:e.value,"data-column-key":e?.column?.key,...e.getCellProps(),onClick:q?.isEnabled?void 0:Ie,className:k("h-row",{"sticky left-0":e?.column?.sticky,relative:!e?.column?.sticky,"w-full":f,"overflow-visible":v===e.column.key,"overflow-x-hidden overflow-y-visible":v!==e.column.key&&m,"overflow-hidden":v!==e.column.key&&!m},W&&!I?"outline outline-2 outline-error-500 -outline-offset-2 z-[5]":"",`${C||"bg-white dark:bg-black-800"}`),style:{minWidth:`${e.column.width}px`,maxWidth:`${e.column.width}px`,right:e?.column?.sticky?`${w}px`:T.CELL_DEFAULT_RIGHT_OFFSET,paddingLeft:b>0&&x===0?`${b*T.CELL_INDENT_PER_LEVEL_PX}px`:void 0},onMouseEnter:Ne,onMouseLeave:Se,onContextMenu:Re,children:[o.jsx(Ye,{withLink:q?.isEnabled,linkTo:q?.linkTo||void 0,rowData:e?.row?.original,disableRowClick:e?.column?.disableRowClick,children:(Array.isArray(V)?V.includes(`${t}-${e?.column?.id}`):V===`${t}-${e?.column?.id}`)?o.jsxs("div",{className:"h-row top-0 font-medium font-inter w-full absolute flex items-center px-4",children:[o.jsx("span",{className:"text-neutral-400 dark:text-black-400 truncate",children:(()=>{const r=`${t}-${e?.column?.id}`,n=typeof F=="object"?F?.[r]:F,d=e?.column?.type?.toLowerCase();if(d==="boolean")return n===!0||n==="true"||n==="True"?"Yes":"No";if((d==="date"||d==="datetime")&&n){const Oe=d==="datetime";return S.formatDate(n,{withTime:Oe,skipTimezone:!0})||String(n)}return n!=null?String(n):s})()}),o.jsx("div",{className:"ml-2 flex items-center gap-1.5",children:o.jsx(g.LoadingSpinnerIcon,{className:"spinner text-neutral-600 dark:text-white",size:12})})]}):v===e.column.key&&e?.column?.canEdit&&!K&&!e?.column?.is_disabled?o.jsx("div",{className:"h-row w-full absolute top-0 left-0 flex items-center",style:{marginLeft:b>0&&x===0?`-${b*T.CELL_INDENT_PER_LEVEL_PX}px`:void 0,width:b>0&&x===0?`calc(100% + ${b*T.CELL_INDENT_PER_LEVEL_PX}px)`:"100%"},children:o.jsx(Ue.InlineEditField,{cell:e,id:t,inlineEditing:v,cellRef:me,handleCellValueChange:ce,handleUpdateCellData:de,registerValidation:fe})}):o.jsxs(o.Fragment,{children:[b>0&&x===0&&o.jsx("div",{className:"h-row border-l border-neutral-300 dark:border-black-600 ml-2"}),o.jsx("div",{className:"min-h-6",children:o.jsx(X,{title:h&&e?.column?.type?.toLowerCase()!=="url"?h:void 0,hideTooltip:!h||e?.column?.type?.toLowerCase()==="url",delayShow:!0,placement:"top",children:o.jsxs("div",{className:k(`h-row top-0 font-medium font-inter overflow-index-auto whitespace-nowrap text-ellipsis dark:text-black-200 w-full absolute flex items-center ${C||"bg-white dark:bg-black-800"}`,m?"overflow-x-hidden overflow-y-visible":"overflow-x-hidden",{"border border-b-0 border-t-0 border-primary-600 dark:border-blue-800":ae?.includes(e.column.id)}),style:e?.column?.sticky&&ie?{boxShadow:Le?T.CELL_STICKY_SHADOW_DARK:T.CELL_STICKY_SHADOW_LIGHT}:{},children:[Z?.isCascading&&!xe&&x===0&&o.jsx("div",{className:k("w-[22px] h-row flex items-center px-4",`${C||"bg-white dark:bg-black-800"}`),id:"cascading",children:ye>b&&(e?.row?.original?.__has_children||Z?.showAllDropdown)&&o.jsx("div",{children:pe?o.jsx(g.LoadingSpinnerIcon,{className:"text-neutral-600 dark:text-white",size:8}):o.jsx("div",{children:be?.[t]?.isOpen?o.jsx(g.KeyboardArrowDownIcon,{size:20,className:"text-neutral-400 dark:text-neutral-400",onClick:r=>{J(),r.stopPropagation()}}):o.jsx(g.KeyboardArrowRightFilledIcon,{size:20,className:"text-neutral-400 dark:text-neutral-400",onClick:r=>{J(),r.stopPropagation()}})})})}),e?.column?.type?.toLowerCase()==="url"&&h?o.jsx(X,{title:o.jsx("div",{onMouseEnter:()=>Y(!0),onMouseLeave:()=>Y(!1),children:o.jsx("a",{href:h,target:"_blank",rel:"noopener noreferrer",onClick:r=>r.stopPropagation(),children:o.jsxs("div",{className:"flex gap-1 items-center w-full",children:[o.jsx("div",{className:"w-4 h-4",children:o.jsx(g.LinkIcon,{height:16,width:16})}),o.jsx(ze.Typography,{variant:"medium",size:"small",className:"truncate",appearance:"custom",children:h}),o.jsx(Ae.OpenInNewRounded,{sx:{height:"16px",width:"16px",color:"#016DCF"}})]})})}),placement:"top",open:De,onOpenChange:Y,className:"block w-full min-w-0 overflow-hidden",children:o.jsx("div",{className:"w-full h-row flex items-center px-4 min-w-0 overflow-hidden text-primary-400",children:o.jsx("span",{ref:j,"data-cell-content":!0,onMouseEnter:se,className:"truncate w-full",children:M&&ne&&!a.isValidElement(s)&&typeof s!="object"?M(s):s})})}):o.jsx(X,{title:U&&s&&!m?o.jsx("div",{onMouseEnter:()=>B(!0),onMouseLeave:()=>B(!1),className:"max-h-96 overflow-y-auto whitespace-pre-wrap break-words no-scroll",children:String(s)}):void 0,placement:"top",delayShow:!0,hideTooltip:!!h,open:U&&!h&&!m?$e:void 0,onOpenChange:U&&!h&&!m?B:void 0,className:k("block w-full min-w-0",m?"overflow-x-hidden overflow-y-visible":"overflow-hidden"),children:o.jsx("div",{className:k("w-full h-row flex items-center px-4 min-w-0",m?"overflow-x-hidden overflow-y-visible":"overflow-hidden"),children:o.jsx("span",{ref:m?void 0:j,"data-cell-content":!0,onMouseEnter:m?void 0:se,className:k(m?"flex min-w-0 max-w-full items-center justify-start gap-1":"truncate w-full"),children:M&&ne&&!a.isValidElement(s)&&typeof s!="object"?M(s):a.isValidElement(s)?typeof s.type=="string"?s:a.cloneElement(s,{...s.props,containerWidth:e.column.width}):s})})})]})})})]})}),W&&!I&&o.jsx("div",{className:"absolute bottom-0 left-0 right-0 h-row flex items-end pointer-events-none z-[5]",children:o.jsx("div",{className:"w-full bg-error-50 dark:bg-error-975 px-1.5 py-0.5 truncate",children:o.jsx("span",{className:"text-error-600 text-2xs font-medium leading-none",children:W})})}),_e&&!(v===e.column.key&&e?.column?.canEdit&&!K&&!e?.column?.is_disabled)&&o.jsx("div",{className:"absolute top-0 right-0 bg-white dark:bg-black-800 rounded-full w-5 h-5 flex items-center justify-center border border-primary-300 dark:border-primary-600 shadow-sm z-10",children:o.jsx(g.LoadingSpinnerIcon,{className:"text-primary-600 dark:text-white",size:8})})]},x)},Xe=a.memo(Be);exports.DataCell=Xe;
|
|
2
2
|
//# sourceMappingURL=DataCell.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataCell.cjs.js","sources":["../../../../../../src/components/data-display/infinite-table/body/cell/DataCell.tsx"],"sourcesContent":["import { useTheme } from '../../../../../hooks/useTheme';\nimport { formatCurrency } from '../../../../../utils/formatters';\nimport { formatDate } from '../../../../../utils/formatters';\nimport { getTableRowBgClassNamesByStatus } from '../../../../../constants/table';\nimport type { ICell, ICellContextMenuTarget, IPendingEdit, ValidateAndSaveResult } from '../../types';\nimport { useTableConfig } from '../../../../../providers/design-system-provider/hooks';\nimport Tooltip from '../../../../tooltip/Tooltip';\nimport { Typography } from '../../../../data-display/typography/Typography';\nimport { KeyboardArrowDownIcon, KeyboardArrowRightFilledIcon, LinkIcon, LoadingSpinnerIcon } from '../../../../icon';\nimport { OpenInNewRounded } from '@mui/icons-material';\nimport cn from 'classnames';\nimport React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { TableContext } from '../../context';\nimport { getCellText, getRowText } from '../../copy-text';\nimport { InlineEditField } from './InlineEditField';\nimport { CELL_DEFAULT_RIGHT_OFFSET, CELL_INDENT_PER_LEVEL_PX, CELL_STICKY_SHADOW_DARK, CELL_STICKY_SHADOW_LIGHT } from '../../constants';\n\ntype CellProps = {\n cell: ICell;\n id: string | number;\n nextWidthSum: number;\n isLastCell: boolean;\n rowHovering: string | number | null;\n index: number;\n isFirstStickyCell: boolean;\n handleCellClick: (e?: React.MouseEvent) => void | null;\n currentData: { is_row_modified?: boolean; is_deleted?: boolean; is_added?: boolean };\n highlightSubstring?: (value: string) => JSX.Element;\n is_read: boolean;\n is_modified: boolean;\n is_row_modified: boolean;\n is_deleted: boolean;\n is_added: boolean;\n level: number;\n inlineEditing: string | null;\n isInlineEditing?: boolean;\n setRowHovering: (id: string | number | null) => void;\n handleCellValueChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n cellRef: React.RefObject<HTMLDivElement>;\n handleUpdateCellData: (directValue?: string | boolean | null, meta?: { currency_code?: string | null; reference?: unknown | null;[key: string]: unknown | null } | null) => void;\n registerValidation?: (validateFn: () => ValidateAndSaveResult) => void;\n loadingExpand: boolean;\n toggleRowExpand: () => void;\n isDraggingOver?: boolean;\n isLoading?: boolean;\n is_incomplete?: boolean;\n pendingEdit?: IPendingEdit;\n hasPendingEdit?: boolean;\n pendingValidationError?: string | null;\n};\n\nlet interval: ReturnType<typeof setInterval> | undefined;\n\nconst formatDurationFallback = (duration: unknown): string => {\n const durationInMs = Number(duration);\n\n if (Number.isNaN(durationInMs) || duration === null || duration === undefined) {\n return '0ms';\n }\n\n if (durationInMs >= 86400000) {\n const days = Math.floor(durationInMs / 86400000);\n const hours = Math.floor((durationInMs % 86400000) / 3600000);\n const minutes = Math.floor((durationInMs % 3600000) / 60000);\n const seconds = Math.floor((durationInMs % 60000) / 1000);\n return `${days}d ${hours}h ${minutes}m ${seconds}s`;\n }\n\n if (durationInMs >= 3600000) {\n const hours = Math.floor(durationInMs / 3600000);\n const minutes = Math.floor((durationInMs % 3600000) / 60000);\n const seconds = Math.floor((durationInMs % 60000) / 1000);\n return `${hours}h ${minutes}m ${seconds}s`;\n }\n\n if (durationInMs >= 60000) {\n const minutes = Math.floor(durationInMs / 60000);\n const seconds = Math.floor((durationInMs % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n }\n\n if (durationInMs >= 1000) {\n return `${(durationInMs / 1000).toFixed(2)}s`;\n }\n\n return `${durationInMs}ms`;\n};\n\nconst CellWrapper = ({ children, withLink, linkTo, rowData, disableRowClick }: { children: React.ReactNode; withLink?: boolean; linkTo?: (id: string, _rowData?: Record<string, unknown>) => string; rowData?: Record<string, unknown>; disableRowClick?: boolean }) => {\n return withLink && !disableRowClick ? <Link to={linkTo?.(rowData?.id as string, rowData) || ''}>{children}</Link> : children;\n};\n\nconst DataCellInner: React.FC<CellProps> = ({\n cell, id, nextWidthSum, isLastCell, rowHovering, index, isFirstStickyCell, handleCellClick, currentData, highlightSubstring,\n is_read, is_modified, is_row_modified, is_deleted, is_added, level, inlineEditing, isInlineEditing, setRowHovering,\n handleCellValueChange, cellRef, handleUpdateCellData, registerValidation, loadingExpand, toggleRowExpand,\n isDraggingOver, isLoading, is_incomplete, pendingEdit, hasPendingEdit, pendingValidationError,\n}) => {\n const {\n cascadingTableConfig, originalsOnly, maxLevel, showNewItem, expandedRows, rowLinkConfig, multiSelectConfig,\n cellEditing, cellEditingValue, allowInlineEdit, fieldOperationLoading, pendingEdits: contextPendingEdits,\n selectedRowId, cellContextMenuConfig, openCellContextMenu,\n } = useContext(TableContext);\n\n const isSelectedRow =\n selectedRowId !== null && selectedRowId !== undefined && String(selectedRowId) === String(id);\n\n const tableConfig = useTableConfig();\n\n const rowCellMeta = cell?.column?.key ? (cell?.row?.original?.__cellMetadata as Record<string, Record<string, unknown>> | undefined)?.[cell.column.key] : undefined;\n const isLocked = rowCellMeta?.is_locked ?? cell?.column?.is_locked;\n const cellValidationError = (cell?.column?.key ? contextPendingEdits?.[id]?.[cell.column.key]?.validationError : null) || pendingValidationError || null;\n const isActuallyInlineEditing = inlineEditing === cell.column.key && cell?.column?.canEdit && !isLocked && !cell?.column?.is_disabled;\n const isFieldOperationLoading = fieldOperationLoading === `${id}-${cell?.column?.id}`;\n const { theme } = useTheme();\n const isDark = theme === 'dark';\n const onMouseEnter = useCallback(() => setRowHovering(id), [setRowHovering, id]);\n const onMouseLeave = useCallback(() => setRowHovering(null), [setRowHovering]);\n\n const getNodeExecutionDuration = tableConfig?.formatDuration;\n const [cellValue, setCellValue] = useState(\n cell?.column?.dataType === 'duration' && cell?.value\n ? getNodeExecutionDuration\n ? getNodeExecutionDuration(cell.value)\n : formatDurationFallback(cell.value)\n : cell.value,\n );\n const [tooltipText, setTooltipText] = useState<string | null>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n const [urlTooltipOpen, setUrlTooltipOpen] = useState(false);\n const [truncateTooltipOpen, setTruncateTooltipOpen] = useState(false);\n const textRef = useRef<HTMLSpanElement>(null);\n const urlTooltipTimer = useRef<ReturnType<typeof setTimeout>>();\n const truncateTooltipTimer = useRef<ReturnType<typeof setTimeout>>();\n const { selectedColumnIds = [] } = multiSelectConfig || {};\n const shouldHighlight = !Object.prototype.hasOwnProperty.call(cell?.column?.meta ?? {}, 'shouldHighlight') || cell?.column?.meta?.shouldHighlight;\n\n const checkTruncation = useCallback(() => {\n if (textRef.current) {\n setIsTruncated(textRef.current.scrollWidth > textRef.current.clientWidth);\n }\n }, []);\n\n const handleUrlTooltipChange = useCallback((open: boolean) => {\n if (urlTooltipTimer.current) {\n clearTimeout(urlTooltipTimer.current);\n }\n\n if (open) {\n setUrlTooltipOpen(true);\n } else {\n urlTooltipTimer.current = setTimeout(() => setUrlTooltipOpen(false), 200);\n }\n }, []);\n\n const handleTruncateTooltipChange = useCallback((open: boolean) => {\n if (truncateTooltipTimer.current) {\n clearTimeout(truncateTooltipTimer.current);\n }\n\n if (open) {\n setTruncateTooltipOpen(true);\n } else {\n truncateTooltipTimer.current = setTimeout(() => setTruncateTooltipOpen(false), 200);\n }\n }, []);\n\n const bgColor = cn({\n 'bg-amber-100 dark:bg-amber-900/30': hasPendingEdit,\n 'bg-neutral-100 dark:bg-black-600': rowHovering === id && !isInlineEditing && !hasPendingEdit && !(is_deleted || currentData?.is_deleted) && !(is_added || currentData?.is_added),\n 'bg-error-200 dark:bg-error-900': rowHovering === id && !isInlineEditing && !hasPendingEdit && (is_deleted || currentData?.is_deleted),\n 'bg-success-100 dark:bg-success-800': rowHovering === id && !isInlineEditing && !hasPendingEdit && (is_added || currentData?.is_added),\n 'bg-warning-100 dark:bg-warning-950': rowHovering === id && !isInlineEditing && !hasPendingEdit && (is_incomplete || is_modified || is_row_modified || currentData?.is_row_modified),\n // 'bg-primary-50 dark:bg-black-700': !is_incomplete && !is_read && showNewItem && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-warning-50 dark:bg-orange-900': (is_incomplete || is_modified || is_row_modified || currentData?.is_row_modified) && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-error-100 dark:bg-error-975': (is_deleted || currentData?.is_deleted) && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-success-50 dark:bg-success-900': (is_added || currentData?.is_added) && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-primary-50 dark:bg-primary-900': (isDraggingOver || isInlineEditing) && !hasPendingEdit,\n 'bg-primary-50 dark:bg-primary-800': selectedColumnIds?.includes(cell.column.id) && !isInlineEditing && !hasPendingEdit,\n 'bg-primary-50 dark:bg-primary-700': isSelectedRow && rowHovering !== id && !isInlineEditing && !hasPendingEdit && !isLoading,\n [getTableRowBgClassNamesByStatus[cell?.row?.original?.__rowBgStatus as string]]: cell?.row?.original?.__rowBgStatus && !isInlineEditing && !hasPendingEdit,\n });\n\n const onClick = (e: React.MouseEvent) => { if (cell.column?.disableRowClick) return; handleCellClick(e); };\n\n const handleContextMenu = useCallback((event: React.MouseEvent<HTMLTableCellElement>) => {\n // Keep the native menu when the table opted out, or while inline editing (cut/paste/undo).\n if (cellContextMenuConfig?.isEnabled === false || !openCellContextMenu || isActuallyInlineEditing) return;\n\n const target: ICellContextMenuTarget = {\n rowId: id,\n rowData: (cell?.row?.original ?? {}) as Record<string, unknown>,\n columnKey: cell?.column?.key ?? '',\n column: cell.column,\n value: cell?.value,\n text: getCellText(cellValue, cell?.value, event.currentTarget),\n rowText: getRowText(event.currentTarget),\n cell,\n };\n\n if (cellContextMenuConfig?.isDisabledForCell?.(target)) return;\n\n event.preventDefault();\n event.stopPropagation();\n openCellContextMenu({ x: event.clientX, y: event.clientY, target });\n }, [cellContextMenuConfig, openCellContextMenu, isActuallyInlineEditing, id, cell, cellValue]);\n\n useEffect(() => {\n const isRunning = cell?.row?.original?.status === 'running';\n if (isRunning && cell.column?.dataType === 'duration') {\n interval = setInterval(() => {\n const startedTime = new Date(formatDate((cell?.row?.original?.created_at || cell?.row?.original?.executed_on) as string | undefined, { withTime: true, format: 'yyyy-MM-dd HH:mm:ss' }) as unknown as Date);\n const timeDiff = Math.abs(new Date().getTime() - new Date(startedTime).getTime());\n setCellValue(getNodeExecutionDuration ? getNodeExecutionDuration(timeDiff) : formatDurationFallback(timeDiff));\n }, 500);\n }\n return () => { if (interval) clearInterval(interval); };\n }, [cellValue, cell.value, cell?.row?.original?.created_at, cell?.row?.original?.executed_on, cell?.row?.original?.status, cell.column?.dataType, getNodeExecutionDuration]);\n\n useEffect(() => {\n if (cell?.column?.tooltipCellKey || cell?.column?.type?.toLowerCase() === 'url') {\n if (cell?.column?.type?.toLowerCase() === 'url') setTooltipText(cell?.value as string | null);\n else setTooltipText(cell?.row?.original?.[String(cell?.column?.tooltipCellKey)] as string | null);\n }\n }, [cell?.column?.tooltipCellKey, cell?.row?.original, cell?.column?.type, cell?.value]);\n\n useEffect(() => {\n if (cell?.column?.type?.toLowerCase() === 'currency') {\n if (pendingEdit?.value !== undefined) {\n const rawData = cell?.row?.original?.__rawData as Record<string, Record<string, unknown>> | undefined;\n const headerKey = cell?.column?.Header as unknown as string;\n const currencyCode = pendingEdit?.meta?.currency_code || rawData?.[headerKey]?.currency_code || 'USD';\n setCellValue(formatCurrency(pendingEdit.value, currencyCode as string));\n } else {\n const rawData = cell?.row?.original?.__rawData as Record<string, Record<string, unknown>> | undefined;\n const headerKey = cell?.column?.Header as unknown as string;\n setCellValue(formatCurrency(cell?.value, (rawData?.[headerKey]?.currency_code as string) || 'USD'));\n }\n }\n }, [cell?.value, cell?.column?.type, cell?.column?.Header, cell?.row?.original?.__rawData, pendingEdit?.value, pendingEdit?.meta?.currency_code]);\n\n useEffect(() => {\n if (cell?.column?.type?.toLowerCase() === 'percentage') {\n if (pendingEdit?.value !== undefined) setCellValue(pendingEdit.value?.toString() + '%' || '');\n else setCellValue(cell?.value?.toString() + '%' || '');\n }\n }, [cell?.value, cell?.column?.type, pendingEdit?.value]);\n\n useEffect(() => {\n const columnType = cell?.column?.type?.toLowerCase() || '';\n if (['date', 'datetime'].includes(columnType)) {\n if (pendingEdit?.value !== undefined) {\n const hasTime = columnType === 'datetime';\n const formattedValue = formatDate(pendingEdit.value as string, { withTime: hasTime, skipTimezone: true });\n setCellValue(formattedValue || pendingEdit.value);\n } else setCellValue(cell.value);\n }\n }, [cell?.value, cell?.column?.type, pendingEdit?.value]);\n\n useEffect(() => {\n const columnType = cell?.column?.type?.toLowerCase() || '';\n if (['currency', 'percentage', 'duration', 'boolean', 'date', 'datetime'].includes(columnType)) return;\n if (pendingEdit?.value !== undefined) setCellValue(pendingEdit.value);\n else if (cell?.column?.dataType !== 'duration') setCellValue(cell.value);\n }, [cell?.value, cell?.column?.type, cell?.column?.dataType, pendingEdit?.value]);\n\n useEffect(() => {\n if (cell?.column?.type?.toLowerCase() === 'boolean' && allowInlineEdit) {\n const rawValue = pendingEdit?.value !== undefined ? pendingEdit.value : cell?.value;\n const booleanValue = rawValue === true || rawValue === 'true' || rawValue === 'True' || rawValue === 'Yes' || rawValue === 1;\n setCellValue(booleanValue ? 'Yes' : 'No');\n }\n }, [cell?.value, cell?.column?.type, allowInlineEdit, pendingEdit?.value]);\n\n useEffect(() => {\n return () => {\n if (urlTooltipTimer.current) {\n clearTimeout(urlTooltipTimer.current);\n }\n if (truncateTooltipTimer.current) {\n clearTimeout(truncateTooltipTimer.current);\n }\n };\n }, []);\n\n const isUiElementCell = React.isValidElement(cellValue);\n\n return (\n <td\n key={index} id={cell.value as string | undefined} data-column-key={cell?.column?.key} {...cell.getCellProps()}\n onClick={rowLinkConfig?.isEnabled ? undefined : onClick}\n className={cn('h-row', {\n 'sticky left-0': cell?.column?.sticky,\n relative: !cell?.column?.sticky,\n 'w-full': isLastCell,\n 'overflow-visible': inlineEditing === cell.column.key,\n /** Chips/badges: avoid vertical clip from overflow-x-hidden + truncate (see isUiElementCell branch below) */\n 'overflow-x-hidden overflow-y-visible': inlineEditing !== cell.column.key && isUiElementCell,\n 'overflow-hidden': inlineEditing !== cell.column.key && !isUiElementCell,\n },\n cellValidationError && !isActuallyInlineEditing ? 'outline outline-2 outline-error-500 -outline-offset-2 z-[5]' : '',\n `${bgColor ? bgColor : 'bg-white dark:bg-black-800'}`,\n )}\n style={{ minWidth: `${cell.column.width}px`, maxWidth: `${cell.column.width}px`, right: cell?.column?.sticky ? `${nextWidthSum}px` : CELL_DEFAULT_RIGHT_OFFSET, paddingLeft: level > 0 && index === 0 ? `${level * CELL_INDENT_PER_LEVEL_PX}px` : undefined }}\n onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}\n onContextMenu={handleContextMenu}\n >\n <CellWrapper withLink={rowLinkConfig?.isEnabled} linkTo={rowLinkConfig?.linkTo || undefined} rowData={cell?.row?.original} disableRowClick={cell?.column?.disableRowClick}>\n {(Array.isArray(cellEditing) ? cellEditing.includes(`${id}-${cell?.column?.id}`) : cellEditing === `${id}-${cell?.column?.id}`) ? (\n <div className='h-row top-0 font-medium font-inter w-full absolute flex items-center px-4'>\n <span className='text-neutral-400 dark:text-black-400 truncate'>\n {(() => {\n const currentCellId = `${id}-${cell?.column?.id}`;\n const editValue = typeof cellEditingValue === 'object' ? cellEditingValue?.[currentCellId] : cellEditingValue;\n const columnType = cell?.column?.type?.toLowerCase();\n\n if (columnType === 'boolean') {\n return (editValue as unknown) === true || editValue === 'true' || editValue === 'True' ? 'Yes' : 'No';\n }\n\n if ((columnType === 'date' || columnType === 'datetime') && editValue) {\n const hasTime = columnType === 'datetime';\n return formatDate(editValue as string, { withTime: hasTime, skipTimezone: true }) || String(editValue);\n }\n\n return editValue !== undefined && editValue !== null ? String(editValue) : (cellValue as React.ReactNode);\n })()}\n </span>\n <div className='ml-2 flex items-center gap-1.5'><LoadingSpinnerIcon className='spinner text-neutral-600 dark:text-white' size={12} /></div>\n </div>\n ) : inlineEditing === cell.column.key && cell?.column?.canEdit && !isLocked && !cell?.column?.is_disabled ? (\n <div className='h-row w-full absolute top-0 left-0 flex items-center' style={{ marginLeft: level > 0 && index === 0 ? `-${level * CELL_INDENT_PER_LEVEL_PX}px` : undefined, width: level > 0 && index === 0 ? `calc(100% + ${level * CELL_INDENT_PER_LEVEL_PX}px)` : '100%' }}>\n <InlineEditField cell={cell} id={id} inlineEditing={inlineEditing} cellRef={cellRef} handleCellValueChange={handleCellValueChange} handleUpdateCellData={handleUpdateCellData} registerValidation={registerValidation} />\n </div>\n ) : (\n <>\n {level > 0 && index === 0 && <div className='h-row border-l border-neutral-300 dark:border-black-600 ml-2' />}\n <div className='min-h-6'>\n <Tooltip\n title={tooltipText && cell?.column?.type?.toLowerCase() !== 'url' ? tooltipText : undefined}\n hideTooltip={!tooltipText || cell?.column?.type?.toLowerCase() === 'url'}\n delayShow\n placement='top'\n >\n <div className={cn(`h-row top-0 font-medium font-inter overflow-index-auto whitespace-nowrap text-ellipsis dark:text-black-200 w-full absolute flex items-center ${bgColor ? bgColor : 'bg-white dark:bg-black-800'}`, isUiElementCell ? 'overflow-x-hidden overflow-y-visible' : 'overflow-x-hidden', { 'border border-b-0 border-t-0 border-primary-600 dark:border-blue-800': selectedColumnIds?.includes(cell.column.id) })}\n style={cell?.column?.sticky && isFirstStickyCell ? { boxShadow: isDark ? CELL_STICKY_SHADOW_DARK : CELL_STICKY_SHADOW_LIGHT } : {}}>\n {cascadingTableConfig?.isCascading && !originalsOnly && index === 0 && (\n <div className={cn('w-[22px] h-row flex items-center px-4', `${bgColor ? bgColor : 'bg-white dark:bg-black-800'}`)} id='cascading'>\n {maxLevel! > level && (cell?.row?.original?.__has_children || cascadingTableConfig?.showAllDropdown) && (\n <div>{loadingExpand ? <LoadingSpinnerIcon className='text-neutral-600 dark:text-white' size={8} /> : <div>{expandedRows?.[id]?.isOpen ? <KeyboardArrowDownIcon size={20} className='text-neutral-400 dark:text-neutral-400' onClick={(e) => { toggleRowExpand(); e.stopPropagation(); }} /> : <KeyboardArrowRightFilledIcon size={20} className='text-neutral-400 dark:text-neutral-400' onClick={(e) => { toggleRowExpand(); e.stopPropagation(); }} />}</div>}</div>\n )}\n </div>\n )}\n\n {cell?.column?.type?.toLowerCase() === 'url' && tooltipText ? (\n <Tooltip\n title={(\n <div onMouseEnter={() => handleUrlTooltipChange(true)} onMouseLeave={() => handleUrlTooltipChange(false)}>\n <a href={tooltipText} target='_blank' rel='noopener noreferrer' onClick={(e) => e.stopPropagation()}>\n <div className='flex gap-1 items-center w-full'>\n <div className='w-4 h-4'>\n <LinkIcon height={16} width={16} />\n </div>\n <Typography variant='medium' size='small' className='truncate' appearance='custom'>{tooltipText}</Typography>\n <OpenInNewRounded sx={{ height: '16px', width: '16px', color: '#016DCF' }} />\n </div>\n </a>\n </div>\n )}\n placement='top'\n open={urlTooltipOpen}\n onOpenChange={handleUrlTooltipChange}\n className='block w-full min-w-0 overflow-hidden'\n >\n <div className='w-full h-row flex items-center px-4 min-w-0 overflow-hidden text-primary-400'>\n <span ref={textRef} data-cell-content onMouseEnter={checkTruncation} className='truncate w-full'>\n {highlightSubstring && shouldHighlight && !React.isValidElement(cellValue) && typeof cellValue !== 'object'\n ? highlightSubstring(cellValue as string)\n : cellValue as React.ReactNode}\n </span>\n </div>\n </Tooltip>\n ) : (\n <Tooltip\n title={\n isTruncated && cellValue && !isUiElementCell ? (\n <div\n onMouseEnter={() => handleTruncateTooltipChange(true)}\n onMouseLeave={() => handleTruncateTooltipChange(false)}\n className='max-h-96 overflow-y-auto whitespace-pre-wrap break-words no-scroll'\n >\n {String(cellValue)}\n </div>\n ) : undefined\n }\n placement='top'\n delayShow\n hideTooltip={!!tooltipText}\n open={isTruncated && !tooltipText && !isUiElementCell ? truncateTooltipOpen : undefined}\n onOpenChange={isTruncated && !tooltipText && !isUiElementCell ? handleTruncateTooltipChange : undefined}\n className={cn('block w-full min-w-0', isUiElementCell ? 'overflow-x-hidden overflow-y-visible' : 'overflow-hidden')}\n >\n <div className={cn('w-full h-row flex items-center px-4 min-w-0', isUiElementCell ? 'overflow-x-hidden overflow-y-visible' : 'overflow-hidden')}>\n <span\n ref={isUiElementCell ? undefined : textRef}\n data-cell-content\n onMouseEnter={isUiElementCell ? undefined : checkTruncation}\n className={cn(isUiElementCell ? 'flex min-w-0 max-w-full items-center justify-start gap-1' : 'truncate w-full')}\n >\n {highlightSubstring && shouldHighlight && !React.isValidElement(cellValue) && typeof cellValue !== 'object'\n ? highlightSubstring(cellValue as string)\n : React.isValidElement(cellValue)\n ? (typeof (cellValue as React.ReactElement<Record<string, unknown>>).type === 'string'\n ? cellValue\n : React.cloneElement(cellValue as React.ReactElement<Record<string, unknown>>, {\n ...((cellValue as React.ReactElement<Record<string, unknown>>).props as Record<string, unknown>),\n containerWidth: cell.column.width,\n }))\n : cellValue as React.ReactNode}\n </span>\n </div>\n </Tooltip>\n )}\n </div>\n </Tooltip>\n </div>\n </>\n )}\n </CellWrapper>\n {cellValidationError && !isActuallyInlineEditing && (\n <div className='absolute bottom-0 left-0 right-0 h-row flex items-end pointer-events-none z-[5]'>\n <div className='w-full bg-error-50 dark:bg-error-975 px-1.5 py-0.5 truncate'><span className='text-error-600 text-2xs font-medium leading-none'>{cellValidationError}</span></div>\n </div>\n )}\n {isFieldOperationLoading && !(inlineEditing === cell.column.key && cell?.column?.canEdit && !isLocked && !cell?.column?.is_disabled) && (\n <div className='absolute top-0 right-0 bg-white dark:bg-black-800 rounded-full w-5 h-5 flex items-center justify-center border border-primary-300 dark:border-primary-600 shadow-sm z-10'>\n <LoadingSpinnerIcon className='text-primary-600 dark:text-white' size={8} />\n </div>\n )}\n </td>\n );\n};\n\nexport const DataCell = React.memo(DataCellInner);\n"],"names":["interval","formatDurationFallback","duration","durationInMs","days","hours","minutes","seconds","CellWrapper","children","withLink","linkTo","rowData","disableRowClick","jsx","Link","DataCellInner","cell","id","nextWidthSum","isLastCell","rowHovering","index","isFirstStickyCell","handleCellClick","currentData","highlightSubstring","is_read","is_modified","is_row_modified","is_deleted","is_added","level","inlineEditing","isInlineEditing","setRowHovering","handleCellValueChange","cellRef","handleUpdateCellData","registerValidation","loadingExpand","toggleRowExpand","isDraggingOver","isLoading","is_incomplete","pendingEdit","hasPendingEdit","pendingValidationError","cascadingTableConfig","originalsOnly","maxLevel","showNewItem","expandedRows","rowLinkConfig","multiSelectConfig","cellEditing","cellEditingValue","allowInlineEdit","fieldOperationLoading","contextPendingEdits","selectedRowId","cellContextMenuConfig","openCellContextMenu","useContext","TableContext","isSelectedRow","tableConfig","useTableConfig","isLocked","cellValidationError","isActuallyInlineEditing","isFieldOperationLoading","theme","useTheme","isDark","onMouseEnter","useCallback","onMouseLeave","getNodeExecutionDuration","cellValue","setCellValue","useState","tooltipText","setTooltipText","isTruncated","setIsTruncated","urlTooltipOpen","setUrlTooltipOpen","truncateTooltipOpen","setTruncateTooltipOpen","textRef","useRef","urlTooltipTimer","truncateTooltipTimer","selectedColumnIds","shouldHighlight","checkTruncation","handleUrlTooltipChange","open","handleTruncateTooltipChange","bgColor","cn","getTableRowBgClassNamesByStatus","onClick","e","handleContextMenu","event","target","getCellText","getRowText","useEffect","startedTime","formatDate","timeDiff","rawData","headerKey","currencyCode","formatCurrency","columnType","hasTime","formattedValue","rawValue","isUiElementCell","React","jsxs","CELL_DEFAULT_RIGHT_OFFSET","CELL_INDENT_PER_LEVEL_PX","currentCellId","editValue","LoadingSpinnerIcon","InlineEditField","Fragment","Tooltip","CELL_STICKY_SHADOW_DARK","CELL_STICKY_SHADOW_LIGHT","KeyboardArrowDownIcon","KeyboardArrowRightFilledIcon","LinkIcon","Typography","OpenInNewRounded","DataCell"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataCell.cjs.js","sources":["../../../../../../src/components/data-display/infinite-table/body/cell/DataCell.tsx"],"sourcesContent":["import { useTheme } from '../../../../../hooks/useTheme';\nimport { formatCurrency } from '../../../../../utils/formatters';\nimport { formatDate } from '../../../../../utils/formatters';\nimport { getTableRowBgClassNamesByStatus } from '../../../../../constants/table';\nimport type { ICell, ICellContextMenuTarget, IPendingEdit, ValidateAndSaveResult } from '../../types';\nimport { useTableConfig } from '../../../../../providers/design-system-provider/hooks';\nimport Tooltip from '../../../../tooltip/Tooltip';\nimport { Typography } from '../../../../data-display/typography/Typography';\nimport { KeyboardArrowDownIcon, KeyboardArrowRightFilledIcon, LinkIcon, LoadingSpinnerIcon } from '../../../../icon';\nimport { OpenInNewRounded } from '@mui/icons-material';\nimport cn from 'classnames';\nimport React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { TableContext } from '../../context';\nimport { getCellText } from '../../copy-text';\nimport { InlineEditField } from './InlineEditField';\nimport { CELL_DEFAULT_RIGHT_OFFSET, CELL_INDENT_PER_LEVEL_PX, CELL_STICKY_SHADOW_DARK, CELL_STICKY_SHADOW_LIGHT } from '../../constants';\n\ntype CellProps = {\n cell: ICell;\n id: string | number;\n nextWidthSum: number;\n isLastCell: boolean;\n rowHovering: string | number | null;\n index: number;\n isFirstStickyCell: boolean;\n handleCellClick: (e?: React.MouseEvent) => void | null;\n currentData: { is_row_modified?: boolean; is_deleted?: boolean; is_added?: boolean };\n highlightSubstring?: (value: string) => JSX.Element;\n is_read: boolean;\n is_modified: boolean;\n is_row_modified: boolean;\n is_deleted: boolean;\n is_added: boolean;\n level: number;\n inlineEditing: string | null;\n isInlineEditing?: boolean;\n setRowHovering: (id: string | number | null) => void;\n handleCellValueChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n cellRef: React.RefObject<HTMLDivElement>;\n handleUpdateCellData: (directValue?: string | boolean | null, meta?: { currency_code?: string | null; reference?: unknown | null;[key: string]: unknown | null } | null) => void;\n registerValidation?: (validateFn: () => ValidateAndSaveResult) => void;\n loadingExpand: boolean;\n toggleRowExpand: () => void;\n isDraggingOver?: boolean;\n isLoading?: boolean;\n is_incomplete?: boolean;\n pendingEdit?: IPendingEdit;\n hasPendingEdit?: boolean;\n pendingValidationError?: string | null;\n};\n\nlet interval: ReturnType<typeof setInterval> | undefined;\n\nconst formatDurationFallback = (duration: unknown): string => {\n const durationInMs = Number(duration);\n\n if (Number.isNaN(durationInMs) || duration === null || duration === undefined) {\n return '0ms';\n }\n\n if (durationInMs >= 86400000) {\n const days = Math.floor(durationInMs / 86400000);\n const hours = Math.floor((durationInMs % 86400000) / 3600000);\n const minutes = Math.floor((durationInMs % 3600000) / 60000);\n const seconds = Math.floor((durationInMs % 60000) / 1000);\n return `${days}d ${hours}h ${minutes}m ${seconds}s`;\n }\n\n if (durationInMs >= 3600000) {\n const hours = Math.floor(durationInMs / 3600000);\n const minutes = Math.floor((durationInMs % 3600000) / 60000);\n const seconds = Math.floor((durationInMs % 60000) / 1000);\n return `${hours}h ${minutes}m ${seconds}s`;\n }\n\n if (durationInMs >= 60000) {\n const minutes = Math.floor(durationInMs / 60000);\n const seconds = Math.floor((durationInMs % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n }\n\n if (durationInMs >= 1000) {\n return `${(durationInMs / 1000).toFixed(2)}s`;\n }\n\n return `${durationInMs}ms`;\n};\n\nconst CellWrapper = ({ children, withLink, linkTo, rowData, disableRowClick }: { children: React.ReactNode; withLink?: boolean; linkTo?: (id: string, _rowData?: Record<string, unknown>) => string; rowData?: Record<string, unknown>; disableRowClick?: boolean }) => {\n return withLink && !disableRowClick ? <Link to={linkTo?.(rowData?.id as string, rowData) || ''}>{children}</Link> : children;\n};\n\nconst DataCellInner: React.FC<CellProps> = ({\n cell, id, nextWidthSum, isLastCell, rowHovering, index, isFirstStickyCell, handleCellClick, currentData, highlightSubstring,\n is_read, is_modified, is_row_modified, is_deleted, is_added, level, inlineEditing, isInlineEditing, setRowHovering,\n handleCellValueChange, cellRef, handleUpdateCellData, registerValidation, loadingExpand, toggleRowExpand,\n isDraggingOver, isLoading, is_incomplete, pendingEdit, hasPendingEdit, pendingValidationError,\n}) => {\n const {\n cascadingTableConfig, originalsOnly, maxLevel, showNewItem, expandedRows, rowLinkConfig, multiSelectConfig,\n cellEditing, cellEditingValue, allowInlineEdit, fieldOperationLoading, pendingEdits: contextPendingEdits,\n selectedRowId, cellContextMenuConfig, openCellContextMenu,\n } = useContext(TableContext);\n\n const isSelectedRow =\n selectedRowId !== null && selectedRowId !== undefined && String(selectedRowId) === String(id);\n\n const tableConfig = useTableConfig();\n\n const rowCellMeta = cell?.column?.key ? (cell?.row?.original?.__cellMetadata as Record<string, Record<string, unknown>> | undefined)?.[cell.column.key] : undefined;\n const isLocked = rowCellMeta?.is_locked ?? cell?.column?.is_locked;\n const cellValidationError = (cell?.column?.key ? contextPendingEdits?.[id]?.[cell.column.key]?.validationError : null) || pendingValidationError || null;\n const isActuallyInlineEditing = inlineEditing === cell.column.key && cell?.column?.canEdit && !isLocked && !cell?.column?.is_disabled;\n const isFieldOperationLoading = fieldOperationLoading === `${id}-${cell?.column?.id}`;\n const { theme } = useTheme();\n const isDark = theme === 'dark';\n const onMouseEnter = useCallback(() => setRowHovering(id), [setRowHovering, id]);\n const onMouseLeave = useCallback(() => setRowHovering(null), [setRowHovering]);\n\n const getNodeExecutionDuration = tableConfig?.formatDuration;\n const [cellValue, setCellValue] = useState(\n cell?.column?.dataType === 'duration' && cell?.value\n ? getNodeExecutionDuration\n ? getNodeExecutionDuration(cell.value)\n : formatDurationFallback(cell.value)\n : cell.value,\n );\n const [tooltipText, setTooltipText] = useState<string | null>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n const [urlTooltipOpen, setUrlTooltipOpen] = useState(false);\n const [truncateTooltipOpen, setTruncateTooltipOpen] = useState(false);\n const textRef = useRef<HTMLSpanElement>(null);\n const urlTooltipTimer = useRef<ReturnType<typeof setTimeout>>();\n const truncateTooltipTimer = useRef<ReturnType<typeof setTimeout>>();\n const { selectedColumnIds = [] } = multiSelectConfig || {};\n const shouldHighlight = !Object.prototype.hasOwnProperty.call(cell?.column?.meta ?? {}, 'shouldHighlight') || cell?.column?.meta?.shouldHighlight;\n\n const checkTruncation = useCallback(() => {\n if (textRef.current) {\n setIsTruncated(textRef.current.scrollWidth > textRef.current.clientWidth);\n }\n }, []);\n\n const handleUrlTooltipChange = useCallback((open: boolean) => {\n if (urlTooltipTimer.current) {\n clearTimeout(urlTooltipTimer.current);\n }\n\n if (open) {\n setUrlTooltipOpen(true);\n } else {\n urlTooltipTimer.current = setTimeout(() => setUrlTooltipOpen(false), 200);\n }\n }, []);\n\n const handleTruncateTooltipChange = useCallback((open: boolean) => {\n if (truncateTooltipTimer.current) {\n clearTimeout(truncateTooltipTimer.current);\n }\n\n if (open) {\n setTruncateTooltipOpen(true);\n } else {\n truncateTooltipTimer.current = setTimeout(() => setTruncateTooltipOpen(false), 200);\n }\n }, []);\n\n const bgColor = cn({\n 'bg-amber-100 dark:bg-amber-900/30': hasPendingEdit,\n 'bg-neutral-100 dark:bg-black-600': rowHovering === id && !isInlineEditing && !hasPendingEdit && !(is_deleted || currentData?.is_deleted) && !(is_added || currentData?.is_added),\n 'bg-error-200 dark:bg-error-900': rowHovering === id && !isInlineEditing && !hasPendingEdit && (is_deleted || currentData?.is_deleted),\n 'bg-success-100 dark:bg-success-800': rowHovering === id && !isInlineEditing && !hasPendingEdit && (is_added || currentData?.is_added),\n 'bg-warning-100 dark:bg-warning-950': rowHovering === id && !isInlineEditing && !hasPendingEdit && (is_incomplete || is_modified || is_row_modified || currentData?.is_row_modified),\n // 'bg-primary-50 dark:bg-black-700': !is_incomplete && !is_read && showNewItem && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-warning-50 dark:bg-orange-900': (is_incomplete || is_modified || is_row_modified || currentData?.is_row_modified) && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-error-100 dark:bg-error-975': (is_deleted || currentData?.is_deleted) && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-success-50 dark:bg-success-900': (is_added || currentData?.is_added) && !isLoading && rowHovering !== id && !isInlineEditing && !hasPendingEdit,\n 'bg-primary-50 dark:bg-primary-900': (isDraggingOver || isInlineEditing) && !hasPendingEdit,\n 'bg-primary-50 dark:bg-primary-800': selectedColumnIds?.includes(cell.column.id) && !isInlineEditing && !hasPendingEdit,\n 'bg-primary-50 dark:bg-primary-700': isSelectedRow && rowHovering !== id && !isInlineEditing && !hasPendingEdit && !isLoading,\n [getTableRowBgClassNamesByStatus[cell?.row?.original?.__rowBgStatus as string]]: cell?.row?.original?.__rowBgStatus && !isInlineEditing && !hasPendingEdit,\n });\n\n const onClick = (e: React.MouseEvent) => { if (cell.column?.disableRowClick) return; handleCellClick(e); };\n\n const handleContextMenu = useCallback((event: React.MouseEvent<HTMLTableCellElement>) => {\n // Keep the native menu when the table opted out, or while inline editing (cut/paste/undo).\n if (cellContextMenuConfig?.isEnabled === false || !openCellContextMenu || isActuallyInlineEditing) return;\n\n const target: ICellContextMenuTarget = {\n rowId: id,\n rowData: (cell?.row?.original ?? {}) as Record<string, unknown>,\n columnKey: cell?.column?.key ?? '',\n column: cell.column,\n value: cell?.value,\n text: getCellText(cellValue, cell?.value, event.currentTarget),\n cell,\n };\n\n if (cellContextMenuConfig?.isDisabledForCell?.(target)) return;\n\n event.preventDefault();\n event.stopPropagation();\n openCellContextMenu({ x: event.clientX, y: event.clientY, target });\n }, [cellContextMenuConfig, openCellContextMenu, isActuallyInlineEditing, id, cell, cellValue]);\n\n useEffect(() => {\n const isRunning = cell?.row?.original?.status === 'running';\n if (isRunning && cell.column?.dataType === 'duration') {\n interval = setInterval(() => {\n const startedTime = new Date(formatDate((cell?.row?.original?.created_at || cell?.row?.original?.executed_on) as string | undefined, { withTime: true, format: 'yyyy-MM-dd HH:mm:ss' }) as unknown as Date);\n const timeDiff = Math.abs(new Date().getTime() - new Date(startedTime).getTime());\n setCellValue(getNodeExecutionDuration ? getNodeExecutionDuration(timeDiff) : formatDurationFallback(timeDiff));\n }, 500);\n }\n return () => { if (interval) clearInterval(interval); };\n }, [cellValue, cell.value, cell?.row?.original?.created_at, cell?.row?.original?.executed_on, cell?.row?.original?.status, cell.column?.dataType, getNodeExecutionDuration]);\n\n useEffect(() => {\n if (cell?.column?.tooltipCellKey || cell?.column?.type?.toLowerCase() === 'url') {\n if (cell?.column?.type?.toLowerCase() === 'url') setTooltipText(cell?.value as string | null);\n else setTooltipText(cell?.row?.original?.[String(cell?.column?.tooltipCellKey)] as string | null);\n }\n }, [cell?.column?.tooltipCellKey, cell?.row?.original, cell?.column?.type, cell?.value]);\n\n useEffect(() => {\n if (cell?.column?.type?.toLowerCase() === 'currency') {\n if (pendingEdit?.value !== undefined) {\n const rawData = cell?.row?.original?.__rawData as Record<string, Record<string, unknown>> | undefined;\n const headerKey = cell?.column?.Header as unknown as string;\n const currencyCode = pendingEdit?.meta?.currency_code || rawData?.[headerKey]?.currency_code || 'USD';\n setCellValue(formatCurrency(pendingEdit.value, currencyCode as string));\n } else {\n const rawData = cell?.row?.original?.__rawData as Record<string, Record<string, unknown>> | undefined;\n const headerKey = cell?.column?.Header as unknown as string;\n setCellValue(formatCurrency(cell?.value, (rawData?.[headerKey]?.currency_code as string) || 'USD'));\n }\n }\n }, [cell?.value, cell?.column?.type, cell?.column?.Header, cell?.row?.original?.__rawData, pendingEdit?.value, pendingEdit?.meta?.currency_code]);\n\n useEffect(() => {\n if (cell?.column?.type?.toLowerCase() === 'percentage') {\n if (pendingEdit?.value !== undefined) setCellValue(pendingEdit.value?.toString() + '%' || '');\n else setCellValue(cell?.value?.toString() + '%' || '');\n }\n }, [cell?.value, cell?.column?.type, pendingEdit?.value]);\n\n useEffect(() => {\n const columnType = cell?.column?.type?.toLowerCase() || '';\n if (['date', 'datetime'].includes(columnType)) {\n if (pendingEdit?.value !== undefined) {\n const hasTime = columnType === 'datetime';\n const formattedValue = formatDate(pendingEdit.value as string, { withTime: hasTime, skipTimezone: true });\n setCellValue(formattedValue || pendingEdit.value);\n } else setCellValue(cell.value);\n }\n }, [cell?.value, cell?.column?.type, pendingEdit?.value]);\n\n useEffect(() => {\n const columnType = cell?.column?.type?.toLowerCase() || '';\n if (['currency', 'percentage', 'duration', 'boolean', 'date', 'datetime'].includes(columnType)) return;\n if (pendingEdit?.value !== undefined) setCellValue(pendingEdit.value);\n else if (cell?.column?.dataType !== 'duration') setCellValue(cell.value);\n }, [cell?.value, cell?.column?.type, cell?.column?.dataType, pendingEdit?.value]);\n\n useEffect(() => {\n if (cell?.column?.type?.toLowerCase() === 'boolean' && allowInlineEdit) {\n const rawValue = pendingEdit?.value !== undefined ? pendingEdit.value : cell?.value;\n const booleanValue = rawValue === true || rawValue === 'true' || rawValue === 'True' || rawValue === 'Yes' || rawValue === 1;\n setCellValue(booleanValue ? 'Yes' : 'No');\n }\n }, [cell?.value, cell?.column?.type, allowInlineEdit, pendingEdit?.value]);\n\n useEffect(() => {\n return () => {\n if (urlTooltipTimer.current) {\n clearTimeout(urlTooltipTimer.current);\n }\n if (truncateTooltipTimer.current) {\n clearTimeout(truncateTooltipTimer.current);\n }\n };\n }, []);\n\n const isUiElementCell = React.isValidElement(cellValue);\n\n return (\n <td\n key={index} id={cell.value as string | undefined} data-column-key={cell?.column?.key} {...cell.getCellProps()}\n onClick={rowLinkConfig?.isEnabled ? undefined : onClick}\n className={cn('h-row', {\n 'sticky left-0': cell?.column?.sticky,\n relative: !cell?.column?.sticky,\n 'w-full': isLastCell,\n 'overflow-visible': inlineEditing === cell.column.key,\n /** Chips/badges: avoid vertical clip from overflow-x-hidden + truncate (see isUiElementCell branch below) */\n 'overflow-x-hidden overflow-y-visible': inlineEditing !== cell.column.key && isUiElementCell,\n 'overflow-hidden': inlineEditing !== cell.column.key && !isUiElementCell,\n },\n cellValidationError && !isActuallyInlineEditing ? 'outline outline-2 outline-error-500 -outline-offset-2 z-[5]' : '',\n `${bgColor ? bgColor : 'bg-white dark:bg-black-800'}`,\n )}\n style={{ minWidth: `${cell.column.width}px`, maxWidth: `${cell.column.width}px`, right: cell?.column?.sticky ? `${nextWidthSum}px` : CELL_DEFAULT_RIGHT_OFFSET, paddingLeft: level > 0 && index === 0 ? `${level * CELL_INDENT_PER_LEVEL_PX}px` : undefined }}\n onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}\n onContextMenu={handleContextMenu}\n >\n <CellWrapper withLink={rowLinkConfig?.isEnabled} linkTo={rowLinkConfig?.linkTo || undefined} rowData={cell?.row?.original} disableRowClick={cell?.column?.disableRowClick}>\n {(Array.isArray(cellEditing) ? cellEditing.includes(`${id}-${cell?.column?.id}`) : cellEditing === `${id}-${cell?.column?.id}`) ? (\n <div className='h-row top-0 font-medium font-inter w-full absolute flex items-center px-4'>\n <span className='text-neutral-400 dark:text-black-400 truncate'>\n {(() => {\n const currentCellId = `${id}-${cell?.column?.id}`;\n const editValue = typeof cellEditingValue === 'object' ? cellEditingValue?.[currentCellId] : cellEditingValue;\n const columnType = cell?.column?.type?.toLowerCase();\n\n if (columnType === 'boolean') {\n return (editValue as unknown) === true || editValue === 'true' || editValue === 'True' ? 'Yes' : 'No';\n }\n\n if ((columnType === 'date' || columnType === 'datetime') && editValue) {\n const hasTime = columnType === 'datetime';\n return formatDate(editValue as string, { withTime: hasTime, skipTimezone: true }) || String(editValue);\n }\n\n return editValue !== undefined && editValue !== null ? String(editValue) : (cellValue as React.ReactNode);\n })()}\n </span>\n <div className='ml-2 flex items-center gap-1.5'><LoadingSpinnerIcon className='spinner text-neutral-600 dark:text-white' size={12} /></div>\n </div>\n ) : inlineEditing === cell.column.key && cell?.column?.canEdit && !isLocked && !cell?.column?.is_disabled ? (\n <div className='h-row w-full absolute top-0 left-0 flex items-center' style={{ marginLeft: level > 0 && index === 0 ? `-${level * CELL_INDENT_PER_LEVEL_PX}px` : undefined, width: level > 0 && index === 0 ? `calc(100% + ${level * CELL_INDENT_PER_LEVEL_PX}px)` : '100%' }}>\n <InlineEditField cell={cell} id={id} inlineEditing={inlineEditing} cellRef={cellRef} handleCellValueChange={handleCellValueChange} handleUpdateCellData={handleUpdateCellData} registerValidation={registerValidation} />\n </div>\n ) : (\n <>\n {level > 0 && index === 0 && <div className='h-row border-l border-neutral-300 dark:border-black-600 ml-2' />}\n <div className='min-h-6'>\n <Tooltip\n title={tooltipText && cell?.column?.type?.toLowerCase() !== 'url' ? tooltipText : undefined}\n hideTooltip={!tooltipText || cell?.column?.type?.toLowerCase() === 'url'}\n delayShow\n placement='top'\n >\n <div className={cn(`h-row top-0 font-medium font-inter overflow-index-auto whitespace-nowrap text-ellipsis dark:text-black-200 w-full absolute flex items-center ${bgColor ? bgColor : 'bg-white dark:bg-black-800'}`, isUiElementCell ? 'overflow-x-hidden overflow-y-visible' : 'overflow-x-hidden', { 'border border-b-0 border-t-0 border-primary-600 dark:border-blue-800': selectedColumnIds?.includes(cell.column.id) })}\n style={cell?.column?.sticky && isFirstStickyCell ? { boxShadow: isDark ? CELL_STICKY_SHADOW_DARK : CELL_STICKY_SHADOW_LIGHT } : {}}>\n {cascadingTableConfig?.isCascading && !originalsOnly && index === 0 && (\n <div className={cn('w-[22px] h-row flex items-center px-4', `${bgColor ? bgColor : 'bg-white dark:bg-black-800'}`)} id='cascading'>\n {maxLevel! > level && (cell?.row?.original?.__has_children || cascadingTableConfig?.showAllDropdown) && (\n <div>{loadingExpand ? <LoadingSpinnerIcon className='text-neutral-600 dark:text-white' size={8} /> : <div>{expandedRows?.[id]?.isOpen ? <KeyboardArrowDownIcon size={20} className='text-neutral-400 dark:text-neutral-400' onClick={(e) => { toggleRowExpand(); e.stopPropagation(); }} /> : <KeyboardArrowRightFilledIcon size={20} className='text-neutral-400 dark:text-neutral-400' onClick={(e) => { toggleRowExpand(); e.stopPropagation(); }} />}</div>}</div>\n )}\n </div>\n )}\n\n {cell?.column?.type?.toLowerCase() === 'url' && tooltipText ? (\n <Tooltip\n title={(\n <div onMouseEnter={() => handleUrlTooltipChange(true)} onMouseLeave={() => handleUrlTooltipChange(false)}>\n <a href={tooltipText} target='_blank' rel='noopener noreferrer' onClick={(e) => e.stopPropagation()}>\n <div className='flex gap-1 items-center w-full'>\n <div className='w-4 h-4'>\n <LinkIcon height={16} width={16} />\n </div>\n <Typography variant='medium' size='small' className='truncate' appearance='custom'>{tooltipText}</Typography>\n <OpenInNewRounded sx={{ height: '16px', width: '16px', color: '#016DCF' }} />\n </div>\n </a>\n </div>\n )}\n placement='top'\n open={urlTooltipOpen}\n onOpenChange={handleUrlTooltipChange}\n className='block w-full min-w-0 overflow-hidden'\n >\n <div className='w-full h-row flex items-center px-4 min-w-0 overflow-hidden text-primary-400'>\n <span ref={textRef} data-cell-content onMouseEnter={checkTruncation} className='truncate w-full'>\n {highlightSubstring && shouldHighlight && !React.isValidElement(cellValue) && typeof cellValue !== 'object'\n ? highlightSubstring(cellValue as string)\n : cellValue as React.ReactNode}\n </span>\n </div>\n </Tooltip>\n ) : (\n <Tooltip\n title={\n isTruncated && cellValue && !isUiElementCell ? (\n <div\n onMouseEnter={() => handleTruncateTooltipChange(true)}\n onMouseLeave={() => handleTruncateTooltipChange(false)}\n className='max-h-96 overflow-y-auto whitespace-pre-wrap break-words no-scroll'\n >\n {String(cellValue)}\n </div>\n ) : undefined\n }\n placement='top'\n delayShow\n hideTooltip={!!tooltipText}\n open={isTruncated && !tooltipText && !isUiElementCell ? truncateTooltipOpen : undefined}\n onOpenChange={isTruncated && !tooltipText && !isUiElementCell ? handleTruncateTooltipChange : undefined}\n className={cn('block w-full min-w-0', isUiElementCell ? 'overflow-x-hidden overflow-y-visible' : 'overflow-hidden')}\n >\n <div className={cn('w-full h-row flex items-center px-4 min-w-0', isUiElementCell ? 'overflow-x-hidden overflow-y-visible' : 'overflow-hidden')}>\n <span\n ref={isUiElementCell ? undefined : textRef}\n data-cell-content\n onMouseEnter={isUiElementCell ? undefined : checkTruncation}\n className={cn(isUiElementCell ? 'flex min-w-0 max-w-full items-center justify-start gap-1' : 'truncate w-full')}\n >\n {highlightSubstring && shouldHighlight && !React.isValidElement(cellValue) && typeof cellValue !== 'object'\n ? highlightSubstring(cellValue as string)\n : React.isValidElement(cellValue)\n ? (typeof (cellValue as React.ReactElement<Record<string, unknown>>).type === 'string'\n ? cellValue\n : React.cloneElement(cellValue as React.ReactElement<Record<string, unknown>>, {\n ...((cellValue as React.ReactElement<Record<string, unknown>>).props as Record<string, unknown>),\n containerWidth: cell.column.width,\n }))\n : cellValue as React.ReactNode}\n </span>\n </div>\n </Tooltip>\n )}\n </div>\n </Tooltip>\n </div>\n </>\n )}\n </CellWrapper>\n {cellValidationError && !isActuallyInlineEditing && (\n <div className='absolute bottom-0 left-0 right-0 h-row flex items-end pointer-events-none z-[5]'>\n <div className='w-full bg-error-50 dark:bg-error-975 px-1.5 py-0.5 truncate'><span className='text-error-600 text-2xs font-medium leading-none'>{cellValidationError}</span></div>\n </div>\n )}\n {isFieldOperationLoading && !(inlineEditing === cell.column.key && cell?.column?.canEdit && !isLocked && !cell?.column?.is_disabled) && (\n <div className='absolute top-0 right-0 bg-white dark:bg-black-800 rounded-full w-5 h-5 flex items-center justify-center border border-primary-300 dark:border-primary-600 shadow-sm z-10'>\n <LoadingSpinnerIcon className='text-primary-600 dark:text-white' size={8} />\n </div>\n )}\n </td>\n );\n};\n\nexport const DataCell = React.memo(DataCellInner);\n"],"names":["interval","formatDurationFallback","duration","durationInMs","days","hours","minutes","seconds","CellWrapper","children","withLink","linkTo","rowData","disableRowClick","jsx","Link","DataCellInner","cell","id","nextWidthSum","isLastCell","rowHovering","index","isFirstStickyCell","handleCellClick","currentData","highlightSubstring","is_read","is_modified","is_row_modified","is_deleted","is_added","level","inlineEditing","isInlineEditing","setRowHovering","handleCellValueChange","cellRef","handleUpdateCellData","registerValidation","loadingExpand","toggleRowExpand","isDraggingOver","isLoading","is_incomplete","pendingEdit","hasPendingEdit","pendingValidationError","cascadingTableConfig","originalsOnly","maxLevel","showNewItem","expandedRows","rowLinkConfig","multiSelectConfig","cellEditing","cellEditingValue","allowInlineEdit","fieldOperationLoading","contextPendingEdits","selectedRowId","cellContextMenuConfig","openCellContextMenu","useContext","TableContext","isSelectedRow","tableConfig","useTableConfig","isLocked","cellValidationError","isActuallyInlineEditing","isFieldOperationLoading","theme","useTheme","isDark","onMouseEnter","useCallback","onMouseLeave","getNodeExecutionDuration","cellValue","setCellValue","useState","tooltipText","setTooltipText","isTruncated","setIsTruncated","urlTooltipOpen","setUrlTooltipOpen","truncateTooltipOpen","setTruncateTooltipOpen","textRef","useRef","urlTooltipTimer","truncateTooltipTimer","selectedColumnIds","shouldHighlight","checkTruncation","handleUrlTooltipChange","open","handleTruncateTooltipChange","bgColor","cn","getTableRowBgClassNamesByStatus","onClick","e","handleContextMenu","event","target","getCellText","useEffect","startedTime","formatDate","timeDiff","rawData","headerKey","currencyCode","formatCurrency","columnType","hasTime","formattedValue","rawValue","isUiElementCell","React","jsxs","CELL_DEFAULT_RIGHT_OFFSET","CELL_INDENT_PER_LEVEL_PX","currentCellId","editValue","LoadingSpinnerIcon","InlineEditField","Fragment","Tooltip","CELL_STICKY_SHADOW_DARK","CELL_STICKY_SHADOW_LIGHT","KeyboardArrowDownIcon","KeyboardArrowRightFilledIcon","LinkIcon","Typography","OpenInNewRounded","DataCell"],"mappings":"6wBAqDA,IAAIA,EAEJ,MAAMC,GAA0BC,GAA8B,CAC5D,MAAMC,EAAe,OAAOD,CAAQ,EAEpC,GAAI,OAAO,MAAMC,CAAY,GAAKD,IAAa,MAAQA,IAAa,OAClE,MAAO,MAGT,GAAIC,GAAgB,MAAU,CAC5B,MAAMC,EAAO,KAAK,MAAMD,EAAe,KAAQ,EACzCE,EAAQ,KAAK,MAAOF,EAAe,MAAY,IAAO,EACtDG,EAAU,KAAK,MAAOH,EAAe,KAAW,GAAK,EACrDI,EAAU,KAAK,MAAOJ,EAAe,IAAS,GAAI,EACxD,MAAO,GAAGC,CAAI,KAAKC,CAAK,KAAKC,CAAO,KAAKC,CAAO,GAClD,CAEA,GAAIJ,GAAgB,KAAS,CAC3B,MAAME,EAAQ,KAAK,MAAMF,EAAe,IAAO,EACzCG,EAAU,KAAK,MAAOH,EAAe,KAAW,GAAK,EACrDI,EAAU,KAAK,MAAOJ,EAAe,IAAS,GAAI,EACxD,MAAO,GAAGE,CAAK,KAAKC,CAAO,KAAKC,CAAO,GACzC,CAEA,GAAIJ,GAAgB,IAAO,CACzB,MAAMG,EAAU,KAAK,MAAMH,EAAe,GAAK,EACzCI,EAAU,KAAK,MAAOJ,EAAe,IAAS,GAAI,EACxD,MAAO,GAAGG,CAAO,KAAKC,CAAO,GAC/B,CAEA,OAAIJ,GAAgB,IACX,IAAIA,EAAe,KAAM,QAAQ,CAAC,CAAC,IAGrC,GAAGA,CAAY,IACxB,EAEMK,GAAc,CAAC,CAAE,SAAAC,EAAU,SAAAC,EAAU,OAAAC,EAAQ,QAAAC,EAAS,gBAAAC,KACnDH,GAAY,CAACG,EAAkBC,EAAAA,IAACC,GAAAA,KAAA,CAAK,GAAIJ,IAASC,GAAS,GAAcA,CAAO,GAAK,GAAK,SAAAH,EAAS,EAAUA,EAGhHO,GAAqC,CAAC,CAC1C,KAAAC,EAAM,GAAAC,EAAI,aAAAC,EAAc,WAAAC,EAAY,YAAAC,EAAA,MAAaC,EAAO,kBAAAC,GAAmB,gBAAAC,GAAiB,YAAAC,EAAa,mBAAAC,EACzG,QAAAC,GAAS,YAAAC,EAAa,gBAAAC,EAAiB,WAAAC,EAAY,SAAAC,EAAU,MAAAC,EAAO,cAAAC,EAAe,gBAAAC,EAAiB,eAAAC,EACpG,sBAAAC,GAAuB,QAAAC,GAAS,qBAAAC,GAAsB,mBAAAC,GAAoB,cAAAC,GAAe,gBAAAC,EACzF,eAAAC,GAAgB,UAAAC,EAAW,cAAAC,EAAe,YAAAC,EAAa,eAAAC,EAAgB,uBAAAC,EACzE,IAAM,CACJ,KAAM,CACJ,qBAAAC,EAAsB,cAAAC,GAAe,SAAAC,GAAU,YAAAC,GAAa,aAAAC,GAAc,cAAAC,EAAe,kBAAAC,GACzF,YAAAC,EAAa,iBAAAC,EAAkB,gBAAAC,GAAiB,sBAAAC,GAAuB,aAAcC,GACrF,cAAAC,EAAe,sBAAAC,EAAuB,oBAAAC,CAAA,EACpCC,EAAAA,WAAWC,GAAAA,YAAY,EAErBC,GACJL,GAAkB,MAAuC,OAAOA,CAAa,IAAM,OAAO1C,CAAE,EAExFgD,GAAcC,GAAAA,eAAA,EAGdC,GADcnD,GAAM,QAAQ,IAAOA,GAAM,KAAK,UAAU,iBAAyEA,EAAK,OAAO,GAAG,EAAI,SAC5H,WAAaA,GAAM,QAAQ,UACnDoD,GAAuBpD,GAAM,QAAQ,IAAM0C,KAAsBzC,CAAE,IAAID,EAAK,OAAO,GAAG,GAAG,gBAAkB,OAAS8B,IAA0B,KAC9IuB,EAA0BrC,IAAkBhB,EAAK,OAAO,KAAOA,GAAM,QAAQ,SAAW,CAACmD,GAAY,CAACnD,GAAM,QAAQ,YACpHsD,GAA0Bb,KAA0B,GAAGxC,CAAE,IAAID,GAAM,QAAQ,EAAE,GAC7E,CAAE,MAAAuD,EAAA,EAAUC,YAAA,EACZC,GAASF,KAAU,OACnBG,GAAeC,EAAAA,YAAY,IAAMzC,EAAejB,CAAE,EAAG,CAACiB,EAAgBjB,CAAE,CAAC,EACzE2D,GAAeD,EAAAA,YAAY,IAAMzC,EAAe,IAAI,EAAG,CAACA,CAAc,CAAC,EAEvE2C,EAA2BZ,IAAa,eACxC,CAACa,EAAWC,CAAY,EAAIC,EAAAA,SAChChE,GAAM,QAAQ,WAAa,YAAcA,GAAM,MAC3C6D,EACEA,EAAyB7D,EAAK,KAAK,EACnChB,GAAuBgB,EAAK,KAAK,EACnCA,EAAK,KAAA,EAEL,CAACiE,EAAaC,EAAc,EAAIF,EAAAA,SAAwB,IAAI,EAC5D,CAACG,EAAaC,EAAc,EAAIJ,EAAAA,SAAS,EAAK,EAC9C,CAACK,GAAgBC,EAAiB,EAAIN,EAAAA,SAAS,EAAK,EACpD,CAACO,GAAqBC,EAAsB,EAAIR,EAAAA,SAAS,EAAK,EAC9DS,EAAUC,EAAAA,OAAwB,IAAI,EACtCC,EAAkBD,EAAAA,OAAA,EAClBE,EAAuBF,EAAAA,OAAA,EACvB,CAAE,kBAAAG,GAAoB,EAAC,EAAMxC,IAAqB,CAAA,EAClDyC,GAAkB,CAAC,OAAO,UAAU,eAAe,KAAK9E,GAAM,QAAQ,MAAQ,CAAA,EAAI,iBAAiB,GAAKA,GAAM,QAAQ,MAAM,gBAE5H+E,GAAkBpB,EAAAA,YAAY,IAAM,CACpCc,EAAQ,SACVL,GAAeK,EAAQ,QAAQ,YAAcA,EAAQ,QAAQ,WAAW,CAE5E,EAAG,CAAA,CAAE,EAECO,EAAyBrB,cAAasB,GAAkB,CACxDN,EAAgB,SAClB,aAAaA,EAAgB,OAAO,EAGlCM,EACFX,GAAkB,EAAI,EAEtBK,EAAgB,QAAU,WAAW,IAAML,GAAkB,EAAK,EAAG,GAAG,CAE5E,EAAG,CAAA,CAAE,EAECY,EAA8BvB,cAAasB,GAAkB,CAC7DL,EAAqB,SACvB,aAAaA,EAAqB,OAAO,EAGvCK,EACFT,GAAuB,EAAI,EAE3BI,EAAqB,QAAU,WAAW,IAAMJ,GAAuB,EAAK,EAAG,GAAG,CAEtF,EAAG,CAAA,CAAE,EAECW,EAAUC,EAAG,CACjB,oCAAqCvD,EACrC,mCAAoCzB,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,GAAkB,EAAEhB,GAAcL,GAAa,aAAe,EAAEM,GAAYN,GAAa,UACxK,iCAAkCJ,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,IAAmBhB,GAAcL,GAAa,YAC3H,qCAAsCJ,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,IAAmBf,GAAYN,GAAa,UAC7H,qCAAsCJ,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,IAAmBF,GAAiBhB,GAAeC,GAAmBJ,GAAa,iBAEpK,oCAAqCmB,GAAiBhB,GAAeC,GAAmBJ,GAAa,kBAAoB,CAACkB,GAAatB,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,EAClL,kCAAmChB,GAAcL,GAAa,aAAe,CAACkB,GAAatB,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,EACtI,qCAAsCf,GAAYN,GAAa,WAAa,CAACkB,GAAatB,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,EACrI,qCAAsCJ,IAAkBR,IAAoB,CAACY,EAC7E,oCAAqCgD,IAAmB,SAAS7E,EAAK,OAAO,EAAE,GAAK,CAACiB,GAAmB,CAACY,EACzG,oCAAqCmB,IAAiB5C,IAAgBH,GAAM,CAACgB,GAAmB,CAACY,GAAkB,CAACH,EACpH,CAAC2D,mCAAgCrF,GAAM,KAAK,UAAU,aAAuB,CAAC,EAAGA,GAAM,KAAK,UAAU,eAAiB,CAACiB,GAAmB,CAACY,CAAA,CAC7I,EAEKyD,GAAWC,GAAwB,CAAMvF,EAAK,QAAQ,iBAAyBO,GAAgBgF,CAAC,CAAG,EAEnGC,GAAoB7B,cAAa8B,GAAkD,CAEvF,GAAI7C,GAAuB,YAAc,IAAS,CAACC,GAAuBQ,EAAyB,OAEnG,MAAMqC,EAAiC,CACrC,MAAOzF,EACP,QAAUD,GAAM,KAAK,UAAY,CAAA,EACjC,UAAWA,GAAM,QAAQ,KAAO,GAChC,OAAQA,EAAK,OACb,MAAOA,GAAM,MACb,KAAM2F,GAAAA,YAAY7B,EAAW9D,GAAM,MAAOyF,EAAM,aAAa,EAC7D,KAAAzF,CAAA,EAGE4C,GAAuB,oBAAoB8C,CAAM,IAErDD,EAAM,eAAA,EACNA,EAAM,gBAAA,EACN5C,EAAoB,CAAE,EAAG4C,EAAM,QAAS,EAAGA,EAAM,QAAS,OAAAC,EAAQ,EACpE,EAAG,CAAC9C,EAAuBC,EAAqBQ,EAAyBpD,EAAID,EAAM8D,CAAS,CAAC,EAE7F8B,EAAAA,UAAU,KACU5F,GAAM,KAAK,UAAU,SAAW,WACjCA,EAAK,QAAQ,WAAa,aACzCjB,EAAW,YAAY,IAAM,CAC3B,MAAM8G,EAAc,IAAI,KAAKC,EAAAA,WAAY9F,GAAM,KAAK,UAAU,YAAcA,GAAM,KAAK,UAAU,YAAoC,CAAE,SAAU,GAAM,OAAQ,qBAAA,CAAuB,CAAoB,EACpM+F,EAAW,KAAK,IAAI,IAAI,KAAA,EAAO,QAAA,EAAY,IAAI,KAAKF,CAAW,EAAE,SAAS,EAChF9B,EAAaF,EAA2BA,EAAyBkC,CAAQ,EAAI/G,GAAuB+G,CAAQ,CAAC,CAC/G,EAAG,GAAG,GAED,IAAM,CAAMhH,iBAAwBA,CAAQ,CAAG,GACrD,CAAC+E,EAAW9D,EAAK,MAAOA,GAAM,KAAK,UAAU,WAAYA,GAAM,KAAK,UAAU,YAAaA,GAAM,KAAK,UAAU,OAAQA,EAAK,QAAQ,SAAU6D,CAAwB,CAAC,EAE3K+B,EAAAA,UAAU,IAAM,EACV5F,GAAM,QAAQ,gBAAkBA,GAAM,QAAQ,MAAM,YAAA,IAAkB,SACpEA,GAAM,QAAQ,MAAM,YAAA,IAAkB,MAAOkE,GAAelE,GAAM,KAAsB,EACvFkE,GAAelE,GAAM,KAAK,WAAW,OAAOA,GAAM,QAAQ,cAAc,CAAC,CAAkB,EAEpG,EAAG,CAACA,GAAM,QAAQ,eAAgBA,GAAM,KAAK,SAAUA,GAAM,QAAQ,KAAMA,GAAM,KAAK,CAAC,EAEvF4F,EAAAA,UAAU,IAAM,CACd,GAAI5F,GAAM,QAAQ,MAAM,YAAA,IAAkB,WACxC,GAAI4B,GAAa,QAAU,OAAW,CACpC,MAAMoE,EAAUhG,GAAM,KAAK,UAAU,UAC/BiG,EAAYjG,GAAM,QAAQ,OAC1BkG,EAAetE,GAAa,MAAM,eAAiBoE,IAAUC,CAAS,GAAG,eAAiB,MAChGlC,EAAaoC,EAAAA,eAAevE,EAAY,MAAOsE,CAAsB,CAAC,CACxE,KAAO,CACL,MAAMF,EAAUhG,GAAM,KAAK,UAAU,UAC/BiG,EAAYjG,GAAM,QAAQ,OAChC+D,EAAaoC,EAAAA,eAAenG,GAAM,MAAQgG,IAAUC,CAAS,GAAG,eAA4B,KAAK,CAAC,CACpG,CAEJ,EAAG,CAACjG,GAAM,MAAOA,GAAM,QAAQ,KAAMA,GAAM,QAAQ,OAAQA,GAAM,KAAK,UAAU,UAAW4B,GAAa,MAAOA,GAAa,MAAM,aAAa,CAAC,EAEhJgE,EAAAA,UAAU,IAAM,CACV5F,GAAM,QAAQ,MAAM,YAAA,IAAkB,eACpC4B,GAAa,QAAU,OAAWmC,EAAanC,EAAY,OAAO,SAAA,EAAa,KAAO,EAAE,IAC1E5B,GAAM,OAAO,SAAA,EAAa,KAAO,EAAE,EAEzD,EAAG,CAACA,GAAM,MAAOA,GAAM,QAAQ,KAAM4B,GAAa,KAAK,CAAC,EAExDgE,EAAAA,UAAU,IAAM,CACd,MAAMQ,EAAapG,GAAM,QAAQ,MAAM,eAAiB,GACxD,GAAI,CAAC,OAAQ,UAAU,EAAE,SAASoG,CAAU,EAC1C,GAAIxE,GAAa,QAAU,OAAW,CACpC,MAAMyE,EAAUD,IAAe,WACzBE,EAAiBR,aAAWlE,EAAY,MAAiB,CAAE,SAAUyE,EAAS,aAAc,GAAM,EACxGtC,EAAauC,GAAkB1E,EAAY,KAAK,CAClD,MAAOmC,EAAa/D,EAAK,KAAK,CAElC,EAAG,CAACA,GAAM,MAAOA,GAAM,QAAQ,KAAM4B,GAAa,KAAK,CAAC,EAExDgE,EAAAA,UAAU,IAAM,CACd,MAAMQ,EAAapG,GAAM,QAAQ,MAAM,eAAiB,GACpD,CAAC,WAAY,aAAc,WAAY,UAAW,OAAQ,UAAU,EAAE,SAASoG,CAAU,IACzFxE,GAAa,QAAU,OAAWmC,EAAanC,EAAY,KAAK,EAC3D5B,GAAM,QAAQ,WAAa,YAAY+D,EAAa/D,EAAK,KAAK,EACzE,EAAG,CAACA,GAAM,MAAOA,GAAM,QAAQ,KAAMA,GAAM,QAAQ,SAAU4B,GAAa,KAAK,CAAC,EAEhFgE,EAAAA,UAAU,IAAM,CACd,GAAI5F,GAAM,QAAQ,MAAM,YAAA,IAAkB,WAAawC,GAAiB,CACtE,MAAM+D,EAAW3E,GAAa,QAAU,OAAYA,EAAY,MAAQ5B,GAAM,MAE9E+D,EADqBwC,IAAa,IAAQA,IAAa,QAAUA,IAAa,QAAUA,IAAa,OAASA,IAAa,EAC/F,MAAQ,IAAI,CAC1C,CACF,EAAG,CAACvG,GAAM,MAAOA,GAAM,QAAQ,KAAMwC,GAAiBZ,GAAa,KAAK,CAAC,EAEzEgE,EAAAA,UAAU,IACD,IAAM,CACPjB,EAAgB,SAClB,aAAaA,EAAgB,OAAO,EAElCC,EAAqB,SACvB,aAAaA,EAAqB,OAAO,CAE7C,EACC,CAAA,CAAE,EAEL,MAAM4B,EAAkBC,EAAM,eAAe3C,CAAS,EAEtD,OACE4C,EAAAA,KAAC,KAAA,CACa,GAAI1G,EAAK,MAA6B,kBAAiBA,GAAM,QAAQ,IAAM,GAAGA,EAAK,aAAA,EAC/F,QAASoC,GAAe,UAAY,OAAYkD,GAChD,UAAWF,EAAG,QAAS,CACrB,gBAAiBpF,GAAM,QAAQ,OAC/B,SAAU,CAACA,GAAM,QAAQ,OACzB,SAAUG,EACV,mBAAoBa,IAAkBhB,EAAK,OAAO,IAElD,uCAAwCgB,IAAkBhB,EAAK,OAAO,KAAOwG,EAC7E,kBAAmBxF,IAAkBhB,EAAK,OAAO,KAAO,CAACwG,CAAA,EAEzDpD,GAAuB,CAACC,EAA0B,8DAAgE,GAClH,GAAG8B,GAAoB,4BAA4B,EAAA,EAErD,MAAO,CAAE,SAAU,GAAGnF,EAAK,OAAO,KAAK,KAAM,SAAU,GAAGA,EAAK,OAAO,KAAK,KAAM,MAAOA,GAAM,QAAQ,OAAS,GAAGE,CAAY,KAAOyG,EAAAA,0BAA2B,YAAa5F,EAAQ,GAAKV,IAAU,EAAI,GAAGU,EAAQ6F,EAAAA,wBAAwB,KAAO,MAAA,EAClP,aAAAlD,GAA4B,aAAAE,GAC5B,cAAe4B,GAEf,SAAA,CAAA3F,MAACN,IAAY,SAAU6C,GAAe,UAAW,OAAQA,GAAe,QAAU,OAAW,QAASpC,GAAM,KAAK,SAAU,gBAAiBA,GAAM,QAAQ,gBACtJ,UAAA,MAAM,QAAQsC,CAAW,EAAIA,EAAY,SAAS,GAAGrC,CAAE,IAAID,GAAM,QAAQ,EAAE,EAAE,EAAIsC,IAAgB,GAAGrC,CAAE,IAAID,GAAM,QAAQ,EAAE,IAC1H0G,OAAC,MAAA,CAAI,UAAU,4EACb,SAAA,CAAA7G,EAAAA,IAAC,OAAA,CAAK,UAAU,gDACZ,UAAA,IAAM,CACN,MAAMgH,EAAgB,GAAG5G,CAAE,IAAID,GAAM,QAAQ,EAAE,GACzC8G,EAAY,OAAOvE,GAAqB,SAAWA,IAAmBsE,CAAa,EAAItE,EACvF6D,EAAapG,GAAM,QAAQ,MAAM,YAAA,EAEvC,GAAIoG,IAAe,UACjB,OAAQU,IAA0B,IAAQA,IAAc,QAAUA,IAAc,OAAS,MAAQ,KAGnG,IAAKV,IAAe,QAAUA,IAAe,aAAeU,EAAW,CACrE,MAAMT,GAAUD,IAAe,WAC/B,OAAON,EAAAA,WAAWgB,EAAqB,CAAE,SAAUT,GAAS,aAAc,EAAA,CAAM,GAAK,OAAOS,CAAS,CACvG,CAEA,OAAkCA,GAAc,KAAO,OAAOA,CAAS,EAAKhD,CAC9E,IAAG,CACL,EACAjE,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAiC,SAAAA,EAAAA,IAACkH,EAAAA,oBAAmB,UAAU,2CAA2C,KAAM,EAAA,CAAI,CAAA,CAAE,CAAA,CAAA,CACvI,EACE/F,IAAkBhB,EAAK,OAAO,KAAOA,GAAM,QAAQ,SAAW,CAACmD,GAAY,CAACnD,GAAM,QAAQ,YAC5FH,MAAC,MAAA,CAAI,UAAU,uDAAuD,MAAO,CAAE,WAAYkB,EAAQ,GAAKV,IAAU,EAAI,IAAIU,EAAQ6F,EAAAA,wBAAwB,KAAO,OAAW,MAAO7F,EAAQ,GAAKV,IAAU,EAAI,eAAeU,EAAQ6F,EAAAA,wBAAwB,MAAQ,MAAA,EACnQ,SAAA/G,EAAAA,IAACmH,GAAAA,gBAAA,CAAgB,KAAAhH,EAAY,GAAAC,EAAQ,cAAAe,EAA8B,QAAAI,GAAkB,sBAAAD,GAA8C,qBAAAE,GAA4C,mBAAAC,EAAA,CAAwC,CAAA,CACzN,EAEAoF,EAAAA,KAAAO,EAAAA,SAAA,CACG,SAAA,CAAAlG,EAAQ,GAAKV,IAAU,GAAKR,EAAAA,IAAC,MAAA,CAAI,UAAU,+DAA+D,EAC3GA,EAAAA,IAAC,MAAA,CAAI,UAAU,UACb,SAAAA,EAAAA,IAACqH,EAAA,CACC,MAAOjD,GAAejE,GAAM,QAAQ,MAAM,YAAA,IAAkB,MAAQiE,EAAc,OAClF,YAAa,CAACA,GAAejE,GAAM,QAAQ,MAAM,gBAAkB,MACnE,UAAS,GACT,UAAU,MAEV,SAAA0G,EAAAA,KAAC,MAAA,CAAI,UAAWtB,EAAG,gJAAgJD,GAAoB,4BAA4B,GAAIqB,EAAkB,uCAAyC,oBAAqB,CAAE,uEAAwE3B,IAAmB,SAAS7E,EAAK,OAAO,EAAE,EAAG,EAC5Z,MAAOA,GAAM,QAAQ,QAAUM,GAAoB,CAAE,UAAWmD,GAAS0D,EAAAA,wBAA0BC,EAAAA,wBAAA,EAA6B,CAAA,EAC/H,SAAA,CAAArF,GAAsB,aAAe,CAACC,IAAiB3B,IAAU,GAChER,EAAAA,IAAC,MAAA,CAAI,UAAWuF,EAAG,wCAAyC,GAAGD,GAAoB,4BAA4B,EAAE,EAAG,GAAG,YACpH,YAAYpE,IAAUf,GAAM,KAAK,UAAU,gBAAkB+B,GAAsB,kBAClFlC,EAAAA,IAAC,MAAA,CAAK,YAAgBA,EAAAA,IAACkH,EAAAA,mBAAA,CAAmB,UAAU,mCAAmC,KAAM,CAAA,CAAG,EAAKlH,EAAAA,IAAC,MAAA,CAAK,cAAeI,CAAE,GAAG,OAASJ,EAAAA,IAACwH,EAAAA,sBAAA,CAAsB,KAAM,GAAI,UAAU,yCAAyC,QAAU9B,GAAM,CAAE/D,EAAA,EAAmB+D,EAAE,gBAAA,CAAmB,EAAG,EAAK1F,MAACyH,EAAAA,6BAAA,CAA6B,KAAM,GAAI,UAAU,yCAAyC,QAAU/B,GAAM,CAAE/D,EAAA,EAAmB+D,EAAE,gBAAA,CAAmB,EAAG,CAAA,CAAG,CAAA,CAAO,EAEpc,EAGDvF,GAAM,QAAQ,MAAM,YAAA,IAAkB,OAASiE,EAC9CpE,EAAAA,IAACqH,EAAA,CACC,MACErH,EAAAA,IAAC,MAAA,CAAI,aAAc,IAAMmF,EAAuB,EAAI,EAAG,aAAc,IAAMA,EAAuB,EAAK,EACrG,SAAAnF,EAAAA,IAAC,IAAA,CAAE,KAAMoE,EAAa,OAAO,SAAS,IAAI,sBAAsB,QAAUsB,GAAMA,EAAE,gBAAA,EAChF,SAAAmB,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAA7G,EAAAA,IAAC,MAAA,CAAI,UAAU,UACb,SAAAA,EAAAA,IAAC0H,YAAS,OAAQ,GAAI,MAAO,EAAA,CAAI,CAAA,CACnC,EACA1H,EAAAA,IAAC2H,GAAAA,WAAA,CAAW,QAAQ,SAAS,KAAK,QAAQ,UAAU,WAAW,WAAW,SAAU,SAAAvD,CAAA,CAAY,EAChGpE,EAAAA,IAAC4H,GAAAA,iBAAA,CAAiB,GAAI,CAAE,OAAQ,OAAQ,MAAO,OAAQ,MAAO,UAAU,CAAG,CAAA,CAAA,CAC7E,EACF,EACF,EAEF,UAAU,MACV,KAAMpD,GACN,aAAcW,EACd,UAAU,uCAEV,SAAAnF,EAAAA,IAAC,MAAA,CAAI,UAAU,+EACb,SAAAA,EAAAA,IAAC,OAAA,CAAK,IAAK4E,EAAS,oBAAiB,GAAC,aAAcM,GAAiB,UAAU,kBAC5E,SAAAtE,GAAsBqE,IAAmB,CAAC2B,EAAM,eAAe3C,CAAS,GAAK,OAAOA,GAAc,SAC/FrD,EAAmBqD,CAAmB,EACtCA,CAAA,CACN,CAAA,CACF,CAAA,CAAA,EAGFjE,EAAAA,IAACqH,EAAA,CACC,MACE/C,GAAeL,GAAa,CAAC0C,EAC3B3G,EAAAA,IAAC,MAAA,CACC,aAAc,IAAMqF,EAA4B,EAAI,EACpD,aAAc,IAAMA,EAA4B,EAAK,EACrD,UAAU,qEAET,gBAAOpB,CAAS,CAAA,CAAA,EAEjB,OAEN,UAAU,MACV,UAAS,GACT,YAAa,CAAC,CAACG,EACf,KAAME,GAAe,CAACF,GAAe,CAACuC,EAAkBjC,GAAsB,OAC9E,aAAcJ,GAAe,CAACF,GAAe,CAACuC,EAAkBtB,EAA8B,OAC9F,UAAWE,EAAG,uBAAwBoB,EAAkB,uCAAyC,iBAAiB,EAElH,SAAA3G,EAAAA,IAAC,OAAI,UAAWuF,EAAG,8CAA+CoB,EAAkB,uCAAyC,iBAAiB,EAC5I,SAAA3G,EAAAA,IAAC,OAAA,CACC,IAAK2G,EAAkB,OAAY/B,EACnC,oBAAiB,GACjB,aAAc+B,EAAkB,OAAYzB,GAC5C,UAAWK,EAAGoB,EAAkB,2DAA6D,iBAAiB,EAE7G,SAAA/F,GAAsBqE,IAAmB,CAAC2B,EAAM,eAAe3C,CAAS,GAAK,OAAOA,GAAc,SAC/FrD,EAAmBqD,CAAmB,EACtC2C,EAAM,eAAe3C,CAAS,EAC3B,OAAQA,EAA0D,MAAS,SAC1EA,EACA2C,EAAM,aAAa3C,EAA0D,CAC7E,GAAKA,EAA0D,MAC/D,eAAgB9D,EAAK,OAAO,KAAA,CAC7B,EACD8D,CAAA,CAAA,CACR,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CAEJ,EACCV,GAAuB,CAACC,GACvBxD,EAAAA,IAAC,MAAA,CAAI,UAAU,kFACb,SAAAA,MAAC,MAAA,CAAI,UAAU,8DAA8D,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,mDAAoD,SAAAuD,CAAA,CAAoB,EAAO,EAC9K,EAEDE,IAA2B,EAAEtC,IAAkBhB,EAAK,OAAO,KAAOA,GAAM,QAAQ,SAAW,CAACmD,GAAY,CAACnD,GAAM,QAAQ,cACtHH,EAAAA,IAAC,MAAA,CAAI,UAAU,2KACb,SAAAA,EAAAA,IAACkH,EAAAA,mBAAA,CAAmB,UAAU,mCAAmC,KAAM,CAAA,CAAG,CAAA,CAC5E,CAAA,CAAA,EApJG1G,CAAA,CAwJX,EAEaqH,GAAWjB,EAAM,KAAK1G,EAAa"}
|