@perses-dev/components 0.53.1 → 0.54.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/ContentWithLegend/ContentWithLegend.js +1 -1
  2. package/dist/ContentWithLegend/ContentWithLegend.js.map +1 -1
  3. package/dist/ContentWithLegend/model/content-with-legend-model.d.ts +1 -1
  4. package/dist/ContentWithLegend/model/content-with-legend-model.d.ts.map +1 -1
  5. package/dist/ContentWithLegend/model/content-with-legend-model.js +1 -1
  6. package/dist/ContentWithLegend/model/content-with-legend-model.js.map +1 -1
  7. package/dist/FormEditor/FormActions.d.ts +1 -1
  8. package/dist/FormEditor/FormActions.d.ts.map +1 -1
  9. package/dist/FormEditor/FormActions.js.map +1 -1
  10. package/dist/FormatControls/FormatControls.d.ts +1 -1
  11. package/dist/FormatControls/FormatControls.d.ts.map +1 -1
  12. package/dist/FormatControls/FormatControls.js +1 -1
  13. package/dist/FormatControls/FormatControls.js.map +1 -1
  14. package/dist/FormatControls/UnitSelector.d.ts +1 -1
  15. package/dist/FormatControls/UnitSelector.d.ts.map +1 -1
  16. package/dist/FormatControls/UnitSelector.js +1 -1
  17. package/dist/FormatControls/UnitSelector.js.map +1 -1
  18. package/dist/Legend/Legend.js +1 -1
  19. package/dist/Legend/Legend.js.map +1 -1
  20. package/dist/Legend/legend-model.d.ts +1 -1
  21. package/dist/Legend/legend-model.d.ts.map +1 -1
  22. package/dist/Legend/legend-model.js.map +1 -1
  23. package/dist/LinksEditor/LinksEditor.d.ts +1 -1
  24. package/dist/LinksEditor/LinksEditor.js.map +1 -1
  25. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.d.ts +1 -1
  26. package/dist/RefreshIntervalPicker/RefreshIntervalPicker.js.map +1 -1
  27. package/dist/Table/Table.d.ts +1 -1
  28. package/dist/Table/Table.d.ts.map +1 -1
  29. package/dist/Table/Table.js +26 -6
  30. package/dist/Table/Table.js.map +1 -1
  31. package/dist/Table/TableToolbar.d.ts +34 -0
  32. package/dist/Table/TableToolbar.d.ts.map +1 -0
  33. package/dist/Table/TableToolbar.js +127 -0
  34. package/dist/Table/TableToolbar.js.map +1 -0
  35. package/dist/Table/VirtualizedTable.d.ts +3 -1
  36. package/dist/Table/VirtualizedTable.d.ts.map +1 -1
  37. package/dist/Table/VirtualizedTable.js +128 -117
  38. package/dist/Table/VirtualizedTable.js.map +1 -1
  39. package/dist/Table/VirtualizedTableContainer.d.ts.map +1 -1
  40. package/dist/Table/VirtualizedTableContainer.js +5 -1
  41. package/dist/Table/VirtualizedTableContainer.js.map +1 -1
  42. package/dist/Table/hooks/useFuzzySearch.d.ts +12 -0
  43. package/dist/Table/hooks/useFuzzySearch.d.ts.map +1 -0
  44. package/dist/Table/hooks/useFuzzySearch.js +43 -0
  45. package/dist/Table/hooks/useFuzzySearch.js.map +1 -0
  46. package/dist/Table/model/table-model.d.ts +38 -4
  47. package/dist/Table/model/table-model.d.ts.map +1 -1
  48. package/dist/Table/model/table-model.js.map +1 -1
  49. package/dist/ThresholdsEditor/ThresholdInput.d.ts +1 -1
  50. package/dist/ThresholdsEditor/ThresholdInput.d.ts.map +1 -1
  51. package/dist/ThresholdsEditor/ThresholdInput.js.map +1 -1
  52. package/dist/ThresholdsEditor/ThresholdsEditor.d.ts +1 -1
  53. package/dist/ThresholdsEditor/ThresholdsEditor.d.ts.map +1 -1
  54. package/dist/ThresholdsEditor/ThresholdsEditor.js.map +1 -1
  55. package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts +2 -3
  56. package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts.map +1 -1
  57. package/dist/TimeRangeSelector/DateTimeRangePicker.js +2 -0
  58. package/dist/TimeRangeSelector/DateTimeRangePicker.js.map +1 -1
  59. package/dist/TimeRangeSelector/TimeRangeSelector.d.ts +1 -1
  60. package/dist/TimeRangeSelector/TimeRangeSelector.js +1 -1
  61. package/dist/TimeRangeSelector/TimeRangeSelector.js.map +1 -1
  62. package/dist/TimeRangeSelector/utils.d.ts +1 -1
  63. package/dist/TimeRangeSelector/utils.js +1 -1
  64. package/dist/TimeRangeSelector/utils.js.map +1 -1
  65. package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts +2 -2
  66. package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts.map +1 -1
  67. package/dist/TimeSeriesTooltip/TimeChartTooltip.js.map +1 -1
  68. package/dist/TimeSeriesTooltip/nearby-series.d.ts +2 -2
  69. package/dist/TimeSeriesTooltip/nearby-series.d.ts.map +1 -1
  70. package/dist/TimeSeriesTooltip/nearby-series.js +1 -2
  71. package/dist/TimeSeriesTooltip/nearby-series.js.map +1 -1
  72. package/dist/TransformsEditor/TransformEditor.d.ts +1 -1
  73. package/dist/TransformsEditor/TransformEditor.d.ts.map +1 -1
  74. package/dist/TransformsEditor/TransformEditor.js.map +1 -1
  75. package/dist/TransformsEditor/TransformEditorContainer.d.ts.map +1 -1
  76. package/dist/TransformsEditor/TransformEditorContainer.js +1 -1
  77. package/dist/TransformsEditor/TransformEditorContainer.js.map +1 -1
  78. package/dist/TransformsEditor/TransformsEditor.d.ts +1 -1
  79. package/dist/TransformsEditor/TransformsEditor.d.ts.map +1 -1
  80. package/dist/TransformsEditor/TransformsEditor.js.map +1 -1
  81. package/dist/ValueMappingEditor/ValueMappingEditor.js.map +1 -1
  82. package/dist/ValueMappingEditor/ValueMappingsEditor.d.ts.map +1 -1
  83. package/dist/ValueMappingEditor/ValueMappingsEditor.js.map +1 -1
  84. package/dist/cjs/ContentWithLegend/ContentWithLegend.js +2 -2
  85. package/dist/cjs/ContentWithLegend/model/content-with-legend-model.js +2 -2
  86. package/dist/cjs/FormatControls/FormatControls.js +4 -4
  87. package/dist/cjs/FormatControls/UnitSelector.js +3 -3
  88. package/dist/cjs/Legend/Legend.js +2 -2
  89. package/dist/cjs/Table/Table.js +24 -4
  90. package/dist/cjs/Table/TableToolbar.js +140 -0
  91. package/dist/cjs/Table/VirtualizedTable.js +126 -115
  92. package/dist/cjs/Table/VirtualizedTableContainer.js +5 -1
  93. package/dist/cjs/Table/hooks/useFuzzySearch.js +48 -0
  94. package/dist/cjs/TimeRangeSelector/DateTimeRangePicker.js +2 -0
  95. package/dist/cjs/TimeRangeSelector/TimeRangeSelector.js +3 -3
  96. package/dist/cjs/TimeRangeSelector/utils.js +2 -2
  97. package/dist/cjs/TimeSeriesTooltip/nearby-series.js +2 -3
  98. package/dist/cjs/TransformsEditor/TransformEditorContainer.js +2 -2
  99. package/dist/cjs/model/action.js +43 -0
  100. package/dist/cjs/model/bits.js +113 -0
  101. package/dist/cjs/model/bytes.js +115 -0
  102. package/dist/cjs/model/constants.js +23 -0
  103. package/dist/cjs/model/currency.js +126 -0
  104. package/dist/cjs/model/date.js +297 -0
  105. package/dist/cjs/model/decimal.js +72 -0
  106. package/dist/cjs/model/formatterCache.js +120 -0
  107. package/dist/cjs/model/index.js +16 -0
  108. package/dist/cjs/model/legend.js +101 -0
  109. package/dist/cjs/model/percent.js +82 -0
  110. package/dist/cjs/model/temperature.js +72 -0
  111. package/dist/cjs/model/thresholds.js +16 -0
  112. package/dist/cjs/model/throughput.js +161 -0
  113. package/dist/cjs/model/time.js +178 -0
  114. package/dist/cjs/model/timeOption.js +2 -2
  115. package/dist/cjs/model/transforms.js +29 -0
  116. package/dist/cjs/model/types.js +16 -0
  117. package/dist/cjs/model/units.js +186 -0
  118. package/dist/cjs/model/utils.js +48 -0
  119. package/dist/cjs/theme/theme.js +44 -29
  120. package/dist/cjs/theme/typography.js +8 -7
  121. package/dist/cjs/utils/axis.js +5 -5
  122. package/dist/cjs/utils/index.js +1 -0
  123. package/dist/cjs/utils/request-interpolation.js +49 -0
  124. package/dist/model/action.d.ts +4 -0
  125. package/dist/model/action.d.ts.map +1 -0
  126. package/dist/model/action.js +27 -0
  127. package/dist/model/action.js.map +1 -0
  128. package/dist/model/bits.d.ts +12 -0
  129. package/dist/model/bits.d.ts.map +1 -0
  130. package/dist/model/bits.js +89 -0
  131. package/dist/model/bits.js.map +1 -0
  132. package/dist/model/bytes.d.ts +12 -0
  133. package/dist/model/bytes.d.ts.map +1 -0
  134. package/dist/model/bytes.js +91 -0
  135. package/dist/model/bytes.js.map +1 -0
  136. package/dist/model/constants.d.ts +2 -0
  137. package/dist/model/constants.d.ts.map +1 -0
  138. package/dist/model/constants.js +15 -0
  139. package/dist/model/constants.js.map +1 -0
  140. package/dist/model/currency.d.ts +11 -0
  141. package/dist/model/currency.d.ts.map +1 -0
  142. package/dist/model/currency.js +107 -0
  143. package/dist/model/currency.js.map +1 -0
  144. package/dist/model/date.d.ts +28 -0
  145. package/dist/model/date.d.ts.map +1 -0
  146. package/dist/model/date.js +278 -0
  147. package/dist/model/date.js.map +1 -0
  148. package/dist/model/decimal.d.ts +12 -0
  149. package/dist/model/decimal.d.ts.map +1 -0
  150. package/dist/model/decimal.js +53 -0
  151. package/dist/model/decimal.js.map +1 -0
  152. package/dist/model/formatterCache.d.ts +11 -0
  153. package/dist/model/formatterCache.d.ts.map +1 -0
  154. package/dist/model/formatterCache.js +104 -0
  155. package/dist/model/formatterCache.js.map +1 -0
  156. package/dist/model/graph.d.ts +1 -1
  157. package/dist/model/graph.js.map +1 -1
  158. package/dist/model/index.d.ts +16 -0
  159. package/dist/model/index.d.ts.map +1 -1
  160. package/dist/model/index.js +16 -0
  161. package/dist/model/index.js.map +1 -1
  162. package/dist/model/legend.d.ts +19 -0
  163. package/dist/model/legend.d.ts.map +1 -0
  164. package/dist/model/legend.js +61 -0
  165. package/dist/model/legend.js.map +1 -0
  166. package/dist/model/percent.d.ts +11 -0
  167. package/dist/model/percent.d.ts.map +1 -0
  168. package/dist/model/percent.js +63 -0
  169. package/dist/model/percent.js.map +1 -0
  170. package/dist/model/temperature.d.ts +11 -0
  171. package/dist/model/temperature.d.ts.map +1 -0
  172. package/dist/model/temperature.js +53 -0
  173. package/dist/model/temperature.js.map +1 -0
  174. package/dist/model/theme.d.ts +1 -1
  175. package/dist/model/theme.d.ts.map +1 -1
  176. package/dist/model/theme.js.map +1 -1
  177. package/dist/model/thresholds.d.ts +16 -0
  178. package/dist/model/thresholds.d.ts.map +1 -0
  179. package/dist/model/thresholds.js +15 -0
  180. package/dist/model/thresholds.js.map +1 -0
  181. package/dist/model/throughput.d.ts +12 -0
  182. package/dist/model/throughput.d.ts.map +1 -0
  183. package/dist/model/throughput.js +142 -0
  184. package/dist/model/throughput.js.map +1 -0
  185. package/dist/model/time.d.ts +23 -0
  186. package/dist/model/time.d.ts.map +1 -0
  187. package/dist/model/time.js +158 -0
  188. package/dist/model/time.js.map +1 -0
  189. package/dist/model/timeOption.d.ts +1 -1
  190. package/dist/model/timeOption.js +1 -1
  191. package/dist/model/timeOption.js.map +1 -1
  192. package/dist/model/transforms.d.ts +43 -0
  193. package/dist/model/transforms.d.ts.map +1 -0
  194. package/dist/model/transforms.js +22 -0
  195. package/dist/model/transforms.js.map +1 -0
  196. package/dist/model/types.d.ts +56 -0
  197. package/dist/model/types.d.ts.map +1 -0
  198. package/dist/model/types.js +15 -0
  199. package/dist/model/types.js.map +1 -0
  200. package/dist/model/units.d.ts +105 -0
  201. package/dist/model/units.d.ts.map +1 -0
  202. package/dist/model/units.js +132 -0
  203. package/dist/model/units.js.map +1 -0
  204. package/dist/model/utils.d.ts +4 -0
  205. package/dist/model/utils.d.ts.map +1 -0
  206. package/dist/model/utils.js +32 -0
  207. package/dist/model/utils.js.map +1 -0
  208. package/dist/theme/theme.d.ts +3 -1
  209. package/dist/theme/theme.d.ts.map +1 -1
  210. package/dist/theme/theme.js +46 -29
  211. package/dist/theme/theme.js.map +1 -1
  212. package/dist/theme/typography.d.ts +6 -4
  213. package/dist/theme/typography.d.ts.map +1 -1
  214. package/dist/theme/typography.js +8 -7
  215. package/dist/theme/typography.js.map +1 -1
  216. package/dist/utils/axis.d.ts +1 -1
  217. package/dist/utils/axis.d.ts.map +1 -1
  218. package/dist/utils/axis.js +1 -1
  219. package/dist/utils/axis.js.map +1 -1
  220. package/dist/utils/chart-actions.d.ts +1 -1
  221. package/dist/utils/chart-actions.js.map +1 -1
  222. package/dist/utils/index.d.ts +1 -0
  223. package/dist/utils/index.d.ts.map +1 -1
  224. package/dist/utils/index.js +1 -0
  225. package/dist/utils/index.js.map +1 -1
  226. package/dist/utils/request-interpolation.d.ts +6 -0
  227. package/dist/utils/request-interpolation.d.ts.map +1 -0
  228. package/dist/utils/request-interpolation.js +33 -0
  229. package/dist/utils/request-interpolation.js.map +1 -0
  230. package/dist/utils/variable-interpolation.d.ts +1 -1
  231. package/dist/utils/variable-interpolation.js.map +1 -1
  232. package/package.json +6 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Table/Table.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Stack, useTheme } from '@mui/material';\nimport {\n ColumnDef,\n OnChangeFn,\n Row,\n RowSelectionState,\n SortingState,\n Table as TanstackTable,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport { ReactElement, useCallback, useMemo } from 'react';\nimport { TableCheckbox } from './TableCheckbox';\nimport { VirtualizedTable } from './VirtualizedTable';\nimport { DEFAULT_COLUMN_WIDTH, TableProps, persesColumnsToTanstackColumns } from './model/table-model';\n\nconst DEFAULT_GET_ROW_ID = (data: unknown, index: number): string => {\n return `${index}`;\n};\n\n// Setting these defaults one enables them to be consistent across renders instead\n// of being recreated every time, which can be important for perf because react\n// does not do deep equality checking for objects and arrays.\nconst DEFAULT_ROW_SELECTION: NonNullable<TableProps<unknown>['rowSelection']> = {};\nconst DEFAULT_SORTING: NonNullable<TableProps<unknown>['sorting']> = [];\n\n/**\n * Component used to render tabular data in Perses use cases. This component is\n * **not** intended to be a general use data table for use cases unrelated to Perses.\n *\n * **Note: This component is currently experimental and is likely to have significant breaking changes in the near future. Use with caution outside of the core Perses codebase.**\n */\nexport function Table<TableData>({\n data,\n columns,\n cellConfigs,\n density = 'standard',\n defaultColumnWidth = DEFAULT_COLUMN_WIDTH,\n defaultColumnHeight = 'auto',\n checkboxSelection,\n onRowSelectionChange,\n onSortingChange,\n getCheckboxColor,\n getRowId = DEFAULT_GET_ROW_ID,\n rowSelection = DEFAULT_ROW_SELECTION,\n sorting = DEFAULT_SORTING,\n getItemActions,\n hasItemActions,\n pagination,\n onPaginationChange,\n rowSelectionVariant = 'standard',\n ...otherProps\n}: TableProps<TableData>): ReactElement {\n const theme = useTheme();\n\n const handleRowSelectionChange: OnChangeFn<RowSelectionState> = (rowSelectionUpdater) => {\n const newRowSelection =\n typeof rowSelectionUpdater === 'function' ? rowSelectionUpdater(rowSelection) : rowSelectionUpdater;\n onRowSelectionChange?.(newRowSelection);\n };\n\n const handleRowSelectionEvent = useCallback(\n (table: TanstackTable<TableData>, row: Row<TableData>, isModified: boolean) => {\n if (rowSelectionVariant === 'standard' || isModified) {\n row.toggleSelected();\n } else {\n // Legend variant (when action not modified with shift/meta key).\n // Note that this behavior needs to be kept in sync with behavior in\n // the Legend component for list-based legends.\n if (row.getIsSelected() && !table.getIsAllRowsSelected()) {\n // Row was already selected. Revert to select all.\n table.toggleAllRowsSelected();\n } else {\n // Focus the selected row.\n onRowSelectionChange?.({\n [row.id]: true,\n });\n }\n }\n },\n [onRowSelectionChange, rowSelectionVariant]\n );\n\n const handleCheckboxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>, table: TanstackTable<TableData>, row: Row<TableData>) => {\n const nativePointerEvent =\n e.nativeEvent && (e.nativeEvent instanceof MouseEvent || e.nativeEvent instanceof KeyboardEvent)\n ? (e.nativeEvent as PointerEvent)\n : undefined;\n const isModifed = !!nativePointerEvent?.metaKey || !!nativePointerEvent?.shiftKey;\n handleRowSelectionEvent(table, row, isModifed);\n },\n [handleRowSelectionEvent]\n );\n\n const handleSortingChange: OnChangeFn<SortingState> = (sortingUpdater) => {\n const newSorting = typeof sortingUpdater === 'function' ? sortingUpdater(sorting) : sortingUpdater;\n onSortingChange?.(newSorting);\n };\n\n const actionsColumn: ColumnDef<TableData> = useMemo(() => {\n return {\n id: 'itemActions',\n header: 'Actions',\n cell: ({ row }): ReactElement => {\n return (\n <Stack direction=\"row\" alignItems=\"center\">\n {getItemActions?.({ id: row.id, data: row.original })}\n </Stack>\n );\n },\n enableSorting: false,\n };\n }, [getItemActions]);\n\n const checkboxColumn: ColumnDef<TableData> = useMemo(() => {\n return {\n id: 'checkboxRowSelect',\n size: 28,\n header: ({ table }): ReactElement => {\n return (\n <TableCheckbox\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler()}\n color={theme.palette.text.primary}\n density={density}\n />\n );\n },\n cell: ({ row, table }): ReactElement => {\n return (\n <TableCheckbox\n checked={row.getIsSelected()}\n indeterminate={row.getIsSomeSelected()}\n onChange={(e) => {\n handleCheckboxChange(e, table, row);\n }}\n color={getCheckboxColor?.(row.original)}\n density={density}\n />\n );\n },\n enableSorting: false,\n };\n }, [theme.palette.text.primary, density, getCheckboxColor, handleCheckboxChange]);\n\n const tableColumns: Array<ColumnDef<TableData>> = useMemo(() => {\n const initTableColumns = persesColumnsToTanstackColumns(columns);\n\n if (hasItemActions) {\n initTableColumns.unshift(actionsColumn);\n }\n\n if (checkboxSelection) {\n initTableColumns.unshift(checkboxColumn);\n }\n\n return initTableColumns;\n }, [checkboxColumn, checkboxSelection, columns, hasItemActions, actionsColumn]);\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n getRowId,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: pagination ? getPaginationRowModel() : undefined,\n // without this setting, the getPaginationRowModel setting persists and it is not possible to switch from paginated to unpaginated\n // can be removed once https://github.com/TanStack/table/pull/5974 is merged\n manualPagination: !pagination,\n enableRowSelection: !!checkboxSelection,\n onRowSelectionChange: handleRowSelectionChange,\n onSortingChange: handleSortingChange,\n // For now, defaulting to sort by descending first. We can expose the ability\n // to customize it if/when we have use cases for it.\n sortDescFirst: true,\n state: {\n rowSelection,\n sorting,\n ...(pagination ? { pagination } : {}),\n },\n });\n\n const handleRowClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement, MouseEvent>, rowId: string) => {\n const row = table.getRow(rowId);\n const isModifiedClick = e.metaKey || e.shiftKey;\n handleRowSelectionEvent(table, row, isModifiedClick);\n },\n [handleRowSelectionEvent, table]\n );\n\n return (\n <VirtualizedTable\n {...otherProps}\n density={density}\n defaultColumnWidth={defaultColumnWidth}\n defaultColumnHeight={defaultColumnHeight}\n onRowClick={handleRowClick}\n rows={table.getRowModel().rows}\n columns={table.getAllFlatColumns()}\n headers={table.getHeaderGroups()}\n cellConfigs={cellConfigs}\n pagination={pagination}\n onPaginationChange={onPaginationChange}\n rowCount={table.getRowCount()}\n />\n );\n}\n"],"names":["Stack","useTheme","getCoreRowModel","getPaginationRowModel","getSortedRowModel","useReactTable","useCallback","useMemo","TableCheckbox","VirtualizedTable","DEFAULT_COLUMN_WIDTH","persesColumnsToTanstackColumns","DEFAULT_GET_ROW_ID","data","index","DEFAULT_ROW_SELECTION","DEFAULT_SORTING","Table","columns","cellConfigs","density","defaultColumnWidth","defaultColumnHeight","checkboxSelection","onRowSelectionChange","onSortingChange","getCheckboxColor","getRowId","rowSelection","sorting","getItemActions","hasItemActions","pagination","onPaginationChange","rowSelectionVariant","otherProps","theme","handleRowSelectionChange","rowSelectionUpdater","newRowSelection","handleRowSelectionEvent","table","row","isModified","toggleSelected","getIsSelected","getIsAllRowsSelected","toggleAllRowsSelected","id","handleCheckboxChange","e","nativePointerEvent","nativeEvent","MouseEvent","KeyboardEvent","undefined","isModifed","metaKey","shiftKey","handleSortingChange","sortingUpdater","newSorting","actionsColumn","header","cell","direction","alignItems","original","enableSorting","checkboxColumn","size","checked","indeterminate","getIsSomeRowsSelected","onChange","getToggleAllRowsSelectedHandler","color","palette","text","primary","getIsSomeSelected","tableColumns","initTableColumns","unshift","manualPagination","enableRowSelection","sortDescFirst","state","handleRowClick","rowId","getRow","isModifiedClick","onRowClick","rows","getRowModel","getAllFlatColumns","headers","getHeaderGroups","rowCount","getRowCount"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/Table/Table.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Stack, useTheme } from '@mui/material';\nimport {\n ColumnDef,\n getCoreRowModel,\n getExpandedRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n OnChangeFn,\n Row,\n RowSelectionState,\n SortingState,\n Table as TanstackTable,\n useReactTable,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { ReactElement, useCallback, useMemo, useState } from 'react';\nimport { useFuzzySearch } from './hooks/useFuzzySearch';\nimport { TableCheckbox } from './TableCheckbox';\nimport { VirtualizedTable } from './VirtualizedTable';\nimport { DEFAULT_COLUMN_WIDTH, persesColumnsToTanstackColumns, TableProps } from './model/table-model';\n\nconst DEFAULT_GET_ROW_ID = (data: unknown, index: number): string => {\n return `${index}`;\n};\n\n// Setting these defaults one enables them to be consistent across renders instead\n// of being recreated every time, which can be important for perf because react\n// does not do deep equality checking for objects and arrays.\nconst DEFAULT_ROW_SELECTION: NonNullable<TableProps<unknown>['rowSelection']> = {};\nconst DEFAULT_SORTING: NonNullable<TableProps<unknown>['sorting']> = [];\n\n/**\n * Component used to render tabular data in Perses use cases. This component is\n * **not** intended to be a general use data table for use cases unrelated to Perses.\n *\n * **Note: This component is currently experimental and is likely to have significant breaking changes in the near future. Use with caution outside of the core Perses codebase.**\n */\nexport function Table<TableData>({\n data,\n columns,\n cellConfigs,\n density = 'standard',\n defaultColumnWidth = DEFAULT_COLUMN_WIDTH,\n defaultColumnHeight = 'auto',\n checkboxSelection,\n onRowSelectionChange,\n onSortingChange,\n getCheckboxColor,\n getRowId = DEFAULT_GET_ROW_ID,\n rowSelection = DEFAULT_ROW_SELECTION,\n sorting = DEFAULT_SORTING,\n getItemActions,\n hasItemActions,\n pagination,\n onPaginationChange,\n rowSelectionVariant = 'standard',\n getSubRows,\n hiddenColumns,\n tableToolbarConfig,\n ...otherProps\n}: TableProps<TableData>): ReactElement {\n const theme = useTheme();\n\n const { globalFilter, setGlobalFilter, fuzzySearchOptions } = useFuzzySearch<TableData>(\n tableToolbarConfig?.isSearchEnabled\n );\n\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>(\n hiddenColumns?.reduce((acc, columnId) => ({ ...acc, [columnId]: false }), {}) ?? {}\n );\n\n const handleRowSelectionChange: OnChangeFn<RowSelectionState> = (rowSelectionUpdater) => {\n const newRowSelection =\n typeof rowSelectionUpdater === 'function' ? rowSelectionUpdater(rowSelection) : rowSelectionUpdater;\n onRowSelectionChange?.(newRowSelection);\n };\n\n const handleRowSelectionEvent = useCallback(\n (table: TanstackTable<TableData>, row: Row<TableData>, isModified: boolean) => {\n if (rowSelectionVariant === 'standard' || isModified) {\n row.toggleSelected();\n } else {\n // Legend variant (when action not modified with shift/meta key).\n // Note that this behavior needs to be kept in sync with behavior in\n // the Legend component for list-based legends.\n if (row.getIsSelected() && !table.getIsAllRowsSelected()) {\n // Row was already selected. Revert to select all.\n table.toggleAllRowsSelected();\n } else {\n // Focus the selected row.\n onRowSelectionChange?.({\n [row.id]: true,\n });\n }\n }\n },\n [onRowSelectionChange, rowSelectionVariant]\n );\n\n const handleCheckboxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>, table: TanstackTable<TableData>, row: Row<TableData>) => {\n const nativePointerEvent =\n e.nativeEvent && (e.nativeEvent instanceof MouseEvent || e.nativeEvent instanceof KeyboardEvent)\n ? (e.nativeEvent as PointerEvent)\n : undefined;\n const isModifed = !!nativePointerEvent?.metaKey || !!nativePointerEvent?.shiftKey;\n handleRowSelectionEvent(table, row, isModifed);\n },\n [handleRowSelectionEvent]\n );\n\n const handleSortingChange: OnChangeFn<SortingState> = (sortingUpdater) => {\n const newSorting = typeof sortingUpdater === 'function' ? sortingUpdater(sorting) : sortingUpdater;\n onSortingChange?.(newSorting);\n };\n\n const actionsColumn: ColumnDef<TableData> = useMemo(() => {\n return {\n id: 'itemActions',\n header: 'Actions',\n cell: ({ row }): ReactElement => {\n return (\n <Stack direction=\"row\" alignItems=\"center\">\n {getItemActions?.({ id: row.id, data: row.original })}\n </Stack>\n );\n },\n enableSorting: false,\n };\n }, [getItemActions]);\n\n const checkboxColumn: ColumnDef<TableData> = useMemo(() => {\n return {\n id: 'checkboxRowSelect',\n size: 28,\n header: ({ table }): ReactElement => {\n return (\n <TableCheckbox\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler()}\n color={theme.palette.text.primary}\n density={density}\n />\n );\n },\n cell: ({ row, table }): ReactElement => {\n return (\n <TableCheckbox\n checked={row.getIsSelected()}\n indeterminate={row.getIsSomeSelected()}\n onChange={(e) => {\n handleCheckboxChange(e, table, row);\n }}\n color={getCheckboxColor?.(row.original)}\n density={density}\n />\n );\n },\n enableSorting: false,\n };\n }, [theme.palette.text.primary, density, getCheckboxColor, handleCheckboxChange]);\n\n const tableColumns: Array<ColumnDef<TableData>> = useMemo(() => {\n const initTableColumns = persesColumnsToTanstackColumns(columns);\n\n if (hasItemActions) {\n initTableColumns.unshift(actionsColumn);\n }\n\n if (checkboxSelection) {\n initTableColumns.unshift(checkboxColumn);\n }\n\n return initTableColumns;\n }, [checkboxColumn, checkboxSelection, columns, hasItemActions, actionsColumn]);\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n getRowId: getRowId,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: pagination ? getPaginationRowModel() : undefined,\n // without this setting, the getPaginationRowModel setting persists and it is not possible to switch from paginated to unpaginated\n // can be removed once https://github.com/TanStack/table/pull/5974 is merged\n manualPagination: !pagination,\n enableRowSelection: !!checkboxSelection,\n onRowSelectionChange: handleRowSelectionChange,\n onSortingChange: handleSortingChange,\n onColumnVisibilityChange: setColumnVisibility,\n getSubRows: getSubRows,\n getExpandedRowModel: getSubRows ? getExpandedRowModel() : undefined,\n ...fuzzySearchOptions,\n // For now, defaulting to sort by descending first. We can expose the ability\n // to customize it if/when we have use cases for it.\n sortDescFirst: true,\n state: {\n rowSelection,\n sorting,\n globalFilter: tableToolbarConfig?.isSearchEnabled ? globalFilter : undefined,\n columnVisibility,\n ...(pagination ? { pagination } : {}),\n },\n });\n\n const handleRowClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement, MouseEvent>, rowId: string) => {\n const row = table.getRow(rowId);\n const isModifiedClick = e.metaKey || e.shiftKey;\n handleRowSelectionEvent(table, row, isModifiedClick);\n },\n [handleRowSelectionEvent, table]\n );\n\n return (\n <VirtualizedTable\n {...otherProps}\n density={density}\n defaultColumnWidth={defaultColumnWidth}\n defaultColumnHeight={defaultColumnHeight}\n onRowClick={handleRowClick}\n rows={table.getRowModel().rows}\n columns={table.getVisibleFlatColumns()}\n headers={table.getHeaderGroups()}\n cellConfigs={cellConfigs}\n pagination={pagination}\n onPaginationChange={onPaginationChange}\n rowCount={table.getRowCount()}\n toolbarConfig={{\n isSearchEnabled: tableToolbarConfig?.isSearchEnabled,\n globalFilter,\n onGlobalFilterChange: setGlobalFilter,\n isColumnFilterEnabled: tableToolbarConfig?.isColumnFilterEnabled,\n columns: table.getAllColumns(),\n columnFilterMenuMaxHeight: tableToolbarConfig?.columnFilterMenuMaxHeight,\n }}\n />\n );\n}\n"],"names":["Stack","useTheme","getCoreRowModel","getExpandedRowModel","getPaginationRowModel","getSortedRowModel","useReactTable","useCallback","useMemo","useState","useFuzzySearch","TableCheckbox","VirtualizedTable","DEFAULT_COLUMN_WIDTH","persesColumnsToTanstackColumns","DEFAULT_GET_ROW_ID","data","index","DEFAULT_ROW_SELECTION","DEFAULT_SORTING","Table","columns","cellConfigs","density","defaultColumnWidth","defaultColumnHeight","checkboxSelection","onRowSelectionChange","onSortingChange","getCheckboxColor","getRowId","rowSelection","sorting","getItemActions","hasItemActions","pagination","onPaginationChange","rowSelectionVariant","getSubRows","hiddenColumns","tableToolbarConfig","otherProps","theme","globalFilter","setGlobalFilter","fuzzySearchOptions","isSearchEnabled","columnVisibility","setColumnVisibility","reduce","acc","columnId","handleRowSelectionChange","rowSelectionUpdater","newRowSelection","handleRowSelectionEvent","table","row","isModified","toggleSelected","getIsSelected","getIsAllRowsSelected","toggleAllRowsSelected","id","handleCheckboxChange","e","nativePointerEvent","nativeEvent","MouseEvent","KeyboardEvent","undefined","isModifed","metaKey","shiftKey","handleSortingChange","sortingUpdater","newSorting","actionsColumn","header","cell","direction","alignItems","original","enableSorting","checkboxColumn","size","checked","indeterminate","getIsSomeRowsSelected","onChange","getToggleAllRowsSelectedHandler","color","palette","text","primary","getIsSomeSelected","tableColumns","initTableColumns","unshift","manualPagination","enableRowSelection","onColumnVisibilityChange","sortDescFirst","state","handleRowClick","rowId","getRow","isModifiedClick","onRowClick","rows","getRowModel","getVisibleFlatColumns","headers","getHeaderGroups","rowCount","getRowCount","toolbarConfig","onGlobalFilterChange","isColumnFilterEnabled","getAllColumns","columnFilterMenuMaxHeight"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { Column } from '@tanstack/react-table';
2
+ import { ReactElement } from 'react';
3
+ export interface TableToolbarProps<TableData> {
4
+ /**
5
+ * When `true`, a search input is rendered.
6
+ */
7
+ isSearchEnabled?: boolean;
8
+ /**
9
+ * Current value of the global filter / search query.
10
+ */
11
+ globalFilter: string;
12
+ /**
13
+ * Callback fired when the search query changes.
14
+ */
15
+ onGlobalFilterChange: (value: string) => void;
16
+ /**
17
+ * When `true`, a "Columns" button is rendered that opens a column visibility dropdown.
18
+ */
19
+ isColumnFilterEnabled?: boolean;
20
+ /**
21
+ * All columns from the table instance, used to build the visibility menu.
22
+ */
23
+ columns: Array<Column<TableData>>;
24
+ /**
25
+ * The width of the toolbar, used to determine when to switch to a more compact layout.
26
+ */
27
+ width: number | string;
28
+ /**
29
+ * Max height for the column filter menu.
30
+ */
31
+ columnFilterMenuMaxHeight?: number | string;
32
+ }
33
+ export declare function TableToolbar<TableData>({ isSearchEnabled, globalFilter, onGlobalFilterChange, isColumnFilterEnabled, columns, width, columnFilterMenuMaxHeight, }: TableToolbarProps<TableData>): ReactElement | null;
34
+ //# sourceMappingURL=TableToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableToolbar.d.ts","sourceRoot":"","sources":["../../src/Table/TableToolbar.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAyB,MAAM,OAAO,CAAC;AAM5D,MAAM,WAAW,iBAAiB,CAAC,SAAS;IAC1C;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9C;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAEvB;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7C;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,EACtC,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,OAAO,EACP,KAAK,EACL,yBAA+B,GAChC,EAAE,iBAAiB,CAAC,SAAS,CAAC,GAAG,YAAY,GAAG,IAAI,CA8FpD"}
@@ -0,0 +1,127 @@
1
+ // Copyright The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
+ import { Checkbox, IconButton, InputAdornment, ListItemText, Menu, MenuItem, Stack } from '@mui/material';
15
+ import { useCallback, useState } from 'react';
16
+ import Magnify from 'mdi-material-ui/Magnify';
17
+ import Close from 'mdi-material-ui/Close';
18
+ import ViewColumn from 'mdi-material-ui/ViewColumn';
19
+ import { TextField } from '../controls';
20
+ export function TableToolbar({ isSearchEnabled, globalFilter, onGlobalFilterChange, isColumnFilterEnabled, columns, width, columnFilterMenuMaxHeight = 400 }) {
21
+ const [colMenuAnchor, setColMenuAnchor] = useState(null);
22
+ const colMenuOpen = Boolean(colMenuAnchor);
23
+ const [searchResetKey, setSearchResetKey] = useState(0);
24
+ const handleSearchClear = useCallback(()=>{
25
+ onGlobalFilterChange('');
26
+ setSearchResetKey((prev)=>prev + 1);
27
+ }, [
28
+ onGlobalFilterChange
29
+ ]);
30
+ if (!isSearchEnabled && !isColumnFilterEnabled) {
31
+ return null;
32
+ }
33
+ return /*#__PURE__*/ _jsxs(Stack, {
34
+ direction: "row",
35
+ gap: 1,
36
+ alignItems: "center",
37
+ justifyContent: "flex-end",
38
+ width: width,
39
+ padding: "0.5rem",
40
+ sx: {
41
+ backgroundColor: (theme)=>theme.palette.background.default
42
+ },
43
+ children: [
44
+ isSearchEnabled && /*#__PURE__*/ _jsx(TextField, {
45
+ placeholder: "Search...",
46
+ value: globalFilter,
47
+ onChange: onGlobalFilterChange,
48
+ variant: "standard",
49
+ slotProps: {
50
+ htmlInput: {
51
+ 'aria-label': 'search table'
52
+ },
53
+ input: {
54
+ startAdornment: /*#__PURE__*/ _jsx(InputAdornment, {
55
+ position: "start",
56
+ children: /*#__PURE__*/ _jsx(Magnify, {
57
+ fontSize: "small"
58
+ })
59
+ }),
60
+ endAdornment: globalFilter !== '' && /*#__PURE__*/ _jsx(InputAdornment, {
61
+ position: "end",
62
+ children: /*#__PURE__*/ _jsx(IconButton, {
63
+ onClick: handleSearchClear,
64
+ children: /*#__PURE__*/ _jsx(Close, {
65
+ fontSize: "small"
66
+ })
67
+ })
68
+ })
69
+ }
70
+ },
71
+ sx: {
72
+ flexGrow: 1
73
+ }
74
+ }, searchResetKey),
75
+ isColumnFilterEnabled && /*#__PURE__*/ _jsxs(_Fragment, {
76
+ children: [
77
+ /*#__PURE__*/ _jsx(IconButton, {
78
+ onClick: (e)=>setColMenuAnchor(e.currentTarget),
79
+ "aria-haspopup": "listbox",
80
+ "aria-expanded": colMenuOpen,
81
+ color: "info",
82
+ children: /*#__PURE__*/ _jsx(ViewColumn, {})
83
+ }),
84
+ /*#__PURE__*/ _jsx(Menu, {
85
+ anchorEl: colMenuAnchor,
86
+ open: colMenuOpen,
87
+ onClose: ()=>setColMenuAnchor(null),
88
+ slotProps: {
89
+ list: {
90
+ dense: true
91
+ }
92
+ },
93
+ sx: {
94
+ maxHeight: columnFilterMenuMaxHeight
95
+ },
96
+ children: columns.map((column)=>{
97
+ const header = column.columnDef.header;
98
+ const label = typeof header === 'string' ? header : column.id;
99
+ return /*#__PURE__*/ _jsxs(MenuItem, {
100
+ disabled: !column.getCanHide(),
101
+ onClick: column.getCanHide() ? column.getToggleVisibilityHandler() : undefined,
102
+ dense: true,
103
+ children: [
104
+ /*#__PURE__*/ _jsx(Checkbox, {
105
+ checked: column.getIsVisible(),
106
+ disabled: !column.getCanHide(),
107
+ size: "small",
108
+ disableRipple: true,
109
+ sx: {
110
+ p: 0,
111
+ mr: 1
112
+ }
113
+ }),
114
+ /*#__PURE__*/ _jsx(ListItemText, {
115
+ primary: label
116
+ })
117
+ ]
118
+ }, column.id);
119
+ })
120
+ })
121
+ ]
122
+ })
123
+ ]
124
+ });
125
+ }
126
+
127
+ //# sourceMappingURL=TableToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Table/TableToolbar.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Checkbox, IconButton, InputAdornment, ListItemText, Menu, MenuItem, Stack } from '@mui/material';\nimport { Column } from '@tanstack/react-table';\nimport { ReactElement, useCallback, useState } from 'react';\nimport Magnify from 'mdi-material-ui/Magnify';\nimport Close from 'mdi-material-ui/Close';\nimport ViewColumn from 'mdi-material-ui/ViewColumn';\nimport { TextField } from '../controls';\n\nexport interface TableToolbarProps<TableData> {\n /**\n * When `true`, a search input is rendered.\n */\n isSearchEnabled?: boolean;\n\n /**\n * Current value of the global filter / search query.\n */\n globalFilter: string;\n\n /**\n * Callback fired when the search query changes.\n */\n onGlobalFilterChange: (value: string) => void;\n\n /**\n * When `true`, a \"Columns\" button is rendered that opens a column visibility dropdown.\n */\n isColumnFilterEnabled?: boolean;\n\n /**\n * All columns from the table instance, used to build the visibility menu.\n */\n columns: Array<Column<TableData>>;\n /**\n * The width of the toolbar, used to determine when to switch to a more compact layout.\n */\n width: number | string;\n\n /**\n * Max height for the column filter menu.\n */\n columnFilterMenuMaxHeight?: number | string;\n}\n\nexport function TableToolbar<TableData>({\n isSearchEnabled,\n globalFilter,\n onGlobalFilterChange,\n isColumnFilterEnabled,\n columns,\n width,\n columnFilterMenuMaxHeight = 400,\n}: TableToolbarProps<TableData>): ReactElement | null {\n const [colMenuAnchor, setColMenuAnchor] = useState<null | HTMLElement>(null);\n const colMenuOpen = Boolean(colMenuAnchor);\n const [searchResetKey, setSearchResetKey] = useState(0);\n\n const handleSearchClear = useCallback(() => {\n onGlobalFilterChange('');\n setSearchResetKey((prev) => prev + 1);\n }, [onGlobalFilterChange]);\n\n if (!isSearchEnabled && !isColumnFilterEnabled) {\n return null;\n }\n\n return (\n <Stack\n direction=\"row\"\n gap={1}\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n width={width}\n padding=\"0.5rem\"\n sx={{ backgroundColor: (theme) => theme.palette.background.default }}\n >\n {isSearchEnabled && (\n <TextField\n key={searchResetKey}\n placeholder=\"Search...\"\n value={globalFilter}\n onChange={onGlobalFilterChange}\n variant=\"standard\"\n slotProps={{\n htmlInput: { 'aria-label': 'search table' },\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <Magnify fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: globalFilter !== '' && (\n <InputAdornment position=\"end\">\n <IconButton onClick={handleSearchClear}>\n <Close fontSize=\"small\" />\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n sx={{ flexGrow: 1 }}\n />\n )}\n {isColumnFilterEnabled && (\n <>\n <IconButton\n onClick={(e) => setColMenuAnchor(e.currentTarget)}\n aria-haspopup=\"listbox\"\n aria-expanded={colMenuOpen}\n color=\"info\"\n >\n <ViewColumn />\n </IconButton>\n <Menu\n anchorEl={colMenuAnchor}\n open={colMenuOpen}\n onClose={() => setColMenuAnchor(null)}\n slotProps={{ list: { dense: true } }}\n sx={{ maxHeight: columnFilterMenuMaxHeight }}\n >\n {columns.map((column) => {\n const header = column.columnDef.header;\n const label = typeof header === 'string' ? header : column.id;\n return (\n <MenuItem\n key={column.id}\n disabled={!column.getCanHide()}\n onClick={column.getCanHide() ? column.getToggleVisibilityHandler() : undefined}\n dense\n >\n <Checkbox\n checked={column.getIsVisible()}\n disabled={!column.getCanHide()}\n size=\"small\"\n disableRipple\n sx={{ p: 0, mr: 1 }}\n />\n <ListItemText primary={label} />\n </MenuItem>\n );\n })}\n </Menu>\n </>\n )}\n </Stack>\n );\n}\n"],"names":["Checkbox","IconButton","InputAdornment","ListItemText","Menu","MenuItem","Stack","useCallback","useState","Magnify","Close","ViewColumn","TextField","TableToolbar","isSearchEnabled","globalFilter","onGlobalFilterChange","isColumnFilterEnabled","columns","width","columnFilterMenuMaxHeight","colMenuAnchor","setColMenuAnchor","colMenuOpen","Boolean","searchResetKey","setSearchResetKey","handleSearchClear","prev","direction","gap","alignItems","justifyContent","padding","sx","backgroundColor","theme","palette","background","default","placeholder","value","onChange","variant","slotProps","htmlInput","input","startAdornment","position","fontSize","endAdornment","onClick","flexGrow","e","currentTarget","aria-haspopup","aria-expanded","color","anchorEl","open","onClose","list","dense","maxHeight","map","column","header","columnDef","label","id","disabled","getCanHide","getToggleVisibilityHandler","undefined","checked","getIsVisible","size","disableRipple","p","mr","primary"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Column, HeaderGroup, Row } from '@tanstack/react-table';
2
2
  import { ReactElement } from 'react';
3
+ import { TableToolbarProps } from './TableToolbar';
3
4
  import { TableCellConfigs, TableProps } from './model/table-model';
4
5
  export type VirtualizedTableProps<TableData> = Required<Pick<TableProps<TableData>, 'height' | 'width' | 'density' | 'defaultColumnWidth' | 'defaultColumnHeight'>> & Pick<TableProps<TableData>, 'onRowMouseOver' | 'onRowMouseOut' | 'pagination' | 'onPaginationChange'> & {
5
6
  onRowClick: (e: React.MouseEvent<HTMLDivElement, MouseEvent>, id: string) => void;
@@ -8,6 +9,7 @@ export type VirtualizedTableProps<TableData> = Required<Pick<TableProps<TableDat
8
9
  headers: Array<HeaderGroup<TableData>>;
9
10
  cellConfigs?: TableCellConfigs;
10
11
  rowCount: number;
12
+ toolbarConfig: Pick<TableToolbarProps<TableData>, 'isSearchEnabled' | 'globalFilter' | 'onGlobalFilterChange' | 'isColumnFilterEnabled' | 'columns' | 'columnFilterMenuMaxHeight'>;
11
13
  };
12
- export declare function VirtualizedTable<TableData>({ width, height, density, defaultColumnWidth, defaultColumnHeight, onRowClick, onRowMouseOver, onRowMouseOut, rows, columns, headers, cellConfigs, pagination, onPaginationChange, rowCount, }: VirtualizedTableProps<TableData>): ReactElement;
14
+ export declare function VirtualizedTable<TableData>({ width, height, density, defaultColumnWidth, defaultColumnHeight, onRowClick, onRowMouseOver, onRowMouseOut, rows, columns, headers, cellConfigs, pagination, onPaginationChange, rowCount, toolbarConfig, }: VirtualizedTableProps<TableData>): ReactElement;
13
15
  //# sourceMappingURL=VirtualizedTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedTable.d.ts","sourceRoot":"","sources":["../../src/Table/VirtualizedTable.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAc,MAAM,uBAAuB,CAAC;AAG7E,OAAO,EAAmB,YAAY,EAAE,MAAM,OAAO,CAAC;AAQtD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAqB,MAAM,qBAAqB,CAAC;AAStF,MAAM,MAAM,qBAAqB,CAAC,SAAS,IAAI,QAAQ,CACrD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,oBAAoB,GAAG,qBAAqB,CAAC,CAC3G,GACC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,eAAe,GAAG,YAAY,GAAG,oBAAoB,CAAC,GAAG;IACtG,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClF,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAKJ,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,EAC1C,KAAK,EACL,MAAM,EACN,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,aAAa,EACb,IAAI,EACJ,OAAO,EACP,OAAO,EACP,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,QAAQ,GACT,EAAE,qBAAqB,CAAC,SAAS,CAAC,GAAG,YAAY,CAsPjD"}
1
+ {"version":3,"file":"VirtualizedTable.d.ts","sourceRoot":"","sources":["../../src/Table/VirtualizedTable.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAc,WAAW,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAG7E,OAAO,EAAE,YAAY,EAAmB,MAAM,OAAO,CAAC;AACtD,OAAO,EAAgB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQjE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAqB,MAAM,qBAAqB,CAAC;AAStF,MAAM,MAAM,qBAAqB,CAAC,SAAS,IAAI,QAAQ,CACrD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,oBAAoB,GAAG,qBAAqB,CAAC,CAC3G,GACC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,eAAe,GAAG,YAAY,GAAG,oBAAoB,CAAC,GAAG;IACtG,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClF,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,IAAI,CACjB,iBAAiB,CAAC,SAAS,CAAC,EAC1B,iBAAiB,GACjB,cAAc,GACd,sBAAsB,GACtB,uBAAuB,GACvB,SAAS,GACT,2BAA2B,CAC9B,CAAC;CACH,CAAC;AAKJ,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,EAC1C,KAAK,EACL,MAAM,EACN,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,aAAa,EACb,IAAI,EACJ,OAAO,EACP,OAAO,EACP,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,aAAa,GACd,EAAE,qBAAqB,CAAC,SAAS,CAAC,GAAG,YAAY,CAyPjD"}
@@ -10,11 +10,12 @@
10
10
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
- import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
13
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
14
  import { flexRender } from '@tanstack/react-table';
15
15
  import { Box, TablePagination, TableRow as MuiTableRow } from '@mui/material';
16
16
  import { TableVirtuoso } from 'react-virtuoso';
17
- import { useRef, useMemo } from 'react';
17
+ import { useMemo, useRef } from 'react';
18
+ import { TableToolbar } from './TableToolbar';
18
19
  import { TableRow } from './TableRow';
19
20
  import { TableBody } from './TableBody';
20
21
  import { InnerTable } from './InnerTable';
@@ -27,7 +28,7 @@ import { TableFoot } from './TableFoot';
27
28
  // Separating out the virtualized table because we may want a paginated table
28
29
  // in the future that does not need virtualization, and we'd likely lay them
29
30
  // out differently.
30
- export function VirtualizedTable({ width, height, density, defaultColumnWidth, defaultColumnHeight, onRowClick, onRowMouseOver, onRowMouseOut, rows, columns, headers, cellConfigs, pagination, onPaginationChange, rowCount }) {
31
+ export function VirtualizedTable({ width, height, density, defaultColumnWidth, defaultColumnHeight, onRowClick, onRowMouseOver, onRowMouseOut, rows, columns, headers, cellConfigs, pagination, onPaginationChange, rowCount, toolbarConfig }) {
31
32
  const virtuosoRef = useRef(null);
32
33
  // Use a ref for these values because they are only needed for keyboard
33
34
  // focus interactions and setting them on state will lead to a significant
@@ -115,129 +116,139 @@ export function VirtualizedTable({ width, height, density, defaultColumnWidth, d
115
116
  pageSize: parseInt(event.target.value, 10)
116
117
  });
117
118
  };
118
- return /*#__PURE__*/ _jsx(Box, {
119
- style: {
120
- width,
121
- height
122
- },
123
- children: /*#__PURE__*/ _jsx(TableVirtuoso, {
124
- ref: virtuosoRef,
125
- totalCount: rows.length,
126
- components: VirtuosoTableComponents,
127
- // Note: this value is impacted by overscan. See this issue if overscan
128
- // is added.
129
- // https://github.com/petyosi/react-virtuoso/issues/118#issuecomment-642156138
130
- rangeChanged: setVisibleRange,
131
- fixedHeaderContent: ()=>{
132
- return /*#__PURE__*/ _jsx(_Fragment, {
133
- children: headers.map((headerGroup)=>{
134
- return /*#__PURE__*/ _jsx(TableRow, {
135
- density: density,
136
- children: headerGroup.headers.map((header, i, headers)=>{
137
- const column = header.column;
119
+ return /*#__PURE__*/ _jsx(_Fragment, {
120
+ children: /*#__PURE__*/ _jsxs(Box, {
121
+ style: {
122
+ width,
123
+ height,
124
+ display: 'flex',
125
+ flexDirection: 'column'
126
+ },
127
+ children: [
128
+ /*#__PURE__*/ _jsx(TableToolbar, {
129
+ ...toolbarConfig,
130
+ width: width
131
+ }),
132
+ /*#__PURE__*/ _jsx(TableVirtuoso, {
133
+ ref: virtuosoRef,
134
+ totalCount: rows.length,
135
+ components: VirtuosoTableComponents,
136
+ // Note: this value is impacted by overscan. See this issue if overscan
137
+ // is added.
138
+ // https://github.com/petyosi/react-virtuoso/issues/118#issuecomment-642156138
139
+ rangeChanged: setVisibleRange,
140
+ fixedHeaderContent: ()=>{
141
+ return /*#__PURE__*/ _jsx(_Fragment, {
142
+ children: headers.map((headerGroup)=>{
143
+ return /*#__PURE__*/ _jsx(TableRow, {
144
+ density: density,
145
+ children: headerGroup.headers.map((header, i, headers)=>{
146
+ const column = header.column;
147
+ const position = {
148
+ row: 0,
149
+ column: i
150
+ };
151
+ const isSorted = column.getIsSorted();
152
+ const nextSorting = column.getNextSortingOrder();
153
+ return /*#__PURE__*/ _jsx(TableHeaderCell, {
154
+ onSort: column.getCanSort() ? column.getToggleSortingHandler() : undefined,
155
+ sortDirection: typeof isSorted === 'string' ? isSorted : undefined,
156
+ nextSortDirection: typeof nextSorting === 'string' ? nextSorting : undefined,
157
+ width: column.getSize() || defaultColumnWidth,
158
+ defaultColumnHeight: defaultColumnHeight,
159
+ align: column.columnDef.meta?.align,
160
+ variant: "head",
161
+ density: density,
162
+ description: column.columnDef.meta?.headerDescription,
163
+ focusState: getFocusState(position),
164
+ onFocusTrigger: ()=>keyboardNav.onCellFocus(position),
165
+ isFirstColumn: i === 0,
166
+ isLastColumn: i === headers.length - 1,
167
+ children: flexRender(column.columnDef.header, header.getContext())
168
+ }, header.id);
169
+ })
170
+ }, headerGroup.id);
171
+ })
172
+ });
173
+ },
174
+ fixedFooterContent: pagination ? ()=>/*#__PURE__*/ _jsx(MuiTableRow, {
175
+ sx: {
176
+ backgroundColor: (theme)=>theme.palette.background.default
177
+ },
178
+ children: /*#__PURE__*/ _jsx(TablePagination, {
179
+ colSpan: columns.length,
180
+ count: rowCount,
181
+ page: pagination.pageIndex,
182
+ rowsPerPage: pagination.pageSize,
183
+ onPageChange: handleChangePage,
184
+ onRowsPerPageChange: handleChangeRowsPerPage
185
+ })
186
+ }) : undefined,
187
+ itemContent: (index)=>{
188
+ const row = rows[index];
189
+ if (!row) {
190
+ return null;
191
+ }
192
+ return /*#__PURE__*/ _jsx(_Fragment, {
193
+ children: row.getVisibleCells().map((cell, i, cells)=>{
138
194
  const position = {
139
- row: 0,
195
+ row: index + 1,
140
196
  column: i
141
197
  };
142
- const isSorted = column.getIsSorted();
143
- const nextSorting = column.getNextSortingOrder();
144
- return /*#__PURE__*/ _jsx(TableHeaderCell, {
145
- onSort: column.getCanSort() ? column.getToggleSortingHandler() : undefined,
146
- sortDirection: typeof isSorted === 'string' ? isSorted : undefined,
147
- nextSortDirection: typeof nextSorting === 'string' ? nextSorting : undefined,
148
- width: column.getSize() || defaultColumnWidth,
198
+ const cellContext = cell.getContext();
199
+ const cellConfig = cellConfigs?.[cellContext.cell.id];
200
+ const cellRenderFn = cell.column.columnDef.cell;
201
+ const cellContent = typeof cellRenderFn === 'function' ? cellRenderFn(cellContext) : null;
202
+ /*
203
+ IMPORTANT:
204
+ If Variables exist in the link, they should have been translated by the plugin already. (Being developed at the moment)
205
+ Components have no access to any context (Which is intentional and correct)
206
+ We may want to add parameters to a link from neighboring cells in the future as well.
207
+ If this is the case, the value of the neighboring cells should be read from here and be replaced. (Bing discussed at the moment, not decided yet)
208
+ */ const cellDescriptionDef = cell.column.columnDef.meta?.cellDescription;
209
+ let description = undefined;
210
+ if (typeof cellDescriptionDef === 'function') {
211
+ // If the cell description is a function, set the value using
212
+ // the function.
213
+ description = cellDescriptionDef(cellContext);
214
+ } else if (cellDescriptionDef && typeof cellContent === 'string') {
215
+ // If the cell description is `true` AND the cell content is
216
+ // a string (and thus viable as a `title` attribute), use the
217
+ // cell content.
218
+ description = cellContent;
219
+ }
220
+ /* this has been specifically added for the data link,
221
+ therefore, non string and numeric values should be excluded
222
+ */ const adjacentCellsValuesMap = Object.entries(row.original)?.filter(([_, value])=>[
223
+ 'string',
224
+ 'number'
225
+ ].includes(typeof value)).reduce((acc, [key, value])=>({
226
+ ...acc,
227
+ [key]: String(value)
228
+ }), {});
229
+ return /*#__PURE__*/ _jsx(TableCell, {
230
+ "data-testid": cell.id,
231
+ title: description || cellConfig?.text || cellContent,
232
+ width: cell.column.getSize() || defaultColumnWidth,
149
233
  defaultColumnHeight: defaultColumnHeight,
150
- align: column.columnDef.meta?.align,
151
- variant: "head",
234
+ align: cell.column.columnDef.meta?.align,
152
235
  density: density,
153
- description: column.columnDef.meta?.headerDescription,
154
236
  focusState: getFocusState(position),
155
237
  onFocusTrigger: ()=>keyboardNav.onCellFocus(position),
156
238
  isFirstColumn: i === 0,
157
- isLastColumn: i === headers.length - 1,
158
- children: flexRender(column.columnDef.header, header.getContext())
159
- }, header.id);
239
+ isLastColumn: i === cells.length - 1,
240
+ description: description,
241
+ color: cellConfig?.textColor ?? undefined,
242
+ backgroundColor: cellConfig?.backgroundColor ?? undefined,
243
+ dataLink: cell.column.columnDef.meta?.dataLink,
244
+ adjacentCellsValuesMap: adjacentCellsValuesMap,
245
+ children: cellConfig?.text || cellContent
246
+ }, cell.id);
160
247
  })
161
- }, headerGroup.id);
162
- })
163
- });
164
- },
165
- fixedFooterContent: pagination ? ()=>/*#__PURE__*/ _jsx(MuiTableRow, {
166
- sx: {
167
- backgroundColor: (theme)=>theme.palette.background.default
168
- },
169
- children: /*#__PURE__*/ _jsx(TablePagination, {
170
- colSpan: columns.length,
171
- count: rowCount,
172
- page: pagination.pageIndex,
173
- rowsPerPage: pagination.pageSize,
174
- onPageChange: handleChangePage,
175
- onRowsPerPageChange: handleChangeRowsPerPage
176
- })
177
- }) : undefined,
178
- itemContent: (index)=>{
179
- const row = rows[index];
180
- if (!row) {
181
- return null;
182
- }
183
- return /*#__PURE__*/ _jsx(_Fragment, {
184
- children: row.getVisibleCells().map((cell, i, cells)=>{
185
- const position = {
186
- row: index + 1,
187
- column: i
188
- };
189
- const cellContext = cell.getContext();
190
- const cellConfig = cellConfigs?.[cellContext.cell.id];
191
- const cellRenderFn = cell.column.columnDef.cell;
192
- const cellContent = typeof cellRenderFn === 'function' ? cellRenderFn(cellContext) : null;
193
- /*
194
- IMPORTANT:
195
- If Variables exist in the link, they should have been translated by the plugin already. (Being developed at the moment)
196
- Components have no access to any context (Which is intentional and correct)
197
- We may want to add parameters to a link from neighboring cells in the future as well.
198
- If this is the case, the value of the neighboring cells should be read from here and be replaced. (Bing discussed at the moment, not decided yet)
199
- */ const cellDescriptionDef = cell.column.columnDef.meta?.cellDescription;
200
- let description = undefined;
201
- if (typeof cellDescriptionDef === 'function') {
202
- // If the cell description is a function, set the value using
203
- // the function.
204
- description = cellDescriptionDef(cellContext);
205
- } else if (cellDescriptionDef && typeof cellContent === 'string') {
206
- // If the cell description is `true` AND the cell content is
207
- // a string (and thus viable as a `title` attribute), use the
208
- // cell content.
209
- description = cellContent;
210
- }
211
- /* this has been specifically added for the data link,
212
- therefore, non string and numeric values should be excluded
213
- */ const adjacentCellsValuesMap = Object.entries(row.original)?.filter(([_, value])=>[
214
- 'string',
215
- 'number'
216
- ].includes(typeof value)).reduce((acc, [key, value])=>({
217
- ...acc,
218
- [key]: String(value)
219
- }), {});
220
- return /*#__PURE__*/ _jsx(TableCell, {
221
- "data-testid": cell.id,
222
- title: description || cellConfig?.text || cellContent,
223
- width: cell.column.getSize() || defaultColumnWidth,
224
- defaultColumnHeight: defaultColumnHeight,
225
- align: cell.column.columnDef.meta?.align,
226
- density: density,
227
- focusState: getFocusState(position),
228
- onFocusTrigger: ()=>keyboardNav.onCellFocus(position),
229
- isFirstColumn: i === 0,
230
- isLastColumn: i === cells.length - 1,
231
- description: description,
232
- color: cellConfig?.textColor ?? undefined,
233
- backgroundColor: cellConfig?.backgroundColor ?? undefined,
234
- dataLink: cell.column.columnDef.meta?.dataLink,
235
- adjacentCellsValuesMap: adjacentCellsValuesMap,
236
- children: cellConfig?.text || cellContent
237
- }, cell.id);
238
- })
239
- });
240
- }
248
+ });
249
+ }
250
+ })
251
+ ]
241
252
  })
242
253
  });
243
254
  }