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

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 (311) hide show
  1. package/components/AntSwitch/index.js +19 -22
  2. package/components/Autocomplete/Autocomplete.js +106 -130
  3. package/components/Badge/index.js +28 -29
  4. package/components/BusySpinner/index.js +40 -45
  5. package/components/Button/Button.js +41 -47
  6. package/components/Checkbox.js +64 -63
  7. package/components/Confirm/index.js +74 -83
  8. package/components/DatePicker/DatePicker.js +138 -141
  9. package/components/DialogBox/DialogBox.js +111 -118
  10. package/components/Divisor.js +18 -18
  11. package/components/Dropdown.js +66 -94
  12. package/components/EditableTable/index.js +211 -271
  13. package/components/ErrorBox/ErrorBox.js +47 -49
  14. package/components/FileChooser/index.js +117 -135
  15. package/components/FormBottomBar/index.js +75 -84
  16. package/components/Icon/Icon.js +12 -20
  17. package/components/Icon/icons/index.js +256 -256
  18. package/components/IconTooltip/index.js +49 -60
  19. package/components/Map/MapBox.js +545 -452
  20. package/components/Map/MapContainer.js +25 -29
  21. package/components/Map/MapDateSliderControl.js +64 -64
  22. package/components/Map/MapDrawer.js +41 -47
  23. package/components/Map/MapLegend.js +176 -172
  24. package/components/Map/MapViewStyleControl.js +59 -63
  25. package/components/Map/ReactMapboxWrapper.js +3 -2
  26. package/components/Map/index.js +161 -180
  27. package/components/Map/types.js +12 -17
  28. package/components/Map/useMaintainLayerOrder.js +16 -26
  29. package/components/Markdown/index.js +25 -26
  30. package/components/Message/Message.js +73 -76
  31. package/components/MultiSelect/index.js +112 -124
  32. package/components/Navbar/NavFooter.js +9 -13
  33. package/components/Navbar/NavItem.js +70 -76
  34. package/components/Navbar/NavSection.js +17 -19
  35. package/components/Navbar/Navbar.js +39 -46
  36. package/components/Navbar/SubNavbar.js +9 -13
  37. package/components/Note.js +18 -22
  38. package/components/OverlayModal/OverlayModal.js +56 -63
  39. package/components/PageForm/index.js +33 -41
  40. package/components/PhotoChooser/index.js +165 -173
  41. package/components/PhotosCarousel/PhotoSlide.js +32 -35
  42. package/components/PhotosCarousel/index.js +80 -85
  43. package/components/PhotosCarousel/usePhotosCarousel.js +69 -76
  44. package/components/Pill/index.js +41 -45
  45. package/components/PillList/index.js +17 -24
  46. package/components/PlacementWrapper/index.js +38 -59
  47. package/components/PopoverMenu/Popover.js +68 -85
  48. package/components/PopoverMenu/index.js +51 -56
  49. package/components/PopoverMultiSelect/index.js +52 -59
  50. package/components/ProgressCircle/ProgressCircle.js +28 -32
  51. package/components/RadioButton.js +17 -19
  52. package/components/Select/Select.js +13 -15
  53. package/components/Select/SelectT.js +235 -250
  54. package/components/Separator/index.js +14 -17
  55. package/components/Size.js +0 -1
  56. package/components/Slider/index.js +43 -56
  57. package/components/Stepper/index.d.ts +33 -0
  58. package/components/Stepper/index.d.ts.map +1 -0
  59. package/components/Stepper/index.js +66 -0
  60. package/components/SummaryBox.js +70 -72
  61. package/components/Tabs/index.js +133 -135
  62. package/components/TextTruncated/index.js +117 -130
  63. package/components/Textfield/Textfield.js +158 -190
  64. package/components/Textfield/TruncatedTextArea.js +70 -84
  65. package/components/TimelineSlider/TimelineMarker.js +25 -30
  66. package/components/TimelineSlider/TimelineRail.js +8 -11
  67. package/components/TimelineSlider/index.js +64 -66
  68. package/components/TimelineSliderV2/ClusterBadge.js +25 -29
  69. package/components/TimelineSliderV2/TimelineDot.js +31 -35
  70. package/components/TimelineSliderV2/TimelineRail.js +8 -11
  71. package/components/TimelineSliderV2/index.js +121 -103
  72. package/components/TimelineSliderV2/layout.js +124 -147
  73. package/components/TimelineSliderV2/types.js +0 -1
  74. package/components/Tooltip/Tooltip.js +47 -56
  75. package/components/ViewPhotosDialog/index.js +28 -35
  76. package/components/VirtualWalkthrough/Annotation.js +163 -207
  77. package/components/VirtualWalkthrough/AnnotationEditPane.js +198 -184
  78. package/components/VirtualWalkthrough/AnnotationPanel.js +187 -199
  79. package/components/VirtualWalkthrough/Application.js +31 -34
  80. package/components/VirtualWalkthrough/AutoRotator.js +85 -223
  81. package/components/VirtualWalkthrough/BlockingSpinner.js +26 -28
  82. package/components/VirtualWalkthrough/BoundaryRing.js +30 -34
  83. package/components/VirtualWalkthrough/BoundaryWall.js +32 -36
  84. package/components/VirtualWalkthrough/CameraInfo.js +100 -89
  85. package/components/VirtualWalkthrough/ControlsInfoPane.js +254 -195
  86. package/components/VirtualWalkthrough/GradientSky.js +72 -73
  87. package/components/VirtualWalkthrough/SplatControls.js +209 -221
  88. package/components/VirtualWalkthrough/SplatCrop.js +21 -20
  89. package/components/VirtualWalkthrough/SplatFadeCrop.js +21 -20
  90. package/components/VirtualWalkthrough/SplatModel.js +65 -85
  91. package/components/VirtualWalkthrough/SplatRevealRain.js +41 -46
  92. package/components/VirtualWalkthrough/TfAnnotationManager.js +197 -379
  93. package/components/VirtualWalkthrough/TfXrNavigation.js +73 -162
  94. package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +438 -431
  95. package/components/VirtualWalkthrough/VrAnnotationPanel.js +18 -22
  96. package/components/VirtualWalkthrough/XrAnnotationInteraction.js +14 -17
  97. package/components/VirtualWalkthrough/XrExitButton.js +14 -17
  98. package/components/VirtualWalkthrough/XrGazeDwell.js +14 -17
  99. package/components/VirtualWalkthrough/XrPointerRay.js +14 -17
  100. package/components/VirtualWalkthrough/XrStartPose.js +67 -121
  101. package/components/VirtualWalkthrough/boundary-ring.js +87 -117
  102. package/components/VirtualWalkthrough/boundary-wall.js +175 -258
  103. package/components/VirtualWalkthrough/camera-adoption.js +18 -64
  104. package/components/VirtualWalkthrough/groundPlane.js +32 -47
  105. package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
  106. package/components/VirtualWalkthrough/splatFormat.js +13 -47
  107. package/components/VirtualWalkthrough/useAdoptedCamera.js +23 -44
  108. package/components/VirtualWalkthrough/useRestartOnVr.js +26 -37
  109. package/components/VirtualWalkthrough/useXrRenderTuning.js +33 -54
  110. package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +67 -99
  111. package/components/VirtualWalkthrough/vr-annotation-panel.js +403 -433
  112. package/components/VirtualWalkthrough/vr-annotation-scroll.js +10 -28
  113. package/components/VirtualWalkthrough/walkthrough-camera.js +204 -329
  114. package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +39 -80
  115. package/components/VirtualWalkthrough/xr-annotation-candidates.js +6 -18
  116. package/components/VirtualWalkthrough/xr-annotation-interaction.js +31 -56
  117. package/components/VirtualWalkthrough/xr-annotation-targeting.js +22 -38
  118. package/components/VirtualWalkthrough/xr-button-arming.js +7 -17
  119. package/components/VirtualWalkthrough/xr-button-hold.js +22 -36
  120. package/components/VirtualWalkthrough/xr-exit-button-mask.js +22 -36
  121. package/components/VirtualWalkthrough/xr-exit-button.js +148 -207
  122. package/components/VirtualWalkthrough/xr-face-buttons.js +19 -29
  123. package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +23 -34
  124. package/components/VirtualWalkthrough/xr-gaze-dwell.js +107 -144
  125. package/components/VirtualWalkthrough/xr-interactive-ui.js +12 -24
  126. package/components/VirtualWalkthrough/xr-pointer-ray.js +13 -20
  127. package/components/VirtualWalkthrough/xr-progress-pie-material.js +117 -88
  128. package/components/VirtualWalkthrough/xr-progress-pie.js +1 -10
  129. package/components/VirtualWalkthrough/xr-ray-quad.js +16 -30
  130. package/components/VirtualWalkthrough/xr-render-tuning.js +17 -48
  131. package/components/VirtualWalkthrough/xr-scene-bounds.js +21 -37
  132. package/components/VirtualWalkthrough/xr-start-pose.js +27 -73
  133. package/components/VirtualWalkthrough/xr-teleport-gesture.js +16 -42
  134. package/components/svg/BlobbyGrayIconImage.js +41 -39
  135. package/components/svg/BlobbyGrayIconImport.js +41 -39
  136. package/components/svg/BlobbyGrayIconUploadToTheCloud.js +41 -39
  137. package/components/svg/BlobbyIconCloudChecked.js +202 -164
  138. package/components/svg/BlobbyIconExportOrUploadPhoto.js +202 -164
  139. package/components/svg/BlobbyIconFolder.js +202 -164
  140. package/components/svg/BlobbyIconGraphReport.js +202 -164
  141. package/components/svg/BlobbyIconHappy.js +202 -164
  142. package/components/svg/BlobbyIconHeartMonitor.js +202 -164
  143. package/components/svg/BlobbyIconLeaf.js +202 -164
  144. package/components/svg/BlobbyIconLibrary.js +202 -164
  145. package/components/svg/BlobbyIconNursery.js +204 -166
  146. package/components/svg/BlobbyIconOrganization.js +202 -164
  147. package/components/svg/BlobbyIconParchment.js +202 -164
  148. package/components/svg/BlobbyIconPeople.js +202 -164
  149. package/components/svg/BlobbyIconSeedBank.js +202 -164
  150. package/components/svg/BlobbyIconSeedling.js +202 -164
  151. package/components/svg/BlobbyIconSeeds.js +202 -164
  152. package/components/svg/BlobbyIconSite.js +206 -167
  153. package/components/svg/BlobbyIconSparkles.js +202 -164
  154. package/components/svg/BlobbyIconWrench.js +202 -164
  155. package/components/svg/Bug.js +19 -21
  156. package/components/svg/Calendar.js +19 -21
  157. package/components/svg/CaretDown.js +19 -21
  158. package/components/svg/CaretLeft.js +19 -21
  159. package/components/svg/CaretRight.js +19 -21
  160. package/components/svg/CaretUp.js +19 -21
  161. package/components/svg/ChevronDown.js +19 -21
  162. package/components/svg/ChevronUp.js +19 -21
  163. package/components/svg/Close.js +19 -21
  164. package/components/svg/Critical.js +19 -21
  165. package/components/svg/Edit.js +202 -164
  166. package/components/svg/Error.js +19 -21
  167. package/components/svg/Filter.js +19 -21
  168. package/components/svg/Folder.js +19 -21
  169. package/components/svg/Help.js +19 -21
  170. package/components/svg/Home.js +19 -21
  171. package/components/svg/IconAdd.js +19 -21
  172. package/components/svg/IconArrowRight.js +21 -23
  173. package/components/svg/IconBusinessNetwork.js +19 -21
  174. package/components/svg/IconCalendar.js +19 -21
  175. package/components/svg/IconCancel.js +19 -21
  176. package/components/svg/IconChargingBattery.js +19 -21
  177. package/components/svg/IconChecklist.js +21 -23
  178. package/components/svg/IconCheckmark.js +19 -21
  179. package/components/svg/IconCoinInHand.js +19 -21
  180. package/components/svg/IconColumns.js +19 -21
  181. package/components/svg/IconComment.js +20 -22
  182. package/components/svg/IconDashboard.js +19 -21
  183. package/components/svg/IconDataMigration.js +19 -21
  184. package/components/svg/IconDocument.js +21 -23
  185. package/components/svg/IconDownloadFromTheCloud.js +21 -23
  186. package/components/svg/IconEdit.js +21 -23
  187. package/components/svg/IconExpand.js +21 -23
  188. package/components/svg/IconExport.js +19 -21
  189. package/components/svg/IconExternalLink.js +19 -21
  190. package/components/svg/IconEye.js +19 -21
  191. package/components/svg/IconEyeOff.js +19 -21
  192. package/components/svg/IconFile.js +19 -21
  193. package/components/svg/IconFolder.js +19 -21
  194. package/components/svg/IconFullScreen.js +20 -22
  195. package/components/svg/IconFutures.js +19 -21
  196. package/components/svg/IconGraphReport.js +19 -21
  197. package/components/svg/IconGrid.js +19 -21
  198. package/components/svg/IconHeartMonitor.js +19 -21
  199. package/components/svg/IconHelp.js +21 -23
  200. package/components/svg/IconHistory.js +19 -21
  201. package/components/svg/IconImport.js +19 -21
  202. package/components/svg/IconIndex.js +19 -21
  203. package/components/svg/IconLayers.js +19 -21
  204. package/components/svg/IconLibrary.js +20 -22
  205. package/components/svg/IconList.js +19 -21
  206. package/components/svg/IconLivePlant.js +19 -21
  207. package/components/svg/IconLocations.js +19 -21
  208. package/components/svg/IconMail.js +19 -21
  209. package/components/svg/IconManager.js +19 -21
  210. package/components/svg/IconMap.js +19 -21
  211. package/components/svg/IconMarker.js +19 -21
  212. package/components/svg/IconMenu.js +19 -21
  213. package/components/svg/IconMenuHorizontal.js +19 -21
  214. package/components/svg/IconModule.js +19 -21
  215. package/components/svg/IconMyLocation.js +19 -21
  216. package/components/svg/IconNote.js +21 -23
  217. package/components/svg/IconNursery.js +21 -23
  218. package/components/svg/IconOrg.js +19 -21
  219. package/components/svg/IconParchment.js +19 -21
  220. package/components/svg/IconPhoto.js +19 -21
  221. package/components/svg/IconPlantsFilled.js +19 -21
  222. package/components/svg/IconRedo.js +19 -21
  223. package/components/svg/IconRestorationSite.js +19 -21
  224. package/components/svg/IconSeedBank.js +19 -21
  225. package/components/svg/IconSeedling.js +19 -21
  226. package/components/svg/IconSettings.js +19 -21
  227. package/components/svg/IconSlice.js +19 -21
  228. package/components/svg/IconSubmit.js +19 -21
  229. package/components/svg/IconSubtract.js +21 -23
  230. package/components/svg/IconSynced.js +19 -21
  231. package/components/svg/IconTrashCan.js +19 -21
  232. package/components/svg/IconTreasureMap.js +19 -21
  233. package/components/svg/IconUnavailable.js +19 -21
  234. package/components/svg/IconUndo.js +19 -21
  235. package/components/svg/IconVariable.js +19 -21
  236. package/components/svg/IconVideo.js +30 -31
  237. package/components/svg/IconWifi.js +19 -21
  238. package/components/svg/Info.js +19 -21
  239. package/components/svg/Key.js +19 -21
  240. package/components/svg/Leaf.js +19 -21
  241. package/components/svg/Lock.js +19 -21
  242. package/components/svg/Logo.js +48 -43
  243. package/components/svg/MenuVertical.js +19 -21
  244. package/components/svg/Notification.js +19 -21
  245. package/components/svg/Person.js +19 -21
  246. package/components/svg/Plus.js +19 -21
  247. package/components/svg/RestorationSite.js +19 -21
  248. package/components/svg/Search.js +19 -21
  249. package/components/svg/Seeds.js +19 -21
  250. package/components/svg/Site.js +19 -21
  251. package/components/svg/Sparkles.js +19 -21
  252. package/components/svg/Species.js +19 -21
  253. package/components/svg/Species2.js +202 -164
  254. package/components/svg/Spinner.js +54 -48
  255. package/components/svg/Star.js +19 -21
  256. package/components/svg/Success.js +19 -21
  257. package/components/svg/SuccessFilled.js +19 -21
  258. package/components/svg/TerrawareLogoDesktop.js +55 -49
  259. package/components/svg/TerrawareLogoMobile.js +25 -26
  260. package/components/svg/Touchscreen.js +19 -21
  261. package/components/svg/UploadCloud.js +202 -164
  262. package/components/svg/Warning.js +19 -21
  263. package/components/svg/WelcomeClipboard.js +156 -133
  264. package/components/svg/index.js +129 -129
  265. package/components/table/EnhancedTableToolbar.js +68 -74
  266. package/components/table/EnhancedTableToolbarV2.js +31 -41
  267. package/components/table/TableCellRenderer.js +196 -231
  268. package/components/table/TableHeader.js +71 -73
  269. package/components/table/TableHeaderItem.js +97 -102
  270. package/components/table/density.js +18 -19
  271. package/components/table/index.js +350 -369
  272. package/components/table/sort.js +27 -52
  273. package/components/table/types.js +0 -1
  274. package/components/types/index.js +0 -1
  275. package/hooks/cameraEntityContext.js +2 -13
  276. package/hooks/useBoolean.js +17 -13
  277. package/hooks/useCameraPosition.js +56 -56
  278. package/hooks/useDevicePerformance.js +17 -17
  279. package/hooks/useXr.js +85 -87
  280. package/index.d.ts +3 -1
  281. package/index.d.ts.map +1 -1
  282. package/index.js +59 -58
  283. package/package.json +1 -1
  284. package/setupTests.js +0 -4
  285. package/strings/csv/en.csv +1 -0
  286. package/strings/csv/es.csv +1 -0
  287. package/strings/csv/fr.csv +1 -0
  288. package/strings/export.js +111 -170
  289. package/strings/index.js +25 -54
  290. package/strings/locales.js +21 -41
  291. package/strings/strings-en.d.ts +1 -0
  292. package/strings/strings-en.d.ts.map +1 -1
  293. package/strings/strings-en.js +50 -51
  294. package/strings/strings-es.d.ts +1 -0
  295. package/strings/strings-es.d.ts.map +1 -1
  296. package/strings/strings-es.js +50 -51
  297. package/strings/strings-fr.d.ts +1 -0
  298. package/strings/strings-fr.d.ts.map +1 -1
  299. package/strings/strings-fr.js +50 -51
  300. package/strings/strings-gx.d.ts +1 -0
  301. package/strings/strings-gx.d.ts.map +1 -1
  302. package/strings/strings-gx.js +50 -51
  303. package/style-dictionary-dist/TerrawareTheme.js +186 -186
  304. package/theme.js +74 -76
  305. package/utils/color.js +8 -15
  306. package/utils/date.js +42 -108
  307. package/utils/index.js +4 -4
  308. package/utils/preventDefaultEvent.js +3 -3
  309. package/utils/text.js +11 -11
  310. package/utils/useDeviceInfo.js +42 -79
  311. package/virtualWalkthrough.js +23 -23
@@ -1,277 +1,217 @@
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 !== '';
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;
15
10
  };
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);
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
- }
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);
157
22
  }
158
- });
23
+ return [];
24
+ } catch (error) {
25
+ console.error('Error loading column filters:', error);
26
+ return [];
159
27
  }
160
- }
161
- return mrtCol;
162
- });
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
- })]
209
28
  });
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'
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);
248
36
  }
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
- });
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]
180
+ }
181
+ }
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
+ } : {}
207
+ });
208
+ return /*#__PURE__*/ jsx(Box, {
209
+ minHeight: "160px",
210
+ padding: 2,
211
+ sx: sx,
212
+ children: /*#__PURE__*/ jsx(MaterialReactTable, {
213
+ table: table
214
+ })
215
+ });
275
216
  }
276
-
277
- export { EditableTable as default };
217
+ export default EditableTable;
@@ -1,51 +1,49 @@
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
-
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";
9
8
  function ErrorBox(props) {
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
- });
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
+ });
49
48
  }
50
-
51
- export { ErrorBox as default };
49
+ export default ErrorBox;