@map-colonies/react-components 3.12.2 → 3.13.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 (376) hide show
  1. package/.eslintignore +1 -1
  2. package/.storybook/main.js +13 -13
  3. package/.storybook/manager.js +6 -6
  4. package/.storybook/preview-head.html +21 -21
  5. package/.storybook/preview.js +18 -18
  6. package/.storybook/theme.js +9 -9
  7. package/CHANGELOG.md +830 -810
  8. package/README.md +53 -53
  9. package/dist/autocomplete/autocomplete.css +25 -25
  10. package/dist/autocomplete/autocomplete.d.ts +33 -33
  11. package/dist/autocomplete/autocomplete.js +478 -478
  12. package/dist/autocomplete/index.d.ts +1 -1
  13. package/dist/autocomplete/index.js +5 -5
  14. package/dist/box/box.d.ts +3 -3
  15. package/dist/box/box.js +35 -35
  16. package/dist/box/index.d.ts +1 -1
  17. package/dist/box/index.js +5 -5
  18. package/dist/cesium-map/data-sources/custom.data-source.d.ts +5 -5
  19. package/dist/cesium-map/data-sources/custom.data-source.js +23 -23
  20. package/dist/cesium-map/data-sources/drawings.data-source.d.ts +34 -34
  21. package/dist/cesium-map/data-sources/drawings.data-source.js +193 -187
  22. package/dist/cesium-map/data-sources/index.d.ts +2 -2
  23. package/dist/cesium-map/data-sources/index.js +14 -14
  24. package/dist/cesium-map/entities/entity.d.ts +5 -5
  25. package/dist/cesium-map/entities/entity.description.d.ts +6 -6
  26. package/dist/cesium-map/entities/entity.description.js +27 -27
  27. package/dist/cesium-map/entities/entity.js +23 -23
  28. package/dist/cesium-map/entities/graphics/polygon.graphics.d.ts +5 -5
  29. package/dist/cesium-map/entities/graphics/polygon.graphics.js +23 -23
  30. package/dist/cesium-map/entities/graphics/polyline.graphics.d.ts +5 -5
  31. package/dist/cesium-map/entities/graphics/polyline.graphics.js +23 -23
  32. package/dist/cesium-map/entities/graphics/rectangle.graphics.d.ts +5 -5
  33. package/dist/cesium-map/entities/graphics/rectangle.graphics.js +23 -23
  34. package/dist/cesium-map/entities/index.d.ts +4 -4
  35. package/dist/cesium-map/entities/index.js +16 -16
  36. package/dist/cesium-map/index.d.ts +8 -8
  37. package/dist/cesium-map/index.js +20 -20
  38. package/dist/cesium-map/layers/3d.tileset.d.ts +7 -7
  39. package/dist/cesium-map/layers/3d.tileset.js +43 -43
  40. package/dist/cesium-map/layers/3d.tileset.with.update.d.ts +6 -6
  41. package/dist/cesium-map/layers/3d.tileset.with.update.js +115 -115
  42. package/dist/cesium-map/layers/geojson.layer.d.ts +5 -5
  43. package/dist/cesium-map/layers/geojson.layer.js +23 -23
  44. package/dist/cesium-map/layers/imagery.layer.d.ts +6 -6
  45. package/dist/cesium-map/layers/imagery.layer.js +68 -68
  46. package/dist/cesium-map/layers/index.d.ts +7 -7
  47. package/dist/cesium-map/layers/index.js +19 -19
  48. package/dist/cesium-map/layers/osm.layer.d.ts +9 -9
  49. package/dist/cesium-map/layers/osm.layer.js +36 -36
  50. package/dist/cesium-map/layers/wms.layer.d.ts +9 -9
  51. package/dist/cesium-map/layers/wms.layer.js +36 -36
  52. package/dist/cesium-map/layers/wmts.layer.d.ts +9 -9
  53. package/dist/cesium-map/layers/wmts.layer.js +36 -36
  54. package/dist/cesium-map/layers/xyz.layer.d.ts +9 -9
  55. package/dist/cesium-map/layers/xyz.layer.js +36 -36
  56. package/dist/cesium-map/layers-manager.d.ts +55 -55
  57. package/dist/cesium-map/layers-manager.js +246 -246
  58. package/dist/cesium-map/map-legend/MapLegend.css +136 -135
  59. package/dist/cesium-map/map-legend/MapLegend.d.ts +15 -15
  60. package/dist/cesium-map/map-legend/MapLegend.js +57 -57
  61. package/dist/cesium-map/map-legend/MapLegendList.d.ts +13 -13
  62. package/dist/cesium-map/map-legend/MapLegendList.js +43 -43
  63. package/dist/cesium-map/map-legend/MapLegendSidebar.d.ts +16 -16
  64. package/dist/cesium-map/map-legend/MapLegendSidebar.js +20 -20
  65. package/dist/cesium-map/map-legend/MapLegendToggle.d.ts +7 -7
  66. package/dist/cesium-map/map-legend/MapLegendToggle.js +20 -20
  67. package/dist/cesium-map/map-legend/index.d.ts +3 -3
  68. package/dist/cesium-map/map-legend/index.js +14 -14
  69. package/dist/cesium-map/map.css +59 -59
  70. package/dist/cesium-map/map.d.ts +63 -59
  71. package/dist/cesium-map/map.js +311 -305
  72. package/dist/cesium-map/map.types.d.ts +8 -8
  73. package/dist/cesium-map/map.types.js +12 -12
  74. package/dist/cesium-map/proxied.types.d.ts +30 -30
  75. package/dist/cesium-map/proxied.types.js +133 -132
  76. package/dist/cesium-map/settings/base-maps.css +37 -37
  77. package/dist/cesium-map/settings/base-maps.d.ts +7 -7
  78. package/dist/cesium-map/settings/base-maps.js +78 -78
  79. package/dist/cesium-map/settings/scene-modes.css +19 -19
  80. package/dist/cesium-map/settings/scene-modes.d.ts +7 -7
  81. package/dist/cesium-map/settings/scene-modes.js +65 -65
  82. package/dist/cesium-map/settings/settings.css +52 -52
  83. package/dist/cesium-map/settings/settings.d.ts +23 -23
  84. package/dist/cesium-map/settings/settings.js +79 -79
  85. package/dist/cesium-map/terrain-providers/custom/dummy-quantized-mesh-tile.d.ts +3 -3
  86. package/dist/cesium-map/terrain-providers/custom/dummy-quantized-mesh-tile.js +245 -245
  87. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-decoder.d.ts +9 -9
  88. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-decoder.js +202 -202
  89. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-terrain-provider.d.ts +50 -50
  90. package/dist/cesium-map/terrain-providers/custom/quantized-mesh-terrain-provider.js +136 -136
  91. package/dist/cesium-map/tools/cesium/primitives-conversions.cesium.d.ts +2 -2
  92. package/dist/cesium-map/tools/cesium/primitives-conversions.cesium.js +38 -38
  93. package/dist/cesium-map/tools/coordinates-tracker.tool.css +11 -11
  94. package/dist/cesium-map/tools/coordinates-tracker.tool.d.ts +7 -7
  95. package/dist/cesium-map/tools/coordinates-tracker.tool.js +86 -78
  96. package/dist/cesium-map/tools/draw/drawHelper.css +101 -101
  97. package/dist/cesium-map/tools/draw/drawHelper.d.ts +28 -28
  98. package/dist/cesium-map/tools/draw/drawHelper.js +1694 -1694
  99. package/dist/cesium-map/tools/geojson/geojson-to-primitive.d.ts +4 -4
  100. package/dist/cesium-map/tools/geojson/geojson-to-primitive.js +41 -41
  101. package/dist/cesium-map/tools/geojson/index.d.ts +2 -2
  102. package/dist/cesium-map/tools/geojson/index.js +14 -14
  103. package/dist/cesium-map/tools/geojson/point.geojson.d.ts +7 -3
  104. package/dist/cesium-map/tools/geojson/point.geojson.js +47 -21
  105. package/dist/cesium-map/tools/geojson/polygon.geojson.d.ts +3 -3
  106. package/dist/cesium-map/tools/geojson/polygon.geojson.js +24 -24
  107. package/dist/cesium-map/tools/geojson/rectangle.geojson.d.ts +3 -3
  108. package/dist/cesium-map/tools/geojson/rectangle.geojson.js +44 -44
  109. package/dist/cesium-map/tools/inspector.tool.d.ts +4 -4
  110. package/dist/cesium-map/tools/inspector.tool.js +33 -33
  111. package/dist/cesium-map/tools/scale-tracker.tool.css +16 -16
  112. package/dist/cesium-map/tools/scale-tracker.tool.d.ts +8 -8
  113. package/dist/cesium-map/tools/scale-tracker.tool.js +158 -158
  114. package/dist/cesium-map/tools/terranian-height.tool.d.ts +4 -4
  115. package/dist/cesium-map/tools/terranian-height.tool.js +114 -114
  116. package/dist/cssbaseline/cssbaseline.d.ts +5 -5
  117. package/dist/cssbaseline/cssbaseline.js +41 -41
  118. package/dist/cssbaseline/index.d.ts +1 -1
  119. package/dist/cssbaseline/index.js +6 -6
  120. package/dist/date-picker/date-picker.css +9 -9
  121. package/dist/date-picker/date-picker.d.ts +14 -14
  122. package/dist/date-picker/date-picker.js +78 -78
  123. package/dist/date-picker/index.d.ts +1 -1
  124. package/dist/date-picker/index.js +13 -13
  125. package/dist/date-range-picker/date-range-picker.css +9 -9
  126. package/dist/date-range-picker/date-range-picker.d.ts +26 -26
  127. package/dist/date-range-picker/date-range-picker.form-control.css +3 -3
  128. package/dist/date-range-picker/date-range-picker.form-control.d.ts +28 -28
  129. package/dist/date-range-picker/date-range-picker.form-control.js +95 -95
  130. package/dist/date-range-picker/date-range-picker.js +104 -104
  131. package/dist/date-range-picker/index.d.ts +2 -2
  132. package/dist/date-range-picker/index.js +14 -14
  133. package/dist/file-picker/file-picker.css +63 -63
  134. package/dist/file-picker/file-picker.d.ts +276 -276
  135. package/dist/file-picker/file-picker.js +151 -151
  136. package/dist/file-picker/fs-map.json +1556 -1556
  137. package/dist/file-picker/index.d.ts +2 -2
  138. package/dist/file-picker/index.js +14 -14
  139. package/dist/file-picker/localization.d.ts +11 -11
  140. package/dist/file-picker/localization.js +124 -124
  141. package/dist/index.d.ts +13 -13
  142. package/dist/index.js +25 -25
  143. package/dist/map-filter-container/container-map.css +5 -5
  144. package/dist/map-filter-container/container-map.d.ts +11 -11
  145. package/dist/map-filter-container/container-map.js +31 -31
  146. package/dist/map-filter-container/index.d.ts +1 -1
  147. package/dist/map-filter-container/index.js +13 -13
  148. package/dist/map-filter-container/map-filter-container.d.ts +9 -9
  149. package/dist/map-filter-container/map-filter-container.js +78 -78
  150. package/dist/map-filter-container/polygon-selection-ui.d.ts +12 -12
  151. package/dist/map-filter-container/polygon-selection-ui.js +62 -62
  152. package/dist/models/defaults.d.ts +28 -28
  153. package/dist/models/defaults.js +32 -32
  154. package/dist/models/enums.d.ts +14 -14
  155. package/dist/models/enums.js +20 -20
  156. package/dist/models/index.d.ts +1 -1
  157. package/dist/models/index.js +13 -13
  158. package/dist/ol-map/feature.d.ts +6 -6
  159. package/dist/ol-map/feature.js +20 -20
  160. package/dist/ol-map/index.d.ts +6 -6
  161. package/dist/ol-map/index.js +18 -18
  162. package/dist/ol-map/interactions/draw.d.ts +8 -8
  163. package/dist/ol-map/interactions/draw.js +44 -44
  164. package/dist/ol-map/interactions/index.d.ts +1 -1
  165. package/dist/ol-map/interactions/index.js +13 -13
  166. package/dist/ol-map/layers/index.d.ts +3 -3
  167. package/dist/ol-map/layers/index.js +15 -15
  168. package/dist/ol-map/layers/tile-layer.d.ts +9 -9
  169. package/dist/ol-map/layers/tile-layer.js +48 -48
  170. package/dist/ol-map/layers/vector-layer.d.ts +4 -4
  171. package/dist/ol-map/layers/vector-layer.js +48 -48
  172. package/dist/ol-map/layers/vector-tile-layer.d.ts +10 -10
  173. package/dist/ol-map/layers/vector-tile-layer.js +66 -66
  174. package/dist/ol-map/map.css +17 -17
  175. package/dist/ol-map/map.d.ts +14 -14
  176. package/dist/ol-map/map.js +117 -117
  177. package/dist/ol-map/source/index.d.ts +6 -6
  178. package/dist/ol-map/source/index.js +18 -18
  179. package/dist/ol-map/source/mvt.d.ts +11 -11
  180. package/dist/ol-map/source/mvt.js +37 -37
  181. package/dist/ol-map/source/osm.d.ts +2 -2
  182. package/dist/ol-map/source/osm.js +14 -14
  183. package/dist/ol-map/source/vector-source.d.ts +4 -4
  184. package/dist/ol-map/source/vector-source.js +45 -45
  185. package/dist/ol-map/source/wms.d.ts +17 -17
  186. package/dist/ol-map/source/wms.js +30 -30
  187. package/dist/ol-map/source/wmts.d.ts +21 -21
  188. package/dist/ol-map/source/wmts.js +59 -59
  189. package/dist/ol-map/source/xyz.d.ts +12 -12
  190. package/dist/ol-map/source/xyz.js +27 -27
  191. package/dist/ol-map/style.d.ts +4 -4
  192. package/dist/ol-map/style.js +22 -22
  193. package/dist/popover/index.d.ts +1 -1
  194. package/dist/popover/index.js +5 -5
  195. package/dist/popover/popover.d.ts +3 -3
  196. package/dist/popover/popover.js +35 -35
  197. package/dist/smart-table/__mock-data__/smartTableMocks.d.ts +7 -7
  198. package/dist/smart-table/__mock-data__/smartTableMocks.js +17 -17
  199. package/dist/smart-table/index.d.ts +2 -2
  200. package/dist/smart-table/index.js +14 -14
  201. package/dist/smart-table/smart-table-head.d.ts +11 -11
  202. package/dist/smart-table/smart-table-head.js +22 -22
  203. package/dist/smart-table/smart-table-row.d.ts +12 -12
  204. package/dist/smart-table/smart-table-row.js +46 -46
  205. package/dist/smart-table/smart-table-types.d.ts +9 -9
  206. package/dist/smart-table/smart-table-types.js +2 -2
  207. package/dist/smart-table/smart-table.d.ts +17 -17
  208. package/dist/smart-table/smart-table.js +51 -51
  209. package/dist/theme/index.d.ts +1 -1
  210. package/dist/theme/index.js +13 -13
  211. package/dist/theme/theme.d.ts +8 -8
  212. package/dist/theme/theme.js +124 -124
  213. package/dist/utils/map.d.ts +3 -3
  214. package/dist/utils/map.js +21 -21
  215. package/dist/utils/projections.d.ts +6 -6
  216. package/dist/utils/projections.js +10 -10
  217. package/dist/utils/story.d.ts +12 -12
  218. package/dist/utils/story.js +2 -2
  219. package/jest_html_reporters.html +78 -0
  220. package/package.json +3 -3
  221. package/public/index.html +43 -43
  222. package/public/manifest.json +25 -25
  223. package/public/robots.txt +3 -3
  224. package/src/index.tsx +9 -9
  225. package/src/lib/autocomplete/autocomplete.css +25 -25
  226. package/src/lib/autocomplete/autocomplete.stories.tsx +101 -101
  227. package/src/lib/autocomplete/autocomplete.tsx +681 -681
  228. package/src/lib/autocomplete/index.ts +1 -1
  229. package/src/lib/box/box.tsx +7 -7
  230. package/src/lib/box/index.ts +1 -1
  231. package/src/lib/cesium-map/context-menu.stories.tsx +444 -444
  232. package/src/lib/cesium-map/data-sources/custom.data-source.tsx +12 -12
  233. package/src/lib/cesium-map/data-sources/drawings.data-source.stories.tsx +161 -161
  234. package/src/lib/cesium-map/data-sources/drawings.data-source.tsx +213 -204
  235. package/src/lib/cesium-map/data-sources/index.ts +2 -2
  236. package/src/lib/cesium-map/entities/entity.description.tsx +19 -19
  237. package/src/lib/cesium-map/entities/entity.graphics.stories.tsx +48 -48
  238. package/src/lib/cesium-map/entities/entity.stories.tsx +146 -146
  239. package/src/lib/cesium-map/entities/entity.tsx +10 -10
  240. package/src/lib/cesium-map/entities/graphics/polygon.graphics.tsx +12 -12
  241. package/src/lib/cesium-map/entities/graphics/polyline.graphics.tsx +12 -12
  242. package/src/lib/cesium-map/entities/graphics/rectangle.graphics.tsx +12 -12
  243. package/src/lib/cesium-map/entities/index.ts +4 -4
  244. package/src/lib/cesium-map/index.ts +8 -8
  245. package/src/lib/cesium-map/layers/3d.tileset.stories.tsx +164 -164
  246. package/src/lib/cesium-map/layers/3d.tileset.tsx +51 -51
  247. package/src/lib/cesium-map/layers/3d.tileset.with.update.tsx +120 -120
  248. package/src/lib/cesium-map/layers/geojson.layer.stories.tsx +180 -119
  249. package/src/lib/cesium-map/layers/geojson.layer.tsx +12 -12
  250. package/src/lib/cesium-map/layers/imagery.layer.stories.tsx +39 -39
  251. package/src/lib/cesium-map/layers/imagery.layer.tsx +37 -37
  252. package/src/lib/cesium-map/layers/index.ts +7 -7
  253. package/src/lib/cesium-map/layers/layers.rect.stories.tsx +171 -171
  254. package/src/lib/cesium-map/layers/osm.layer.stories.tsx +40 -40
  255. package/src/lib/cesium-map/layers/osm.layer.tsx +22 -22
  256. package/src/lib/cesium-map/layers/wms.layer.stories.tsx +38 -38
  257. package/src/lib/cesium-map/layers/wms.layer.tsx +22 -22
  258. package/src/lib/cesium-map/layers/wmts.layer.stories.tsx +53 -53
  259. package/src/lib/cesium-map/layers/wmts.layer.tsx +22 -22
  260. package/src/lib/cesium-map/layers/xyz.layer.stories.tsx +37 -37
  261. package/src/lib/cesium-map/layers/xyz.layer.tsx +22 -22
  262. package/src/lib/cesium-map/layers-manager.stories.tsx +286 -286
  263. package/src/lib/cesium-map/layers-manager.ts +354 -354
  264. package/src/lib/cesium-map/map-legend/MapLegend.css +136 -135
  265. package/src/lib/cesium-map/map-legend/MapLegend.tsx +92 -92
  266. package/src/lib/cesium-map/map-legend/MapLegendList.tsx +47 -47
  267. package/src/lib/cesium-map/map-legend/MapLegendSidebar.tsx +55 -55
  268. package/src/lib/cesium-map/map-legend/MapLegendToggle.tsx +31 -31
  269. package/src/lib/cesium-map/map-legend/index.tsx +3 -3
  270. package/src/lib/cesium-map/map-legend/legends-sidebar.stories.tsx +201 -201
  271. package/src/lib/cesium-map/map.css +59 -59
  272. package/src/lib/cesium-map/map.stories.tsx +143 -143
  273. package/src/lib/cesium-map/map.tsx +459 -446
  274. package/src/lib/cesium-map/map.types.ts +11 -11
  275. package/src/lib/cesium-map/proxied.types.ts +58 -54
  276. package/src/lib/cesium-map/settings/base-maps.css +37 -37
  277. package/src/lib/cesium-map/settings/base-maps.tsx +94 -94
  278. package/src/lib/cesium-map/settings/scene-modes.css +19 -19
  279. package/src/lib/cesium-map/settings/scene-modes.tsx +100 -100
  280. package/src/lib/cesium-map/settings/settings.css +52 -52
  281. package/src/lib/cesium-map/settings/settings.stories.tsx +182 -182
  282. package/src/lib/cesium-map/settings/settings.tsx +141 -141
  283. package/src/lib/cesium-map/terrain-providers/custom/dummy-quantized-mesh-tile.ts +243 -243
  284. package/src/lib/cesium-map/terrain-providers/custom/quantized-mesh-decoder.ts +321 -321
  285. package/src/lib/cesium-map/terrain-providers/custom/quantized-mesh-terrain-provider.ts +237 -237
  286. package/src/lib/cesium-map/terrain-providers/terrain-provider-heights-tool.stories.tsx +170 -170
  287. package/src/lib/cesium-map/terrain-providers/terrain-provider.stories.tsx +187 -187
  288. package/src/lib/cesium-map/tools/cesium/primitives-conversions.cesium.ts +15 -15
  289. package/src/lib/cesium-map/tools/coordinates-tracker.tool.css +11 -11
  290. package/src/lib/cesium-map/tools/coordinates-tracker.tool.tsx +81 -79
  291. package/src/lib/cesium-map/tools/draw/drawHelper.css +101 -101
  292. package/src/lib/cesium-map/tools/draw/drawHelper.ts +2116 -2116
  293. package/src/lib/cesium-map/tools/geojson/geojson-to-primitive.ts +54 -54
  294. package/src/lib/cesium-map/tools/geojson/index.ts +2 -2
  295. package/src/lib/cesium-map/tools/geojson/point.geojson.ts +63 -29
  296. package/src/lib/cesium-map/tools/geojson/polygon.geojson.ts +24 -24
  297. package/src/lib/cesium-map/tools/geojson/rectangle.geojson.ts +21 -21
  298. package/src/lib/cesium-map/tools/inspector.tool.tsx +15 -15
  299. package/src/lib/cesium-map/tools/scale-tracker.tool.css +16 -16
  300. package/src/lib/cesium-map/tools/scale-tracker.tool.tsx +192 -192
  301. package/src/lib/cesium-map/tools/terranian-height.tool.tsx +171 -171
  302. package/src/lib/cssbaseline/cssbaseline.tsx +19 -19
  303. package/src/lib/cssbaseline/index.ts +4 -4
  304. package/src/lib/date-picker/date-picker.css +9 -9
  305. package/src/lib/date-picker/date-picker.stories.tsx +130 -130
  306. package/src/lib/date-picker/date-picker.tsx +90 -90
  307. package/src/lib/date-picker/index.ts +1 -1
  308. package/src/lib/date-range-picker/date-range-picker.css +9 -9
  309. package/src/lib/date-range-picker/date-range-picker.form-control.css +3 -3
  310. package/src/lib/date-range-picker/date-range-picker.form-control.spec.tsx +58 -58
  311. package/src/lib/date-range-picker/date-range-picker.form-control.tsx +150 -150
  312. package/src/lib/date-range-picker/date-range-picker.stories.tsx +207 -207
  313. package/src/lib/date-range-picker/date-range-picker.tsx +156 -156
  314. package/src/lib/date-range-picker/index.ts +2 -2
  315. package/src/lib/file-picker/file-picker.css +63 -63
  316. package/src/lib/file-picker/file-picker.stories.tsx +447 -447
  317. package/src/lib/file-picker/file-picker.tsx +180 -180
  318. package/src/lib/file-picker/fs-map.json +1556 -1556
  319. package/src/lib/file-picker/index.ts +2 -2
  320. package/src/lib/file-picker/localization.ts +164 -164
  321. package/src/lib/index.ts +13 -13
  322. package/src/lib/map-filter-container/container-map.css +5 -5
  323. package/src/lib/map-filter-container/container-map.tsx +48 -48
  324. package/src/lib/map-filter-container/index.ts +1 -1
  325. package/src/lib/map-filter-container/map-filter-container.tsx +91 -91
  326. package/src/lib/map-filter-container/polygon-selection-ui.spec.tsx +119 -119
  327. package/src/lib/map-filter-container/polygon-selection-ui.tsx +111 -111
  328. package/src/lib/map-filter-container/stories/Map.stories.tsx +76 -76
  329. package/src/lib/models/defaults.ts +32 -32
  330. package/src/lib/models/enums.ts +16 -16
  331. package/src/lib/models/index.ts +1 -1
  332. package/src/lib/ol-map/feature.tsx +23 -23
  333. package/src/lib/ol-map/index.ts +6 -6
  334. package/src/lib/ol-map/interactions/draw.tsx +56 -56
  335. package/src/lib/ol-map/interactions/index.ts +1 -1
  336. package/src/lib/ol-map/layers/index.ts +3 -3
  337. package/src/lib/ol-map/layers/tile-layer.tsx +36 -36
  338. package/src/lib/ol-map/layers/vector-layer.tsx +32 -32
  339. package/src/lib/ol-map/layers/vector-tile-layer.tsx +56 -56
  340. package/src/lib/ol-map/map.css +17 -17
  341. package/src/lib/ol-map/map.tsx +137 -137
  342. package/src/lib/ol-map/source/index.ts +6 -6
  343. package/src/lib/ol-map/source/mvt.tsx +46 -46
  344. package/src/lib/ol-map/source/osm.tsx +13 -13
  345. package/src/lib/ol-map/source/stories/mvt.stories.tsx +68 -68
  346. package/src/lib/ol-map/source/stories/vector-source.stories.tsx +78 -78
  347. package/src/lib/ol-map/source/stories/wms.stories.tsx +51 -51
  348. package/src/lib/ol-map/source/stories/wmts.stories.tsx +72 -72
  349. package/src/lib/ol-map/source/stories/xyz.stories.tsx +53 -53
  350. package/src/lib/ol-map/source/vector-source.tsx +30 -30
  351. package/src/lib/ol-map/source/wms.tsx +40 -40
  352. package/src/lib/ol-map/source/wmts.tsx +82 -82
  353. package/src/lib/ol-map/source/xyz.tsx +33 -33
  354. package/src/lib/ol-map/stories/map.stories.tsx +60 -60
  355. package/src/lib/ol-map/style.ts +24 -24
  356. package/src/lib/popover/index.ts +1 -1
  357. package/src/lib/popover/popover.tsx +7 -7
  358. package/src/lib/smart-table/__mock-data__/smartTableMocks.ts +22 -22
  359. package/src/lib/smart-table/index.ts +2 -2
  360. package/src/lib/smart-table/smart-table-head.spec.tsx +116 -116
  361. package/src/lib/smart-table/smart-table-head.tsx +47 -47
  362. package/src/lib/smart-table/smart-table-row.spec.tsx +109 -109
  363. package/src/lib/smart-table/smart-table-row.tsx +78 -78
  364. package/src/lib/smart-table/smart-table-types.ts +10 -10
  365. package/src/lib/smart-table/smart-table.spec.tsx +116 -116
  366. package/src/lib/smart-table/smart-table.tsx +115 -115
  367. package/src/lib/smart-table/stories/SmartTable.stories.tsx +114 -114
  368. package/src/lib/theme/index.ts +1 -1
  369. package/src/lib/theme/theme.ts +123 -123
  370. package/src/lib/utils/map.ts +19 -19
  371. package/src/lib/utils/projections.ts +7 -7
  372. package/src/lib/utils/story.ts +11 -11
  373. package/src/react-app-env.d.ts +1 -1
  374. package/src/setupTests.ts +14 -14
  375. package/tsbuildconfig.json +37 -37
  376. package/tsconfig.json +26 -26
@@ -1,447 +1,447 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
- /* eslint-disable @typescript-eslint/strict-boolean-expressions */
3
- /* eslint-disable @typescript-eslint/no-unsafe-call */
4
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5
- import React, {
6
- useCallback,
7
- useState,
8
- useMemo,
9
- useRef,
10
- useEffect,
11
- } from 'react';
12
- import { Story } from '@storybook/react/types-6-0';
13
- import {
14
- FormControl,
15
- FormControlLabel,
16
- FormLabel,
17
- Radio,
18
- RadioGroup,
19
- } from '@material-ui/core';
20
- import { Box } from '../box';
21
- import { SupportedLocales } from '../models';
22
- import {
23
- FileActionData,
24
- FilePicker,
25
- FileArray,
26
- FileData,
27
- FileHelper,
28
- FilePickerActions,
29
- FilePickerHandle,
30
- } from './file-picker';
31
- import FsMap from './fs-map.json';
32
-
33
- export default {
34
- title: 'File Picker',
35
- component: FilePicker,
36
- };
37
-
38
- interface CustomFileData extends FileData {
39
- parentId?: string;
40
- childrenIds?: string[];
41
- }
42
- interface CustomFileMap {
43
- [fileId: string]: CustomFileData;
44
- }
45
-
46
- const prepareCustomFileMap = (): Record<string, unknown> => {
47
- const baseFileMap = (FsMap.fileMap as unknown) as CustomFileMap;
48
- const rootFolderId = FsMap.rootFolderId;
49
- return { baseFileMap, rootFolderId };
50
- };
51
-
52
- // Sets up files map and actions
53
- // eslint-disable-next-line
54
- const useCustomFileMap = () => {
55
- const { baseFileMap, rootFolderId } = useMemo(prepareCustomFileMap, []);
56
-
57
- const [fileMap, setFileMap] = useState<CustomFileMap>(
58
- baseFileMap as CustomFileMap
59
- );
60
- const [currentFolderId, setCurrentFolderId] = useState(rootFolderId);
61
-
62
- const resetFileMap = useCallback(() => {
63
- setFileMap(baseFileMap as CustomFileMap);
64
- setCurrentFolderId(rootFolderId);
65
- }, [baseFileMap, rootFolderId]);
66
-
67
- const currentFolderIdRef = useRef(currentFolderId);
68
-
69
- useEffect(() => {
70
- currentFolderIdRef.current = currentFolderId;
71
- }, [currentFolderId]);
72
-
73
- const deleteFiles = useCallback((files: CustomFileData[]) => {
74
- setFileMap((currentFileMap) => {
75
- const newFileMap = { ...currentFileMap };
76
-
77
- files.forEach((file) => {
78
- delete newFileMap[file.id];
79
-
80
- if (file.parentId) {
81
- const parent = newFileMap[file.parentId];
82
- const newChildrenIds = parent.childrenIds?.filter(
83
- (id) => id !== file.id
84
- );
85
- newFileMap[file.parentId] = {
86
- ...parent,
87
- childrenIds: newChildrenIds,
88
- childrenCount: newChildrenIds?.length,
89
- };
90
- }
91
- });
92
-
93
- return newFileMap;
94
- });
95
- }, []);
96
-
97
- const moveFiles = useCallback(
98
- (
99
- files: CustomFileData[],
100
- source: CustomFileData,
101
- destination: CustomFileData
102
- ) => {
103
- setFileMap((currentFileMap) => {
104
- const newFileMap = { ...currentFileMap };
105
- const moveFileIds = new Set(files.map((f) => f.id));
106
-
107
- // Delete files from their source folder.
108
- const newSourceChildrenIds = source.childrenIds?.filter(
109
- (id) => !moveFileIds.has(id)
110
- );
111
- newFileMap[source.id] = {
112
- ...source,
113
- childrenIds: newSourceChildrenIds,
114
- childrenCount: newSourceChildrenIds?.length,
115
- };
116
-
117
- // Add the files to their destination folder.
118
- const newDestinationChildrenIds = [
119
- ...(destination.childrenIds as string[]),
120
- ...files.map((f) => f.id),
121
- ];
122
- newFileMap[destination.id] = {
123
- ...destination,
124
- childrenIds: newDestinationChildrenIds,
125
- childrenCount: newDestinationChildrenIds.length,
126
- };
127
-
128
- // Finally, update the parent folder ID on the files - from source folder
129
- // ID to the destination folder ID.
130
- files.forEach((file) => {
131
- newFileMap[file.id] = {
132
- ...file,
133
- parentId: destination.id,
134
- };
135
- });
136
-
137
- return newFileMap;
138
- });
139
- },
140
- []
141
- );
142
-
143
- // TODO: in production we should use UUIDs or MD5 hashes for file paths
144
- const idCounter = useRef(0);
145
- const createFolder = useCallback((folderName: string) => {
146
- setFileMap((currentFileMap) => {
147
- const newFileMap = { ...currentFileMap };
148
-
149
- const parentId = currentFolderIdRef.current as string;
150
- // Create the new folder.
151
- const newFolderId = `new-folder-${idCounter.current++}`;
152
- newFileMap[newFolderId] = {
153
- id: newFolderId,
154
- name: folderName,
155
- isDir: true,
156
- modDate: new Date(),
157
- parentId: parentId,
158
- childrenIds: [],
159
- childrenCount: 0,
160
- };
161
-
162
- // Update parent folder to reference the new folder.
163
- const parent = newFileMap[parentId];
164
- newFileMap[parentId] = {
165
- ...parent,
166
- childrenIds: [...(parent.childrenIds as string[]), newFolderId],
167
- };
168
-
169
- return newFileMap;
170
- });
171
- }, []);
172
-
173
- return {
174
- fileMap,
175
- currentFolderId,
176
- setCurrentFolderId,
177
- resetFileMap,
178
- deleteFiles,
179
- moveFiles,
180
- createFolder,
181
- };
182
- };
183
-
184
- const useFiles = (
185
- fileMap: CustomFileMap,
186
- currentFolderId: string
187
- ): FileArray => {
188
- return useMemo(() => {
189
- const currentFolder = fileMap[currentFolderId];
190
- const files = currentFolder.childrenIds
191
- ? currentFolder.childrenIds.map((fileId: string) => fileMap[fileId])
192
- : [];
193
- return files;
194
- }, [currentFolderId, fileMap]);
195
- };
196
-
197
- const useFolderChain = (
198
- fileMap: CustomFileMap,
199
- currentFolderId: string
200
- ): FileArray => {
201
- return useMemo(() => {
202
- const currentFolder = fileMap[currentFolderId];
203
- const folderChain = [currentFolder];
204
- let parentId = currentFolder.parentId;
205
- // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
206
- while (parentId) {
207
- const parentFile = fileMap[parentId];
208
- // eslint-disable-next-line
209
- if (parentFile) {
210
- folderChain.unshift(parentFile);
211
- parentId = parentFile.parentId;
212
- } else {
213
- break;
214
- }
215
- }
216
- return folderChain;
217
- }, [currentFolderId, fileMap]);
218
- };
219
-
220
- const useFileActionHandler = (
221
- setCurrentFolderId: (folderId: string) => void,
222
- deleteFiles: (files: CustomFileData[]) => void,
223
- moveFiles: (
224
- files: FileData[],
225
- source: FileData,
226
- destination: FileData
227
- ) => void,
228
- createFolder: (folderName: string) => void
229
- ): ((data: FileActionData) => void) => {
230
- return useCallback(
231
- (data: FileActionData) => {
232
- if (data.id === FilePickerActions.OpenFiles.id) {
233
- const { targetFile, files } = data.payload;
234
- const fileToOpen = targetFile ?? files[0];
235
- // eslint-disable-next-line
236
- if (fileToOpen && FileHelper.isDirectory(fileToOpen)) {
237
- setCurrentFolderId(fileToOpen.id);
238
- return;
239
- }
240
- } else if (data.id === FilePickerActions.DeleteFiles.id) {
241
- deleteFiles(data.state.selectedFilesForAction);
242
- } else if (data.id === FilePickerActions.MoveFiles.id) {
243
- moveFiles(
244
- data.payload.files,
245
- data.payload.source as FileData,
246
- data.payload.destination
247
- );
248
- } else if (data.id === FilePickerActions.CreateFolder.id) {
249
- const folderName = prompt('Provide the name for your new folder:');
250
- // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
251
- if (folderName) createFolder(folderName);
252
- }
253
- },
254
- [createFolder, deleteFiles, moveFiles, setCurrentFolderId]
255
- );
256
- };
257
-
258
- export const ReadOnlyMode: Story = () => {
259
- const {
260
- fileMap,
261
- currentFolderId,
262
- setCurrentFolderId,
263
- // resetFileMap,
264
- deleteFiles,
265
- moveFiles,
266
- createFolder,
267
- } = useCustomFileMap();
268
- const files = useFiles(fileMap, currentFolderId as string);
269
- const folderChain = useFolderChain(fileMap, currentFolderId as string);
270
- const handleFileAction = useFileActionHandler(
271
- setCurrentFolderId,
272
- deleteFiles,
273
- moveFiles,
274
- createFolder
275
- );
276
- return (
277
- <Box style={{ height: '600px' }}>
278
- <FilePicker
279
- files={files}
280
- folderChain={folderChain}
281
- onFileAction={handleFileAction}
282
- readOnlyMode={true}
283
- />
284
- </Box>
285
- );
286
- };
287
-
288
- export const DarkTheme: Story = () => {
289
- const {
290
- fileMap,
291
- currentFolderId,
292
- setCurrentFolderId,
293
- // resetFileMap,
294
- deleteFiles,
295
- moveFiles,
296
- createFolder,
297
- } = useCustomFileMap();
298
- const files = useFiles(fileMap, currentFolderId as string);
299
- const folderChain = useFolderChain(fileMap, currentFolderId as string);
300
- const handleFileAction = useFileActionHandler(
301
- setCurrentFolderId,
302
- deleteFiles,
303
- moveFiles,
304
- createFolder
305
- );
306
- return (
307
- <Box style={{ height: '600px' }}>
308
- <FilePicker
309
- files={files}
310
- folderChain={folderChain}
311
- onFileAction={handleFileAction}
312
- theme={{
313
- primary: 'blue',
314
- background: 'black',
315
- surface: 'gray',
316
- textOnBackground: 'white',
317
- selectionBackground: '#455570',
318
- }}
319
- />
320
- </Box>
321
- );
322
- };
323
-
324
- export const Localized: Story = () => {
325
- const {
326
- fileMap,
327
- currentFolderId,
328
- setCurrentFolderId,
329
- // resetFileMap,
330
- deleteFiles,
331
- moveFiles,
332
- createFolder,
333
- } = useCustomFileMap();
334
- const files = useFiles(fileMap, currentFolderId as string);
335
- const folderChain = useFolderChain(fileMap, currentFolderId as string);
336
- const handleFileAction = useFileActionHandler(
337
- setCurrentFolderId,
338
- deleteFiles,
339
- moveFiles,
340
- createFolder
341
- );
342
- const [locale, setLocale] = useState<SupportedLocales>(SupportedLocales.HE);
343
- const handleLocaleChange = useCallback(
344
- (event) => setLocale(event.target.value),
345
- []
346
- );
347
- return (
348
- <>
349
- <FormControl component="fieldset" style={{ marginBottom: 15 }}>
350
- <FormLabel component="legend">Pick a language:</FormLabel>
351
- <RadioGroup
352
- aria-label="locale"
353
- name="locale"
354
- value={locale}
355
- onChange={handleLocaleChange}
356
- >
357
- <FormControlLabel
358
- value={SupportedLocales.HE}
359
- control={<Radio />}
360
- label="עברית"
361
- />
362
- <FormControlLabel
363
- value={SupportedLocales.RU}
364
- control={<Radio />}
365
- label="Русский"
366
- />
367
- <FormControlLabel
368
- value={SupportedLocales.EN}
369
- control={<Radio />}
370
- label="English"
371
- />
372
- </RadioGroup>
373
- </FormControl>
374
- <br />
375
- <Box style={{ height: '600px' }}>
376
- <FilePicker
377
- files={files}
378
- folderChain={folderChain}
379
- onFileAction={handleFileAction}
380
- locale={locale}
381
- />
382
- </Box>
383
- </>
384
- );
385
- };
386
-
387
- export const FilesSelection: Story = () => {
388
- const {
389
- fileMap,
390
- currentFolderId,
391
- setCurrentFolderId,
392
- // resetFileMap,
393
- deleteFiles,
394
- moveFiles,
395
- createFolder,
396
- } = useCustomFileMap();
397
- const files = useFiles(fileMap, currentFolderId as string);
398
- const folderChain = useFolderChain(fileMap, currentFolderId as string);
399
- const handleFileAction = useFileActionHandler(
400
- setCurrentFolderId,
401
- deleteFiles,
402
- moveFiles,
403
- createFolder
404
- );
405
- const fileBrowserRef = useRef<FilePickerHandle>(null);
406
-
407
- const logSelection = useCallback(
408
- (event: React.MouseEvent) => {
409
- event.preventDefault();
410
- event.stopPropagation();
411
- if (!fileBrowserRef.current) return;
412
- console.log(fileBrowserRef.current.getFileSelection());
413
- },
414
- [fileBrowserRef]
415
- );
416
-
417
- const randomizeSelection = useCallback(
418
- (event: React.MouseEvent) => {
419
- event.preventDefault();
420
- event.stopPropagation();
421
- if (!fileBrowserRef.current) return;
422
- const randomFileIds = new Set<string>();
423
- for (const file of files) {
424
- if (file && Math.random() > 0.5) randomFileIds.add(file.id);
425
- }
426
- fileBrowserRef.current.setFileSelection(randomFileIds);
427
- },
428
- [files, fileBrowserRef]
429
- );
430
-
431
- return (
432
- <Box style={{ height: '600px' }}>
433
- <button type="button" onClick={randomizeSelection}>
434
- Select files
435
- </button>
436
- <button type="button" onClick={logSelection}>
437
- Log selection
438
- </button>
439
- <FilePicker
440
- ref={fileBrowserRef}
441
- files={files}
442
- folderChain={folderChain}
443
- onFileAction={handleFileAction}
444
- />
445
- </Box>
446
- );
447
- };
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
+ /* eslint-disable @typescript-eslint/strict-boolean-expressions */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5
+ import React, {
6
+ useCallback,
7
+ useState,
8
+ useMemo,
9
+ useRef,
10
+ useEffect,
11
+ } from 'react';
12
+ import { Story } from '@storybook/react/types-6-0';
13
+ import {
14
+ FormControl,
15
+ FormControlLabel,
16
+ FormLabel,
17
+ Radio,
18
+ RadioGroup,
19
+ } from '@material-ui/core';
20
+ import { Box } from '../box';
21
+ import { SupportedLocales } from '../models';
22
+ import {
23
+ FileActionData,
24
+ FilePicker,
25
+ FileArray,
26
+ FileData,
27
+ FileHelper,
28
+ FilePickerActions,
29
+ FilePickerHandle,
30
+ } from './file-picker';
31
+ import FsMap from './fs-map.json';
32
+
33
+ export default {
34
+ title: 'File Picker',
35
+ component: FilePicker,
36
+ };
37
+
38
+ interface CustomFileData extends FileData {
39
+ parentId?: string;
40
+ childrenIds?: string[];
41
+ }
42
+ interface CustomFileMap {
43
+ [fileId: string]: CustomFileData;
44
+ }
45
+
46
+ const prepareCustomFileMap = (): Record<string, unknown> => {
47
+ const baseFileMap = (FsMap.fileMap as unknown) as CustomFileMap;
48
+ const rootFolderId = FsMap.rootFolderId;
49
+ return { baseFileMap, rootFolderId };
50
+ };
51
+
52
+ // Sets up files map and actions
53
+ // eslint-disable-next-line
54
+ const useCustomFileMap = () => {
55
+ const { baseFileMap, rootFolderId } = useMemo(prepareCustomFileMap, []);
56
+
57
+ const [fileMap, setFileMap] = useState<CustomFileMap>(
58
+ baseFileMap as CustomFileMap
59
+ );
60
+ const [currentFolderId, setCurrentFolderId] = useState(rootFolderId);
61
+
62
+ const resetFileMap = useCallback(() => {
63
+ setFileMap(baseFileMap as CustomFileMap);
64
+ setCurrentFolderId(rootFolderId);
65
+ }, [baseFileMap, rootFolderId]);
66
+
67
+ const currentFolderIdRef = useRef(currentFolderId);
68
+
69
+ useEffect(() => {
70
+ currentFolderIdRef.current = currentFolderId;
71
+ }, [currentFolderId]);
72
+
73
+ const deleteFiles = useCallback((files: CustomFileData[]) => {
74
+ setFileMap((currentFileMap) => {
75
+ const newFileMap = { ...currentFileMap };
76
+
77
+ files.forEach((file) => {
78
+ delete newFileMap[file.id];
79
+
80
+ if (file.parentId) {
81
+ const parent = newFileMap[file.parentId];
82
+ const newChildrenIds = parent.childrenIds?.filter(
83
+ (id) => id !== file.id
84
+ );
85
+ newFileMap[file.parentId] = {
86
+ ...parent,
87
+ childrenIds: newChildrenIds,
88
+ childrenCount: newChildrenIds?.length,
89
+ };
90
+ }
91
+ });
92
+
93
+ return newFileMap;
94
+ });
95
+ }, []);
96
+
97
+ const moveFiles = useCallback(
98
+ (
99
+ files: CustomFileData[],
100
+ source: CustomFileData,
101
+ destination: CustomFileData
102
+ ) => {
103
+ setFileMap((currentFileMap) => {
104
+ const newFileMap = { ...currentFileMap };
105
+ const moveFileIds = new Set(files.map((f) => f.id));
106
+
107
+ // Delete files from their source folder.
108
+ const newSourceChildrenIds = source.childrenIds?.filter(
109
+ (id) => !moveFileIds.has(id)
110
+ );
111
+ newFileMap[source.id] = {
112
+ ...source,
113
+ childrenIds: newSourceChildrenIds,
114
+ childrenCount: newSourceChildrenIds?.length,
115
+ };
116
+
117
+ // Add the files to their destination folder.
118
+ const newDestinationChildrenIds = [
119
+ ...(destination.childrenIds as string[]),
120
+ ...files.map((f) => f.id),
121
+ ];
122
+ newFileMap[destination.id] = {
123
+ ...destination,
124
+ childrenIds: newDestinationChildrenIds,
125
+ childrenCount: newDestinationChildrenIds.length,
126
+ };
127
+
128
+ // Finally, update the parent folder ID on the files - from source folder
129
+ // ID to the destination folder ID.
130
+ files.forEach((file) => {
131
+ newFileMap[file.id] = {
132
+ ...file,
133
+ parentId: destination.id,
134
+ };
135
+ });
136
+
137
+ return newFileMap;
138
+ });
139
+ },
140
+ []
141
+ );
142
+
143
+ // TODO: in production we should use UUIDs or MD5 hashes for file paths
144
+ const idCounter = useRef(0);
145
+ const createFolder = useCallback((folderName: string) => {
146
+ setFileMap((currentFileMap) => {
147
+ const newFileMap = { ...currentFileMap };
148
+
149
+ const parentId = currentFolderIdRef.current as string;
150
+ // Create the new folder.
151
+ const newFolderId = `new-folder-${idCounter.current++}`;
152
+ newFileMap[newFolderId] = {
153
+ id: newFolderId,
154
+ name: folderName,
155
+ isDir: true,
156
+ modDate: new Date(),
157
+ parentId: parentId,
158
+ childrenIds: [],
159
+ childrenCount: 0,
160
+ };
161
+
162
+ // Update parent folder to reference the new folder.
163
+ const parent = newFileMap[parentId];
164
+ newFileMap[parentId] = {
165
+ ...parent,
166
+ childrenIds: [...(parent.childrenIds as string[]), newFolderId],
167
+ };
168
+
169
+ return newFileMap;
170
+ });
171
+ }, []);
172
+
173
+ return {
174
+ fileMap,
175
+ currentFolderId,
176
+ setCurrentFolderId,
177
+ resetFileMap,
178
+ deleteFiles,
179
+ moveFiles,
180
+ createFolder,
181
+ };
182
+ };
183
+
184
+ const useFiles = (
185
+ fileMap: CustomFileMap,
186
+ currentFolderId: string
187
+ ): FileArray => {
188
+ return useMemo(() => {
189
+ const currentFolder = fileMap[currentFolderId];
190
+ const files = currentFolder.childrenIds
191
+ ? currentFolder.childrenIds.map((fileId: string) => fileMap[fileId])
192
+ : [];
193
+ return files;
194
+ }, [currentFolderId, fileMap]);
195
+ };
196
+
197
+ const useFolderChain = (
198
+ fileMap: CustomFileMap,
199
+ currentFolderId: string
200
+ ): FileArray => {
201
+ return useMemo(() => {
202
+ const currentFolder = fileMap[currentFolderId];
203
+ const folderChain = [currentFolder];
204
+ let parentId = currentFolder.parentId;
205
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
206
+ while (parentId) {
207
+ const parentFile = fileMap[parentId];
208
+ // eslint-disable-next-line
209
+ if (parentFile) {
210
+ folderChain.unshift(parentFile);
211
+ parentId = parentFile.parentId;
212
+ } else {
213
+ break;
214
+ }
215
+ }
216
+ return folderChain;
217
+ }, [currentFolderId, fileMap]);
218
+ };
219
+
220
+ const useFileActionHandler = (
221
+ setCurrentFolderId: (folderId: string) => void,
222
+ deleteFiles: (files: CustomFileData[]) => void,
223
+ moveFiles: (
224
+ files: FileData[],
225
+ source: FileData,
226
+ destination: FileData
227
+ ) => void,
228
+ createFolder: (folderName: string) => void
229
+ ): ((data: FileActionData) => void) => {
230
+ return useCallback(
231
+ (data: FileActionData) => {
232
+ if (data.id === FilePickerActions.OpenFiles.id) {
233
+ const { targetFile, files } = data.payload;
234
+ const fileToOpen = targetFile ?? files[0];
235
+ // eslint-disable-next-line
236
+ if (fileToOpen && FileHelper.isDirectory(fileToOpen)) {
237
+ setCurrentFolderId(fileToOpen.id);
238
+ return;
239
+ }
240
+ } else if (data.id === FilePickerActions.DeleteFiles.id) {
241
+ deleteFiles(data.state.selectedFilesForAction);
242
+ } else if (data.id === FilePickerActions.MoveFiles.id) {
243
+ moveFiles(
244
+ data.payload.files,
245
+ data.payload.source as FileData,
246
+ data.payload.destination
247
+ );
248
+ } else if (data.id === FilePickerActions.CreateFolder.id) {
249
+ const folderName = prompt('Provide the name for your new folder:');
250
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
251
+ if (folderName) createFolder(folderName);
252
+ }
253
+ },
254
+ [createFolder, deleteFiles, moveFiles, setCurrentFolderId]
255
+ );
256
+ };
257
+
258
+ export const ReadOnlyMode: Story = () => {
259
+ const {
260
+ fileMap,
261
+ currentFolderId,
262
+ setCurrentFolderId,
263
+ // resetFileMap,
264
+ deleteFiles,
265
+ moveFiles,
266
+ createFolder,
267
+ } = useCustomFileMap();
268
+ const files = useFiles(fileMap, currentFolderId as string);
269
+ const folderChain = useFolderChain(fileMap, currentFolderId as string);
270
+ const handleFileAction = useFileActionHandler(
271
+ setCurrentFolderId,
272
+ deleteFiles,
273
+ moveFiles,
274
+ createFolder
275
+ );
276
+ return (
277
+ <Box style={{ height: '600px' }}>
278
+ <FilePicker
279
+ files={files}
280
+ folderChain={folderChain}
281
+ onFileAction={handleFileAction}
282
+ readOnlyMode={true}
283
+ />
284
+ </Box>
285
+ );
286
+ };
287
+
288
+ export const DarkTheme: Story = () => {
289
+ const {
290
+ fileMap,
291
+ currentFolderId,
292
+ setCurrentFolderId,
293
+ // resetFileMap,
294
+ deleteFiles,
295
+ moveFiles,
296
+ createFolder,
297
+ } = useCustomFileMap();
298
+ const files = useFiles(fileMap, currentFolderId as string);
299
+ const folderChain = useFolderChain(fileMap, currentFolderId as string);
300
+ const handleFileAction = useFileActionHandler(
301
+ setCurrentFolderId,
302
+ deleteFiles,
303
+ moveFiles,
304
+ createFolder
305
+ );
306
+ return (
307
+ <Box style={{ height: '600px' }}>
308
+ <FilePicker
309
+ files={files}
310
+ folderChain={folderChain}
311
+ onFileAction={handleFileAction}
312
+ theme={{
313
+ primary: 'blue',
314
+ background: 'black',
315
+ surface: 'gray',
316
+ textOnBackground: 'white',
317
+ selectionBackground: '#455570',
318
+ }}
319
+ />
320
+ </Box>
321
+ );
322
+ };
323
+
324
+ export const Localized: Story = () => {
325
+ const {
326
+ fileMap,
327
+ currentFolderId,
328
+ setCurrentFolderId,
329
+ // resetFileMap,
330
+ deleteFiles,
331
+ moveFiles,
332
+ createFolder,
333
+ } = useCustomFileMap();
334
+ const files = useFiles(fileMap, currentFolderId as string);
335
+ const folderChain = useFolderChain(fileMap, currentFolderId as string);
336
+ const handleFileAction = useFileActionHandler(
337
+ setCurrentFolderId,
338
+ deleteFiles,
339
+ moveFiles,
340
+ createFolder
341
+ );
342
+ const [locale, setLocale] = useState<SupportedLocales>(SupportedLocales.HE);
343
+ const handleLocaleChange = useCallback(
344
+ (event) => setLocale(event.target.value),
345
+ []
346
+ );
347
+ return (
348
+ <>
349
+ <FormControl component="fieldset" style={{ marginBottom: 15 }}>
350
+ <FormLabel component="legend">Pick a language:</FormLabel>
351
+ <RadioGroup
352
+ aria-label="locale"
353
+ name="locale"
354
+ value={locale}
355
+ onChange={handleLocaleChange}
356
+ >
357
+ <FormControlLabel
358
+ value={SupportedLocales.HE}
359
+ control={<Radio />}
360
+ label="עברית"
361
+ />
362
+ <FormControlLabel
363
+ value={SupportedLocales.RU}
364
+ control={<Radio />}
365
+ label="Русский"
366
+ />
367
+ <FormControlLabel
368
+ value={SupportedLocales.EN}
369
+ control={<Radio />}
370
+ label="English"
371
+ />
372
+ </RadioGroup>
373
+ </FormControl>
374
+ <br />
375
+ <Box style={{ height: '600px' }}>
376
+ <FilePicker
377
+ files={files}
378
+ folderChain={folderChain}
379
+ onFileAction={handleFileAction}
380
+ locale={locale}
381
+ />
382
+ </Box>
383
+ </>
384
+ );
385
+ };
386
+
387
+ export const FilesSelection: Story = () => {
388
+ const {
389
+ fileMap,
390
+ currentFolderId,
391
+ setCurrentFolderId,
392
+ // resetFileMap,
393
+ deleteFiles,
394
+ moveFiles,
395
+ createFolder,
396
+ } = useCustomFileMap();
397
+ const files = useFiles(fileMap, currentFolderId as string);
398
+ const folderChain = useFolderChain(fileMap, currentFolderId as string);
399
+ const handleFileAction = useFileActionHandler(
400
+ setCurrentFolderId,
401
+ deleteFiles,
402
+ moveFiles,
403
+ createFolder
404
+ );
405
+ const fileBrowserRef = useRef<FilePickerHandle>(null);
406
+
407
+ const logSelection = useCallback(
408
+ (event: React.MouseEvent) => {
409
+ event.preventDefault();
410
+ event.stopPropagation();
411
+ if (!fileBrowserRef.current) return;
412
+ console.log(fileBrowserRef.current.getFileSelection());
413
+ },
414
+ [fileBrowserRef]
415
+ );
416
+
417
+ const randomizeSelection = useCallback(
418
+ (event: React.MouseEvent) => {
419
+ event.preventDefault();
420
+ event.stopPropagation();
421
+ if (!fileBrowserRef.current) return;
422
+ const randomFileIds = new Set<string>();
423
+ for (const file of files) {
424
+ if (file && Math.random() > 0.5) randomFileIds.add(file.id);
425
+ }
426
+ fileBrowserRef.current.setFileSelection(randomFileIds);
427
+ },
428
+ [files, fileBrowserRef]
429
+ );
430
+
431
+ return (
432
+ <Box style={{ height: '600px' }}>
433
+ <button type="button" onClick={randomizeSelection}>
434
+ Select files
435
+ </button>
436
+ <button type="button" onClick={logSelection}>
437
+ Log selection
438
+ </button>
439
+ <FilePicker
440
+ ref={fileBrowserRef}
441
+ files={files}
442
+ folderChain={folderChain}
443
+ onFileAction={handleFileAction}
444
+ />
445
+ </Box>
446
+ );
447
+ };