{"version":3,"file":"EmbeddedTable.mjs","sources":["../../../../../../../../../web/src/adminPortal/shared/components/EmbeddedTable.tsx"],"sourcesContent":["import {\n  styled,\n  SxProps,\n  Table,\n  TableBody,\n  TableCell,\n  TableContainer,\n  TableHead,\n  TableRow,\n  Theme,\n} from '@mui/material';\nimport React, { ReactNode, useCallback, useEffect, useState } from 'react';\n\nimport { getTableCellValue, validateRowKey } from '../utils/tableUtils';\nimport { InjectedComponents } from './componentInjection';\nimport { TABLE_ACTIONS_HEADER, TableActionCoreProps, TableActionsContainer } from './TableActions';\nimport { TableItemRenderer } from './types';\n\nconst StyledTable = styled(Table)<{ hasActions: boolean }>(({ hasActions }) => [\n  // For some reason with position sticky, the table is 2px wider than the container\n  hasActions && { width: 'calc(100% - 2px)' },\n]);\n\nconst StyleTabledCell = styled(TableCell)<{ isActions?: boolean; isBottomAction?: boolean }>(\n  ({ isActions, isBottomAction }) => [\n    {\n      '& > p': {\n        whiteSpace: 'normal',\n      },\n    },\n    isActions && {\n      position: 'sticky',\n      right: 0,\n      width: '1%',\n    },\n    isBottomAction && {\n      borderBottom: 'none',\n    },\n  ],\n);\n\nexport type EmbeddedTableCoreProps<T> = {\n  itemRenderer: TableItemRenderer<T>[];\n  items: T[];\n  rowKeyExtractor?(item: T): string;\n  getItemActionProps?: (\n    item: T,\n    setState: (state: Record<string, unknown>) => void,\n    state?: Record<string, unknown>,\n  ) => TableActionCoreProps;\n  readOnly?: boolean;\n  initialItemState?: Record<string, unknown>;\n  bottomAction?: ReactNode;\n  tableHeaderSx?: SxProps<Theme>;\n};\n\nexport const EmbeddedTableCore = <T extends Record<string, unknown> | string>({\n  itemRenderer,\n  items,\n  rowKeyExtractor,\n  getItemActionProps,\n  readOnly,\n  bottomAction,\n  initialItemState,\n  tableHeaderSx,\n  TableActionsComponent: TableActions,\n  TypographyComponent: Typography,\n}: EmbeddedTableCoreProps<T> & InjectedComponents<'TableActions' | 'Typography'>): JSX.Element => {\n  validateRowKey(items, rowKeyExtractor);\n\n  const getId = useCallback(\n    (item: T) => (rowKeyExtractor ? rowKeyExtractor(item) : typeof item === 'string' ? item : (item.id as string)),\n    [rowKeyExtractor],\n  );\n\n  const itemState = initialItemState ?? {};\n  const [itemsState, setItemsState] = useState<Record<string, Record<string, unknown>>>(\n    items.reduce((acc, item) => ({ ...acc, [getId(item)]: itemState }), {}),\n  );\n\n  const setItemState = (item: T, state: Record<string, unknown>) => {\n    const id = getId(item);\n    setItemsState((prevState) => ({ ...prevState, [id]: state }));\n  };\n\n  useEffect(() => {\n    setItemsState(items.reduce((acc, item) => ({ ...acc, [getId(item)]: itemsState[getId(item)] ?? itemState }), {}));\n  }, [items, getId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  return (\n    <TableContainer>\n      <StyledTable hasActions={Boolean(getItemActionProps)}>\n        <TableHead>\n          <TableRow>\n            {itemRenderer.map((column) => (\n              <StyleTabledCell key={`col-header-${column.title}`} sx={tableHeaderSx}>\n                <Typography variant=\"body2\">{column.title}</Typography>\n              </StyleTabledCell>\n            ))}\n            {!readOnly && getItemActionProps && (\n              <StyleTabledCell isActions sx={tableHeaderSx}>\n                <Typography variant=\"body2\">{TABLE_ACTIONS_HEADER}</Typography>\n              </StyleTabledCell>\n            )}\n          </TableRow>\n        </TableHead>\n        <TableBody>\n          {items.map((item) => {\n            const id = getId(item);\n            return (\n              <TableRow key={id}>\n                {itemRenderer.map((column, i) => {\n                  const children = column.getValue(item, itemsState[id]);\n                  const value = getTableCellValue(children);\n\n                  return (\n                    <StyleTabledCell key={`col-${column.title}-${i}`}>\n                      {typeof value === 'string' ? <Typography variant=\"body2\">{value}</Typography> : value}\n                    </StyleTabledCell>\n                  );\n                })}\n                {!readOnly && getItemActionProps && (\n                  <StyleTabledCell isActions>\n                    <TableActions\n                      {...getItemActionProps(item, (state) => state && setItemState(item, state), itemsState[id])}\n                    />\n                  </StyleTabledCell>\n                )}\n              </TableRow>\n            );\n          })}\n          {!readOnly && bottomAction && (\n            <TableRow>\n              <StyleTabledCell\n                colSpan={getItemActionProps ? itemRenderer.length : itemRenderer.length - 1}\n                isBottomAction\n              />\n              <StyleTabledCell isActions isBottomAction>\n                <TableActionsContainer>{bottomAction}</TableActionsContainer>\n              </StyleTabledCell>\n            </TableRow>\n          )}\n        </TableBody>\n      </StyledTable>\n    </TableContainer>\n  );\n};\n"],"names":["StyledTable","styled","Table","hasActions","width","StyleTabledCell","TableCell","isActions","isBottomAction","whiteSpace","position","right","borderBottom","EmbeddedTableCore","itemRenderer","items","rowKeyExtractor","getItemActionProps","readOnly","bottomAction","initialItemState","tableHeaderSx","TableActionsComponent","TableActions","TypographyComponent","Typography","validateRowKey","getId","useCallback","item","id","itemState","itemsState","setItemsState","useState","reduce","acc","setItemState","state","prevState","useEffect","React","TableContainer","Boolean","TableHead","TableRow","map","column","key","title","sx","variant","TABLE_ACTIONS_HEADER","TableBody","i","children","getValue","value","getTableCellValue","colSpan","length","TableActionsContainer"],"mappings":"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"}