@terraware/web-components 5.0.27-rc.0 → 5.0.27

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 (295) hide show
  1. package/components/AntSwitch/index.js +22 -19
  2. package/components/Autocomplete/Autocomplete.js +130 -106
  3. package/components/Badge/index.js +29 -28
  4. package/components/BusySpinner/index.js +45 -40
  5. package/components/Button/Button.js +47 -41
  6. package/components/Checkbox.js +63 -64
  7. package/components/Confirm/index.js +83 -74
  8. package/components/DatePicker/DatePicker.js +141 -138
  9. package/components/DialogBox/DialogBox.js +118 -111
  10. package/components/Divisor.js +18 -18
  11. package/components/Dropdown.js +94 -66
  12. package/components/EditableTable/index.js +271 -211
  13. package/components/ErrorBox/ErrorBox.js +49 -47
  14. package/components/FileChooser/index.js +135 -117
  15. package/components/FormBottomBar/index.js +84 -75
  16. package/components/Icon/Icon.js +20 -12
  17. package/components/Icon/icons/index.js +256 -256
  18. package/components/IconTooltip/index.js +60 -49
  19. package/components/Map/MapBox.js +452 -545
  20. package/components/Map/MapContainer.js +29 -25
  21. package/components/Map/MapDateSliderControl.js +64 -64
  22. package/components/Map/MapDrawer.js +47 -41
  23. package/components/Map/MapLegend.js +172 -176
  24. package/components/Map/MapViewStyleControl.js +63 -59
  25. package/components/Map/ReactMapboxWrapper.js +2 -3
  26. package/components/Map/index.js +180 -161
  27. package/components/Map/types.js +17 -12
  28. package/components/Map/useMaintainLayerOrder.js +26 -16
  29. package/components/Markdown/index.js +26 -25
  30. package/components/Message/Message.js +76 -73
  31. package/components/MultiSelect/index.js +124 -112
  32. package/components/Navbar/NavFooter.js +13 -9
  33. package/components/Navbar/NavItem.js +76 -70
  34. package/components/Navbar/NavSection.js +19 -17
  35. package/components/Navbar/Navbar.js +46 -39
  36. package/components/Navbar/SubNavbar.js +13 -9
  37. package/components/Note.js +22 -18
  38. package/components/OverlayModal/OverlayModal.js +63 -56
  39. package/components/PageForm/index.js +41 -33
  40. package/components/PhotoChooser/index.js +173 -165
  41. package/components/PhotosCarousel/PhotoSlide.js +35 -32
  42. package/components/PhotosCarousel/index.js +85 -80
  43. package/components/PhotosCarousel/usePhotosCarousel.js +76 -69
  44. package/components/Pill/index.js +45 -41
  45. package/components/PillList/index.js +24 -17
  46. package/components/PlacementWrapper/index.js +59 -38
  47. package/components/PopoverMenu/Popover.js +85 -68
  48. package/components/PopoverMenu/index.js +56 -51
  49. package/components/PopoverMultiSelect/index.js +59 -52
  50. package/components/ProgressCircle/ProgressCircle.js +32 -28
  51. package/components/RadioButton.js +19 -17
  52. package/components/Select/Select.js +15 -13
  53. package/components/Select/SelectT.js +250 -235
  54. package/components/Separator/index.js +17 -14
  55. package/components/Size.js +1 -0
  56. package/components/Slider/index.js +56 -43
  57. package/components/SummaryBox.js +72 -70
  58. package/components/Tabs/index.js +135 -133
  59. package/components/TextTruncated/index.js +130 -117
  60. package/components/Textfield/Textfield.js +190 -158
  61. package/components/Textfield/TruncatedTextArea.js +84 -70
  62. package/components/TimelineSlider/TimelineMarker.js +30 -25
  63. package/components/TimelineSlider/TimelineRail.js +11 -8
  64. package/components/TimelineSlider/index.js +66 -64
  65. package/components/TimelineSliderV2/ClusterBadge.js +29 -25
  66. package/components/TimelineSliderV2/TimelineDot.js +35 -31
  67. package/components/TimelineSliderV2/TimelineRail.js +11 -8
  68. package/components/TimelineSliderV2/index.js +103 -121
  69. package/components/TimelineSliderV2/layout.js +147 -124
  70. package/components/TimelineSliderV2/types.js +1 -0
  71. package/components/Tooltip/Tooltip.js +56 -47
  72. package/components/ViewPhotosDialog/index.js +35 -28
  73. package/components/VirtualWalkthrough/Annotation.js +207 -163
  74. package/components/VirtualWalkthrough/AnnotationEditPane.js +184 -198
  75. package/components/VirtualWalkthrough/AnnotationPanel.js +199 -187
  76. package/components/VirtualWalkthrough/Application.js +34 -31
  77. package/components/VirtualWalkthrough/AutoRotator.js +223 -85
  78. package/components/VirtualWalkthrough/BlockingSpinner.js +28 -26
  79. package/components/VirtualWalkthrough/BoundaryRing.js +34 -30
  80. package/components/VirtualWalkthrough/BoundaryWall.js +36 -32
  81. package/components/VirtualWalkthrough/CameraInfo.js +89 -100
  82. package/components/VirtualWalkthrough/ControlsInfoPane.js +195 -254
  83. package/components/VirtualWalkthrough/GradientSky.js +73 -72
  84. package/components/VirtualWalkthrough/SplatControls.js +221 -209
  85. package/components/VirtualWalkthrough/SplatCrop.js +20 -21
  86. package/components/VirtualWalkthrough/SplatFadeCrop.js +20 -21
  87. package/components/VirtualWalkthrough/SplatModel.js +85 -65
  88. package/components/VirtualWalkthrough/SplatRevealRain.js +46 -41
  89. package/components/VirtualWalkthrough/TfAnnotationManager.js +379 -197
  90. package/components/VirtualWalkthrough/TfXrNavigation.js +162 -73
  91. package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +431 -438
  92. package/components/VirtualWalkthrough/VrAnnotationPanel.js +22 -18
  93. package/components/VirtualWalkthrough/XrAnnotationInteraction.js +17 -14
  94. package/components/VirtualWalkthrough/XrExitButton.js +17 -14
  95. package/components/VirtualWalkthrough/XrGazeDwell.js +17 -14
  96. package/components/VirtualWalkthrough/XrPointerRay.js +17 -14
  97. package/components/VirtualWalkthrough/XrStartPose.js +121 -67
  98. package/components/VirtualWalkthrough/boundary-ring.js +117 -87
  99. package/components/VirtualWalkthrough/boundary-wall.js +258 -175
  100. package/components/VirtualWalkthrough/camera-adoption.js +64 -18
  101. package/components/VirtualWalkthrough/groundPlane.js +47 -32
  102. package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
  103. package/components/VirtualWalkthrough/splatFormat.js +47 -13
  104. package/components/VirtualWalkthrough/useAdoptedCamera.js +44 -23
  105. package/components/VirtualWalkthrough/useRestartOnVr.js +37 -26
  106. package/components/VirtualWalkthrough/useXrRenderTuning.js +54 -33
  107. package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +99 -67
  108. package/components/VirtualWalkthrough/vr-annotation-panel.js +433 -403
  109. package/components/VirtualWalkthrough/vr-annotation-scroll.js +28 -10
  110. package/components/VirtualWalkthrough/walkthrough-camera.js +329 -204
  111. package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +80 -39
  112. package/components/VirtualWalkthrough/xr-annotation-candidates.js +18 -6
  113. package/components/VirtualWalkthrough/xr-annotation-interaction.js +56 -31
  114. package/components/VirtualWalkthrough/xr-annotation-targeting.js +38 -22
  115. package/components/VirtualWalkthrough/xr-button-arming.js +17 -7
  116. package/components/VirtualWalkthrough/xr-button-hold.js +36 -22
  117. package/components/VirtualWalkthrough/xr-exit-button-mask.js +36 -22
  118. package/components/VirtualWalkthrough/xr-exit-button.js +207 -148
  119. package/components/VirtualWalkthrough/xr-face-buttons.js +29 -19
  120. package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +34 -23
  121. package/components/VirtualWalkthrough/xr-gaze-dwell.js +144 -107
  122. package/components/VirtualWalkthrough/xr-interactive-ui.js +24 -12
  123. package/components/VirtualWalkthrough/xr-pointer-ray.js +20 -13
  124. package/components/VirtualWalkthrough/xr-progress-pie-material.js +88 -117
  125. package/components/VirtualWalkthrough/xr-progress-pie.js +10 -1
  126. package/components/VirtualWalkthrough/xr-ray-quad.js +30 -16
  127. package/components/VirtualWalkthrough/xr-render-tuning.js +48 -17
  128. package/components/VirtualWalkthrough/xr-scene-bounds.js +37 -21
  129. package/components/VirtualWalkthrough/xr-start-pose.js +73 -27
  130. package/components/VirtualWalkthrough/xr-teleport-gesture.js +42 -16
  131. package/components/svg/BlobbyGrayIconImage.js +39 -41
  132. package/components/svg/BlobbyGrayIconImport.js +39 -41
  133. package/components/svg/BlobbyGrayIconUploadToTheCloud.js +39 -41
  134. package/components/svg/BlobbyIconCloudChecked.js +164 -202
  135. package/components/svg/BlobbyIconExportOrUploadPhoto.js +164 -202
  136. package/components/svg/BlobbyIconFolder.js +164 -202
  137. package/components/svg/BlobbyIconGraphReport.js +164 -202
  138. package/components/svg/BlobbyIconHappy.js +164 -202
  139. package/components/svg/BlobbyIconHeartMonitor.js +164 -202
  140. package/components/svg/BlobbyIconLeaf.js +164 -202
  141. package/components/svg/BlobbyIconLibrary.js +164 -202
  142. package/components/svg/BlobbyIconNursery.js +166 -204
  143. package/components/svg/BlobbyIconOrganization.js +164 -202
  144. package/components/svg/BlobbyIconParchment.js +164 -202
  145. package/components/svg/BlobbyIconPeople.js +164 -202
  146. package/components/svg/BlobbyIconSeedBank.js +164 -202
  147. package/components/svg/BlobbyIconSeedling.js +164 -202
  148. package/components/svg/BlobbyIconSeeds.js +164 -202
  149. package/components/svg/BlobbyIconSite.js +167 -206
  150. package/components/svg/BlobbyIconSparkles.js +164 -202
  151. package/components/svg/BlobbyIconWrench.js +164 -202
  152. package/components/svg/Bug.js +21 -19
  153. package/components/svg/Calendar.js +21 -19
  154. package/components/svg/CaretDown.js +21 -19
  155. package/components/svg/CaretLeft.js +21 -19
  156. package/components/svg/CaretRight.js +21 -19
  157. package/components/svg/CaretUp.js +21 -19
  158. package/components/svg/ChevronDown.js +21 -19
  159. package/components/svg/ChevronUp.js +21 -19
  160. package/components/svg/Close.js +21 -19
  161. package/components/svg/Critical.js +21 -19
  162. package/components/svg/Edit.js +164 -202
  163. package/components/svg/Error.js +21 -19
  164. package/components/svg/Filter.js +21 -19
  165. package/components/svg/Folder.js +21 -19
  166. package/components/svg/Help.js +21 -19
  167. package/components/svg/Home.js +21 -19
  168. package/components/svg/IconAdd.js +21 -19
  169. package/components/svg/IconArrowRight.js +23 -21
  170. package/components/svg/IconBusinessNetwork.js +21 -19
  171. package/components/svg/IconCalendar.js +21 -19
  172. package/components/svg/IconCancel.js +21 -19
  173. package/components/svg/IconChargingBattery.js +21 -19
  174. package/components/svg/IconChecklist.js +23 -21
  175. package/components/svg/IconCheckmark.js +21 -19
  176. package/components/svg/IconCoinInHand.js +21 -19
  177. package/components/svg/IconColumns.js +21 -19
  178. package/components/svg/IconComment.js +22 -20
  179. package/components/svg/IconDashboard.js +21 -19
  180. package/components/svg/IconDataMigration.js +21 -19
  181. package/components/svg/IconDocument.js +23 -21
  182. package/components/svg/IconDownloadFromTheCloud.js +23 -21
  183. package/components/svg/IconEdit.js +23 -21
  184. package/components/svg/IconExpand.js +23 -21
  185. package/components/svg/IconExport.js +21 -19
  186. package/components/svg/IconExternalLink.js +21 -19
  187. package/components/svg/IconEye.js +21 -19
  188. package/components/svg/IconEyeOff.js +21 -19
  189. package/components/svg/IconFile.js +21 -19
  190. package/components/svg/IconFolder.js +21 -19
  191. package/components/svg/IconFullScreen.js +22 -20
  192. package/components/svg/IconFutures.js +21 -19
  193. package/components/svg/IconGraphReport.js +21 -19
  194. package/components/svg/IconGrid.js +21 -19
  195. package/components/svg/IconHeartMonitor.js +21 -19
  196. package/components/svg/IconHelp.js +23 -21
  197. package/components/svg/IconHistory.js +21 -19
  198. package/components/svg/IconImport.js +21 -19
  199. package/components/svg/IconIndex.js +21 -19
  200. package/components/svg/IconLayers.js +21 -19
  201. package/components/svg/IconLibrary.js +22 -20
  202. package/components/svg/IconList.js +21 -19
  203. package/components/svg/IconLivePlant.js +21 -19
  204. package/components/svg/IconLocations.js +21 -19
  205. package/components/svg/IconMail.js +21 -19
  206. package/components/svg/IconManager.js +21 -19
  207. package/components/svg/IconMap.js +21 -19
  208. package/components/svg/IconMarker.js +21 -19
  209. package/components/svg/IconMenu.js +21 -19
  210. package/components/svg/IconMenuHorizontal.js +21 -19
  211. package/components/svg/IconModule.js +21 -19
  212. package/components/svg/IconMyLocation.js +21 -19
  213. package/components/svg/IconNote.js +23 -21
  214. package/components/svg/IconNursery.js +23 -21
  215. package/components/svg/IconOrg.js +21 -19
  216. package/components/svg/IconParchment.js +21 -19
  217. package/components/svg/IconPhoto.js +21 -19
  218. package/components/svg/IconPlantsFilled.js +21 -19
  219. package/components/svg/IconRedo.js +21 -19
  220. package/components/svg/IconRestorationSite.js +21 -19
  221. package/components/svg/IconSeedBank.js +21 -19
  222. package/components/svg/IconSeedling.js +21 -19
  223. package/components/svg/IconSettings.js +21 -19
  224. package/components/svg/IconSlice.js +21 -19
  225. package/components/svg/IconSubmit.js +21 -19
  226. package/components/svg/IconSubtract.js +23 -21
  227. package/components/svg/IconSynced.js +21 -19
  228. package/components/svg/IconTrashCan.js +21 -19
  229. package/components/svg/IconTreasureMap.js +21 -19
  230. package/components/svg/IconUnavailable.js +21 -19
  231. package/components/svg/IconUndo.js +21 -19
  232. package/components/svg/IconVariable.js +21 -19
  233. package/components/svg/IconVideo.js +31 -30
  234. package/components/svg/IconWifi.js +21 -19
  235. package/components/svg/Info.js +21 -19
  236. package/components/svg/Key.js +21 -19
  237. package/components/svg/Leaf.js +21 -19
  238. package/components/svg/Lock.js +21 -19
  239. package/components/svg/Logo.js +43 -48
  240. package/components/svg/MenuVertical.js +21 -19
  241. package/components/svg/Notification.js +21 -19
  242. package/components/svg/Person.js +21 -19
  243. package/components/svg/Plus.js +21 -19
  244. package/components/svg/RestorationSite.js +21 -19
  245. package/components/svg/Search.js +21 -19
  246. package/components/svg/Seeds.js +21 -19
  247. package/components/svg/Site.js +21 -19
  248. package/components/svg/Sparkles.js +21 -19
  249. package/components/svg/Species.js +21 -19
  250. package/components/svg/Species2.js +164 -202
  251. package/components/svg/Spinner.js +48 -54
  252. package/components/svg/Star.js +21 -19
  253. package/components/svg/Success.js +21 -19
  254. package/components/svg/SuccessFilled.js +21 -19
  255. package/components/svg/TerrawareLogoDesktop.js +49 -55
  256. package/components/svg/TerrawareLogoMobile.js +26 -25
  257. package/components/svg/Touchscreen.js +21 -19
  258. package/components/svg/UploadCloud.js +164 -202
  259. package/components/svg/Warning.js +21 -19
  260. package/components/svg/WelcomeClipboard.js +133 -156
  261. package/components/svg/index.js +129 -129
  262. package/components/table/EnhancedTableToolbar.js +74 -68
  263. package/components/table/EnhancedTableToolbarV2.js +41 -31
  264. package/components/table/TableCellRenderer.js +231 -196
  265. package/components/table/TableHeader.js +73 -71
  266. package/components/table/TableHeaderItem.js +102 -97
  267. package/components/table/density.js +19 -18
  268. package/components/table/index.js +369 -350
  269. package/components/table/sort.js +52 -27
  270. package/components/table/types.js +1 -0
  271. package/components/types/index.js +1 -0
  272. package/hooks/cameraEntityContext.js +13 -2
  273. package/hooks/useBoolean.js +13 -17
  274. package/hooks/useCameraPosition.js +56 -56
  275. package/hooks/useDevicePerformance.js +17 -17
  276. package/hooks/useXr.js +87 -85
  277. package/index.js +58 -58
  278. package/package.json +1 -1
  279. package/setupTests.js +4 -0
  280. package/strings/export.js +170 -111
  281. package/strings/index.js +54 -25
  282. package/strings/locales.js +41 -21
  283. package/strings/strings-en.js +51 -49
  284. package/strings/strings-es.js +51 -49
  285. package/strings/strings-fr.js +51 -49
  286. package/strings/strings-gx.js +51 -49
  287. package/style-dictionary-dist/TerrawareTheme.js +186 -186
  288. package/theme.js +76 -74
  289. package/utils/color.js +15 -8
  290. package/utils/date.js +108 -42
  291. package/utils/index.js +4 -4
  292. package/utils/preventDefaultEvent.js +3 -3
  293. package/utils/text.js +11 -11
  294. package/utils/useDeviceInfo.js +79 -42
  295. package/virtualWalkthrough.js +23 -23
@@ -1,217 +1,277 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import react, { useCallback, useEffect, useMemo, useState } from "react";
3
- import { Box, MenuItem, TextField, useTheme } from "@mui/material";
4
- import { MaterialReactTable, useMaterialReactTable } from "material-react-table";
5
- import Button from "../Button/Button.js";
6
- const isActiveFilter = (filter)=>{
7
- if (!filter.value) return false;
8
- if (Array.isArray(filter.value)) return filter.value.some((v)=>null != v && '' !== v);
9
- return null !== filter.value && void 0 !== filter.value && '' !== filter.value;
1
+ import React, { useState, useEffect, useMemo, useCallback } from 'react';
2
+ import { useTheme, Box, TextField, MenuItem } from '@mui/material';
3
+ import { useMaterialReactTable, MaterialReactTable } from 'material-react-table';
4
+ import Button from '../Button/Button.js';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ const isActiveFilter = filter => {
8
+ if (!filter.value) {
9
+ return false;
10
+ }
11
+ if (Array.isArray(filter.value)) {
12
+ return filter.value.some(v => v !== null && v !== undefined && v !== '');
13
+ }
14
+ return filter.value !== null && filter.value !== undefined && filter.value !== '';
10
15
  };
11
- function EditableTable({ clearAllFiltersLabel, columns, data, enableClearAllFilters = true, enableEditing = false, enableColumnOrdering = false, enableColumnPinning = false, enableSorting = true, enableGlobalFilter = false, enableColumnFilters = false, stickyFilters = false, storageKey, enablePagination = true, enableBottomToolbar = true, enableTopToolbar = true, initialSorting, onClearAllFilters, onRowClick, renderToolbarInternalActions, sx, tableOptions = {} }) {
12
- const theme = useTheme();
13
- const filtersEnabled = enableColumnFilters || enableGlobalFilter;
14
- const showClearAllFilters = enableClearAllFilters && filtersEnabled;
15
- const [columnFilters, setColumnFilters] = useState(()=>{
16
- if (!stickyFilters || !storageKey) return [];
17
- try {
18
- const saved = localStorage.getItem(`${storageKey}_columnFilters`);
19
- if (saved) {
20
- const parsed = JSON.parse(saved);
21
- return parsed.filter(isActiveFilter);
22
- }
23
- return [];
24
- } catch (error) {
25
- console.error('Error loading column filters:', error);
26
- return [];
27
- }
28
- });
29
- useEffect(()=>{
30
- if (!stickyFilters || !storageKey) return;
31
- try {
32
- const validFilters = columnFilters.filter(isActiveFilter);
33
- localStorage.setItem(`${storageKey}_columnFilters`, JSON.stringify(validFilters));
34
- } catch (error) {
35
- console.error('Error saving column filters:', error);
36
- }
37
- }, [
38
- columnFilters,
39
- stickyFilters,
40
- storageKey
41
- ]);
42
- const mrtColumns = useMemo(()=>columns.map((col)=>{
43
- const mrtCol = {
44
- id: col.id,
45
- header: col.header,
46
- accessorKey: col.accessorKey,
47
- accessorFn: col.accessorFn,
48
- size: col.size,
49
- enableEditing: col.enableEditing ?? enableEditing,
50
- enableHiding: col.enableHiding ?? true,
51
- Cell: col.Cell,
52
- filterVariant: col.filterVariant,
53
- filterSelectOptions: col.filterSelectOptions,
54
- filterFn: col.filterFn,
55
- enableColumnFilter: void 0 !== col.filterVariant
56
- };
57
- if (col.sortingFn) mrtCol.sortingFn = col.sortingFn;
58
- if (col.editConfig) {
59
- const { editVariant = 'text', selectOptions, customEditComponent, onSave } = col.editConfig;
60
- if ('custom' === editVariant && customEditComponent) mrtCol.Edit = customEditComponent;
61
- else if ('select' === editVariant && selectOptions) {
62
- mrtCol.editVariant = 'select';
63
- mrtCol.editSelectOptions = selectOptions;
64
- const SelectEditComponent = ({ cell, row, table: iTable })=>{
65
- const [value, setValue] = react.useState(cell.getValue() || '');
66
- const handleSave = useCallback(()=>{
67
- if (onSave) onSave(row.original, value, col.id);
68
- iTable.setEditingCell(null);
69
- }, [
70
- value
71
- ]);
72
- return /*#__PURE__*/ jsx(TextField, {
73
- select: true,
74
- value: value,
75
- onChange: (e)=>setValue(e.target.value),
76
- onBlur: handleSave,
77
- onKeyDown: (e)=>{
78
- if ('Enter' === e.key) handleSave();
79
- else if ('Escape' === e.key) iTable.setEditingCell(null);
80
- },
81
- size: "small",
82
- fullWidth: true,
83
- children: selectOptions.map((option)=>/*#__PURE__*/ jsx(MenuItem, {
84
- value: option.value,
85
- children: option.label
86
- }, option.value))
87
- });
88
- };
89
- mrtCol.Edit = SelectEditComponent;
90
- } else mrtCol.muiEditTextFieldProps = ({ row })=>({
91
- onBlur: (event)=>{
92
- if (onSave) {
93
- const value = event.target.value;
94
- onSave(row.original, value, col.id);
95
- }
96
- }
97
- });
98
- }
99
- return mrtCol;
100
- }), [
101
- columns,
102
- enableEditing
103
- ]);
104
- const initialStateConfig = {
105
- ...initialSorting ? {
106
- sorting: initialSorting
107
- } : {},
108
- ...enableColumnFilters ? {
109
- showColumnFilters: true
110
- } : {},
111
- ...enableGlobalFilter ? {
112
- showGlobalFilter: true
113
- } : {}
114
- };
115
- const handleClearAllFilters = useCallback((tbl)=>{
116
- tbl.resetColumnFilters();
117
- if (enableGlobalFilter) tbl.resetGlobalFilter();
118
- setColumnFilters([]);
119
- if (storageKey) localStorage.removeItem(`${storageKey}_columnFilters`);
120
- onClearAllFilters?.();
121
- }, [
122
- enableGlobalFilter,
123
- storageKey,
124
- onClearAllFilters
125
- ]);
126
- const consumerRenderTopToolbarCustomActions = tableOptions?.renderTopToolbarCustomActions;
127
- const consumerRenderToolbarInternalActions = renderToolbarInternalActions ?? tableOptions?.renderToolbarInternalActions;
128
- const composedRenderToolbarInternalActions = useCallback(({ table: tbl })=>{
129
- const state = tbl.getState();
130
- const hasColumnFilters = state.columnFilters.some(isActiveFilter);
131
- const hasGlobalFilter = enableGlobalFilter && !!state.globalFilter;
132
- const hasActiveFilters = hasColumnFilters || hasGlobalFilter;
133
- return /*#__PURE__*/ jsxs(Box, {
134
- sx: {
135
- display: 'flex',
136
- alignItems: 'center',
137
- gap: 1
138
- },
139
- children: [
140
- showClearAllFilters && hasActiveFilters && /*#__PURE__*/ jsx(Button, {
141
- onClick: ()=>handleClearAllFilters(tbl),
142
- label: clearAllFiltersLabel,
143
- priority: "ghost",
144
- size: "small"
145
- }),
146
- consumerRenderToolbarInternalActions && consumerRenderToolbarInternalActions({
147
- table: tbl
148
- })
149
- ]
150
- });
151
- }, [
152
- showClearAllFilters,
153
- consumerRenderToolbarInternalActions,
154
- enableGlobalFilter,
155
- handleClearAllFilters,
156
- clearAllFiltersLabel
157
- ]);
158
- const table = useMaterialReactTable({
159
- columns: mrtColumns,
160
- data,
161
- editDisplayMode: 'cell',
162
- enableColumnOrdering,
163
- enableColumnPinning,
164
- enableEditing,
165
- enableSorting,
166
- enableGlobalFilter,
167
- enableColumnFilters,
168
- enableFilters: enableColumnFilters || enableGlobalFilter,
169
- enablePagination,
170
- enableBottomToolbar: enablePagination ? enableBottomToolbar : false,
171
- enableTopToolbar,
172
- positionGlobalFilter: enableGlobalFilter ? 'left' : void 0,
173
- ...Object.keys(initialStateConfig).length > 0 ? {
174
- initialState: initialStateConfig
175
- } : {},
176
- muiTableBodyProps: {
177
- sx: {
178
- '& tr:nth-of-type(odd) > td': {
179
- backgroundColor: theme.palette.TwClrBaseGray025 || theme.palette.grey[50]
16
+ function EditableTable({
17
+ clearAllFiltersLabel,
18
+ columns,
19
+ data,
20
+ enableClearAllFilters = true,
21
+ enableEditing = false,
22
+ enableColumnOrdering = false,
23
+ enableColumnPinning = false,
24
+ enableSorting = true,
25
+ enableGlobalFilter = false,
26
+ enableColumnFilters = false,
27
+ stickyFilters = false,
28
+ storageKey,
29
+ enablePagination = true,
30
+ enableBottomToolbar = true,
31
+ enableTopToolbar = true,
32
+ initialSorting,
33
+ onClearAllFilters,
34
+ onRowClick,
35
+ renderToolbarInternalActions,
36
+ sx,
37
+ tableOptions = {}
38
+ }) {
39
+ const theme = useTheme();
40
+ const filtersEnabled = enableColumnFilters || enableGlobalFilter;
41
+ const showClearAllFilters = enableClearAllFilters && filtersEnabled;
42
+
43
+ // Sticky column filters - load from localStorage (only if stickyFilters is enabled)
44
+ const [columnFilters, setColumnFilters] = useState(() => {
45
+ if (!stickyFilters || !storageKey) {
46
+ return [];
47
+ }
48
+ try {
49
+ const saved = localStorage.getItem(`${storageKey}_columnFilters`);
50
+ if (saved) {
51
+ const parsed = JSON.parse(saved);
52
+
53
+ // Filter out any filters with null or empty values
54
+ return parsed.filter(isActiveFilter);
55
+ }
56
+ return [];
57
+ } catch (error) {
58
+ console.error('Error loading column filters:', error);
59
+ return [];
60
+ }
61
+ });
62
+
63
+ // Save column filters to localStorage when they change
64
+ useEffect(() => {
65
+ if (!stickyFilters || !storageKey) {
66
+ return;
67
+ }
68
+ try {
69
+ // Filter out any filters with null or empty values before saving
70
+ const validFilters = columnFilters.filter(isActiveFilter);
71
+ localStorage.setItem(`${storageKey}_columnFilters`, JSON.stringify(validFilters));
72
+ } catch (error) {
73
+ console.error('Error saving column filters:', error);
74
+ }
75
+ }, [columnFilters, stickyFilters, storageKey]);
76
+
77
+ // Convert simplified column definitions to MRT column definitions
78
+ const mrtColumns = useMemo(() => {
79
+ return columns.map(col => {
80
+ const mrtCol = {
81
+ id: col.id,
82
+ header: col.header,
83
+ accessorKey: col.accessorKey,
84
+ accessorFn: col.accessorFn,
85
+ size: col.size,
86
+ enableEditing: col.enableEditing ?? enableEditing,
87
+ enableHiding: col.enableHiding ?? true,
88
+ Cell: col.Cell,
89
+ filterVariant: col.filterVariant,
90
+ filterSelectOptions: col.filterSelectOptions,
91
+ filterFn: col.filterFn,
92
+ enableColumnFilter: col.filterVariant !== undefined
93
+ };
94
+ if (col.sortingFn) {
95
+ // The underlying library must be checking for the existence of the `sortingFn` key, because even
96
+ // `sortingFn: undefined` doesn't work, so have to conditionally add it
97
+ mrtCol.sortingFn = col.sortingFn;
98
+ }
99
+
100
+ // Handle edit configuration
101
+ if (col.editConfig) {
102
+ const {
103
+ editVariant = 'text',
104
+ selectOptions,
105
+ customEditComponent,
106
+ onSave
107
+ } = col.editConfig;
108
+ if (editVariant === 'custom' && customEditComponent) {
109
+ mrtCol.Edit = customEditComponent;
110
+ } else if (editVariant === 'select' && selectOptions) {
111
+ mrtCol.editVariant = 'select';
112
+ mrtCol.editSelectOptions = selectOptions;
113
+ const SelectEditComponent = ({
114
+ cell,
115
+ row,
116
+ table: iTable
117
+ }) => {
118
+ const [value, setValue] = React.useState(cell.getValue() || '');
119
+ const handleSave = useCallback(() => {
120
+ if (onSave) {
121
+ void onSave(row.original, value, col.id);
122
+ }
123
+ iTable.setEditingCell(null);
124
+ }, [value]);
125
+ return /*#__PURE__*/jsx(TextField, {
126
+ select: true,
127
+ value: value,
128
+ onChange: e => setValue(e.target.value),
129
+ onBlur: handleSave,
130
+ onKeyDown: e => {
131
+ if (e.key === 'Enter') {
132
+ handleSave();
133
+ } else if (e.key === 'Escape') {
134
+ iTable.setEditingCell(null);
180
135
  }
136
+ },
137
+ size: "small",
138
+ fullWidth: true,
139
+ children: selectOptions.map(option => /*#__PURE__*/jsx(MenuItem, {
140
+ value: option.value,
141
+ children: option.label
142
+ }, option.value))
143
+ });
144
+ };
145
+ mrtCol.Edit = SelectEditComponent;
146
+ } else {
147
+ // Default text input with onBlur save
148
+ mrtCol.muiEditTextFieldProps = ({
149
+ row
150
+ }) => ({
151
+ onBlur: event => {
152
+ if (onSave) {
153
+ const value = event.target.value;
154
+ // eslint-disable-next-line react/prop-types
155
+ void onSave(row.original, value, col.id);
156
+ }
181
157
  }
182
- },
183
- muiTablePaperProps: {
184
- elevation: 0
185
- },
186
- muiTableBodyRowProps: ({ row })=>({
187
- onClick: onRowClick ? ()=>onRowClick(row.original) : void 0,
188
- sx: {
189
- cursor: onRowClick ? 'pointer' : 'default',
190
- '& td': {
191
- borderBottom: 'none'
192
- }
193
- }
194
- }),
195
- ...tableOptions,
196
- renderToolbarInternalActions: composedRenderToolbarInternalActions,
197
- ...consumerRenderTopToolbarCustomActions ? {
198
- renderTopToolbarCustomActions: consumerRenderTopToolbarCustomActions
199
- } : {},
200
- ...stickyFilters && storageKey ? {
201
- state: {
202
- ...tableOptions?.state,
203
- columnFilters
204
- },
205
- onColumnFiltersChange: setColumnFilters
206
- } : {}
158
+ });
159
+ }
160
+ }
161
+ return mrtCol;
207
162
  });
208
- return /*#__PURE__*/ jsx(Box, {
209
- minHeight: "160px",
210
- padding: 2,
211
- sx: sx,
212
- children: /*#__PURE__*/ jsx(MaterialReactTable, {
213
- table: table
214
- })
163
+ }, [columns, enableEditing]);
164
+ const initialStateConfig = {
165
+ ...(initialSorting ? {
166
+ sorting: initialSorting
167
+ } : {}),
168
+ ...(enableColumnFilters ? {
169
+ showColumnFilters: true
170
+ } : {}),
171
+ ...(enableGlobalFilter ? {
172
+ showGlobalFilter: true
173
+ } : {})
174
+ };
175
+ const handleClearAllFilters = useCallback(tbl => {
176
+ tbl.resetColumnFilters();
177
+ if (enableGlobalFilter) {
178
+ tbl.resetGlobalFilter();
179
+ }
180
+ setColumnFilters([]);
181
+ if (storageKey) {
182
+ localStorage.removeItem(`${storageKey}_columnFilters`);
183
+ }
184
+ onClearAllFilters?.();
185
+ }, [enableGlobalFilter, storageKey, onClearAllFilters]);
186
+ const consumerRenderTopToolbarCustomActions = tableOptions?.renderTopToolbarCustomActions;
187
+ const consumerRenderToolbarInternalActions = renderToolbarInternalActions ?? tableOptions?.renderToolbarInternalActions;
188
+ const composedRenderToolbarInternalActions = useCallback(({
189
+ table: tbl
190
+ }) => {
191
+ const state = tbl.getState();
192
+ const hasColumnFilters = state.columnFilters.some(isActiveFilter);
193
+ const hasGlobalFilter = enableGlobalFilter && !!state.globalFilter;
194
+ const hasActiveFilters = hasColumnFilters || hasGlobalFilter;
195
+ return /*#__PURE__*/jsxs(Box, {
196
+ sx: {
197
+ display: 'flex',
198
+ alignItems: 'center',
199
+ gap: 1
200
+ },
201
+ children: [showClearAllFilters && hasActiveFilters && /*#__PURE__*/jsx(Button, {
202
+ onClick: () => handleClearAllFilters(tbl),
203
+ label: clearAllFiltersLabel,
204
+ priority: "ghost",
205
+ size: "small"
206
+ }), consumerRenderToolbarInternalActions && consumerRenderToolbarInternalActions({
207
+ table: tbl
208
+ })]
215
209
  });
210
+ }, [showClearAllFilters, consumerRenderToolbarInternalActions, enableGlobalFilter, handleClearAllFilters, clearAllFiltersLabel]);
211
+ const table = useMaterialReactTable({
212
+ columns: mrtColumns,
213
+ data,
214
+ editDisplayMode: 'cell',
215
+ enableColumnOrdering,
216
+ enableColumnPinning,
217
+ enableEditing,
218
+ enableSorting,
219
+ enableGlobalFilter,
220
+ enableColumnFilters,
221
+ enableFilters: enableColumnFilters || enableGlobalFilter,
222
+ enablePagination,
223
+ enableBottomToolbar: enablePagination ? enableBottomToolbar : false,
224
+ enableTopToolbar,
225
+ positionGlobalFilter: enableGlobalFilter ? 'left' : undefined,
226
+ ...(Object.keys(initialStateConfig).length > 0 ? {
227
+ initialState: initialStateConfig
228
+ } : {}),
229
+ muiTableBodyProps: {
230
+ sx: {
231
+ '& tr:nth-of-type(odd) > td': {
232
+ backgroundColor: theme.palette.TwClrBaseGray025 || theme.palette.grey[50]
233
+ }
234
+ }
235
+ },
236
+ muiTablePaperProps: {
237
+ elevation: 0
238
+ },
239
+ muiTableBodyRowProps: ({
240
+ row
241
+ }) => ({
242
+ // eslint-disable-next-line react/prop-types
243
+ onClick: onRowClick ? () => onRowClick(row.original) : undefined,
244
+ sx: {
245
+ cursor: onRowClick ? 'pointer' : 'default',
246
+ '& td': {
247
+ borderBottom: 'none'
248
+ }
249
+ }
250
+ }),
251
+ // Merge any additional table options
252
+ ...tableOptions,
253
+ // These must come after ...tableOptions to avoid being overridden
254
+ renderToolbarInternalActions: composedRenderToolbarInternalActions,
255
+ ...(consumerRenderTopToolbarCustomActions ? {
256
+ renderTopToolbarCustomActions: consumerRenderTopToolbarCustomActions
257
+ } : {}),
258
+ // Add sticky filters state if enabled
259
+ ...(stickyFilters && storageKey ? {
260
+ state: {
261
+ ...tableOptions?.state,
262
+ columnFilters
263
+ },
264
+ onColumnFiltersChange: setColumnFilters
265
+ } : {})
266
+ });
267
+ return /*#__PURE__*/jsx(Box, {
268
+ minHeight: "160px",
269
+ padding: 2,
270
+ sx: sx,
271
+ children: /*#__PURE__*/jsx(MaterialReactTable, {
272
+ table: table
273
+ })
274
+ });
216
275
  }
217
- export default EditableTable;
276
+
277
+ export { EditableTable as default };
@@ -1,49 +1,51 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import "react";
3
- import { Box } from "@mui/material";
4
- import useDeviceInfo from "../../utils/useDeviceInfo.js";
5
- import Button from "../Button/Button.js";
6
- import Icon from "../Icon/Icon.js";
7
- import "./styles.scss";
1
+ import 'react';
2
+ import { Box } from '@mui/material';
3
+ import useDeviceInfo from '../../utils/useDeviceInfo.js';
4
+ import Button from '../Button/Button.js';
5
+ import Icon from '../Icon/Icon.js';
6
+ import './styles.scss';
7
+ import { jsxs, jsx } from 'react/jsx-runtime';
8
+
8
9
  function ErrorBox(props) {
9
- const { text, onClick, buttonText, title, className, sx } = props;
10
- const { isMobile } = useDeviceInfo();
11
- return /*#__PURE__*/ jsxs(Box, {
12
- className: `error-box ${className} ${isMobile ? 'mobile' : ''}`,
13
- sx: sx,
14
- children: [
15
- /*#__PURE__*/ jsxs("div", {
16
- className: "error-box--container",
17
- children: [
18
- /*#__PURE__*/ jsx(Icon, {
19
- name: "error",
20
- className: "error-icon",
21
- size: "large"
22
- }),
23
- /*#__PURE__*/ jsxs("div", {
24
- children: [
25
- title && /*#__PURE__*/ jsx("h1", {
26
- className: "error-title",
27
- children: title
28
- }),
29
- /*#__PURE__*/ jsx("p", {
30
- className: "error-text",
31
- children: text
32
- })
33
- ]
34
- })
35
- ]
36
- }),
37
- buttonText && onClick && /*#__PURE__*/ jsx("div", {
38
- className: "button-container",
39
- children: /*#__PURE__*/ jsx(Button, {
40
- label: buttonText,
41
- priority: "secondary",
42
- type: "passive",
43
- onClick: onClick
44
- })
45
- })
46
- ]
47
- });
10
+ const {
11
+ text,
12
+ onClick,
13
+ buttonText,
14
+ title,
15
+ className,
16
+ sx
17
+ } = props;
18
+ const {
19
+ isMobile
20
+ } = useDeviceInfo();
21
+ return /*#__PURE__*/jsxs(Box, {
22
+ className: `error-box ${className} ${isMobile ? 'mobile' : ''}`,
23
+ sx: sx,
24
+ children: [/*#__PURE__*/jsxs("div", {
25
+ className: "error-box--container",
26
+ children: [/*#__PURE__*/jsx(Icon, {
27
+ name: "error",
28
+ className: "error-icon",
29
+ size: "large"
30
+ }), /*#__PURE__*/jsxs("div", {
31
+ children: [title && /*#__PURE__*/jsx("h1", {
32
+ className: "error-title",
33
+ children: title
34
+ }), /*#__PURE__*/jsx("p", {
35
+ className: "error-text",
36
+ children: text
37
+ })]
38
+ })]
39
+ }), buttonText && onClick && /*#__PURE__*/jsx("div", {
40
+ className: "button-container",
41
+ children: /*#__PURE__*/jsx(Button, {
42
+ label: buttonText,
43
+ priority: "secondary",
44
+ type: "passive",
45
+ onClick: onClick
46
+ })
47
+ })]
48
+ });
48
49
  }
49
- export default ErrorBox;
50
+
51
+ export { ErrorBox as default };