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