@ynput/ayon-frontend-shared 0.2.5 → 0.2.7
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/ProjectTreeTable.cjs.js +16 -0
- package/dist/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/ProjectTreeTable.es.js +16 -0
- package/dist/ProjectTreeTable.es.js.map +1 -1
- package/dist/_virtual/index.cjs5.js +5 -3
- package/dist/_virtual/index.cjs5.js.map +1 -1
- package/dist/_virtual/index.cjs6.js +3 -5
- package/dist/_virtual/index.cjs6.js.map +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -5
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/src/api/generated/actions.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/actions.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +2 -0
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +2 -0
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js.map +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js +0 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js +0 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/Actions.cjs.js +5 -2
- package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/Actions.es.js +5 -2
- package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.cjs.js +1 -0
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.es.js +1 -0
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +9 -3
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +9 -3
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js +2 -2
- package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/context/FeedContext.es.js +2 -2
- package/dist/shared/src/containers/Feed/context/FeedContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +4 -8
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +4 -8
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +0 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +0 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/clientFilterToQueryFilter.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/clientFilterToQueryFilter.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/clientFilterToQueryFilter.es.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/clientFilterToQueryFilter.es.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js +0 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.es.js +0 -1
- package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
- package/dist/shared/src/hooks/useActionTriggers.cjs.js +7 -6
- package/dist/shared/src/hooks/useActionTriggers.cjs.js.map +1 -1
- package/dist/shared/src/hooks/useActionTriggers.es.js +7 -6
- package/dist/shared/src/hooks/useActionTriggers.es.js.map +1 -1
- package/dist/shared/src/hooks/useLoadModules.cjs.js +9 -2
- package/dist/shared/src/hooks/useLoadModules.cjs.js.map +1 -1
- package/dist/shared/src/hooks/useLoadModules.es.js +9 -2
- package/dist/shared/src/hooks/useLoadModules.es.js.map +1 -1
- package/dist/shared/src/util/confirmDelete.cjs.js.map +1 -1
- package/dist/shared/src/util/confirmDelete.es.js.map +1 -1
- package/dist/types/SimpleTable/SimpleTable.d.ts +9 -2
- package/dist/types/SimpleTable/SimpleTableRowTemplate.d.ts +7 -0
- package/dist/types/api/generated/actions.d.ts +1 -1
- package/dist/types/api/generated/graphql.d.ts +3 -1
- package/dist/types/containers/Actions/Actions.d.ts +4 -3
- package/dist/types/containers/ProjectTreeTable/ProjectTreeTable.d.ts +7 -6
- package/dist/types/containers/ProjectTreeTable/index.d.ts +1 -0
- package/dist/types/context/DetailsPanelContext.d.ts +8 -2
- package/dist/types/hooks/useActionTriggers.d.ts +6 -1
- package/dist/types/util/confirmDelete.d.ts +1 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectTreeTable.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/ProjectTreeTable.tsx"],"sourcesContent":["import { useMemo, useRef, useEffect, memo, CSSProperties } from 'react'\nimport { useVirtualizer, VirtualItem, Virtualizer } from '@tanstack/react-virtual'\n// TanStack Table imports\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n filterFns,\n flexRender,\n Row,\n getSortedRowModel,\n Cell,\n Column,\n Table,\n Header,\n HeaderGroup,\n RowData,\n} from '@tanstack/react-table'\n\n// Utility imports\nimport clsx from 'clsx'\n\n// Type imports\nimport type { TableRow } from './types/table'\n\n// Component imports\nimport buildTreeTableColumns, {\n BuildTreeTableColumnsProps,\n DefaultColumns,\n TreeTableExtraColumn,\n} from './buildTreeTableColumns'\nimport * as Styled from './ProjectTreeTable.styled'\nimport HeaderActionButton from './components/HeaderActionButton'\nimport EmptyPlaceholder from '../../components/EmptyPlaceholder'\n\n// Context imports\nimport { useCellEditing } from './context/CellEditingContext'\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './context/SelectionCellsContext'\nimport { ClipboardProvider } from './context/ClipboardContext'\nimport { useSelectedRowsContext } from './context/SelectedRowsContext'\nimport { useColumnSettingsContext } from './context/ColumnSettingsContext'\n\n// Hook imports\nimport useCustomColumnWidthVars from './hooks/useCustomColumnWidthVars'\nimport usePrefetchFolderTasks from './hooks/usePrefetchFolderTasks'\nimport useCellContextMenu from './hooks/useCellContextMenu'\nimport useColumnVirtualization from './hooks/useColumnVirtualization'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\n\n// Utility function imports\nimport { getCellId } from './utils/cellUtils'\nimport { generateLoadingRows, generateDummyAttributes } from './utils/loadingUtils'\nimport { createPortal } from 'react-dom'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { AttributeEnumItem, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { ToggleExpandAll, useProjectTableContext } from './context/ProjectTableContext'\nimport { getReadOnlyLists, getTableFieldOptions } from './utils'\nimport { UpdateTableEntities } from './hooks/useUpdateTableData'\n\ndeclare module '@tanstack/react-table' {\n interface TableMeta<TData extends RowData> {\n options: BuiltInFieldOptions\n readOnly: ProjectTreeTableProps['readOnly']\n projectName: string\n updateEntities: UpdateTableEntities\n toggleExpandAll: ToggleExpandAll\n }\n}\n\n//These are the important styles to make sticky column pinning work!\n//Apply styles like this using your CSS strategy of choice with this kind of logic to head cells, data cells, footer cells, etc.\n//View the index.css file for more needed styles such as border-collapse: separate\nconst getCommonPinningStyles = (column: Column<TableRow, unknown>): CSSProperties => {\n const isPinned = column.getIsPinned()\n\n return {\n left: isPinned === 'left' ? `${column.getStart('left')}px` : undefined,\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n width: column.getSize(),\n zIndex: isPinned ? 100 : 0,\n }\n}\n\nexport interface ProjectTreeTableProps extends React.HTMLAttributes<HTMLDivElement> {\n scope: string\n sliceId: string\n fetchMoreOnBottomReached: (element: HTMLDivElement | null) => void\n onOpenNew?: (type: 'folder' | 'task') => void\n readOnly?: (DefaultColumns | string)[]\n excludedColumns?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n pt?: {\n container?: React.HTMLAttributes<HTMLDivElement>\n head?: Partial<TableHeadProps>\n }\n}\n\nexport const ProjectTreeTable = ({\n scope,\n sliceId,\n fetchMoreOnBottomReached,\n onOpenNew,\n readOnly,\n excludedColumns,\n extraColumns,\n pt,\n ...props\n}: ProjectTreeTableProps) => {\n const {\n columnVisibility,\n columnVisibilityUpdater,\n columnPinning,\n columnPinningUpdater,\n columnOrder,\n columnOrderUpdater,\n columnSizing,\n columnSizingUpdater,\n } = useColumnSettingsContext()\n\n const {\n projectInfo,\n tableData,\n attribFields,\n entitiesMap,\n users,\n isLoading,\n isInitialized,\n expanded,\n projectName,\n updateExpanded,\n toggleExpandAll,\n sorting,\n updateSorting,\n showHierarchy,\n } = useProjectTableContext()\n\n const { statuses = [], folderTypes = [], taskTypes = [], tags = [] } = projectInfo || {}\n const options: BuiltInFieldOptions = useMemo(\n () =>\n getTableFieldOptions({\n users,\n statuses,\n folderTypes,\n taskTypes,\n tags,\n }),\n [users, statuses, folderTypes, taskTypes],\n )\n\n //The virtualizer needs to know the scrollable container element\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n // Selection context\n const { registerGrid } = useSelectionCellsContext()\n\n //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data\n useEffect(() => {\n fetchMoreOnBottomReached(tableContainerRef.current)\n }, [fetchMoreOnBottomReached])\n\n // generate loading attrib and rows\n const { loadingAttrib, loadingRows } = useMemo(() => {\n // count the number of children in tbody\n const tableRowsCount = tableContainerRef.current?.querySelectorAll('tbody tr').length || 0\n const loadingAttrib = generateDummyAttributes()\n const loadingRows = generateLoadingRows(\n attribFields,\n showHierarchy && tableData.length > 0 ? Math.min(tableRowsCount, 50) : 50,\n )\n return { loadingAttrib, loadingRows }\n }, [attribFields, tableData, showHierarchy, tableContainerRef.current])\n\n const showLoadingRows = !isInitialized || isLoading\n\n // Format readonly columns and attributes\n const { readOnlyColumns, readOnlyAttribs } = useMemo(\n () => getReadOnlyLists(attribFields, readOnly),\n [attribFields, readOnly],\n )\n\n const { updateEntities } = useCellEditing()\n\n const columnAttribs = useMemo(\n () => (isInitialized ? attribFields : loadingAttrib),\n [attribFields, loadingAttrib, isInitialized],\n )\n const columns = useMemo(\n () =>\n buildTreeTableColumns({\n attribs: columnAttribs,\n showHierarchy,\n options,\n extraColumns,\n excluded: excludedColumns,\n }),\n [\n // columnAttribs,\n // showHierarchy,\n // options,\n extraColumns,\n // excludedColumns\n ],\n )\n\n const table = useReactTable({\n data: showLoadingRows ? loadingRows : tableData,\n columns,\n defaultColumn: {\n minSize: 50,\n size: 150,\n },\n enableRowSelection: true, //enable row selection for all rows\n getRowId: (row) => row.id,\n enableSubRowSelection: false, //disable sub row selection\n getSubRows: (row) => row.subRows,\n getRowCanExpand: () => true,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n filterFromLeafRows: true,\n // EXPANDABLE\n onExpandedChange: updateExpanded,\n // SORTING\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: updateSorting,\n columnResizeMode: 'onChange',\n onColumnPinningChange: columnPinningUpdater,\n onColumnSizingChange: columnSizingUpdater,\n onColumnVisibilityChange: columnVisibilityUpdater,\n onColumnOrderChange: columnOrderUpdater,\n // @ts-ignore\n filterFns,\n state: {\n expanded,\n sorting,\n columnPinning: {\n left: [ROW_SELECTION_COLUMN_ID, ...(columnPinning.left || [])],\n right: columnPinning.right,\n },\n columnSizing,\n columnVisibility,\n columnOrder,\n },\n enableSorting: true,\n meta: {\n projectName,\n options,\n readOnly: readOnlyColumns,\n updateEntities,\n toggleExpandAll,\n },\n })\n\n const { rows } = table.getRowModel()\n\n // Register grid structure with selection context when rows or columns change\n useEffect(() => {\n const rowIds = rows.map((row) => row.id)\n const colIds = table.getAllLeafColumns().map((col) => col.id)\n const colIdsSortedByPinning = [...colIds].sort((a, b) => {\n if (ROW_SELECTION_COLUMN_ID === b) return 1\n const colA = columnPinning.left?.includes(a) ? 0 : 1\n const colB = columnPinning.left?.includes(b) ? 0 : 1\n return colA - colB\n })\n\n registerGrid(rowIds, colIdsSortedByPinning)\n }, [rows, table.getAllLeafColumns(), columnPinning, ROW_SELECTION_COLUMN_ID, registerGrid])\n\n const visibleColumns = table.getVisibleLeafColumns()\n\n // Use the column virtualization hook\n const { columnVirtualizer, virtualPaddingLeft, virtualPaddingRight } = useColumnVirtualization({\n visibleColumns,\n tableContainerRef,\n columnPinning,\n })\n\n const columnSizeVars = useCustomColumnWidthVars(table, columnSizing)\n\n const attribByField = useMemo(() => {\n return attribFields.reduce((acc: Record<string, AttributeEnumItem[]>, attrib) => {\n if (attrib.data?.enum?.length) {\n acc[attrib.name] = attrib.data?.enum\n }\n return acc\n }, {})\n }, [attribFields])\n\n return (\n <ClipboardProvider\n entitiesMap={entitiesMap}\n columnEnums={{ ...options, ...attribByField }}\n columnReadOnly={readOnlyAttribs}\n >\n <Styled.TableWrapper {...props}>\n <Styled.TableContainer\n ref={tableContainerRef}\n style={{ height: '100%', padding: 0 }}\n onScroll={(e) => fetchMoreOnBottomReached(e.currentTarget)}\n {...pt?.container}\n className={clsx('table-container', pt?.container?.className)}\n >\n <table\n style={{\n display: 'grid',\n borderCollapse: 'collapse',\n userSelect: 'none',\n ...columnSizeVars,\n width: table.getTotalSize(),\n }}\n >\n <TableHead\n columnVirtualizer={columnVirtualizer}\n table={table}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n {...pt?.head}\n />\n <TableBody\n columnVirtualizer={columnVirtualizer}\n table={table}\n tableContainerRef={tableContainerRef}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n showHierarchy={showHierarchy}\n attribs={attribFields}\n onOpenNew={onOpenNew}\n />\n </table>\n </Styled.TableContainer>\n </Styled.TableWrapper>\n </ClipboardProvider>\n )\n}\n\ninterface TableHeadProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHead = ({\n columnVirtualizer,\n table,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n ...props\n}: TableHeadProps) => {\n return (\n <Styled.TableHeader {...props}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableHeadRow\n key={headerGroup.id}\n columnVirtualizer={columnVirtualizer}\n headerGroup={headerGroup}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n />\n ))}\n </Styled.TableHeader>\n )\n}\n\ninterface TableHeadRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n headerGroup: HeaderGroup<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHeadRow = ({\n columnVirtualizer,\n headerGroup,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n}: TableHeadRowProps) => {\n const virtualColumns = columnVirtualizer.getVirtualItems()\n return (\n <Styled.ColumnHeader key={headerGroup.id} style={{ display: 'flex' }}>\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((virtualColumn) => {\n const header = headerGroup.headers[virtualColumn.index]\n\n return (\n <TableHeadCell\n key={header.id}\n header={header}\n isLoading={isLoading}\n isReadOnly={readOnlyColumns?.includes(header.id)}\n canSort={header.column.getCanSort()}\n canFilter={header.column.getCanFilter()}\n canHide={header.column.getCanHide()}\n canPin={header.column.getCanPin()}\n canResize={header.column.getCanResize()}\n />\n )\n })}\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.ColumnHeader>\n )\n}\n\ninterface TableHeadCellProps {\n header: Header<TableRow, unknown>\n isLoading: boolean\n canSort?: boolean\n canFilter?: boolean\n canHide?: boolean\n canPin?: boolean\n canResize?: boolean\n isReadOnly?: boolean\n}\n\nconst TableHeadCell = ({\n header,\n isLoading,\n canFilter,\n canHide,\n canSort,\n canPin,\n canResize,\n isReadOnly,\n}: TableHeadCellProps) => {\n const { column } = header\n\n return (\n <Styled.HeaderCell\n className={clsx(header.id, 'shimmer-dark', {\n loading: isLoading,\n 'last-pinned-left': column.getIsPinned() === 'left' && column.getIsLastColumn('left'),\n })}\n key={header.id}\n style={{\n ...getCommonPinningStyles(column),\n width: `calc(var(--header-${header?.id}-size) * 1px)`,\n }}\n >\n {header.isPlaceholder ? null : (\n <Styled.TableCellContent className={clsx('bold')}>\n {flexRender(column.columnDef.header, header.getContext())}\n {isReadOnly && (\n <Icon icon=\"lock\" data-tooltip={'You only have permission to read this column.'} />\n )}\n\n <Styled.HeaderButtons className=\"actions\">\n {/* COLUMN HIDING */}\n {canHide && (\n <HeaderActionButton\n icon=\"visibility_off\"\n selected={!column.getIsVisible()}\n onClick={column.getToggleVisibilityHandler()}\n />\n )}\n {/* COLUMN PINNING */}\n {canPin && (\n <HeaderActionButton\n icon=\"push_pin\"\n selected={header.column.getIsPinned() === 'left'}\n onClick={() => {\n if (header.column.getIsPinned() === 'left') {\n header.column.pin(false)\n } else {\n header.column.pin('left')\n }\n }}\n />\n )}\n\n {/* COLUMN SORTING */}\n {canSort && (\n <HeaderActionButton\n icon={'sort'}\n style={{\n transform: (column.getIsSorted() as string) === 'asc' ? 'scaleY(-1)' : undefined,\n }}\n onClick={column.getToggleSortingHandler()}\n selected={!!column.getIsSorted()}\n />\n )}\n </Styled.HeaderButtons>\n {canResize && (\n <Styled.ResizedHandler\n {...{\n onDoubleClick: () => column.resetSize(),\n onMouseDown: header.getResizeHandler(),\n onTouchStart: header.getResizeHandler(),\n className: clsx('resize-handle', {\n resizing: column.getIsResizing(),\n }),\n }}\n />\n )}\n </Styled.TableCellContent>\n )}\n </Styled.HeaderCell>\n )\n}\n\ninterface TableBodyProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n tableContainerRef: React.RefObject<HTMLDivElement>\n showHierarchy: boolean\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n attribs: ProjectTableAttribute[]\n onOpenNew?: (type: 'folder' | 'task') => void\n}\n\nconst TableBody = ({\n columnVirtualizer,\n table,\n tableContainerRef,\n showHierarchy,\n virtualPaddingLeft,\n virtualPaddingRight,\n attribs,\n onOpenNew,\n}: TableBodyProps) => {\n const { handleTableBodyContextMenu } = useCellContextMenu({ attribs, onOpenNew })\n\n const { handlePreFetchTasks } = usePrefetchFolderTasks()\n\n const { rows } = table.getRowModel()\n\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: () => (showHierarchy ? 36 : 40), //estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n //measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n const virtualRows = rowVirtualizer.getVirtualItems()\n\n useKeyboardNavigation()\n\n return virtualRows.length ? (\n <tbody\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n position: 'relative',\n display: 'grid',\n }}\n onContextMenu={handleTableBodyContextMenu}\n onMouseOver={(e) => {\n handlePreFetchTasks(e)\n }}\n >\n {virtualRows.map((virtualRow) => {\n const row = rows[virtualRow.index] as Row<TableRow>\n return (\n <TableBodyRow\n key={row.id}\n columnVirtualizer={columnVirtualizer}\n row={row}\n rowVirtualizer={rowVirtualizer}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n virtualRow={virtualRow}\n showHierarchy={showHierarchy}\n />\n )\n })}\n </tbody>\n ) : (\n tableContainerRef.current &&\n createPortal(<EmptyPlaceholder message=\"No items found\" />, tableContainerRef.current)\n )\n}\n\ninterface TableBodyRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n row: Row<TableRow>\n rowVirtualizer: Virtualizer<HTMLDivElement, HTMLTableRowElement>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n virtualRow: VirtualItem\n showHierarchy: boolean\n}\n\nconst TableBodyRow = ({\n columnVirtualizer,\n row,\n rowVirtualizer,\n virtualPaddingLeft,\n virtualPaddingRight,\n virtualRow,\n showHierarchy,\n}: TableBodyRowProps) => {\n // We should do this so that we don't re-render every time anything in projectTableContext changes\n const visibleCells = row.getVisibleCells()\n const virtualColumns = columnVirtualizer.getVirtualItems()\n\n return (\n <Styled.TR\n data-index={virtualRow.index} //needed for dynamic row height measurement\n ref={(node) => rowVirtualizer.measureElement(node)} //measure dynamic row height\n key={row.id}\n style={{\n transform: `translateY(${virtualRow.start}px)`, //this should always be a `style` as it changes on scroll\n }}\n >\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((vc) => {\n const cell = visibleCells[vc.index]\n const cellId = getCellId(row.id, cell.column.id)\n return (\n <TableCellMemo\n cell={cell}\n cellId={cellId}\n rowId={row.id}\n key={cell.id}\n showHierarchy={showHierarchy}\n />\n )\n })}\n\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.TR>\n )\n}\n\ninterface TableCellProps {\n cell: Cell<TableRow, unknown>\n cellId: string\n rowId: string\n className?: string\n showHierarchy: boolean\n}\n\nconst TableCell = ({ cell, rowId, cellId, className, showHierarchy, ...props }: TableCellProps) => {\n const {\n isCellSelected,\n isCellFocused,\n startSelection,\n extendSelection,\n endSelection,\n selectCell,\n getCellBorderClasses,\n } = useSelectionCellsContext()\n\n const { isRowSelected } = useSelectedRowsContext()\n\n const { isEditing } = useCellEditing()\n\n const borderClasses = getCellBorderClasses(cellId)\n\n const isPinned = cell.column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && cell.column.getIsLastColumn('left')\n const isRowSelectionColumn = cell.column.id === ROW_SELECTION_COLUMN_ID\n\n return (\n <Styled.TableCell\n {...props}\n tabIndex={0}\n key={cell.id}\n $isLastPinned={isLastLeftPinnedColumn} // is this column the last pinned column? Custom styling for borders.\n className={clsx(\n cell.column.id,\n {\n selected: isCellSelected(cellId),\n focused: isCellFocused(cellId),\n editing: isEditing(cellId),\n 'last-pinned-left': isLastLeftPinnedColumn,\n 'selected-row': isRowSelected(rowId),\n task: cell.row.original.entityType === 'task',\n },\n className,\n ...borderClasses,\n )}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n height: showHierarchy ? 36 : 40,\n }}\n onMouseDown={(e) => {\n // Only process left clicks (button 0), ignore right clicks\n if (e.button !== 0) return\n\n // check we are not clicking on expander\n if ((e.target as HTMLElement).closest('.expander')) return\n const additive = e.metaKey || e.ctrlKey || isRowSelectionColumn\n if (e.shiftKey) {\n // Shift+click extends selection from anchor cell\n selectCell(cellId, additive, true) // true for range selection\n } else {\n // Normal click starts a new selection\n startSelection(cellId, additive)\n }\n }}\n onMouseOver={(e) => {\n if (e.buttons === 1) {\n // Left button is pressed during mouse move - drag selection\n extendSelection(cellId, isRowSelectionColumn)\n }\n }}\n onMouseUp={() => {\n endSelection(cellId)\n }}\n onDoubleClick={(e) => {\n if (cell.column.id === 'name') {\n // select the row by selecting the row-selection cell\n const rowSelectionCellId = getCellId(cell.row.id, ROW_SELECTION_COLUMN_ID)\n if (!isCellSelected(rowSelectionCellId)) {\n const additive = e.metaKey || e.ctrlKey\n selectCell(rowSelectionCellId, additive, false)\n }\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault()\n // if the cell is not selected, select it and deselect all others\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n }\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Styled.TableCell>\n )\n}\n\nconst TableCellMemo = memo(TableCell)\n"],"names":["useColumnSettingsContext","useProjectTableContext","useMemo","getTableFieldOptions","useRef","useSelectionCellsContext","useEffect","_a","loadingAttrib","generateDummyAttributes","loadingRows","generateLoadingRows","getReadOnlyLists","useCellEditing","buildTreeTableColumns","useReactTable","getCoreRowModel","getFilteredRowModel","getExpandedRowModel","getSortedRowModel","filterFns","ROW_SELECTION_COLUMN_ID","jsx","ClipboardProvider","Styled.TableWrapper","Styled.TableContainer","jsxs","Styled.TableHeader","Styled.ColumnHeader","Styled.HeaderCell","Styled.TableCellContent","flexRender","Icon","Styled.HeaderButtons","Styled.ResizedHandler","usePrefetchFolderTasks","useVirtualizer","createPortal","EmptyPlaceholder","Styled.TR","getCellId","useSelectedRowsContext","createElement","Styled.TableCell","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectTreeTable.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/ProjectTreeTable.tsx"],"sourcesContent":["import { useMemo, useRef, useEffect, memo, CSSProperties } from 'react'\nimport { useVirtualizer, VirtualItem, Virtualizer } from '@tanstack/react-virtual'\n// TanStack Table imports\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n filterFns,\n flexRender,\n Row,\n getSortedRowModel,\n Cell,\n Column,\n Table,\n Header,\n HeaderGroup,\n RowData,\n} from '@tanstack/react-table'\n\n// Utility imports\nimport clsx from 'clsx'\n\n// Type imports\nimport type { TableRow } from './types/table'\n\n// Component imports\nimport buildTreeTableColumns, {\n BuildTreeTableColumnsProps,\n DefaultColumns,\n TreeTableExtraColumn,\n} from './buildTreeTableColumns'\nimport * as Styled from './ProjectTreeTable.styled'\nimport HeaderActionButton from './components/HeaderActionButton'\nimport EmptyPlaceholder from '../../components/EmptyPlaceholder'\n\n// Context imports\nimport { useCellEditing } from './context/CellEditingContext'\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './context/SelectionCellsContext'\nimport { ClipboardProvider } from './context/ClipboardContext'\nimport { useSelectedRowsContext } from './context/SelectedRowsContext'\nimport { useColumnSettingsContext } from './context/ColumnSettingsContext'\n\n// Hook imports\nimport useCustomColumnWidthVars from './hooks/useCustomColumnWidthVars'\nimport usePrefetchFolderTasks from './hooks/usePrefetchFolderTasks'\nimport useCellContextMenu from './hooks/useCellContextMenu'\nimport useColumnVirtualization from './hooks/useColumnVirtualization'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\n\n// Utility function imports\nimport { getCellId } from './utils/cellUtils'\nimport { generateLoadingRows, generateDummyAttributes } from './utils/loadingUtils'\nimport { createPortal } from 'react-dom'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { AttributeEnumItem, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { ToggleExpandAll, useProjectTableContext } from './context/ProjectTableContext'\nimport { getReadOnlyLists, getTableFieldOptions } from './utils'\nimport { UpdateTableEntities } from './hooks/useUpdateTableData'\n\ndeclare module '@tanstack/react-table' {\n interface TableMeta<TData extends RowData> {\n options?: BuiltInFieldOptions\n readOnly?: ProjectTreeTableProps['readOnly']\n projectName?: string\n updateEntities?: UpdateTableEntities\n toggleExpandAll?: ToggleExpandAll\n }\n}\n\n//These are the important styles to make sticky column pinning work!\n//Apply styles like this using your CSS strategy of choice with this kind of logic to head cells, data cells, footer cells, etc.\n//View the index.css file for more needed styles such as border-collapse: separate\nconst getCommonPinningStyles = (column: Column<TableRow, unknown>): CSSProperties => {\n const isPinned = column.getIsPinned()\n\n return {\n left: isPinned === 'left' ? `${column.getStart('left')}px` : undefined,\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n width: column.getSize(),\n zIndex: isPinned ? 100 : 0,\n }\n}\n\nexport interface ProjectTreeTableProps extends React.HTMLAttributes<HTMLDivElement> {\n scope: string\n sliceId: string\n fetchMoreOnBottomReached: (element: HTMLDivElement | null) => void\n onOpenNew?: (type: 'folder' | 'task') => void\n readOnly?: (DefaultColumns | string)[]\n excludedColumns?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n isLoading?: boolean\n pt?: {\n container?: React.HTMLAttributes<HTMLDivElement>\n head?: Partial<TableHeadProps>\n }\n}\n\nexport const ProjectTreeTable = ({\n scope,\n sliceId,\n fetchMoreOnBottomReached,\n onOpenNew,\n readOnly,\n excludedColumns,\n extraColumns,\n isLoading: isLoadingProp,\n pt,\n ...props\n}: ProjectTreeTableProps) => {\n const {\n columnVisibility,\n columnVisibilityUpdater,\n columnPinning,\n columnPinningUpdater,\n columnOrder,\n columnOrderUpdater,\n columnSizing,\n columnSizingUpdater,\n } = useColumnSettingsContext()\n\n const {\n projectInfo,\n tableData,\n attribFields,\n entitiesMap,\n users,\n isLoading: isLoadingData,\n isInitialized,\n expanded,\n projectName,\n updateExpanded,\n toggleExpandAll,\n sorting,\n updateSorting,\n showHierarchy,\n } = useProjectTableContext()\n\n const isLoading = isLoadingProp || isLoadingData\n\n const { statuses = [], folderTypes = [], taskTypes = [], tags = [] } = projectInfo || {}\n const options: BuiltInFieldOptions = useMemo(\n () =>\n getTableFieldOptions({\n users,\n statuses,\n folderTypes,\n taskTypes,\n tags,\n }),\n [users, statuses, folderTypes, taskTypes],\n )\n\n //The virtualizer needs to know the scrollable container element\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n // Selection context\n const { registerGrid } = useSelectionCellsContext()\n\n //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data\n useEffect(() => {\n fetchMoreOnBottomReached(tableContainerRef.current)\n }, [fetchMoreOnBottomReached])\n\n // generate loading attrib and rows\n const { loadingAttrib, loadingRows } = useMemo(() => {\n // count the number of children in tbody\n const tableRowsCount = tableContainerRef.current?.querySelectorAll('tbody tr').length || 0\n const loadingAttrib = generateDummyAttributes()\n const loadingRows = generateLoadingRows(\n attribFields,\n showHierarchy && tableData.length > 0 ? Math.min(tableRowsCount, 50) : 50,\n )\n return { loadingAttrib, loadingRows }\n }, [attribFields, tableData, showHierarchy, tableContainerRef.current])\n\n const showLoadingRows = !isInitialized || isLoading\n\n // Format readonly columns and attributes\n const { readOnlyColumns, readOnlyAttribs } = useMemo(\n () => getReadOnlyLists(attribFields, readOnly),\n [attribFields, readOnly],\n )\n\n const { updateEntities } = useCellEditing()\n\n const columnAttribs = useMemo(\n () => (isInitialized ? attribFields : loadingAttrib),\n [attribFields, loadingAttrib, isInitialized],\n )\n const columns = useMemo(\n () =>\n buildTreeTableColumns({\n attribs: columnAttribs,\n showHierarchy,\n options,\n extraColumns,\n excluded: excludedColumns,\n }),\n [columnAttribs, showHierarchy, options, extraColumns, excludedColumns],\n )\n\n const table = useReactTable({\n data: showLoadingRows ? loadingRows : tableData,\n columns,\n defaultColumn: {\n minSize: 50,\n size: 150,\n },\n enableRowSelection: true, //enable row selection for all rows\n getRowId: (row) => row.id,\n enableSubRowSelection: false, //disable sub row selection\n getSubRows: (row) => row.subRows,\n getRowCanExpand: () => true,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n filterFromLeafRows: true,\n // EXPANDABLE\n onExpandedChange: updateExpanded,\n // SORTING\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: updateSorting,\n columnResizeMode: 'onChange',\n onColumnPinningChange: columnPinningUpdater,\n onColumnSizingChange: columnSizingUpdater,\n onColumnVisibilityChange: columnVisibilityUpdater,\n onColumnOrderChange: columnOrderUpdater,\n // @ts-ignore\n filterFns,\n state: {\n expanded,\n sorting,\n columnPinning: {\n left: [ROW_SELECTION_COLUMN_ID, ...(columnPinning.left || [])],\n right: columnPinning.right,\n },\n columnSizing,\n columnVisibility,\n columnOrder,\n },\n enableSorting: true,\n meta: {\n projectName,\n options,\n readOnly: readOnlyColumns,\n updateEntities,\n toggleExpandAll,\n },\n })\n\n const { rows } = table.getRowModel()\n\n // Register grid structure with selection context when rows or columns change\n useEffect(() => {\n const rowIds = rows.map((row) => row.id)\n const colIds = table.getAllLeafColumns().map((col) => col.id)\n const colIdsSortedByPinning = [...colIds].sort((a, b) => {\n if (ROW_SELECTION_COLUMN_ID === b) return 1\n const colA = columnPinning.left?.includes(a) ? 0 : 1\n const colB = columnPinning.left?.includes(b) ? 0 : 1\n return colA - colB\n })\n\n registerGrid(rowIds, colIdsSortedByPinning)\n }, [rows, table.getAllLeafColumns(), columnPinning, ROW_SELECTION_COLUMN_ID, registerGrid])\n\n const visibleColumns = table.getVisibleLeafColumns()\n\n // Use the column virtualization hook\n const { columnVirtualizer, virtualPaddingLeft, virtualPaddingRight } = useColumnVirtualization({\n visibleColumns,\n tableContainerRef,\n columnPinning,\n })\n\n const columnSizeVars = useCustomColumnWidthVars(table, columnSizing)\n\n const attribByField = useMemo(() => {\n return attribFields.reduce((acc: Record<string, AttributeEnumItem[]>, attrib) => {\n if (attrib.data?.enum?.length) {\n acc[attrib.name] = attrib.data?.enum\n }\n return acc\n }, {})\n }, [attribFields])\n\n return (\n <ClipboardProvider\n entitiesMap={entitiesMap}\n columnEnums={{ ...options, ...attribByField }}\n columnReadOnly={readOnlyAttribs}\n >\n <Styled.TableWrapper {...props}>\n <Styled.TableContainer\n ref={tableContainerRef}\n style={{ height: '100%', padding: 0 }}\n onScroll={(e) => fetchMoreOnBottomReached(e.currentTarget)}\n {...pt?.container}\n className={clsx('table-container', pt?.container?.className)}\n >\n <table\n style={{\n display: 'grid',\n borderCollapse: 'collapse',\n userSelect: 'none',\n ...columnSizeVars,\n width: table.getTotalSize(),\n }}\n >\n <TableHead\n columnVirtualizer={columnVirtualizer}\n table={table}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n {...pt?.head}\n />\n <TableBody\n columnVirtualizer={columnVirtualizer}\n table={table}\n tableContainerRef={tableContainerRef}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n showHierarchy={showHierarchy}\n attribs={attribFields}\n onOpenNew={onOpenNew}\n />\n </table>\n </Styled.TableContainer>\n </Styled.TableWrapper>\n </ClipboardProvider>\n )\n}\n\ninterface TableHeadProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHead = ({\n columnVirtualizer,\n table,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n ...props\n}: TableHeadProps) => {\n return (\n <Styled.TableHeader {...props}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableHeadRow\n key={headerGroup.id}\n columnVirtualizer={columnVirtualizer}\n headerGroup={headerGroup}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n />\n ))}\n </Styled.TableHeader>\n )\n}\n\ninterface TableHeadRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n headerGroup: HeaderGroup<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHeadRow = ({\n columnVirtualizer,\n headerGroup,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n}: TableHeadRowProps) => {\n const virtualColumns = columnVirtualizer.getVirtualItems()\n return (\n <Styled.ColumnHeader key={headerGroup.id} style={{ display: 'flex' }}>\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((virtualColumn) => {\n const header = headerGroup.headers[virtualColumn.index]\n\n return (\n <TableHeadCell\n key={header.id}\n header={header}\n isLoading={isLoading}\n isReadOnly={readOnlyColumns?.includes(header.id)}\n canSort={header.column.getCanSort()}\n canFilter={header.column.getCanFilter()}\n canHide={header.column.getCanHide()}\n canPin={header.column.getCanPin()}\n canResize={header.column.getCanResize()}\n />\n )\n })}\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.ColumnHeader>\n )\n}\n\ninterface TableHeadCellProps {\n header: Header<TableRow, unknown>\n isLoading: boolean\n canSort?: boolean\n canFilter?: boolean\n canHide?: boolean\n canPin?: boolean\n canResize?: boolean\n isReadOnly?: boolean\n}\n\nconst TableHeadCell = ({\n header,\n isLoading,\n canFilter,\n canHide,\n canSort,\n canPin,\n canResize,\n isReadOnly,\n}: TableHeadCellProps) => {\n const { column } = header\n\n return (\n <Styled.HeaderCell\n className={clsx(header.id, 'shimmer-dark', {\n loading: isLoading,\n 'last-pinned-left': column.getIsPinned() === 'left' && column.getIsLastColumn('left'),\n })}\n key={header.id}\n style={{\n ...getCommonPinningStyles(column),\n width: `calc(var(--header-${header?.id}-size) * 1px)`,\n }}\n >\n {header.isPlaceholder ? null : (\n <Styled.TableCellContent className={clsx('bold')}>\n {flexRender(column.columnDef.header, header.getContext())}\n {isReadOnly && (\n <Icon icon=\"lock\" data-tooltip={'You only have permission to read this column.'} />\n )}\n\n <Styled.HeaderButtons className=\"actions\">\n {/* COLUMN HIDING */}\n {canHide && (\n <HeaderActionButton\n icon=\"visibility_off\"\n selected={!column.getIsVisible()}\n onClick={column.getToggleVisibilityHandler()}\n />\n )}\n {/* COLUMN PINNING */}\n {canPin && (\n <HeaderActionButton\n icon=\"push_pin\"\n selected={header.column.getIsPinned() === 'left'}\n onClick={() => {\n if (header.column.getIsPinned() === 'left') {\n header.column.pin(false)\n } else {\n header.column.pin('left')\n }\n }}\n />\n )}\n\n {/* COLUMN SORTING */}\n {canSort && (\n <HeaderActionButton\n icon={'sort'}\n style={{\n transform: (column.getIsSorted() as string) === 'asc' ? 'scaleY(-1)' : undefined,\n }}\n onClick={column.getToggleSortingHandler()}\n selected={!!column.getIsSorted()}\n />\n )}\n </Styled.HeaderButtons>\n {canResize && (\n <Styled.ResizedHandler\n {...{\n onDoubleClick: () => column.resetSize(),\n onMouseDown: header.getResizeHandler(),\n onTouchStart: header.getResizeHandler(),\n className: clsx('resize-handle', {\n resizing: column.getIsResizing(),\n }),\n }}\n />\n )}\n </Styled.TableCellContent>\n )}\n </Styled.HeaderCell>\n )\n}\n\ninterface TableBodyProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n tableContainerRef: React.RefObject<HTMLDivElement>\n showHierarchy: boolean\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n attribs: ProjectTableAttribute[]\n onOpenNew?: (type: 'folder' | 'task') => void\n}\n\nconst TableBody = ({\n columnVirtualizer,\n table,\n tableContainerRef,\n showHierarchy,\n virtualPaddingLeft,\n virtualPaddingRight,\n attribs,\n onOpenNew,\n}: TableBodyProps) => {\n const { handleTableBodyContextMenu } = useCellContextMenu({ attribs, onOpenNew })\n\n const { handlePreFetchTasks } = usePrefetchFolderTasks()\n\n const { rows } = table.getRowModel()\n\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: () => (showHierarchy ? 36 : 40), //estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n //measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n const virtualRows = rowVirtualizer.getVirtualItems()\n\n useKeyboardNavigation()\n\n return virtualRows.length ? (\n <tbody\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n position: 'relative',\n display: 'grid',\n }}\n onContextMenu={handleTableBodyContextMenu}\n onMouseOver={(e) => {\n handlePreFetchTasks(e)\n }}\n >\n {virtualRows.map((virtualRow) => {\n const row = rows[virtualRow.index] as Row<TableRow>\n return (\n <TableBodyRow\n key={row.id}\n columnVirtualizer={columnVirtualizer}\n row={row}\n rowVirtualizer={rowVirtualizer}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n virtualRow={virtualRow}\n showHierarchy={showHierarchy}\n />\n )\n })}\n </tbody>\n ) : (\n tableContainerRef.current &&\n createPortal(<EmptyPlaceholder message=\"No items found\" />, tableContainerRef.current)\n )\n}\n\ninterface TableBodyRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n row: Row<TableRow>\n rowVirtualizer: Virtualizer<HTMLDivElement, HTMLTableRowElement>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n virtualRow: VirtualItem\n showHierarchy: boolean\n}\n\nconst TableBodyRow = ({\n columnVirtualizer,\n row,\n rowVirtualizer,\n virtualPaddingLeft,\n virtualPaddingRight,\n virtualRow,\n showHierarchy,\n}: TableBodyRowProps) => {\n // We should do this so that we don't re-render every time anything in projectTableContext changes\n const visibleCells = row.getVisibleCells()\n const virtualColumns = columnVirtualizer.getVirtualItems()\n\n return (\n <Styled.TR\n data-index={virtualRow.index} //needed for dynamic row height measurement\n ref={(node) => rowVirtualizer.measureElement(node)} //measure dynamic row height\n key={row.id}\n style={{\n transform: `translateY(${virtualRow.start}px)`, //this should always be a `style` as it changes on scroll\n }}\n >\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((vc) => {\n const cell = visibleCells[vc.index]\n const cellId = getCellId(row.id, cell.column.id)\n return (\n <TableCellMemo\n cell={cell}\n cellId={cellId}\n rowId={row.id}\n key={cell.id}\n showHierarchy={showHierarchy}\n />\n )\n })}\n\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.TR>\n )\n}\n\ninterface TableCellProps {\n cell: Cell<TableRow, unknown>\n cellId: string\n rowId: string\n className?: string\n showHierarchy: boolean\n}\n\nconst TableCell = ({ cell, rowId, cellId, className, showHierarchy, ...props }: TableCellProps) => {\n const {\n isCellSelected,\n isCellFocused,\n startSelection,\n extendSelection,\n endSelection,\n selectCell,\n getCellBorderClasses,\n } = useSelectionCellsContext()\n\n const { isRowSelected } = useSelectedRowsContext()\n\n const { isEditing } = useCellEditing()\n\n const borderClasses = getCellBorderClasses(cellId)\n\n const isPinned = cell.column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && cell.column.getIsLastColumn('left')\n const isRowSelectionColumn = cell.column.id === ROW_SELECTION_COLUMN_ID\n\n return (\n <Styled.TableCell\n {...props}\n tabIndex={0}\n key={cell.id}\n $isLastPinned={isLastLeftPinnedColumn} // is this column the last pinned column? Custom styling for borders.\n className={clsx(\n cell.column.id,\n {\n selected: isCellSelected(cellId),\n focused: isCellFocused(cellId),\n editing: isEditing(cellId),\n 'last-pinned-left': isLastLeftPinnedColumn,\n 'selected-row': isRowSelected(rowId),\n task: cell.row.original.entityType === 'task',\n },\n className,\n ...borderClasses,\n )}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n height: showHierarchy ? 36 : 40,\n }}\n onMouseDown={(e) => {\n // Only process left clicks (button 0), ignore right clicks\n if (e.button !== 0) return\n\n // check we are not clicking on expander\n if ((e.target as HTMLElement).closest('.expander')) return\n const additive = e.metaKey || e.ctrlKey || isRowSelectionColumn\n if (e.shiftKey) {\n // Shift+click extends selection from anchor cell\n selectCell(cellId, additive, true) // true for range selection\n } else {\n // Normal click starts a new selection\n startSelection(cellId, additive)\n }\n }}\n onMouseOver={(e) => {\n if (e.buttons === 1) {\n // Left button is pressed during mouse move - drag selection\n extendSelection(cellId, isRowSelectionColumn)\n }\n }}\n onMouseUp={() => {\n endSelection(cellId)\n }}\n onDoubleClick={(e) => {\n if (cell.column.id === 'name') {\n // select the row by selecting the row-selection cell\n const rowSelectionCellId = getCellId(cell.row.id, ROW_SELECTION_COLUMN_ID)\n if (!isCellSelected(rowSelectionCellId)) {\n const additive = e.metaKey || e.ctrlKey\n selectCell(rowSelectionCellId, additive, false)\n }\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault()\n // if the cell is not selected, select it and deselect all others\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n }\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Styled.TableCell>\n )\n}\n\nconst TableCellMemo = memo(TableCell)\n"],"names":["useColumnSettingsContext","useProjectTableContext","useMemo","getTableFieldOptions","useRef","useSelectionCellsContext","useEffect","_a","loadingAttrib","generateDummyAttributes","loadingRows","generateLoadingRows","getReadOnlyLists","useCellEditing","buildTreeTableColumns","useReactTable","getCoreRowModel","getFilteredRowModel","getExpandedRowModel","getSortedRowModel","filterFns","ROW_SELECTION_COLUMN_ID","jsx","ClipboardProvider","Styled.TableWrapper","Styled.TableContainer","jsxs","Styled.TableHeader","Styled.ColumnHeader","Styled.HeaderCell","Styled.TableCellContent","flexRender","Icon","Styled.HeaderButtons","Styled.ResizedHandler","usePrefetchFolderTasks","useVirtualizer","createPortal","EmptyPlaceholder","Styled.TR","getCellId","useSelectedRowsContext","createElement","Styled.TableCell","memo"],"mappings":"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"}
|
|
@@ -43,6 +43,7 @@ const ProjectTreeTable = ({
|
|
|
43
43
|
readOnly,
|
|
44
44
|
excludedColumns,
|
|
45
45
|
extraColumns,
|
|
46
|
+
isLoading: isLoadingProp,
|
|
46
47
|
pt,
|
|
47
48
|
...props
|
|
48
49
|
}) => {
|
|
@@ -63,7 +64,7 @@ const ProjectTreeTable = ({
|
|
|
63
64
|
attribFields,
|
|
64
65
|
entitiesMap,
|
|
65
66
|
users,
|
|
66
|
-
isLoading,
|
|
67
|
+
isLoading: isLoadingData,
|
|
67
68
|
isInitialized,
|
|
68
69
|
expanded,
|
|
69
70
|
projectName,
|
|
@@ -73,6 +74,7 @@ const ProjectTreeTable = ({
|
|
|
73
74
|
updateSorting,
|
|
74
75
|
showHierarchy
|
|
75
76
|
} = useProjectTableContext();
|
|
77
|
+
const isLoading = isLoadingProp || isLoadingData;
|
|
76
78
|
const { statuses = [], folderTypes = [], taskTypes = [], tags = [] } = projectInfo || {};
|
|
77
79
|
const options = useMemo(
|
|
78
80
|
() => getTableFieldOptions({
|
|
@@ -117,13 +119,7 @@ const ProjectTreeTable = ({
|
|
|
117
119
|
extraColumns,
|
|
118
120
|
excluded: excludedColumns
|
|
119
121
|
}),
|
|
120
|
-
[
|
|
121
|
-
// columnAttribs,
|
|
122
|
-
// showHierarchy,
|
|
123
|
-
// options,
|
|
124
|
-
extraColumns
|
|
125
|
-
// excludedColumns
|
|
126
|
-
]
|
|
122
|
+
[columnAttribs, showHierarchy, options, extraColumns, excludedColumns]
|
|
127
123
|
);
|
|
128
124
|
const table = useReactTable({
|
|
129
125
|
data: showLoadingRows ? loadingRows : tableData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectTreeTable.es.js","sources":["../../../../../src/containers/ProjectTreeTable/ProjectTreeTable.tsx"],"sourcesContent":["import { useMemo, useRef, useEffect, memo, CSSProperties } from 'react'\nimport { useVirtualizer, VirtualItem, Virtualizer } from '@tanstack/react-virtual'\n// TanStack Table imports\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n filterFns,\n flexRender,\n Row,\n getSortedRowModel,\n Cell,\n Column,\n Table,\n Header,\n HeaderGroup,\n RowData,\n} from '@tanstack/react-table'\n\n// Utility imports\nimport clsx from 'clsx'\n\n// Type imports\nimport type { TableRow } from './types/table'\n\n// Component imports\nimport buildTreeTableColumns, {\n BuildTreeTableColumnsProps,\n DefaultColumns,\n TreeTableExtraColumn,\n} from './buildTreeTableColumns'\nimport * as Styled from './ProjectTreeTable.styled'\nimport HeaderActionButton from './components/HeaderActionButton'\nimport EmptyPlaceholder from '../../components/EmptyPlaceholder'\n\n// Context imports\nimport { useCellEditing } from './context/CellEditingContext'\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './context/SelectionCellsContext'\nimport { ClipboardProvider } from './context/ClipboardContext'\nimport { useSelectedRowsContext } from './context/SelectedRowsContext'\nimport { useColumnSettingsContext } from './context/ColumnSettingsContext'\n\n// Hook imports\nimport useCustomColumnWidthVars from './hooks/useCustomColumnWidthVars'\nimport usePrefetchFolderTasks from './hooks/usePrefetchFolderTasks'\nimport useCellContextMenu from './hooks/useCellContextMenu'\nimport useColumnVirtualization from './hooks/useColumnVirtualization'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\n\n// Utility function imports\nimport { getCellId } from './utils/cellUtils'\nimport { generateLoadingRows, generateDummyAttributes } from './utils/loadingUtils'\nimport { createPortal } from 'react-dom'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { AttributeEnumItem, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { ToggleExpandAll, useProjectTableContext } from './context/ProjectTableContext'\nimport { getReadOnlyLists, getTableFieldOptions } from './utils'\nimport { UpdateTableEntities } from './hooks/useUpdateTableData'\n\ndeclare module '@tanstack/react-table' {\n interface TableMeta<TData extends RowData> {\n options: BuiltInFieldOptions\n readOnly: ProjectTreeTableProps['readOnly']\n projectName: string\n updateEntities: UpdateTableEntities\n toggleExpandAll: ToggleExpandAll\n }\n}\n\n//These are the important styles to make sticky column pinning work!\n//Apply styles like this using your CSS strategy of choice with this kind of logic to head cells, data cells, footer cells, etc.\n//View the index.css file for more needed styles such as border-collapse: separate\nconst getCommonPinningStyles = (column: Column<TableRow, unknown>): CSSProperties => {\n const isPinned = column.getIsPinned()\n\n return {\n left: isPinned === 'left' ? `${column.getStart('left')}px` : undefined,\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n width: column.getSize(),\n zIndex: isPinned ? 100 : 0,\n }\n}\n\nexport interface ProjectTreeTableProps extends React.HTMLAttributes<HTMLDivElement> {\n scope: string\n sliceId: string\n fetchMoreOnBottomReached: (element: HTMLDivElement | null) => void\n onOpenNew?: (type: 'folder' | 'task') => void\n readOnly?: (DefaultColumns | string)[]\n excludedColumns?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n pt?: {\n container?: React.HTMLAttributes<HTMLDivElement>\n head?: Partial<TableHeadProps>\n }\n}\n\nexport const ProjectTreeTable = ({\n scope,\n sliceId,\n fetchMoreOnBottomReached,\n onOpenNew,\n readOnly,\n excludedColumns,\n extraColumns,\n pt,\n ...props\n}: ProjectTreeTableProps) => {\n const {\n columnVisibility,\n columnVisibilityUpdater,\n columnPinning,\n columnPinningUpdater,\n columnOrder,\n columnOrderUpdater,\n columnSizing,\n columnSizingUpdater,\n } = useColumnSettingsContext()\n\n const {\n projectInfo,\n tableData,\n attribFields,\n entitiesMap,\n users,\n isLoading,\n isInitialized,\n expanded,\n projectName,\n updateExpanded,\n toggleExpandAll,\n sorting,\n updateSorting,\n showHierarchy,\n } = useProjectTableContext()\n\n const { statuses = [], folderTypes = [], taskTypes = [], tags = [] } = projectInfo || {}\n const options: BuiltInFieldOptions = useMemo(\n () =>\n getTableFieldOptions({\n users,\n statuses,\n folderTypes,\n taskTypes,\n tags,\n }),\n [users, statuses, folderTypes, taskTypes],\n )\n\n //The virtualizer needs to know the scrollable container element\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n // Selection context\n const { registerGrid } = useSelectionCellsContext()\n\n //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data\n useEffect(() => {\n fetchMoreOnBottomReached(tableContainerRef.current)\n }, [fetchMoreOnBottomReached])\n\n // generate loading attrib and rows\n const { loadingAttrib, loadingRows } = useMemo(() => {\n // count the number of children in tbody\n const tableRowsCount = tableContainerRef.current?.querySelectorAll('tbody tr').length || 0\n const loadingAttrib = generateDummyAttributes()\n const loadingRows = generateLoadingRows(\n attribFields,\n showHierarchy && tableData.length > 0 ? Math.min(tableRowsCount, 50) : 50,\n )\n return { loadingAttrib, loadingRows }\n }, [attribFields, tableData, showHierarchy, tableContainerRef.current])\n\n const showLoadingRows = !isInitialized || isLoading\n\n // Format readonly columns and attributes\n const { readOnlyColumns, readOnlyAttribs } = useMemo(\n () => getReadOnlyLists(attribFields, readOnly),\n [attribFields, readOnly],\n )\n\n const { updateEntities } = useCellEditing()\n\n const columnAttribs = useMemo(\n () => (isInitialized ? attribFields : loadingAttrib),\n [attribFields, loadingAttrib, isInitialized],\n )\n const columns = useMemo(\n () =>\n buildTreeTableColumns({\n attribs: columnAttribs,\n showHierarchy,\n options,\n extraColumns,\n excluded: excludedColumns,\n }),\n [\n // columnAttribs,\n // showHierarchy,\n // options,\n extraColumns,\n // excludedColumns\n ],\n )\n\n const table = useReactTable({\n data: showLoadingRows ? loadingRows : tableData,\n columns,\n defaultColumn: {\n minSize: 50,\n size: 150,\n },\n enableRowSelection: true, //enable row selection for all rows\n getRowId: (row) => row.id,\n enableSubRowSelection: false, //disable sub row selection\n getSubRows: (row) => row.subRows,\n getRowCanExpand: () => true,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n filterFromLeafRows: true,\n // EXPANDABLE\n onExpandedChange: updateExpanded,\n // SORTING\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: updateSorting,\n columnResizeMode: 'onChange',\n onColumnPinningChange: columnPinningUpdater,\n onColumnSizingChange: columnSizingUpdater,\n onColumnVisibilityChange: columnVisibilityUpdater,\n onColumnOrderChange: columnOrderUpdater,\n // @ts-ignore\n filterFns,\n state: {\n expanded,\n sorting,\n columnPinning: {\n left: [ROW_SELECTION_COLUMN_ID, ...(columnPinning.left || [])],\n right: columnPinning.right,\n },\n columnSizing,\n columnVisibility,\n columnOrder,\n },\n enableSorting: true,\n meta: {\n projectName,\n options,\n readOnly: readOnlyColumns,\n updateEntities,\n toggleExpandAll,\n },\n })\n\n const { rows } = table.getRowModel()\n\n // Register grid structure with selection context when rows or columns change\n useEffect(() => {\n const rowIds = rows.map((row) => row.id)\n const colIds = table.getAllLeafColumns().map((col) => col.id)\n const colIdsSortedByPinning = [...colIds].sort((a, b) => {\n if (ROW_SELECTION_COLUMN_ID === b) return 1\n const colA = columnPinning.left?.includes(a) ? 0 : 1\n const colB = columnPinning.left?.includes(b) ? 0 : 1\n return colA - colB\n })\n\n registerGrid(rowIds, colIdsSortedByPinning)\n }, [rows, table.getAllLeafColumns(), columnPinning, ROW_SELECTION_COLUMN_ID, registerGrid])\n\n const visibleColumns = table.getVisibleLeafColumns()\n\n // Use the column virtualization hook\n const { columnVirtualizer, virtualPaddingLeft, virtualPaddingRight } = useColumnVirtualization({\n visibleColumns,\n tableContainerRef,\n columnPinning,\n })\n\n const columnSizeVars = useCustomColumnWidthVars(table, columnSizing)\n\n const attribByField = useMemo(() => {\n return attribFields.reduce((acc: Record<string, AttributeEnumItem[]>, attrib) => {\n if (attrib.data?.enum?.length) {\n acc[attrib.name] = attrib.data?.enum\n }\n return acc\n }, {})\n }, [attribFields])\n\n return (\n <ClipboardProvider\n entitiesMap={entitiesMap}\n columnEnums={{ ...options, ...attribByField }}\n columnReadOnly={readOnlyAttribs}\n >\n <Styled.TableWrapper {...props}>\n <Styled.TableContainer\n ref={tableContainerRef}\n style={{ height: '100%', padding: 0 }}\n onScroll={(e) => fetchMoreOnBottomReached(e.currentTarget)}\n {...pt?.container}\n className={clsx('table-container', pt?.container?.className)}\n >\n <table\n style={{\n display: 'grid',\n borderCollapse: 'collapse',\n userSelect: 'none',\n ...columnSizeVars,\n width: table.getTotalSize(),\n }}\n >\n <TableHead\n columnVirtualizer={columnVirtualizer}\n table={table}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n {...pt?.head}\n />\n <TableBody\n columnVirtualizer={columnVirtualizer}\n table={table}\n tableContainerRef={tableContainerRef}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n showHierarchy={showHierarchy}\n attribs={attribFields}\n onOpenNew={onOpenNew}\n />\n </table>\n </Styled.TableContainer>\n </Styled.TableWrapper>\n </ClipboardProvider>\n )\n}\n\ninterface TableHeadProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHead = ({\n columnVirtualizer,\n table,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n ...props\n}: TableHeadProps) => {\n return (\n <Styled.TableHeader {...props}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableHeadRow\n key={headerGroup.id}\n columnVirtualizer={columnVirtualizer}\n headerGroup={headerGroup}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n />\n ))}\n </Styled.TableHeader>\n )\n}\n\ninterface TableHeadRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n headerGroup: HeaderGroup<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHeadRow = ({\n columnVirtualizer,\n headerGroup,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n}: TableHeadRowProps) => {\n const virtualColumns = columnVirtualizer.getVirtualItems()\n return (\n <Styled.ColumnHeader key={headerGroup.id} style={{ display: 'flex' }}>\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((virtualColumn) => {\n const header = headerGroup.headers[virtualColumn.index]\n\n return (\n <TableHeadCell\n key={header.id}\n header={header}\n isLoading={isLoading}\n isReadOnly={readOnlyColumns?.includes(header.id)}\n canSort={header.column.getCanSort()}\n canFilter={header.column.getCanFilter()}\n canHide={header.column.getCanHide()}\n canPin={header.column.getCanPin()}\n canResize={header.column.getCanResize()}\n />\n )\n })}\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.ColumnHeader>\n )\n}\n\ninterface TableHeadCellProps {\n header: Header<TableRow, unknown>\n isLoading: boolean\n canSort?: boolean\n canFilter?: boolean\n canHide?: boolean\n canPin?: boolean\n canResize?: boolean\n isReadOnly?: boolean\n}\n\nconst TableHeadCell = ({\n header,\n isLoading,\n canFilter,\n canHide,\n canSort,\n canPin,\n canResize,\n isReadOnly,\n}: TableHeadCellProps) => {\n const { column } = header\n\n return (\n <Styled.HeaderCell\n className={clsx(header.id, 'shimmer-dark', {\n loading: isLoading,\n 'last-pinned-left': column.getIsPinned() === 'left' && column.getIsLastColumn('left'),\n })}\n key={header.id}\n style={{\n ...getCommonPinningStyles(column),\n width: `calc(var(--header-${header?.id}-size) * 1px)`,\n }}\n >\n {header.isPlaceholder ? null : (\n <Styled.TableCellContent className={clsx('bold')}>\n {flexRender(column.columnDef.header, header.getContext())}\n {isReadOnly && (\n <Icon icon=\"lock\" data-tooltip={'You only have permission to read this column.'} />\n )}\n\n <Styled.HeaderButtons className=\"actions\">\n {/* COLUMN HIDING */}\n {canHide && (\n <HeaderActionButton\n icon=\"visibility_off\"\n selected={!column.getIsVisible()}\n onClick={column.getToggleVisibilityHandler()}\n />\n )}\n {/* COLUMN PINNING */}\n {canPin && (\n <HeaderActionButton\n icon=\"push_pin\"\n selected={header.column.getIsPinned() === 'left'}\n onClick={() => {\n if (header.column.getIsPinned() === 'left') {\n header.column.pin(false)\n } else {\n header.column.pin('left')\n }\n }}\n />\n )}\n\n {/* COLUMN SORTING */}\n {canSort && (\n <HeaderActionButton\n icon={'sort'}\n style={{\n transform: (column.getIsSorted() as string) === 'asc' ? 'scaleY(-1)' : undefined,\n }}\n onClick={column.getToggleSortingHandler()}\n selected={!!column.getIsSorted()}\n />\n )}\n </Styled.HeaderButtons>\n {canResize && (\n <Styled.ResizedHandler\n {...{\n onDoubleClick: () => column.resetSize(),\n onMouseDown: header.getResizeHandler(),\n onTouchStart: header.getResizeHandler(),\n className: clsx('resize-handle', {\n resizing: column.getIsResizing(),\n }),\n }}\n />\n )}\n </Styled.TableCellContent>\n )}\n </Styled.HeaderCell>\n )\n}\n\ninterface TableBodyProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n tableContainerRef: React.RefObject<HTMLDivElement>\n showHierarchy: boolean\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n attribs: ProjectTableAttribute[]\n onOpenNew?: (type: 'folder' | 'task') => void\n}\n\nconst TableBody = ({\n columnVirtualizer,\n table,\n tableContainerRef,\n showHierarchy,\n virtualPaddingLeft,\n virtualPaddingRight,\n attribs,\n onOpenNew,\n}: TableBodyProps) => {\n const { handleTableBodyContextMenu } = useCellContextMenu({ attribs, onOpenNew })\n\n const { handlePreFetchTasks } = usePrefetchFolderTasks()\n\n const { rows } = table.getRowModel()\n\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: () => (showHierarchy ? 36 : 40), //estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n //measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n const virtualRows = rowVirtualizer.getVirtualItems()\n\n useKeyboardNavigation()\n\n return virtualRows.length ? (\n <tbody\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n position: 'relative',\n display: 'grid',\n }}\n onContextMenu={handleTableBodyContextMenu}\n onMouseOver={(e) => {\n handlePreFetchTasks(e)\n }}\n >\n {virtualRows.map((virtualRow) => {\n const row = rows[virtualRow.index] as Row<TableRow>\n return (\n <TableBodyRow\n key={row.id}\n columnVirtualizer={columnVirtualizer}\n row={row}\n rowVirtualizer={rowVirtualizer}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n virtualRow={virtualRow}\n showHierarchy={showHierarchy}\n />\n )\n })}\n </tbody>\n ) : (\n tableContainerRef.current &&\n createPortal(<EmptyPlaceholder message=\"No items found\" />, tableContainerRef.current)\n )\n}\n\ninterface TableBodyRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n row: Row<TableRow>\n rowVirtualizer: Virtualizer<HTMLDivElement, HTMLTableRowElement>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n virtualRow: VirtualItem\n showHierarchy: boolean\n}\n\nconst TableBodyRow = ({\n columnVirtualizer,\n row,\n rowVirtualizer,\n virtualPaddingLeft,\n virtualPaddingRight,\n virtualRow,\n showHierarchy,\n}: TableBodyRowProps) => {\n // We should do this so that we don't re-render every time anything in projectTableContext changes\n const visibleCells = row.getVisibleCells()\n const virtualColumns = columnVirtualizer.getVirtualItems()\n\n return (\n <Styled.TR\n data-index={virtualRow.index} //needed for dynamic row height measurement\n ref={(node) => rowVirtualizer.measureElement(node)} //measure dynamic row height\n key={row.id}\n style={{\n transform: `translateY(${virtualRow.start}px)`, //this should always be a `style` as it changes on scroll\n }}\n >\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((vc) => {\n const cell = visibleCells[vc.index]\n const cellId = getCellId(row.id, cell.column.id)\n return (\n <TableCellMemo\n cell={cell}\n cellId={cellId}\n rowId={row.id}\n key={cell.id}\n showHierarchy={showHierarchy}\n />\n )\n })}\n\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.TR>\n )\n}\n\ninterface TableCellProps {\n cell: Cell<TableRow, unknown>\n cellId: string\n rowId: string\n className?: string\n showHierarchy: boolean\n}\n\nconst TableCell = ({ cell, rowId, cellId, className, showHierarchy, ...props }: TableCellProps) => {\n const {\n isCellSelected,\n isCellFocused,\n startSelection,\n extendSelection,\n endSelection,\n selectCell,\n getCellBorderClasses,\n } = useSelectionCellsContext()\n\n const { isRowSelected } = useSelectedRowsContext()\n\n const { isEditing } = useCellEditing()\n\n const borderClasses = getCellBorderClasses(cellId)\n\n const isPinned = cell.column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && cell.column.getIsLastColumn('left')\n const isRowSelectionColumn = cell.column.id === ROW_SELECTION_COLUMN_ID\n\n return (\n <Styled.TableCell\n {...props}\n tabIndex={0}\n key={cell.id}\n $isLastPinned={isLastLeftPinnedColumn} // is this column the last pinned column? Custom styling for borders.\n className={clsx(\n cell.column.id,\n {\n selected: isCellSelected(cellId),\n focused: isCellFocused(cellId),\n editing: isEditing(cellId),\n 'last-pinned-left': isLastLeftPinnedColumn,\n 'selected-row': isRowSelected(rowId),\n task: cell.row.original.entityType === 'task',\n },\n className,\n ...borderClasses,\n )}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n height: showHierarchy ? 36 : 40,\n }}\n onMouseDown={(e) => {\n // Only process left clicks (button 0), ignore right clicks\n if (e.button !== 0) return\n\n // check we are not clicking on expander\n if ((e.target as HTMLElement).closest('.expander')) return\n const additive = e.metaKey || e.ctrlKey || isRowSelectionColumn\n if (e.shiftKey) {\n // Shift+click extends selection from anchor cell\n selectCell(cellId, additive, true) // true for range selection\n } else {\n // Normal click starts a new selection\n startSelection(cellId, additive)\n }\n }}\n onMouseOver={(e) => {\n if (e.buttons === 1) {\n // Left button is pressed during mouse move - drag selection\n extendSelection(cellId, isRowSelectionColumn)\n }\n }}\n onMouseUp={() => {\n endSelection(cellId)\n }}\n onDoubleClick={(e) => {\n if (cell.column.id === 'name') {\n // select the row by selecting the row-selection cell\n const rowSelectionCellId = getCellId(cell.row.id, ROW_SELECTION_COLUMN_ID)\n if (!isCellSelected(rowSelectionCellId)) {\n const additive = e.metaKey || e.ctrlKey\n selectCell(rowSelectionCellId, additive, false)\n }\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault()\n // if the cell is not selected, select it and deselect all others\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n }\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Styled.TableCell>\n )\n}\n\nconst TableCellMemo = memo(TableCell)\n"],"names":["_a","loadingAttrib","loadingRows","jsx","Styled.TableWrapper","Styled.TableContainer","jsxs","Styled.TableHeader","Styled.ColumnHeader","Styled.HeaderCell","Styled.TableCellContent","Styled.HeaderButtons","Styled.ResizedHandler","Styled.TR","Styled.TableCell"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectTreeTable.es.js","sources":["../../../../../src/containers/ProjectTreeTable/ProjectTreeTable.tsx"],"sourcesContent":["import { useMemo, useRef, useEffect, memo, CSSProperties } from 'react'\nimport { useVirtualizer, VirtualItem, Virtualizer } from '@tanstack/react-virtual'\n// TanStack Table imports\nimport {\n useReactTable,\n getCoreRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n filterFns,\n flexRender,\n Row,\n getSortedRowModel,\n Cell,\n Column,\n Table,\n Header,\n HeaderGroup,\n RowData,\n} from '@tanstack/react-table'\n\n// Utility imports\nimport clsx from 'clsx'\n\n// Type imports\nimport type { TableRow } from './types/table'\n\n// Component imports\nimport buildTreeTableColumns, {\n BuildTreeTableColumnsProps,\n DefaultColumns,\n TreeTableExtraColumn,\n} from './buildTreeTableColumns'\nimport * as Styled from './ProjectTreeTable.styled'\nimport HeaderActionButton from './components/HeaderActionButton'\nimport EmptyPlaceholder from '../../components/EmptyPlaceholder'\n\n// Context imports\nimport { useCellEditing } from './context/CellEditingContext'\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './context/SelectionCellsContext'\nimport { ClipboardProvider } from './context/ClipboardContext'\nimport { useSelectedRowsContext } from './context/SelectedRowsContext'\nimport { useColumnSettingsContext } from './context/ColumnSettingsContext'\n\n// Hook imports\nimport useCustomColumnWidthVars from './hooks/useCustomColumnWidthVars'\nimport usePrefetchFolderTasks from './hooks/usePrefetchFolderTasks'\nimport useCellContextMenu from './hooks/useCellContextMenu'\nimport useColumnVirtualization from './hooks/useColumnVirtualization'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\n\n// Utility function imports\nimport { getCellId } from './utils/cellUtils'\nimport { generateLoadingRows, generateDummyAttributes } from './utils/loadingUtils'\nimport { createPortal } from 'react-dom'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { AttributeEnumItem, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { ToggleExpandAll, useProjectTableContext } from './context/ProjectTableContext'\nimport { getReadOnlyLists, getTableFieldOptions } from './utils'\nimport { UpdateTableEntities } from './hooks/useUpdateTableData'\n\ndeclare module '@tanstack/react-table' {\n interface TableMeta<TData extends RowData> {\n options?: BuiltInFieldOptions\n readOnly?: ProjectTreeTableProps['readOnly']\n projectName?: string\n updateEntities?: UpdateTableEntities\n toggleExpandAll?: ToggleExpandAll\n }\n}\n\n//These are the important styles to make sticky column pinning work!\n//Apply styles like this using your CSS strategy of choice with this kind of logic to head cells, data cells, footer cells, etc.\n//View the index.css file for more needed styles such as border-collapse: separate\nconst getCommonPinningStyles = (column: Column<TableRow, unknown>): CSSProperties => {\n const isPinned = column.getIsPinned()\n\n return {\n left: isPinned === 'left' ? `${column.getStart('left')}px` : undefined,\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n width: column.getSize(),\n zIndex: isPinned ? 100 : 0,\n }\n}\n\nexport interface ProjectTreeTableProps extends React.HTMLAttributes<HTMLDivElement> {\n scope: string\n sliceId: string\n fetchMoreOnBottomReached: (element: HTMLDivElement | null) => void\n onOpenNew?: (type: 'folder' | 'task') => void\n readOnly?: (DefaultColumns | string)[]\n excludedColumns?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n isLoading?: boolean\n pt?: {\n container?: React.HTMLAttributes<HTMLDivElement>\n head?: Partial<TableHeadProps>\n }\n}\n\nexport const ProjectTreeTable = ({\n scope,\n sliceId,\n fetchMoreOnBottomReached,\n onOpenNew,\n readOnly,\n excludedColumns,\n extraColumns,\n isLoading: isLoadingProp,\n pt,\n ...props\n}: ProjectTreeTableProps) => {\n const {\n columnVisibility,\n columnVisibilityUpdater,\n columnPinning,\n columnPinningUpdater,\n columnOrder,\n columnOrderUpdater,\n columnSizing,\n columnSizingUpdater,\n } = useColumnSettingsContext()\n\n const {\n projectInfo,\n tableData,\n attribFields,\n entitiesMap,\n users,\n isLoading: isLoadingData,\n isInitialized,\n expanded,\n projectName,\n updateExpanded,\n toggleExpandAll,\n sorting,\n updateSorting,\n showHierarchy,\n } = useProjectTableContext()\n\n const isLoading = isLoadingProp || isLoadingData\n\n const { statuses = [], folderTypes = [], taskTypes = [], tags = [] } = projectInfo || {}\n const options: BuiltInFieldOptions = useMemo(\n () =>\n getTableFieldOptions({\n users,\n statuses,\n folderTypes,\n taskTypes,\n tags,\n }),\n [users, statuses, folderTypes, taskTypes],\n )\n\n //The virtualizer needs to know the scrollable container element\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n // Selection context\n const { registerGrid } = useSelectionCellsContext()\n\n //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data\n useEffect(() => {\n fetchMoreOnBottomReached(tableContainerRef.current)\n }, [fetchMoreOnBottomReached])\n\n // generate loading attrib and rows\n const { loadingAttrib, loadingRows } = useMemo(() => {\n // count the number of children in tbody\n const tableRowsCount = tableContainerRef.current?.querySelectorAll('tbody tr').length || 0\n const loadingAttrib = generateDummyAttributes()\n const loadingRows = generateLoadingRows(\n attribFields,\n showHierarchy && tableData.length > 0 ? Math.min(tableRowsCount, 50) : 50,\n )\n return { loadingAttrib, loadingRows }\n }, [attribFields, tableData, showHierarchy, tableContainerRef.current])\n\n const showLoadingRows = !isInitialized || isLoading\n\n // Format readonly columns and attributes\n const { readOnlyColumns, readOnlyAttribs } = useMemo(\n () => getReadOnlyLists(attribFields, readOnly),\n [attribFields, readOnly],\n )\n\n const { updateEntities } = useCellEditing()\n\n const columnAttribs = useMemo(\n () => (isInitialized ? attribFields : loadingAttrib),\n [attribFields, loadingAttrib, isInitialized],\n )\n const columns = useMemo(\n () =>\n buildTreeTableColumns({\n attribs: columnAttribs,\n showHierarchy,\n options,\n extraColumns,\n excluded: excludedColumns,\n }),\n [columnAttribs, showHierarchy, options, extraColumns, excludedColumns],\n )\n\n const table = useReactTable({\n data: showLoadingRows ? loadingRows : tableData,\n columns,\n defaultColumn: {\n minSize: 50,\n size: 150,\n },\n enableRowSelection: true, //enable row selection for all rows\n getRowId: (row) => row.id,\n enableSubRowSelection: false, //disable sub row selection\n getSubRows: (row) => row.subRows,\n getRowCanExpand: () => true,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n filterFromLeafRows: true,\n // EXPANDABLE\n onExpandedChange: updateExpanded,\n // SORTING\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: updateSorting,\n columnResizeMode: 'onChange',\n onColumnPinningChange: columnPinningUpdater,\n onColumnSizingChange: columnSizingUpdater,\n onColumnVisibilityChange: columnVisibilityUpdater,\n onColumnOrderChange: columnOrderUpdater,\n // @ts-ignore\n filterFns,\n state: {\n expanded,\n sorting,\n columnPinning: {\n left: [ROW_SELECTION_COLUMN_ID, ...(columnPinning.left || [])],\n right: columnPinning.right,\n },\n columnSizing,\n columnVisibility,\n columnOrder,\n },\n enableSorting: true,\n meta: {\n projectName,\n options,\n readOnly: readOnlyColumns,\n updateEntities,\n toggleExpandAll,\n },\n })\n\n const { rows } = table.getRowModel()\n\n // Register grid structure with selection context when rows or columns change\n useEffect(() => {\n const rowIds = rows.map((row) => row.id)\n const colIds = table.getAllLeafColumns().map((col) => col.id)\n const colIdsSortedByPinning = [...colIds].sort((a, b) => {\n if (ROW_SELECTION_COLUMN_ID === b) return 1\n const colA = columnPinning.left?.includes(a) ? 0 : 1\n const colB = columnPinning.left?.includes(b) ? 0 : 1\n return colA - colB\n })\n\n registerGrid(rowIds, colIdsSortedByPinning)\n }, [rows, table.getAllLeafColumns(), columnPinning, ROW_SELECTION_COLUMN_ID, registerGrid])\n\n const visibleColumns = table.getVisibleLeafColumns()\n\n // Use the column virtualization hook\n const { columnVirtualizer, virtualPaddingLeft, virtualPaddingRight } = useColumnVirtualization({\n visibleColumns,\n tableContainerRef,\n columnPinning,\n })\n\n const columnSizeVars = useCustomColumnWidthVars(table, columnSizing)\n\n const attribByField = useMemo(() => {\n return attribFields.reduce((acc: Record<string, AttributeEnumItem[]>, attrib) => {\n if (attrib.data?.enum?.length) {\n acc[attrib.name] = attrib.data?.enum\n }\n return acc\n }, {})\n }, [attribFields])\n\n return (\n <ClipboardProvider\n entitiesMap={entitiesMap}\n columnEnums={{ ...options, ...attribByField }}\n columnReadOnly={readOnlyAttribs}\n >\n <Styled.TableWrapper {...props}>\n <Styled.TableContainer\n ref={tableContainerRef}\n style={{ height: '100%', padding: 0 }}\n onScroll={(e) => fetchMoreOnBottomReached(e.currentTarget)}\n {...pt?.container}\n className={clsx('table-container', pt?.container?.className)}\n >\n <table\n style={{\n display: 'grid',\n borderCollapse: 'collapse',\n userSelect: 'none',\n ...columnSizeVars,\n width: table.getTotalSize(),\n }}\n >\n <TableHead\n columnVirtualizer={columnVirtualizer}\n table={table}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n {...pt?.head}\n />\n <TableBody\n columnVirtualizer={columnVirtualizer}\n table={table}\n tableContainerRef={tableContainerRef}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n showHierarchy={showHierarchy}\n attribs={attribFields}\n onOpenNew={onOpenNew}\n />\n </table>\n </Styled.TableContainer>\n </Styled.TableWrapper>\n </ClipboardProvider>\n )\n}\n\ninterface TableHeadProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHead = ({\n columnVirtualizer,\n table,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n ...props\n}: TableHeadProps) => {\n return (\n <Styled.TableHeader {...props}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableHeadRow\n key={headerGroup.id}\n columnVirtualizer={columnVirtualizer}\n headerGroup={headerGroup}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n isLoading={isLoading}\n readOnlyColumns={readOnlyColumns}\n />\n ))}\n </Styled.TableHeader>\n )\n}\n\ninterface TableHeadRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n headerGroup: HeaderGroup<TableRow>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n isLoading: boolean\n readOnlyColumns?: string[]\n}\n\nconst TableHeadRow = ({\n columnVirtualizer,\n headerGroup,\n virtualPaddingLeft,\n virtualPaddingRight,\n isLoading,\n readOnlyColumns,\n}: TableHeadRowProps) => {\n const virtualColumns = columnVirtualizer.getVirtualItems()\n return (\n <Styled.ColumnHeader key={headerGroup.id} style={{ display: 'flex' }}>\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((virtualColumn) => {\n const header = headerGroup.headers[virtualColumn.index]\n\n return (\n <TableHeadCell\n key={header.id}\n header={header}\n isLoading={isLoading}\n isReadOnly={readOnlyColumns?.includes(header.id)}\n canSort={header.column.getCanSort()}\n canFilter={header.column.getCanFilter()}\n canHide={header.column.getCanHide()}\n canPin={header.column.getCanPin()}\n canResize={header.column.getCanResize()}\n />\n )\n })}\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <th style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.ColumnHeader>\n )\n}\n\ninterface TableHeadCellProps {\n header: Header<TableRow, unknown>\n isLoading: boolean\n canSort?: boolean\n canFilter?: boolean\n canHide?: boolean\n canPin?: boolean\n canResize?: boolean\n isReadOnly?: boolean\n}\n\nconst TableHeadCell = ({\n header,\n isLoading,\n canFilter,\n canHide,\n canSort,\n canPin,\n canResize,\n isReadOnly,\n}: TableHeadCellProps) => {\n const { column } = header\n\n return (\n <Styled.HeaderCell\n className={clsx(header.id, 'shimmer-dark', {\n loading: isLoading,\n 'last-pinned-left': column.getIsPinned() === 'left' && column.getIsLastColumn('left'),\n })}\n key={header.id}\n style={{\n ...getCommonPinningStyles(column),\n width: `calc(var(--header-${header?.id}-size) * 1px)`,\n }}\n >\n {header.isPlaceholder ? null : (\n <Styled.TableCellContent className={clsx('bold')}>\n {flexRender(column.columnDef.header, header.getContext())}\n {isReadOnly && (\n <Icon icon=\"lock\" data-tooltip={'You only have permission to read this column.'} />\n )}\n\n <Styled.HeaderButtons className=\"actions\">\n {/* COLUMN HIDING */}\n {canHide && (\n <HeaderActionButton\n icon=\"visibility_off\"\n selected={!column.getIsVisible()}\n onClick={column.getToggleVisibilityHandler()}\n />\n )}\n {/* COLUMN PINNING */}\n {canPin && (\n <HeaderActionButton\n icon=\"push_pin\"\n selected={header.column.getIsPinned() === 'left'}\n onClick={() => {\n if (header.column.getIsPinned() === 'left') {\n header.column.pin(false)\n } else {\n header.column.pin('left')\n }\n }}\n />\n )}\n\n {/* COLUMN SORTING */}\n {canSort && (\n <HeaderActionButton\n icon={'sort'}\n style={{\n transform: (column.getIsSorted() as string) === 'asc' ? 'scaleY(-1)' : undefined,\n }}\n onClick={column.getToggleSortingHandler()}\n selected={!!column.getIsSorted()}\n />\n )}\n </Styled.HeaderButtons>\n {canResize && (\n <Styled.ResizedHandler\n {...{\n onDoubleClick: () => column.resetSize(),\n onMouseDown: header.getResizeHandler(),\n onTouchStart: header.getResizeHandler(),\n className: clsx('resize-handle', {\n resizing: column.getIsResizing(),\n }),\n }}\n />\n )}\n </Styled.TableCellContent>\n )}\n </Styled.HeaderCell>\n )\n}\n\ninterface TableBodyProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n table: Table<TableRow>\n tableContainerRef: React.RefObject<HTMLDivElement>\n showHierarchy: boolean\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n attribs: ProjectTableAttribute[]\n onOpenNew?: (type: 'folder' | 'task') => void\n}\n\nconst TableBody = ({\n columnVirtualizer,\n table,\n tableContainerRef,\n showHierarchy,\n virtualPaddingLeft,\n virtualPaddingRight,\n attribs,\n onOpenNew,\n}: TableBodyProps) => {\n const { handleTableBodyContextMenu } = useCellContextMenu({ attribs, onOpenNew })\n\n const { handlePreFetchTasks } = usePrefetchFolderTasks()\n\n const { rows } = table.getRowModel()\n\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: () => (showHierarchy ? 36 : 40), //estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n //measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n const virtualRows = rowVirtualizer.getVirtualItems()\n\n useKeyboardNavigation()\n\n return virtualRows.length ? (\n <tbody\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n position: 'relative',\n display: 'grid',\n }}\n onContextMenu={handleTableBodyContextMenu}\n onMouseOver={(e) => {\n handlePreFetchTasks(e)\n }}\n >\n {virtualRows.map((virtualRow) => {\n const row = rows[virtualRow.index] as Row<TableRow>\n return (\n <TableBodyRow\n key={row.id}\n columnVirtualizer={columnVirtualizer}\n row={row}\n rowVirtualizer={rowVirtualizer}\n virtualPaddingLeft={virtualPaddingLeft}\n virtualPaddingRight={virtualPaddingRight}\n virtualRow={virtualRow}\n showHierarchy={showHierarchy}\n />\n )\n })}\n </tbody>\n ) : (\n tableContainerRef.current &&\n createPortal(<EmptyPlaceholder message=\"No items found\" />, tableContainerRef.current)\n )\n}\n\ninterface TableBodyRowProps {\n columnVirtualizer: Virtualizer<HTMLDivElement, HTMLTableCellElement>\n row: Row<TableRow>\n rowVirtualizer: Virtualizer<HTMLDivElement, HTMLTableRowElement>\n virtualPaddingLeft: number | undefined\n virtualPaddingRight: number | undefined\n virtualRow: VirtualItem\n showHierarchy: boolean\n}\n\nconst TableBodyRow = ({\n columnVirtualizer,\n row,\n rowVirtualizer,\n virtualPaddingLeft,\n virtualPaddingRight,\n virtualRow,\n showHierarchy,\n}: TableBodyRowProps) => {\n // We should do this so that we don't re-render every time anything in projectTableContext changes\n const visibleCells = row.getVisibleCells()\n const virtualColumns = columnVirtualizer.getVirtualItems()\n\n return (\n <Styled.TR\n data-index={virtualRow.index} //needed for dynamic row height measurement\n ref={(node) => rowVirtualizer.measureElement(node)} //measure dynamic row height\n key={row.id}\n style={{\n transform: `translateY(${virtualRow.start}px)`, //this should always be a `style` as it changes on scroll\n }}\n >\n {virtualPaddingLeft ? (\n //fake empty column to the left for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingLeft }} />\n ) : null}\n {virtualColumns.map((vc) => {\n const cell = visibleCells[vc.index]\n const cellId = getCellId(row.id, cell.column.id)\n return (\n <TableCellMemo\n cell={cell}\n cellId={cellId}\n rowId={row.id}\n key={cell.id}\n showHierarchy={showHierarchy}\n />\n )\n })}\n\n {virtualPaddingRight ? (\n //fake empty column to the right for virtualization scroll padding\n <td style={{ display: 'flex', width: virtualPaddingRight }} />\n ) : null}\n </Styled.TR>\n )\n}\n\ninterface TableCellProps {\n cell: Cell<TableRow, unknown>\n cellId: string\n rowId: string\n className?: string\n showHierarchy: boolean\n}\n\nconst TableCell = ({ cell, rowId, cellId, className, showHierarchy, ...props }: TableCellProps) => {\n const {\n isCellSelected,\n isCellFocused,\n startSelection,\n extendSelection,\n endSelection,\n selectCell,\n getCellBorderClasses,\n } = useSelectionCellsContext()\n\n const { isRowSelected } = useSelectedRowsContext()\n\n const { isEditing } = useCellEditing()\n\n const borderClasses = getCellBorderClasses(cellId)\n\n const isPinned = cell.column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && cell.column.getIsLastColumn('left')\n const isRowSelectionColumn = cell.column.id === ROW_SELECTION_COLUMN_ID\n\n return (\n <Styled.TableCell\n {...props}\n tabIndex={0}\n key={cell.id}\n $isLastPinned={isLastLeftPinnedColumn} // is this column the last pinned column? Custom styling for borders.\n className={clsx(\n cell.column.id,\n {\n selected: isCellSelected(cellId),\n focused: isCellFocused(cellId),\n editing: isEditing(cellId),\n 'last-pinned-left': isLastLeftPinnedColumn,\n 'selected-row': isRowSelected(rowId),\n task: cell.row.original.entityType === 'task',\n },\n className,\n ...borderClasses,\n )}\n style={{\n ...getCommonPinningStyles(cell.column),\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n height: showHierarchy ? 36 : 40,\n }}\n onMouseDown={(e) => {\n // Only process left clicks (button 0), ignore right clicks\n if (e.button !== 0) return\n\n // check we are not clicking on expander\n if ((e.target as HTMLElement).closest('.expander')) return\n const additive = e.metaKey || e.ctrlKey || isRowSelectionColumn\n if (e.shiftKey) {\n // Shift+click extends selection from anchor cell\n selectCell(cellId, additive, true) // true for range selection\n } else {\n // Normal click starts a new selection\n startSelection(cellId, additive)\n }\n }}\n onMouseOver={(e) => {\n if (e.buttons === 1) {\n // Left button is pressed during mouse move - drag selection\n extendSelection(cellId, isRowSelectionColumn)\n }\n }}\n onMouseUp={() => {\n endSelection(cellId)\n }}\n onDoubleClick={(e) => {\n if (cell.column.id === 'name') {\n // select the row by selecting the row-selection cell\n const rowSelectionCellId = getCellId(cell.row.id, ROW_SELECTION_COLUMN_ID)\n if (!isCellSelected(rowSelectionCellId)) {\n const additive = e.metaKey || e.ctrlKey\n selectCell(rowSelectionCellId, additive, false)\n }\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault()\n // if the cell is not selected, select it and deselect all others\n if (!isCellSelected(cellId)) {\n selectCell(cellId, false, false)\n }\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Styled.TableCell>\n )\n}\n\nconst TableCellMemo = memo(TableCell)\n"],"names":["_a","loadingAttrib","loadingRows","jsx","Styled.TableWrapper","Styled.TableContainer","jsxs","Styled.TableHeader","Styled.ColumnHeader","Styled.HeaderCell","Styled.TableCellContent","Styled.HeaderButtons","Styled.ResizedHandler","Styled.TR","Styled.TableCell"],"mappings":"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"}
|
|
@@ -58,7 +58,6 @@ const buildTreeTableColumns = ({
|
|
|
58
58
|
excluded,
|
|
59
59
|
extraColumns
|
|
60
60
|
}) => {
|
|
61
|
-
console.log("building columns");
|
|
62
61
|
const staticColumns = [];
|
|
63
62
|
const isIncluded = (id) => !(excluded == null ? void 0 : excluded.includes(id));
|
|
64
63
|
if (isIncluded(SelectionCellsContext.ROW_SELECTION_COLUMN_ID)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildTreeTableColumns.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/buildTreeTableColumns.tsx"],"sourcesContent":["import { ColumnDef, FilterFnOption, Row, SortingFn, sortingFns } from '@tanstack/react-table'\nimport { TableRow } from './types/table'\nimport { AttributeData, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { CellWidget, EntityNameWidget, ThumbnailWidget } from './widgets'\nimport { getCellId, getCellValue } from './utils/cellUtils'\nimport { TableCellContent } from './ProjectTreeTable.styled'\nimport clsx from 'clsx'\nimport { SelectionCell } from './components/SelectionCell'\nimport RowSelectionHeader from './components/RowSelectionHeader'\nimport { ROW_SELECTION_COLUMN_ID } from './context/SelectionCellsContext'\n\n// Wrapper function for sorting that pushes isLoading rows to the bottom\nconst withLoadingStateSort = (sortFn: SortingFn<any>): SortingFn<any> => {\n return (rowA, rowB, ...args) => {\n // If row loading states differ, prioritize non-loading rows\n if (rowA.original.isLoading !== rowB.original.isLoading) {\n return rowA.original.isLoading ? 1 : -1\n }\n // Otherwise, use the original sort function\n return sortFn(rowA, rowB, ...args)\n }\n}\n\nconst nameSort: SortingFn<any> = (rowA, rowB) => {\n const labelA = rowA.original.label || rowA.original.name\n const labelB = rowB.original.label || rowB.original.name\n // sort alphabetically by label\n return labelA.localeCompare(labelB)\n}\nconst pathSort: SortingFn<any> = (rowA, rowB) => {\n const labelA = rowA.original.path || rowA.original.name\n const labelB = rowB.original.path || rowB.original.name\n // sort alphabetically by label\n return labelA.localeCompare(labelB)\n}\n\ntype AttribSortingFn = (rowA: any, rowB: any, columnId: string, attribute?: AttributeData) => number\n// sort by the order of the enum options\nconst attribSort: AttribSortingFn = (rowA, rowB, columnId, attrib) => {\n const valueA = getCellValue(rowA.original, columnId)\n const valueB = getCellValue(rowB.original, columnId)\n // if attrib is defined and has enum options, use them\n if (attrib && attrib.enum) {\n const indexA = attrib.enum.findIndex((o) => o.value === valueA)\n const indexB = attrib.enum.findIndex((o) => o.value === valueB)\n return indexA - indexB < 0 ? 1 : -1\n } else if (attrib?.type === 'datetime') {\n return sortingFns.datetime(rowA, rowB, columnId)\n } else if (attrib?.type === 'boolean') {\n const boolA = valueA === true ? 1 : 0\n const boolB = valueB === true ? 1 : 0\n return boolA - boolB\n } else {\n // default sorting\n return sortingFns.alphanumeric(rowA, rowB, columnId)\n }\n}\n\nexport type DefaultColumns =\n | typeof ROW_SELECTION_COLUMN_ID\n | 'thumbnail'\n | 'name'\n | 'status'\n | 'subType'\n | 'assignees'\n | 'tags'\n\nexport type TreeTableExtraColumn = { column: ColumnDef<TableRow>; position?: number }\n\nexport type BuildTreeTableColumnsProps = {\n attribs: ProjectTableAttribute[]\n showHierarchy: boolean\n options: BuiltInFieldOptions\n excluded?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n}\n\nconst buildTreeTableColumns = ({\n attribs,\n showHierarchy,\n options,\n excluded,\n extraColumns,\n}: BuildTreeTableColumnsProps) => {\n console.log('building columns')\n const staticColumns: ColumnDef<TableRow>[] = []\n\n // Helper to check if a column should be included\n const isIncluded = (id: DefaultColumns | string) => !excluded?.includes(id)\n\n // Conditionally add static columns\n if (isIncluded(ROW_SELECTION_COLUMN_ID)) {\n staticColumns.push({\n id: ROW_SELECTION_COLUMN_ID,\n enableResizing: false,\n enableSorting: false,\n enablePinning: false,\n enableHiding: false,\n\n header: () => <RowSelectionHeader />,\n cell: () => <SelectionCell />,\n size: 20,\n })\n }\n\n if (isIncluded('thumbnail')) {\n staticColumns.push({\n id: 'thumbnail',\n header: '',\n size: 63,\n minSize: 64,\n enableResizing: true,\n enableSorting: false,\n cell: ({ row, table }) => {\n const meta = table.options.meta\n if (!meta) return null\n return (\n <ThumbnailWidget\n entityId={row.original.entityId || row.id}\n entityType={row.original.entityType}\n updatedAt={row.original.updatedAt}\n icon={row.original.icon}\n projectName={meta?.projectName}\n />\n )\n },\n })\n }\n\n if (isIncluded('name')) {\n staticColumns.push({\n id: 'name',\n accessorKey: 'name',\n header: () => 'Folder / Task',\n sortingFn: withLoadingStateSort(showHierarchy ? nameSort : pathSort),\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const cellId = getCellId(row.id, column.id)\n return (\n <TableCellContent\n id={cellId}\n className={clsx('large', row.original.entityType, {\n loading: row.original.isLoading,\n hierarchy: showHierarchy,\n })}\n style={{\n paddingLeft: `calc(${row.depth * 1}rem + 8px)`,\n }}\n tabIndex={0}\n >\n <EntityNameWidget\n id={row.id}\n label={row.original.label}\n name={row.original.name}\n path={!showHierarchy ? row.original.path : undefined}\n showHierarchy={showHierarchy}\n icon={row.original.icon}\n type={row.original.entityType}\n isExpanded={row.getIsExpanded()}\n toggleExpandAll={() => meta?.toggleExpandAll([row.id])}\n toggleExpanded={row.getToggleExpandedHandler()}\n />\n </TableCellContent>\n )\n },\n })\n }\n\n if (isIncluded('status')) {\n staticColumns.push({\n id: 'status',\n accessorKey: 'status',\n header: () => 'Status',\n sortingFn: withLoadingStateSort((a, b, c) =>\n attribSort(a, b, c, { enum: options.status, type: 'string' }),\n ),\n sortDescFirst: true,\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const meta = table.options.meta\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('status', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={meta?.options.status.filter((s) => s.scope?.includes(type))}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: column.id, value, id, type, rowId: id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )\n },\n })\n }\n\n if (isIncluded('subType')) {\n staticColumns.push({\n id: 'subType',\n accessorKey: 'subType',\n header: () => 'Type',\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const fieldId = type === 'folder' ? 'folderType' : 'taskType'\n const meta = table.options.meta\n return (\n <CellWidget\n rowId={id}\n className={clsx('subType', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={\n type === 'folder'\n ? meta?.options.folderType\n : type === 'task'\n ? meta?.options.taskType\n : []\n }\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: fieldId, value, id, type, rowId: row.id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )\n },\n })\n }\n\n if (isIncluded('assignees')) {\n staticColumns.push({\n id: 'assignees',\n accessorKey: 'assignees',\n header: () => 'Assignees',\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (type === 'folder')\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value=\"\"\n isPlaceholder\n />\n )\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options.assignee}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: column.id, value, id, type, rowId: row.id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n pt={{\n enum: {\n multiSelectClose: value?.length === 0, // close the dropdown on first assignment\n search: true, // enable search at all times\n multipleOverride: false,\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded('tags')) {\n staticColumns.push({\n id: 'tags',\n accessorKey: 'tags',\n header: () => 'Tags',\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n return (\n <CellWidget\n rowId={id}\n className={clsx('tags', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options.tag}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: column.id, value, id, type, rowId: row.id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n enableCustomValues\n />\n )\n },\n })\n }\n\n const attributeColumns: ColumnDef<TableRow>[] = attribs\n .filter((attrib) => {\n const columnId = 'attrib_' + attrib.name\n // Check if the specific attribute column is excluded\n // or if all built-in attributes are excluded and this is a built-in attribute\n if (excluded?.includes(columnId)) return false\n if (attrib.builtin && excluded?.includes('attrib')) return false\n return true\n })\n .map((attrib) => {\n const attribColumn: ColumnDef<TableRow> = {\n id: 'attrib_' + attrib.name,\n accessorKey: 'attrib.' + attrib.name,\n header: () => attrib.data.title || attrib.name,\n filterFn: 'fuzzy' as FilterFnOption<TableRow>,\n sortingFn: withLoadingStateSort((a, b, c) => attribSort(a, b, c, attrib.data)),\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const columnIdParsed = column.id.replace('attrib_', '')\n const { value, id, type } = getValueIdType(row, columnIdParsed, 'attrib')\n const isInherited = !row.original.ownAttrib.includes(columnIdParsed)\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('attrib', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: attrib.data.type || 'string' }}\n options={attrib.data.enum || []}\n isCollapsed={!!row.original.childOnlyMatch}\n isInherited={isInherited && ['folder', 'task'].includes(type)}\n isReadOnly={\n attrib.readOnly ||\n meta?.readOnly?.some(\n (id) => id === columnIdParsed || (id === 'attrib' && attrib.builtin),\n )\n }\n onChange={(value) =>\n meta?.updateEntities([\n { field: columnIdParsed, value, id, type, isAttrib: true, rowId: row.id },\n ])\n }\n />\n )\n },\n }\n return attribColumn\n })\n\n const allColumns = [...staticColumns, ...attributeColumns]\n\n // Add extra columns if provided\n if (extraColumns) {\n extraColumns.forEach(({ column, position = -1 }) => {\n if (position >= 0 && position < allColumns.length) {\n allColumns.splice(position, 0, column)\n } else {\n allColumns.push(column)\n }\n })\n }\n\n return allColumns\n}\n\nexport default buildTreeTableColumns\n\nexport const getValueIdType = (\n row: Row<TableRow>,\n field: string,\n nestedField?: keyof TableRow,\n): {\n value: any\n id: string\n type: string\n} => ({\n value: nestedField\n ? (row.original[nestedField as keyof TableRow] as any)?.[field]\n : (row.original[field as keyof TableRow] as any),\n id: row.id,\n type: row.original.entityType,\n})\n"],"names":["getCellValue","sortingFns","ROW_SELECTION_COLUMN_ID","jsx","SelectionCell","ThumbnailWidget","getCellId","TableCellContent","EntityNameWidget","CellWidget","_a","value","id"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buildTreeTableColumns.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/buildTreeTableColumns.tsx"],"sourcesContent":["import { ColumnDef, FilterFnOption, Row, SortingFn, sortingFns } from '@tanstack/react-table'\nimport { TableRow } from './types/table'\nimport { AttributeData, ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport { CellWidget, EntityNameWidget, ThumbnailWidget } from './widgets'\nimport { getCellId, getCellValue } from './utils/cellUtils'\nimport { TableCellContent } from './ProjectTreeTable.styled'\nimport clsx from 'clsx'\nimport { SelectionCell } from './components/SelectionCell'\nimport RowSelectionHeader from './components/RowSelectionHeader'\nimport { ROW_SELECTION_COLUMN_ID } from './context/SelectionCellsContext'\n\n// Wrapper function for sorting that pushes isLoading rows to the bottom\nconst withLoadingStateSort = (sortFn: SortingFn<any>): SortingFn<any> => {\n return (rowA, rowB, ...args) => {\n // If row loading states differ, prioritize non-loading rows\n if (rowA.original.isLoading !== rowB.original.isLoading) {\n return rowA.original.isLoading ? 1 : -1\n }\n // Otherwise, use the original sort function\n return sortFn(rowA, rowB, ...args)\n }\n}\n\nconst nameSort: SortingFn<any> = (rowA, rowB) => {\n const labelA = rowA.original.label || rowA.original.name\n const labelB = rowB.original.label || rowB.original.name\n // sort alphabetically by label\n return labelA.localeCompare(labelB)\n}\nconst pathSort: SortingFn<any> = (rowA, rowB) => {\n const labelA = rowA.original.path || rowA.original.name\n const labelB = rowB.original.path || rowB.original.name\n // sort alphabetically by label\n return labelA.localeCompare(labelB)\n}\n\ntype AttribSortingFn = (rowA: any, rowB: any, columnId: string, attribute?: AttributeData) => number\n// sort by the order of the enum options\nconst attribSort: AttribSortingFn = (rowA, rowB, columnId, attrib) => {\n const valueA = getCellValue(rowA.original, columnId)\n const valueB = getCellValue(rowB.original, columnId)\n // if attrib is defined and has enum options, use them\n if (attrib && attrib.enum) {\n const indexA = attrib.enum.findIndex((o) => o.value === valueA)\n const indexB = attrib.enum.findIndex((o) => o.value === valueB)\n return indexA - indexB < 0 ? 1 : -1\n } else if (attrib?.type === 'datetime') {\n return sortingFns.datetime(rowA, rowB, columnId)\n } else if (attrib?.type === 'boolean') {\n const boolA = valueA === true ? 1 : 0\n const boolB = valueB === true ? 1 : 0\n return boolA - boolB\n } else {\n // default sorting\n return sortingFns.alphanumeric(rowA, rowB, columnId)\n }\n}\n\nexport type DefaultColumns =\n | typeof ROW_SELECTION_COLUMN_ID\n | 'thumbnail'\n | 'name'\n | 'status'\n | 'subType'\n | 'assignees'\n | 'tags'\n\nexport type TreeTableExtraColumn = { column: ColumnDef<TableRow>; position?: number }\n\nexport type BuildTreeTableColumnsProps = {\n attribs: ProjectTableAttribute[]\n showHierarchy: boolean\n options: BuiltInFieldOptions\n excluded?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n}\n\nconst buildTreeTableColumns = ({\n attribs,\n showHierarchy,\n options,\n excluded,\n extraColumns,\n}: BuildTreeTableColumnsProps) => {\n const staticColumns: ColumnDef<TableRow>[] = []\n\n // Helper to check if a column should be included\n const isIncluded = (id: DefaultColumns | string) => !excluded?.includes(id)\n\n // Conditionally add static columns\n if (isIncluded(ROW_SELECTION_COLUMN_ID)) {\n staticColumns.push({\n id: ROW_SELECTION_COLUMN_ID,\n enableResizing: false,\n enableSorting: false,\n enablePinning: false,\n enableHiding: false,\n\n header: () => <RowSelectionHeader />,\n cell: () => <SelectionCell />,\n size: 20,\n })\n }\n\n if (isIncluded('thumbnail')) {\n staticColumns.push({\n id: 'thumbnail',\n header: '',\n size: 63,\n minSize: 64,\n enableResizing: true,\n enableSorting: false,\n cell: ({ row, table }) => {\n const meta = table.options.meta\n if (!meta) return null\n return (\n <ThumbnailWidget\n entityId={row.original.entityId || row.id}\n entityType={row.original.entityType}\n updatedAt={row.original.updatedAt}\n icon={row.original.icon}\n projectName={meta?.projectName}\n />\n )\n },\n })\n }\n\n if (isIncluded('name')) {\n staticColumns.push({\n id: 'name',\n accessorKey: 'name',\n header: () => 'Folder / Task',\n sortingFn: withLoadingStateSort(showHierarchy ? nameSort : pathSort),\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const cellId = getCellId(row.id, column.id)\n return (\n <TableCellContent\n id={cellId}\n className={clsx('large', row.original.entityType, {\n loading: row.original.isLoading,\n hierarchy: showHierarchy,\n })}\n style={{\n paddingLeft: `calc(${row.depth * 1}rem + 8px)`,\n }}\n tabIndex={0}\n >\n <EntityNameWidget\n id={row.id}\n label={row.original.label}\n name={row.original.name}\n path={!showHierarchy ? row.original.path : undefined}\n showHierarchy={showHierarchy}\n icon={row.original.icon}\n type={row.original.entityType}\n isExpanded={row.getIsExpanded()}\n toggleExpandAll={() => meta?.toggleExpandAll([row.id])}\n toggleExpanded={row.getToggleExpandedHandler()}\n />\n </TableCellContent>\n )\n },\n })\n }\n\n if (isIncluded('status')) {\n staticColumns.push({\n id: 'status',\n accessorKey: 'status',\n header: () => 'Status',\n sortingFn: withLoadingStateSort((a, b, c) =>\n attribSort(a, b, c, { enum: options.status, type: 'string' }),\n ),\n sortDescFirst: true,\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const meta = table.options.meta\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('status', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={meta?.options.status.filter((s) => s.scope?.includes(type))}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: column.id, value, id, type, rowId: id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )\n },\n })\n }\n\n if (isIncluded('subType')) {\n staticColumns.push({\n id: 'subType',\n accessorKey: 'subType',\n header: () => 'Type',\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const fieldId = type === 'folder' ? 'folderType' : 'taskType'\n const meta = table.options.meta\n return (\n <CellWidget\n rowId={id}\n className={clsx('subType', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={\n type === 'folder'\n ? meta?.options.folderType\n : type === 'task'\n ? meta?.options.taskType\n : []\n }\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: fieldId, value, id, type, rowId: row.id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )\n },\n })\n }\n\n if (isIncluded('assignees')) {\n staticColumns.push({\n id: 'assignees',\n accessorKey: 'assignees',\n header: () => 'Assignees',\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (type === 'folder')\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value=\"\"\n isPlaceholder\n />\n )\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options.assignee}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: column.id, value, id, type, rowId: row.id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n pt={{\n enum: {\n multiSelectClose: value?.length === 0, // close the dropdown on first assignment\n search: true, // enable search at all times\n multipleOverride: false,\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded('tags')) {\n staticColumns.push({\n id: 'tags',\n accessorKey: 'tags',\n header: () => 'Tags',\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n return (\n <CellWidget\n rowId={id}\n className={clsx('tags', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options.tag}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities([{ field: column.id, value, id, type, rowId: row.id }])\n }\n isReadOnly={meta?.readOnly?.includes(column.id)}\n enableCustomValues\n />\n )\n },\n })\n }\n\n const attributeColumns: ColumnDef<TableRow>[] = attribs\n .filter((attrib) => {\n const columnId = 'attrib_' + attrib.name\n // Check if the specific attribute column is excluded\n // or if all built-in attributes are excluded and this is a built-in attribute\n if (excluded?.includes(columnId)) return false\n if (attrib.builtin && excluded?.includes('attrib')) return false\n return true\n })\n .map((attrib) => {\n const attribColumn: ColumnDef<TableRow> = {\n id: 'attrib_' + attrib.name,\n accessorKey: 'attrib.' + attrib.name,\n header: () => attrib.data.title || attrib.name,\n filterFn: 'fuzzy' as FilterFnOption<TableRow>,\n sortingFn: withLoadingStateSort((a, b, c) => attribSort(a, b, c, attrib.data)),\n enableSorting: true,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const columnIdParsed = column.id.replace('attrib_', '')\n const { value, id, type } = getValueIdType(row, columnIdParsed, 'attrib')\n const isInherited = !row.original.ownAttrib.includes(columnIdParsed)\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('attrib', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: attrib.data.type || 'string' }}\n options={attrib.data.enum || []}\n isCollapsed={!!row.original.childOnlyMatch}\n isInherited={isInherited && ['folder', 'task'].includes(type)}\n isReadOnly={\n attrib.readOnly ||\n meta?.readOnly?.some(\n (id) => id === columnIdParsed || (id === 'attrib' && attrib.builtin),\n )\n }\n onChange={(value) =>\n meta?.updateEntities([\n { field: columnIdParsed, value, id, type, isAttrib: true, rowId: row.id },\n ])\n }\n />\n )\n },\n }\n return attribColumn\n })\n\n const allColumns = [...staticColumns, ...attributeColumns]\n\n // Add extra columns if provided\n if (extraColumns) {\n extraColumns.forEach(({ column, position = -1 }) => {\n if (position >= 0 && position < allColumns.length) {\n allColumns.splice(position, 0, column)\n } else {\n allColumns.push(column)\n }\n })\n }\n\n return allColumns\n}\n\nexport default buildTreeTableColumns\n\nexport const getValueIdType = (\n row: Row<TableRow>,\n field: string,\n nestedField?: keyof TableRow,\n): {\n value: any\n id: string\n type: string\n} => ({\n value: nestedField\n ? (row.original[nestedField as keyof TableRow] as any)?.[field]\n : (row.original[field as keyof TableRow] as any),\n id: row.id,\n type: row.original.entityType,\n})\n"],"names":["getCellValue","sortingFns","ROW_SELECTION_COLUMN_ID","jsx","SelectionCell","ThumbnailWidget","getCellId","TableCellContent","EntityNameWidget","CellWidget","_a","value","id"],"mappings":"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"}
|
|
@@ -56,7 +56,6 @@ const buildTreeTableColumns = ({
|
|
|
56
56
|
excluded,
|
|
57
57
|
extraColumns
|
|
58
58
|
}) => {
|
|
59
|
-
console.log("building columns");
|
|
60
59
|
const staticColumns = [];
|
|
61
60
|
const isIncluded = (id) => !(excluded == null ? void 0 : excluded.includes(id));
|
|
62
61
|
if (isIncluded(ROW_SELECTION_COLUMN_ID)) {
|