grid.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { View } from 'app/design/view';
  2. import { BlockWrapper } from 'app/components/block-wrapper';
  3. import { GridProvider } from './grid/context';
  4. import { useGridData } from './grid/use-grid-data';
  5. import GridModals from './grid/modals';
  6. import GridToolbar from './grid/toolbar';
  7. import GridTable from './grid/table';
  8. /**
  9. * UNA CMS grid block: paginated table with filters, row/bulk actions, and checkout.
  10. * Rows, selection and overlays live in a per-grid store (`./grid/context`);
  11. * fetching and filter state live in `useGridData`.
  12. */
  13. export default function ElementGrid(props) {
  14. if (!props.data?.header)
  15. return <></>;
  16. return (
  17. <GridProvider data={props.data}>
  18. <GridBlock {...props} />
  19. </GridProvider>
  20. );
  21. }
  22. function GridBlock({ data, blockWrapperProps }) {
  23. const {
  24. settings,
  25. rows,
  26. dropdownFilterKeys,
  27. selectedFilters,
  28. handleFilter,
  29. handleSearch,
  30. query,
  31. } = useGridData(data);
  32. return (
  33. <BlockWrapper {...blockWrapperProps}>
  34. <View className="w-full">
  35. <GridModals />
  36. <GridToolbar
  37. actionsBulk={Object.values(data.actions?.bulk || {})}
  38. actionsIndependent={Object.values(data.actions?.independent || {})}
  39. dropdownFilterKeys={dropdownFilterKeys}
  40. settings={settings}
  41. selectedFilters={selectedFilters}
  42. handleFilter={handleFilter}
  43. handleSearch={handleSearch}
  44. />
  45. <GridTable rows={rows} query={query} />
  46. </View>
  47. </BlockWrapper>
  48. );
  49. }