@mcurros2/microm 1.1.269-0 → 1.1.271-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 (351) hide show
  1. package/dist/Core-DHeWIb2T.js +60274 -0
  2. package/dist/Core-DHeWIb2T.js.map +1 -0
  3. package/dist/Core-DaJx25pX.mjs +58783 -0
  4. package/dist/Core-DaJx25pX.mjs.map +1 -0
  5. package/dist/favicon.ico +0 -0
  6. package/dist/index.cjs +8936 -0
  7. package/dist/index.cjs.map +1 -0
  8. package/dist/index.d.ts +2 -3807
  9. package/dist/index.html +42 -0
  10. package/dist/index.js +8477 -47539
  11. package/dist/index.js.map +1 -1
  12. package/dist/logo192.png +0 -0
  13. package/dist/logo512.png +0 -0
  14. package/dist/manifest.json +25 -0
  15. package/dist/{index.css → microm.css} +4467 -4381
  16. package/dist/robots.txt +3 -0
  17. package/dist/src/DataDictionary/Categories/Categories.d.ts +6 -0
  18. package/dist/src/DataDictionary/Categories/CategoriesDef.d.ts +22 -0
  19. package/dist/src/DataDictionary/Categories/CategoriesForm.d.ts +4 -0
  20. package/dist/src/DataDictionary/Categories/CategoriesValues.d.ts +6 -0
  21. package/dist/src/DataDictionary/Categories/CategoriesValuesDef.d.ts +31 -0
  22. package/dist/src/DataDictionary/Categories/index.d.ts +5 -0
  23. package/dist/src/DataDictionary/Config/catAuthenticationType.d.ts +6 -0
  24. package/dist/src/DataDictionary/Config/catFileStorageTypes.d.ts +6 -0
  25. package/dist/src/DataDictionary/Config/catIdentityProviderRoles.d.ts +6 -0
  26. package/dist/src/DataDictionary/Config/catUserTypes.d.ts +6 -0
  27. package/dist/src/DataDictionary/Config/index.d.ts +4 -0
  28. package/dist/src/DataDictionary/EmailConfiguration/EmailServiceConfiguration.d.ts +9 -0
  29. package/dist/src/DataDictionary/EmailConfiguration/EmailServiceConfigurationDef.d.ts +30 -0
  30. package/dist/src/DataDictionary/EmailConfiguration/EmailServiceConfigurationForm.d.ts +12 -0
  31. package/dist/src/DataDictionary/EmailConfiguration/index.d.ts +3 -0
  32. package/dist/src/DataDictionary/FileStore/FileStore.d.ts +6 -0
  33. package/dist/src/DataDictionary/FileStore/FileStoreDef.d.ts +34 -0
  34. package/dist/src/DataDictionary/FileStore/index.d.ts +2 -0
  35. package/dist/src/DataDictionary/FileStoreProcess/FileStoreProcess.d.ts +6 -0
  36. package/dist/src/DataDictionary/FileStoreProcess/FileStoreProcessDef.d.ts +21 -0
  37. package/dist/src/DataDictionary/FileStoreProcess/index.d.ts +2 -0
  38. package/dist/src/DataDictionary/FileStoreStatus/FileStoreStatus.d.ts +6 -0
  39. package/dist/src/DataDictionary/FileStoreStatus/FileStoreStatusDef.d.ts +23 -0
  40. package/dist/src/DataDictionary/FileStoreStatus/index.d.ts +2 -0
  41. package/dist/src/DataDictionary/ImportEntityData/ImportEntityData.d.ts +14 -0
  42. package/dist/src/DataDictionary/ImportEntityData/ImportEntityDataDef.d.ts +33 -0
  43. package/dist/src/DataDictionary/ImportEntityData/ImportEntityDataForm.d.ts +28 -0
  44. package/dist/src/DataDictionary/ImportEntityData/index.d.ts +3 -0
  45. package/dist/src/DataDictionary/MicromDeveloperToolsCodeGen/MicromDeveloperToolsCodeGen.d.ts +6 -0
  46. package/dist/src/DataDictionary/MicromDeveloperToolsCodeGen/MicromDeveloperToolsCodeGenDef.d.ts +29 -0
  47. package/dist/src/DataDictionary/MicromDeveloperToolsCodeGen/MicromDeveloperToolsCodeGenForm.d.ts +4 -0
  48. package/dist/src/DataDictionary/MicromDeveloperToolsCodeGen/index.d.ts +3 -0
  49. package/dist/src/DataDictionary/MicromEntitiesTypes/ACTMicromGeneratedCode.d.ts +10 -0
  50. package/dist/src/DataDictionary/MicromEntitiesTypes/MicromEntitiesTypes.d.ts +6 -0
  51. package/dist/src/DataDictionary/MicromEntitiesTypes/MicromEntitiesTypesDef.d.ts +25 -0
  52. package/dist/src/DataDictionary/MicromEntitiesTypes/index.d.ts +3 -0
  53. package/dist/src/DataDictionary/MicromUsers/MicromUsers.d.ts +6 -0
  54. package/dist/src/DataDictionary/MicromUsers/MicromUsersDef.d.ts +61 -0
  55. package/dist/src/DataDictionary/MicromUsers/MicromUsersForm.d.ts +16 -0
  56. package/dist/src/DataDictionary/MicromUsers/MicromUsersStatusPanel.d.ts +20 -0
  57. package/dist/src/DataDictionary/MicromUsers/MicromUsersStatusPanelColumns.d.ts +27 -0
  58. package/dist/src/DataDictionary/MicromUsers/index.d.ts +5 -0
  59. package/dist/src/DataDictionary/MicromUsersGroups/MicromUsersGroups.d.ts +6 -0
  60. package/dist/src/DataDictionary/MicromUsersGroups/MicromUsersGroupsDef.d.ts +35 -0
  61. package/dist/src/DataDictionary/MicromUsersGroups/MicromUsersGroupsForm.d.ts +9 -0
  62. package/dist/src/DataDictionary/MicromUsersGroups/index.d.ts +3 -0
  63. package/dist/src/DataDictionary/MicromUsersGroupsMembers/MicromUsersGroupsMembers.d.ts +6 -0
  64. package/dist/src/DataDictionary/MicromUsersGroupsMembers/MicromUsersGroupsMembersDef.d.ts +43 -0
  65. package/dist/src/DataDictionary/MicromUsersGroupsMembers/index.d.ts +2 -0
  66. package/dist/src/DataDictionary/MicromUsersGroupsMenus/ACTDisableMenus.d.ts +8 -0
  67. package/dist/src/DataDictionary/MicromUsersGroupsMenus/ACTEnableMenus.d.ts +8 -0
  68. package/dist/src/DataDictionary/MicromUsersGroupsMenus/MicromUsersGroupsMenus.d.ts +14 -0
  69. package/dist/src/DataDictionary/MicromUsersGroupsMenus/MicromUsersGroupsMenusColumnsOverrides.d.ts +11 -0
  70. package/dist/src/DataDictionary/MicromUsersGroupsMenus/MicromUsersGroupsMenusDef.d.ts +32 -0
  71. package/dist/src/DataDictionary/MicromUsersGroupsMenus/index.d.ts +5 -0
  72. package/dist/src/DataDictionary/Status/Status.d.ts +6 -0
  73. package/dist/src/DataDictionary/Status/StatusDef.d.ts +22 -0
  74. package/dist/src/DataDictionary/Status/StatusValues.d.ts +6 -0
  75. package/dist/src/DataDictionary/Status/StatusValuesDef.d.ts +24 -0
  76. package/dist/src/DataDictionary/Status/index.d.ts +4 -0
  77. package/dist/src/DataDictionary/index.d.ts +14 -0
  78. package/dist/src/Entity/ColumnsFunctions.d.ts +55 -0
  79. package/dist/src/Entity/ColumnsMapping.d.ts +35 -0
  80. package/dist/src/Entity/DataResultFunctions.d.ts +11 -0
  81. package/dist/src/Entity/DefaultColumns.d.ts +13 -0
  82. package/dist/src/Entity/Entity.d.ts +21 -0
  83. package/dist/src/Entity/EntityAPI.d.ts +41 -0
  84. package/dist/src/Entity/EntityClientAction.d.ts +24 -0
  85. package/dist/src/Entity/EntityColumn.d.ts +28 -0
  86. package/dist/src/Entity/EntityColumn.types.d.ts +56 -0
  87. package/dist/src/Entity/EntityColumnCollection.types.d.ts +3 -0
  88. package/dist/src/Entity/EntityColumnFunctions.d.ts +4 -0
  89. package/dist/src/Entity/EntityDefinition.d.ts +28 -0
  90. package/dist/src/Entity/EntityError.d.ts +4 -0
  91. package/dist/src/Entity/EntityFunctions.d.ts +3 -0
  92. package/dist/src/Entity/EntityLookup.d.ts +18 -0
  93. package/dist/src/Entity/EntityProc.d.ts +5 -0
  94. package/dist/src/Entity/EntityServerAction.d.ts +3 -0
  95. package/dist/src/Entity/EntityView.d.ts +16 -0
  96. package/dist/src/Entity/GenericFunctions.d.ts +5 -0
  97. package/dist/src/Entity/TypeGuards.d.ts +6 -0
  98. package/dist/src/Entity/index.d.ts +20 -0
  99. package/dist/src/GoogleMapsAPI/GoogleMapsAPILoader.d.ts +7 -0
  100. package/dist/src/GoogleMapsAPI/index.d.ts +2 -0
  101. package/dist/src/GoogleMapsAPI/useGoogleMapsAPI.d.ts +23 -0
  102. package/dist/src/UI/Actions/EntityActionButton.d.ts +11 -0
  103. package/dist/src/UI/Actions/index.d.ts +1 -0
  104. package/dist/src/UI/AddressInput/AddressAutocomplete.d.ts +26 -0
  105. package/dist/src/UI/AddressInput/AddressLookup.d.ts +11 -0
  106. package/dist/src/UI/AddressInput/AddressMapMarker.d.ts +26 -0
  107. package/dist/src/UI/AddressInput/AddressSearch.d.ts +12 -0
  108. package/dist/src/UI/AddressInput/AddressSearchForm.d.ts +18 -0
  109. package/dist/src/UI/AddressInput/index.d.ts +6 -0
  110. package/dist/src/UI/AddressInput/useAddressSearchForm.d.ts +19 -0
  111. package/dist/src/UI/AutoFiltersForm/AutoFiltersForm.d.ts +4 -0
  112. package/dist/src/UI/AutoFiltersForm/index.d.ts +1 -0
  113. package/dist/src/UI/AutoForm/AutoForm.d.ts +3 -0
  114. package/dist/src/UI/AutoForm/AutoFormFields.d.ts +7 -0
  115. package/dist/src/UI/AutoForm/index.d.ts +2 -0
  116. package/dist/src/UI/AvatarUploader/AvatarUploader.d.ts +8 -0
  117. package/dist/src/UI/AvatarUploader/index.d.ts +2 -0
  118. package/dist/src/UI/AvatarUploader/useAvatarUploader.d.ts +25 -0
  119. package/dist/src/UI/Core/AlertError.d.ts +6 -0
  120. package/dist/src/UI/Core/AlertInfo.d.ts +3 -0
  121. package/dist/src/UI/Core/AlertSuccess.d.ts +3 -0
  122. package/dist/src/UI/Core/BytesRangeField.d.ts +8 -0
  123. package/dist/src/UI/Core/CUITField.d.ts +6 -0
  124. package/dist/src/UI/Core/CheckboxField.d.ts +13 -0
  125. package/dist/src/UI/Core/CircleFilledIcon.d.ts +12 -0
  126. package/dist/src/UI/Core/CodeBlock.d.ts +6 -0
  127. package/dist/src/UI/Core/ColorConfiguration.d.ts +10 -0
  128. package/dist/src/UI/Core/ConfirmAndExecutePanel.d.ts +17 -0
  129. package/dist/src/UI/Core/CopyToClipboard.d.ts +8 -0
  130. package/dist/src/UI/Core/DateInputField.d.ts +18 -0
  131. package/dist/src/UI/Core/EmailField.d.ts +6 -0
  132. package/dist/src/UI/Core/FakeProgressBar.d.ts +2 -0
  133. package/dist/src/UI/Core/Login.d.ts +22 -0
  134. package/dist/src/UI/Core/LoginModal.d.ts +10 -0
  135. package/dist/src/UI/Core/LoginModalForm.d.ts +17 -0
  136. package/dist/src/UI/Core/ModalForm.d.ts +7 -0
  137. package/dist/src/UI/Core/ModalsManager.d.ts +46 -0
  138. package/dist/src/UI/Core/MoneyRangeField.d.ts +8 -0
  139. package/dist/src/UI/Core/NotifyBitField.d.ts +14 -0
  140. package/dist/src/UI/Core/NotifyError.d.ts +2 -0
  141. package/dist/src/UI/Core/NotifyInfo.d.ts +3 -0
  142. package/dist/src/UI/Core/NotifySuccess.d.ts +3 -0
  143. package/dist/src/UI/Core/NumberField.d.ts +22 -0
  144. package/dist/src/UI/Core/PasswordField.d.ts +24 -0
  145. package/dist/src/UI/Core/PhoneField.d.ts +8 -0
  146. package/dist/src/UI/Core/PinField.d.ts +22 -0
  147. package/dist/src/UI/Core/RadioGroupField.d.ts +20 -0
  148. package/dist/src/UI/Core/RecoverPassword.d.ts +23 -0
  149. package/dist/src/UI/Core/RecoverPasswordEmail.d.ts +16 -0
  150. package/dist/src/UI/Core/SearchFilterInput.d.ts +14 -0
  151. package/dist/src/UI/Core/SearchInput.d.ts +15 -0
  152. package/dist/src/UI/Core/SwitchField.d.ts +13 -0
  153. package/dist/src/UI/Core/TextAreaField.d.ts +21 -0
  154. package/dist/src/UI/Core/TextField.d.ts +25 -0
  155. package/dist/src/UI/Core/TimeField.d.ts +23 -0
  156. package/dist/src/UI/Core/ToggleActionIcon.d.ts +18 -0
  157. package/dist/src/UI/Core/UrlField.d.ts +6 -0
  158. package/dist/src/UI/Core/WeekPicker.d.ts +8 -0
  159. package/dist/src/UI/Core/WeekPickerField.d.ts +29 -0
  160. package/dist/src/UI/Core/createEntityForm.d.ts +4 -0
  161. package/dist/src/UI/Core/formatting.d.ts +7 -0
  162. package/dist/src/UI/Core/index.d.ts +73 -0
  163. package/dist/src/UI/Core/loginSupport.d.ts +1 -0
  164. package/dist/src/UI/Core/numberInputFormatters.d.ts +4 -0
  165. package/dist/src/UI/Core/openEntityForm.d.ts +16 -0
  166. package/dist/src/UI/Core/types.d.ts +32 -0
  167. package/dist/src/UI/Core/useAncestorResize.d.ts +13 -0
  168. package/dist/src/UI/Core/useCompleteFieldFromOther.d.ts +11 -0
  169. package/dist/src/UI/Core/useDebugProps.d.ts +1 -0
  170. package/dist/src/UI/Core/useDynamicContent.d.ts +7 -0
  171. package/dist/src/UI/Core/useEnterAsTAB.d.ts +1 -0
  172. package/dist/src/UI/Core/useEntityUI.d.ts +49 -0
  173. package/dist/src/UI/Core/useEvent.d.ts +1 -0
  174. package/dist/src/UI/Core/useExecuteExportProc.d.ts +7 -0
  175. package/dist/src/UI/Core/useExecuteLookup.d.ts +7 -0
  176. package/dist/src/UI/Core/useExecuteProc.d.ts +7 -0
  177. package/dist/src/UI/Core/useExecuteProcess.d.ts +7 -0
  178. package/dist/src/UI/Core/useExecuteServerAction.d.ts +8 -0
  179. package/dist/src/UI/Core/useExecuteView.d.ts +3 -0
  180. package/dist/src/UI/Core/useFirstVisible.d.ts +1 -0
  181. package/dist/src/UI/Core/useHierarchyKeys.d.ts +8 -0
  182. package/dist/src/UI/Core/useIsLoggedIn.d.ts +14 -0
  183. package/dist/src/UI/Core/useLocaleFormat.d.ts +14 -0
  184. package/dist/src/UI/Core/useLogin.d.ts +13 -0
  185. package/dist/src/UI/Core/useOpenForm.d.ts +24 -0
  186. package/dist/src/UI/Core/useOperationStatusCallback.d.ts +11 -0
  187. package/dist/src/UI/Core/useParentKeys.d.ts +9 -0
  188. package/dist/src/UI/Core/usePreventEnterSubmission.d.ts +2 -0
  189. package/dist/src/UI/Core/useResponsiveWidth.d.ts +1 -0
  190. package/dist/src/UI/Core/useTextTransform.d.ts +10 -0
  191. package/dist/src/UI/Core/useViewState.d.ts +14 -0
  192. package/dist/src/UI/Core/useViewportDynamicVariables.d.ts +4 -0
  193. package/dist/src/UI/DataGrid/DataGrid.d.ts +3 -0
  194. package/dist/src/UI/DataGrid/DataGrid.types.d.ts +63 -0
  195. package/dist/src/UI/DataGrid/DataGridActionsToolbar.d.ts +26 -0
  196. package/dist/src/UI/DataGrid/DataGridColumnsMenu.d.ts +7 -0
  197. package/dist/src/UI/DataGrid/DataGridForm.d.ts +13 -0
  198. package/dist/src/UI/DataGrid/DataGridPage.d.ts +16 -0
  199. package/dist/src/UI/DataGrid/DataGridToolbar.d.ts +59 -0
  200. package/dist/src/UI/DataGrid/ToolBarFunctions.d.ts +7 -0
  201. package/dist/src/UI/DataGrid/index.d.ts +9 -0
  202. package/dist/src/UI/DataGrid/useDataGridToolbarFilters.d.ts +37 -0
  203. package/dist/src/UI/DataGrid/useDatagrid.d.ts +32 -0
  204. package/dist/src/UI/DataGrid/useDatagridForm.d.ts +19 -0
  205. package/dist/src/UI/DataGrid/useViewFiltersForm.d.ts +4 -0
  206. package/dist/src/UI/DataGridView/DataGridView.d.ts +3 -0
  207. package/dist/src/UI/DataMap/DataMap.d.ts +41 -0
  208. package/dist/src/UI/DataMap/DataMapForm.d.ts +13 -0
  209. package/dist/src/UI/DataMap/DataMapGrid.d.ts +15 -0
  210. package/dist/src/UI/DataMap/DataMapPage.d.ts +18 -0
  211. package/dist/src/UI/DataMap/colorTools.d.ts +34 -0
  212. package/dist/src/UI/DataMap/index.d.ts +8 -0
  213. package/dist/src/UI/DataMap/useCreateMarkerOptions.d.ts +41 -0
  214. package/dist/src/UI/DataMap/useDefaultClusterRenderer.d.ts +4 -0
  215. package/dist/src/UI/DataMap/useGoogleMarkerSVGConverter.d.ts +14 -0
  216. package/dist/src/UI/DataMap/useRecordGroupManager.d.ts +19 -0
  217. package/dist/src/UI/DataMap/useSpiderifyMarkers.d.ts +0 -0
  218. package/dist/src/UI/DataRegion/DataRegion.d.ts +11 -0
  219. package/dist/src/UI/DataRegion/index.d.ts +1 -0
  220. package/dist/src/UI/DataView/DataView.d.ts +3 -0
  221. package/dist/src/UI/DataView/DataView.types.d.ts +72 -0
  222. package/dist/src/UI/DataView/DataViewCardContainer.d.ts +10 -0
  223. package/dist/src/UI/DataView/DataViewPage.d.ts +8 -0
  224. package/dist/src/UI/DataView/index.d.ts +5 -0
  225. package/dist/src/UI/DataView/useDataView.d.ts +33 -0
  226. package/dist/src/UI/DeveloperToolsPanel/DeveloperToolsPanel.d.ts +6 -0
  227. package/dist/src/UI/DeveloperToolsPanel/index.d.ts +1 -0
  228. package/dist/src/UI/EntityCard/EntityCard.d.ts +23 -0
  229. package/dist/src/UI/EntityCard/index.d.ts +1 -0
  230. package/dist/src/UI/FileUploader/FileUploader.d.ts +25 -0
  231. package/dist/src/UI/FileUploader/FilesUploadForm.d.ts +16 -0
  232. package/dist/src/UI/FileUploader/ImageEditor.d.ts +68 -0
  233. package/dist/src/UI/FileUploader/ImagePreview.d.ts +7 -0
  234. package/dist/src/UI/FileUploader/PDFPreview.d.ts +3 -0
  235. package/dist/src/UI/FileUploader/getFileType.d.ts +2 -0
  236. package/dist/src/UI/FileUploader/index.d.ts +7 -0
  237. package/dist/src/UI/FileUploader/useFileUpload.d.ts +63 -0
  238. package/dist/src/UI/FileUploader/useFilesUploadForm.d.ts +19 -0
  239. package/dist/src/UI/Form/EntityForm.d.ts +28 -0
  240. package/dist/src/UI/Form/EntityFormModal.d.ts +19 -0
  241. package/dist/src/UI/Form/EntityFormPage.d.ts +11 -0
  242. package/dist/src/UI/Form/MantineFormHelpers.d.ts +5 -0
  243. package/dist/src/UI/Form/StepperForm.d.ts +29 -0
  244. package/dist/src/UI/Form/index.d.ts +8 -0
  245. package/dist/src/UI/Form/queryStringFunctions.d.ts +5 -0
  246. package/dist/src/UI/Form/useEntityForm.d.ts +48 -0
  247. package/dist/src/UI/Form/useFieldConfiguration.d.ts +18 -0
  248. package/dist/src/UI/GoogleMaps/GoogleAddressAutocomplete.d.ts +21 -0
  249. package/dist/src/UI/GoogleMaps/GoogleMap.d.ts +10 -0
  250. package/dist/src/UI/GoogleMaps/GoogleMapCluster.d.ts +22 -0
  251. package/dist/src/UI/GoogleMaps/GoogleMapRegionSelector.d.ts +2 -0
  252. package/dist/src/UI/GoogleMaps/GoogleMapRegionSelectorMap.d.ts +6 -0
  253. package/dist/src/UI/GoogleMaps/GoogleMapRegionSelectorTypes.d.ts +57 -0
  254. package/dist/src/UI/GoogleMaps/GoogleMapRegionsSelectorStyles.d.ts +8 -0
  255. package/dist/src/UI/GoogleMaps/GoogleMapsInfoWindow.d.ts +5 -0
  256. package/dist/src/UI/GoogleMaps/GoogleMarker.d.ts +16 -0
  257. package/dist/src/UI/GoogleMaps/InfoWindowPortal.d.ts +5 -0
  258. package/dist/src/UI/GoogleMaps/Mapping.types.d.ts +48 -0
  259. package/dist/src/UI/GoogleMaps/functions.d.ts +3 -0
  260. package/dist/src/UI/GoogleMaps/index.d.ts +21 -0
  261. package/dist/src/UI/GoogleMaps/mappingRulesDefinition.d.ts +5 -0
  262. package/dist/src/UI/GoogleMaps/useCreateGoogleMap.d.ts +11 -0
  263. package/dist/src/UI/GoogleMaps/useCreateGoogleMapCluster.d.ts +11 -0
  264. package/dist/src/UI/GoogleMaps/useGoogleAddressAutocomplete.d.ts +16 -0
  265. package/dist/src/UI/GoogleMaps/useGoogleAddressMapping.d.ts +4 -0
  266. package/dist/src/UI/GoogleMaps/useGoogleAddressMappingRules.d.ts +6 -0
  267. package/dist/src/UI/GoogleMaps/useGoogleMap.d.ts +10 -0
  268. package/dist/src/UI/GoogleMaps/useGoogleMapRegionSelector.d.ts +14 -0
  269. package/dist/src/UI/GoogleMaps/useGoogleMapsStreetViewImage.d.ts +1 -0
  270. package/dist/src/UI/Grid/Grid.d.ts +48 -0
  271. package/dist/src/UI/Grid/GridGlobalStyles.d.ts +1 -0
  272. package/dist/src/UI/Grid/W2Grid.d.ts +69 -0
  273. package/dist/src/UI/Grid/index.d.ts +2 -0
  274. package/dist/src/UI/Grid/useGrid.d.ts +8 -0
  275. package/dist/src/UI/Grid/useW2ColumnRender.d.ts +21 -0
  276. package/dist/src/UI/ImportData/index.d.ts +6 -0
  277. package/dist/src/UI/ImportData/types.d.ts +4 -0
  278. package/dist/src/UI/ImportData/useEntityCSVImportValidation.d.ts +12 -0
  279. package/dist/src/UI/ImportData/useExportToExcel.d.ts +9 -0
  280. package/dist/src/UI/ImportData/useImportData.d.ts +8 -0
  281. package/dist/src/UI/ImportData/useImportDataForm.d.ts +17 -0
  282. package/dist/src/UI/Lookup/Lookup.d.ts +32 -0
  283. package/dist/src/UI/Lookup/LookupForm.d.ts +13 -0
  284. package/dist/src/UI/Lookup/LookupFormAction.d.ts +24 -0
  285. package/dist/src/UI/Lookup/index.d.ts +6 -0
  286. package/dist/src/UI/Lookup/useLookup.d.ts +35 -0
  287. package/dist/src/UI/Lookup/useLookupEntity.d.ts +12 -0
  288. package/dist/src/UI/Lookup/useLookupForm.d.ts +28 -0
  289. package/dist/src/UI/LookupMultiSelect/LookupMultiSelect.d.ts +19 -0
  290. package/dist/src/UI/LookupMultiSelect/index.d.ts +2 -0
  291. package/dist/src/UI/LookupMultiSelect/useLookupMultiSelectInputProps.d.ts +17 -0
  292. package/dist/src/UI/LookupSelect/LookupSelect.d.ts +32 -0
  293. package/dist/src/UI/LookupSelect/index.d.ts +3 -0
  294. package/dist/src/UI/LookupSelect/useLookupSelect.d.ts +22 -0
  295. package/dist/src/UI/LookupSelect/useLookupSelectInputProps.d.ts +17 -0
  296. package/dist/src/UI/Menu/MenuItem.d.ts +20 -0
  297. package/dist/src/UI/Menu/MenuNavBar.d.ts +17 -0
  298. package/dist/src/UI/Menu/MenuNavBarPanel.d.ts +16 -0
  299. package/dist/src/UI/Menu/MenuNavLinks.d.ts +19 -0
  300. package/dist/src/UI/Menu/caseInsensitveAccentInsensitiveFilter.d.ts +3 -0
  301. package/dist/src/UI/Menu/index.d.ts +6 -0
  302. package/dist/src/UI/Menu/useMenuContent.d.ts +40 -0
  303. package/dist/src/UI/MultiDataMap/MultiDataMap.d.ts +50 -0
  304. package/dist/src/UI/MultiDataMap/MultiDataMapActionsToolbar.d.ts +20 -0
  305. package/dist/src/UI/MultiDataMap/MultiDataMapForm.d.ts +13 -0
  306. package/dist/src/UI/MultiDataMap/MultiDataMapPage.d.ts +23 -0
  307. package/dist/src/UI/MultiDataMap/index.d.ts +4 -0
  308. package/dist/src/UI/MultiDataMap/useMultiDataMapGrid.d.ts +128 -0
  309. package/dist/src/UI/RegionSelector/RegionSelector.d.ts +26 -0
  310. package/dist/src/UI/RegionSelector/RegionSelectorItem.d.ts +5 -0
  311. package/dist/src/UI/RegionSelector/index.d.ts +2 -0
  312. package/dist/src/UI/Router/Link.d.ts +6 -0
  313. package/dist/src/UI/Router/MicroMRouter.d.ts +4 -0
  314. package/dist/src/UI/Router/MicroMRouterState.d.ts +12 -0
  315. package/dist/src/UI/Router/Route.d.ts +5 -0
  316. package/dist/src/UI/Router/index.d.ts +6 -0
  317. package/dist/src/UI/Router/useMicroMRouter.d.ts +3 -0
  318. package/dist/src/UI/Router/useNavigation.d.ts +2 -0
  319. package/dist/src/UI/Stats/RingProgressField.d.ts +22 -0
  320. package/dist/src/UI/Stats/index.d.ts +1 -0
  321. package/dist/src/UI/index.d.ts +25 -0
  322. package/dist/src/Validation/CUITValidator.d.ts +2 -0
  323. package/dist/src/Validation/CommonValidators.d.ts +23 -0
  324. package/dist/src/Validation/CustomValidator.d.ts +2 -0
  325. package/dist/src/Validation/DigitsValidator.d.ts +2 -0
  326. package/dist/src/Validation/EmailValidator.d.ts +2 -0
  327. package/dist/src/Validation/IntegerValidator.d.ts +2 -0
  328. package/dist/src/Validation/PhoneValidator.d.ts +2 -0
  329. package/dist/src/Validation/UrlValidator.d.ts +2 -0
  330. package/dist/src/Validation/combineValidators.d.ts +5 -0
  331. package/dist/src/Validation/index.d.ts +10 -0
  332. package/dist/src/Validation/validationTypes.d.ts +3 -0
  333. package/dist/src/client/DataStorage.d.ts +12 -0
  334. package/dist/src/client/ImpDataResult.d.ts +6 -0
  335. package/dist/src/client/JSONDateWithTimezoneReplacer.d.ts +1 -0
  336. package/dist/src/client/MenuRoutesMapping.d.ts +25 -0
  337. package/dist/src/client/MicroMError.d.ts +12 -0
  338. package/dist/src/client/MicroMToken.d.ts +16 -0
  339. package/dist/src/client/MicromClient.d.ts +65 -0
  340. package/dist/src/client/OperationStatus.d.ts +11 -0
  341. package/dist/src/client/PublicEndpoint.d.ts +15 -0
  342. package/dist/src/client/RecordReader.d.ts +8 -0
  343. package/dist/src/client/TimeoutSignal.d.ts +9 -0
  344. package/dist/src/client/TokenStorage.d.ts +13 -0
  345. package/dist/src/client/client.types.d.ts +25 -0
  346. package/dist/src/client/index.d.ts +11 -0
  347. package/dist/src/index.d.ts +6 -0
  348. package/dist/src/setupTests.d.ts +0 -0
  349. package/package.json +21 -5
  350. package/dist/index.css.map +0 -1
  351. package/dist/index.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/client/RecordReader.ts","../src/client/PublicEndpoint.ts","../src/UI/LookupSelect/useLookupSelect.tsx","../src/UI/LookupSelect/useLookupSelectInputProps.ts","../src/UI/LookupSelect/LookupSelect.tsx","../src/UI/Actions/EntityActionButton.tsx","../src/UI/Stats/RingProgressField.tsx","../src/UI/LookupMultiSelect/useLookupMultiSelectInputProps.ts","../src/UI/LookupMultiSelect/LookupMultiSelect.tsx","../src/DataDictionary/Categories/CategoriesDef.ts","../src/DataDictionary/Categories/Categories.ts","../src/DataDictionary/Categories/CategoriesValuesDef.ts","../src/DataDictionary/Categories/CategoriesValues.ts","../src/DataDictionary/Categories/CategoriesForm.tsx","../src/DataDictionary/Config/catAuthenticationType.ts","../src/DataDictionary/Config/catUserTypes.ts","../src/DataDictionary/Config/catIdentityProviderRoles.ts","../src/DataDictionary/Config/catFileStorageTypes.ts","../src/DataDictionary/MicromUsersGroups/MicromUsersGroupsDef.ts","../src/DataDictionary/MicromUsersGroups/MicromUsersGroups.ts","../src/DataDictionary/MicromUsersGroupsMenus/ACTDisableMenus.tsx","../src/DataDictionary/MicromUsersGroupsMenus/ACTEnableMenus.tsx","../src/DataDictionary/MicromUsersGroupsMenus/MicromUsersGroupsMenusColumnsOverrides.tsx","../src/DataDictionary/MicromUsersGroupsMenus/MicromUsersGroupsMenusDef.ts","../src/DataDictionary/MicromUsersGroupsMenus/MicromUsersGroupsMenus.ts","../src/DataDictionary/MicromUsersGroups/MicromUsersGroupsForm.tsx","../src/DataDictionary/MicromUsers/MicromUsersDef.ts","../src/DataDictionary/MicromUsers/MicromUsers.ts","../src/DataDictionary/MicromUsers/MicromUsersForm.tsx","../src/DataDictionary/MicromUsers/MicromUsersStatusPanelColumns.ts","../src/DataDictionary/MicromUsers/MicromUsersStatusPanel.tsx","../src/DataDictionary/FileStore/FileStoreDef.ts","../src/DataDictionary/FileStore/FileStore.ts","../src/DataDictionary/FileStoreStatus/FileStoreStatusDef.ts","../src/DataDictionary/FileStoreStatus/FileStoreStatus.ts","../src/DataDictionary/Status/StatusDef.ts","../src/DataDictionary/Status/Status.ts","../src/DataDictionary/Status/StatusValuesDef.ts","../src/DataDictionary/Status/StatusValues.ts","../src/DataDictionary/MicromUsersGroupsMembers/MicromUsersGroupsMembersDef.ts","../src/DataDictionary/MicromUsersGroupsMembers/MicromUsersGroupsMembers.ts","../src/DataDictionary/ImportEntityData/ImportEntityDataForm.tsx","../src/DataDictionary/EmailConfiguration/EmailServiceConfigurationDef.ts","../src/DataDictionary/EmailConfiguration/EmailServiceConfiguration.ts","../src/DataDictionary/EmailConfiguration/EmailServiceConfigurationForm.tsx","../src/DataDictionary/MicromDeveloperToolsCodeGen/MicromDeveloperToolsCodeGenDef.ts","../src/DataDictionary/MicromDeveloperToolsCodeGen/MicromDeveloperToolsCodeGen.tsx","../src/DataDictionary/MicromDeveloperToolsCodeGen/MicromDeveloperToolsCodeGenForm.tsx","../src/DataDictionary/MicromEntitiesTypes/ACTMicromGeneratedCode.tsx","../src/DataDictionary/MicromEntitiesTypes/MicromEntitiesTypesDef.ts","../src/DataDictionary/MicromEntitiesTypes/MicromEntitiesTypes.tsx","../src/UI/FileUploader/ImageEditor.tsx","../src/UI/FileUploader/useFileUpload.tsx","../src/UI/FileUploader/getFileType.ts","../src/UI/FileUploader/ImagePreview.tsx","../src/UI/FileUploader/PDFPreview.tsx","../src/UI/FileUploader/FileUploader.tsx","../src/UI/FileUploader/FilesUploadForm.tsx","../src/UI/FileUploader/useFilesUploadForm.tsx","../src/UI/Router/useMicroMRouter.ts","../src/UI/Menu/MenuNavLinks.tsx","../src/UI/Menu/MenuNavBar.tsx","../src/UI/Menu/MenuNavBarPanel.tsx","../src/UI/Router/MicroMRouterState.ts","../src/UI/Menu/useMenuContent.tsx","../src/UI/Menu/caseInsensitveAccentInsensitiveFilter.ts","../src/UI/DataView/useDataView.tsx","../src/UI/DataView/DataViewCardContainer.tsx","../src/UI/DataView/DataView.tsx","../src/UI/DataView/DataViewPage.tsx","../src/UI/AvatarUploader/AvatarUploader.tsx","../src/UI/AvatarUploader/useAvatarUploader.tsx","../src/UI/Router/Link.tsx","../src/UI/Router/useNavigation.ts","../src/UI/Router/MicroMRouter.tsx","../src/UI/Router/Route.tsx","../src/GoogleMapsAPI/GoogleMapsAPILoader.ts","../src/GoogleMapsAPI/useGoogleMapsAPI.ts","../src/UI/GoogleMaps/mappingRulesDefinition.ts","../src/UI/GoogleMaps/useGoogleAddressMapping.ts","../src/UI/GoogleMaps/useGoogleAddressAutocomplete.tsx","../src/UI/GoogleMaps/GoogleAddressAutocomplete.tsx","../src/UI/GoogleMaps/GoogleMapRegionsSelectorStyles.ts","../src/UI/GoogleMaps/GoogleMapRegionSelectorTypes.ts","../src/UI/GoogleMaps/functions.ts","../src/UI/GoogleMaps/useGoogleMap.ts","../src/UI/GoogleMaps/useGoogleMapRegionSelector.ts","../src/UI/GoogleMaps/GoogleMapRegionSelector.tsx","../src/UI/GoogleMaps/GoogleMarker.tsx","../src/UI/GoogleMaps/useCreateGoogleMap.tsx","../src/UI/GoogleMaps/GoogleMap.tsx","../src/UI/GoogleMaps/Mapping.types.ts","../src/UI/GoogleMaps/useGoogleAddressMappingRules.ts","../src/UI/GoogleMaps/InfoWindowPortal.tsx","../src/UI/GoogleMaps/GoogleMapsInfoWindow.tsx","../src/UI/DataMap/useDefaultClusterRenderer.ts","../src/UI/GoogleMaps/useCreateGoogleMapCluster.tsx","../src/UI/GoogleMaps/GoogleMapCluster.tsx","../src/UI/GoogleMaps/useGoogleMapsStreetViewImage.ts","../src/UI/GoogleMaps/GoogleMapRegionSelectorMap.tsx","../src/UI/AddressInput/AddressAutocomplete.tsx","../src/UI/AddressInput/AddressMapMarker.tsx","../src/UI/AddressInput/AddressSearch.tsx","../src/UI/AddressInput/AddressSearchForm.tsx","../src/UI/AddressInput/useAddressSearchForm.tsx","../src/UI/AddressInput/AddressLookup.tsx","../src/UI/DataMap/DataMapGrid.tsx","../src/UI/DataMap/colorTools.ts","../src/UI/DataMap/useGoogleMarkerSVGConverter.ts","../src/UI/DataMap/useCreateMarkerOptions.ts","../src/UI/DataMap/useRecordGroupManager.ts","../src/UI/DataMap/DataMap.tsx","../src/UI/DataMap/DataMapPage.tsx","../src/UI/DataMap/DataMapForm.tsx","../src/UI/MultiDataMap/MultiDataMapActionsToolbar.tsx","../src/UI/MultiDataMap/useMultiDataMapGrid.ts","../src/UI/MultiDataMap/MultiDataMap.tsx","../src/UI/MultiDataMap/MultiDataMapPage.tsx","../src/UI/MultiDataMap/MultiDataMapForm.tsx","../src/UI/RegionSelector/RegionSelectorItem.tsx","../src/UI/RegionSelector/RegionSelector.tsx","../src/UI/DataRegion/DataRegion.tsx","../src/UI/DeveloperToolsPanel/DeveloperToolsPanel.tsx"],"sourcesContent":["import { DataResult, Value } from \"./client.types\";\r\n\r\nexport class RecordReader {\r\n private dataResult: DataResult;\r\n private headerIndexCache: { [key: string]: number };\r\n\r\n constructor(dataResult: DataResult) {\r\n this.dataResult = dataResult;\r\n this.headerIndexCache = this.createHeaderIndexCache();\r\n }\r\n\r\n private createHeaderIndexCache(): { [key: string]: number } {\r\n const cache: { [key: string]: number } = {};\r\n this.dataResult.Header.forEach((header, index) => {\r\n cache[header] = index;\r\n });\r\n return cache;\r\n }\r\n\r\n getValue(recordIndex: number, headerName: string): Value | undefined {\r\n const headerIndex = this.headerIndexCache[headerName];\r\n if (headerIndex === undefined || recordIndex >= this.dataResult.records.length) {\r\n return undefined;\r\n }\r\n\r\n const record = this.dataResult.records[recordIndex];\r\n return record[headerIndex];\r\n }\r\n}\r\n","\r\nexport enum EndpointAccess {\r\n None = 0,\r\n Create = 1 << 0,\r\n Update = 1 << 1,\r\n Delete = 1 << 2,\r\n Get = 1 << 3,\r\n Lookup = 1 << 4,\r\n Execute = 1 << 5,\r\n}\r\n\r\nexport interface PublicEndpoint {\r\n EntityName: string,\r\n AllowedAccess: EndpointAccess,\r\n AllowedProcs?: Set<string>,\r\n AllowedActions?: Set<string>\r\n}","import { SelectItem } from \"@mantine/core\";\r\nimport { ReactNode, useEffect } from \"react\";\r\nimport { Value, ValuesObject } from \"../../client\";\r\nimport { Entity, EntityColumn, EntityDefinition } from \"../../Entity\";\r\nimport { useExecuteView, useLocaleFormat, useStateReturnType } from \"../Core\";\r\nimport { UseEntityFormReturnType } from \"../Form\";\r\nimport { useLookupEntity, useLookupForm } from \"../Lookup\";\r\n\r\nexport interface UseLookupSelectOptions {\r\n parentKeys?: ValuesObject,\r\n selectDataState: useStateReturnType<SelectItem[]>,\r\n triggerRefreshState: useStateReturnType<boolean>,\r\n column: EntityColumn<Value>,\r\n entityForm: UseEntityFormReturnType,\r\n entity: Entity<EntityDefinition>,\r\n lookupDefName: string,\r\n maxItems?: number,\r\n includeKeyInDescription?: boolean,\r\n breadCrumbs?: ReactNode,\r\n}\r\nexport const useLookupSelect = (props: UseLookupSelectOptions) => {\r\n const { parentKeys, selectDataState, triggerRefreshState, column, entityForm,\r\n entity, lookupDefName, maxItems, includeKeyInDescription, breadCrumbs\r\n } = props;\r\n\r\n const [triggerRefresh, setTriggerRefresh] = triggerRefreshState;\r\n\r\n const localeFormat = useLocaleFormat({ timeZoneOffset: entity.API.client.TIMEZONE_OFFSET });\r\n\r\n const { lookupEntity, lookupDef, lookupViewName } = useLookupEntity({ entity, lookupDefName, parentKeys });\r\n\r\n const [selectData, setSelectData] = selectDataState;\r\n\r\n const openEditModal = useLookupForm();\r\n\r\n const handleEditOnClosed = () => {\r\n setTriggerRefresh((prev) => !prev);\r\n }\r\n\r\n const handleOnOK = (selectedKeys: ValuesObject[]) => {\r\n if (selectedKeys.length > 0) {\r\n const keys = selectedKeys[0];\r\n const key_index = lookupDef?.viewMapping?.keyIndex ?? 0;\r\n const value = keys[Object.keys(keys)[key_index]];\r\n entityForm.form.setFieldValue(column.name, value);\r\n }\r\n };\r\n\r\n const handleEditClick = () => {\r\n openEditModal({\r\n entity: lookupEntity!,\r\n enableAdd: true, enableEdit: true, enableDelete: true, enableView: true,\r\n parentKeys, viewName: lookupViewName, onClosed: handleEditOnClosed, onOK: handleOnOK, selectionMode: 'single', breadCrumbs: breadCrumbs\r\n })\r\n }\r\n\r\n const status = useExecuteView(lookupEntity, parentKeys, lookupViewName, undefined, maxItems?.toString(), triggerRefresh);\r\n\r\n const formStatus = entityForm.status;\r\n\r\n // MMC: Effect for setting the select data\r\n useEffect(() => {\r\n if ((formStatus.loading && status.operationType === 'get') || status.loading) return;\r\n\r\n if (status.data && status.data[0].records) {\r\n const keyIndex = lookupDef?.viewMapping?.keyIndex ?? 0;\r\n const descIndex = lookupDef?.viewMapping?.descriptionIndex ?? 1;\r\n\r\n // MMC: for working with objects as expected data format\r\n const tableData = status.data[0].records.map((record) => {\r\n const formatedDescription = localeFormat.formatValue(record[descIndex], status.data![0].typeInfo[descIndex]);\r\n const formatedKey = localeFormat.formatValue(record[keyIndex], status.data![0].typeInfo[descIndex]);\r\n return { value: record[keyIndex]?.toString(), label: (includeKeyInDescription === true) ? `${formatedKey} - ${formatedDescription}` : formatedDescription } as SelectItem;\r\n });\r\n\r\n setSelectData(tableData);\r\n\r\n } else {\r\n setSelectData([]);\r\n }\r\n\r\n }, [includeKeyInDescription, localeFormat.locale, status.loading, status.data, formStatus]);\r\n\r\n return {\r\n onEditClick: handleEditClick,\r\n status: status\r\n }\r\n\r\n}","import { SelectItem } from \"@mantine/core\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { Value } from \"../../client\";\r\nimport { EntityColumn } from \"../../Entity\";\r\nimport { UseEntityFormReturnType } from \"../Form\";\r\n\nexport interface UseLookupSelectInputPropsOptions {\n entityForm: UseEntityFormReturnType,\n column: EntityColumn<Value>,\n selectData: SelectItem[],\n}\n\nexport function useLookupSelectInputProps(props: UseLookupSelectInputPropsOptions) {\n const { entityForm, column, selectData } = props;\n\n const bindingColumnValue = entityForm.form.values[column.name];\n\n const resolvedBindingValue = useMemo(() => {\n if (bindingColumnValue !== undefined && bindingColumnValue !== null && typeof bindingColumnValue !== 'string') {\n console.error(`LookupSelect: Column.Value is not resolved to a string for column ${column.name}. This may cause unexpected behavior.`);\n return null;\n }\n\n if (typeof bindingColumnValue !== 'string') return null;\n\n return selectData.find(\n item =>\n typeof item.value === 'string' &&\n item.value.localeCompare(bindingColumnValue, undefined, { sensitivity: 'base' }) === 0\n )?.value ?? bindingColumnValue;\n }, [bindingColumnValue, column.name, selectData]);\n\n const { onChange: mantineOnChange, value: _mantineValue, ...inputProps } = entityForm.form.getInputProps(column.name);\n\n const handleSelectChange = useCallback((nextValue: string | null) => {\n if (typeof nextValue === 'string') {\n const matchedValue =\n selectData.find(\n item =>\n typeof item.value === 'string' &&\n item.value.localeCompare(nextValue, undefined, { sensitivity: 'base' }) === 0\n )?.value ?? nextValue;\n\n mantineOnChange(matchedValue);\n return;\n }\n\n mantineOnChange(nextValue);\n }, [mantineOnChange, selectData]);\n\n useEffect(() => {\n if (resolvedBindingValue) {\n const index = selectData.findIndex((item) => item.value === resolvedBindingValue);\n column.valueDescription = index >= 0 ? selectData[index].label : '';\n } else {\n column.valueDescription = '';\n }\n }, [column, resolvedBindingValue, selectData]);\n\n return {\n ...inputProps,\n value: resolvedBindingValue,\n onChange: handleSelectChange\n };\n}","import { ActionIcon, Button, Group, Loader, Select, SelectItem, SelectProps, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\"\r\nimport { IconSelector } from \"@tabler/icons-react\"\r\nimport { forwardRef, ReactNode, useState } from \"react\"\r\nimport { DataResult, DBStatusResult, OperationStatus, Value, ValuesObject } from \"../../client\"\r\nimport { Entity, EntityColumn, EntityColumnFlags, EntityDefinition } from \"../../Entity\"\r\nimport { ActionIconVariant, ButtonVariant, MicroMWidthSizes } from \"../Core\"\r\nimport { UseEntityFormReturnType, useFieldConfiguration } from \"../Form\"\r\nimport { useLookupSelect } from \"./useLookupSelect\"\r\nimport { useLookupSelectInputProps } from \"./useLookupSelectInputProps\"\r\n\r\n\r\nexport interface CustomSelectProps extends Omit<SelectProps, 'data'> { }\r\n\r\nexport interface LookupSelectOptions {\r\n parentKeys?: ValuesObject,\r\n column: EntityColumn<Value>,\r\n formStatus?: OperationStatus<DBStatusResult | DataResult | ValuesObject>,\r\n entityForm: UseEntityFormReturnType\r\n entity: Entity<EntityDefinition>,\r\n lookupDefName: string,\r\n enableEdit?: boolean,\r\n selectProps?: CustomSelectProps,\r\n editIcon?: React.ReactNode,\r\n editIconVariant?: ActionIconVariant,\r\n maxItems?: number,\r\n requiredLabel?: string,\r\n editLabel?: string,\r\n includeKeyInDescription?: boolean,\r\n withinPortal?: boolean,\r\n zIndex?: number,\r\n editButtonVariant?: ButtonVariant,\r\n breadCrumbs?: ReactNode,\r\n maxWidth?: keyof typeof MicroMWidthSizes,\r\n minWidth?: keyof typeof MicroMWidthSizes,\r\n}\r\n\r\nexport const LookupSelectDefaultProps: Partial<LookupSelectOptions> = {\r\n enableEdit: false,\r\n maxItems: 0,\r\n requiredLabel: \"A value from the list is required\",\r\n editLabel: \"Edit\",\r\n includeKeyInDescription: false,\r\n withinPortal: true,\r\n zIndex: 100000,\r\n editButtonVariant: \"light\",\r\n editIconVariant: \"light\",\r\n minWidth: \"sm\",\r\n selectProps: {\r\n searchable: true,\r\n maxDropdownHeight: 260,\r\n clearable: true,\r\n }\r\n}\r\n\r\nexport const LookupSelect = forwardRef<HTMLInputElement, LookupSelectOptions>(function LookupSelect(props: LookupSelectOptions, ref) {\r\n const {\r\n parentKeys, column, formStatus,\r\n entityForm, entity, lookupDefName, enableEdit,\r\n editIcon, editIconVariant, selectProps, maxItems,\r\n requiredLabel, editLabel, includeKeyInDescription,\r\n withinPortal, zIndex, breadCrumbs, maxWidth, minWidth\r\n } = useComponentDefaultProps('LookupSelect', LookupSelectDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const { formMode, form } = entityForm;\r\n\r\n const triggerRefreshState = useState<boolean>(true);\r\n const selectDataState = useState<SelectItem[]>([]);\r\n const [selectData] = selectDataState;\r\n\r\n const lookupSelectAPI = useLookupSelect({ parentKeys, selectDataState, triggerRefreshState, column, entityForm, entity, lookupDefName, maxItems, includeKeyInDescription, breadCrumbs });\r\n\r\n const inputProps = useLookupSelectInputProps({ entityForm, column, selectData });\r\n\r\n const [showDescription,] = entityForm.showDescriptionState;\r\n\r\n const resolvedSelectProps: CustomSelectProps = {\r\n ...(selectProps ?? {}),\r\n miw: selectProps?.miw ?? (minWidth !== 'auto' && minWidth !== undefined) ? MicroMWidthSizes[minWidth!] : undefined,\r\n maw: selectProps?.maw ?? (maxWidth !== 'auto' && maxWidth !== undefined) ? MicroMWidthSizes[maxWidth!] : undefined,\r\n label: selectProps?.label ?? column.prompt,\r\n description: showDescription ? (selectProps?.description ?? column.description) : ''\r\n };\r\n\r\n useFieldConfiguration({ entityForm, column, required: resolvedSelectProps?.required, requiredMessage: requiredLabel });\r\n \r\n const readoOnlyResult = resolvedSelectProps?.readOnly || entityForm.formMode === 'view' || lookupSelectAPI.status.loading || formStatus?.loading || (column.hasFlag(EntityColumnFlags.pk) && entityForm.formMode !== 'add') ? true : false;\r\n\r\n return (\r\n <Select\r\n {...resolvedSelectProps}\r\n withAsterisk={resolvedSelectProps.withAsterisk ?? (!resolvedSelectProps.readOnly && !(entityForm.formMode === 'view') && (resolvedSelectProps.required ?? !column.hasFlag(EntityColumnFlags.nullable)))}\r\n withinPortal={withinPortal}\r\n zIndex={zIndex}\r\n icon={lookupSelectAPI.status.loading ? <Loader size=\"xs\" /> : resolvedSelectProps.icon}\r\n data={selectData}\r\n readOnly={readoOnlyResult}\r\n error={lookupSelectAPI.status.error ? lookupSelectAPI.status.error.message : null}\r\n // MMC: this is how we hack the styles let the chevron work showing the list and the edit button be clickable\r\n styles={() => ({\r\n rightSection: { pointerEvents: (editIcon ? \"none\" : \"all\") }\r\n })}\r\n rightSection={enableEdit &&\r\n <Group spacing=\"xs\">\r\n <IconSelector size=\"1rem\" />\r\n {editIcon &&\r\n <ActionIcon style={{ pointerEvents: 'all' }} size=\"md\" color={theme.primaryColor} variant={editIconVariant} onClick={lookupSelectAPI.onEditClick}>\r\n {editIcon}\r\n </ActionIcon>\r\n }\r\n {!editIcon &&\r\n <Button size=\"xs\" mr=\"xs\" variant=\"light\" onClick={lookupSelectAPI.onEditClick}>{editLabel}</Button>\r\n }\r\n </Group>\r\n }\r\n rightSectionWidth={(enableEdit) ? \"auto\" : undefined}\r\n {...inputProps}\r\n ref={ref}\r\n />\r\n )\r\n});\r\n","import { Button, ButtonProps } from \"@mantine/core\";\r\nimport { ValuesObject } from \"../../client\";\r\nimport { Entity, EntityClientAction, EntityDefinition } from \"../../Entity\";\r\nimport { useModal } from \"../Core\";\r\n\r\nexport interface EntityActionButtonProps extends Omit<ButtonProps, 'leftIcon'> {\r\n entity: Entity<EntityDefinition>,\r\n action: EntityClientAction,\r\n selectedKeys?: ValuesObject[],\r\n label?: string,\r\n onClose?: (result?: boolean) => Promise<boolean>\r\n}\r\n\r\n//const TestAction: EntityClientAction = {\r\n// title: 'test',\r\n// label: 'test',\r\n// name: 'test',\r\n// onClick: async ({ entity, modal, modalProps, selectedKeys }) => {\r\n// const editEntity = Entity.clone(entity);\r\n// setValues(editEntity.def.columns, selectedKeys?.[0], null, true);\r\n\r\n// await modal?.open({\r\n// content: <></>,\r\n// modalProps: modalProps ?? {}\r\n// })\r\n// }\r\n//}\r\n\r\nexport function EntityActionButton(props: EntityActionButtonProps) {\r\n const modal = useModal();\r\n const { entity, action, selectedKeys, label, onClose, ...rest } = props;\r\n\r\n\r\n return (\r\n <Button leftIcon={action.icon} onClick={async () => {\r\n await action.onClick({\r\n entity, modal, selectedKeys, onClose\r\n });\r\n }}\r\n {...rest}\r\n >\r\n {label || action.label}\r\n </Button>\r\n )\r\n}","import { Card, CardProps, Center, DefaultMantineColor, Group, MantineColor, RingProgress, Text, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconProps } from \"@tabler/icons-react\";\r\nimport { ReactNode } from \"react\";\r\nimport { EntityColumn } from \"../../Entity\";\r\n\r\nexport interface RingProgressFieldProps extends Omit<CardProps, 'children'> {\r\n column: EntityColumn<number>,\r\n loading?: boolean,\r\n title?: string,\r\n description?: string,\r\n centerIcon?: (props: IconProps) => ReactNode,\r\n centerLabel?: ReactNode,\r\n maxValue?: number,\r\n color?: DefaultMantineColor,\r\n ringSize?: number,\r\n thickness?: number,\r\n iconSize?: string | number,\r\n displayPercent?: 'percent' | 'fraction' | 'none',\r\n showPercentAsCenterLabel?: boolean,\r\n iconColor?: MantineColor,\r\n}\r\n\r\nexport const RingProgressFieldDefaultProps: Partial<RingProgressFieldProps> = {\r\n maxValue: 100,\r\n ringSize: 65,\r\n thickness: 7,\r\n iconSize: \"1.1rem\",\r\n displayPercent: 'none',\r\n color: 'blue',\r\n p: \"xs\",\r\n withBorder: true\r\n}\r\n\r\nexport function RingProgressField(props: RingProgressFieldProps) {\r\n const {\r\n centerIcon, column, title, description, color, maxValue, ringSize, thickness, iconSize, displayPercent,\r\n centerLabel, showPercentAsCenterLabel, iconColor, ...others\r\n } = useComponentDefaultProps('RingProgressField', RingProgressFieldDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const Icon = centerIcon!;\r\n\r\n const progress = isNaN(((column.value ?? 0) / maxValue!) * 100) ? 0 : ((column.value ?? 0) / maxValue!) * 100;\r\n\r\n const percentIconLabel = showPercentAsCenterLabel ? <Text weight=\"bolder\" align=\"center\" color={iconColor} size=\"xs\">{progress.toFixed(0)}%</Text> : undefined;\r\n\r\n const iconLabel = centerIcon ? <Center><Icon size={iconSize} stroke={1.5} color={iconColor} /></Center> : undefined\r\n\r\n const percent = (displayPercent === 'none' || undefined) ? '' : (displayPercent === 'percent' ? ` ${progress.toFixed(2)}` : ` ${column.value}/${maxValue}`);\r\n\r\n return (\r\n <Card key={column.name} {...others}>\r\n <Group>\r\n <RingProgress\r\n size={ringSize}\r\n roundCaps\r\n thickness={thickness}\r\n sections={[{ value: progress, color: color! }]}\r\n label={iconLabel || percentIconLabel || centerLabel}\r\n />\r\n <div style={{ flex: 1 }}>\r\n <Text weight={500} color={theme.colorScheme === 'dark' ? theme.white : theme.colors.gray[9]} size=\"sm\">\r\n {title ?? column.prompt}{percent}\r\n </Text>\r\n <Text size=\"sm\" color={theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6]}>\r\n {description ?? column.description}\r\n </Text>\r\n </div>\r\n </Group>\r\n </Card>\r\n )\r\n}","import { SelectItem } from \"@mantine/core\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { Value } from \"../../client\";\r\nimport { EntityColumn } from \"../../Entity\";\r\nimport { UseEntityFormReturnType } from \"../Form\";\r\n\nexport interface UseLookupMultiSelectInputPropsOptions {\n entityForm: UseEntityFormReturnType,\n column: EntityColumn<Value>,\n selectData: SelectItem[],\n}\n\nexport function useLookupMultiSelectInputProps(props: UseLookupMultiSelectInputPropsOptions) {\n const { entityForm, column, selectData } = props;\n\n const bindingColumnValue = entityForm.form.values[column.name];\n\n const resolvedValues = useMemo(() => {\n const values = Array.isArray(bindingColumnValue)\n ? bindingColumnValue\n : (bindingColumnValue === null || bindingColumnValue === undefined || bindingColumnValue === '')\n ? []\n : [bindingColumnValue];\n\n return values.map((value) => {\n const stringValue = String(value);\n return selectData.find(\n item =>\n typeof item.value === 'string' &&\n item.value.localeCompare(stringValue, undefined, { sensitivity: 'base' }) === 0\n )?.value ?? stringValue;\n });\n }, [bindingColumnValue, selectData]);\n\n const { onChange: mantineOnChange, value: _mantineValue, ...inputProps } = entityForm.form.getInputProps(column.name);\n\n const handleMultiSelectChange = useCallback((nextValues: string[]) => {\n const normalizedValues = (nextValues ?? []).map((value) =>\n selectData.find(\n item =>\n typeof item.value === 'string' &&\n item.value.localeCompare(value, undefined, { sensitivity: 'base' }) === 0\n )?.value ?? value\n );\n\n mantineOnChange(normalizedValues);\n }, [mantineOnChange, selectData]);\n\n useEffect(() => {\n if (!column.isArray) return;\n\n // Mantiene el comportamiento previo para casos de mount/unmount antes de cargar data\n if (column.value && selectData.length === 0) return;\n\n const descriptions = resolvedValues.map((value) => {\n const index = selectData.findIndex((item) => item.value === value);\n return index >= 0 ? selectData[index].label : '';\n });\n\n column.valueDescription = descriptions.join(', ');\n }, [column, resolvedValues, selectData]);\n\n return {\n ...inputProps,\n value: resolvedValues,\n onChange: handleMultiSelectChange\n };\n}","import { Group, GroupProps, Loader, MultiSelect, MultiSelectProps, SelectItem, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\"\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\"\r\nimport { DataResult, DBStatusResult, OperationStatus, Value, ValuesObject } from \"../../client\"\r\nimport { Entity, EntityColumn, EntityColumnFlags, EntityDefinition } from \"../../Entity\"\r\nimport { UseEntityFormReturnType, useFieldConfiguration } from \"../Form\"\r\nimport { useLookupSelect } from \"../LookupSelect\"\r\nimport { useLookupMultiSelectInputProps } from \"./useLookupMultiSelectInputProps\"\r\n\r\n\r\nexport interface LookupMultiSelectProps extends Omit<MultiSelectProps, 'data'> {\r\n parentKeys?: ValuesObject,\r\n column: EntityColumn<Value>,\r\n formStatus?: OperationStatus<DBStatusResult | DataResult | ValuesObject>,\r\n entityForm: UseEntityFormReturnType\r\n entity: Entity<EntityDefinition>,\r\n lookupDefName: string,\r\n requiredLabel?: string,\r\n includeKeyInDescription?: boolean,\r\n createLabel?: string,\r\n containerProps?: GroupProps\r\n grow?: boolean\r\n}\r\n\r\n\r\nexport const LookupMultiSelectDefaultProps: Partial<LookupMultiSelectProps> = {\r\n requiredLabel: \"A value from the list is required\",\r\n includeKeyInDescription: true,\r\n searchable: true,\r\n maxDropdownHeight: 260,\r\n clearable: true,\r\n createLabel: \"+ Create\",\r\n withinPortal: true,\r\n zIndex: 100000,\r\n}\r\n\r\nexport function LookupMultiSelect(props: LookupMultiSelectProps) {\r\n const {\r\n parentKeys, column, formStatus,\r\n entityForm, entity, lookupDefName,\r\n requiredLabel, includeKeyInDescription, label, description, required,\r\n icon, readOnly, searchable, maxDropdownHeight, clearable, containerProps,\r\n creatable, createLabel, withAsterisk, grow, ...rest\r\n } = useComponentDefaultProps('LookupMultiSelect', LookupMultiSelectDefaultProps, props);\r\n\r\n const containerPropsMemo = useMemo(() => {\r\n if (grow) {\r\n return { ...containerProps, style: { ...containerProps?.style, flex: 'auto' } };\r\n }\r\n return containerProps;\r\n }, [containerProps, grow])\r\n\r\n const theme = useMantineTheme();\r\n\r\n const triggerRefreshState = useState<boolean>(true);\r\n const selectDataState = useState<SelectItem[]>([]);\r\n const [selectData, setSelectData] = selectDataState;\r\n\r\n const lookupSelectAPI = useLookupSelect({ parentKeys, selectDataState, triggerRefreshState, column, entityForm, entity, lookupDefName, maxItems: 0, includeKeyInDescription });\r\n\r\n const inputProps = useLookupMultiSelectInputProps({ entityForm, column, selectData });\r\n\r\n const [showDescription,] = entityForm.showDescriptionState;\r\n\r\n useFieldConfiguration({ entityForm, column, required: required, requiredMessage: requiredLabel });\r\n\r\n const onCreate = (newValue: string) => {\r\n const item = { value: newValue, label: newValue };\r\n setSelectData((current) => [...current, item]);\r\n return item;\r\n }\r\n\r\n const updateDescription = useCallback((value: Value) => {\r\n // Get the seted values description. Value is an array of values\r\n if (column.isArray) {\r\n // MMC: in rare cases the column can have a value but there is no selectData\r\n // in that case skip updating column description \r\n //(I found this placing a lookupMultiSelect inside an accordion item, where it mounts and unmounts the component before the data is fetched)\r\n if (column.value && selectData.length === 0) return;\r\n\r\n const values = (value === null || value === undefined || value === '' ? [] : value as string[]);\r\n const descriptions = values.map((value) => {\r\n const index = selectData.findIndex((item) => item.value === value);\r\n return index >= 0 ? selectData[index].label : '';\r\n });\r\n column.valueDescription = descriptions.join(', ');\r\n }\r\n }, [column, selectData]);\r\n\r\n // MMC: Effect for setting the column valueDescription\r\n const selectedValue = entityForm.form.values[column.name];\r\n useEffect(() => {\r\n updateDescription(selectedValue);\r\n }, [selectedValue, updateDescription]);\r\n\r\n return (\r\n <Group {...containerPropsMemo}>\r\n <MultiSelect\r\n {...rest}\r\n withAsterisk={withAsterisk ?? (!readOnly && !(entityForm.formMode === 'view') && (required ?? !column.hasFlag(EntityColumnFlags.nullable)))}\r\n styles={{ dropdown: { backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3] }, root: { flexGrow: 1 } }}\r\n searchable={searchable}\r\n maxDropdownHeight={maxDropdownHeight}\r\n clearable={clearable}\r\n label={label ?? column.prompt}\r\n description={showDescription ? (description ?? column.description) : ''}\r\n icon={lookupSelectAPI.status.loading ? <Loader size=\"xs\" /> : icon}\r\n data={selectData}\r\n readOnly={readOnly || entityForm.formMode === 'view' || lookupSelectAPI.status.loading || formStatus?.loading ? true : false}\r\n error={lookupSelectAPI.status.error ? lookupSelectAPI.status.error.message : null}\r\n creatable={creatable}\r\n onCreate={creatable ? onCreate : undefined}\r\n getCreateLabel={(newValue) => `${createLabel} ${newValue}`}\r\n {...inputProps}\r\n />\r\n </Group>\r\n )\r\n}\r\n","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_category_id: new EntityColumn<string>({ name: 'c_category_id', type: 'char', length: 20, flags: c.PK, prompt: 'Categoría' }),\r\n vc_description: new EntityColumn<string>({ name: 'vc_description', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Descripción' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n cat_brwStandard: { name: 'cat_brwStandard', keyMappings: { c_category_id: 0 } }\r\n }\r\n)\r\n\r\nexport class CategoriesDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n\r\n constructor() {\r\n super('Categories');\r\n }\r\n\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { CategoriesDef } from \"./CategoriesDef\";\r\n\r\nexport class Categories extends Entity<CategoriesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new CategoriesDef(), parentKeys);\r\n this.Form = import('./CategoriesForm').then(module => module.CategoriesForm);\r\n }\r\n}\r\n\r\n","import { MicroMClient, ValuesObject } from \"../../client\";\r\nimport { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\nimport { Categories } from \"./Categories\";\r\n\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_category_id: new EntityColumn<string>({ name: 'c_category_id', type: 'char', length: 20, flags: c.PK, prompt: 'Categoría', excludeInAutoForm: true }),\r\n c_categoryvalue_id: new EntityColumn<string>({ name: 'c_categoryvalue_id', type: 'char', length: 20, flags: c.PK, prompt: 'ID' }),\r\n vc_description: new EntityColumn<string>({ name: 'vc_description', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Descripción' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst lookups = () =>\r\n(\r\n {\r\n Categories: { name: 'Categories', entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new Categories(client, parentKeys) }\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n cav_brwStandard: { name: 'cav_brwStandard', keyMappings: { c_categoryvalue_id: 0 } }\r\n }\r\n)\r\nexport class CategoriesValuesDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n lookups = lookups();\r\n\r\n constructor() {\r\n super('CategoriesValues');\r\n }\r\n\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { CategoriesValuesDef } from \"./CategoriesValuesDef\";\r\n\r\nexport class CategoriesValues extends Entity<CategoriesValuesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new CategoriesValuesDef(), parentKeys);\r\n this.Form = import('../../UI/AutoForm/AutoForm').then(module => module.AutoForm);\r\n }\r\n}","import { Card, Group, Stack, Text, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { DataGrid, EntityForm, FormOptions, Lookup, useEnterAsTab, useEntityForm } from \"../../UI\";\r\nimport { Categories } from \"./Categories\";\r\nimport { CategoriesValues } from \"./CategoriesValues\";\r\n\r\n\r\n\r\nexport const CategoriesFormDefaultProps: Partial<FormOptions<Categories>> = {\r\n initialFormMode: 'view'\r\n}\r\n\r\nexport function CategoriesForm(props: FormOptions<Categories>) {\r\n const { entity, initialFormMode, getDataOnInit } = useComponentDefaultProps('CategoriesValuesForm', CategoriesFormDefaultProps, props);\r\n\r\n const useEnterAsTabRef = useEnterAsTab<HTMLDivElement>();\r\n\r\n const theme = useMantineTheme();\r\n\r\n const formAPI = useEntityForm(\r\n {\r\n entity: entity,\r\n initialFormMode: initialFormMode,\r\n validateInputOnBlur: true,\r\n getDataOnInit: getDataOnInit!\r\n }\r\n );\r\n\r\n const cav = new CategoriesValues(entity.API.client);\r\n\r\n return (\r\n <EntityForm formAPI={formAPI}>\r\n <Stack ref={useEnterAsTabRef}>\r\n <Group>\r\n <Lookup\r\n entityForm={formAPI}\r\n entity={entity}\r\n lookupDefName={entity.def.lookups.Categories.name}\r\n autoFocus\r\n column={entity.def.columns.c_category_id}\r\n parentKeys={{}}\r\n required={false}\r\n />\r\n </Group>\r\n <Card shadow=\"sm\" withBorder={theme.colorScheme === 'dark' ? false : true}>\r\n <Card.Section p=\"xs\" bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]} mb=\"1rem\">\r\n <Text weight=\"500\">{entity.Title}</Text>\r\n </Card.Section>\r\n <DataGrid entity={cav} parentKeys={{}} viewName={cav.def.views.cav_brwStandard.name} refreshOnInit={true} limit=\"10000\" selectionMode=\"multi\" key=\"datagrid\" />\r\n </Card>\r\n </Stack>\r\n </EntityForm>\r\n )\r\n\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { CategoriesValuesDef } from \"../Categories\";\r\n\r\nexport class catAuthenticationTypes extends Entity<CategoriesValuesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new CategoriesValuesDef(), parentKeys);\r\n this.def.columns.c_category_id.value = \"AuthenticationTypes\";\r\n this.def.columns.c_category_id.defaultValue = \"AuthenticationTypes\";\r\n this.Title = \"Authentication Types\";\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { CategoriesValuesDef } from \"../Categories\";\r\n\r\nexport class catUserTypes extends Entity<CategoriesValuesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new CategoriesValuesDef(), parentKeys);\r\n this.def.columns.c_category_id.value = \"UserTypes\";\r\n this.def.columns.c_category_id.defaultValue = \"UserTypes\";\r\n this.Title = \"User Types\";\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { CategoriesValuesDef } from \"../Categories\";\r\n\r\nexport class catIdentityProviderRoles extends Entity<CategoriesValuesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new CategoriesValuesDef(), parentKeys);\r\n this.def.columns.c_category_id.value = \"IdentityProviderRoles\";\r\n this.def.columns.c_category_id.defaultValue = \"IdentityProviderRoles\";\r\n this.Title = \"Identity Provider Roles\";\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { CategoriesValuesDef } from \"../Categories\";\r\n\r\nexport class catFileStorageTypes extends Entity<CategoriesValuesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new CategoriesValuesDef(), parentKeys);\r\n this.def.columns.c_category_id.value = \"FileStorageTypes\";\r\n this.def.columns.c_category_id.defaultValue = \"FileStorageTypes\";\r\n this.Title = \"File Storage Types\";\r\n }\r\n}","import { MicroMClient, ValuesObject } from \"../../client\";\r\nimport { CommonFlags as c, DefaultColumns, EntityColumn, EntityColumnFlags, EntityDefinition } from \"../../Entity\";\r\nimport { MicromUsers } from \"../MicromUsers\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_user_group_id: new EntityColumn<string>({ name: 'c_user_group_id', type: 'char', length: 20, flags: c.PKAutonum, prompt: 'User Group Id' }),\r\n vc_user_group_name: new EntityColumn<string>({\r\n name: 'vc_user_group_name', type: 'varchar', length: 255, flags: c.Edit, prompt: 'User Group Name'\r\n , description: 'The name of the user group'\r\n \r\n }),\r\n vc_group_members: new EntityColumn<string[]>({\r\n name: 'vc_group_members', type: 'varchar', flags: c.Edit | EntityColumnFlags.fake | EntityColumnFlags.nullable,\r\n prompt: 'Members',\r\n description: 'The users members of the user group',\r\n isArray: true\r\n }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n mug_brwStandard: { name: 'mug_brwStandard', keyMappings: { c_user_group_id: 0 } }\r\n }\r\n)\r\n\r\nconst lookups = () => (\r\n {\r\n 'MicromUsers': {\r\n name: 'MicromUsers',\r\n viewMapping: { keyIndex: 0, descriptionIndex: 1 },\r\n entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new MicromUsers(client, parentKeys)\r\n }\r\n }\r\n);\r\n\r\nexport class MicromUsersGroupsDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n lookups = lookups();\r\n\r\n constructor() {\r\n super('MicromUsersGroups');\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { MicromUsersGroupsDef } from \"./MicromUsersGroupsDef\";\r\n\r\n\r\nexport class MicromUsersGroups extends Entity<MicromUsersGroupsDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new MicromUsersGroupsDef(), parentKeys);\r\n this.Form = import('./MicromUsersGroupsForm').then((module) => module.MicromUsersGroupsForm);\r\n this.Title = \"Microm Users Groups\";\r\n }\r\n}","import { Group, Text } from \"@mantine/core\";\r\nimport { IconX } from \"@tabler/icons-react\";\r\nimport { EntityClientAction } from \"../../Entity\";\r\nimport { CircleFilledIcon, ConfirmAndExecutePanel } from \"../../UI\";\r\nimport { MicromUsersGroupsMenus } from \".\";\r\n\r\nexport const MicromUsersGroupsMenusDisableMenusLabels = {\r\n denyAccessToSelectedMenuItems: 'Deny access to selected menu items',\r\n buttonLabel: 'Deny access',\r\n title: 'Deny access',\r\n areYouSure: 'You are denying access to the selected menu items. Are you sure?',\r\n}\r\n\r\nconst l = MicromUsersGroupsMenusDisableMenusLabels;\r\n\r\nexport const ACTDisableMenus: EntityClientAction = {\r\n name: 'ACTDisableMenus',\r\n label: l.buttonLabel,\r\n title: <Group spacing=\"xs\"><CircleFilledIcon icon={<IconX size=\"0.75rem\" />} backColor=\"red\" /><Text fw={700}>{l.title}</Text></Group>,\r\n refreshOnClose: true,\r\n dontRequireSelection: true,\r\n onClick: async ({ entity, modal, selectedKeys, element, onClose }) => {\r\n // cast entity\r\n const parent = entity as MicromUsersGroupsMenus;\r\n const abort_controller = new AbortController();\r\n\r\n if (modal) {\r\n await modal.open({\r\n modalProps: {\r\n title: <Group spacing=\"xs\"><CircleFilledIcon icon={<IconX size=\"0.75rem\" />} backColor=\"red\" /><Text fw={700}>{l.denyAccessToSelectedMenuItems}</Text></Group>,\r\n },\r\n focusOnClosed: element,\r\n content: <ConfirmAndExecutePanel\r\n content={<Text size=\"sm\" mb=\"xs\">{l.areYouSure}</Text>}\r\n operation=\"proc\"\r\n onCancel={async () => {\r\n abort_controller.abort();\r\n await modal.close();\r\n if (onClose) await onClose(false);\r\n }}\r\n onOK={\r\n async () => {\r\n const result = await parent.API.deleteData(selectedKeys, abort_controller.signal, parent.parentKeys);\r\n const success = result.Failed === false;\r\n if (success) {\r\n await modal.close();\r\n if (onClose) await onClose(success);\r\n }\r\n return result;\r\n }\r\n }\r\n />\r\n\r\n });\r\n }\r\n else {\r\n console.log('modal context not found');\r\n }\r\n\r\n return Promise.resolve(false);\r\n\r\n }\r\n\r\n}\r\n\r\n","import { Group, Text } from \"@mantine/core\";\r\nimport { IconCheck } from \"@tabler/icons-react\";\r\nimport { EntityClientAction } from \"../../Entity\";\r\nimport { CircleFilledIcon, ConfirmAndExecutePanel } from \"../../UI\";\r\nimport { MicromUsersGroupsMenus } from \".\";\r\n\r\nexport const MicromUsersGroupsMenusEnableMenusLabels = {\r\n allowAccessToSelectedMenuItems: 'Allow access to selected menu items',\r\n buttonLabel: 'Allow access',\r\n title: 'Enable access',\r\n areYouSure: 'You are allowing access to the selected menu items. Are you sure?',\r\n}\r\n\r\nexport const ACTEnableMenus: EntityClientAction = {\r\n name: 'ACTEnableMenus',\r\n label: MicromUsersGroupsMenusEnableMenusLabels.buttonLabel,\r\n title: <Group spacing=\"xs\"><CircleFilledIcon icon={<IconCheck size=\"0.75rem\" />} backColor=\"green\" /><Text fw={700}>{MicromUsersGroupsMenusEnableMenusLabels.title}</Text></Group>,\r\n refreshOnClose: true,\r\n dontRequireSelection: true,\r\n onClick: async ({ entity, modal, selectedKeys, element, onClose }) => {\r\n // cast entity\r\n const parent = entity as MicromUsersGroupsMenus;\r\n const abort_controller = new AbortController();\r\n\r\n if (modal) {\r\n await modal.open({\r\n modalProps: {\r\n title: <Group spacing=\"xs\"><CircleFilledIcon icon={<IconCheck size=\"0.75rem\" />} backColor=\"green\" /><Text fw={700}>{MicromUsersGroupsMenusEnableMenusLabels.allowAccessToSelectedMenuItems}</Text></Group>,\r\n },\r\n focusOnClosed: element,\r\n content: <ConfirmAndExecutePanel\r\n content={<Text size=\"sm\" mb=\"xs\">{MicromUsersGroupsMenusEnableMenusLabels.areYouSure}</Text>}\r\n operation=\"proc\"\r\n onCancel={async () => {\r\n abort_controller.abort();\r\n await modal.close();\r\n if (onClose) await onClose(false);\r\n }}\r\n onOK={\r\n async () => {\r\n const result = await parent.API.addData(abort_controller.signal, selectedKeys, true);\r\n const success = result.Failed === false;\r\n if (success) {\r\n await modal.close();\r\n if (onClose) await onClose(success);\r\n }\r\n return result;\r\n }\r\n }\r\n />\r\n\r\n });\r\n }\r\n else {\r\n console.log('modal context not found');\r\n }\r\n\r\n return Promise.resolve(false);\r\n\r\n }\r\n\r\n}\r\n\r\n","import { Group, MantineTheme } from \"@mantine/core\";\r\nimport { IconCheck, IconX } from \"@tabler/icons-react\";\r\nimport { CircleFilledIcon } from \"../../UI\";\r\n\r\nexport interface MicromUsersGroupsMenusColumnsOverridesLabels {\r\n granted: string,\r\n denied: string,\r\n}\r\n\r\nexport const MicromUsersGroupsMenusColumnsOverridesLabelsDefaultProps: Partial<MicromUsersGroupsMenusColumnsOverridesLabels> = {\r\n granted: \"Granted\",\r\n denied: \"Denied\",\r\n}\r\n\r\nexport function MicromUsersGroupsMenusColumnsOverrides(theme: MantineTheme) {\r\n const l = MicromUsersGroupsMenusColumnsOverridesLabelsDefaultProps;\r\n return {\r\n // Access\r\n 4: {\r\n render: (value: unknown) => (value === \"true\") ? <Group style={{ gap: '0rem' }} noWrap>\r\n <CircleFilledIcon mr=\"xs\" backColor={theme.colors.green[8]} width=\"1.3rem\" icon={<IconCheck size=\"0.9rem\" />}></CircleFilledIcon>{l.granted}\r\n </Group> : <Group style={{ gap: '0rem' }} noWrap>\r\n <CircleFilledIcon mr=\"xs\" backColor={theme.colors.red[8]} width=\"1.3rem\" icon={<IconX size=\"0.9rem\" />}></CircleFilledIcon>{l.denied}\r\n </Group>\r\n },\r\n }\r\n\r\n}","import { MicroMClient, ValuesObject } from \"../../client\";\r\nimport { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition, EntityView } from \"../../Entity\";\r\nimport { MicromUsersGroups } from \"../MicromUsersGroups\";\r\nimport { ACTDisableMenus } from \"./ACTDisableMenus\";\r\nimport { ACTEnableMenus } from \"./ACTEnableMenus\";\r\nimport { MicromUsersGroupsMenusColumnsOverrides } from \"./MicromUsersGroupsMenusColumnsOverrides\";\r\n\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_user_group_id: new EntityColumn<string>({ name: 'c_user_group_id', type: 'char', length: 20, flags: c.PK, prompt: 'User Group Id' }),\r\n c_menu_id: new EntityColumn<string>({ name: 'c_menu_id', type: 'char', length: 20, flags: c.PK, prompt: 'Menu Id' }),\r\n c_menu_item_id: new EntityColumn<string>({ name: 'c_menu_item_id', type: 'char', length: 20, flags: c.PK, prompt: 'Menu Item Id' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n mmn_brwStandard: { name: 'mmn_brwStandard', keyMappings: { c_user_group_id: 0 } },\r\n mmn_brwMenuItems: { name: 'mmn_brwMenuItems', keyMappings: { c_menu_id: 0, c_menu_item_id: 1 }, gridColumnsOverrides: MicromUsersGroupsMenusColumnsOverrides },\r\n } as Record<string, EntityView>\r\n)\r\n\r\nconst lookups = () =>\r\n(\r\n {\r\n 'MicromUsersGroups': {\r\n name: 'MicromUsersGroups',\r\n viewMapping: { keyIndex: 0, descriptionIndex: 1 },\r\n entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new MicromUsersGroups(client, parentKeys)\r\n },\r\n\r\n }\r\n)\r\n\r\nconst clientActions = () =>\r\n(\r\n {\r\n ACTEnableMenus: ACTEnableMenus,\r\n ACTDisableMenus: ACTDisableMenus,\r\n }\r\n)\r\n\r\nexport class MicromUsersGroupsMenusDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n lookups = lookups();\r\n clientActions = clientActions();\r\n\r\n constructor() {\r\n super('MicromUsersGroupsMenus');\r\n }\r\n}","import { IconProps } from \"@tabler/icons-react\";\r\nimport { ReactNode } from \"react\";\r\nimport { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { MicromUsersGroupsMenusDisableMenusLabels } from \"./ACTDisableMenus\";\r\nimport { MicromUsersGroupsMenusEnableMenusLabels } from \"./ACTEnableMenus\";\r\nimport { MicromUsersGroupsMenusDef } from \"./MicromUsersGroupsMenusDef\";\r\n\r\nexport interface MicromUsersGroupsMenusEntityProps {\r\n icon?: (props: IconProps) => ReactNode,\r\n helpText?: string,\r\n title: string,\r\n}\r\n\r\nexport const MicromUsersGroupsMenusEntityDefaultProps: Partial<MicromUsersGroupsMenusEntityProps> = {\r\n icon: undefined,\r\n helpText: '* The list of available menu items to be allowed or denied access',\r\n title: 'Menu access',\r\n}\r\n\r\nexport class MicromUsersGroupsMenus extends Entity<MicromUsersGroupsMenusDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new MicromUsersGroupsMenusDef(), parentKeys);\r\n \r\n this.Title = MicromUsersGroupsMenusEntityDefaultProps.title!;\r\n this.Icon = MicromUsersGroupsMenusEntityDefaultProps.icon;\r\n this.HelpText = MicromUsersGroupsMenusEntityDefaultProps.helpText;\r\n\r\n this.def.clientActions.ACTEnableMenus.label = MicromUsersGroupsMenusEnableMenusLabels.buttonLabel;\r\n this.def.clientActions.ACTDisableMenus.label = MicromUsersGroupsMenusDisableMenusLabels.buttonLabel;\r\n\r\n }\r\n}","import { Stack, Tabs, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { IconListCheck, IconUsers, IconUsersGroup } from \"@tabler/icons-react\";\r\nimport { useRef } from \"react\";\r\nimport { DataGridForm, EntityForm, FormOptions, LookupMultiSelect, TextField, useEntityForm, useParentKeys } from \"../../UI\";\r\nimport { MicromUsersGroupsMenus } from \"../MicromUsersGroupsMenus\";\r\nimport { MicromUsersGroups } from \"./MicromUsersGroups\";\r\n\r\nexport interface MicromUsersGroupsFormProps extends FormOptions<MicromUsersGroups> {\r\n groupTabLabel?: string,\r\n menusTabLabel?: string,\r\n membersTabLabel?: string,\r\n}\r\n\r\nexport const MicromUsersGroupsFormDefaultProps: Partial<MicromUsersGroupsFormProps> = {\r\n initialFormMode: \"view\",\r\n groupTabLabel: \"Group\",\r\n menusTabLabel: \"Menu access\",\r\n membersTabLabel: \"Members\",\r\n}\r\n\r\nconst TN = {\r\n group: 'group', groupIcon: <IconUsersGroup size=\"1rem\" />,\r\n menus: 'menus', menusIcon: <IconListCheck size=\"1rem\" />,\r\n members: 'members', membersIcon: <IconUsers size=\"1rem\" />,\r\n};\r\n\r\nconst gridHeight = \"39vh\";\r\n\r\nexport function MicromUsersGroupsForm(props: MicromUsersGroupsFormProps) {\r\n\r\n const {\r\n entity, initialFormMode, getDataOnInit, onSaved, onCancel, groupTabLabel, menusTabLabel,\r\n membersTabLabel\r\n } = useComponentDefaultProps('MicromUsersGroups', MicromUsersGroupsFormDefaultProps, props);\r\n\r\n const formAPI = useEntityForm({ entity: entity, initialFormMode, getDataOnInit: getDataOnInit!, onSaved, onCancel });\r\n\r\n const { formMode, status } = formAPI;\r\n\r\n const groupMenusRef = useRef<MicromUsersGroupsMenus>(new MicromUsersGroupsMenus(entity.API.client));\r\n\r\n const groupMenus = groupMenusRef.current;\r\n\r\n const groupParentkeys = useParentKeys(\r\n {\r\n formAPI: formAPI,\r\n columnNames: [\r\n entity.def.columns.c_user_group_id.name,\r\n groupMenus.def.columns.c_menu_id.name\r\n ],\r\n entity\r\n }\r\n );\r\n\r\n\r\n return (\r\n <EntityForm formAPI={formAPI}>\r\n <Tabs pt=\"xs\" defaultValue={TN.group} mih=\"60vh\">\r\n <Tabs.List>\r\n <Tabs.Tab value={TN.group} icon={TN.groupIcon} >{groupTabLabel}</Tabs.Tab>\r\n <Tabs.Tab value={TN.menus} icon={TN.menusIcon} >{menusTabLabel}</Tabs.Tab>\r\n <Tabs.Tab value={TN.members} icon={TN.membersIcon} >{membersTabLabel}</Tabs.Tab>\r\n </Tabs.List>\r\n <Tabs.Panel value={TN.group} pt=\"xs\" mih={gridHeight}>\r\n <Stack>\r\n {formMode != \"add\" &&\r\n <TextField\r\n entityForm={formAPI}\r\n column={entity.def.columns.c_user_group_id}\r\n readOnly={true}\r\n required={false}\r\n maw=\"20rem\"\r\n />\r\n }\r\n <TextField\r\n entityForm={formAPI} column={entity.def.columns.vc_user_group_name} autoFocus transform=\"capitalize\"\r\n />\r\n </Stack>\r\n </Tabs.Panel>\r\n <Tabs.Panel value={TN.menus} pt=\"xs\" mih={gridHeight}>\r\n <Stack>\r\n <DataGridForm\r\n gridHeight={gridHeight}\r\n parentKeys={groupParentkeys}\r\n key={`grid-menus-${entity.def.name}`}\r\n entity={groupMenus}\r\n formMode={formMode}\r\n viewName={groupMenus.def.views.mmn_brwMenuItems.name}\r\n selectionMode=\"multi\"\r\n parentFormAPI={formAPI}\r\n enableAdd={false}\r\n enableEdit={false}\r\n enableView={false}\r\n enableDelete={false}\r\n saveFormBeforeAdd\r\n autoSelectFirstRow={false}\r\n />\r\n </Stack>\r\n </Tabs.Panel>\r\n <Tabs.Panel value={TN.members} pt=\"xs\" mih={gridHeight}>\r\n <Stack>\r\n <LookupMultiSelect\r\n entityForm={formAPI}\r\n column={entity.def.columns.vc_group_members}\r\n entity={entity}\r\n lookupDefName={entity.def.lookups.MicromUsers.name}\r\n formStatus={status}\r\n required={false}\r\n searchable={true}\r\n includeKeyInDescription={false}\r\n creatable={false}\r\n maw=\"35rem\"\r\n />\r\n </Stack>\r\n </Tabs.Panel>\r\n </Tabs>\r\n </EntityForm>\r\n )\r\n}\r\n\r\n","import { MicroMClient, ValuesObject } from \"../../client\";\r\nimport { CommonFlags as c, DefaultColumns, EntityColumn, EntityColumnFlags, EntityDefinition } from \"../../Entity\";\r\nimport { catUserTypes } from \"../Config/catUserTypes\";\r\nimport { MicromUsersGroups } from \"../MicromUsersGroups\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_user_id: new EntityColumn<string>({ name: 'c_user_id', type: 'char', length: 20, flags: c.PKAutonum, prompt: 'User Id' }),\r\n vc_username: new EntityColumn<string>({ name: 'vc_username', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Username' }),\r\n vc_email: new EntityColumn<string>({ name: 'vc_email', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Email' }),\r\n vc_pwhash: new EntityColumn<string>({ name: 'vc_pwhash', type: 'varchar', length: 2048, flags: c.Edit, prompt: 'Pwhash' }),\r\n vb_sid: new EntityColumn<string>({ name: 'vb_sid', type: 'varchar', length: 85, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Sid' }),\r\n vc_refreshtoken: new EntityColumn<string>({ name: 'vc_refreshtoken', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Refreshtoken' }),\r\n dt_refresh_expiration: new EntityColumn<boolean>({ name: 'dt_refresh_expiration', type: 'datetime', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Refresh Expiration' }),\r\n i_badlogonattempts: new EntityColumn<number>({ name: 'i_badlogonattempts', type: 'int', flags: c.Edit, prompt: 'Badlogonattempts' }),\r\n i_refreshcount: new EntityColumn<number>({ name: 'i_refreshcount', type: 'int', flags: c.Edit, prompt: 'Refreshcount' }),\r\n bt_disabled: new EntityColumn<boolean>({ name: 'bt_disabled', type: 'bit', length: 1, flags: c.Edit, prompt: 'Disable user' }),\r\n dt_locked: new EntityColumn<Date>({ name: 'dt_locked', type: 'datetime', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Date Locked' }),\r\n dt_last_login: new EntityColumn<Date>({ name: 'dt_last_login', type: 'datetime', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Last Login' }),\r\n dt_last_refresh: new EntityColumn<Date>({ name: 'dt_last_refresh', type: 'datetime', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Last Refresh' }),\r\n vc_recovery_code: new EntityColumn<string>({ name: 'vc_recovery_code', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Recovery Code' }),\r\n dt_last_recovery: new EntityColumn<Date>({ name: 'dt_last_recovery', type: 'datetime', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Last Recovery' }),\r\n c_usertype_id: new EntityColumn<string>({ name: 'c_usertype_id', type: 'char', length: 20, flags: c.Edit, prompt: 'Usertype Id' }),\r\n vc_user_groups: new EntityColumn<string[]>({ name: 'vc_user_groups', type: 'varchar', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'User Groups', isArray: true }),\r\n bt_islocked: new EntityColumn<boolean>({ name: 'bt_islocked', type: 'bit', length: 1, flags: EntityColumnFlags.fake, prompt: 'Locked' }),\r\n i_locked_minutes_remaining: new EntityColumn<number>({ name: 'i_locked_minutes_remaining', type: 'int', flags: EntityColumnFlags.fake, prompt: 'Locked minutes remaining' }),\r\n vc_password: new EntityColumn<string>({ name: 'vc_password', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Password' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n usr_brwStandard: { name: 'usr_brwStandard', keyMappings: { c_user_id: 0 } }\r\n }\r\n)\r\n\r\n\r\nconst lookups = () =>\r\n(\r\n {\r\n 'UserTypes': {\r\n name: 'UserTypes',\r\n viewMapping: { keyIndex: 0, descriptionIndex: 1 },\r\n entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new catUserTypes(client, parentKeys)\r\n },\r\n 'MicromUsersGroups': {\r\n name: 'MicromUsersGroups',\r\n viewMapping: { keyIndex: 0, descriptionIndex: 1 },\r\n entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new MicromUsersGroups(client, parentKeys)\r\n }\r\n }\r\n)\r\n\r\nexport class MicromUsersDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n lookups = lookups();\r\n\r\n constructor() {\r\n super('MicromUsers');\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { MicromUsersDef } from \"./MicromUsersDef\";\r\n\r\nexport class MicromUsers extends Entity<MicromUsersDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new MicromUsersDef(), parentKeys);\r\n this.Form = import('./MicromUsersForm').then((module) => module.MicromUsersForm);\r\n }\r\n}","import { Group, Stack, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { CheckboxField, EntityForm, FormOptions, LookupSelect, NotifyBitField, NotifyBitFieldDefaultProps, PasswordField, RingProgressField, TextField, useEntityForm } from \"../../UI\";\r\nimport { MicromUsers } from \"./MicromUsers\";\r\n\r\n\r\nexport interface MicromUsersFormProps extends FormOptions<MicromUsers> {\r\n disabledTrueLabel?: string,\r\n disabledFalseLabel?: string,\r\n lockedRemainingLabel?: string,\r\n userEnabledLabel?: string,\r\n userDisabledLabel?: string,\r\n logonAttemptsStatusTitle?: string\r\n logonAttemptsStatusDescription?: string,\r\n lockedTitleLabel?: string,\r\n minutesLabel?: string,\r\n willUnlockInNextLogonLabel?: string\r\n}\r\n\r\nexport const MicromUsersFormDefaultProps: Partial<MicromUsersFormProps> = {\r\n initialFormMode: 'view',\r\n disabledFalseLabel: 'The account is enabled',\r\n disabledTrueLabel: 'The account is disabled',\r\n lockedRemainingLabel: 'The account is locked. It will unlock automatically in',\r\n lockedTitleLabel: 'The account is locked',\r\n userEnabledLabel: 'The user is enabled',\r\n userDisabledLabel: 'The user is disabled',\r\n logonAttemptsStatusTitle: 'Bad login attemps',\r\n logonAttemptsStatusDescription: 'The account registers failed login attempts',\r\n minutesLabel: 'minutes',\r\n willUnlockInNextLogonLabel: 'Account automatic lock period has finished. It will be unlocked in the next successful logon.'\r\n}\r\n\r\nexport function MicromUsersForm(props: MicromUsersFormProps) {\r\n const {\r\n entity, initialFormMode, getDataOnInit, onSaved, onCancel, disabledFalseLabel, disabledTrueLabel,\r\n lockedRemainingLabel, userDisabledLabel, userEnabledLabel, logonAttemptsStatusDescription, logonAttemptsStatusTitle, lockedTitleLabel,\r\n minutesLabel, willUnlockInNextLogonLabel\r\n } = useComponentDefaultProps('MicromUsersForm', MicromUsersFormDefaultProps, props);\r\n\r\n const entityForm = useEntityForm(\r\n {\r\n entity: entity,\r\n initialFormMode: initialFormMode,\r\n validateInputOnBlur: true,\r\n getDataOnInit: getDataOnInit!,\r\n onSaved: onSaved,\r\n onCancel: onCancel\r\n }\r\n );\r\n\r\n const { formMode, status } = entityForm;\r\n\r\n const MAXBADLOGON_ATTEMPTS = 10;\r\n\r\n return (\r\n <EntityForm formAPI={entityForm}>\r\n <Stack>\r\n {formMode !== 'add' &&\r\n <TextField entityForm={entityForm} column={entity.def.columns.c_user_id} maw=\"20rem\" readOnly />\r\n }\r\n <LookupSelect\r\n entityForm={entityForm}\r\n formStatus={status}\r\n entity={entity}\r\n parentKeys={{}}\r\n column={entity.def.columns.c_usertype_id}\r\n lookupDefName={entity.def.lookups.UserTypes.name}\r\n selectProps={{\r\n searchable: false,\r\n allowDeselect: true,\r\n w: \"30rem\",\r\n required: true,\r\n withAsterisk: true\r\n }}\r\n />\r\n <TextField entityForm={entityForm} column={entity.def.columns.vc_username} maw=\"25rem\" />\r\n <TextField entityForm={entityForm} column={entity.def.columns.vc_email} required={false} />\r\n {formMode == 'add' &&\r\n <PasswordField entityForm={entityForm} column={entity.def.columns.vc_password} />\r\n }\r\n <CheckboxField entityForm={entityForm} column={entity.def.columns.bt_disabled} required={false} />\r\n <Group>\r\n {(!entity.def.columns.bt_islocked.value || entity.def.columns.bt_disabled.value) &&\r\n <NotifyBitField\r\n column={entity.def.columns.bt_disabled}\r\n title={entity.def.columns.bt_disabled.value ? userDisabledLabel : userEnabledLabel}\r\n trueMessage={disabledTrueLabel}\r\n falseMessage={disabledFalseLabel}\r\n withBorder\r\n trueColor={NotifyBitFieldDefaultProps.falseColor}\r\n trueIcon={NotifyBitFieldDefaultProps.falseIcon}\r\n falseColor={NotifyBitFieldDefaultProps.trueColor}\r\n falseIcon={NotifyBitFieldDefaultProps.trueIcon}\r\n />\r\n }\r\n {entity.def.columns.i_badlogonattempts.value > 0 && !entity.def.columns.bt_islocked.value && entity.def.columns.i_locked_minutes_remaining.value === 0 &&\r\n <RingProgressField\r\n column={entity.def.columns.i_badlogonattempts}\r\n maxValue={MAXBADLOGON_ATTEMPTS}\r\n color=\"red\"\r\n title={logonAttemptsStatusTitle ?? entity.def.columns.i_badlogonattempts.prompt}\r\n description={logonAttemptsStatusDescription ?? entity.def.columns.i_badlogonattempts.description}\r\n maw=\"25rem\"\r\n displayPercent=\"fraction\"\r\n />\r\n }\r\n {entity.def.columns.bt_islocked.value &&\r\n <NotifyBitField\r\n column={entity.def.columns.bt_islocked}\r\n title={lockedTitleLabel}\r\n trueMessage={entity.def.columns.i_locked_minutes_remaining.value > 0 ? `${lockedRemainingLabel} ${entity.def.columns.i_locked_minutes_remaining.value} ${minutesLabel}` : willUnlockInNextLogonLabel}\r\n falseMessage={disabledFalseLabel}\r\n withBorder\r\n trueColor={NotifyBitFieldDefaultProps.falseColor}\r\n trueIcon={NotifyBitFieldDefaultProps.falseIcon}\r\n falseColor={NotifyBitFieldDefaultProps.trueColor}\r\n falseIcon={NotifyBitFieldDefaultProps.trueIcon}\r\n />\r\n }\r\n </Group>\r\n </Stack>\r\n </EntityForm>\r\n )\r\n\r\n}","import { MicroMClient, ValuesObject } from \"../../client\";\r\nimport { CommonFlags as c, EntityColumn, EntityColumnFlags } from \"../../Entity\"\r\nimport { MicromUsersGroups } from \"../MicromUsersGroups\";\r\n\r\nexport interface IMicromUserStatusPanelColums {\r\n vc_username: EntityColumn<string>,\r\n vc_password: EntityColumn<string>,\r\n bt_islocked: EntityColumn<boolean>,\r\n bt_disabled: EntityColumn<boolean>,\r\n i_badlogonattempts: EntityColumn<number>,\r\n i_locked_minutes_remaining: EntityColumn<number>,\r\n dt_locked: EntityColumn<Date>,\r\n dt_last_login: EntityColumn<Date>,\r\n dt_last_refresh: EntityColumn<Date>,\r\n vc_user_groups: EntityColumn<string[]>,\r\n}\r\n\r\nexport const MicromUserStatusPanelColumsKeys: string[] = [\r\n 'vc_username',\r\n 'vc_password',\r\n 'bt_islocked',\r\n 'bt_disabled',\r\n 'i_bad_logon_attempts',\r\n 'i_locked_minutes_remaining',\r\n 'dt_locked',\r\n 'dt_last_login',\r\n 'dt_last_refresh',\r\n 'vc_user_groups',\r\n]\r\n\r\nexport const MicromUserStatusPanelColumns = (default_groups?: string[]): IMicromUserStatusPanelColums => (\r\n {\r\n vc_username: new EntityColumn<string>({ name: 'vc_username', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.fake, prompt: 'Username' }),\r\n vc_password: new EntityColumn<string>({ name: 'vc_password', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.fake | EntityColumnFlags.nullable, prompt: 'Password' }),\r\n bt_disabled: new EntityColumn<boolean>({ name: 'bt_disabled', type: 'bit', length: 1, flags: c.Edit | EntityColumnFlags.fake, prompt: 'Disable user' }),\r\n bt_islocked: new EntityColumn<boolean>({ name: 'bt_islocked', type: 'bit', length: 1, flags: EntityColumnFlags.fake, prompt: 'Locked' }),\r\n i_badlogonattempts: new EntityColumn<number>({ name: 'i_badlogonattempts', type: 'int', flags: EntityColumnFlags.fake, prompt: 'Badlogonattempts' }),\r\n i_locked_minutes_remaining: new EntityColumn<number>({ name: 'i_locked_minutes_remaining', type: 'int', flags: EntityColumnFlags.fake, prompt: 'Locked minutes remaining' }),\r\n dt_locked: new EntityColumn<Date>({ name: 'dt_locked', type: 'datetime', flags: EntityColumnFlags.fake, prompt: 'Date Locked' }),\r\n dt_last_login: new EntityColumn<Date>({ name: 'dt_last_login', type: 'datetime', flags: EntityColumnFlags.fake, prompt: 'Last Login', description: 'The user last login date' }),\r\n dt_last_refresh: new EntityColumn<Date>({ name: 'dt_last_refresh', type: 'datetime', flags: EntityColumnFlags.fake, prompt: 'Last Refresh', description: 'The user last session refresh' }),\r\n vc_user_groups: new EntityColumn<string[]>({ name: 'vc_user_groups', type: 'varchar', flags: c.Edit | EntityColumnFlags.fake | EntityColumnFlags.nullable, prompt: 'User Groups', isArray: true, defaultValue: default_groups }),\r\n }\r\n)\r\n\r\nexport const MicromUsersStatusPanelLookups = () => (\r\n {\r\n 'MicromUsersGroups': {\r\n name: 'MicromUsersGroups',\r\n viewMapping: { keyIndex: 0, descriptionIndex: 1 },\r\n entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new MicromUsersGroups(client, parentKeys)\r\n }\r\n }\r\n);","import { Group, Stack, Text, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { NotifyBitField, NotifyBitFieldDefaultProps, NotifyInfo, RingProgressField, UseEntityFormReturnType } from \"../../UI\";\r\nimport { IMicromUserStatusPanelColums } from \"./MicromUsersStatusPanelColumns\";\r\n\r\nexport interface MicromUsersStatusPanel {\r\n columns: IMicromUserStatusPanelColums,\r\n maxBadLogonAttemps: number,\r\n entityForm: UseEntityFormReturnType\r\n disabledTrueLabel?: string,\r\n disabledFalseLabel?: string,\r\n lockedRemainingLabel?: string,\r\n userEnabledLabel?: string,\r\n userDisabledLabel?: string,\r\n logonAttemptsStatusTitle?: string\r\n logonAttemptsStatusDescription?: string,\r\n lockedTitleLabel?: string,\r\n minutesLabel?: string,\r\n willUnlockInNextLogonLabel?: string,\r\n loginInfoTitle?: string,\r\n}\r\n\r\nexport const MicromUsersStatusPanelDefaultProps: Partial<MicromUsersStatusPanel> = {\r\n disabledFalseLabel: 'The account is enabled',\r\n disabledTrueLabel: 'The account is disabled',\r\n lockedRemainingLabel: 'The account is locked. It will unlock automatically in',\r\n lockedTitleLabel: 'The account is locked',\r\n userEnabledLabel: 'The user is enabled',\r\n userDisabledLabel: 'The user is disabled',\r\n logonAttemptsStatusTitle: 'Bad login attemps',\r\n logonAttemptsStatusDescription: 'The account registers failed login attempts',\r\n minutesLabel: 'minutes',\r\n willUnlockInNextLogonLabel: 'Account automatic lock period has finished. It will be unlocked in the next successful logon.',\r\n loginInfoTitle: 'Login information'\r\n}\r\n\r\nexport function MicromMUsersStatusPanel(props: MicromUsersStatusPanel) {\r\n\r\n const {\r\n columns, userDisabledLabel, userEnabledLabel, disabledTrueLabel, disabledFalseLabel, entityForm, maxBadLogonAttemps,\r\n logonAttemptsStatusTitle, logonAttemptsStatusDescription, lockedTitleLabel, minutesLabel, willUnlockInNextLogonLabel,\r\n lockedRemainingLabel, loginInfoTitle\r\n } = useComponentDefaultProps('MicromMUsersStatusPanel', MicromUsersStatusPanelDefaultProps, props);\r\n\r\n\r\n return (\r\n <Stack>\r\n <Group>\r\n <NotifyInfo title={loginInfoTitle} withBorder>\r\n <Text size=\"xs\" color=\"dimmed\">\r\n {columns.dt_last_login.value ? `Last login: ${columns.dt_last_login.value.toLocaleString()}` : 'No login registered'}\r\n {columns.dt_last_refresh.value ? `, Last refresh: ${columns.dt_last_refresh.value.toLocaleString()}` : ', No refresh registered'}\r\n </Text>\r\n </NotifyInfo>\r\n {(!columns.bt_islocked.value || columns.bt_disabled.value) &&\r\n <NotifyBitField\r\n column={columns.bt_disabled}\r\n title={columns.bt_disabled.value ? userDisabledLabel : userEnabledLabel}\r\n trueMessage={disabledTrueLabel}\r\n falseMessage={disabledFalseLabel}\r\n withBorder\r\n trueColor={NotifyBitFieldDefaultProps.falseColor}\r\n trueIcon={NotifyBitFieldDefaultProps.falseIcon}\r\n falseColor={NotifyBitFieldDefaultProps.trueColor}\r\n falseIcon={NotifyBitFieldDefaultProps.trueIcon}\r\n />\r\n }\r\n {columns.i_badlogonattempts.value > 0 && !columns.bt_islocked.value && columns.i_locked_minutes_remaining.value === 0 &&\r\n <RingProgressField\r\n column={columns.i_badlogonattempts}\r\n maxValue={maxBadLogonAttemps}\r\n color=\"red\"\r\n title={logonAttemptsStatusTitle ?? columns.i_badlogonattempts.prompt}\r\n description={logonAttemptsStatusDescription ?? columns.i_badlogonattempts.description}\r\n maw=\"25rem\"\r\n displayPercent=\"fraction\"\r\n />\r\n }\r\n {columns.bt_islocked.value &&\r\n <NotifyBitField\r\n column={columns.bt_islocked}\r\n title={lockedTitleLabel}\r\n trueMessage={columns.i_locked_minutes_remaining.value > 0 ? `${lockedRemainingLabel} ${columns.i_locked_minutes_remaining.value} ${minutesLabel}` : willUnlockInNextLogonLabel}\r\n falseMessage={disabledFalseLabel}\r\n withBorder\r\n trueColor={NotifyBitFieldDefaultProps.falseColor}\r\n trueIcon={NotifyBitFieldDefaultProps.falseIcon}\r\n falseColor={NotifyBitFieldDefaultProps.trueColor}\r\n falseIcon={NotifyBitFieldDefaultProps.trueIcon}\r\n />\r\n }\r\n </Group>\r\n </Stack>\r\n )\r\n}","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_file_id: new EntityColumn<string>({ name: 'c_file_id', type: 'char', length: 20, flags: c.PKAutonum, prompt: 'File Id' }),\r\n c_fileprocess_id: new EntityColumn<string>({ name: 'c_fileprocess_id', type: 'char', length: 20, flags: c.FK, prompt: 'Fileprocess Id' }),\r\n vc_filename: new EntityColumn<string>({ name: 'vc_filename', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Filename' }),\r\n vc_filefolder: new EntityColumn<string>({ name: 'vc_filefolder', type: 'char', length: 6, flags: c.Edit, prompt: 'Filefolder' }),\r\n vc_fileguid: new EntityColumn<string>({ name: 'vc_fileguid', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Fileguid' }),\r\n bi_filesize: new EntityColumn<number>({ name: 'i_filesize', type: 'bigint', flags: c.Edit, prompt: 'Size' }),\r\n c_fileuploadstatus_id: new EntityColumn<string>({ name: 'c_fileuploadstatus_id', type: 'char', length: 20, flags: c.Edit, prompt: 'Fileuploadstatus Id' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n fst_brwStandard: { name: 'fst_brwStandard', keyMappings: { c_file_id: 0 } },\r\n fst_brwFiles: { name: 'fst_brwFiles', keyMappings: { c_file_id: 0, c_fileprocess_id: -1 } },\r\n }\r\n)\r\n\r\n\r\nexport class FileStoreDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n\r\n\r\n constructor() {\r\n super('FileStore');\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { FileStoreDef } from \"./FileStoreDef\";\r\n\r\nexport class FileStore extends Entity<FileStoreDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new FileStoreDef(), parentKeys);\r\n }\r\n}","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_file_id: new EntityColumn<string>({ name: 'c_file_id', type: 'char', length: 20, flags: c.PK, prompt: 'File Id' }),\r\n c_status_id: new EntityColumn<string>({ name: 'c_status_id', type: 'char', length: 20, flags: c.PK, prompt: 'Status Id' }),\r\n c_statusvalue_id: new EntityColumn<string>({ name: 'c_statusvalue_id', type: 'char', length: 20, flags: c.FK, prompt: 'Statusvalue Id' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n fsts_brwStandard: { name: 'fsts_brwStandard', keyMappings: { c_status_id: 0 } }\r\n }\r\n)\r\n\r\n\r\nexport class FileStoreStatusDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n\r\n\r\n constructor() {\r\n super('FileStoreStatus');\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { FileStoreStatusDef } from \"./FileStoreStatusDef\";\r\n\r\nexport class FileStoreStatus extends Entity<FileStoreStatusDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new FileStoreStatusDef(), parentKeys);\r\n }\r\n}","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_status_id: new EntityColumn<string>({ name: 'c_status_id', type: 'char', length: 20, flags: c.PK, prompt: 'Status Id' }),\r\n vc_description: new EntityColumn<string>({ name: 'vc_description', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Description' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n sta_brwStandard: { name: 'sta_brwStandard', keyMappings: { c_status_id: 0 } }\r\n }\r\n)\r\n\r\nexport class StatusDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n\r\n constructor() {\r\n super('Status');\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { StatusDef } from \"./StatusDef\";\r\n\r\n\r\nexport class Status extends Entity<StatusDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new StatusDef(), parentKeys);\r\n //this.Form = import('./StatusForm').then((module) => module.StatusForm);\r\n }\r\n}","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_status_id: new EntityColumn<string>({ name: 'c_status_id', type: 'char', length: 20, flags: c.PK, prompt: 'Status Id' }),\r\n c_statusvalue_id: new EntityColumn<string>({ name: 'c_statusvalue_id', type: 'char', length: 20, flags: c.PK, prompt: 'Statusvalue Id' }),\r\n vc_description: new EntityColumn<string>({ name: 'vc_description', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Description' }),\r\n bt_initial_value: new EntityColumn<boolean>({ name: 'bt_initial_value', type: 'bit', flags: c.Edit, prompt: 'Initial Value' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n stv_brwStandard: { name: 'stv_brwStandard', keyMappings: { c_statusvalue_id: 0 } }\r\n }\r\n)\r\n\r\nexport class StatusValuesDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n\r\n constructor() {\r\n super('StatusValues');\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { StatusValuesDef } from \"./StatusValuesDef\";\r\n\r\n\r\nexport class StatusValues extends Entity<StatusValuesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new StatusValuesDef(), parentKeys);\r\n this.Form = import('../../UI/AutoForm/AutoForm').then(module => module.AutoForm);\r\n }\r\n}","import { MicroMClient, ValuesObject } from \"../../client\";\r\nimport { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\nimport { MicromUsers } from \"../MicromUsers/MicromUsers\";\r\nimport { MicromUsersGroups } from \"../MicromUsersGroups/MicromUsersGroups\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_user_group_id: new EntityColumn<string>({ name: 'c_user_group_id', type: 'char', length: 20, flags: c.PK, prompt: 'User Group Id' }),\r\n c_user_id: new EntityColumn<string>({ name: 'c_user_id', type: 'char', length: 20, flags: c.PK, prompt: 'User Id' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n mgm_brwStandard: { name: 'mgm_brwStandard', keyMappings: { c_user_id: 0 } }\r\n }\r\n)\r\n\r\nconst lookups = () =>\r\n(\r\n {\r\n 'MicromUsers': {\r\n name: 'MicromUsers',\r\n viewMapping: { keyIndex: 0, descriptionIndex: 1 },\r\n entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new MicromUsers(client, parentKeys)\r\n },\r\n\r\n 'MicromUsersGroups': {\r\n name: 'MicromUsersGroups',\r\n viewMapping: { keyIndex: 0, descriptionIndex: 1 },\r\n entityConstructor: (client: MicroMClient, parentKeys?: ValuesObject) => new MicromUsersGroups(client, parentKeys)\r\n },\r\n\r\n }\r\n)\r\n\r\nexport class MicromUsersGroupsMembersDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n lookups = lookups();\r\n\r\n constructor() {\r\n super('MicromUsersGroupsMembers');\r\n }\r\n}","import { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { MicromUsersGroupsMembersDef } from \"./MicromUsersGroupsMembersDef\";\r\n\r\n\r\nexport class MicromUsersGroupsMembers extends Entity<MicromUsersGroupsMembersDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new MicromUsersGroupsMembersDef(), parentKeys);\r\n this.Form = 'AutoForm';\r\n this.Title = \"Microm Users Groups Members\";\r\n }\r\n}","import { Accordion, Button, Card, Group, List, Stack, Table, Text, Title, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconCheck, IconCircleCheck, IconCircleNumber1, IconCircleNumber2, IconCircleX, IconX } from \"@tabler/icons-react\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport { Value } from \"../../client\";\r\nimport { Entity, EntityColumn, EntityDefinition, getRequiredColumns } from \"../../Entity\";\r\nimport { AlertError } from \"../../UI/Core/AlertError\";\r\nimport { CircleFilledIcon } from \"../../UI/Core/CircleFilledIcon\";\r\nimport { FakeProgressBar } from \"../../UI/Core/FakeProgressBar\";\r\nimport { FormOptions } from \"../../UI/Core/types\";\r\nimport { FilesUploadForm, FileUploaderDefaultProps } from \"../../UI/FileUploader\";\r\nimport { EntityForm, EntityFormDefaultProps, useEntityForm } from \"../../UI/Form\";\r\nimport { useEntityCSVImportValidation, useImportData } from \"../../UI/ImportData\";\r\nimport { ImportEntityData } from \"./ImportEntityData\";\r\n\r\nexport interface ImportEntityDataFormProps extends FormOptions<ImportEntityData> {\r\n importEntity?: Entity<EntityDefinition>,\r\n importInfoLabel?: string,\r\n csvInstructionsLabel?: string,\r\n columnHeaderLabel?: string,\r\n dataNameLabel?: string,\r\n contentLabel?: string,\r\n dataTypeLabel?: string,\r\n errorReadingFileLabel?: string,\r\n emptyCSVFileLabel?: string,\r\n missingColumnsLabel?: string,\r\n dateFormatLabel?: string,\r\n numberFormatLabel?: string,\r\n downloadSampleLabel?: string,\r\n importButtonLabel?: string,\r\n importHelpAndInstructionsLabel?: string,\r\n recordsImportedSusccessfullyLabel?: string,\r\n recordsNotImportedDueToErrorsLabel?: string,\r\n importTheCSVFileLabel?: string,\r\n importedFileLabel?: string,\r\n errorColumnTitle?: string,\r\n rowColumnTitle?: string,\r\n}\r\n\r\nexport const ImportEntityDataFormDefaultProps: Partial<ImportEntityDataFormProps> = {\r\n initialFormMode: \"view\",\r\n importInfoLabel: \"Import a CSV file with data for\",\r\n csvInstructionsLabel: \"The CSV file must contain a header with these column names:\",\r\n columnHeaderLabel: \"Column Header\",\r\n dataNameLabel: \"Data Name\",\r\n contentLabel: \"Content\",\r\n dataTypeLabel: \"Data Type\",\r\n errorReadingFileLabel: \"Error reading file\",\r\n emptyCSVFileLabel: \"The CSV file is empty\",\r\n missingColumnsLabel: \"Missing columns:\",\r\n dateFormatLabel: \"* Dates should have the format YYYY-MM-DD\",\r\n numberFormatLabel: \"* Numbers with decimal places need to use '.' as separator\",\r\n downloadSampleLabel: \"Download a sample CSV\",\r\n importButtonLabel: \"Import\",\r\n importHelpAndInstructionsLabel: \"Help and Instructions\",\r\n recordsImportedSusccessfullyLabel: \"Records imported successfully\",\r\n recordsNotImportedDueToErrorsLabel: \"Records not imported due to errors\",\r\n importTheCSVFileLabel: \"Import the CSV file, clicking or dragging the file, then click\",\r\n importedFileLabel: \"Imported file\",\r\n errorColumnTitle: \"Error\",\r\n rowColumnTitle: \"Row\",\r\n}\r\n\r\nexport function ImportEntityDataForm(props: ImportEntityDataFormProps) {\r\n\r\n const {\r\n entity, initialFormMode, getDataOnInit, onSaved, onCancel, csvInstructionsLabel,\r\n columnHeaderLabel, dataNameLabel, contentLabel, dataTypeLabel,\r\n errorReadingFileLabel, emptyCSVFileLabel, missingColumnsLabel, importEntity,\r\n dateFormatLabel, numberFormatLabel, downloadSampleLabel, importButtonLabel, CancelText, importHelpAndInstructionsLabel,\r\n recordsImportedSusccessfullyLabel, recordsNotImportedDueToErrorsLabel, CloseText, importTheCSVFileLabel,\r\n importedFileLabel, errorColumnTitle, rowColumnTitle\r\n } = useComponentDefaultProps('ImportEntityDataForm', ImportEntityDataFormDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const formAPI = useEntityForm({ entity: entity, initialFormMode, getDataOnInit: getDataOnInit!, onSaved, onCancel, noSaveOnSubmit: true });\r\n\r\n const validation = useEntityCSVImportValidation({ emptyCSVFileLabel, errorReadingFileLabel, missingColumnsLabel });\r\n\r\n const importData = useImportData(importEntity);\r\n\r\n const required = useMemo(() => importEntity?.def.importColumns || getRequiredColumns(importEntity), [importEntity]);\r\n\r\n const [lastProcessedFile, setLastProcessedFile] = useState<string | null>(null);\r\n\r\n const handleValidateFile = useCallback(\r\n async (file: File) => {\r\n const result = await validation.validateEntityImportCSVFile({ file, requiredColumns: required });\r\n if (!result.error) setLastProcessedFile(file.name);\r\n return result;\r\n }\r\n , [required, validation])\r\n\r\n const [toggleAccordion, setToggleAccordion] = useState<string | null>(null);\r\n\r\n const generateSampleCSV = useCallback(() => {\r\n if (!importEntity) return;\r\n\r\n const headers = required.join(',');\r\n const csvContent = `data:text/csv;charset=utf-8,${headers}\\n`;\r\n const encodedUri = encodeURI(csvContent);\r\n const link = document.createElement(\"a\");\r\n link.setAttribute(\"href\", encodedUri);\r\n link.setAttribute(\"download\", `${importEntity.name}_sample.csv`);\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }, [importEntity, required]);\r\n\r\n const RequiredColumns = useMemo(() => {\r\n return importEntity ? <Table striped withBorder withColumnBorders width=\"100%\">\r\n <thead>\r\n <tr>\r\n <th>{columnHeaderLabel}</th>\r\n <th>{dataNameLabel}</th>\r\n <th>{dataTypeLabel}</th>\r\n <th>{contentLabel}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {required.map(\r\n (col_name) => {\r\n const col = importEntity.def.columns[col_name as keyof typeof importEntity.def.columns] as EntityColumn<Value>;\r\n const record = <tr key={col.name}>\r\n <td>{col.name}</td>\r\n <td>{col.prompt}</td>\r\n <td>{col.type}</td>\r\n <td>{col.description}</td>\r\n </tr>;\r\n return record;\r\n }\r\n )\r\n }\r\n </tbody>\r\n </Table> : <></>\r\n }, [columnHeaderLabel, contentLabel, dataNameLabel, dataTypeLabel, importEntity, required]);\r\n\r\n return (\r\n <EntityForm formAPI={formAPI} showCancel={false} showOK={false}>\r\n <Stack>\r\n {!importData.importStatus.loading && !importData.importStatus.data &&\r\n <>\r\n <Accordion variant=\"separated\" value={toggleAccordion} onChange={setToggleAccordion}>\r\n <Accordion.Item value=\"help\">\r\n <Accordion.Control>\r\n <Text size=\"sm\">{importHelpAndInstructionsLabel}</Text>\r\n </Accordion.Control>\r\n <Accordion.Panel>\r\n <Stack>\r\n <List spacing=\"xs\" size=\"sm\" styles={{ itemWrapper: { width: '100%' } }}>\r\n <List.Item icon={<IconCircleNumber1 size=\"1.75rem\" />}>\r\n {`${importTheCSVFileLabel} ${importButtonLabel?.toUpperCase()}`}\r\n </List.Item>\r\n <List.Item icon={<IconCircleNumber2 size=\"1.75rem\" />}>\r\n <Stack>\r\n <Text>{csvInstructionsLabel}</Text>\r\n {RequiredColumns}\r\n <Stack spacing=\"0\">\r\n <Text size=\"xs\" color=\"dimmed\">{dateFormatLabel}</Text>\r\n <Text size=\"xs\" color=\"dimmed\">{numberFormatLabel}</Text>\r\n </Stack>\r\n <Button maw=\"12rem\" size=\"sm\" variant=\"outline\" onClick={generateSampleCSV}>{downloadSampleLabel}</Button>\r\n </Stack>\r\n </List.Item>\r\n </List>\r\n </Stack>\r\n </Accordion.Panel>\r\n </Accordion.Item>\r\n </Accordion>\r\n <FilesUploadForm\r\n fileProcessColumn={entity.def.columns.c_fileprocess_id}\r\n client={entity.API.client}\r\n maxFilesCount={1}\r\n uploaderProps={{ ...FileUploaderDefaultProps, disabled: importData.importStatus.loading || importData.importStatus.data !== undefined, accept: ['text/csv'] }}\r\n onValidateFile={handleValidateFile}\r\n />\r\n </>\r\n }\r\n {importData.importStatus.loading &&\r\n <FakeProgressBar />\r\n }\r\n {importData.importStatus.error &&\r\n <AlertError mt=\"md\"><>Error: {importData.importStatus.error.status} {importData.importStatus.error.message} {importData.importStatus.error.statusMessage ?? ''}</></AlertError>\r\n }\r\n {importData.importStatus.data &&\r\n <Card withBorder>\r\n <Stack>\r\n <Title order={6}>{importedFileLabel} {lastProcessedFile}</Title>\r\n {importData.importStatus.data.SuccessCount > 0 &&\r\n <Group spacing={0}><CircleFilledIcon icon={<IconCheck size=\"0.75rem\" />} backColor={theme.colors.green[8]} />{importData.importStatus.data.SuccessCount} {recordsImportedSusccessfullyLabel}</Group>\r\n }\r\n {importData.importStatus.data.ErrorCount > 0 &&\r\n <Group spacing={0}><CircleFilledIcon icon={<IconX size=\"0.75rem\" />} backColor={theme.colors.red[8]} />{importData.importStatus.data.ErrorCount} {recordsNotImportedDueToErrorsLabel}</Group>\r\n }\r\n {importData.importStatus.data.ErrorCount > 0 &&\r\n <Table withBorder striped width=\"100%\">\r\n <thead>\r\n <tr>\r\n <th>{rowColumnTitle}</th>\r\n <th>{errorColumnTitle}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {Object.entries(importData.importStatus.data.Errors)\r\n .slice(0, 10)\r\n .map(([key, value], index) => (\r\n <tr key={key}>\r\n <td>{key}</td>\r\n <td>{value}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </Table>\r\n }\r\n </Stack>\r\n </Card>\r\n }\r\n <Group mt=\"xs\" position=\"right\">\r\n {!importData.importStatus.loading && !importData.importStatus.data &&\r\n <>\r\n <Button\r\n variant=\"light\"\r\n leftIcon={<IconCircleX size=\"1.5rem\" />}\r\n onClick={async () => { if (onCancel) await onCancel() }}\r\n >\r\n {CloseText || EntityFormDefaultProps.CloseText}\r\n </Button>\r\n <Button\r\n onClick={\r\n async () => {\r\n if (!entity.def.columns.c_fileprocess_id.value) {\r\n setToggleAccordion('help');\r\n }\r\n await importData.execute(entity.def.columns.c_fileprocess_id.value)\r\n }\r\n }\r\n loading={importData.importStatus.loading}\r\n leftIcon={<IconCircleCheck size=\"1.5rem\" />}\r\n disabled={importData.importStatus.data !== undefined}\r\n >\r\n {importButtonLabel}\r\n </Button>\r\n </>\r\n }\r\n {importData.importStatus.loading &&\r\n <Button\r\n variant=\"light\"\r\n leftIcon={<IconCircleX size=\"1.5rem\" />}\r\n onClick={() => importData.cancellation.abort()}\r\n >\r\n {CancelText || EntityFormDefaultProps.CancelText}\r\n </Button>\r\n }\r\n {importData.importStatus.data &&\r\n <Button\r\n variant=\"light\"\r\n leftIcon={<IconCircleX size=\"1.5rem\" />}\r\n onClick={async () => { if (onCancel) await onCancel() }}\r\n >\r\n {CloseText || EntityFormDefaultProps.CloseText}\r\n </Button>\r\n }\r\n </Group>\r\n\r\n </Stack>\r\n </EntityForm>\r\n )\r\n}","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityColumnFlags, EntityDefinition } from \"../../Entity\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n c_email_configuration_id: new EntityColumn<string>({ name: 'c_email_configuration_id', type: 'char', length: 20, flags: c.PK, prompt: 'Email Configuration Id' }),\r\n vc_smtp_host: new EntityColumn<string>({\r\n name: 'vc_smtp_host', type: 'varchar', length: 2048, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Smtp Host',\r\n description: 'The host of the smtp server', placeholder: 'smtp.gmail.com'\r\n }),\r\n i_smtp_port: new EntityColumn<number>({\r\n name: 'i_smtp_port', type: 'int', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Smtp Port',\r\n description: 'The port of the smtp server', placeholder: '465'\r\n }),\r\n vc_user_name: new EntityColumn<string>({\r\n name: 'vc_user_name', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Smtp Username',\r\n description: 'The username for the smtp server'\r\n }),\r\n vc_password: new EntityColumn<string>({\r\n name: 'vc_password', type: 'varchar', length: 2048, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Smtp Password',\r\n description: 'The password for the smtp server'\r\n }),\r\n bt_use_ssl: new EntityColumn<boolean>({\r\n name: 'bt_use_ssl', type: 'bit', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Use Ssl',\r\n description: 'Use ssl for the smtp server'\r\n }),\r\n vc_default_sender_email: new EntityColumn<string>({\r\n name: 'vc_default_sender_email', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Default Sender Email',\r\n description: 'The default sender email address'\r\n }),\r\n vc_default_sender_name: new EntityColumn<string>({\r\n name: 'vc_default_sender_name', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Default Sender Name',\r\n description: 'The default sender name'\r\n }),\r\n vc_template_subject: new EntityColumn<string>({\r\n name: 'vc_template_subject', type: 'varchar', length: 255, flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Subject',\r\n description: 'The subject for the recovery email',\r\n defaultValue: 'Password recovery',\r\n placeholder: 'Password recovery',\r\n }),\r\n vc_template_body: new EntityColumn<string>({\r\n name: 'vc_template_body', type: 'varchar', flags: c.Edit | EntityColumnFlags.nullable, prompt: 'Message',\r\n description: 'The message body for the recovery email',\r\n defaultValue: 'You have requested an email to recover your password.\\n\\nPlease follow this link to set your new password: https://<YOUR_SITE>/recover/?code={RECOVERY_CODE}\\n\\nThe support team.',\r\n placeholder: 'You have requested an email to recover your password.\\n\\nPlease follow this link to set your new password: https://<YOUR_SITE>/recover/?code={RECOVERY_CODE}\\n\\nThe support team.',\r\n }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n eqc_brwStandard: { name: 'eqc_brwStandard', keyMappings: { c_email_configuration_id: 0 } }\r\n }\r\n)\r\n\r\nexport class EmailServiceConfigurationDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n\r\n constructor() {\r\n super('EmailServiceConfiguration');\r\n }\r\n}","import { IconMailCog } from \"@tabler/icons-react\";\r\nimport { MicroMClient } from \"../../client\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { EmailServiceConfigurationDef } from \"./EmailServiceConfigurationDef\";\r\n\r\nexport const EmailServiceConfigurationIcon = IconMailCog;\r\nexport const EmailServiceConfigurationHelpText = '* Configure your email server settings.';\r\nexport const EmailServiceConfigurationTitle = 'Email Service Configuration';\r\n\r\nexport class EmailServiceConfiguration extends Entity<EmailServiceConfigurationDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new EmailServiceConfigurationDef(), parentKeys);\r\n this.Form = import('./EmailServiceConfigurationForm').then((module) => module.EmailServiceConfigurationForm);\r\n this.Title = EmailServiceConfigurationTitle;\r\n this.HelpText = EmailServiceConfigurationHelpText;\r\n this.Icon = EmailServiceConfigurationIcon;\r\n\r\n this.def.columns.c_email_configuration_id.value = client.getAPPID();\r\n }\r\n}","import { Button, Card, Divider, Group, Stack, Tabs, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconMailCheck, IconMailCog } from \"@tabler/icons-react\";\r\nimport { ReactNode } from \"react\";\r\nimport { CheckboxField, EntityForm, FormOptions, NumberField, PasswordField, TextAreaField, TextField, useEntityForm } from \"../../UI\";\r\nimport { EmailServiceConfiguration } from \"./EmailServiceConfiguration\";\r\n\r\nexport interface EmailServiceConfigurationFormProps extends FormOptions<EmailServiceConfiguration> {\r\n settingsTABLabel?: string,\r\n settingsTABIcon?: ReactNode,\r\n recoveryTABLabel?: string,\r\n recoveryTABIcon?: ReactNode,\r\n setDefaultMessageButtonLabel?: string,\r\n}\r\n\r\nexport const EmailServiceConfigurationFormDefaultProps: Partial<EmailServiceConfigurationFormProps> = {\r\n initialFormMode: \"view\",\r\n settingsTABIcon: <IconMailCog size=\"1rem\" />,\r\n settingsTABLabel: 'Settings',\r\n recoveryTABIcon: <IconMailCheck size=\"1rem\" />,\r\n recoveryTABLabel: 'Recovery template',\r\n setDefaultMessageButtonLabel: 'Set default message',\r\n}\r\n\r\nconst TN = {\r\n settings: 'settings',\r\n recovery: 'recovery',\r\n};\r\n\r\nexport function EmailServiceConfigurationForm(props: EmailServiceConfigurationFormProps) {\r\n\r\n const {\r\n entity, initialFormMode, getDataOnInit, onSaved, onCancel, settingsTABLabel, settingsTABIcon, recoveryTABLabel, recoveryTABIcon,\r\n setDefaultMessageButtonLabel\r\n } = useComponentDefaultProps('EmailServiceConfiguration', EmailServiceConfigurationFormDefaultProps, props);\r\n\r\n const formAPI = useEntityForm({ entity: entity, initialFormMode, getDataOnInit: getDataOnInit!, onSaved, onCancel });\r\n\r\n const { formMode, status, form } = formAPI;\r\n\r\n const theme = useMantineTheme();\r\n\r\n const minFormHeight = '75vh';\r\n\r\n return (\r\n <EntityForm formAPI={formAPI}>\r\n <Stack>\r\n <Card bg={theme.colorScheme === 'dark' ? theme.colors.dark[9] : undefined} withBorder={theme.colorScheme === 'dark' ? false : true} mih=\"65vh\">\r\n <Tabs defaultValue={TN.settings} mih={minFormHeight}>\r\n <Tabs.List mb=\"xs\">\r\n <Tabs.Tab value={TN.settings} icon={settingsTABIcon} >{settingsTABLabel}</Tabs.Tab>\r\n <Tabs.Tab value={TN.recovery} icon={recoveryTABIcon} >{recoveryTABLabel}</Tabs.Tab>\r\n </Tabs.List>\r\n <Tabs.Panel value={TN.settings}>\r\n <Stack>\r\n <TextField entityForm={formAPI} column={entity.def.columns.vc_smtp_host} />\r\n <NumberField entityForm={formAPI} column={entity.def.columns.i_smtp_port} maw=\"20rem\" />\r\n <TextField entityForm={formAPI} column={entity.def.columns.vc_user_name} maw=\"20rem\" />\r\n <PasswordField entityForm={formAPI} column={entity.def.columns.vc_password} maw=\"20rem\" />\r\n <CheckboxField entityForm={formAPI} column={entity.def.columns.bt_use_ssl} />\r\n <Divider />\r\n <TextField entityForm={formAPI} column={entity.def.columns.vc_default_sender_email} />\r\n <TextField entityForm={formAPI} column={entity.def.columns.vc_default_sender_name} />\r\n </Stack>\r\n </Tabs.Panel>\r\n <Tabs.Panel value={TN.recovery}>\r\n <Stack>\r\n <TextField entityForm={formAPI} column={entity.def.columns.vc_template_subject} />\r\n <TextAreaField entityForm={formAPI} column={entity.def.columns.vc_template_body} minRows={10} maxRows={10} />\r\n <Group>\r\n <Button variant=\"outline\" onClick={() => {\r\n form.setFieldValue(entity.def.columns.vc_template_subject.name, entity.def.columns.vc_template_subject.defaultValue);\r\n form.setFieldValue(entity.def.columns.vc_template_body.name, entity.def.columns.vc_template_body.defaultValue);\r\n }}>{setDefaultMessageButtonLabel}</Button>\r\n </Group>\r\n </Stack>\r\n </Tabs.Panel>\r\n </Tabs>\r\n </Card>\r\n </Stack>\r\n </EntityForm>\r\n )\r\n}","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n vc_classname: new EntityColumn<string>({ name: 'vc_classname', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Classname' }),\r\n vc_table: new EntityColumn<string>({ name: 'vc_table', type: 'varchar', flags: c.Edit, prompt: 'Table' }),\r\n vc_indexes: new EntityColumn<string>({ name: 'vc_indexes', type: 'varchar', flags: c.Edit, prompt: 'Indexes' }),\r\n vc_sp_get: new EntityColumn<string>({ name: 'vc_sp_get', type: 'varchar', flags: c.Edit, prompt: 'Sp Get' }),\r\n vc_sp_update: new EntityColumn<string>({ name: 'vc_sp_update', type: 'varchar', flags: c.Edit, prompt: 'Sp Update' }),\r\n vc_sp_iupdate: new EntityColumn<string>({ name: 'vc_sp_iupdate', type: 'varchar', flags: c.Edit, prompt: 'Sp Iupdate' }),\r\n vc_sp_updatei: new EntityColumn<string>({ name: 'vc_sp_updatei', type: 'varchar', flags: c.Edit, prompt: 'Sp Updatei' }),\r\n vc_sp_drop: new EntityColumn<string>({ name: 'vc_sp_drop', type: 'varchar', flags: c.Edit, prompt: 'Sp Drop' }),\r\n vc_sp_idrop: new EntityColumn<string>({ name: 'vc_sp_idrop', type: 'varchar', flags: c.Edit, prompt: 'Sp Idrop' }),\r\n vc_sp_dropi: new EntityColumn<string>({ name: 'vc_sp_dropi', type: 'varchar', flags: c.Edit, prompt: 'Sp Dropi' }),\r\n vc_sp_lookup: new EntityColumn<string>({ name: 'vc_sp_lookup', type: 'varchar', flags: c.Edit, prompt: 'Sp Lookup' }),\r\n vc_sp_brwStandard: new EntityColumn<string>({ name: 'vc_sp_brwStandard', type: 'varchar', flags: c.Edit, prompt: 'Sp Brwstandard' }),\r\n vc_custom_procs: new EntityColumn<string>({ name: 'vc_custom_procs', type: 'varchar', flags: c.Edit, prompt: 'Custom Procs' }),\r\n vc_react_definition: new EntityColumn<string>({ name: 'vc_react_definition', type: 'varchar', flags: c.Edit, prompt: 'React Definition' }),\r\n vc_react_entity: new EntityColumn<string>({ name: 'vc_react_entity', type: 'varchar', flags: c.Edit, prompt: 'React Entity' }),\r\n vc_react_categories: new EntityColumn<string>({ name: 'vc_react_categories', type: 'varchar', flags: c.Edit, prompt: 'React Categories' }),\r\n vc_react_form: new EntityColumn<string>({ name: 'vc_react_form', type: 'varchar', flags: c.Edit, prompt: 'React Form' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\n\r\nexport class MicromDeveloperToolsCodeGenDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n\r\n constructor() {\r\n super('MicromDeveloperToolsCodeGen');\r\n }\r\n}","import { MicroMClient } from \"../../client/MicromClient\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { MicromDeveloperToolsCodeGenDef } from \"./MicromDeveloperToolsCodeGenDef\";\r\n\r\nexport class MicromDeveloperToolsCodeGen extends Entity<MicromDeveloperToolsCodeGenDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new MicromDeveloperToolsCodeGenDef(), parentKeys);\r\n this.Form = import('./MicromDeveloperToolsCodeGenForm').then((module) => module.MicromDeveloperToolsCodeGenForm);\r\n this.Title = \"Generated Code\";\r\n }\r\n}","import { Card, Tabs, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconBrandTypescript, IconFileTypeSql } from \"@tabler/icons-react\";\r\nimport { CodeBlock, EntityForm, FormOptions, useEntityForm } from \"../../UI\";\r\nimport { MicromDeveloperToolsCodeGen } from \"./MicromDeveloperToolsCodeGen\";\r\n\r\nexport const MicromDeveloperToolsCodeGenFormDefaultProps: Partial<FormOptions<MicromDeveloperToolsCodeGen>> = {\r\n initialFormMode: \"view\"\r\n}\r\n\r\nexport function MicromDeveloperToolsCodeGenForm(props: FormOptions<MicromDeveloperToolsCodeGen>) {\r\n const { entity, initialFormMode, getDataOnInit, onSaved, onCancel } = useComponentDefaultProps('MicromDeveloperToolsCodeGenForm', MicromDeveloperToolsCodeGenFormDefaultProps, props);\r\n const formAPI = useEntityForm({ entity: entity, initialFormMode, getDataOnInit: getDataOnInit!, onSaved, onCancel });\r\n\r\n const theme = useMantineTheme();\r\n\r\n const cols = entity.def.columns;\r\n\r\n return (\r\n <EntityForm formAPI={formAPI}>\r\n <Card bg={theme.colorScheme === 'dark' ? theme.colors.dark[9] : undefined}>\r\n <Tabs defaultValue={cols.vc_table.value ? \"sqltable\" : \"reactdef\"}>\r\n <Tabs.List>\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqltable\" icon={<IconFileTypeSql />}>create_table.sql</Tabs.Tab>}\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqlupdate\" icon={<IconFileTypeSql />}>update.sql</Tabs.Tab>}\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqliupdate\" icon={<IconFileTypeSql />}>iupdate.sql</Tabs.Tab>}\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqldrop\" icon={<IconFileTypeSql />}>drop.sql</Tabs.Tab>}\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqlidrop\" icon={<IconFileTypeSql />}>idrop.sql</Tabs.Tab>}\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqlget\" icon={<IconFileTypeSql />}>get.sql</Tabs.Tab>}\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqlbrwstandard\" icon={<IconFileTypeSql />}>brwStandard.sql</Tabs.Tab>}\r\n {cols.vc_table.value && <Tabs.Tab value=\"sqllookup\" icon={<IconFileTypeSql />}>lookup.sql</Tabs.Tab>}\r\n {cols.vc_custom_procs.value &&\r\n <Tabs.Tab value=\"sqlcustom\" icon={<IconFileTypeSql />}>custom_procs.sql</Tabs.Tab>\r\n }\r\n <Tabs.Tab value=\"reactdef\" icon={<IconBrandTypescript />}>definition.tsx</Tabs.Tab>\r\n <Tabs.Tab value=\"reactentity\" icon={<IconBrandTypescript />}>entity.tsx</Tabs.Tab>\r\n <Tabs.Tab value=\"reactform\" icon={<IconBrandTypescript />}>form.tsx</Tabs.Tab>\r\n {cols.vc_react_categories.value &&\r\n <Tabs.Tab value=\"reactcategories\" icon={<IconBrandTypescript />}>categories.tsx</Tabs.Tab>\r\n }\r\n </Tabs.List>\r\n {cols.vc_table.value &&\r\n <Tabs.Panel value=\"sqltable\" mt=\"xs\">\r\n <CodeBlock language=\"sql\" codeText={`${cols.vc_table.value}${cols.vc_indexes.value ? `\\nGO\\n${cols.vc_indexes.value}` : ''}`} />\r\n </Tabs.Panel>\r\n }\r\n\r\n {cols.vc_table.value && <Tabs.Panel value=\"sqlupdate\" mt=\"xs\"><CodeBlock language=\"sql\" codeText={cols.vc_sp_update.value} /></Tabs.Panel>}\r\n {cols.vc_table.value &&\r\n <Tabs.Panel value=\"sqliupdate\" mt=\"xs\">\r\n <CodeBlock language=\"sql\" codeText={`${cols.vc_sp_iupdate.value}\\nGO${cols.vc_sp_updatei.value}`} />\r\n </Tabs.Panel>\r\n }\r\n {cols.vc_table.value && <Tabs.Panel value=\"sqldrop\" mt=\"xs\"><CodeBlock language=\"sql\" codeText={cols.vc_sp_drop.value} /></Tabs.Panel>}\r\n {cols.vc_table.value &&\r\n <Tabs.Panel value=\"sqlidrop\" mt=\"xs\">\r\n <CodeBlock language=\"sql\" codeText={`${cols.vc_sp_idrop.value}\\nGO${cols.vc_sp_dropi.value}`} />\r\n </Tabs.Panel>\r\n }\r\n {cols.vc_table.value && <Tabs.Panel value=\"sqlget\" mt=\"xs\"><CodeBlock language=\"sql\" codeText={cols.vc_sp_get.value} /></Tabs.Panel>}\r\n {cols.vc_table.value && <Tabs.Panel value=\"sqlbrwstandard\" mt=\"xs\"><CodeBlock language=\"sql\" codeText={cols.vc_sp_brwStandard.value} /></Tabs.Panel>}\r\n {cols.vc_table.value && <Tabs.Panel value=\"sqllookup\" mt=\"xs\"><CodeBlock language=\"sql\" codeText={cols.vc_sp_lookup.value} /></Tabs.Panel>}\r\n {cols.vc_custom_procs.value &&\r\n <Tabs.Panel value=\"sqlcustom\" mt=\"xs\"><CodeBlock language=\"sql\" codeText={cols.vc_custom_procs.value} /></Tabs.Panel>\r\n }\r\n <Tabs.Panel value=\"reactdef\" mt=\"xs\"><CodeBlock language=\"tsx\" codeText={cols.vc_react_definition.value} /></Tabs.Panel>\r\n <Tabs.Panel value=\"reactentity\" mt=\"xs\"><CodeBlock language=\"tsx\" codeText={cols.vc_react_entity.value} /></Tabs.Panel>\r\n {cols.vc_react_categories.value &&\r\n <Tabs.Panel value=\"reactcategories\" mt=\"xs\"><CodeBlock language=\"tsx\" codeText={cols.vc_react_categories.value} /></Tabs.Panel>\r\n }\r\n <Tabs.Panel value=\"reactform\" mt=\"xs\"><CodeBlock language=\"tsx\" codeText={cols.vc_react_form.value} /></Tabs.Panel>\r\n </Tabs>\r\n </Card>\r\n </EntityForm>\r\n )\r\n}","import { Text } from \"@mantine/core\";\r\nimport { IconDeviceDesktopCode } from \"@tabler/icons-react\";\r\nimport { ReactNode } from \"react\";\r\nimport { EntityClientAction, EntityFormComponentPromise } from \"../../Entity\";\r\nimport { MicromDeveloperToolsCodeGen } from \"../MicromDeveloperToolsCodeGen\";\r\nimport { MicromEntitiesTypes } from \"./MicromEntitiesTypes\";\r\n\r\nexport interface ACTMicromGetGeneratedCodeProps {\r\n CodeGenerationLabel: string,\r\n TitleLabel: string,\r\n icon: ReactNode,\r\n FormTitle: string\r\n}\r\n\r\nexport const ACTMicromGetGeneratedCodeDefaultProps: Partial<ACTMicromGetGeneratedCodeProps> = {\r\n CodeGenerationLabel: \"Code Generation\",\r\n TitleLabel: \"Generated Code\",\r\n icon: <IconDeviceDesktopCode size=\"1rem\" />,\r\n FormTitle: \"Generated Code\"\r\n}\r\n\r\nexport const ACTMicromGetGeneratedCode: EntityClientAction = {\r\n name: 'ACTMicromGetGeneratedCode',\r\n label: ACTMicromGetGeneratedCodeDefaultProps.CodeGenerationLabel,\r\n title: ACTMicromGetGeneratedCodeDefaultProps.TitleLabel,\r\n icon: ACTMicromGetGeneratedCodeDefaultProps.icon,\r\n showActionInViewMode: true,\r\n onClick: async ({ entity, modal, selectedKeys, element }) => {\r\n const types = entity as MicromEntitiesTypes;\r\n const code = new MicromDeveloperToolsCodeGen(types.API.client);\r\n const selected = selectedKeys?.[0][types.def.columns.vc_entity_name.name] as string;\r\n code.def.columns.vc_classname.value = selected || '';\r\n if (modal) {\r\n await modal.open({\r\n modalProps: {\r\n title: <Text fw={700}>{ACTMicromGetGeneratedCodeDefaultProps.FormTitle}</Text>,\r\n size: 'xl'\r\n },\r\n focusOnClosed: element,\r\n content: (code.Form! as EntityFormComponentPromise).then(EntityForm =>\r\n <EntityForm\r\n entity={code}\r\n initialFormMode='view'\r\n getDataOnInit={true}\r\n onCancel={async () => await modal.close()}\r\n />)\r\n });\r\n\r\n }\r\n return false;\r\n }\r\n}","import { CommonFlags as c, DefaultColumns, EntityColumn, EntityDefinition } from \"../../Entity\";\r\nimport { ACTMicromGetGeneratedCode } from \"./ACTMicromGeneratedCode\";\r\n\r\nconst columns = () =>\r\n(\r\n {\r\n vc_entity_name: new EntityColumn<string>({ name: 'vc_entity_name', type: 'varchar', length: 255, flags: c.PK, prompt: 'Entity Name' }),\r\n vc_entity_type: new EntityColumn<string>({ name: 'vc_entity_type', type: 'varchar', length: 255, flags: c.Edit, prompt: 'Entity Type' }),\r\n ...DefaultColumns()\r\n }\r\n)\r\n\r\nconst views = () =>\r\n(\r\n {\r\n mty_brwStandard: { name: 'mty_brwStandard', keyMappings: { vc_entity_name: 0 } }\r\n }\r\n)\r\n\r\nconst clientActions = () => (\r\n {\r\n ACTMicromGetGeneratedCode\r\n }\r\n)\r\n\r\nexport class MicromEntitiesTypesDef extends EntityDefinition {\r\n\r\n columns = columns();\r\n views = views();\r\n clientActions = clientActions();\r\n\r\n constructor() {\r\n super('MicromEntitiesTypes');\r\n }\r\n}","import { MicroMClient } from \"../../client/MicromClient\";\r\nimport { Entity } from \"../../Entity\";\r\nimport { MicromEntitiesTypesDef } from \"./MicromEntitiesTypesDef\";\r\n\r\nexport class MicromEntitiesTypes extends Entity<MicromEntitiesTypesDef> {\r\n\r\n constructor(client: MicroMClient, parentKeys = {}) {\r\n super(client, new MicromEntitiesTypesDef(), parentKeys);\r\n this.Title = \"Microm Entities Types\";\r\n }\r\n}","import \"react-advanced-cropper/dist/style.css\";\r\nimport \"./ImageEditor.scss\";\r\nimport { ColorScheme, useMantineColorScheme } from \"@mantine/core\";\r\nimport { IconBrightnessUp, IconCircleCheckFilled, IconColorFilter, IconContrast, IconCrop, IconDropletHalf2Filled, IconRestore } from \"@tabler/icons-react\";\r\nimport React, { ButtonHTMLAttributes, CSSProperties, FC, forwardRef, useLayoutEffect } from \"react\";\r\nimport { PureComponent, useRef, useState } from \"react\";\r\nimport { Cropper, CropperImage, CropperPreview, CropperPreviewRef, CropperRef, CropperState, CropperTransitions, getBackgroundStyle, getPreviewStyle, mergeRefs, Size } from \"react-advanced-cropper\";\r\n\r\ninterface ImageEditorProps {\r\n src:string,\r\n onOk:(imageBlob:Blob) => void\r\n }\r\n\r\nexport const ImageEditor = ({ src, onOk }:ImageEditorProps) => {\r\n const cropperRef = useRef<CropperRef>(null);\r\n const previewRef = useRef<CropperPreviewRef>(null);\r\n const { colorScheme } = useMantineColorScheme();\r\n \r\n //const [src, setSrc] = useState(require(\"./photo.jpeg\"));\r\n \r\n const [mode, setMode] = useState(\"crop\");\r\n \r\n const [adjustments, setAdjustments] = useState({\r\n brightness: 0,\r\n hue: 0,\r\n saturation: 0,\r\n contrast: 0\r\n });\r\n \r\n const onChangeValue = (value: number) => {\r\n if (mode in adjustments) {\r\n setAdjustments((previousValue) => ({\r\n ...previousValue,\r\n [mode]: value\r\n }));\r\n }\r\n };\r\n \r\n const onReset = () => {\r\n setMode(\"crop\");\r\n setAdjustments({\r\n brightness: 0,\r\n hue: 0,\r\n saturation: 0,\r\n contrast: 0\r\n });\r\n };\r\n \r\n // const onUpload = (blob: string) => {\r\n // onReset();\r\n // setMode(\"crop\");\r\n // setSrc(blob);\r\n // };\r\n \r\n const onNavigationOk = () => {\r\n if (cropperRef.current) {\r\n // const newTab = window.open();\r\n // if (newTab) {\r\n // newTab.document.body.innerHTML = `<img src=\"${cropperRef.current\r\n // .getCanvas()\r\n // ?.toDataURL()}\"/>`;\r\n // }\r\n\r\n //TODO: loading\r\n cropperRef.current.getCanvas()?.toBlob(imageBlob => {\r\n if (imageBlob) {\r\n onOk(imageBlob);\r\n }\r\n });\r\n \r\n //.toDataURL();\r\n\r\n }\r\n };\r\n \r\n const onUpdate = () => {\r\n previewRef.current?.refresh();\r\n };\r\n \r\n const changed = Object.values(adjustments).some((el) => Math.floor(el * 100));\r\n \r\n const cropperEnabled = mode === \"crop\";\r\n \r\n return (\r\n <div className={\"image-editor\"}>\r\n <div className=\"image-editor__cropper\">\r\n <Cropper\r\n src={src}\r\n ref={cropperRef}\r\n stencilProps={{\r\n movable: cropperEnabled,\r\n resizable: cropperEnabled,\r\n lines: cropperEnabled,\r\n handlers: cropperEnabled,\r\n overlayClassName: cn(\r\n \"image-editor__cropper-overlay\",\r\n !cropperEnabled && \"image-editor__cropper-overlay--faded\"\r\n )\r\n }}\r\n backgroundWrapperProps={{\r\n scaleImage: cropperEnabled,\r\n moveImage: cropperEnabled\r\n }}\r\n backgroundComponent={AdjustableCropperBackground}\r\n backgroundProps={adjustments}\r\n onUpdate={onUpdate}\r\n />\r\n {mode !== \"crop\" && (\r\n <Slider\r\n className=\"image-editor__slider\"\r\n value={(adjustments as Record<string, number>)[mode]}\r\n onChange={onChangeValue}\r\n />\r\n )}\r\n <CropperPreview\r\n className={\"image-editor__preview\"}\r\n ref={previewRef}\r\n cropper={cropperRef}\r\n backgroundComponent={AdjustablePreviewBackground}\r\n backgroundProps={adjustments}\r\n />\r\n <Button\r\n className={cn(\r\n \"image-editor__reset-button\",\r\n !changed && \"image-editor__reset-button--hidden\"\r\n )}\r\n onClick={onReset}\r\n >\r\n <IconRestore />\r\n </Button>\r\n </div>\r\n <Navigation\r\n mode={mode}\r\n onChange={setMode}\r\n //onUpload={onUpload}\r\n onOk={onNavigationOk}\r\n />\r\n </div>\r\n );\r\n };\r\n\r\n interface SliderProps {\r\n className?: string;\r\n onChange?: (value: number) => void;\r\n value?: number;\r\n showValue?: boolean;\r\n }\r\n \r\n export function Slider(props:SliderProps) {\r\n const { colorScheme } = useMantineColorScheme();\r\n return <SliderInternal colorScheme={colorScheme} {...props} />;\r\n }\r\n\r\n class SliderInternal extends PureComponent<SliderProps & { colorScheme:ColorScheme }> {\r\n line = React.createRef<HTMLDivElement>();\r\n \r\n state = {\r\n focus: false,\r\n width: 0\r\n };\r\n \r\n componentDidMount() {\r\n window.addEventListener(\"resize\", this.recalculateWidth);\r\n window.addEventListener(\"orientationchange\", this.recalculateWidth);\r\n \r\n window.addEventListener(\"mouseup\", this.onStop, { passive: false });\r\n window.addEventListener(\"mousemove\", this.onDrag, { passive: false });\r\n window.addEventListener(\"touchmove\", this.onDrag, { passive: false });\r\n window.addEventListener(\"touchend\", this.onStop, { passive: false });\r\n \r\n const line = this.line.current;\r\n if (line) {\r\n line.addEventListener(\"mousedown\", this.onStart);\r\n line.addEventListener(\"touchstart\", this.onStart);\r\n }\r\n \r\n this.recalculateWidth();\r\n }\r\n componentWillUnmount() {\r\n window.removeEventListener(\"mouseup\", this.onStop);\r\n window.removeEventListener(\"mousemove\", this.onDrag);\r\n window.removeEventListener(\"touchmove\", this.onDrag);\r\n window.removeEventListener(\"touchend\", this.onStop);\r\n \r\n window.removeEventListener(\"resize\", this.recalculateWidth);\r\n window.removeEventListener(\"orientationchange\", this.recalculateWidth);\r\n \r\n const line = this.line.current;\r\n if (line) {\r\n line.removeEventListener(\"mousedown\", this.onStart);\r\n line.removeEventListener(\"touchstart\", this.onStart);\r\n }\r\n }\r\n onDrag = (e: MouseEvent | TouchEvent) => {\r\n const { onChange } = this.props;\r\n if (this.state.focus) {\r\n const position = \"touches\" in e ? e.touches[0].clientX : e.clientX;\r\n const line = this.line.current;\r\n \r\n if (line) {\r\n const { left, width } = line.getBoundingClientRect();\r\n \r\n if (onChange) {\r\n onChange(\r\n Math.max(\r\n -1,\r\n Math.min(1, (2 * (position - left - width / 2)) / width)\r\n )\r\n );\r\n }\r\n }\r\n if (e.preventDefault) {\r\n e.preventDefault();\r\n }\r\n }\r\n };\r\n onStop = () => {\r\n this.setState({\r\n focus: false\r\n });\r\n };\r\n onStart = (e: MouseEvent | TouchEvent) => {\r\n this.setState({\r\n focus: true\r\n });\r\n this.onDrag(e);\r\n };\r\n recalculateWidth = () => {\r\n const line = this.line.current;\r\n if (line) {\r\n this.setState({\r\n width: line.clientWidth\r\n });\r\n }\r\n };\r\n render() {\r\n const { value = 0, className } = this.props;\r\n \r\n const handleInsideDot = this.state.width\r\n ? Math.abs(value) <= 16 / this.state.width\r\n : true;\r\n \r\n const fillWidth = `${Math.abs(value) * 50}%`;\r\n \r\n const fillLeft = `${50 * (1 - Math.abs(Math.min(0, value)))}%`;\r\n \r\n const formattedValue = `${value > 0 ? \"+\" : \"\"}${Math.round(100 * value)}`;\r\n \r\n return (\r\n <div className={cn(\"image-editor-slider\", className!)} ref={this.line}>\r\n <div className=\"image-editor-slider__line\">\r\n <div\r\n className=\"image-editor-slider__fill\"\r\n style={{\r\n width: fillWidth,\r\n left: fillLeft\r\n }}\r\n />\r\n <div className=\"image-editor-slider__dot\" />\r\n <div\r\n className={cn(\r\n \"image-editor-slider__value\",\r\n handleInsideDot && \"image-editor-slider__value--hidden\"\r\n )}\r\n style={{\r\n left: `${Math.abs(value * 50 + 50)}%`\r\n }}\r\n >\r\n {formattedValue}\r\n </div>\r\n <div\r\n className={cn(\r\n \"image-editor-slider__handler\",\r\n this.state.focus && \"image-editor-slider__handler--focus\",\r\n handleInsideDot && \"image-editor-slider__handler--hidden\"\r\n )}\r\n style={{\r\n left: `${value * 50 + 50}%`\r\n }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n }\r\n }\r\n \r\n interface NavigationProps {\r\n className?: string;\r\n mode?: string;\r\n onChange?: (mode: string) => void;\r\n onOk?: () => void;\r\n //onUpload?: (blob: string) => void;\r\n }\r\n \r\n export const Navigation: FC<NavigationProps> = ({\r\n className,\r\n onChange,\r\n //onUpload,\r\n onOk,\r\n mode\r\n }) => {\r\n const { colorScheme } = useMantineColorScheme();\r\n const setMode = (mode: string) => () => {\r\n onChange?.(mode);\r\n };\r\n \r\n //const inputRef = useRef<HTMLInputElement>(null);\r\n \r\n // const onUploadButtonClick = () => {\r\n // inputRef.current?.click();\r\n // };\r\n \r\n // const onLoadImage = (event: ChangeEvent<HTMLInputElement>) => {\r\n // // Reference to the DOM input element\r\n // const { files } = event.target;\r\n \r\n // // Ensure that you have a file before attempting to read it\r\n // if (files && files[0]) {\r\n // if (onUpload) {\r\n // onUpload(URL.createObjectURL(files[0]));\r\n // }\r\n // }\r\n // // Clear the event target value to give the possibility to upload the same image:\r\n // event.target.value = \"\";\r\n // };\r\n \r\n return (\r\n <div className={cn(\"image-editor-navigation\", className)}>\r\n {/* <Button\r\n className={\"image-editor-navigation__button\"}\r\n onClick={onUploadButtonClick}\r\n >\r\n <UploadIcon />\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={onLoadImage}\r\n className=\"image-editor-navigation__upload-input\"\r\n />\r\n </Button> */}\r\n <div className=\"image-editor-navigation__buttons\">\r\n <Button\r\n className={\"image-editor-navigation__button\"}\r\n active={mode === \"crop\"}\r\n onClick={setMode(\"crop\")}\r\n >\r\n <IconCrop />\r\n </Button>\r\n <Button\r\n className={\"image-editor-navigation__button\"}\r\n active={mode === \"saturation\"}\r\n onClick={setMode(\"saturation\")}\r\n >\r\n <IconDropletHalf2Filled />\r\n </Button>\r\n <Button\r\n className={\"image-editor-navigation__button\"}\r\n active={mode === \"brightness\"}\r\n onClick={setMode(\"brightness\")}\r\n >\r\n <IconBrightnessUp />\r\n </Button>\r\n <Button\r\n className={\"image-editor-navigation__button\"}\r\n active={mode === \"contrast\"}\r\n onClick={setMode(\"contrast\")}\r\n >\r\n <IconContrast />\r\n </Button>\r\n <Button\r\n className={\"image-editor-navigation__button\"}\r\n active={mode === \"hue\"}\r\n onClick={setMode(\"hue\")}\r\n >\r\n <IconColorFilter />\r\n </Button>\r\n </div>\r\n <Button\r\n className={\"image-editor-navigation__button__ok\"}\r\n onClick={onOk}\r\n >\r\n <IconCircleCheckFilled />\r\n </Button>\r\n </div>\r\n );\r\n };\r\n \r\n interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n\tactive?: boolean;\r\n}\r\n\r\nexport const Button: FC<ButtonProps> = ({ className, active, children, ...props }) => {\r\n const { colorScheme } = useMantineColorScheme();\r\n\treturn (\r\n\t\t<button className={cn('image-editor-button', active && 'image-editor-button--active', className)} {...props}>\r\n\t\t\t{children}\r\n\t\t</button>\r\n\t);\r\n};\r\n\r\ninterface DesiredCropperRef {\r\n\tgetState: () => CropperState;\r\n\tgetTransitions: () => CropperTransitions;\r\n\tgetImage: () => CropperImage;\r\n}\r\n\r\ninterface AdjustablePreviewBackgroundProps {\r\n\tclassName?: string;\r\n\tcropper: DesiredCropperRef;\r\n\tcrossOrigin?: 'anonymous' | 'use-credentials' | boolean;\r\n\tbrightness?: number;\r\n\tsaturation?: number;\r\n\thue?: number;\r\n\tcontrast?: number;\r\n\tsize?: Size | null;\r\n}\r\n\r\nexport const AdjustablePreviewBackground = ({\r\n\tclassName,\r\n\tcropper,\r\n\tcrossOrigin,\r\n\tbrightness = 0,\r\n\tsaturation = 0,\r\n\thue = 0,\r\n\tcontrast = 0,\r\n\tsize,\r\n}: AdjustablePreviewBackgroundProps) => {\r\n\tconst state = cropper.getState();\r\n\tconst transitions = cropper.getTransitions();\r\n\tconst image = cropper.getImage();\r\n\r\n\tconst style = image && state && size ? getPreviewStyle(image, state, size, transitions) : {};\r\n\r\n\treturn (\r\n\t\t<AdjustableImage\r\n\t\t\tsrc={image?.src}\r\n\t\t\tcrossOrigin={crossOrigin}\r\n\t\t\tbrightness={brightness}\r\n\t\t\tsaturation={saturation}\r\n\t\t\thue={hue}\r\n\t\t\tcontrast={contrast}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={style}\r\n\t\t/>\r\n\t);\r\n};\r\n\r\n\r\ninterface AdjustableImageProps {\r\n\tsrc?: string;\r\n\tclassName?: string;\r\n\tcrossOrigin?: 'anonymous' | 'use-credentials' | boolean;\r\n\tbrightness?: number;\r\n\tsaturation?: number;\r\n\thue?: number;\r\n\tcontrast?: number;\r\n\tstyle?: CSSProperties;\r\n}\r\n\r\nexport const AdjustableImage = forwardRef<HTMLCanvasElement, AdjustableImageProps>(\r\n\t({ src, className, crossOrigin, brightness = 0, saturation = 0, hue = 0, contrast = 0, style }: AdjustableImageProps, ref) => {\r\n\t\tconst imageRef = useRef<HTMLImageElement>(null);\r\n\t\tconst canvasRef = useRef<HTMLCanvasElement>(null);\r\n\r\n\t\tconst drawImage = () => {\r\n\t\t\tconst image = imageRef.current;\r\n\t\t\tconst canvas = canvasRef.current;\r\n\t\t\tif (canvas && image && image.complete) {\r\n\t\t\t\tconst ctx = canvas.getContext('2d');\r\n\t\t\t\tcanvas.width = image.naturalWidth;\r\n\t\t\t\tcanvas.height = image.naturalHeight;\r\n\r\n\t\t\t\tif (ctx) {\r\n\t\t\t\t\tctx.filter = [\r\n\t\t\t\t\t\t`brightness(${100 + brightness * 100}%)`,\r\n\t\t\t\t\t\t`contrast(${100 + contrast * 100}%)`,\r\n\t\t\t\t\t\t`saturate(${100 + saturation * 100}%)`,\r\n\t\t\t\t\t\t`hue-rotate(${hue * 360}deg)`,\r\n\t\t\t\t\t].join(' ');\r\n\r\n\t\t\t\t\tctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tuseLayoutEffect(() => {\r\n\t\t\tdrawImage();\r\n\t\t}, [src, brightness, saturation, hue, contrast]);\r\n\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t<canvas\r\n\t\t\t\t\tkey={`${src}-canvas`}\r\n\t\t\t\t\tref={mergeRefs([ref, canvasRef])}\r\n\t\t\t\t\tclassName={cn('adjustable-image-element', className)}\r\n\t\t\t\t\tstyle={style}\r\n\t\t\t\t/>\r\n\t\t\t\t{src ? (\r\n\t\t\t\t\t<img\r\n\t\t\t\t\t\tkey={`${src}-img`}\r\n\t\t\t\t\t\tref={imageRef}\r\n\t\t\t\t\t\tclassName={'adjustable-image-source'}\r\n\t\t\t\t\t\tsrc={src}\r\n\t\t\t\t\t\tcrossOrigin={crossOrigin === true ? 'anonymous' : crossOrigin || undefined}\r\n\t\t\t\t\t\tonLoad={drawImage}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t</>\r\n\t\t);\r\n\t},\r\n);\r\n\r\nAdjustableImage.displayName = 'AdjustableImage';\r\n\r\ninterface DesiredCropperRef {\r\n getState: () => CropperState;\r\n getTransitions: () => CropperTransitions;\r\n getImage: () => CropperImage;\r\n }\r\n \r\n interface Props {\r\n className?: string;\r\n cropper: DesiredCropperRef;\r\n crossOrigin?: \"anonymous\" | \"use-credentials\" | boolean;\r\n brightness?: number;\r\n saturation?: number;\r\n hue?: number;\r\n contrast?: number;\r\n }\r\n \r\n export const AdjustableCropperBackground = forwardRef<HTMLCanvasElement, Props>(\r\n (\r\n {\r\n className,\r\n cropper,\r\n crossOrigin,\r\n brightness = 0,\r\n saturation = 0,\r\n hue = 0,\r\n contrast = 0\r\n }: Props,\r\n ref\r\n ) => {\r\n const state = cropper.getState();\r\n const transitions = cropper.getTransitions();\r\n const image = cropper.getImage();\r\n \r\n const style =\r\n image && state ? getBackgroundStyle(image, state, transitions) : {};\r\n \r\n return (\r\n <AdjustableImage\r\n src={image?.src}\r\n crossOrigin={crossOrigin}\r\n brightness={brightness}\r\n saturation={saturation}\r\n hue={hue}\r\n contrast={contrast}\r\n ref={ref}\r\n className={className}\r\n style={style}\r\n />\r\n );\r\n }\r\n );\r\n \r\n AdjustableCropperBackground.displayName = 'AdjustableCropperBackground';\r\n\r\n\r\n const hasOwn = {}.hasOwnProperty;\r\n\r\n function classNames(...args: (string | number | Record<string, string> | boolean | undefined)[]): string {\r\n let classes = '';\r\n \r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i];\r\n if (arg) {\r\n classes = appendClass(classes, parseValue(arg));\r\n }\r\n }\r\n \r\n return classes;\r\n }\r\n \r\n const cn = classNames;\r\n \r\n function parseValue(arg: string | number | Record<string, string> | boolean | undefined): string {\r\n if (typeof arg === 'string' || typeof arg === 'number') {\r\n return arg.toString();\r\n }\r\n \r\n if (typeof arg !== 'object' || arg === null) {\r\n return '';\r\n }\r\n \r\n if (Array.isArray(arg)) {\r\n return classNames(...arg);\r\n }\r\n \r\n if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\r\n return arg.toString();\r\n }\r\n \r\n let classes = '';\r\n \r\n for (const key in arg) {\r\n if (Object.prototype.hasOwnProperty.call(arg, key) && arg[key]) {\r\n classes = appendClass(classes, key);\r\n }\r\n }\r\n \r\n return classes;\r\n }\r\n \r\n function appendClass(value: string, newClass: string): string {\r\n if (!newClass) {\r\n return value;\r\n }\r\n \r\n return value ? `${value} ${newClass}` : newClass;\r\n }\r\n ","import { Text, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { DBStatusResult, MicroMClient } from \"../../client\";\r\nimport { FileStore } from \"../../DataDictionary\";\r\nimport { FileStoreProcess } from \"../../DataDictionary/FileStoreProcess/FileStoreProcess\";\r\nimport { EntityColumn, mapDataResultToType } from \"../../Entity\";\r\nimport { useModal } from \"../Core\";\r\nimport { ImageEditor } from \"./ImageEditor\";\r\n\nexport interface UseFileUploadReturnType {\n uploadFiles: (selectedFiles: File[]) => Promise<void>,\n deleteFile: (file_id: string, fileGUID: string) => Promise<DBStatusResult>,\n downloadFile: (fileUrl: string, fileName?: string) => Promise<void>,\n uploadProgress: Record<string, UploadProgressReport>,\n fileProcessID: string,\n maxIndividualFileSize?: number,\n maxTotalFilesSize?: number,\n maxFilesCount?: number,\n errorNotification?: string,\n cancelledNotification?: boolean,\n uploadingNotification?: boolean,\n clearNotifications?: () => void,\n cancelUpload?: () => void,\n loadingNotification?: boolean,\n}\n\nexport type ValidateFileReturnType = { error: boolean, message?: string };\n\nexport interface UseFileUploadProps {\n client: MicroMClient,\n fileProcessColumn: EntityColumn<string>,\n maxIndividualFileSize?: number,\n maxTotalFilesSize?: number,\n maxFilesCount?: number,\n youCanUploadAMaximumOfText?: string,\n filesText?: string,\n exceedMaximumIndividualSizeText?: string,\n unspecifiedErrorWhenUploadingFileText?: string,\n totalUploadExceedsMaximumSizeText?: string,\n onCancel?: () => void,\n editor?: 'none' | 'image',\n onValidateFile?: (file: File) => Promise<ValidateFileReturnType>,\n thumbnailMaxSize?: number,\n thumbnailQuality?: number,\n}\n\nexport const UseFileUploadDefaultProps: Partial<UseFileUploadProps> = {\n maxIndividualFileSize: 2 * (1024 ** 2),\n maxTotalFilesSize: 10 * (1024 ** 2),\n maxFilesCount: 5,\n youCanUploadAMaximumOfText: 'You can upload a maximum of',\n filesText: 'files',\n exceedMaximumIndividualSizeText: 'exceeds maximum individual size of',\n unspecifiedErrorWhenUploadingFileText: 'Unspecified error when uploading file',\n totalUploadExceedsMaximumSizeText: 'Total upload exceeds maximum size of',\n thumbnailMaxSize: 150,\n thumbnailQuality: 75,\n}\n\nexport interface UploadProgressReport {\n errorMessage?: string,\n status_id: string,\n file_id?: string,\n progress: number,\n done?: boolean,\n cancelled?: boolean,\n documentURL?: string,\n file_name: string,\n file_size: number,\n vc_fileguid?: string,\n thumbnailURL?: string,\n}\n\nexport type UploadStatus = 'Pending' | 'Uploading' | 'Uploaded' | 'Failed' | 'Cancelled';\n\nexport type FileUploaderView = {\n c_file_id: string;\n vc_filename: string;\n vc_filefolder: string;\n vc_fileguid: string;\n c_fileuploadstatus_id: string;\n bi_filesize: number;\n};\n\nexport function useFileUpload(props: UseFileUploadProps): UseFileUploadReturnType {\n const {\n client, maxIndividualFileSize, maxTotalFilesSize, maxFilesCount,\n youCanUploadAMaximumOfText, filesText, exceedMaximumIndividualSizeText, unspecifiedErrorWhenUploadingFileText,\n totalUploadExceedsMaximumSizeText, fileProcessColumn, onCancel, editor, onValidateFile,\n thumbnailMaxSize, thumbnailQuality\n } = useComponentDefaultProps('useFileUpload', UseFileUploadDefaultProps, props);\n\n const [uploadProgress, setUploadProgress] = useState<Record<string, UploadProgressReport>>({});\n const [fileProcessID, setFileProcessID] = useState<string>(fileProcessColumn.value);\n\n const uploadedSize = useRef<number>(0);\n\n const [loadingNotification, setLoadingNotification] = useState<boolean>();\n const [errorNotification, setErrorNotification] = useState<string>();\n const [cancelledNotification, setCancelledNotification] = useState<boolean>();\n const [uploadingNotification, setUploadingNotification] = useState<boolean>();\n\n const abortController = new AbortController();\n const abort_signal = abortController.signal;\n\n const modals = useModal();\n\n // MMC: get existing uploaded files for the process\n useEffect(() => {\n\n const refreshFiles = async () => {\n setLoadingNotification(true);\n try {\n const fileStore = new FileStore(client);\n fileStore.def.columns.c_fileprocess_id.value = fileProcessColumn.value;\n const data = await fileStore.API.executeView(fileStore.def.views.fst_brwFiles);\n setLoadingNotification(false);\n if (data && data.length > 0) {\n setUploadProgress((prev) => {\n const updatedState = { ...prev };\n const file_records = mapDataResultToType<FileUploaderView>(data[0], \"enforceObject\", null, null);\n\n file_records.forEach((file) => {\n updatedState[file.c_file_id] = {\n file_id: file.c_file_id,\n status_id: file.c_file_id,\n file_name: file.vc_filename,\n file_size: file.bi_filesize,\n progress: 100,\n done: true,\n documentURL: client.getDocumentURL(file.vc_fileguid),\n thumbnailURL: client.getThumbnailURL(file.vc_fileguid, thumbnailMaxSize, thumbnailQuality),\n vc_fileguid: file.vc_fileguid\n };\n });\n return updatedState;\n });\n }\n }\n catch (e: unknown) {\n setLoadingNotification(false);\n if (e instanceof Error) {\n if (e.name !== 'AbortError') {\n setErrorNotification(e.message);\n }\n } else {\n setErrorNotification(String(e));\n }\n }\n\n };\n\n if (fileProcessColumn.value) refreshFiles();\n\n }, [client, fileProcessColumn.value]);\n\n\n const uploadFiles = async (selectedFiles: File[]) => {\n // Check against maxFilesCount.\n if ((Object.keys(uploadProgress).length + selectedFiles.length) > maxFilesCount!) {\n setErrorNotification(`${youCanUploadAMaximumOfText} ${maxFilesCount} ${filesText}.`);\n return;\n }\n\n setErrorNotification('');\n setCancelledNotification(false);\n setUploadingNotification(true);\n\n for (let file of selectedFiles) {\n // Check against maxIndividualFileSize.\n if (file.size > maxIndividualFileSize!) {\n setErrorNotification(`\"${file.name}\" ${exceedMaximumIndividualSizeText} ${maxIndividualFileSize! / (1024 ** 2)}MB`);\n continue;\n }\n\n // Check against maxTotalFilesSize.\n if ((uploadedSize.current + file.size) > maxTotalFilesSize!) {\n setErrorNotification(`${totalUploadExceedsMaximumSizeText} ${maxTotalFilesSize! / (1024 ** 2)}MB`);\n break;\n }\n\n // Client-side validation\n if (onValidateFile) {\n const validation = await onValidateFile(file);\n if (validation.error) {\n setErrorNotification(validation.message || '');\n continue;\n }\n }\n\n if (editor === 'image') {\n file = await new Promise<File>(async resolveEditor => {\n\n const imageDataURL = await new Promise<string>((resolveImageDataURL, rejectImageDataURL) => {\n const fileReader = new FileReader();\n fileReader.onloadend = () => {\n resolveImageDataURL(fileReader.result as string);\n }\n fileReader.onerror = () => {\n rejectImageDataURL();\n }\n fileReader.readAsDataURL(file);\n });\n\n let closeHandled = false;\n\n async function handleImageEditorOk(imageBlob: Blob) {\n closeHandled = true;\n resolveEditor(new File([imageBlob], file.name, { type: file.type }));\n await modals.close();\n }\n\n await modals.open(\n {\n content: <ImageEditor src={imageDataURL} onOk={handleImageEditorOk} />,\n modalProps: {\n //...modalProps,\n trapFocus: true,\n returnFocus: true,\n title: <Text fw=\"700\">Editor</Text>,\n },\n onClosed: () => {\n if (!closeHandled) { \n resolveEditor(file); //TODO: should cancel the upload?\n }\n }\n });\n });\n }\n\n const result = await uploadFile(file);\n if (result.errorMessage && !result.cancelled) {\n setErrorNotification(result.errorMessage);\n break;\n }\n if (result.cancelled) {\n setCancelledNotification(true);\n break;\n }\n\n // MMC: update total uploaded size\n uploadedSize.current += file.size;\n }\n\n setUploadingNotification(false);\n }\n\n const clearNotifications = () => { setErrorNotification(''); setCancelledNotification(false); }\n\n const updateProgress = (statusId: string, newStatus: UploadProgressReport) => {\n setUploadProgress((prev) => {\n if (newStatus.file_id) {\n const updatedState = { ...prev };\n\n // MMC: delete previous status\n delete updatedState[newStatus.status_id];\n\n // MMC: change status_id to file_id (this will allow to upload the same file several times)\n newStatus.status_id = newStatus.file_id;\n\n // MMC: add new status\n updatedState[newStatus.file_id] = newStatus;\n\n return updatedState;\n } else {\n return { ...prev, [statusId]: newStatus };\n }\n });\n };\n\n const uploadFile = async (file: File) => {\n if (abort_signal.aborted) return { cancelled: true } as UploadProgressReport;\n\n const status_id = `${file.name}-${file.size}-${file.lastModified}`;\n\n try {\n let currentProcessID = fileProcessColumn.value;\n\n // MMC: create process_id (file group) if not already created\n if (!currentProcessID) {\n setLoadingNotification(true);\n const fileProcess = new FileStoreProcess(client);\n await fileProcess.API.addData(abort_signal);\n\n currentProcessID = fileProcess.def.columns.c_fileprocess_id.value;\n setFileProcessID(currentProcessID);\n fileProcessColumn.value = currentProcessID;\n setLoadingNotification(false);\n }\n\n // MMC: the upload endpoint will update the file_store data\n const result = await client.upload(file, currentProcessID, abort_signal, thumbnailMaxSize, thumbnailQuality, (file, progress) => {\n updateProgress(status_id, {\n status_id: status_id,\n file_name: file.name,\n file_size: file.size,\n progress: progress\n });\n });\n\n // MMC: update finished status\n if (result) {\n // Update the total uploaded size and check against maxTotalFilesSize.\n uploadedSize.current += file.size;\n\n const finalResult: UploadProgressReport = {\n file_id: result.FileId,\n file_name: file.name,\n file_size: file.size,\n status_id: status_id,\n progress: result.ErrorMessage ? 0 : 100,\n done: true,\n errorMessage: result.ErrorMessage,\n documentURL: result.documentURL,\n thumbnailURL: result.thumbnailURL,\n vc_fileguid: result.FileGuid\n };\n updateProgress(status_id, finalResult);\n return finalResult;\n }\n }\n catch (error: unknown) {\n setLoadingNotification(false);\n const errorResult: UploadProgressReport = {\n file_name: file.name,\n file_size: file.size,\n status_id: status_id,\n done: true,\n progress: 0,\n errorMessage: error instanceof Error ? error.message : String(error)\n };\n updateProgress(status_id, errorResult);\n return errorResult;\n }\n\n return {\n status_id: status_id,\n progress: 0,\n done: true,\n errorMessage: unspecifiedErrorWhenUploadingFileText\n } as UploadProgressReport;\n }\n\n const deleteFile = async (file_id: string, fileGUID: string) => {\n try {\n setLoadingNotification(true);\n const fileStore = new FileStore(client);\n fileStore.def.columns.c_file_id.value = file_id;\n fileStore.def.columns.vc_fileguid.value = fileGUID;\n const result = await fileStore.API.deleteData(undefined, abort_signal);\n setLoadingNotification(false);\n if (!result.Failed) {\n setUploadProgress((prev) => {\n const updatedState = { ...prev };\n delete updatedState[file_id];\n return updatedState;\n });\n };\n return result;\n }\n catch (e: unknown) {\n setLoadingNotification(false);\n if (e instanceof Error) {\n if (e.name !== 'AbortError') {\n setErrorNotification(e.message);\n }\n } else {\n setErrorNotification(String(e));\n }\n return { Failed: true } as DBStatusResult;\n }\n }\n\n\n const downloadFile = async (fileUrl: string, fileName?: string) => {\n const now = new Date();\n const datePart = now.toISOString().split('T')[0]; // \"2023-11-02\"\n\n const fileExtension = fileUrl.split('?')[0].split('.').pop() || 'file';\n\n const defaultFilename = `download-${datePart}.${fileExtension}`;\n const filename = fileName || defaultFilename;\n\n try {\n\n const blob = await client.downloadBlob(fileUrl);\n\n if (window.Blob && window.URL) {\n const blobUrl = URL.createObjectURL(blob);\n const linkElement = document.createElement('a');\n linkElement.setAttribute('download', filename);\n linkElement.setAttribute('href', blobUrl);\n linkElement.click();\n setTimeout(() => URL.revokeObjectURL(blobUrl), 100);\n } else {\n alert(\"Your browser does not support downloading this file.\");\n }\n\n } catch (error) {\n console.error(\"There was an error downloading the file\", error);\n }\n\n };\n\n const cancelUpload = async () => {\n abortController.abort();\n if (onCancel) onCancel();\n }\n\n return {\n uploadFiles,\n deleteFile,\n downloadFile,\n uploadProgress,\n fileProcessID,\n maxFilesCount,\n maxIndividualFileSize,\n maxTotalFilesSize,\n errorNotification,\n cancelledNotification,\n uploadingNotification,\n clearNotifications,\n cancelUpload,\n loadingNotification\n }\n}\n","import mime from \"mime\";\r\n\r\nexport type PreviewFileTypes = 'image' | 'pdf' | 'other';\r\n\r\nexport const getFileType = (file_name: string): PreviewFileTypes => {\r\n const file_type = mime.getType(file_name);\r\n\r\n if (file_type && file_type.match('image.*')) {\r\n return 'image';\r\n } else if (file_type === 'application/pdf') {\r\n return 'pdf';\r\n }\r\n return 'other';\r\n};\r\n\r\n\r\n","import { Button, Group, Image, Stack } from \"@mantine/core\"\r\n\r\nexport interface FilePreviewProps {\r\n documentURL: string,\r\n onClose: () => void,\r\n closeText: string,\r\n filePreviewError?: string\r\n}\r\n\r\nexport function ImagePreview({ documentURL, onClose, closeText }: FilePreviewProps) {\r\n return (\r\n <Stack>\r\n <Image height=\"70vh\" fit=\"contain\" src={documentURL} />\r\n <Group position=\"right\">\r\n <Button onClick={onClose}>{closeText}</Button>\r\n </Group>\r\n </Stack>\r\n )\r\n}\r\n","import { Button, Group, Stack, Text, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { FilePreviewProps } from \"./ImagePreview\";\r\n\r\n\r\nexport const PDFPreviewDefaultProps: Partial<FilePreviewProps> = {\r\n filePreviewError: 'PDF cannot be displayed, download the file to view it.',\r\n}\r\n\r\nexport function PDFPreview(props: FilePreviewProps) {\r\n const { documentURL, onClose, closeText, filePreviewError } = useComponentDefaultProps('PDFPreview', PDFPreviewDefaultProps, props);\r\n\r\n\r\n return (\r\n <Stack>\r\n <div style={{ width: '100%', height: '70vh' }}>\r\n <object data={documentURL} type=\"application/pdf\" width=\"100%\" height=\"100%\">\r\n <Text size=\"sm\" color=\"dimmed\">{filePreviewError}</Text>\r\n </object>\r\n </div>\r\n <Group position=\"right\">\r\n <Button onClick={onClose}>{closeText}</Button>\r\n </Group>\r\n </Stack>\r\n )\r\n}","import { ActionIcon, Box, Button, Card, Group, Image, ImageProps, Progress, Stack, Text, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { Dropzone, DropzoneProps } from \"@mantine/dropzone\";\r\nimport { IconCircleX, IconDownload, IconEye, IconFileTypePdf, IconPhoto, IconProps, IconTrash, IconUpload, IconX } from \"@tabler/icons-react\";\r\nimport { ReactNode } from \"react\";\r\nimport { NotifyError, NotifyInfo, useModal } from \"../Core\";\r\nimport { UseEntityFormReturnType } from \"../Form/useEntityForm\";\r\nimport { getFileType } from \"./getFileType\";\r\nimport { ImagePreview } from \"./ImagePreview\";\r\nimport { PDFPreview } from \"./PDFPreview\";\r\nimport { UploadProgressReport, UseFileUploadReturnType } from \"./useFileUpload\";\r\n\r\nexport interface FileUploaderProps extends Omit<DropzoneProps, 'children' | 'onDrop' | 'maxSize' | 'maxFiles'> {\r\n IdleIcon?: (props: IconProps) => ReactNode,\r\n UploadText?: string,\r\n AttachUpToText?: string,\r\n FilesText?: string,\r\n EachFileShouldNotExceedText?: string,\r\n uploadAPI: UseFileUploadReturnType,\r\n onDelete?: (file_id: string) => boolean,\r\n imageProps?: ImageProps,\r\n closeText?: string,\r\n cancelledText?: string,\r\n operationCancelledText?: string,\r\n pdfCannotBeViewedText?: string,\r\n showCancelButton?: boolean,\r\n cancelLabel?: string,\r\n parentFormAPI?: UseEntityFormReturnType,\r\n}\r\n\r\n\r\nexport const FileUploaderDefaultProps: Partial<FileUploaderProps> = {\r\n IdleIcon: IconPhoto,\r\n UploadText: 'Drag files here or click to select',\r\n EachFileShouldNotExceedText: 'each file should not exceed',\r\n AttachUpToText: 'Attach up to',\r\n FilesText: 'files',\r\n closeText: 'Close',\r\n cancelledText: 'Cancelled',\r\n operationCancelledText: 'Operation cancelled',\r\n pdfCannotBeViewedText: 'PDF cannot be displayed, download the file to view it.',\r\n accept: ['image/*'],\r\n imageProps: {\r\n width: \"7rem\",\r\n height: \"3.94rem\",\r\n fit: \"contain\",\r\n withPlaceholder: true,\r\n mah: \"3.94rem\"\r\n },\r\n showCancelButton: true,\r\n cancelLabel: 'Cancel'\r\n}\r\n\r\n\r\nexport function FileUploader(props: FileUploaderProps) {\r\n const {\r\n IdleIcon, UploadText, uploadAPI, EachFileShouldNotExceedText, AttachUpToText, FilesText,\r\n imageProps, onDelete, closeText, cancelledText, operationCancelledText, pdfCannotBeViewedText,\r\n showCancelButton, cancelLabel, parentFormAPI, ...dropzoneProps\r\n } = useComponentDefaultProps('FileUploader', FileUploaderDefaultProps, props);\r\n\r\n const {\r\n uploadFiles, uploadProgress, errorNotification, cancelledNotification, clearNotifications, uploadingNotification, deleteFile,\r\n downloadFile, cancelUpload, loadingNotification\r\n } = uploadAPI;\r\n\r\n const theme = useMantineTheme();\r\n const modals = useModal();\r\n\r\n dropzoneProps.disabled = dropzoneProps.disabled || (parentFormAPI?.formMode === 'view');\r\n\r\n const handleUpload = async (selectedFiles: File[]) => {\r\n await uploadFiles(selectedFiles);\r\n }\r\n\r\n const handleDeleteFile = async (file_id: string) => {\r\n let result = true;\r\n if (onDelete) result = await onDelete(file_id);\r\n if (result) await deleteFile(file_id, '');\r\n\r\n };\r\n\r\n const handlePreviewImage = async (documentURL: string, fileName: string) => {\r\n await modals.open({\r\n modalProps: {\r\n size: \"xl\",\r\n title: <Text fw=\"700\">{fileName}</Text>\r\n },\r\n content: <ImagePreview documentURL={documentURL} closeText={closeText!} onClose={async () => await modals.close()} />\r\n });\r\n }\r\n\r\n const handlePreviewPdf = async (documentURL: string, fileName: string) => {\r\n await modals.open({\r\n modalProps: {\r\n size: \"xl\",\r\n title: <Text fw=\"700\">{fileName}</Text>\r\n },\r\n content: <PDFPreview documentURL={documentURL} closeText={closeText!} onClose={async () => await modals.close()} filePreviewError={pdfCannotBeViewedText} />\r\n });\r\n };\r\n\r\n const progressElements = Object.values(uploadProgress).map((report: UploadProgressReport) => {\r\n const fileType = getFileType(report.file_name);\r\n\r\n return (\r\n <Card key={report.status_id} bg={theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[3]} w=\"15rem\">\r\n {report.done && !report.errorMessage &&\r\n <Card.Section p=\"xs\" mb=\"1rem\">\r\n <Group position=\"right\">\r\n {(fileType === 'image' || fileType === 'pdf') &&\r\n <ActionIcon color={theme.primaryColor} variant=\"light\" onClick={async () =>\r\n fileType === 'image'\r\n ? await handlePreviewImage(report.documentURL!, report.file_name)\r\n : await handlePreviewPdf(report.documentURL!, report.file_name)}>\r\n <IconEye size=\"1rem\" />\r\n </ActionIcon>\r\n }\r\n <ActionIcon color={theme.primaryColor} variant=\"light\" onClick={async () => await downloadFile(report.documentURL!)}><IconDownload size=\"1rem\" /></ActionIcon>\r\n {parentFormAPI?.formMode !== 'view' &&\r\n <ActionIcon disabled={dropzoneProps.disabled} color={theme.primaryColor} variant=\"light\" onClick={async () => await handleDeleteFile(report.file_id!)}><IconTrash size=\"1rem\" /></ActionIcon>\r\n }\r\n </Group>\r\n </Card.Section>\r\n }\r\n {!report.done &&\r\n <>\r\n <Text size=\"sm\" color=\"dimmed\">{report.file_name} - {report.progress}%</Text>\r\n <Progress value={report.progress} striped animate />\r\n </>\r\n }\r\n {report.cancelled &&\r\n <Text size=\"sm\" color=\"dimmed\">{cancelledText}: {report.file_name}</Text>\r\n }\r\n {report.done && !report.errorMessage && fileType === 'image' &&\r\n <Image {...imageProps} src={report.thumbnailURL} />\r\n }\r\n {report.done && !report.errorMessage && fileType === 'pdf' &&\r\n <Group grow h=\"9.375rem\">\r\n <IconFileTypePdf size=\"3.2rem\" stroke={1.5} />\r\n </Group>\r\n }\r\n {\r\n report.done && !report.errorMessage &&\r\n <Box mt=\"xs\">\r\n <Text size=\"xs\" color=\"dimmed\" truncate>{report.file_name}</Text>\r\n <Text size=\"xs\" color=\"dimmed\" >{(report.file_size / (1024 ** 2)).toFixed(2)}MB</Text>\r\n </Box>\r\n }\r\n </Card>\r\n )\r\n });\r\n\r\n const ImageIcon = IdleIcon!;\r\n\r\n return (\r\n <Stack>\r\n <Group grow>\r\n <Dropzone {...dropzoneProps} loading={uploadingNotification || loadingNotification} onDrop={handleUpload}>\r\n <Group position=\"center\" spacing=\"xl\" style={{ pointerEvents: 'none' }}>\r\n <Dropzone.Accept>\r\n <IconUpload\r\n size=\"3.2rem\"\r\n stroke={1.5}\r\n color={theme.colors[theme.primaryColor][theme.colorScheme === 'dark' ? 4 : 6]}\r\n />\r\n </Dropzone.Accept>\r\n <Dropzone.Reject>\r\n <IconX\r\n size=\"3.2rem\"\r\n stroke={1.5}\r\n color={theme.colors.red[theme.colorScheme === 'dark' ? 4 : 6]}\r\n />\r\n </Dropzone.Reject>\r\n <Dropzone.Idle>\r\n <ImageIcon size=\"3.2rem\" stroke={1.5} />\r\n </Dropzone.Idle>\r\n <div>\r\n <Text size=\"xl\" inline>\r\n {UploadText}\r\n </Text>\r\n <Text size=\"sm\" color=\"dimmed\" inline mt={7}>\r\n {AttachUpToText} {uploadAPI.maxFilesCount} {FilesText}, {EachFileShouldNotExceedText} {Math.round(uploadAPI.maxIndividualFileSize! / (1024 ** 2))} MB\r\n </Text>\r\n </div>\r\n </Group>\r\n </Dropzone>\r\n </Group>\r\n {showCancelButton && uploadingNotification &&\r\n <Group key=\"cancel\">\r\n <Button color=\"red\" size=\"sm\" leftIcon={<IconCircleX size=\"1.5rem\" />} onClick={cancelUpload}>{cancelLabel}</Button>\r\n </Group>\r\n }\r\n {\r\n (errorNotification || cancelledNotification) &&\r\n <Group key=\"notifications\" grow>\r\n {errorNotification && !cancelledNotification &&\r\n <NotifyError key=\"error\" withCloseButton title=\"\" onClose={clearNotifications} bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]}>\r\n {errorNotification}\r\n </NotifyError>\r\n }\r\n {cancelledNotification &&\r\n <NotifyInfo key=\"info\" withCloseButton title=\"\" onClose={clearNotifications} bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]}>\r\n {operationCancelledText}\r\n </NotifyInfo>\r\n }\r\n </Group>\r\n }\r\n {\r\n progressElements.length > 0 &&\r\n <Group key=\"progresselements\" spacing=\"xs\">\r\n {progressElements}\r\n </Group>\r\n }\r\n </Stack >\r\n )\r\n}","import { Button, Card, Group, Text, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconCircleCheck, IconInfoCircle } from \"@tabler/icons-react\";\r\nimport { EntityColumn } from \"../../Entity\";\r\nimport { FileUploader, FileUploaderProps } from \"./FileUploader\";\r\nimport { UploadProgressReport, useFileUpload, UseFileUploadProps, ValidateFileReturnType } from \"./useFileUpload\";\r\n\r\nexport interface FilesUploadFormProps extends UseFileUploadProps {\r\n fileProcessColumn: EntityColumn<string>,\r\n onOK?: (fileprocess_id: string, uploadProgress: Record<string, UploadProgressReport>) => void,\r\n onDelete?: (file_id: string) => boolean,\r\n helpMessage?: string,\r\n uploaderProps?: Omit<FileUploaderProps, 'uploadAPI' | 'abortSignal'>,\r\n okLabel?: string,\r\n showOKButton?: boolean,\r\n editor?: 'none' | 'image',\r\n onValidateFile?: (file: File) => Promise<ValidateFileReturnType>,\r\n}\r\n\r\nexport const FilesUploadFormDefaultProps: Partial<FilesUploadFormProps> = {\r\n helpMessage: \"Select the files that you need and click OK\",\r\n okLabel: \"Close\",\r\n maxIndividualFileSize: 2 * (1024 ** 2),\r\n maxTotalFilesSize: 10 * (1024 ** 2),\r\n maxFilesCount: 5,\r\n}\r\n\r\nexport function FilesUploadForm(props: FilesUploadFormProps) {\r\n const {\r\n helpMessage, client, uploaderProps, okLabel, onCancel,\r\n maxFilesCount, maxIndividualFileSize, maxTotalFilesSize, onOK, fileProcessColumn,\r\n showOKButton, editor, onValidateFile\r\n } = useComponentDefaultProps('FilesUploadForm', FilesUploadFormDefaultProps, props);\r\n\r\n\r\n const theme = useMantineTheme();\r\n const uploadAPI = useFileUpload({ client, fileProcessColumn, maxFilesCount, maxIndividualFileSize, maxTotalFilesSize, onCancel, editor, onValidateFile });\r\n const { uploadingNotification } = uploadAPI;\r\n\r\n const handleOK = () => {\r\n \r\n if (onOK) onOK(uploadAPI.fileProcessID, uploadAPI.uploadProgress);\r\n };\r\n\r\n return (\r\n <>\r\n <Card shadow=\"sm\" withBorder={theme.colorScheme === 'dark' ? false : true}>\r\n <Card.Section p=\"xs\" bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]} mb=\"1rem\">\r\n <Group sx={{ gap: \"0.25rem\" }}>\r\n <IconInfoCircle size=\"1.1rem\" />\r\n <Text fz=\"xs\" c=\"dimmed\">{helpMessage}</Text>\r\n </Group>\r\n </Card.Section>\r\n <FileUploader {...uploaderProps} uploadAPI={uploadAPI} />\r\n </Card>\r\n <Group mt=\"md\" position=\"right\">\r\n {showOKButton &&\r\n <Button loading={uploadingNotification} disabled={uploadingNotification} onClick={handleOK} color={theme.colors.green[5]} leftIcon={<IconCircleCheck size=\"1.5rem\" />}>{okLabel}</Button>\r\n }\r\n </Group>\r\n </>\r\n )\r\n}","import { Text } from \"@mantine/core\";\r\nimport { ModalSettings } from \"@mantine/modals/lib/context\";\r\nimport { useCallback, useRef } from \"react\";\r\nimport { MicroMClient } from \"../../client\";\r\nimport { EntityColumn } from \"../../Entity\";\r\nimport { useModal } from \"../Core\";\r\nimport { FilesUploadForm, FilesUploadFormProps } from \"./FilesUploadForm\";\r\nimport { FileUploaderProps } from \"./FileUploader\";\r\nimport { UploadProgressReport } from \"./useFileUpload\";\r\n\r\nexport interface ModalFileUploadProps {\r\n client: MicroMClient,\r\n fileProcessColumn: EntityColumn<string>,\r\n onOK?: (fileprocess_id: string, uploadProgress: Record<string, UploadProgressReport>) => void,\r\n onCancel?: () => void,\r\n onClosed?: () => void,\r\n modalProps?: ModalSettings,\r\n modalTitle?: string,\r\n filesUploadFormProps: Omit<FilesUploadFormProps, 'fileProcessColumn' | 'uploaderProps' | 'client' | 'onOK' | 'onCancel'>,\r\n uploaderProps?: Omit<FileUploaderProps, 'uploadAPI' | 'abortSignal'>\r\n}\r\n\r\nexport const UseFileUploadFormOpenDefaultProps: Partial<ModalFileUploadProps> = {\r\n modalProps: { size: 'xl' },\r\n modalTitle: 'Upload Files'\r\n}\r\nexport function useFilesUploadForm() {\r\n const modals = useModal();\r\n const buttonResult = useRef<'OK' | 'Cancel' | 'Quit'>('Quit');\r\n\r\n const open = useCallback(async (props: ModalFileUploadProps) => {\r\n const {\r\n client, onOK, onCancel, modalProps, onClosed, modalTitle, uploaderProps, fileProcessColumn, filesUploadFormProps\r\n } = { ...UseFileUploadFormOpenDefaultProps, ...props };\r\n\r\n buttonResult.current = 'Quit';\r\n\r\n const handleOK = async (fileprocess_id: string, uploadProgress: Record<string, UploadProgressReport>) => {\r\n buttonResult.current = 'OK';\r\n await modals.close();\r\n if (onOK) {\r\n await onOK(fileprocess_id, uploadProgress);\r\n }\r\n };\r\n\r\n const handleCancel = async () => {\r\n buttonResult.current = 'Cancel';\r\n await modals.close();\r\n if (onCancel) {\r\n onCancel();\r\n }\r\n };\r\n\r\n const handleClosed = async () => {\r\n if (buttonResult.current === 'Quit') {\r\n if (onCancel) {\r\n onCancel();\r\n }\r\n }\r\n if (onClosed) onClosed();\r\n }\r\n\r\n await modals.open(\r\n {\r\n content:\r\n <FilesUploadForm\r\n fileProcessColumn={fileProcessColumn}\r\n uploaderProps={uploaderProps}\r\n client={client}\r\n onOK={async (fileprocess_id: string, uploadProgress: Record<string, UploadProgressReport>) => await handleOK(fileprocess_id, uploadProgress)}\r\n onCancel={() => handleCancel()}\r\n showOKButton\r\n {...filesUploadFormProps}\r\n />,\r\n modalProps: {\r\n ...modalProps,\r\n trapFocus: true,\r\n returnFocus: true,\r\n title: <Text fw=\"700\">{modalTitle}</Text>,\r\n },\r\n onClosed: async () => {\r\n await handleClosed();\r\n }\r\n\r\n });\r\n\r\n }, [modals]);\r\n\r\n return open;\r\n\r\n}","import { createContext, useContext } from \"react\";\r\nimport { MicroMRouterState } from \"./MicroMRouterState\";\r\n\r\nexport const MicroMRouterContext = createContext<MicroMRouterState | undefined>(undefined);\r\n\r\nexport const useMicroMRouter = () => {\r\n const context = useContext(MicroMRouterContext);\r\n if (context === undefined) {\r\n throw new Error('useMicroMRouter must be used within a RouterProvider');\r\n }\r\n return context;\r\n};\r\n","import { Badge, Group, NavLink, rem, Skeleton, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { Dispatch, ReactNode, SetStateAction, useCallback, useEffect } from \"react\";\r\nimport { isPromise } from \"../../Entity\";\r\nimport { useMicroMRouter } from \"../Router/useMicroMRouter\";\r\nimport { MenuItem } from \"./MenuItem\";\r\n\r\n\r\nexport interface MenuItemsProps {\r\n AllItems: MenuItem[],\r\n sectionItems: MenuItem[],\r\n setContent: Dispatch<SetStateAction<ReactNode>>,\r\n setOpened: Dispatch<SetStateAction<boolean>>,\r\n clearContent: boolean,\r\n activeID: string,\r\n subitemActiveID: string,\r\n showSubitemIcons?: boolean,\r\n defaultLoadingComponent?: ReactNode,\r\n onActiveChange: React.Dispatch<SetStateAction<string>>,\r\n onSubitemActiveChange: React.Dispatch<SetStateAction<string>>,\r\n showItemDescription?: boolean,\r\n autoHideNavBarOnClick?: boolean\r\n}\r\n\r\nexport const MenuItemsPropsDefaultProps: Partial<MenuItemsProps> = {\r\n defaultLoadingComponent: <Skeleton />\r\n}\r\n\r\nexport function MenuNavLinks(props: MenuItemsProps) {\r\n\r\n const {\r\n AllItems, sectionItems, setContent, clearContent, activeID, subitemActiveID, defaultLoadingComponent, onActiveChange, onSubitemActiveChange,\r\n showSubitemIcons, showItemDescription, setOpened, autoHideNavBarOnClick\r\n } = useComponentDefaultProps('MenuItems', MenuItemsPropsDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const { navigate, path } = useMicroMRouter();\r\n\r\n const setActiveContent = useCallback(async (menuItem: MenuItem) => {\r\n if (menuItem.content) {\r\n if (isPromise(menuItem.content)) {\r\n setContent(defaultLoadingComponent);\r\n const content = await menuItem.content;\r\n setContent(content);\r\n } else {\r\n setContent(menuItem.content);\r\n }\r\n } else if (clearContent) {\r\n setContent(<></>);\r\n }\r\n\r\n if (menuItem.onClick) {\r\n if (isPromise(menuItem.onClick)) {\r\n await menuItem.onClick;\r\n }\r\n else {\r\n menuItem.onClick();\r\n }\r\n }\r\n\r\n }, [clearContent, defaultLoadingComponent, setContent]);\r\n\r\n\r\n // Handler to process navigation based on the current path. This renders the content for navigated item\r\n useEffect(() => {\r\n const pathParts = path.split('/').filter(part => part.trim() !== '');\r\n const [itemId, subitemId] = pathParts;\r\n\r\n const item = AllItems.find(it => it.ID === itemId);\r\n if (item) {\r\n if (!item.noActive) {\r\n onActiveChange(item.ID);\r\n }\r\n\r\n if (subitemId && item.subitems) {\r\n const subitem = item.subitems.find(si => si.ID === subitemId);\r\n if (subitem) {\r\n onSubitemActiveChange(subitem.ID);\r\n setActiveContent(subitem);\r\n } else {\r\n // If subitem ID was specified but not found, clear subitemActiveID\r\n onSubitemActiveChange('');\r\n }\r\n } else {\r\n // setContent only on las level, if we have subitems just expand the menu\r\n if (!item.subitems) setActiveContent(item);\r\n\r\n onSubitemActiveChange(''); // Ensure subitemActiveID is cleared\r\n }\r\n } else if (clearContent) {\r\n // Path does not match any item\r\n setContent(<></>);\r\n onActiveChange('');\r\n onSubitemActiveChange('');\r\n }\r\n }, [clearContent, AllItems, onActiveChange, onSubitemActiveChange, path, setActiveContent, setContent]);\r\n\r\n\r\n // Route for navigation\r\n const handleItemClick = (item: MenuItem, subitem?: MenuItem) => {\r\n const route = subitem ? `/${item.ID}/${subitem.ID}` : `/${item.ID}`;\r\n navigate(`${route}`);\r\n\r\n if (autoHideNavBarOnClick && !item.subitems) setOpened(false);\r\n };\r\n\r\n return (\r\n <>{\r\n sectionItems.map((item: MenuItem) => (\r\n <NavLink\r\n key={item.ID}\r\n label={\r\n (item.notifications && (item.subitems || item.rightSection)) ? <Group><Group sx={{ flex: 1 }}>{item.labelComponent ?? item.label}</Group><Badge sx={{ justifySelf: \"flex-end\" }} variant=\"filled\" size=\"xs\">{item.notifications}</Badge></Group> : (item.labelComponent ?? item.label)\r\n }\r\n icon={item.icon}\r\n rightSection={(item.notifications && !item.subitems && !item.rightSection) ? <Badge variant=\"filled\" size=\"xs\">{item.notifications}</Badge> : item.rightSection}\r\n description={showItemDescription && item.description}\r\n onClick={() => handleItemClick(item)}\r\n active={item.noActive !== true && item.ID === activeID}\r\n opened={(item.noActive !== true && item.ID === activeID && item.subitems && item.subitems.some(subitem => subitem.noActive !== true && subitem.ID === subitemActiveID)) || undefined}\r\n >\r\n {\r\n item.subitems && item.subitems.map((subitem) => {\r\n return <NavLink\r\n sx={{\r\n borderLeft: `${rem(1)} solid ${theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]}`\r\n }}\r\n pl=\"1.8rem\"\r\n key={item.ID + subitem.ID}\r\n label={subitem.label}\r\n icon={showSubitemIcons && subitem.icon}\r\n rightSection={subitem.notifications && <Badge variant=\"filled\" size=\"xs\">{subitem.notifications}</Badge>}\r\n description={showItemDescription && subitem.description}\r\n onClick={() => handleItemClick(item, subitem)}\r\n active={subitem.noActive !== true && subitem.ID === subitemActiveID}\r\n />\r\n })\r\n }\r\n\r\n </NavLink>\r\n ))\r\n\r\n }</>\r\n );\r\n\r\n}","import { Navbar, NavLink, ScrollArea, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { useMediaQuery } from \"@mantine/hooks\";\r\nimport { useSpotlight } from \"@mantine/spotlight\";\r\nimport { IconProps, IconSearch } from \"@tabler/icons-react\";\r\nimport { Dispatch, ReactNode, SetStateAction, useMemo } from \"react\";\r\nimport { MenuItem } from \"./MenuItem\";\r\nimport { MenuNavLinks } from \"./MenuNavLinks\";\r\n\r\nexport interface MenuProps {\r\n items: MenuItem[],\r\n setContent: Dispatch<SetStateAction<ReactNode>>,\r\n setOpened: Dispatch<SetStateAction<boolean>>,\r\n clearContent: boolean,\r\n activeIDState: [string, Dispatch<SetStateAction<string>>],\r\n subitemActiveIDState: [string, Dispatch<SetStateAction<string>>],\r\n showSearch?: boolean,\r\n searchLabel?: string,\r\n searchIcon?: (props: IconProps) => ReactNode,\r\n autoCloseOnItemClickWhenSmallScreen?: boolean\r\n}\r\n\r\nexport const MenuDefaultProps: Partial<MenuProps> = {\r\n showSearch: true,\r\n searchLabel: \"Search\",\r\n searchIcon: IconSearch,\r\n autoCloseOnItemClickWhenSmallScreen: true\r\n}\r\n\r\n\r\nexport function MenuNavBar(props: MenuProps) {\r\n const {\r\n items, setContent, clearContent, activeIDState, subitemActiveIDState, showSearch, searchLabel, searchIcon, setOpened, autoCloseOnItemClickWhenSmallScreen\r\n } = useComponentDefaultProps('MenuNavBar', MenuDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n const matches = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`);\r\n\r\n const [activeID, setActiveID] = activeIDState;\r\n const [subitemActiveID, setSubitemActiveID] = subitemActiveIDState;\r\n\r\n const header_section = useMemo(() => items.filter((item) => item.section === 'header'), [items]);\r\n const items_section = useMemo(() => items.filter((item) => item.section === 'items'), [items]);\r\n const footer_section = useMemo(() => items.filter((item) => item.section === 'footer'), [items]);\r\n\r\n const SearchIcon = searchIcon!;\r\n\r\n const search = useSpotlight();\r\n\r\n const autoHideNavBarOnClick = autoCloseOnItemClickWhenSmallScreen && matches;\r\n\r\n return (\r\n <>\r\n <Navbar.Section>\r\n {showSearch &&\r\n <NavLink\r\n key=\"menu-Search\"\r\n label={searchLabel}\r\n icon={<SearchIcon size=\"1.2rem\" />}\r\n onClick={() => {\r\n search.openSpotlight();\r\n }}\r\n mb=\"xs\"\r\n />}\r\n <MenuNavLinks AllItems={items} sectionItems={header_section} autoHideNavBarOnClick={autoHideNavBarOnClick} setOpened={setOpened} setContent={setContent} clearContent={clearContent} activeID={activeID} onActiveChange={setActiveID} subitemActiveID={subitemActiveID} onSubitemActiveChange={setSubitemActiveID} />\r\n </Navbar.Section>\r\n <Navbar.Section grow component={ScrollArea} mx=\"-xs\" px=\"xs\">\r\n <MenuNavLinks AllItems={items} sectionItems={items_section} autoHideNavBarOnClick={autoHideNavBarOnClick} setOpened={setOpened} setContent={setContent} clearContent={clearContent} activeID={activeID} onActiveChange={setActiveID} subitemActiveID={subitemActiveID} onSubitemActiveChange={setSubitemActiveID} />\r\n </Navbar.Section>\r\n <Navbar.Section>\r\n <MenuNavLinks AllItems={items} sectionItems={footer_section} autoHideNavBarOnClick={autoHideNavBarOnClick} setOpened={setOpened} setContent={setContent} clearContent={clearContent} activeID={activeID} onActiveChange={setActiveID} subitemActiveID={subitemActiveID} onSubitemActiveChange={setSubitemActiveID} />\r\n </Navbar.Section>\r\n </>\r\n );\r\n}","import { useComponentDefaultProps } from \"@mantine/core\";\r\nimport { IconProps, IconSearch } from \"@tabler/icons-react\";\r\nimport { Dispatch, ReactNode, SetStateAction } from \"react\";\r\nimport { MenuItem } from \"./MenuItem\";\r\nimport { MenuNavBar } from \"./MenuNavBar\";\r\n\r\n\r\nexport interface MenuPanelProps {\r\n setContent: Dispatch<SetStateAction<ReactNode>>,\r\n setOpened: Dispatch<SetStateAction<boolean>>,\r\n menuItems: MenuItem[],\r\n activeIDState: [string, Dispatch<SetStateAction<string>>],\r\n subitemActiveIDState: [string, Dispatch<SetStateAction<string>>],\r\n showSearch?: boolean,\r\n searchLabel?: string,\r\n searchIcon?: (props: IconProps) => ReactNode,\r\n autoCloseOnItemClickWhenSmallScreen?: boolean\r\n}\r\n\r\nexport const MenuPanelDefaultProps: Partial<MenuPanelProps> = {\r\n showSearch: true,\r\n searchLabel: \"Search\",\r\n searchIcon: IconSearch,\r\n autoCloseOnItemClickWhenSmallScreen: true\r\n}\r\n\r\nexport function MenuNavBarPanel(props: MenuPanelProps) {\r\n const {\r\n setContent, menuItems, activeIDState, subitemActiveIDState, showSearch, searchLabel, searchIcon, setOpened, autoCloseOnItemClickWhenSmallScreen\r\n } = useComponentDefaultProps('MenuNavBarPanel', MenuPanelDefaultProps, props);\r\n\r\n return (\r\n <MenuNavBar\r\n showSearch={showSearch}\r\n searchLabel={searchLabel}\r\n searchIcon={searchIcon}\r\n items={menuItems}\r\n setContent={setContent}\r\n setOpened={setOpened}\r\n clearContent={true}\r\n activeIDState={activeIDState}\r\n subitemActiveIDState={subitemActiveIDState}\r\n autoCloseOnItemClickWhenSmallScreen={autoCloseOnItemClickWhenSmallScreen}\r\n />\r\n )\r\n}","export interface NavigationState {\r\n navigated: boolean;\r\n route: string;\r\n}\r\n\r\nexport interface MicroMRouterState {\r\n path: string;\r\n navigate: (newPath: string) => void;\r\n navigationState: NavigationState;\r\n}\r\n\r\n// MMC: normalize the path to always start with '/#/', the recieved path can start with '/#/', with '/' or without any of them\r\nexport const normalizeRoutePath = (path: string) => {\r\n if (path.startsWith('#/')) {\r\n return decodeURIComponent(path.slice(1));\r\n }\r\n return decodeURIComponent(path);\r\n}\r\n\r\nexport const navigateToRoute = (newPath: string) => {\r\n window.location.hash = normalizeRoutePath(newPath);\r\n}\r\n\r\nexport const normalizeRouteURL = (path: string) => {\r\n if (!path.startsWith('/#')) {\r\n return `/#${path}`;\r\n }\r\n return path;\r\n}\r\n\r\n","import { MantineTheme, Skeleton, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { SpotlightAction } from \"@mantine/spotlight\";\r\nimport { Dispatch, ReactNode, SetStateAction, useEffect, useMemo, useState } from \"react\";\r\nimport { MicroMClient, MicroMClientClaimTypes } from \"../../client\";\r\nimport { isPromise } from \"../../Entity\";\r\nimport { navigateToRoute } from \"../Router/MicroMRouterState\";\r\nimport { MenuItem } from \"./MenuItem\";\r\n\r\nexport interface MenuContentProps {\r\n client: MicroMClient,\r\n menuId: string,\r\n setContent: Dispatch<SetStateAction<ReactNode>>,\r\n setOpened: Dispatch<SetStateAction<boolean>>,\r\n isLoggedIn: boolean | undefined,\r\n setIsLoggedIn: Dispatch<SetStateAction<boolean | undefined>>,\r\n loggedInInfo?: Partial<MicroMClientClaimTypes>,\r\n theme?: MantineTheme\r\n}\r\n\r\nexport interface UseMenuContentProps extends MenuContentProps {\r\n menuContent: (props: MenuContentProps) => MenuItem[],\r\n enableMenuSecurity?: boolean,\r\n defaultLoadingComponent?: ReactNode,\r\n searchMenuItemsWithContentOnly?: boolean,\r\n\r\n}\r\n\r\nexport const UseMenuContentDefaultProps: Partial<UseMenuContentProps> = {\r\n enableMenuSecurity: true,\r\n defaultLoadingComponent: <Skeleton />,\r\n searchMenuItemsWithContentOnly: true\r\n}\r\n\r\nexport interface MenuItemActionProps {\r\n item: MenuItem,\r\n setContent: Dispatch<SetStateAction<ReactNode>>,\r\n setOpened: Dispatch<SetStateAction<boolean>>,\r\n clearContent: boolean,\r\n defaultLoadingComponent?: ReactNode,\r\n onActiveChange: React.Dispatch<SetStateAction<string>>,\r\n onSubitemActiveChange: React.Dispatch<SetStateAction<string>>,\r\n autoHideNavBarOnClick?: boolean\r\n}\r\n\r\nconst triggerItemAction = async (props: MenuItemActionProps) => {\r\n const { item, setOpened, onActiveChange, onSubitemActiveChange, autoHideNavBarOnClick } = props;\r\n if (!item.noActive) {\r\n // MMC: TODO, change the activeIDState to a single state\r\n onActiveChange(item.ID);\r\n onSubitemActiveChange(item.ID);\r\n }\r\n else {\r\n onActiveChange('');\r\n onSubitemActiveChange('');\r\n }\r\n\r\n if (item.onClick) {\r\n item.onClick();\r\n }\r\n\r\n if ((item.content || item.subitems) && item.menuPath) {\r\n navigateToRoute(item.menuPath);\r\n }\r\n\r\n if (autoHideNavBarOnClick && !item.subitems) setOpened(false);\r\n}\r\n\r\nconst populateMenuPaths = (\r\n items: MenuItem[],\r\n parentPath: string = '',\r\n parentDescription: string = ''\r\n) => {\r\n items.forEach(item => {\r\n const currentPath = `${parentPath}/${item.ID}`;\r\n item.menuPath = currentPath;\r\n\r\n const currentDescription = parentDescription\r\n ? `${parentDescription} / ${item.label}`\r\n : item.label;\r\n\r\n item.menuPathDescription = currentDescription;\r\n\r\n if (item.subitems && item.subitems.length > 0) {\r\n populateMenuPaths(item.subitems, currentPath, currentDescription);\r\n }\r\n });\r\n};\r\n\r\nconst createMenuDictionary = (items: MenuItem[], dictionary: Record<string, MenuItem> = {}) => {\r\n for (const item of items) {\r\n if (item.menuPath) {\r\n dictionary[item.menuPath] = item;\r\n\r\n if (item.subitems && item.subitems.length > 0) {\r\n createMenuDictionary(item.subitems, dictionary);\r\n }\r\n }\r\n }\r\n return dictionary;\r\n};\r\n\r\nconst filterEnabledItems = (\r\n items: MenuItem[],\r\n menuId: string,\r\n enabled: Set<string>\r\n): MenuItem[] => {\r\n return items\r\n .filter(item => enabled.has(`${menuId}_${item.ID}`))\r\n .map(item => {\r\n if (item.subitems) {\r\n const filteredSubitems = filterEnabledItems(item.subitems, menuId, enabled);\r\n return {\r\n ...item,\r\n subitems: filteredSubitems.length > 0 ? filteredSubitems : undefined\r\n };\r\n }\r\n return item;\r\n })\r\n};\r\n\r\nconst CreateSpotlightActions = (items: MenuItem[], baseActionProps: Omit<MenuItemActionProps, 'item' | 'autoHideNavBarOnClick'>, searchMenuItemsWithContentOnly?: boolean, actions: SpotlightAction[] = []): SpotlightAction[] => {\r\n for (const item of items) {\r\n if (item.section === 'items') {\r\n const group = item.menuPathDescription\r\n ?.split(\"/\")\r\n .map((part) => part.trim())\r\n .filter(Boolean)[0];\r\n\r\n if (!searchMenuItemsWithContentOnly || (searchMenuItemsWithContentOnly && (item.content || item.onClick))) {\r\n actions.push({\r\n id: item.ID,\r\n title: item.label,\r\n description: `${item.menuPathDescription}${item.description ? ` - ${item.description}` : \"\"}`,\r\n group: group,\r\n icon: item.icon,\r\n onTrigger: () => triggerItemAction({ ...baseActionProps, item }),\r\n });\r\n }\r\n if (item.subitems) {\r\n CreateSpotlightActions(item.subitems, baseActionProps, searchMenuItemsWithContentOnly, actions);\r\n }\r\n }\r\n }\r\n return actions;\r\n}\r\n\r\nexport function useMenuContent(props: UseMenuContentProps) {\r\n const {\r\n client, setContent, isLoggedIn, setIsLoggedIn, menuContent, defaultLoadingComponent, setOpened, loggedInInfo, menuId,\r\n enableMenuSecurity, searchMenuItemsWithContentOnly\r\n } = useComponentDefaultProps('useMenuContent', UseMenuContentDefaultProps, props);\r\n\r\n const activeIDState = useState<string>('');\r\n const [, setActiveID] = activeIDState;\r\n const subitemActiveIDState = useState<string>('');\r\n const [, setSubitemActiveID] = subitemActiveIDState;\r\n const [items, setItems] = useState<MenuItem[]>([]);\r\n const [actions, setActions] = useState<SpotlightAction[]>([]);\r\n const [menuDictionary, setMenuDictionary] = useState<Record<string, MenuItem>>({});\r\n\r\n\r\n const internal_items = useMemo(\r\n () => {\r\n const items = menuContent({ client, setContent, setOpened, isLoggedIn, setIsLoggedIn, loggedInInfo, menuId });\r\n populateMenuPaths(items);\r\n return items;\r\n },\r\n [menuContent, client, setContent, setOpened, isLoggedIn, setIsLoggedIn, loggedInInfo, menuId]\r\n );\r\n\r\n // MMC: returns an array of mantine SpotLightAction from items\r\n const internal_actions = useMemo(() => {\r\n const baseActionProps = { setContent, setOpened, clearContent: true, defaultLoadingComponent, onActiveChange: setActiveID, onSubitemActiveChange: setSubitemActiveID };\r\n\r\n const actionList = CreateSpotlightActions(internal_items, baseActionProps, searchMenuItemsWithContentOnly);\r\n\r\n return actionList;\r\n }, [setContent, setOpened, defaultLoadingComponent, setActiveID, setSubitemActiveID, internal_items, searchMenuItemsWithContentOnly]);\r\n\r\n useEffect(() => {\r\n const get = async () => {\r\n if (isLoggedIn) {\r\n if (enableMenuSecurity) {\r\n const enabled = await client.getMenus();\r\n const enabled_items = filterEnabledItems(internal_items, menuId, enabled);\r\n\r\n const enabled_actions = internal_actions.filter(item => enabled.has(`${menuId}_${item.id}`));\r\n\r\n const dictionary = createMenuDictionary(enabled_items);\r\n setMenuDictionary(dictionary);\r\n\r\n setItems(enabled_items);\r\n setActions(enabled_actions);\r\n }\r\n else {\r\n const dictionary = createMenuDictionary(internal_items);\r\n setMenuDictionary(dictionary);\r\n\r\n setItems(internal_items);\r\n setActions(internal_actions);\r\n }\r\n }\r\n else {\r\n setItems([]);\r\n setActions([]);\r\n setMenuDictionary({});\r\n }\r\n }\r\n\r\n get();\r\n\r\n }, [client, isLoggedIn, menuId, enableMenuSecurity]);\r\n\r\n const result = useMemo(() => ({\r\n activeIDState,\r\n subitemActiveIDState,\r\n items,\r\n actions,\r\n menuPathsDictionary: menuDictionary\r\n }), [activeIDState, subitemActiveIDState, items, actions, menuDictionary]);\r\n\r\n return result;\r\n\r\n}\r\n\r\nexport type UseMenuContentReturnType = ReturnType<typeof useMenuContent>;","import { SpotlightAction } from \"@mantine/spotlight\";\r\n\r\nexport function normalizeTextToLowercaseWithoutAccents(value: string) {\r\n return value\r\n .normalize(\"NFD\") // separate characters from their accents\r\n .replace(/[\\u0300-\\u036f]/g, \"\") // delete the accents\r\n .toLowerCase(); // case insensitive\r\n}\r\n\r\nexport function caseInsensitveAccentInsensitiveFilter(query: string, actions: SpotlightAction[]) {\r\n const tokens = normalizeTextToLowercaseWithoutAccents(query)\r\n .split(/\\s+/)\r\n .filter(Boolean);\r\n\r\n return actions.filter((action) => {\r\n const label = normalizeTextToLowercaseWithoutAccents(action.label || \"\");\r\n const description = normalizeTextToLowercaseWithoutAccents(action.description || \"\");\r\n\r\n const text = `${label} ${description}`;\r\n\r\n return tokens.every((token) => text.includes(token));\r\n });\r\n}","import { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { DataResult, DBStatusResult, OperationStatus, SQLType, Value, ValuesObject, ValuesRecord } from \"../../client\";\r\nimport { convertRecordToValuesObject, EntityClientAction, exportToExcel, toCamelCase } from \"../../Entity\";\r\nimport { useEntityUI, useLocaleFormat } from \"../Core\";\r\nimport { DataGridStateProps } from \"../DataGrid/DataGrid.types\";\r\nimport { DataViewProps, DataViewRecord, DataViewSelection, DataViewSelectionChangedHandler } from \"./DataView.types\";\r\n\r\nexport interface useDataViewReturnType {\r\n handleSelectionChanged: DataViewSelectionChangedHandler;\r\n handleDeleteRecord: (keys: ValuesObject, element?: HTMLElement) => Promise<void>;\r\n handleDeleteClick: (element?: HTMLElement) => Promise<void>;\r\n handleEditClick: (keys: ValuesObject, element?: HTMLElement) => Promise<void>;\r\n handleAddClick: (element?: HTMLElement) => Promise<void>;\r\n handleViewClick: (keys: ValuesObject, element?: HTMLElement) => Promise<void>;\r\n handleToggleSelectable: () => void;\r\n handleRefresh: (searchText: string[] | undefined) => void;\r\n handleExecuteAction: (action: EntityClientAction, recordIndex?: number, element?: HTMLElement) => Promise<boolean | undefined>;\r\n handleExport: () => void;\r\n selectedRowsCount: number;\r\n limitRows: string | null;\r\n setLimitRows: React.Dispatch<React.SetStateAction<string | null>>;\r\n showSelectCheckbox: boolean;\r\n isLoading: boolean;\r\n executeViewState: OperationStatus<DataResult[]>;\r\n data: DataViewRecord<ValuesObject>[];\r\n handleDeselectAllRecords: () => Promise<void>;\r\n handleDeselectRecord: (record_index: number) => Promise<void>;\r\n handleSelectRecord: (record_index: number) => Promise<void>;\r\n handleSelectAllRecords: () => Promise<void>;\r\n selectedRecords: DataViewSelection;\r\n toggleSelectable: boolean;\r\n handleLoadMore: () => void;\r\n displayedItemsCount: number;\r\n recordsCount?: number;\r\n}\r\n\r\n\r\nexport function useDataView(props: DataViewProps, stateProps: DataGridStateProps): useDataViewReturnType {\r\n const {\r\n entity, parentKeys, viewName, limit, onSelectionChanged, modalFormSize, onModalSaved,\r\n labels, saveFormBeforeAdd, parentFormAPI, allwaysRefreshOnEntityClose, notExportableColumns, itemsPerPage, onActionExecuted,\r\n convertResultToLocaleString, withModalFullscreenButton,\r\n onDataRefresh\r\n } = props;\r\n\r\n const localeFormat = useLocaleFormat({ timeZoneOffset: entity?.API.client.TIMEZONE_OFFSET || 0 });\r\n\r\n const { setRefresh, setSearchText, executeViewState } = stateProps;\r\n\r\n const selectedRecords = useRef<DataViewSelection>([]);\r\n\r\n const [selectedRowsCount, setSelectedRowsCount] = useState(0);\r\n\r\n const [toggleSelectable, setToggleSelectable] = useState(false);\r\n\r\n const [limitRows, setLimitRows] = useState<string | null>(limit ? limit as string : null);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n\r\n const data = useRef<DataViewRecord<ValuesObject>[]>([]);\r\n\r\n const [displayedItemsCount, setDisplayedItemsCount] = useState(itemsPerPage!);\r\n\r\n const [viewResult, setViewResult] = useState<DataResult | null>(null);\r\n\r\n\r\n // MMC: we can't use callbacks here because we need to use the latest values of the state variables\r\n const internalRefresh = useCallback(() => {\r\n setRefresh((prev) => !prev);\r\n }, [setRefresh]);\r\n\r\n const handleRefresh = useCallback((search_text: string[] | undefined) => {\r\n setSearchText(search_text);\r\n setRefresh((prev) => !prev);\r\n }, [setRefresh, setSearchText]);\r\n\r\n const handleModalSaved = useCallback(async (new_status: OperationStatus<DBStatusResult | null>) => {\r\n if (!new_status.error && !new_status.loading && new_status.data && !allwaysRefreshOnEntityClose) internalRefresh();\r\n if (onModalSaved) await onModalSaved(new_status);\r\n }, [allwaysRefreshOnEntityClose, internalRefresh, onModalSaved]);\r\n\r\n const handleAllwaysRefreshOnClose = useCallback(() => {\r\n if (allwaysRefreshOnEntityClose) internalRefresh();\r\n }, [allwaysRefreshOnEntityClose, internalRefresh]);\r\n\r\n const UIAPI = useEntityUI({\r\n entity, parentKeys, modalFormSize, parentFormAPI, saveFormBeforeAdd, withModalFullscreenButton, onModalSaved: handleModalSaved,\r\n onModalClosed: handleAllwaysRefreshOnClose,\r\n onRecordsDeleted: internalRefresh, onActionRefreshOnClose: internalRefresh, labels, onActionExecuted\r\n });\r\n\r\n const getRecordKeys = useCallback((record: ValuesRecord): ValuesObject => {\r\n if (!entity || !record) return {}; // MMC: this should never happen\r\n\r\n const keys: ValuesObject = {};\r\n\r\n // MMC: keyMappings is an object with the column names as keys and the index of the column in the viewResult as value\r\n const key_mappings = entity.def.views[viewName].keyMappings;\r\n for (const columnName in key_mappings) {\r\n const idx = key_mappings[columnName]; // MMC: index of the column in the record\r\n if (idx >= record.length) continue;\r\n keys[columnName] = record[idx];\r\n }\r\n\r\n return keys;\r\n }, [entity, viewName]);\r\n\r\n const getSelectionKeys = useCallback(() => {\r\n // MMC: if viewResult is null, it means that the view has not been executed yet\r\n if (!data) return [];\r\n if (selectedRecords.current.length === 0) return [];\r\n\r\n const selection = selectedRecords.current;\r\n\r\n const result: ValuesObject[] = [];\r\n // MMC: dataViewSelection is an array of indexes of the selected records in the viewResult\r\n for (let i = 0; i < selection.length; i++) {\r\n const keys = data.current[selection[i]].keys;\r\n if (keys) result.push(keys);\r\n }\r\n return result;\r\n }, []);\r\n\r\n\r\n const handleSelectRecord = useCallback(async (record_index: number) => {\r\n if (selectedRecords.current.includes(record_index)) return;\r\n\r\n selectedRecords.current.push(record_index);\r\n setSelectedRowsCount(selectedRecords.current.length);\r\n if (onSelectionChanged) onSelectionChanged(selectedRecords.current, getSelectionKeys());\r\n\r\n }, [getSelectionKeys, onSelectionChanged]);\r\n\r\n const handleDeselectRecord = useCallback(async (record_index: number) => {\r\n const index_to_remove = selectedRecords.current.indexOf(record_index);\r\n if (index_to_remove === -1) return;\r\n\r\n selectedRecords.current.splice(index_to_remove, 1);\r\n\r\n setSelectedRowsCount(selectedRecords.current.length);\r\n if (onSelectionChanged) onSelectionChanged(selectedRecords.current, getSelectionKeys());\r\n }, [getSelectionKeys, onSelectionChanged]);\r\n\r\n const handleSelectAllRecords = useCallback(async () => {\r\n selectedRecords.current = data.current.map((_, index) => index) ?? [];\r\n setSelectedRowsCount(selectedRecords.current.length);\r\n if (onSelectionChanged) onSelectionChanged(selectedRecords.current, getSelectionKeys());\r\n }, [getSelectionKeys, onSelectionChanged]);\r\n\r\n const handleDeselectAllRecords = useCallback(async () => {\r\n selectedRecords.current = [];\r\n setSelectedRowsCount(selectedRecords.current.length);\r\n if (onSelectionChanged) onSelectionChanged(selectedRecords.current, getSelectionKeys());\r\n }, [getSelectionKeys, onSelectionChanged]);\r\n\r\n\r\n const handleSelectionChanged = useCallback<DataViewSelectionChangedHandler>(async (newSelection) => {\r\n selectedRecords.current = newSelection.filter(index => index >= 0 && index < selectedRecords.current.length);;\r\n setSelectedRowsCount(selectedRecords.current.length);\r\n if (onSelectionChanged) onSelectionChanged(selectedRecords.current, getSelectionKeys());\r\n }, [onSelectionChanged, getSelectionKeys]);\r\n\r\n const handleToggleSelectable = useCallback(() => {\r\n setToggleSelectable(prev => !prev);\r\n }, []);\r\n\r\n const handleEditClick = useCallback(async (keys: ValuesObject, element?: HTMLElement) => {\r\n if (!entity || entity.Form === null) return;\r\n if (!keys) return;\r\n\r\n await UIAPI.handleEditClick(keys, element);\r\n }, [UIAPI, entity]);\r\n\r\n const handleViewClick = useCallback(async (keys: ValuesObject, element?: HTMLElement) => {\r\n if (!entity || entity.Form === null) return;\r\n if (!keys) return;\r\n\r\n await UIAPI.handleViewClick(keys, element);\r\n }, [entity, UIAPI]);\r\n\r\n const handleDeleteClick = useCallback(async (element?: HTMLElement) => {\r\n const keys = getSelectionKeys();\r\n await UIAPI.handleDeleteClick(keys, element);\r\n }, [UIAPI, getSelectionKeys]);\r\n\r\n const handleDeleteRecord = useCallback(async (keys: ValuesObject, element?: HTMLElement) => {\r\n if (!keys) return;\r\n\r\n await UIAPI.handleDeleteRecord(keys, element);\r\n }, [UIAPI]);\r\n\r\n const handleExecuteAction = useCallback(async (action: EntityClientAction, recordIndex?: number, element?: HTMLElement) => {\r\n if (recordIndex !== undefined) {\r\n selectedRecords.current = [recordIndex];\r\n }\r\n const keys = getSelectionKeys();\r\n return await UIAPI.handleExecuteAction(action, keys, element);\r\n }, [UIAPI, getSelectionKeys]);\r\n\r\n const handleExport = useCallback(() => {\r\n if (!viewResult) return;\r\n exportToExcel([viewResult], notExportableColumns);\r\n }, [notExportableColumns, viewResult]);\r\n\r\n const formatValue = useCallback((value: Value, sqlType: SQLType) => {\r\n const rawValue = localeFormat.formatValue(localeFormat.getNativeValue(value, sqlType), sqlType);\r\n return (rawValue === 'null') ? '' : rawValue;\r\n }, [localeFormat]);\r\n\r\n const handleLoadMore = () => {\r\n setDisplayedItemsCount(currentCount => Math.min(currentCount! + itemsPerPage!, data.current.length));\r\n };\r\n\r\n useEffect(() => {\r\n if (executeViewState.loading) {\r\n setIsLoading(true);\r\n setDisplayedItemsCount(itemsPerPage!);\r\n } else if (executeViewState.error) {\r\n setIsLoading(false);\r\n } else if (!executeViewState.error && executeViewState.data?.length) {\r\n const data_result = executeViewState.data[0];\r\n const headers = data_result.Header.map(toCamelCase); // transform header names\r\n\r\n const new_data = data_result.records.map((record) => {\r\n return {\r\n keys: getRecordKeys(record),\r\n data: convertRecordToValuesObject(record, headers, data_result.typeInfo, convertResultToLocaleString ? formatValue : undefined)\r\n };\r\n });\r\n data.current = new_data;\r\n\r\n setViewResult(data_result);\r\n setIsLoading(false);\r\n if (onDataRefresh) onDataRefresh(executeViewState);\r\n } else if (!executeViewState.error && executeViewState.data?.length === 0) {\r\n data.current = [];\r\n\r\n setViewResult(null);\r\n setIsLoading(false);\r\n }\r\n }, [executeViewState, formatValue, getRecordKeys, convertResultToLocaleString, onDataRefresh]);\r\n\r\n return {\r\n handleSelectionChanged,\r\n handleDeleteRecord,\r\n handleDeleteClick,\r\n handleEditClick,\r\n handleAddClick: UIAPI.handleAddClick,\r\n handleViewClick,\r\n handleToggleSelectable,\r\n handleRefresh,\r\n handleExecuteAction,\r\n handleExport,\r\n selectedRowsCount,\r\n limitRows,\r\n setLimitRows,\r\n showSelectCheckbox: toggleSelectable,\r\n isLoading,\r\n executeViewState,\r\n data: data.current.slice(0, displayedItemsCount),\r\n handleDeselectAllRecords,\r\n handleDeselectRecord,\r\n handleSelectRecord,\r\n handleSelectAllRecords,\r\n selectedRecords: selectedRecords.current,\r\n toggleSelectable,\r\n handleLoadMore,\r\n displayedItemsCount,\r\n recordsCount: data.current.length,\r\n }\r\n}\r\n","import { Button, Card, CardProps, Checkbox, Group, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { ComponentType, useRef } from \"react\";\r\nimport { ValuesObject } from \"../../client\";\r\nimport { EntityCardProps } from \"../EntityCard\";\r\nimport { DataViewDefaultProps } from \"./DataView\";\r\n\r\n\r\nexport interface DataViewCardContainerProps extends EntityCardProps<ValuesObject> {\r\n EntityCard?: ComponentType<EntityCardProps<ValuesObject>>,\r\n CardProps?: Omit<CardProps, 'children'>\r\n}\r\n\r\nexport const DataViewCardContainerDefaultProps: Partial<DataViewCardContainerProps> = {\r\n CardProps: { shadow: \"sm\", withBorder: true }\r\n}\r\n\r\nexport function DataViewCardContainer(props: DataViewCardContainerProps) {\r\n const {\r\n recordIndex, selected, handleDeleteClick, handleDeselectRecord, handleEditClick, handleSelectRecord, handleViewClick,\r\n enableDelete, enableEdit, enableView, entity, record, toggleSelectable, EntityCard, CardProps, refreshView, handleCardClick,\r\n cardHrefRootURL, cardHrefTarget, handleExecuteAction\r\n } = useComponentDefaultProps('DataViewCardContainer', DataViewCardContainerDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const editElement = useRef<HTMLButtonElement>(null);\r\n const deleteElement = useRef<HTMLButtonElement>(null);\r\n const viewElement = useRef<HTMLButtonElement>(null);\r\n\r\n return (\r\n <Card key={`${entity.def.name}-${recordIndex}`} bg={theme.colorScheme === 'dark' ? theme.colors.dark[9] : undefined} {...CardProps}>\r\n {toggleSelectable && handleDeselectRecord && handleSelectRecord &&\r\n <Checkbox key={`chk-${entity.def.name}-${recordIndex}`} size=\"xs\" variant=\"light\" mb=\"xs\" checked={selected} onClick={() => { selected ? handleDeselectRecord(recordIndex) : handleSelectRecord(recordIndex) }} />\r\n }\r\n {EntityCard &&\r\n <EntityCard\r\n key={`card-${entity.def.name}-${recordIndex}`}\r\n record={record}\r\n recordIndex={recordIndex}\r\n entity={entity}\r\n enableDelete={enableDelete}\r\n enableEdit={enableEdit}\r\n enableView={enableView}\r\n handleSelectRecord={handleSelectRecord}\r\n handleDeselectRecord={handleDeselectRecord}\r\n handleDeleteClick={handleDeleteClick}\r\n handleEditClick={handleEditClick}\r\n handleViewClick={handleViewClick}\r\n handleCardClick={handleCardClick}\r\n handleExecuteAction={handleExecuteAction}\r\n selected={selected}\r\n toggleSelectable={toggleSelectable}\r\n refreshView={refreshView}\r\n cardHrefRootURL={cardHrefRootURL}\r\n cardHrefTarget={cardHrefTarget}\r\n />\r\n\r\n }\r\n {(enableDelete || enableEdit || enableView) &&\r\n <Card.Section mt=\"xs\" p=\"xs\" withBorder>\r\n <Group position=\"right\">\r\n {enableView && !enableEdit && handleViewClick &&\r\n <Button size=\"xs\" ref={viewElement} onClick={async () => await handleViewClick(record.keys, viewElement.current as HTMLElement)}>{DataViewDefaultProps.labels?.viewLabel}</Button>\r\n }\r\n {enableEdit && handleEditClick &&\r\n <Button size=\"xs\" ref={editElement} onClick={async () => await handleEditClick(record.keys, editElement.current as HTMLElement)}>{DataViewDefaultProps.labels?.editLabel}</Button>\r\n }\r\n {enableDelete && handleDeleteClick &&\r\n <Button size=\"xs\" ref={deleteElement} color=\"red\" onClick={async () => await handleDeleteClick(record.keys, deleteElement.current as HTMLElement)}>{DataViewDefaultProps.labels?.deleteLabel}</Button>\r\n }\r\n </Group>\r\n </Card.Section>\r\n }\r\n </Card>\r\n )\r\n}","import { Button, Group, Loader, SelectItem, Space, Stack, Text, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { ForwardedRef, forwardRef, useState } from \"react\";\r\nimport { AlertError, useExecuteView, useViewState } from \"../Core\";\r\nimport { DataGridToolbar } from \"../DataGrid\";\r\nimport { DataGridActionsToolbar } from \"../DataGrid/DataGridActionsToolbar\";\r\nimport { DataViewProps } from \"./DataView.types\";\r\nimport { DataViewCardContainer } from \"./DataViewCardContainer\";\r\nimport { useDataView } from \"./useDataView\";\r\n\r\n\r\nexport const DataViewDefaultProps: Partial<DataViewProps> = {\r\n search: [],\r\n limit: \"1000\",\r\n toolbarIconVariant: \"light\",\r\n actionsButtonVariant: \"light\",\r\n modalFormSize: \"lg\",\r\n enableAdd: true,\r\n enableEdit: true,\r\n enableDelete: true,\r\n enableExport: true,\r\n CardContainer: DataViewCardContainer,\r\n itemsPerPage: 50,\r\n labels: {\r\n addLabel: \"Add\",\r\n editLabel: \"Edit\",\r\n deleteLabel: \"Delete\",\r\n viewLabel: \"View\",\r\n rowsReturnedLabel: \"Rows returned:\",\r\n selectedRowsLabel: \"rows selected.\",\r\n limitLabel: \"Limit\",\r\n rowsLabel: \"rows\",\r\n unlimitedLabel: \"Unlimited\",\r\n recordsLabel: \"records\",\r\n recordLabel: \"record\",\r\n AreYouSureLabel: \"Are you sure?\",\r\n YouWillDeleteLabel: \"You will delete\",\r\n warningLabel: \"Warning\",\r\n YouMustSelectOneOrMoreRecordsToDelete: \"You must select one or more records to delete\",\r\n closeLabel: \"Close\",\r\n YouMustSelectOneOrMoreRecordsToExecuteAction: \"You must select one or more records to execute this action\",\r\n resultLimitLabel: \"Results are limited to %s records.\",\r\n loadMoreLabel: \"Load More\",\r\n fetchingDataLabel: \"Fetching data...\",\r\n noRecordsFoundLabel: \"No records found\",\r\n YouMustSelectAtLeast: \"You must select at least\",\r\n YouMustSelectBetween: \"You must select between\",\r\n YouMustSelect: \"You must select\",\r\n YouMustSelectMaximum: \"You must select a maximum of\",\r\n },\r\n filtersFormSize: \"md\",\r\n convertResultToLocaleString: true,\r\n showActions: true,\r\n showToolbar: true,\r\n showDeleteOnlyWhenMultiselect: true,\r\n withModalFullscreenButton: true,\r\n CardRowAlign: \"flex-start\",\r\n RowsContainer: Group,\r\n}\r\n\r\nexport const DataView = forwardRef(function DataView(props: DataViewProps, ref: ForwardedRef<HTMLElement> | undefined) {\r\n props = useComponentDefaultProps('DataView', DataViewDefaultProps, props);\r\n const {\r\n entity, autoFocus, toolbarIconVariant,\r\n actionsButtonVariant, enableAdd, enableEdit, enableDelete, enableView, enableExport, labels,\r\n Card, CardContainer, limit, search, viewName, filtersFormSize, toolbarSize,\r\n showAppliedFilters, showRefreshButton, hideCheckboxToggle, showFiltersButton, searchPlaceholder,\r\n showActions, parentKeys, visibleFilters, setInitialFiltersFromColumns, cardHrefRootURL, cardHrefTarget,\r\n showSearchInput, showSelectRowsButton, showToolbar, showDeleteOnlyWhenMultiselect, parentFormAPI, formMode,\r\n CardRowAlign, RowsContainer\r\n } = props;\r\n\r\n const [searchData, setSearchData] = useState<SelectItem[]>(search?.map(s => { return { value: s, label: s } }) as SelectItem[]);\r\n\r\n const viewState = useViewState(search, limit);\r\n\r\n const executeViewState = useExecuteView(entity, parentKeys, viewName, viewState.searchText, viewState.limitRows, viewState.refresh, viewState.filterValues);\r\n\r\n const dataViewAPI = useDataView(props, { executeViewState, setRefresh: viewState.setRefresh, setSearchText: viewState.setSearchText });\r\n const { handleLoadMore } = dataViewAPI;\r\n\r\n const limit_number = parseInt(limit || '0');\r\n\r\n const effectiveFormMode = formMode || parentFormAPI?.formMode || 'add';\r\n\r\n if (entity?.def.views[viewName] === undefined) {\r\n console.warn(`DataView: View ${viewName} not found in entity ${entity?.def.name}`);\r\n }\r\n\r\n return (\r\n <section ref={ref}>\r\n <Stack spacing=\"sm\">\r\n {showToolbar &&\r\n <>\r\n <DataGridToolbar\r\n {...labels!}\r\n\r\n enableExport={enableExport}\r\n onExportClick={dataViewAPI.handleExport}\r\n\r\n onRefreshClick={dataViewAPI.handleRefresh}\r\n onCheckboxToggle={dataViewAPI.handleToggleSelectable}\r\n autoFocus={autoFocus}\r\n toolbarIconVariant={toolbarIconVariant}\r\n\r\n searchText={viewState.searchText}\r\n setSearchText={viewState.setSearchText}\r\n searchData={searchData}\r\n setSearchData={setSearchData}\r\n\r\n client={entity?.API.client}\r\n\r\n FiltersEntity={(entity && viewName && entity?.def.views[viewName]) ? entity?.def.views[viewName].FiltersEntity : undefined}\r\n\r\n filterValues={viewState.filterValues}\r\n setFilterValues={viewState.setFilterValues}\r\n\r\n filtersDescription={viewState.filtersDescription}\r\n setFiltersDescription={viewState.setFiltersDescription}\r\n\r\n filtersFormSize={filtersFormSize!}\r\n\r\n size={toolbarSize}\r\n\r\n showAppliedFilters={showAppliedFilters}\r\n showRefreshButton={showRefreshButton}\r\n showFiltersButton={showFiltersButton}\r\n showSearchInput={showSearchInput}\r\n showSelectRowsButton={showSelectRowsButton}\r\n\r\n\r\n hideCheckboxToggle={hideCheckboxToggle}\r\n searchPlaceholder={searchPlaceholder}\r\n\r\n visibleFilters={visibleFilters}\r\n initialColumnFilters={setInitialFiltersFromColumns && entity ? entity.def.columns : undefined}\r\n />\r\n </>\r\n }\r\n {showActions &&\r\n <DataGridActionsToolbar\r\n {...labels!}\r\n\r\n viewName={viewName}\r\n\r\n onAddClick={dataViewAPI.handleAddClick}\r\n onDeleteClick={dataViewAPI.handleDeleteClick}\r\n\r\n enableAdd={enableAdd}\r\n enableEdit={false}\r\n enableDelete={enableDelete && (showDeleteOnlyWhenMultiselect ? dataViewAPI.showSelectCheckbox : true)}\r\n enableView={false}\r\n\r\n actionsButtonVariant={actionsButtonVariant}\r\n clientActions={entity ? entity.def.clientActions : {}}\r\n\r\n handleExecuteAction={dataViewAPI.handleExecuteAction}\r\n\r\n parentFormMode={effectiveFormMode}\r\n />\r\n }\r\n {!showActions &&\r\n <Space h=\"xs\" />\r\n }\r\n {dataViewAPI.isLoading &&\r\n <Group>\r\n <Loader size=\"sm\" />\r\n <Text fz=\"sm\" c=\"dimmed\">{labels?.fetchingDataLabel}</Text>\r\n </Group>\r\n }\r\n {!dataViewAPI.isLoading && dataViewAPI.executeViewState.error &&\r\n <AlertError mb=\"xs\">Error: {dataViewAPI.executeViewState.error.status} {dataViewAPI.executeViewState.error.message} {dataViewAPI.executeViewState.error.statusMessage}</AlertError>\r\n }\r\n {!dataViewAPI.isLoading && !dataViewAPI.executeViewState.error && dataViewAPI.data.length > 0 && dataViewAPI.recordsCount === limit_number && limit_number !== 0 &&\r\n <Text fz=\"sm\" align=\"center\" fw={500} c=\"dimmed\">{labels?.resultLimitLabel?.replace('%s', limit || '')}</Text>\r\n }\r\n {!dataViewAPI.isLoading && !dataViewAPI.executeViewState.error && dataViewAPI.data.length === 0 && search &&\r\n <Text fz=\"sm\" align=\"center\" fw={500} c=\"dimmed\">{labels?.noRecordsFoundLabel}</Text>\r\n }\r\n {dataViewAPI.data.length > 0 && RowsContainer &&\r\n <RowsContainer {...(CardRowAlign ? { align: CardRowAlign } : null)}>\r\n {\r\n CardContainer && entity && dataViewAPI.data.map((record, index) => {\r\n return <CardContainer\r\n key={`CC_${entity.def.name}-${index}`}\r\n record={record}\r\n EntityCard={Card}\r\n recordIndex={index}\r\n entity={entity}\r\n enableDelete={effectiveFormMode !== 'view' && enableDelete}\r\n enableEdit={effectiveFormMode !== 'view' && enableEdit}\r\n enableView={enableView !== undefined ? enableView : effectiveFormMode === 'view'}\r\n handleSelectRecord={dataViewAPI.handleSelectRecord}\r\n handleDeselectRecord={dataViewAPI.handleDeselectRecord}\r\n handleDeleteClick={dataViewAPI.handleDeleteRecord}\r\n handleEditClick={dataViewAPI.handleEditClick}\r\n handleViewClick={dataViewAPI.handleViewClick}\r\n handleExecuteAction={dataViewAPI.handleExecuteAction}\r\n selected={dataViewAPI.selectedRecords.includes(index)}\r\n toggleSelectable={dataViewAPI.toggleSelectable}\r\n refreshView={() => viewState.setRefresh((prev) => !prev)}\r\n cardHrefRootURL={cardHrefRootURL}\r\n cardHrefTarget={cardHrefTarget}\r\n />\r\n })\r\n }\r\n </RowsContainer>\r\n }\r\n {!dataViewAPI.isLoading && !dataViewAPI.executeViewState.error && dataViewAPI.data.length > 0 && (dataViewAPI.recordsCount || 0) > dataViewAPI.displayedItemsCount &&\r\n <Button size=\"xs\" variant=\"light\" onClick={handleLoadMore}>{labels?.loadMoreLabel}</Button>\r\n }\r\n </Stack>\r\n </section>\r\n )\r\n});\r\n","import { useRef } from \"react\";\r\nimport { MicroMClient } from \"../../client\";\r\nimport { Entity, EntityDefinition } from \"../../Entity\";\r\nimport { DataView } from \"./DataView\";\r\nimport { DataViewProps } from \"./DataView.types\";\r\n\r\n\r\nexport interface DataViewPageProps extends Omit<DataViewProps, 'entity'> {\r\n client: MicroMClient,\r\n entityConstructor: (client: MicroMClient) => Entity<EntityDefinition>,\r\n}\r\n\r\nexport function DataViewPage(props: DataViewPageProps) {\r\n const { client, entityConstructor } = props;\r\n\r\n const entity = useRef<Entity<EntityDefinition>>(entityConstructor(client));\r\n\r\n return (<DataView\r\n entity={entity.current}\r\n {...props}\r\n />)\r\n}","import { ActionIcon, Avatar, AvatarProps, Group, Stack, useMantineTheme } from \"@mantine/core\";\r\nimport { IconTrash, IconUpload } from \"@tabler/icons-react\";\r\nimport { AvatarUploaderAPI } from \"./useAvatarUploader\";\r\n\r\n\r\nexport interface AvatarUploaderProps extends Omit<AvatarProps, 'src'> {\r\n API: AvatarUploaderAPI,\r\n PlaceHolderIcon?: React.ReactNode,\r\n readOnlyMode?: boolean\r\n}\r\n\r\nexport function AvatarUploader(props: AvatarUploaderProps) {\r\n const theme = useMantineTheme();\r\n const { API, PlaceHolderIcon, readOnlyMode, ...others } = props;\r\n\r\n const { imageURL, fileID, fileGUID, handleOpenFileUpload, handleDeleteFile, parentFormAPI } = API;\r\n\r\n return (\r\n <Stack>\r\n <Avatar {...others} src={imageURL ?? undefined} onClick={async () => {\r\n if (!readOnlyMode && parentFormAPI?.formMode !== 'view') await handleOpenFileUpload()\r\n }}>\r\n {PlaceHolderIcon}\r\n </Avatar>\r\n {!readOnlyMode && parentFormAPI?.formMode !== 'view' &&\r\n <Group position=\"right\">\r\n <ActionIcon color={theme.primaryColor} variant=\"light\" onClick={async () => await handleOpenFileUpload()}><IconUpload size=\"1rem\" /></ActionIcon>\r\n <ActionIcon color={theme.primaryColor} variant=\"light\" onClick={async () => await handleDeleteFile(fileID ?? '', fileGUID ?? '')}><IconTrash size=\"1rem\" /></ActionIcon>\r\n </Group>\r\n }\r\n </Stack>\r\n );\r\n}","import { useComponentDefaultProps } from \"@mantine/core\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport { MicroMClient } from \"../../client\";\r\nimport { EntityColumn } from \"../../Entity\";\r\nimport { useFilesUploadForm, useFileUpload } from \"../FileUploader\";\r\nimport { UseEntityFormReturnType } from \"../Form\";\r\n\r\nexport interface useAvatarUploaderProps {\r\n client: MicroMClient,\r\n fileProcessColumn: EntityColumn<string>,\r\n fileGUIDColumn: EntityColumn<string>,\r\n initialImageURL?: string,\r\n labels?: AvatarUploaderLabels,\r\n parentFormAPI?: UseEntityFormReturnType\r\n}\r\n\r\nexport type AvatarUploaderLabels = {\r\n modalTitle?: string,\r\n}\r\n\r\nexport const AvatarUploaderDefaultProps: Partial<useAvatarUploaderProps> = {\r\n labels: { modalTitle: 'Upload Image' }\r\n};\r\n\r\nexport interface AvatarUploaderAPI {\r\n imageURL?: string,\r\n fileID?: string,\r\n fileProcessID?: string,\r\n fileGUID?: string,\r\n handleOpenFileUpload: () => void,\r\n handleDeleteFile: (file_id: string, fileGUID: string) => void,\r\n parentFormAPI?: UseEntityFormReturnType\r\n}\r\n\r\nexport function useAvatarUploader(props: useAvatarUploaderProps): AvatarUploaderAPI {\r\n const {\r\n client, fileProcessColumn, labels, initialImageURL, parentFormAPI, fileGUIDColumn\r\n } = useComponentDefaultProps('AvatarUploader', AvatarUploaderDefaultProps, props);\r\n\r\n const imageFileUploadOpen = useFilesUploadForm();\r\n\r\n const { deleteFile } = useFileUpload({\r\n client,\r\n fileProcessColumn: fileProcessColumn\r\n });\r\n\r\n const [imageURL, setImageURL] = useState<string | undefined>(initialImageURL);\r\n const [fileID, setFileID] = useState<string | undefined>(undefined);\r\n const [fileProcessID, setFileProcessID] = useState<string | undefined>(undefined);\r\n const [fileGUID, setFileGUID] = useState<string | undefined>(undefined);\r\n\r\n\r\n const handleOpenFileUpload = useCallback(async () => {\r\n await imageFileUploadOpen({\r\n fileProcessColumn: fileProcessColumn,\r\n client: client,\r\n modalTitle: labels?.modalTitle,\r\n onOK: (fileprocess_id, uploadProgress) => {\r\n fileProcessColumn.value = fileprocess_id;\r\n const keys = Object.keys(uploadProgress);\r\n if (keys.length > 0 && uploadProgress[keys[0]].vc_fileguid) {\r\n fileGUIDColumn.value = uploadProgress[keys[0]].vc_fileguid!;\r\n setFileGUID(fileGUIDColumn.value);\r\n setImageURL(client.getDocumentURL(fileGUIDColumn.value));\r\n setFileID(uploadProgress[keys[0]].file_id);\r\n setFileProcessID(fileprocess_id);\r\n }\r\n else {\r\n // MMC: if no file was uploaded, clear the file column\r\n fileGUIDColumn.value = '';\r\n setFileGUID(undefined);\r\n setImageURL(undefined);\r\n setFileID(undefined);\r\n }\r\n },\r\n modalProps: {\r\n closeOnClickOutside: false,\r\n closeOnEscape: false,\r\n withCloseButton: false,\r\n size: \"lg\"\r\n },\r\n uploaderProps: {\r\n accept: [\"image/*\"],\r\n },\r\n filesUploadFormProps: {\r\n maxFilesCount: 1,\r\n }\r\n });\r\n }, [client, fileGUIDColumn, fileProcessColumn, imageFileUploadOpen, labels?.modalTitle]);\r\n\r\n const handleDeleteFile = async (file_id: string, fileGUID: string) => {\r\n await deleteFile(file_id, fileGUID);\r\n fileGUIDColumn.value = '';\r\n fileProcessColumn.value = '';\r\n setFileID(undefined);\r\n setImageURL(undefined);\r\n setFileGUID(undefined);\r\n };\r\n\r\n // MMC: set the loaded URL when finishing the entity get\r\n useEffect(() => {\r\n if (parentFormAPI) {\r\n if (parentFormAPI.status.loading === false && parentFormAPI.status.operationType === 'get') {\r\n if (fileProcessColumn.value) {\r\n setFileProcessID(fileProcessColumn.value);\r\n setImageURL(client.getDocumentURL(fileGUIDColumn.value));\r\n setFileGUID(fileGUIDColumn.value);\r\n }\r\n }\r\n }\r\n }, [client, parentFormAPI]);\r\n\r\n return {\r\n imageURL,\r\n fileID,\r\n fileProcessID,\r\n fileGUID,\r\n handleOpenFileUpload,\r\n handleDeleteFile,\r\n parentFormAPI\r\n }\r\n\r\n}","import { Anchor, AnchorProps } from \"@mantine/core\";\r\nimport { forwardRef } from \"react\";\r\nimport { useMicroMRouter } from \"./useMicroMRouter\";\r\n\r\nexport interface LinkProps extends Omit<AnchorProps, 'href'> {\r\n to: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(props: LinkProps, ref) {\r\n const { navigate } = useMicroMRouter();\r\n const { to, children } = props;\r\n\r\n return <Anchor {...props} ref={ref} href={to} onClick={(e) => { e.preventDefault(); navigate(to); } }>{children}</Anchor>;\r\n});\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { MicroMRouterState, navigateToRoute, NavigationState, normalizeRoutePath } from './MicroMRouterState';\r\n\r\nexport function useNavigation(): MicroMRouterState {\r\n // Adjust initial path setup to check for '/#/' prefix\r\n const initialPath = window.location.hash.startsWith('#/') ? window.location.hash.slice(1) : '/';\r\n const [path, setPath] = useState(initialPath);\r\n\r\n // Initialize navigated to false to indicate initial load\r\n const [navigationState, setNavigationState] = useState<NavigationState>({ navigated: false, route: path });\r\n\r\n // Unified navigation handling\r\n const handleNavigation = useCallback((newPath: string) => {\r\n const formattedPath = normalizeRoutePath(newPath);\r\n if (formattedPath !== path) { // Check to prevent unnecessary state updates\r\n setPath(formattedPath);\r\n setNavigationState({ navigated: true, route: formattedPath });\r\n }\r\n }, [path]);\r\n\r\n useEffect(() => {\r\n // Update path and navigationState based on direct hash changes\r\n const handleHashChange = () => {\r\n const newPath = window.location.hash.slice(1);\r\n handleNavigation(newPath);\r\n };\r\n\r\n window.addEventListener('hashchange', handleHashChange);\r\n return () => window.removeEventListener('hashchange', handleHashChange);\r\n }, [handleNavigation]);\r\n\r\n return { path, navigate: navigateToRoute, navigationState };\r\n};\r\n","import { ReactNode } from \"react\";\r\nimport { MicroMRouterContext } from \"./useMicroMRouter\";\r\nimport { useNavigation } from \"./useNavigation\";\r\n\r\nexport function MicroMRouter(props: { children: ReactNode }) {\r\n const router = useNavigation();\r\n const { children } = props;\r\n\r\n return <MicroMRouterContext.Provider value={router}>{children}</MicroMRouterContext.Provider>;\r\n};","import { useMicroMRouter } from \"./useMicroMRouter\";\r\n\r\nexport interface RouteProps {\r\n path: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function Route (props: RouteProps) {\r\n const { path: currentPath } = useMicroMRouter();\r\n const { path, children } = props;\r\n\r\n return currentPath === path ? <>{children}</> : null;\r\n};\r\n","import { Loader, LoaderOptions } from '@googlemaps/js-api-loader';\r\nimport { useEffect, useState } from 'react';\r\n\r\nexport const GoogleMapsAPILoaderConfig:Partial<LoaderOptions> = {\r\n apiKey: \"\",\r\n}\r\n\r\nlet googleAPILoaderInstance:Loader;\r\nexport function GetGoogleMapsAPILoader() {\r\n return googleAPILoaderInstance ?? (googleAPILoaderInstance = new Loader(GoogleMapsAPILoaderConfig as LoaderOptions));\r\n}\r\n\r\nexport function useGooglePlacesAPIloader() {\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!window.google?.maps.places) {\r\n GetGoogleMapsAPILoader().importLibrary(\"places\")\r\n .then(_callback);\r\n } else {\r\n _callback();\r\n }\r\n }, []);\r\n\r\n function _callback() {\r\n setIsReady(true);\r\n }\r\n\r\n return [isReady];\r\n}\r\n\r\nexport function useGoogleGeocoderAPIloader() {\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!window.google?.maps.Geocoder) {\r\n GetGoogleMapsAPILoader().importLibrary(\"geocoding\")\r\n .then(_callback);\r\n } else {\r\n _callback();\r\n }\r\n }, []);\r\n\r\n function _callback() {\r\n setIsReady(true);\r\n }\r\n\r\n return [isReady];\r\n}\r\n\r\nexport function useGoogleMapsAPILoader() {\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!window.google?.maps.Map) {\r\n GetGoogleMapsAPILoader().importLibrary(\"maps\")\r\n .then(_callback);\r\n } else {\r\n _callback();\r\n }\r\n }, []);\r\n\r\n function _callback() {\r\n setIsReady(true);\r\n }\r\n\r\n return [isReady];\r\n}\r\n\r\nexport function useGoogleGeometryAPILoader() {\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!window.google?.maps.Map) {\r\n GetGoogleMapsAPILoader().importLibrary(\"geometry\")\r\n .then(_callback);\r\n } else {\r\n _callback();\r\n }\r\n }, []);\r\n\r\n function _callback() {\r\n setIsReady(true);\r\n }\r\n\r\n return [isReady];\r\n}\r\n","import { useCallback, useEffect, useRef } from \"react\";\r\nimport { useGoogleGeocoderAPIloader, useGoogleGeometryAPILoader, useGoogleMapsAPILoader, useGooglePlacesAPIloader } from \"./GoogleMapsAPILoader\";\r\n\r\nexport function useGoogleMapsAPI() {\r\n const [mapReady] = useGoogleMapsAPILoader();\r\n const [placesReady] = useGooglePlacesAPIloader();\r\n const [geocoderReady] = useGoogleGeocoderAPIloader();\r\n const [geometryReady] = useGoogleGeometryAPILoader();\r\n\r\n const placesServiceRef = useRef<google.maps.places.PlacesService>()\r\n const autocompleteServiceRef = useRef<google.maps.places.AutocompleteService>();\r\n const geocoderServiceRef = useRef<google.maps.Geocoder>();\r\n const sessionTokenRef = useRef<google.maps.places.AutocompleteSessionToken>()\r\n\r\n const attributionsRef = useRef<HTMLDivElement>(null);\r\n\r\n const refreshSessionToken = useCallback(() => {\r\n sessionTokenRef.current = new google.maps.places.AutocompleteSessionToken();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!mapReady || !placesReady || !geocoderReady || !geometryReady) return;\r\n\r\n if (!autocompleteServiceRef.current) {\r\n autocompleteServiceRef.current = new google.maps.places.AutocompleteService();\r\n refreshSessionToken();\r\n }\r\n if (!placesServiceRef.current && attributionsRef.current) {\r\n placesServiceRef.current = new google.maps.places.PlacesService(attributionsRef.current);\r\n }\r\n\r\n if (!geocoderServiceRef.current) {\r\n geocoderServiceRef.current = new google.maps.Geocoder();\r\n }\r\n\r\n\r\n }, [geocoderReady, geometryReady, mapReady, placesReady, refreshSessionToken]);\r\n\r\n const getAutocompletePredictions = useCallback(\r\n (props: {\r\n searchText: string,\r\n restrictions?: google.maps.places.ComponentRestrictions,\r\n callback: (predictions: google.maps.places.AutocompletePrediction[] | null, status: google.maps.places.PlacesServiceStatus) => void\r\n }) => {\r\n autocompleteServiceRef.current!.getPlacePredictions({\r\n input: props.searchText,\r\n componentRestrictions: props.restrictions,\r\n // MMC: we return all types of PLACES that google considers, this is not the type of returned parts for a place.\r\n //types: [\"address\"],\r\n sessionToken: sessionTokenRef.current,\r\n }, props.callback);\r\n },\r\n []);\r\n\r\n const getAutocompleteDetails = useCallback(\r\n (props: {\r\n placeId: string,\r\n fields: string[] | undefined,\r\n callback: (result: google.maps.places.PlaceResult | null, status: google.maps.places.PlacesServiceStatus) => void\r\n }\r\n ) => {\r\n const request: google.maps.places.PlaceDetailsRequest = {\r\n placeId: props.placeId,\r\n fields: props.fields,\r\n sessionToken: sessionTokenRef.current\r\n }\r\n\r\n placesServiceRef.current!.getDetails(request, props.callback);\r\n },\r\n []);\r\n\r\n const geocode = useCallback(\r\n (\r\n request: google.maps.GeocoderRequest,\r\n callback: (results: google.maps.GeocoderResult[] | null | undefined, status: google.maps.GeocoderStatus | null | undefined) => void\r\n\r\n ) => {\r\n\r\n geocoderServiceRef.current!.geocode(request, callback);\r\n\r\n }, []);\r\n\r\n\r\n const getPlaceDetails = useCallback(async (props: { placeId: string, fields: string[] | undefined }): Promise<google.maps.places.PlaceResult> => {\r\n return new Promise((resolve, reject) => {\r\n const service = placesServiceRef.current;\r\n\r\n if (!service) {\r\n reject(new Error(\"Places service not ready\"));\r\n return;\r\n }\r\n\r\n const request: google.maps.places.PlaceDetailsRequest = {\r\n placeId: props.placeId,\r\n fields: props.fields,\r\n sessionToken: sessionTokenRef.current\r\n };\r\n\r\n service.getDetails(request, (place, status) => {\r\n if (status === google.maps.places.PlacesServiceStatus.OK && place) {\r\n resolve(place);\r\n } else {\r\n reject(new Error(`Error: ${status}`));\r\n }\r\n });\r\n });\r\n }, []);\r\n\r\n return {\r\n mapReady,\r\n placesReady,\r\n geocoderReady,\r\n getAutocompletePredictions,\r\n getAutocompleteDetails,\r\n geocode,\r\n attributionsRef,\r\n refreshSessionToken,\r\n geometryReady,\r\n getPlaceDetails\r\n };\r\n}","import { AddressMappingRule, DefaultAddressMappingType } from \"./Mapping.types\";\r\n\r\nexport const DefaultAddressMapping: DefaultAddressMappingType = {\r\n country: [{ country: 'long_name' }],\r\n countryCode: [{ country: 'short_name' }],\r\n province: [{ administrative_area_level_1: 'long_name' }],\r\n provinceCode: [{ administrative_area_level_1: 'short_name' }],\r\n department: [{ locality: 'long_name' }],\r\n departmentCode: [{ locality: 'short_name' }],\r\n city: [{ administrative_area_level_2: 'long_name' }],\r\n cityCode: [{ administrative_area_level_2: 'short_name' }],\r\n street: [{ route: 'long_name' }],\r\n streetNumber: [{ street_number: 'long_name' }],\r\n apartment: [{ room: 'long_name' }],\r\n floor: [{ floor: 'long_name' }],\r\n postalCode: [{ postal_code: 'long_name' }],\r\n}\r\n\r\n\r\nexport const ARMappingRules: AddressMappingRule = {\r\n conditions: { country: { short_name: 'AR' }, locality: { short_name: 'CABA' } },\r\n mapping: {\r\n city: [{ administrative_area_level_1: 'long_name' }],\r\n cityCode: [{ administrative_area_level_1: 'short_name' }],\r\n department: [{ sublocality_level_1: 'long_name' }],\r\n departmentCode: [{ sublocality_level_1: 'short_name' }],\r\n }\r\n}\r\n\r\nexport const UYMappingRules: AddressMappingRule = {\r\n conditions: { country: { short_name: 'UY' } },\r\n mapping: {\r\n city: [{ locality: 'long_name' }],\r\n cityCode: [{ locality: 'short_name' }],\r\n department: [{ neighborhood: 'long_name', locality: 'long_name' }],\r\n departmentCode: [{ neighborhood: 'short_name', locality: 'short_name' }],\r\n }\r\n}\r\n\r\nexport const USMappingRules: AddressMappingRule = {\r\n conditions: { country: { short_name: 'US' } },\r\n dontApplyDefaultMappings: true,\r\n mapping: {\r\n country: [{ country: 'long_name' }],\r\n countryCode: [{ country: 'short_name' }],\r\n province: [{ administrative_area_level_1: 'long_name' }],\r\n provinceCode: [{ administrative_area_level_1: 'short_name' }],\r\n\r\n // county\r\n department: [{ administrative_area_level_2: 'long_name' }],\r\n departmentCode: [{ administrative_area_level_2: 'short_name' }],\r\n\r\n city: [{ locality: 'long_name' }],\r\n cityCode: [{ locality: 'short_name' }],\r\n\r\n street: [{ route: 'long_name' }],\r\n streetNumber: [{ street_number: 'long_name' }],\r\n\r\n apartment: [{ subpremise: 'long_name' }],\r\n\r\n floor: [{ floor: 'long_name' }],\r\n postalCode: [{ postal_code: 'long_name' }],\r\n\r\n }\r\n}\r\n\r\n","import { useCallback } from \"react\";\r\nimport { AddressComponentResult, AddressMappingRule, DefaultAddressMappingType, GoogleMapsAddressComponentType, GoogleMapsMappingRules, MappedAddressResult } from \"./Mapping.types\";\r\nimport { DefaultAddressMapping } from \"./mappingRulesDefinition\";\r\n\r\nfunction convertAddressComponentsToAddressComponentResult(addressComponents: google.maps.GeocoderAddressComponent[]): AddressComponentResult {\r\n const result: AddressComponentResult = {};\r\n\r\n for (let i = 0; i < addressComponents.length; i++) {\r\n const component = addressComponents[i];\r\n\r\n // MMC: we only take the first type of the component as is the last level of the hierearchy\r\n const type = component.types[0] as GoogleMapsAddressComponentType;\r\n\r\n if (!result[type]) {\r\n result[type] = {\r\n long_name: component.long_name,\r\n short_name: component.short_name\r\n };\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction doesRuleMatch(conditions: AddressComponentResult, addressComponentResult: AddressComponentResult): boolean {\r\n return Object.entries(conditions).every(([key, value]) => {\r\n const tkey = key as GoogleMapsAddressComponentType;\r\n return addressComponentResult[tkey]?.long_name === value.long_name || addressComponentResult[tkey]?.short_name === value.short_name\r\n });\r\n\r\n}\r\n\r\nfunction applyRuleMappings(\r\n target: MappedAddressResult,\r\n source: AddressComponentResult,\r\n ruleMappings: GoogleMapsMappingRules\r\n) {\r\n for (const [mappedKey, mappings] of Object.entries(ruleMappings)) {\r\n for (const mapping of mappings) {\r\n for (const [sourceKey, valueKey] of Object.entries(mapping)) {\r\n const skey = sourceKey as GoogleMapsAddressComponentType;\r\n if (source[skey]) {\r\n target[mappedKey as keyof DefaultAddressMappingType] = source[skey]![valueKey];\r\n break; // Apply the first mapping found for this key\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction applyDefaultMappings(\r\n target: MappedAddressResult,\r\n source: AddressComponentResult,\r\n defaultMappings: DefaultAddressMappingType\r\n) {\r\n for (const [targetKey, mappings] of Object.entries(defaultMappings)) {\r\n const tkey = targetKey as keyof MappedAddressResult;\r\n // If the key has already been set by a specific rule, skip applying the default mapping\r\n if (target[tkey] !== undefined) continue;\r\n\r\n for (const mapping of mappings) {\r\n for (const [sourceKey, valueKey] of Object.entries(mapping)) {\r\n const skey = sourceKey as GoogleMapsAddressComponentType;\r\n if (source[skey]) {\r\n target[targetKey as keyof DefaultAddressMappingType] = source[skey]![valueKey];\r\n break; // Apply the first default mapping found for this key\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction mapAddressComponentResultToMappedAddress(\r\n addressComponentResult: AddressComponentResult,\r\n rules: AddressMappingRule[]\r\n): MappedAddressResult {\r\n\r\n const mappedAddress: MappedAddressResult = {};\r\n\r\n // Determine the mapped address type\r\n if (addressComponentResult.street_number || addressComponentResult.route) {\r\n mappedAddress.mappedAddressType = 'address';\r\n }\r\n else if (addressComponentResult.postal_code) {\r\n mappedAddress.mappedAddressType = 'postal_code';\r\n }\r\n else if (addressComponentResult.administrative_area_level_2) {\r\n mappedAddress.mappedAddressType = 'county';\r\n }\r\n else if (addressComponentResult.locality) {\r\n mappedAddress.mappedAddressType = 'city';\r\n }\r\n else if (addressComponentResult.administrative_area_level_1) {\r\n mappedAddress.mappedAddressType = 'state_province';\r\n }\r\n else if (addressComponentResult.country) {\r\n mappedAddress.mappedAddressType = 'country';\r\n }\r\n else {\r\n mappedAddress.mappedAddressType = 'unknown';\r\n }\r\n\r\n if (!rules) return mappedAddress;\r\n\r\n // Check each rule to find the first that matches the conditions\r\n let apply_default_mappings = true;\r\n for (const rule of rules) {\r\n if (doesRuleMatch(rule.conditions, addressComponentResult)) {\r\n if (rule.dontApplyDefaultMappings) apply_default_mappings = false;\r\n // Apply specific rule mappings\r\n applyRuleMappings(mappedAddress, addressComponentResult, rule.mapping);\r\n // Break after finding and applying the first matching rule\r\n break;\r\n }\r\n }\r\n\r\n // Apply default mappings for any keys not set by the specific rule\r\n if (apply_default_mappings) applyDefaultMappings(mappedAddress, addressComponentResult, DefaultAddressMapping);\r\n\r\n\r\n return mappedAddress;\r\n}\r\n\r\n\r\nexport function useGoogleAddressMapping() {\r\n\r\n const mapGoogleAddressComponents = useCallback((addressComponents: google.maps.GeocoderAddressComponent[], mappingRules: AddressMappingRule[]): MappedAddressResult => {\r\n const addressComponentResult = convertAddressComponentsToAddressComponentResult(addressComponents);\r\n return mapAddressComponentResultToMappedAddress(addressComponentResult, mappingRules);\r\n }, []);\r\n\r\n return {\r\n mapGoogleAddressComponents\r\n }\r\n\r\n}","import { AutocompleteItem, useMantineTheme } from \"@mantine/core\";\r\nimport { useDebouncedState } from \"@mantine/hooks\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI/useGoogleMapsAPI\";\r\nimport { GoogleAddressAutocompleteProps } from \"./GoogleAddressAutocomplete\";\r\nimport { MappedAddressResult } from \"./Mapping.types\";\r\nimport { useGoogleAddressMapping } from \"./useGoogleAddressMapping\";\r\n\nexport function useGoogleAddressAutocomplete({ onAddressFound, restrictions, onChange, value, onAPIError, mappingRules, iconColor }: GoogleAddressAutocompleteProps) {\n\n const userInputRef = useRef<HTMLInputElement>(null);\n\n const lastPlaceIdRef = useRef<string>('');\n\n const [isLoading, setIsLoading] = useState(false);\n const [suggestions, setSuggestions] = useState<(AutocompleteItem & { structuredFormatting: google.maps.places.StructuredFormatting })[]>([]);\n const [query, setQuery] = useDebouncedState('', 700, { leading: true });\n const [inputValue, setInputValue] = useState<string>();\n const [apiError, setApiError] = useState<google.maps.places.PlacesServiceStatus | undefined>();\n\n const { refreshSessionToken, getAutocompletePredictions, getAutocompleteDetails, attributionsRef } = useGoogleMapsAPI();\n\n const { mapGoogleAddressComponents } = useGoogleAddressMapping();\n\n const theme = useMantineTheme();\n\n const icon = useMemo(() =>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill={theme.colors[iconColor || theme.primaryColor][theme.fn.primaryShade(theme.colorScheme)]} className=\"icon icon-tabler icons-tabler-filled icon-tabler-map-pin\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M18.364 4.636a9 9 0 0 1 .203 12.519l-.203 .21l-4.243 4.242a3 3 0 0 1 -4.097 .135l-.144 -.135l-4.244 -4.243a9 9 0 0 1 12.728 -12.728zm-6.364 3.364a3 3 0 1 0 0 6a3 3 0 0 0 0 -6z\" /></svg>\n , [iconColor, theme.colorScheme, theme.colors, theme.fn, theme.primaryColor]);\n\n //workaround for firing an event from the effect\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n function handleOnUserInputChange(value: string) {\n setQuery(value);\n setInputValue(value);\n }\n\n const mapPlaceToAddress = useCallback((found: google.maps.places.PlaceResult): MappedAddressResult => {\r\n return found.address_components ? mapGoogleAddressComponents(found.address_components, mappingRules!) : {};\r\n }, [mapGoogleAddressComponents, mappingRules]);\r\n\n const handleItemSelected = useCallback((item: AutocompleteItem & { place_id: string }) => {\n if (lastPlaceIdRef.current === item.place_id) return;\n lastPlaceIdRef.current = \"\";\n\n setIsLoading(true);\n\n getAutocompleteDetails({\r\n placeId: item.place_id, fields: [\"address_components\", \"formatted_address\", \"geometry.location\", \"utc_offset_minutes\"], callback: (place, status) => {\n lastPlaceIdRef.current = item.place_id;\n\n setIsLoading(false);\n setSuggestions([]); //to not show the list every time it receives focus\n\n if (status === google.maps.places.PlacesServiceStatus.OK && place) {\n if (onAddressFound) {\r\n onAddressFound({\r\n place: place,\r\n address: mapPlaceToAddress(place),\r\n suggestionDescription: item.value,\r\n position: place.geometry?.location ? { lat: place.geometry.location.lat(), lng: place.geometry.location.lng() } : undefined\r\n });\n }\n } else {\n refreshSessionToken();\n setApiError(status);\n if (onAPIError) onAPIError(status);\n }\n }\r\n });\n\n }, [getAutocompleteDetails, mapPlaceToAddress, onAPIError, onAddressFound, refreshSessionToken]);\n\n const handleOnItemSubmit = useCallback((item: AutocompleteItem & { place_id: string }) => {\n handleItemSelected(item);\n\n }, [handleItemSelected]);\n\n // MMC: Query if there is an initla value\n useEffect(() => {\n if (value) {\n setQuery(value);\r\n }\n }, []);\n\n //this makes the effect depends of debounce if not causes race conditions where sometimes the predictions are not updated when the user enters characters\n useEffect(() => {\n if (onChangeRef.current) onChangeRef.current(query);\n }, [query]);\n\n // MMC: update inputValue when value changes (sync)\n useEffect(() => {\n setInputValue(value || '');\n }, [value]);\n\n\n //TODO: Loading?\n useEffect(() => {\n\n if (!query) return;\n\n if (!query) {\n setSuggestions([]);\r\n return;\r\n }\n\n getAutocompletePredictions({\r\n searchText: query, restrictions: restrictions, callback: (predictions, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK) {\n if (predictions?.length) {\r\n setSuggestions(predictions.map(p => ({\n place_id: p.place_id,\n structuredFormatting: p.structured_formatting,\n value: p.description,\n icon: icon\n })));\n }\r\n }\n else {\n if (status !== google.maps.places.PlacesServiceStatus.NOT_FOUND && status !== google.maps.places.PlacesServiceStatus.ZERO_RESULTS) {\n setApiError(status);\r\n if (onAPIError) onAPIError(status);\r\n }\n }\n }\n });\n\n }, [getAutocompletePredictions, onAPIError, query, restrictions, icon]);\n\n\n return {\n userInputRef,\n attributionsRef,\n isLoading,\n handleOnUserInputChange,\n handleOnItemSubmit,\n suggestions,\n value: inputValue,\n apiError,\n };\n}","import { Autocomplete, AutocompleteProps, Box, Group, MantineColor, SelectItemProps, Text, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { forwardRef, ReactNode } from \"react\";\r\nimport { latLng } from \"../Core\";\r\nimport { AddressMappingRule, MappedAddressResult } from \"./Mapping.types\";\r\nimport { useGoogleAddressAutocomplete } from \"./useGoogleAddressAutocomplete\";\r\n\n\nexport interface AddressFoundResult {\r\n place: google.maps.places.PlaceResult,\r\n address?: MappedAddressResult,\r\n suggestionDescription?: string,\r\n position?: latLng\r\n}\r\n\nexport type GoogleAddressAutocompleteRestrictions = google.maps.places.ComponentRestrictions\nexport type OnAddressFoundCallback = (result: AddressFoundResult) => void\nexport type OnInputChangeCallback = (value: string) => void\n\nexport type GoogleAddressAutocompleteProps = Omit<AutocompleteProps, 'data'> & {\n restrictions?: GoogleAddressAutocompleteRestrictions,\n onAddressFound?: OnAddressFoundCallback,\n onAPIError?: (status: google.maps.places.PlacesServiceStatus) => void,\n mappingRules?: AddressMappingRule[],\n iconColor?: MantineColor,\n}\n\nexport const DefaultGoogleAddressAutocompleteProps: Partial<GoogleAddressAutocompleteProps> = {\n label: \"Address:\",\n placeholder: \"Start typing an address to see suggestions\",\n mappingRules: [],\n}\n\nexport function GoogleAddressAutocomplete(props: GoogleAddressAutocompleteProps) {\n props = useComponentDefaultProps('GoogleAddressAutocomplete', DefaultGoogleAddressAutocompleteProps, props);\n\n const {\n onAddressFound, restrictions, onChange, value, onAPIError, mappingRules, iconColor,\n ...rest } = props;\n\n const googleAddressAutocompleteAPI = useGoogleAddressAutocomplete({ onAddressFound, restrictions, onChange, value, onAPIError, mappingRules, iconColor });\n\n\n return <>\n <Box pos={\"relative\"}>\n <Autocomplete\n {...rest}\n ref={googleAddressAutocompleteAPI.userInputRef}\n onChange={googleAddressAutocompleteAPI.handleOnUserInputChange}\n onItemSubmit={googleAddressAutocompleteAPI.handleOnItemSubmit}\n itemComponent={AddressSuggestionItem}\n data={googleAddressAutocompleteAPI.suggestions}\n disabled={googleAddressAutocompleteAPI.isLoading}\n value={googleAddressAutocompleteAPI.value}\n // MMC: show all google prediction results\n filter={() => true}\n />\n <div ref={googleAddressAutocompleteAPI.attributionsRef}></div>\n </Box>\n </>\n}\n\ninterface AddressSuggestionItemProps extends SelectItemProps {\n structuredFormatting: google.maps.places.StructuredFormatting,\n place_id: string,\n icon: ReactNode\n}\n\nconst AddressSuggestionItem = forwardRef<HTMLDivElement, AddressSuggestionItemProps>(\n\n function AddressSuggestionItem({ structuredFormatting, icon, ...rest }: AddressSuggestionItemProps, ref) {\n return <div ref={ref} {...rest}>\n <Group noWrap>\n {icon}\n <div>\n <Text>{structuredFormatting.main_text}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {structuredFormatting.secondary_text}\n </Text>\n </div>\n </Group>\n </div>\n }\n);","\r\nexport interface GoogleMapZoomFeatureStyles {\r\n styleDefault?: google.maps.FeatureStyleOptions,\r\n styleClicked?: google.maps.FeatureStyleOptions,\r\n styleMouseMove?: google.maps.FeatureStyleOptions,\r\n}\r\n\r\nexport const GoogleMapLowZoomStyleDefaultProps: Partial<GoogleMapZoomFeatureStyles> = {\r\n styleDefault: {\r\n strokeColor: \"#73383e\",\r\n strokeOpacity: 0.1,\r\n strokeWeight: 2.0,\r\n fillColor: \"white\",\r\n fillOpacity: 0.1, // Polygons must be visible to be clickable\r\n },\r\n styleClicked: {\r\n strokeColor: \"#73383e\",\r\n strokeOpacity: 1.0,\r\n strokeWeight: 4.0,\r\n fillColor: \"#73383e\",\r\n fillOpacity: 0.5,\r\n },\r\n styleMouseMove: {\r\n strokeColor: \"#73383e\",\r\n strokeOpacity: 1.0,\r\n strokeWeight: 4.0,\r\n fillColor: \"white\",\r\n fillOpacity: 0.1,\r\n },\r\n};\r\n\r\nexport const GoogleMapMediumZoomStyleDefaultProps: Partial<GoogleMapZoomFeatureStyles> = {\r\n styleDefault: {\r\n strokeColor: \"#5d503f\",\r\n strokeOpacity: 0.1,\r\n strokeWeight: 2.0,\r\n fillColor: \"white\",\r\n fillOpacity: 0.1, // Polygons must be visible to be clickable\r\n },\r\n styleClicked: {\r\n strokeColor: \"#5d503f\",\r\n strokeOpacity: 1.0,\r\n strokeWeight: 4.0,\r\n fillColor: \"#5d503f\",\r\n fillOpacity: 0.5,\r\n },\r\n styleMouseMove: {\r\n strokeColor: \"#5d503f\",\r\n strokeOpacity: 1.0,\r\n strokeWeight: 4.0,\r\n fillColor: \"white\",\r\n fillOpacity: 0.1,\r\n },\r\n};\r\n\r\nexport const GoogleMapHighZoomStyleDefaultProps: Partial<GoogleMapZoomFeatureStyles> = {\r\n styleDefault: {\r\n strokeColor: \"#22333b\",\r\n strokeOpacity: 0.1,\r\n strokeWeight: 2.0,\r\n fillColor: \"white\",\r\n fillOpacity: 0.1, // Polygons must be visible to be clickable\r\n },\r\n styleClicked: {\r\n strokeColor: \"#22333b\",\r\n strokeOpacity: 1.0,\r\n strokeWeight: 4.0,\r\n fillColor: \"#22333b\",\r\n fillOpacity: 0.5,\r\n },\r\n styleMouseMove: {\r\n strokeColor: \"#22333b\",\r\n strokeOpacity: 1.0,\r\n strokeWeight: 4.0,\r\n fillColor: \"white\",\r\n fillOpacity: 0.1,\r\n },\r\n};\r\n\r\n\r\n","import { Dispatch, SetStateAction } from \"react\";\r\nimport { ValuesObject } from \"../../client\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI\";\r\nimport { GoogleMapHighZoomStyleDefaultProps, GoogleMapLowZoomStyleDefaultProps, GoogleMapMediumZoomStyleDefaultProps, GoogleMapZoomFeatureStyles } from \"./GoogleMapRegionsSelectorStyles\";\r\nimport { GoogleMapsErrorStatus } from \"./Mapping.types\";\r\n\r\n\r\nexport type GoogleMapZoomLevel = 'low' | 'medium' | 'high';\r\n\r\nexport interface GoogleMapZoomFeature {\r\n featureType: google.maps.FeatureType,\r\n zoom: number,\r\n styles: GoogleMapZoomFeatureStyles,\r\n zoomLevel: GoogleMapZoomLevel,\r\n}\r\n\r\nexport interface GoogleMapZoomFeatureTypeMap {\r\n low: GoogleMapZoomFeature,\r\n medium: GoogleMapZoomFeature,\r\n high: GoogleMapZoomFeature,\r\n}\r\n\r\nexport interface ISelectedRegionData {\r\n placeId: string;\r\n\r\n featureType?: google.maps.FeatureType;\r\n\r\n countryId?: string;\r\n countryName?: string,\r\n\r\n administrativeAreaLevel1Id?: string;\r\n administrativeAreaLevel1Name?: string;\r\n\r\n administrativeAreaLevel2Id?: string;\r\n administrativeAreaLevel2Name?: string;\r\n\r\n localityId?: string;\r\n localityName?: string;\r\n\r\n postalCode?: string;\r\n}\r\n\r\nexport type SelectedRegionData = ISelectedRegionData & ValuesObject\r\n\r\nexport interface IClickedRegionData {\r\n placeId: string;\r\n featureType?: google.maps.FeatureType;\r\n appliedStyle?: google.maps.FeatureStyleOptions\r\n}\r\n\r\nexport type ClickedRegionData = IClickedRegionData & ValuesObject\r\n\r\nexport interface GoogleMapRegionSelectorProps {\r\n googleMapsAPI: ReturnType<typeof useGoogleMapsAPI>,\r\n selectedRegions: Record<string, SelectedRegionData>,\r\n setSelectedRegions: Dispatch<SetStateAction<Record<string, SelectedRegionData>>>,\r\n clickedRegions: Record<string, ClickedRegionData>,\r\n setClickedRegions: Dispatch<SetStateAction<Record<string, ClickedRegionData>>>,\r\n featureTypeMap?: GoogleMapZoomFeatureTypeMap,\r\n onSelectionChanged?: (selectedRegions: Record<string, SelectedRegionData>) => void,\r\n onRegionClicked?: (placeId: string) => void,\r\n onRegionMouseMove?: (placeId: string) => void,\r\n onAPIError?: (status: GoogleMapsErrorStatus) => void,\r\n countries: string[],\r\n showOnlyCurrentLayerFeatures?: boolean,\r\n mapRestrictions?: google.maps.LatLngBoundsLiteral[],\r\n mapCenter?: google.maps.LatLngLiteral,\r\n maxRegions?: number,\r\n onMaxRegionsReached?: () => void,\r\n highlightOnMouseOver?: boolean,\r\n}\r\n\r\nexport const GoogleMapRegionSelectorDefaultProps: Partial<GoogleMapRegionSelectorProps> = {\r\n featureTypeMap: {\r\n // We use string constants here because we are using the Google Maps API and it will not be available until loaded\r\n low: { featureType: \"ADMINISTRATIVE_AREA_LEVEL_1\" as google.maps.FeatureType, zoom: 6, styles: GoogleMapLowZoomStyleDefaultProps, zoomLevel: 'low' },\r\n medium: {\r\n featureType: \"ADMINISTRATIVE_AREA_LEVEL_2\" as google.maps.FeatureType, zoom: 8, styles: GoogleMapMediumZoomStyleDefaultProps, zoomLevel: 'medium'\r\n },\r\n high: { featureType: \"POSTAL_CODE\" as google.maps.FeatureType, zoom: 11, styles: GoogleMapHighZoomStyleDefaultProps, zoomLevel: 'high' },\r\n },\r\n};\r\n\r\n","\nexport const isWithinRestrictions = (latLng: google.maps.LatLngLiteral, boundsRestrictions: google.maps.LatLngBoundsLiteral[]) => {\n return boundsRestrictions.some(boundsLiteral => {\n const bounds = new google.maps.LatLngBounds(\n new google.maps.LatLng(boundsLiteral.south, boundsLiteral.west),\n new google.maps.LatLng(boundsLiteral.north, boundsLiteral.east)\n );\n return bounds.contains(latLng);\n });\n};\n\nexport const findClosestCenter = (latLng: google.maps.LatLngLiteral, boundsRestrictions: google.maps.LatLngBoundsLiteral[], defaultCenter: google.maps.LatLngLiteral) => {\n let closestDistance = Infinity;\n let closestPoint = defaultCenter;\n\n boundsRestrictions.forEach(boundsLiteral => {\n const bounds = new google.maps.LatLngBounds(\n new google.maps.LatLng(boundsLiteral.south, boundsLiteral.west),\n new google.maps.LatLng(boundsLiteral.north, boundsLiteral.east)\n );\n\n if (bounds.contains(latLng)) {\n closestPoint = latLng;\n return;\n }\n\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n\n // Clamping latitude y longitude a los límites\n const lat = Math.max(sw.lat(), Math.min(latLng.lat, ne.lat()));\n const lng = Math.max(sw.lng(), Math.min(latLng.lng, ne.lng()));\n\n const clampedLatLng = new google.maps.LatLng(lat, lng);\n const distance = google.maps.geometry.spherical.computeDistanceBetween(latLng, clampedLatLng);\n\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPoint = clampedLatLng.toJSON();\n }\n });\n\n return closestPoint;\n}\n\nexport const panIfRestricted = (map: google.maps.Map, boundsRestrictions: google.maps.LatLngBoundsLiteral[], defaultCenter: google.maps.LatLngLiteral) => {\n const center = map.getCenter()?.toJSON() || defaultCenter;\n if (!center) return;\n if (!isWithinRestrictions(center, boundsRestrictions)) {\n const newCenter = findClosestCenter(center, boundsRestrictions, defaultCenter);\n map.panTo(newCenter);\n }\r\n}","import { createContext, RefObject, useContext } from \"react\";\r\n\r\nexport interface GoogleMapContextType {\r\n map: google.maps.Map | null,\r\n renderMarkers: () => React.ReactNode,\r\n setInfoWindowContent?: (content: React.ReactNode) => void,\r\n infoWindowRef: RefObject<google.maps.InfoWindow>,\r\n infoWindowContentRef?: RefObject<HTMLDivElement>,\r\n}\r\n\r\nexport const GoogleMapContext = createContext<GoogleMapContextType | null>(null);\r\n\r\nexport function useGoogleMap() {\r\n const context = useContext(GoogleMapContext);\r\n\r\n if (context === null) {\r\n throw new Error('useGoogleMap must be used within a GoogleMapContext provider');\r\n }\r\n\r\n return context;\r\n}","import { useComponentDefaultProps } from \"@mantine/core\";\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { useEvent } from \"../Core\";\r\nimport { panIfRestricted } from \"./functions\";\r\nimport { ClickedRegionData, GoogleMapRegionSelectorDefaultProps, GoogleMapRegionSelectorProps, GoogleMapZoomFeature, SelectedRegionData } from \"./GoogleMapRegionSelectorTypes\";\r\nimport { GoogleMapZoomFeatureStyles } from \"./GoogleMapRegionsSelectorStyles\";\r\nimport { GoogleMapsErrorStatus } from \"./Mapping.types\";\r\nimport { useGoogleMap } from \"./useGoogleMap\";\r\n\r\n\r\nexport function useGoogleMapRegionSelector(props: GoogleMapRegionSelectorProps) {\r\n const {\r\n featureTypeMap, onSelectionChanged,\r\n onRegionClicked, onRegionMouseMove, onAPIError, selectedRegions, setSelectedRegions, googleMapsAPI,\r\n countries, showOnlyCurrentLayerFeatures, clickedRegions, setClickedRegions, mapRestrictions, mapCenter,\r\n maxRegions, onMaxRegionsReached, highlightOnMouseOver\r\n } = useComponentDefaultProps(\"GoogleMapRegionSelector\", GoogleMapRegionSelectorDefaultProps, props);\r\n\r\n const { getPlaceDetails, placesReady } = googleMapsAPI;\r\n\r\n const { map } = useGoogleMap();\r\n\r\n const lastInteractedFeatureIdsRef = useRef<string[]>([]);\r\n const placeDetailsCache = useRef<Record<string, SelectedRegionData>>({});\r\n\r\n const [currentZoomFeature, setCurrentZoomFeature] = useState<GoogleMapZoomFeature>(featureTypeMap!.low);\r\n const [activeZoomFeatures, setActiveZoomFeatures] = useState<GoogleMapZoomFeature[]>([featureTypeMap!.low]);\r\n\r\n const stylesByZoomLevel = useMemo(() => ({\r\n low: featureTypeMap!.low.styles,\r\n medium: featureTypeMap!.medium.styles,\r\n high: featureTypeMap!.high.styles,\r\n }), [featureTypeMap]);\r\n\r\n const emptyStyle = useRef<google.maps.FeatureStyleOptions>({});\r\n\r\n const applyStyle = useEvent((params: google.maps.FeatureStyleFunctionOptions): google.maps.FeatureStyleOptions => {\r\n const feature = params.feature as google.maps.PlaceFeature;\r\n const place_id = feature.placeId;\r\n const featureType = feature.featureType as google.maps.FeatureType;\r\n const currentLevel = currentZoomFeature.zoomLevel;\r\n\r\n // Determine if the feature should be styled based on its featureType and the zoom level\r\n let styles: GoogleMapZoomFeatureStyles | undefined;\r\n\r\n if (currentLevel === 'low') {\r\n if (featureType === featureTypeMap!.low.featureType) {\r\n styles = stylesByZoomLevel['low'];\r\n }\r\n } else if (currentLevel === 'medium') {\r\n if (featureType === featureTypeMap!.low.featureType) {\r\n styles = stylesByZoomLevel['low'];\r\n } else if (featureType === featureTypeMap!.medium.featureType) {\r\n styles = stylesByZoomLevel['medium'];\r\n }\r\n } else if (currentLevel === 'high') {\r\n if (featureType === featureTypeMap!.low.featureType) {\r\n styles = stylesByZoomLevel['low'];\r\n } else if (featureType === featureTypeMap!.medium.featureType) {\r\n styles = stylesByZoomLevel['medium'];\r\n } else if (featureType === featureTypeMap!.high.featureType) {\r\n styles = stylesByZoomLevel['high'];\r\n }\r\n }\r\n\r\n // If no styles are found for the feature, return an empty style\r\n if (!styles) {\r\n return emptyStyle.current;\r\n }\r\n\r\n // Apply the appropriate style based on the feature's state\r\n if (!place_id) {\r\n return styles.styleDefault!;\r\n }\r\n\r\n if (clickedRegions[place_id]) {\r\n return styles.styleClicked!;\r\n }\r\n\r\n if (lastInteractedFeatureIdsRef.current.includes(place_id)) {\r\n return styles.styleMouseMove!;\r\n }\r\n\r\n return styles.styleDefault!;\r\n });\r\n\r\n\r\n const refreshStyles = useEvent(() => {\r\n if (!map || !featureTypeMap) return;\r\n\r\n if (!showOnlyCurrentLayerFeatures) {\r\n //console.log('refreshStyles showOnlyCurrentLayerFeatures false');\r\n const currentLevel = currentZoomFeature.zoomLevel;\r\n const lowLayer = map.getFeatureLayer(featureTypeMap.low.featureType);\r\n const mediumLayer = map.getFeatureLayer(featureTypeMap.medium.featureType);\r\n const highLayer = map.getFeatureLayer(featureTypeMap.high.featureType);\r\n\r\n // Disable levels below the current one\r\n if (currentLevel === \"low\") {\r\n if (mediumLayer !== null) mediumLayer.style = null;\r\n if (highLayer !== null) highLayer.style = null;\r\n\r\n }\r\n else if (currentLevel === \"medium\") {\r\n if (highLayer !== null) highLayer.style = null;\r\n }\r\n\r\n if (lowLayer) lowLayer.style = applyStyle;\r\n if (mediumLayer) mediumLayer.style = applyStyle;\r\n if (highLayer) highLayer.style = applyStyle;\r\n\r\n } else {\r\n //console.log('refreshStyles showOnlyCurrentLayerFeatures true');\r\n // Only show current layer\r\n const currentLayer = map.getFeatureLayer(currentZoomFeature.featureType);\r\n if (currentLayer) currentLayer.style = applyStyle;\r\n }\r\n });\r\n\r\n\r\n const selectFeature = useEvent((features: google.maps.PlaceFeature[]) => {\r\n if (!map) return;\r\n\r\n if (!placesReady) {\r\n if (onAPIError) {\r\n const errorStatus: GoogleMapsErrorStatus = { status: 'PLACES_API_NOT_READY', origin: \"Places\" };\r\n onAPIError(errorStatus);\r\n }\r\n return;\r\n }\r\n\r\n // Copy the current selection, we will use it to add the place_id or delete it from the selection\r\n const internal_clicked_places = { ...clickedRegions };\r\n\r\n // Current number of selected regions\r\n let currentSelectedCount = Object.keys(internal_clicked_places).length;\r\n\r\n // Track if maxRegions is exceeded\r\n let maxRegionsExceeded = false;\r\n\r\n for (const feature of features) {\r\n if (internal_clicked_places[feature.placeId]) {\r\n delete internal_clicked_places[feature.placeId];\r\n currentSelectedCount--;\r\n } else {\r\n if (currentSelectedCount >= maxRegions!) {\r\n maxRegionsExceeded = true;\r\n continue;\r\n }\r\n const clickedData: ClickedRegionData = { placeId: feature.placeId, featureType: feature.featureType };\r\n internal_clicked_places[feature.placeId] = clickedData;\r\n currentSelectedCount++;\r\n }\r\n }\r\n\r\n lastInteractedFeatureIdsRef.current = [];\r\n\r\n setClickedRegions(internal_clicked_places);\r\n\r\n if (onSelectionChanged) {\r\n onSelectionChanged(internal_clicked_places);\r\n }\r\n\r\n if (maxRegionsExceeded && onMaxRegionsReached) {\r\n onMaxRegionsReached();\r\n }\r\n\r\n });\r\n\r\n\r\n const handleClick = useEvent((e: google.maps.FeatureMouseEvent) => {\r\n if (!map) return;\r\n if (!e.features || e.features.length === 0) return;\r\n\r\n selectFeature(e.features as google.maps.PlaceFeature[]);\r\n\r\n if (onRegionClicked) {\r\n const placeId = (e.features[0] as google.maps.PlaceFeature).placeId;\r\n onRegionClicked(placeId);\r\n }\r\n\r\n });\r\n\r\n const highLightFeature = useEvent((placeIds: string[]) => {\r\n if (!map) return;\r\n\r\n lastInteractedFeatureIdsRef.current = placeIds;\r\n\r\n const featureType = currentZoomFeature?.featureType;\r\n const featureLayer = map.getFeatureLayer(featureType!);\r\n if (featureLayer) {\r\n featureLayer.style = null;\r\n featureLayer.style = applyStyle;\r\n }\r\n\r\n });\r\n\r\n\r\n // Mouse move over region\r\n const handleMouseMove = useEvent((e: google.maps.FeatureMouseEvent) => {\r\n if (!map) return;\r\n if (!e.features || e.features.length === 0) return;\r\n\r\n const placeIds = e.features.map((f) => (f as google.maps.PlaceFeature).placeId);\r\n\r\n const allPlaceIdsInLastInteracted = placeIds.every(id => lastInteractedFeatureIdsRef.current.includes(id));\r\n if (allPlaceIdsInLastInteracted) return;\r\n\r\n //console.log(\"Mouse move over placeIds:\", placeIds)\r\n highLightFeature(placeIds);\r\n\r\n if (onRegionMouseMove) {\r\n onRegionMouseMove(placeIds[0]);\r\n }\r\n\r\n });\r\n\r\n // replace infowindow click event\r\n useEffect(() => {\r\n if (!map) return;\r\n\r\n const clickListener = map.addListener(\"click\", (e: google.maps.IconMouseEvent) => {\r\n if (e.placeId) {\r\n e.stop();\r\n //console.log(\"Map click event\", e);\r\n }\r\n });\r\n\r\n return () => {\r\n clickListener.remove();\r\n };\r\n\r\n }, [map]);\r\n\r\n // Layers\r\n useEffect(() => {\r\n if (!map) return;\r\n\r\n const featureType = currentZoomFeature.featureType;\r\n\r\n if (showOnlyCurrentLayerFeatures) {\r\n // Disable all layers except the current one\r\n const allFeatureTypes = Object.values(featureTypeMap!);\r\n\r\n allFeatureTypes.forEach(ft => {\r\n if (ft.featureType === currentZoomFeature?.featureType) return;\r\n const layer = map.getFeatureLayer(ft.featureType);\r\n if (layer) {\r\n layer.style = null;\r\n }\r\n });\r\n }\r\n else {\r\n const currentLevel = currentZoomFeature.zoomLevel;\r\n const mediumLayer = map.getFeatureLayer(featureTypeMap!.medium.featureType);\r\n const highLayer = map.getFeatureLayer(featureTypeMap!.high.featureType);\r\n\r\n // Disable levels below the current one\r\n if (currentLevel === \"low\") {\r\n mediumLayer.style = null;\r\n highLayer.style = null;\r\n }\r\n else if (currentLevel === \"medium\") {\r\n highLayer.style = null;\r\n }\r\n\r\n }\r\n\r\n const featureLayer = map.getFeatureLayer(featureType!);\r\n if (featureLayer) {\r\n //console.log('useEffect layers apply style');\r\n featureLayer.style = applyStyle;\r\n\r\n const clickListener = featureLayer.addListener(\"click\", handleClick);\r\n const moveListener = highlightOnMouseOver ? featureLayer.addListener(\"mousemove\", handleMouseMove) : undefined;\r\n\r\n return () => {\r\n clickListener.remove();\r\n if (moveListener) moveListener.remove();\r\n };\r\n } else {\r\n console.warn(`Feature layer '${featureType}' not found.`);\r\n }\r\n\r\n }, [applyStyle, currentZoomFeature.featureType, currentZoomFeature.zoomLevel, featureTypeMap, handleClick, handleMouseMove, highlightOnMouseOver, map, showOnlyCurrentLayerFeatures]);\r\n\r\n // fit to bounds\r\n useEffect(() => {\r\n if (!map || !mapRestrictions) return;\r\n\r\n const dragListener = map.addListener('dragend', () => {\r\n panIfRestricted(map, mapRestrictions, mapCenter!)\r\n });\r\n\r\n const zoomListener = map.addListener('zoom_changed', () => {\r\n panIfRestricted(map, mapRestrictions, mapCenter!)\r\n });\r\n\r\n return (\r\n () => {\r\n dragListener.remove();\r\n zoomListener.remove();\r\n }\r\n )\r\n\r\n }, [map, mapCenter, mapRestrictions]);\r\n\r\n // Zoom\r\n useEffect(() => {\r\n if (!map) return;\r\n\r\n const handleZoomChange = () => {\r\n const zoom = map.getZoom();\r\n\r\n if (zoom === undefined || featureTypeMap === undefined) return;\r\n let newFeatureType: GoogleMapZoomFeature;\r\n\r\n if (zoom <= featureTypeMap.low.zoom) {\r\n newFeatureType = featureTypeMap.low;\r\n setActiveZoomFeatures([featureTypeMap.low]);\r\n } else if (zoom > featureTypeMap.low.zoom && zoom <= featureTypeMap.medium.zoom) {\r\n newFeatureType = featureTypeMap.medium;\r\n if (showOnlyCurrentLayerFeatures) {\r\n setActiveZoomFeatures([featureTypeMap.medium]);\r\n }\r\n else {\r\n setActiveZoomFeatures([featureTypeMap.low, featureTypeMap.medium]);\r\n }\r\n } else {\r\n newFeatureType = featureTypeMap.high;\r\n if (showOnlyCurrentLayerFeatures) {\r\n setActiveZoomFeatures([featureTypeMap.high]);\r\n }\r\n else {\r\n setActiveZoomFeatures([featureTypeMap.low, featureTypeMap.medium, featureTypeMap.high]);\r\n }\r\n }\r\n\r\n setCurrentZoomFeature(newFeatureType);\r\n };\r\n\r\n const zoomListener = map.addListener(\"zoom_changed\", handleZoomChange);\r\n\r\n // Initialize zoom level\r\n handleZoomChange();\r\n\r\n return () => {\r\n zoomListener.remove();\r\n //google.maps.event.removeListener(zoomListener);\r\n };\r\n }, [featureTypeMap, map, setActiveZoomFeatures, setCurrentZoomFeature, showOnlyCurrentLayerFeatures]);\r\n\r\n\r\n\r\n // Get place details\r\n const updateSequence = useRef(0);\r\n useEffect(() => {\r\n const currentPlaceEntries = Object.entries(clickedRegions);\r\n const existingPlaceData = Object.entries(selectedRegions);\r\n\r\n const existingPlaceMap = new Map(existingPlaceData);\r\n\r\n const newPlaceEntries = currentPlaceEntries.filter(([id, regionData]) => !existingPlaceMap.has(id));\r\n\r\n const currentPlaceMap = new Map(currentPlaceEntries);\r\n\r\n const removedPlaceEntries = existingPlaceData.filter(([id, selectedData]) => !currentPlaceMap.has(id));\r\n\r\n if (removedPlaceEntries.length > 0) {\r\n //console.log(\"Removing place details for placeIds:\", removedPlaceEntries.map(([id]) => id));\r\n setSelectedRegions(prevDetails => {\r\n const updatedDetails = { ...prevDetails };\r\n removedPlaceEntries.forEach(([id]) => {\r\n delete updatedDetails[id];\r\n });\r\n return updatedDetails;\r\n });\r\n }\r\n\r\n const sequence = ++updateSequence.current;\r\n\r\n newPlaceEntries.forEach(([placeId, clickedData]) => {\r\n const cachedDetails = placeDetailsCache.current[placeId];\r\n\r\n if (cachedDetails) {\r\n //console.log(\"Using cached details for place_id:\", place_id);\r\n setSelectedRegions((prev) => {\r\n const updated_selection = { ...prev };\r\n updated_selection[placeId] = cachedDetails;\r\n return updated_selection;\r\n });\r\n }\r\n else {\r\n //console.log(\"Fetching place details for place_id:\", place_id)\r\n getPlaceDetails(\r\n {\r\n placeId: placeId,\r\n fields: ['address_components'],\r\n }\r\n ).then(place => {\r\n if (sequence === updateSequence.current) {\r\n const addressComponents = place.address_components || [];\r\n const countryComponent = addressComponents.find(comp => comp.types.includes('country'));\r\n const adminLevel1Component = addressComponents.find(comp => comp.types.includes('administrative_area_level_1'));\r\n const adminLevel2Component = addressComponents.find(comp => comp.types.includes('administrative_area_level_2'));\r\n const postalCodeComponent = addressComponents.find(comp => comp.types.includes('postal_code'));\r\n const localityComponent = addressComponents.find(comp => comp.types.includes('locality'));\r\n\r\n if (countries && countryComponent && !countries.includes(countryComponent.short_name!)) {\r\n //console.log(\"Country not in list of allowed countries:\", countryComponent.short_name);\r\n setSelectedRegions((prev) => {\r\n const updated_selection = { ...prev };\r\n delete updated_selection[placeId];\r\n return updated_selection;\r\n });\r\n setClickedRegions((prev) => {\r\n const updated_selection = { ...prev };\r\n delete updated_selection[placeId];\r\n return updated_selection;\r\n });\r\n }\r\n else {\r\n //console.log(\"Place details fetched for place_id:\", place_id);\r\n placeDetailsCache.current[placeId] = {\r\n placeId: placeId,\r\n featureType: clickedData.featureType,\r\n\r\n countryId: countryComponent?.short_name,\r\n countryName: countryComponent?.long_name,\r\n\r\n administrativeAreaLevel1Name: adminLevel1Component?.long_name,\r\n administrativeAreaLevel1Id: adminLevel1Component?.short_name,\r\n\r\n administrativeAreaLevel2Name: adminLevel2Component?.long_name,\r\n administrativeAreaLevel2Id: adminLevel2Component?.short_name,\r\n\r\n localityId: localityComponent?.short_name,\r\n localityName: localityComponent?.long_name,\r\n\r\n postalCode: postalCodeComponent?.short_name,\r\n } as SelectedRegionData;\r\n\r\n setSelectedRegions((prev) => {\r\n // Update the selected region with addressComponents.\r\n const updated_selection = { ...prev };\r\n const new_region_data: SelectedRegionData = {\r\n placeId: placeId,\r\n featureType: clickedData.featureType,\r\n countryId: countryComponent?.short_name,\r\n countryName: countryComponent?.long_name,\r\n administrativeAreaLevel1Name: adminLevel1Component?.long_name,\r\n administrativeAreaLevel1Id: adminLevel1Component?.short_name,\r\n administrativeAreaLevel2Name: adminLevel2Component?.long_name,\r\n administrativeAreaLevel2Id: adminLevel2Component?.short_name,\r\n localityId: localityComponent?.short_name,\r\n localityName: localityComponent?.long_name,\r\n postalCode: postalCodeComponent?.short_name,\r\n } as SelectedRegionData;\r\n\r\n updated_selection[placeId] = new_region_data;\r\n\r\n return updated_selection;\r\n });\r\n }\r\n }\r\n }).catch(error => {\r\n console.error(\"Error fetching place details:\", error);\r\n\r\n if (onAPIError) {\r\n const errorStatus: GoogleMapsErrorStatus = { status: 'APIERROR', origin: \"Places\" };\r\n if (onAPIError) onAPIError(errorStatus);\r\n }\r\n });\r\n }\r\n });\r\n\r\n\r\n }, [clickedRegions, countries, getPlaceDetails, onAPIError, selectedRegions, setClickedRegions, setSelectedRegions]);\r\n\r\n // apply styles on state change\r\n useEffect(() => {\r\n if (!map) return;\r\n\r\n const featureType = currentZoomFeature?.featureType;\r\n const featureLayer = map.getFeatureLayer(featureType!);\r\n if (featureLayer) {\r\n featureLayer.style = null;\r\n featureLayer.style = applyStyle;\r\n }\r\n\r\n }, [clickedRegions]);\r\n\r\n return {\r\n applyStyle,\r\n selectFeature,\r\n highLightFeature,\r\n currentZoomFeature,\r\n setCurrentZoomFeature,\r\n map,\r\n handleClick,\r\n handleMouseMove,\r\n activeZoomFeatures,\r\n setActiveZoomFeatures,\r\n refreshStyles\r\n }\r\n\r\n}\r\n\r\n","import { useComponentDefaultProps } from \"@mantine/core\";\r\nimport { GoogleMapRegionSelectorDefaultProps, GoogleMapRegionSelectorProps } from \"./GoogleMapRegionSelectorTypes\";\r\nimport { useGoogleMapRegionSelector } from \"./useGoogleMapRegionSelector\";\r\n\r\n\r\n\r\nexport function GoogleMapRegionSelector(props: GoogleMapRegionSelectorProps) {\r\n const mergedProps = useComponentDefaultProps(\"GoogleMapRegionSelector\", GoogleMapRegionSelectorDefaultProps, props);\r\n\r\n useGoogleMapRegionSelector(mergedProps);\r\n\r\n return null; // Not a visual React component\r\n}\r\n","import { useComponentDefaultProps } from \"@mantine/core\";\r\nimport { ReactNode, useEffect, useRef } from \"react\";\r\nimport { useGoogleMap } from \"./useGoogleMap\";\r\n\r\n\r\nexport type MarkerOptions = Omit<google.maps.MarkerOptions, \"map\">\r\n\r\nexport type OnDragEndCallback = (position: google.maps.LatLng) => void\r\n\r\nexport interface MarkerProps {\r\n markerOptions: MarkerOptions,\r\n onDragEnd?: OnDragEndCallback,\r\n onMarkerClick?: (infoWindow: google.maps.InfoWindow) => ReactNode,\r\n group?: string,\r\n dataSetId?: string,\r\n recordIndex?: number,\r\n selectedOrder?: number,\r\n selectedMarkerOptions?: MarkerOptions,\r\n isMapCenter?: boolean,\r\n}\r\n\r\nexport const MarkerPropsDefault: Partial<MarkerProps> = {\r\n dataSetId: \"default\",\r\n}\r\n\r\n\r\nexport function GoogleMarker(props: MarkerProps) {\r\n const { markerOptions, onDragEnd, onMarkerClick } = useComponentDefaultProps('GoogleMarker', MarkerPropsDefault, props);\r\n\r\n const { map, infoWindowContentRef, infoWindowRef, setInfoWindowContent } = useGoogleMap();\r\n const markerRef = useRef<google.maps.Marker | null>(null);\r\n\r\n useEffect(() => {\r\n if (map && !markerRef.current) {\r\n markerRef.current = new google.maps.Marker({ ...markerOptions, map });\r\n }\r\n }, [map, markerOptions]);\r\n\r\n useEffect(() => {\r\n if (markerRef.current) {\r\n markerRef.current.setOptions(markerOptions);\r\n }\r\n }, [markerOptions]);\r\n\r\n useEffect(() => {\r\n if (!map) return;\r\n const listener = onDragEnd && markerRef.current?.addListener(\"dragend\", () => {\r\n const pos = markerRef.current!.getPosition();\r\n if (pos) {\r\n onDragEnd!(pos);\r\n }\r\n });\r\n return () => {\r\n if (listener) {\r\n google.maps.event.removeListener(listener);\r\n }\r\n };\r\n }, [map, onDragEnd]);\r\n\r\n // InfoWindow\r\n useEffect(() => {\r\n if (!map || !infoWindowContentRef?.current || !setInfoWindowContent) return;\r\n const listener = onMarkerClick && markerRef.current?.addListener(\"click\", () => {\r\n const content = onMarkerClick!(infoWindowRef.current!);\r\n if (content) {\r\n setInfoWindowContent(content);\r\n infoWindowRef.current!.setContent(infoWindowContentRef.current);\r\n infoWindowRef.current!.open(map, markerRef.current);\r\n }\r\n });\r\n return () => {\r\n if (listener) {\r\n google.maps.event.removeListener(listener);\r\n }\r\n };\r\n }, [infoWindowContentRef, infoWindowRef, map, onMarkerClick, setInfoWindowContent]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (markerRef.current) {\r\n google.maps.event.clearInstanceListeners(markerRef.current);\r\n markerRef.current.setMap(null);\r\n markerRef.current.unbindAll();\r\n markerRef.current = null;\r\n }\r\n }\r\n }, []);\r\n\r\n return undefined;\r\n}\r\n","import { Children, isValidElement, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { GoogleMapProps } from \"./GoogleMap\";\r\nimport { GoogleMapRegionSelector } from \"./GoogleMapRegionSelector\";\r\nimport { GoogleMarker } from \"./GoogleMarker\";\r\n\nexport function useCreateGoogleMap({ mapOptions, children, setInfoWindowContent, infoWindowContentRef }: GoogleMapProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [map, setMap] = useState<google.maps.Map | null>(null);\n\n const infoWindowRef = useRef<google.maps.InfoWindow>(new google.maps.InfoWindow());\n\n useEffect(() => {\n if (map === null) {\n if (!containerRef.current) throw new Error(\"Container required.\");\n\n if (mapOptions && mapOptions.center && (!mapOptions.center.lat || !mapOptions.center.lng)) { mapOptions.center = undefined; }\n\n const initMap = new google.maps.Map(containerRef.current, mapOptions);\n setMap(initMap);\n }\n }, [map, mapOptions]);\n\n useEffect(() => {\n if (mapOptions && mapOptions.center && (!mapOptions.center.lat || !mapOptions.center.lng)) { mapOptions.center = undefined; }\n\n if (map) map.setOptions(mapOptions);\n }, [map, mapOptions]);\n\n useEffect(() => {\n return () => {\n if (map !== null) {\n google.maps.event.clearInstanceListeners(map);\n map.unbindAll();\n }\n }\n }, [map]);\n\n const renderMarkers = useCallback(() => {\n if (map === null) {\n return null;\r\n }\n Children.forEach(children, child => {\n if (!isValidElement(child) || (child.type !== GoogleMarker && child.type !== GoogleMapRegionSelector)) {\n throw new Error(\"Invalid children component.\");\n }\n });\n return children;\n\n }, [children, map]);\n\n const mapContext = useMemo(() => ({\n map,\n renderMarkers,\n infoWindowRef,\n infoWindowContentRef,\n setInfoWindowContent\n }), [infoWindowContentRef, map, renderMarkers, setInfoWindowContent]);\n\n const returnObject = useMemo(() => ({\n containerRef,\n mapContext\n }), [containerRef, mapContext]);\n\n return returnObject;\n}","import { DefaultProps, Paper, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { Dispatch, PropsWithChildren, ReactNode, RefObject, SetStateAction } from \"react\";\r\nimport { MapOptions } from \"./Mapping.types\";\r\nimport { useCreateGoogleMap } from \"./useCreateGoogleMap\";\r\nimport { GoogleMapContext } from \"./useGoogleMap\";\r\n\r\nexport type GoogleMapProps = DefaultProps & PropsWithChildren<{\r\n mapOptions: MapOptions,\r\n infoWindowContentRef?: RefObject<HTMLDivElement>,\r\n setInfoWindowContent?: Dispatch<SetStateAction<ReactNode>>\r\n}>\r\n\r\nexport const DefaultMapProps: Partial<GoogleMapProps> = {\r\n\r\n}\r\n\r\nexport function GoogleMap(props: GoogleMapProps) {\r\n props = useComponentDefaultProps('GoogleMap', DefaultMapProps, props);\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { mapOptions, children, infoWindowContentRef, setInfoWindowContent, ...rest } = props;\r\n\r\n const { containerRef, mapContext } = useCreateGoogleMap(props);\r\n\r\n const { renderMarkers } = mapContext;\r\n\r\n return (\r\n <>\r\n <Paper style={{ borderRadius: \"unset\" }} ref={containerRef} {...rest}>\r\n <GoogleMapContext.Provider value={mapContext}>\r\n {renderMarkers()}\r\n </GoogleMapContext.Provider>\r\n </Paper>\r\n </>\r\n );\r\n}\r\n\r\n","import { latLng } from \"../Core/types\";\r\n\r\nexport const DEFAULT_MAP_CENTER: latLng = { lat: -34.603683, lng: -58.381557 };\r\n\r\n\r\nexport type GoogleMapsAddressComponentType =\r\n | 'street_address' | 'route' | 'intersection' | 'political' | 'country' | 'administrative_area_level_1' | 'administrative_area_level_2'\r\n | 'administrative_area_level_3' | 'administrative_area_level_4' | 'administrative_area_level_5' | 'administrative_area_level_6' | 'administrative_area_level_7'\r\n | 'colloquial_area' | 'locality' | 'sublocality' | 'sublocality_level_1' | 'sublocality_level_2' | 'sublocality_level_3'\r\n | 'sublocality_level_4' | 'sublocality_level_5' | 'neighborhood' | 'premise' | 'subpremise' | 'plus_code' | 'postal_code'\r\n | 'natural_feature' | 'airport' | 'park' | 'point_of_interest' | 'floor' | 'establishment' | 'landmark' | 'parking' | 'post_box'\r\n | 'postal_town' | 'room' | 'street_number' | 'bus_station' | 'train_station' | 'transit_station';\r\n\r\nexport type AddressComponentValue = { long_name?: string, short_name?: string }\r\n\r\n// MMC: this is the result of the google maps api converted to be processed by the address mapping rules\r\nexport type AddressComponentResult = Partial<Record<GoogleMapsAddressComponentType, AddressComponentValue>>;\r\n\r\nexport type MappingAddressType = 'address' | 'postal_code' | 'state_province' | 'city' | 'country' | 'county' | 'unknown';\r\n\r\n// MMC: this is the result of the address mapping rules applied to the google maps api result\r\nexport interface MappedAddressResult {\r\n street?: string,\r\n streetNumber?: string,\r\n apartment?: string,\r\n floor?: string,\r\n country?: string,\r\n countryCode?: string,\r\n province?: string,\r\n provinceCode?: string,\r\n city?: string,\r\n cityCode?: string,\r\n\r\n // county\r\n department?: string,\r\n departmentCode?: string,\r\n\r\n postalCode?: string,\r\n mappedAddressType?: MappingAddressType;\r\n}\r\n\r\nexport const AddressSearchDefaultZoomLevels: Record<MappingAddressType, number> = {\r\n address: 17,\r\n postal_code: 14,\r\n city: 12,\r\n state_province: 6,\r\n country: 4,\r\n county: 12,\r\n unknown: 12\r\n}\r\n\r\n\r\nexport type GoogleAddressMappingRecord = Partial<Record<GoogleMapsAddressComponentType, keyof AddressComponentValue>>;\r\n\r\nexport type GoogleMapsMappingRules = Partial<Record<keyof Omit<MappedAddressResult, 'mappedAddressType'>, GoogleAddressMappingRecord[]>>;\r\n\r\nexport interface AddressMappingRule {\r\n conditions: AddressComponentResult,\r\n mapping: GoogleMapsMappingRules,\r\n dontApplyDefaultMappings?: boolean\r\n}\r\n\r\nexport type DefaultAddressMappingType = Record<keyof Omit<MappedAddressResult, 'mappedAddressType'>, GoogleAddressMappingRecord[]>;\r\n\r\nexport interface GoogleMapsErrorStatus {\r\n origin?: string,\r\n status?: string,\r\n}\r\n\r\nexport interface PlacesOperationResult {\r\n status?: string,\r\n result?: google.maps.places.PlaceResult,\r\n mapped?: MappedAddressResult\r\n}\r\nexport interface GeocodeOperationResult {\r\n status?: string,\r\n result?: google.maps.GeocoderResult\r\n}\r\n\r\nexport type MapOptions = google.maps.MapOptions\r\n","import { useCallback, useRef } from \"react\";\r\nimport { AddressMappingRule } from \"./Mapping.types\";\r\n\r\nexport function useGoogleAddressMappingRules() {\r\n const mappingRules = useRef<AddressMappingRule[]>([]);\r\n\r\n const addMappingRule = useCallback((rules: AddressMappingRule[]): void => {\r\n for (const newRule of rules) {\r\n mappingRules.current.push(newRule);\r\n }\r\n // Sorting could potentially be optimized if performance becomes an issue\r\n mappingRules.current.sort((a, b) => Object.keys(b.conditions).length - Object.keys(a.conditions).length);\r\n }, []);\r\n\r\n\r\n const clearMappingRules = useCallback(() => {\r\n mappingRules.current = [];\r\n }, []);\r\n\r\n return {\r\n mappingRules: mappingRules.current,\r\n addMappingRule,\r\n clearMappingRules\r\n }\r\n\r\n}","import { createPortal } from \"react-dom\";\r\n\r\nexport interface InfoWindowPortalProps {\r\n container: Element | DocumentFragment,\r\n children: React.ReactNode,\r\n}\r\n\r\nexport function InfoWindowPortal({ children, container }: InfoWindowPortalProps) {\r\n return createPortal(children, container);\r\n}","import { InfoWindowPortal } from \"./InfoWindowPortal\";\r\n\r\nexport interface GoogleMapsInfoWindowProps {\r\n container: Element | DocumentFragment,\r\n infoWindowContent: React.ReactNode\r\n}\r\n\r\nexport function GoogleMapsInfoWindow({ container, infoWindowContent }: GoogleMapsInfoWindowProps) {\r\n\r\n return (\r\n <InfoWindowPortal container={container}>\r\n {infoWindowContent}\r\n </InfoWindowPortal>\r\n )\r\n}","import { Cluster, ClusterStats, Marker } from \"@googlemaps/markerclusterer\";\r\nimport { useCallback } from \"react\";\r\n\r\n\r\nexport function useDefaultClusterRenderer(groupOfLabel?: string, locationsLabel?: string) {\r\n\r\n //const { interpolateColor } = useColorTools();\r\n\r\n const defalutRenderer = useCallback((cluster: Cluster, stats: ClusterStats, map: google.maps.Map) => {\r\n const { count, position } = cluster;\r\n\r\n const color = \"#000080\";\r\n\r\n // create svg literal with fill color\r\n const svg = `<svg fill=\"${color}\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 240\" width=\"50\" height=\"50\">\r\n<circle cx=\"120\" cy=\"120\" opacity=\".6\" r=\"70\" />\r\n<text x=\"50%\" y=\"50%\" style=\"fill:#fff\" text-anchor=\"middle\" font-size=\"50\" dominant-baseline=\"middle\" font-family=\"roboto,arial,sans-serif\">${count}</text>\r\n</svg>`;\r\n const title = `${groupOfLabel ? (`${groupOfLabel} `) : ''}${count}${locationsLabel ? (` ${locationsLabel}`) : ''}`,\r\n // adjust zIndex to be above other markers\r\n zIndex = Number(google.maps.Marker.MAX_ZINDEX) + count;\r\n\r\n const clusterOptions = {\r\n position,\r\n zIndex,\r\n title,\r\n icon: {\r\n url: `data:image/svg+xml;base64,${btoa(svg)}`,\r\n anchor: new google.maps.Point(25, 25),\r\n },\r\n };\r\n\r\n return new google.maps.Marker(clusterOptions) as Marker;\r\n\r\n }, [groupOfLabel, locationsLabel]);\r\n\r\n return {\r\n render: defalutRenderer\r\n }\r\n}","import { MarkerClusterer } from \"@googlemaps/markerclusterer\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { useDefaultClusterRenderer } from \"../DataMap/useDefaultClusterRenderer\";\r\nimport { GoogleMapClusterProps, MapClusterOptions } from \"./GoogleMapCluster\";\r\n\r\nexport function useCreateGoogleMapCluster({\r\n mapOptions, InitialMarkerClustererOptions, setInfoWindowContent, infoWindowContentRef, labels, markers, selectedMarkers\r\n}: GoogleMapClusterProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n // Autopan in false is beacuse the infowindow when clicked moves the map_ctx and the markerProps gets re-rendered and closes it\r\n const infoWindowRef = useRef<google.maps.InfoWindow>(new google.maps.InfoWindow({ disableAutoPan: false, headerDisabled: true }));\r\n\r\n const [map, setMap] = useState<google.maps.Map | null>(null);\r\n const [markerClusterer, setMarkerClusterer] = useState<MarkerClusterer | null>(null);\r\n\r\n const markersRef = useRef<google.maps.Marker[]>([]);\r\n const currentMarkersRef = useRef<google.maps.Marker[]>([]);\r\n\r\n // Default Cluster Renderer\r\n const defaultRenderer = useDefaultClusterRenderer(labels?.groupOfLabel, labels?.locationsLabel);\r\n\r\n const currentMarkerClustererOptions = useMemo<MapClusterOptions | undefined>(() => {\r\n const defaultOptions: MapClusterOptions = {\r\n algorithmOptions: { maxZoom: 15 },\r\n renderer: defaultRenderer\r\n }\r\n return { ...defaultOptions, ...InitialMarkerClustererOptions };\r\n }, [defaultRenderer]);\r\n\r\n // Map creation\r\n useEffect(() => {\r\n if (map === null && containerRef.current) {\r\n if (mapOptions && mapOptions.center && (!mapOptions.center.lat || !mapOptions.center.lng)) { mapOptions.center = undefined; }\r\n\r\n const initMap = new google.maps.Map(containerRef.current, mapOptions);\r\n setMap(initMap);\r\n }\r\n }, [map, containerRef]);\r\n\r\n // Map options update\r\n useEffect(() => {\r\n if (mapOptions && mapOptions.center && (!mapOptions.center.lat || !mapOptions.center.lng)) { mapOptions.center = undefined; }\r\n\r\n if (map) map.setOptions(mapOptions);\r\n }, [map, mapOptions]);\r\n\r\n // MarkerClusterer creation\r\n useEffect(() => {\r\n if (map !== null && markerClusterer === null) {\r\n //console.log(\"Creating MarkerClusterer\")\r\n const clusterer = new MarkerClusterer({ map, ...currentMarkerClustererOptions });\r\n setMarkerClusterer(clusterer);\r\n\r\n return () => {\r\n if (clusterer) {\r\n //console.log(\"Clearing MarkerClusterer\")\r\n clusterer.clearMarkers(true);\r\n }\r\n }\r\n\r\n }\r\n }, [currentMarkerClustererOptions, map, markerClusterer]);\r\n\r\n // Refresh markers\r\n const refreshMarkers = useCallback(() => {\r\n if (markerClusterer !== null && map !== null) {\r\n // get current markers that are visible in the map_ctx\r\n const bounds = map.getBounds();\r\n //console.log(\"DataMap Bounds\", bounds);\r\n\r\n // Filter markers that are visible in the map_ctx\r\n currentMarkersRef.current = markersRef.current.filter(currentMarker => {\r\n const pos = currentMarker.getPosition();\r\n return (bounds && pos && bounds.contains(pos));\r\n });\r\n //console.log(\"DataMap Visible Markers\", currentMarkersRef.current.length);\r\n\r\n // Clear and add markers to cluster\r\n markerClusterer.clearMarkers(true);\r\n markerClusterer.addMarkers(currentMarkersRef.current);\r\n }\r\n }, [map, markerClusterer]);\r\n\r\n // Create markers\r\n useEffect(() => {\r\n if (!markers) return;\r\n\r\n markersRef.current = [];\r\n\r\n for (let i = 0; i < markers.length; i++) {\r\n const markerProps = markers[i];\r\n\r\n let marker: google.maps.Marker;\r\n const selectedMarker = markerProps.recordIndex !== undefined ? selectedMarkers[markerProps.dataSetId || '']?.[markerProps.recordIndex] : undefined;\r\n if (markerProps.recordIndex !== undefined && selectedMarker && selectedMarker.dataSetId === markerProps.dataSetId && markerProps.selectedMarkerOptions) {\r\n marker = new google.maps.Marker({ ...selectedMarker.selectedMarkerOptions });\r\n } else {\r\n marker = new google.maps.Marker({ ...markerProps.markerOptions });\r\n }\r\n\r\n if (infoWindowContentRef?.current && setInfoWindowContent && markerProps.onMarkerClick) {\r\n marker.addListener(\"click\", () => {\r\n const content = markerProps.onMarkerClick!(infoWindowRef.current);\r\n if (content) {\r\n setInfoWindowContent(content);\r\n setTimeout(() => {\r\n infoWindowRef.current.setContent(infoWindowContentRef.current);\r\n infoWindowRef.current.open({ anchor: marker, map });\r\n });\r\n }\r\n });\r\n }\r\n\r\n markersRef.current.push(marker);\r\n }\r\n\r\n infoWindowRef.current.close();\r\n refreshMarkers();\r\n\r\n }, [infoWindowContentRef, map, markers, refreshMarkers, selectedMarkers, setInfoWindowContent]);\r\n\r\n // Map tilesLoaded event, render in cluster manager\r\n useEffect(() => {\r\n if (map !== null && markerClusterer !== null) {\r\n const listener = map.addListener(\"idle\", () => {\r\n refreshMarkers();\r\n });\r\n return () => {\r\n google.maps.event.removeListener(listener);\r\n }\r\n }\r\n }, [map, markerClusterer, refreshMarkers]);\r\n\r\n const mapContext = useMemo(() => ({\r\n map,\r\n renderMarkers: () => { throw new Error(\"Map cluster doesn't support renderMarkers.\") },\r\n infoWindowRef,\r\n infoWindowContentRef,\r\n setInfoWindowContent\r\n }), [infoWindowContentRef, map, setInfoWindowContent]);\r\n\r\n const returnObject = useMemo(() => ({\r\n containerRef,\r\n mapContext\r\n }), [containerRef, mapContext]);\r\n\r\n return returnObject;\r\n}","import { MarkerClustererOptions } from \"@googlemaps/markerclusterer\";\r\nimport { DefaultProps, Paper, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { Dispatch, PropsWithChildren, ReactNode, RefObject, SetStateAction } from \"react\";\r\nimport { MarkerProps } from \"./GoogleMarker\";\r\nimport { MapOptions } from \"./Mapping.types\";\r\nimport { useCreateGoogleMapCluster } from \"./useCreateGoogleMapCluster\";\r\nimport { GoogleMapContext } from \"./useGoogleMap\";\r\n\r\n\r\nexport interface MapClusterOptions extends Omit<MarkerClustererOptions, 'map' | 'markers'> { }\r\n\r\nexport type SelectedMarkerProps = Record<string, Record<number, MarkerProps>>\r\n\r\nexport type GoogleMapClusterProps = DefaultProps & PropsWithChildren<{\r\n mapOptions: MapOptions,\r\n InitialMarkerClustererOptions?: MapClusterOptions,\r\n infoWindowContentRef?: RefObject<HTMLDivElement>,\r\n setInfoWindowContent?: Dispatch<SetStateAction<ReactNode>>,\r\n markers?: MarkerProps[],\r\n labels?: {\r\n groupOfLabel?: string,\r\n locationsLabel?: string,\r\n },\r\n selectedMarkers: SelectedMarkerProps,\r\n}>\r\n\r\nexport const DefaultMapClusterProps: Partial<GoogleMapClusterProps> = {\r\n labels: {\r\n groupOfLabel: 'Group of',\r\n locationsLabel: 'locations',\r\n },\r\n}\r\n\r\nexport function GoogleMapCluster(props: GoogleMapClusterProps) {\r\n props = useComponentDefaultProps('GoogleMapCluster', DefaultMapClusterProps, props);\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { mapOptions, InitialMarkerClustererOptions, children, infoWindowContentRef, setInfoWindowContent, markers, labels, selectedMarkers, ...rest } = props;\r\n\r\n const { containerRef, mapContext } = useCreateGoogleMapCluster(props);\r\n\r\n return (\r\n <>\r\n <Paper style={{ borderRadius: \"unset\" }} ref={containerRef} {...rest}>\r\n <GoogleMapContext.Provider value={mapContext}>\r\n </GoogleMapContext.Provider>\r\n </Paper>\r\n </>\r\n );\r\n}\r\n\r\n","import { GoogleMapsAPILoaderConfig } from \"../../GoogleMapsAPI\";\r\n\r\nexport function getGoogleMapsStreetViewImage(location: google.maps.LatLng | google.maps.LatLngLiteral, width: number = 350, height: number = 200, fov: number = 90) {\r\n\r\n const streetViewUrl = `https://maps.googleapis.com/maps/api/streetview?size=${width}x${height}&location=${location.lat},${location.lng}&fov=${fov}&key=${GoogleMapsAPILoaderConfig.apiKey}`;\r\n return streetViewUrl;\r\n\r\n}","import { Skeleton } from \"@mantine/core\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI\";\r\nimport { GoogleMap, GoogleMapProps } from \"./GoogleMap\";\r\nimport { GoogleMapRegionSelector } from \"./GoogleMapRegionSelector\";\r\nimport { GoogleMapRegionSelectorProps } from \"./GoogleMapRegionSelectorTypes\";\r\n\r\n\r\nexport interface GoogleMapRegionSelectorMapProps extends GoogleMapProps {\r\n regionSelectorProps: Omit<GoogleMapRegionSelectorProps, 'googleMapsAPI'>;\r\n}\r\n\r\nexport function GoogleMapRegionSelectorMap(props: GoogleMapRegionSelectorMapProps) {\r\n const { regionSelectorProps, children, ...map_props } = props;\r\n\r\n const API = useGoogleMapsAPI();\r\n\r\n const { mapReady, placesReady, geocoderReady } = API;\r\n\r\n return (\r\n <>\r\n {mapReady && placesReady && geocoderReady ?\r\n (\r\n <>\r\n <GoogleMap {...map_props}>\r\n <GoogleMapRegionSelector {...regionSelectorProps} googleMapsAPI={API} />\r\n {children}\r\n </GoogleMap>\r\n <div style={{ display: \"none\" }} ref={API.attributionsRef}></div>\r\n </>\r\n )\r\n :\r\n (<Skeleton height=\"50vh\" />)\r\n }\r\n </>\r\n )\r\n\r\n};\r\n","import { ReactNode, useCallback, useEffect } from \"react\";\r\nimport { Value } from \"../../client\";\r\nimport { EntityColumn, EntityColumnFlags } from \"../../Entity\";\r\nimport { ValidatorConfiguration } from \"../../Validation\";\r\nimport { latLng } from \"../Core\";\r\nimport { UseEntityFormReturnType, useFieldConfiguration } from \"../Form\";\r\nimport { AddressFoundResult, GoogleAddressAutocomplete, GoogleAddressAutocompleteProps, GoogleAddressAutocompleteRestrictions, MappedAddressResult } from \"../GoogleMaps\";\r\n\r\nexport interface AddressAutocompleteResult {\r\n address?: MappedAddressResult,\r\n position?: latLng,\r\n utcOffsetMinutes?: number,\r\n formattedAddress?: string,\r\n}\r\n\r\nexport interface AddressAutocompleteProps extends Omit<GoogleAddressAutocompleteProps, 'restrictions' | 'onAddressFound'> {\r\n column: EntityColumn<Value>,\r\n entityForm: UseEntityFormReturnType,\r\n validate?: ValidatorConfiguration,\r\n requiredMessage?: ReactNode,\r\n validationContainer?: React.ComponentType<{ children: ReactNode }>\r\n autoFocus?: boolean\r\n\r\n countries: string[],\r\n\r\n onAddressFound?: (addressResult?: AddressAutocompleteResult) => void,\r\n}\r\n\r\nexport function AddressAutocomplete(props: AddressAutocompleteProps) {\r\n //const { } = useComponentDefaultProps('AddressAutocomplete', {}, props);\r\n const {\r\n column, entityForm, validate, requiredMessage, validationContainer, countries, required, readOnly, onAddressFound,\r\n withAsterisk, label, placeholder, description, maxLength, autoFocus,\r\n ...rest\r\n } = props;\r\n\r\n const { status, form } = entityForm;\r\n\r\n useFieldConfiguration({ entityForm, column, validationContainer, validate, required, requiredMessage, readOnly });\r\n\r\n const [showDescription,] = entityForm.showDescriptionState;\r\n\r\n const restrictions: GoogleAddressAutocompleteRestrictions = {\r\n country: countries\r\n };\r\n\r\n const handleOnAddressFound = useCallback((result: AddressFoundResult) => {\r\n form.setFieldValue(column.name, result.suggestionDescription || result?.place.formatted_address || '');\r\n if (onAddressFound) {\r\n const found: AddressAutocompleteResult = {\r\n address: result.address,\r\n position: result.position,\r\n utcOffsetMinutes: result.place.utc_offset_minutes,\r\n formattedAddress: result.suggestionDescription || result.place.formatted_address\r\n };\r\n onAddressFound(found);\r\n }\r\n }, [column.name, form, onAddressFound]);\r\n\r\n useEffect(() => {\r\n form.setFieldValue(column.name, column.value || '');\r\n }, []);\r\n\r\n return (\r\n <GoogleAddressAutocomplete\r\n {...rest}\r\n\r\n restrictions={restrictions}\r\n onAddressFound={handleOnAddressFound}\r\n\r\n withAsterisk={withAsterisk ?? (!readOnly && !(entityForm.formMode === 'view') && (required ?? !column.hasFlag(EntityColumnFlags.nullable)))}\r\n label={label ?? column.prompt}\r\n placeholder={placeholder ?? column.placeholder}\r\n description={showDescription ? (description ?? column.description) : ''}\r\n maxLength={maxLength ?? column.length}\r\n readOnly={entityForm.formMode === 'view' ? true : readOnly}\r\n\r\n autoFocus={autoFocus}\r\n data-autofocus={autoFocus}\r\n\r\n {...entityForm.form.getInputProps(column.name)}\r\n\r\n />\r\n )\r\n}","import { MantineNumberSize, Skeleton, Stack, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI\";\r\nimport { AlertError, AlertInfo, latLng } from \"../Core\";\r\nimport { AddressSearchDefaultZoomLevels, DEFAULT_MAP_CENTER, GeocodeOperationResult, GoogleMap, GoogleMapsErrorStatus, GoogleMarker, MapOptions, MappingAddressType, MarkerOptions } from \"../GoogleMaps\";\r\n\r\nexport interface AddressMapMarkerPosition {\r\n position: latLng,\r\n mappedAddressType?: MappingAddressType\r\n}\r\n\r\nexport interface AddressMapMarkerProps {\r\n initialSearchAddress?: string,\r\n readOnly?: boolean,\r\n markerPosition?: AddressMapMarkerPosition,\r\n defaultMapCenter?: latLng,\r\n onMarkerChanged?: (postion: latLng, geocodeOperationResult?: google.maps.GeocoderResult) => void,\r\n onAPIError?: (status: GoogleMapsErrorStatus) => void,\r\n\r\n errorTitle?: string,\r\n errorMessage?: string,\r\n markerInfoTitle?: string,\r\n markerInfoMessage?: string,\r\n mapHeight?: MantineNumberSize,\r\n showErrors?: boolean,\r\n\r\n draggable?: boolean,\r\n initialMapZoomLevel?: number,\r\n\r\n fullScreenControl?: boolean,\r\n}\r\n\r\nexport const AddressMapMarkerDefaultProps: Partial<AddressMapMarkerProps> = {\r\n defaultMapCenter: DEFAULT_MAP_CENTER,\r\n mapHeight: \"50vh\",\r\n errorTitle: \"google maps error\",\r\n errorMessage: \"An error occurred with google maps API:\",\r\n markerInfoTitle: \"Marker location changed\",\r\n markerInfoMessage: \"The marker has been moved to a new location. Result for marker location:\",\r\n draggable: true,\r\n initialMapZoomLevel: AddressSearchDefaultZoomLevels.address,\r\n fullScreenControl: false,\r\n}\r\n\r\nexport function AddressMapMarker(props: AddressMapMarkerProps) {\r\n const googleMapsAPI = useGoogleMapsAPI();\r\n\r\n const { mapReady, placesReady, geocoderReady } = googleMapsAPI;\r\n\r\n const addressProps = useComponentDefaultProps('AddressMapMarker', AddressMapMarkerDefaultProps, props);\r\n\r\n return (\r\n <>\r\n {mapReady && placesReady && geocoderReady ?\r\n (<AddressMapMarkerInternal {...addressProps} {...googleMapsAPI} />)\r\n :\r\n (<Skeleton height={props.mapHeight} />)\r\n }\r\n </>\r\n )\r\n}\r\nfunction AddressMapMarkerInternal(props: AddressMapMarkerProps & ReturnType<typeof useGoogleMapsAPI>) {\r\n\r\n const {\r\n markerPosition, defaultMapCenter, readOnly, errorMessage, errorTitle, initialSearchAddress, markerInfoTitle, markerInfoMessage,\r\n onAPIError, onMarkerChanged, geocode, mapHeight, showErrors, draggable, initialMapZoomLevel, fullScreenControl\r\n } = props;\r\n\r\n const [errorStatus, setErrorStatus] = useState<GoogleMapsErrorStatus | undefined>();\r\n\r\n const [draggedFormattedAddress, setDraggedFormattedAddress] = useState<string | undefined>(undefined);\r\n const [markerActualPos, setMarkerActualPos] = useState<latLng | undefined>(markerPosition?.position);\r\n const [markerPanZoom, setMarkerPanZoom] = useState<number | undefined>(AddressSearchDefaultZoomLevels.address);\r\n\r\n const mapOptions = useMemo<MapOptions>(() => ({\r\n zoom: markerActualPos ? markerPanZoom : initialMapZoomLevel,\r\n fullscreenControl: fullScreenControl,\r\n gestureHandling: 'greedy',\r\n clickableIcons: false,\r\n center: (markerActualPos && markerActualPos.lat !== null && markerActualPos.lng !== null) ? markerActualPos : defaultMapCenter\r\n }), [defaultMapCenter, initialMapZoomLevel, markerActualPos, markerPanZoom, fullScreenControl]);\r\n\r\n const addressMarkerOptions = useMemo<MarkerOptions>(() => ({\r\n position: (markerActualPos && markerActualPos.lat !== null && markerActualPos.lng !== null) ? markerActualPos : defaultMapCenter,\r\n visible: !!markerActualPos,\r\n animation: google.maps.Animation.DROP,\r\n draggable: readOnly ? false : draggable,\r\n }), [defaultMapCenter, markerActualPos, readOnly, draggable]);\r\n\r\n useEffect(() => {\r\n setMarkerActualPos(markerPosition?.position);\r\n setMarkerPanZoom(markerPosition?.mappedAddressType ? AddressSearchDefaultZoomLevels[markerPosition.mappedAddressType || 'unknown'] : initialMapZoomLevel);\r\n }, [initialMapZoomLevel, markerPosition]);\r\n\r\n const handleDragEnd = useCallback((position: google.maps.LatLng) => {\r\n const latLng = { lat: position.lat(), lng: position.lng() };\r\n\r\n setMarkerActualPos(latLng);\r\n\r\n geocode({ location: position }, (results, status) => {\r\n const operationResult: GeocodeOperationResult = {};\r\n operationResult.status = status || 'UNKNOWN';\r\n\r\n if (status === google.maps.GeocoderStatus.OK) {\r\n const filteredResults = results?.filter(result => result.types.includes('route'));\r\n operationResult.result = (filteredResults && filteredResults.length > 0) ? filteredResults[0] : results ? results[0] : undefined;\r\n setDraggedFormattedAddress(operationResult.result?.formatted_address);\r\n } else if (status === google.maps.GeocoderStatus.ZERO_RESULTS) {\r\n // MMC: on empty results we set the queryStatus to OK to clear the marker address\r\n operationResult.status = \"OK\";\r\n } else {\r\n const errorStatus: GoogleMapsErrorStatus = { status: status || 'UNKNOWN', origin: \"Geocoder\" };\r\n setErrorStatus(errorStatus);\r\n if (onAPIError) onAPIError(errorStatus);\r\n }\r\n\r\n if (onMarkerChanged) {\r\n onMarkerChanged(latLng, operationResult.result);\r\n }\r\n\r\n });\r\n\r\n }, [geocode, onAPIError, onMarkerChanged]);\r\n\r\n return (\r\n <>\r\n <GoogleMap style={{ height: mapHeight, resize: \"vertical\" }} mapOptions={mapOptions}>\r\n <GoogleMarker key=\"address-marker\" markerOptions={addressMarkerOptions} onDragEnd={handleDragEnd} />\r\n </GoogleMap>\r\n {(draggedFormattedAddress && draggedFormattedAddress !== initialSearchAddress) &&\r\n <AlertInfo title={markerInfoTitle}>\r\n <Stack>\r\n {markerInfoMessage} {draggedFormattedAddress}\r\n </Stack>\r\n </AlertInfo>\r\n }\r\n {showErrors && errorStatus && <AlertError title={errorTitle}>{errorMessage} {errorStatus.status} ({errorStatus.origin})</AlertError>}\r\n </>)\r\n}","import { Skeleton, Stack, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI\";\r\nimport { AlertError } from \"../Core\";\r\nimport { AddressFoundResult, GoogleAddressAutocomplete, GoogleAddressAutocompleteRestrictions, OnAddressFoundCallback } from \"../GoogleMaps\";\r\nimport { AddressMappingRule, GoogleMapsErrorStatus } from \"../GoogleMaps/Mapping.types\";\r\nimport { AddressMapMarker, AddressMapMarkerPosition, AddressMapMarkerProps } from \"./AddressMapMarker\";\r\n\r\n\r\nexport interface AddressSearchProps extends Omit<AddressMapMarkerProps, 'showErrors'> {\r\n countries: string[],\r\n onAddressFound?: (result: AddressFoundResult) => void,\r\n mappingRules?: AddressMappingRule[]\r\n addressLabel?: string,\r\n draggable?: boolean,\r\n}\r\n\r\nexport const AddressSearchDefaultProps: Partial<AddressSearchProps> = {\r\n addressLabel: \"Address\",\r\n mappingRules: [],\r\n draggable: true\r\n}\r\n\r\nexport function AddressSearch(props: AddressSearchProps) {\r\n const googleMapsAPI = useGoogleMapsAPI();\r\n\r\n const { mapReady, placesReady, geocoderReady } = googleMapsAPI;\r\n\r\n const addressProps = useComponentDefaultProps('AddressSearch', AddressSearchDefaultProps, props);\r\n\r\n return (\r\n <>\r\n {mapReady && placesReady && geocoderReady ?\r\n (<AddressSearchInternal {...addressProps} {...googleMapsAPI} />)\r\n :\r\n (<Skeleton height=\"50vh\" />)\r\n }\r\n </>\r\n )\r\n}\r\n\r\nfunction AddressSearchInternal(props: AddressSearchProps & ReturnType<typeof useGoogleMapsAPI>) {\r\n const {\r\n addressLabel, onMarkerChanged, defaultMapCenter, markerPosition, errorMessage,\r\n errorTitle, onAPIError, readOnly, countries, initialSearchAddress, onAddressFound, mappingRules,\r\n draggable,\r\n ...rest\r\n } = props;\r\n\r\n const [errorStatus, setErrorStatus] = useState<GoogleMapsErrorStatus | undefined>();\r\n\r\n const [lastFormattedAddress, setLastFormattedAddress] = useState<string | undefined>(initialSearchAddress);\r\n const [markerActualPos, setMarkerActualPos] = useState<AddressMapMarkerPosition | undefined>(markerPosition);\r\n\r\n const autocompleteRestrictions = useMemo<GoogleAddressAutocompleteRestrictions>(() => ({\r\n country: countries\r\n }), [countries]);\r\n\r\n const handleAddressFound = useCallback<OnAddressFoundCallback>(found => {\r\n\r\n // MMC: when address changes, the marker gets reset to the same position as the address\r\n if (found.place.geometry?.location) {\r\n const currentPos = { lat: found.place.geometry.location.lat(), lng: found.place.geometry.location.lng() };\r\n\r\n setMarkerActualPos({ position: currentPos, mappedAddressType: found.address?.mappedAddressType });\r\n setLastFormattedAddress(found.suggestionDescription || found.place.formatted_address);\r\n }\r\n else {\r\n setMarkerActualPos(undefined);\r\n setLastFormattedAddress(undefined);\r\n }\r\n\r\n if (onAddressFound) {\r\n onAddressFound(found);\r\n }\r\n\r\n }, [onAddressFound]);\r\n\r\n const handleAutocompleteError = useCallback((status: string) => {\r\n const apiError: GoogleMapsErrorStatus = { status: status, origin: \"Places\" };\r\n setErrorStatus(apiError);\r\n if (onAPIError) onAPIError(apiError);\r\n }, [onAPIError]);\r\n\r\n const handleMarkerError = useCallback((status: GoogleMapsErrorStatus) => {\r\n setErrorStatus(status);\r\n if (onAPIError) onAPIError(status);\r\n }, [onAPIError]);\r\n\r\n\r\n return (\r\n <Stack>\r\n <GoogleAddressAutocomplete\r\n label={addressLabel}\r\n restrictions={autocompleteRestrictions}\r\n onAddressFound={handleAddressFound}\r\n readOnly={readOnly}\r\n value={initialSearchAddress}\r\n onAPIError={handleAutocompleteError}\r\n mappingRules={mappingRules}\r\n />\r\n <AddressMapMarker\r\n {...rest}\r\n initialSearchAddress={lastFormattedAddress}\r\n markerPosition={markerActualPos}\r\n defaultMapCenter={defaultMapCenter}\r\n onMarkerChanged={onMarkerChanged}\r\n onAPIError={handleMarkerError}\r\n readOnly={readOnly}\r\n showErrors={false}\r\n draggable={draggable}\r\n />\r\n {errorStatus && <AlertError title={errorTitle}>{errorMessage} {errorStatus.status} ({errorStatus.origin})</AlertError>}\r\n </Stack>\r\n );\r\n}","import { Button, Card, Group, Text, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconCircleCheck, IconCircleX, IconInfoCircle } from \"@tabler/icons-react\";\r\nimport { useCallback, useState } from \"react\";\r\nimport { latLng } from \"../Core\";\r\nimport { AddressFoundResult } from \"../GoogleMaps\";\r\nimport { AddressMappingRule } from \"../GoogleMaps/Mapping.types\";\r\nimport { AddressMapMarkerPosition } from \"./AddressMapMarker\";\r\nimport { AddressSearch } from \"./AddressSearch\";\r\n\r\n\r\n\r\nexport interface AddressSearchFormProps {\r\n helpMessage?: string,\r\n okLabel?: string,\r\n cancelLabel?: string,\r\n\r\n countries: string[],\r\n initialSearchAddress?: string,\r\n currentPosition?: AddressMapMarkerPosition,\r\n\r\n onCancel?: () => void,\r\n onOK: (addressResult?: AddressFoundResult, position?: latLng) => void\r\n\r\n mappingRules?: AddressMappingRule[],\r\n draggable?: boolean,\r\n}\r\n\r\nexport const AddressSearchFormDefaultProps: Partial<AddressSearchFormProps> = {\r\n helpMessage: \"Enter the address to search for. You can move the Marker to another position. Click OK when ready\",\r\n okLabel: \"OK\",\r\n cancelLabel: \"Cancel\",\r\n mappingRules: []\r\n}\r\n\r\n\r\nexport function AddressSearchForm(props: AddressSearchFormProps) {\r\n const theme = useMantineTheme();\r\n\r\n const {\r\n helpMessage, okLabel, onOK, onCancel, cancelLabel, countries, initialSearchAddress, currentPosition, mappingRules, draggable\r\n } = useComponentDefaultProps('AddressSearchForm', AddressSearchFormDefaultProps, props);\r\n\r\n const [address, setAddress] = useState<AddressFoundResult>();\r\n const [position, setPosition] = useState<latLng>();\r\n\r\n const handleOnAddressFound = useCallback((result: AddressFoundResult) => {\r\n setAddress(result);\r\n if (result.place.geometry && result.place.geometry.location) setPosition({ lat: result.place.geometry.location.lat(), lng: result.place.geometry.location.lng() });\r\n }, []);\r\n\r\n const handleOnMarkerChanged = useCallback((position: latLng) => {\r\n if (position) setPosition(position);\r\n }, []);\r\n\r\n const handleOK = useCallback(() => {\r\n onOK(address, position);\r\n }, [address, onOK, position]);\r\n\r\n return (\r\n <>\r\n <Card shadow=\"sm\" withBorder={theme.colorScheme === 'dark' ? false : true}>\r\n <Card.Section p=\"xs\" bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]} mb=\"1rem\">\r\n <Group sx={{ gap: \"0.25rem\" }}>\r\n <IconInfoCircle size=\"1.1rem\" />\r\n <Text fz=\"xs\" c=\"dimmed\">{helpMessage}</Text>\r\n </Group>\r\n </Card.Section>\r\n <AddressSearch\r\n countries={countries}\r\n initialSearchAddress={initialSearchAddress}\r\n onAddressFound={handleOnAddressFound}\r\n onMarkerChanged={handleOnMarkerChanged}\r\n markerPosition={currentPosition}\r\n mappingRules={mappingRules}\r\n draggable={draggable}\r\n />\r\n </Card><Group mt=\"md\" position=\"right\">\r\n <Button variant=\"light\" leftIcon={<IconCircleX size=\"1.5rem\" />} onClick={() => (onCancel) ? onCancel() : null}>{cancelLabel}</Button>\r\n <Button onClick={handleOK} color={theme.colors.green[5]} leftIcon={<IconCircleCheck size=\"1.5rem\" />}>{okLabel}</Button>\r\n </Group>\r\n </>\r\n );\r\n\r\n}","import { Text } from \"@mantine/core\";\r\nimport { ModalSettings } from \"@mantine/modals/lib/context\";\r\nimport { useRef } from \"react\";\r\nimport { latLng, useModal } from \"../Core\";\r\nimport { AddressFoundResult } from \"../GoogleMaps\";\r\nimport { AddressMappingRule } from \"../GoogleMaps/Mapping.types\";\r\nimport { AddressMapMarkerPosition } from \"./AddressMapMarker\";\r\nimport { AddressSearchForm } from \"./AddressSearchForm\";\r\n\r\nexport interface AddressSearchModalOptions {\r\n onOK: (address?: AddressFoundResult, position?: latLng) => void,\r\n onCancel?: () => void,\r\n onClosed?: () => void,\r\n modalProps?: ModalSettings,\r\n search?: string,\r\n helpMessage?: string,\r\n title?: string,\r\n countries: string[],\r\n currentPosition?: AddressMapMarkerPosition,\r\n mappingRules?: AddressMappingRule[]\r\n}\r\n\r\nexport const UseAddressSearchFormDefaultProps: Partial<AddressSearchModalOptions> = {\r\n modalProps: { size: 'xl' },\r\n title: 'Address Search',\r\n helpMessage: 'Enter the address to search for. You can move the Marker to another position. Click OK when ready',\r\n mappingRules: []\r\n}\r\nexport function useAddressSearchForm() {\r\n const modals = useModal();\r\n const buttonResult = useRef<'OK' | 'Cancel' | 'Quit'>('Quit');\r\n\r\n const open = async (props: AddressSearchModalOptions) => {\r\n const {\r\n onOK, onCancel, modalProps, search, helpMessage, onClosed, countries, title, currentPosition, mappingRules\r\n } = { ...UseAddressSearchFormDefaultProps, ...props };\r\n\r\n buttonResult.current = 'Quit';\r\n\r\n const handleOK = async (address?: AddressFoundResult, position?: latLng) => {\r\n buttonResult.current = 'OK';\r\n await modals.close();\r\n if (onOK) {\r\n await onOK(address, position);\r\n }\r\n };\r\n\r\n const handleCancel = async () => {\r\n buttonResult.current = 'Cancel';\r\n await modals.close();\r\n if (onCancel) {\r\n onCancel();\r\n }\r\n };\r\n\r\n const handleClosed = async () => {\r\n if (buttonResult.current === 'Quit') {\r\n if (onCancel) {\r\n onCancel();\r\n }\r\n }\r\n if (onClosed) onClosed();\r\n }\r\n\r\n await modals.open(\r\n {\r\n content: <AddressSearchForm\r\n countries={countries}\r\n initialSearchAddress={search}\r\n currentPosition={currentPosition}\r\n helpMessage={helpMessage}\r\n onOK={(address?: AddressFoundResult, position?: latLng) => handleOK(address, position)}\r\n onCancel={() => handleCancel()}\r\n mappingRules={mappingRules}\r\n />,\r\n modalProps: {\r\n ...modalProps,\r\n trapFocus: true,\r\n returnFocus: true,\r\n title: <Text fw=\"700\">{title}</Text>,\r\n },\r\n onClosed: async () => {\r\n await handleClosed();\r\n }\r\n\r\n });\r\n\r\n };\r\n\r\n return open;\r\n\r\n}","import { Button, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconMapPin } from \"@tabler/icons-react\";\r\nimport { useCallback } from \"react\";\r\nimport { ActionIconVariant, latLng } from \"../Core\";\r\nimport { AddressFoundResult } from \"../GoogleMaps\";\r\nimport { AddressAutocomplete, AddressAutocompleteProps, AddressAutocompleteResult } from \"./AddressAutocomplete\";\r\nimport { AddressMapMarkerPosition } from \"./AddressMapMarker\";\r\nimport { useAddressSearchForm } from \"./useAddressSearchForm\";\r\n\r\nexport interface AddressLookupProps extends Omit<AddressAutocompleteProps, 'rightSection'> {\r\n icon?: React.ReactNode,\r\n iconLabel?: string,\r\n iconVariant?: ActionIconVariant,\r\n currentPosition?: AddressMapMarkerPosition,\r\n\r\n}\r\n\r\nexport const AddressLookupDefaultProps: Partial<AddressLookupProps> = {\r\n icon: <IconMapPin size=\"1rem\" stroke=\"1.5\" />,\r\n iconVariant: \"light\",\r\n iconLabel: \"Map\",\r\n rightSectionWidth: \"5.2rem\",\r\n}\r\n\r\nexport function AddressLookup(props: AddressLookupProps) {\r\n const {\r\n countries, icon, iconVariant, column, entityForm, currentPosition, onAddressFound,\r\n mappingRules, iconLabel, rightSectionWidth,\r\n ...rest\r\n } = useComponentDefaultProps('AddressLookup', AddressLookupDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n const search = useAddressSearchForm();\r\n\r\n const handleOKSearch = useCallback((result?: AddressFoundResult, position?: latLng) => {\r\n const description = result?.suggestionDescription || result?.place.formatted_address;\r\n if (description) entityForm.form.values[column.name] = description;\r\n const found: AddressAutocompleteResult = {\r\n address: result?.address,\r\n position: position,\r\n utcOffsetMinutes: result?.place.utc_offset_minutes,\r\n formattedAddress: description\r\n };\r\n if (onAddressFound) onAddressFound(found);\r\n }, [column.name, entityForm.form, onAddressFound]);\r\n\r\n const handleSearch = useCallback(() => {\r\n search({\r\n countries: countries,\r\n search: entityForm.form.values[column.name] as string,\r\n currentPosition: currentPosition,\r\n mappingRules: mappingRules,\r\n onOK: handleOKSearch\r\n });\r\n }, [column.name, countries, currentPosition, entityForm.form.values, handleOKSearch, mappingRules, search]);\r\n\r\n return (\r\n <>\r\n <AddressAutocomplete\r\n {...rest}\r\n column={column}\r\n entityForm={entityForm}\r\n countries={countries}\r\n\r\n onAddressFound={onAddressFound}\r\n rightSection={<Button color={theme.primaryColor} onClick={handleSearch} variant={iconVariant} size=\"xs\" leftIcon={icon}>{iconLabel}</Button>}\r\n rightSectionWidth={rightSectionWidth}\r\n />\r\n </>\r\n )\r\n}","import { Box, Group, Select, Text, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { useRef } from \"react\";\r\nimport { DataResult, OperationStatus } from \"../../client\";\r\nimport { AlertError, FakeProgressBar, FormMode, useFirstVisible, useViewState } from \"../Core\";\r\nimport { DataGridDefaultProps, DataGridProps } from \"../DataGrid\";\r\nimport { DataGridActionsToolbar } from \"../DataGrid/DataGridActionsToolbar\";\r\nimport { useDataGrid } from \"../DataGrid/useDatagrid\";\r\nimport { DataViewLimitData } from \"../DataView\";\r\nimport { Grid, GridSelection } from \"../Grid\";\r\n\r\n\r\nexport interface DataMapGridProps extends DataGridProps {\r\n dataGridAPI: ReturnType<typeof useDataGrid>,\r\n executeViewState: OperationStatus<DataResult[]>,\r\n viewState: ReturnType<typeof useViewState>,\r\n selectedRows: GridSelection,\r\n setSelectedRows?: (rows: GridSelection) => void,\r\n formMode?: FormMode\r\n}\r\n\r\nexport const DataMapGridDefaultProps: Partial<DataMapGridProps> = DataGridDefaultProps;\r\n\r\nexport function DataMapGrid(props: DataMapGridProps) {\r\n const {\r\n labels, toolbarSize, viewName, preserveSelection, autoSelectFirstRow, selectionMode, columnBorders, autoSizeColumnsOnLoad, rowBorders, withBorder,\r\n columnsOverrides, selectedRows, setSelectedRows,\r\n enableAdd, enableDelete, enableEdit, enableView,\r\n actionsButtonVariant, showActions, entity,\r\n renderOnlyWhenVisible, gridHeight,\r\n executeViewState, dataGridAPI, viewState, formMode,\r\n } = useComponentDefaultProps('DataMapGrid', DataMapGridDefaultProps, props);\r\n\r\n const visibilityDivRef = useRef<HTMLDivElement>(null);\r\n const isFirstVisible = useFirstVisible(visibilityDivRef);\r\n\r\n const { columns, rows, isLoading } = dataGridAPI;\r\n\r\n return (\r\n <>\r\n {renderOnlyWhenVisible && isFirstVisible === false ?\r\n <div ref={visibilityDivRef} style={{ height: gridHeight }}></div>\r\n :\r\n <section>\r\n <DataGridActionsToolbar\r\n {...labels!}\r\n size={toolbarSize}\r\n viewName={viewName}\r\n\r\n onAddClick={dataGridAPI.handleAddClick}\r\n onEditClick={dataGridAPI.handleEditClick}\r\n onDeleteClick={dataGridAPI.handleDeleteClick}\r\n onViewClick={dataGridAPI.handleViewClick}\r\n\r\n enableAdd={enableAdd}\r\n enableEdit={enableEdit}\r\n enableDelete={enableDelete}\r\n enableView={enableView}\r\n\r\n actionsButtonVariant={actionsButtonVariant}\r\n clientActions={entity?.def.clientActions ?? {}}\r\n handleExecuteAction={dataGridAPI.handleExecuteAction}\r\n showActions={showActions}\r\n\r\n parentFormMode={formMode}\r\n\r\n />\r\n <Box pos={\"relative\"} mt=\"sm\" mb=\"sm\" >\r\n {(isLoading || executeViewState.loading) &&\r\n <FakeProgressBar pos={\"absolute\"} style={{ top: 0, width: \"100%\" }} size=\"xs\" />\r\n }\r\n {!isLoading && !executeViewState.loading && executeViewState.error &&\r\n <AlertError mb=\"xs\">Error: {executeViewState.error.status} {executeViewState.error.message} {executeViewState.error.statusMessage}</AlertError>\r\n }\r\n <Grid\r\n columns={columns}\r\n rows={rows}\r\n onDoubleClick={dataGridAPI.handleDoubleClick}\r\n gridHeight={gridHeight === 'auto' ? '50vh' : gridHeight}\r\n preserveSelection={preserveSelection}\r\n onSelectionChanged={dataGridAPI.handleSelectionChanged}\r\n showSelectCheckbox={dataGridAPI.showSelectCheckbox}\r\n autoSelectFirstRow={autoSelectFirstRow}\r\n selectionMode={selectionMode}\r\n columnBorders={columnBorders}\r\n autoSizeColumnsOnLoad={autoSizeColumnsOnLoad}\r\n rowBorders={rowBorders}\r\n withBorder={withBorder}\r\n columnsOverrides={columnsOverrides}\r\n selectedRows={selectedRows}\r\n setSelectedRows={setSelectedRows}\r\n timeZoneOffset={entity?.API.client.TIMEZONE_OFFSET}\r\n />\r\n </Box>\r\n <Group>\r\n {executeViewState && !executeViewState.error &&\r\n <>\r\n <Text fz=\"sm\">{labels?.limitLabel}</Text>\r\n <Select size=\"xs\" sx={{ maxWidth: '7rem' }}\r\n data={DataViewLimitData(labels!.rowsLabel, labels!.unlimitedLabel)}\r\n value={viewState.limitRows}\r\n onChange={viewState.setLimitRows}\r\n />\r\n </>\r\n }\r\n {rows &&\r\n <Text fz=\"xs\" c=\"dimmed\">{labels?.rowsReturnedLabel} {rows.length}{dataGridAPI.selectedRowsCount ? <>, {dataGridAPI.selectedRowsCount} {labels?.selectedRowsLabel}</> : \"\"}</Text>\r\n }\r\n </Group>\r\n </section>\r\n }\r\n </>\r\n );\r\n}","/**\r\n * Converts a hexadecimal color string to an RGB array.\r\n * @param hex - The hexadecimal color string.\r\n * @returns The RGB array.\r\n */\r\nexport function hexToRgb(hex: string): [number, number, number] {\r\n const bigint = parseInt(hex.slice(1), 16);\r\n const r = (bigint >> 16) & 255;\r\n const g = (bigint >> 8) & 255;\r\n const b = bigint & 255;\r\n return [r, g, b];\r\n}\r\n\r\n/**\r\n * Converts an RGB array to a hexadecimal color string.\r\n * @param r - The red component.\r\n * @param g - The green component.\r\n * @param b - The blue component.\r\n * @returns The hexadecimal color string.\r\n */\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n return \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);\r\n}\r\n\r\n/**\r\n * Interpolates between two colors.\r\n * @param color1 - The first color.\r\n * @param color2 - The second color.\r\n * @param factor - The interpolation factor.\r\n * @returns The interpolated color.\r\n */\r\nexport function interpolateColor(color1: string, color2: string, factor: number): string {\r\n const [r1, g1, b1] = hexToRgb(color1);\r\n const [r2, g2, b2] = hexToRgb(color2);\r\n\r\n const r = Math.round(r1 + factor * (r2 - r1));\r\n const g = Math.round(g1 + factor * (g2 - g1));\r\n const b = Math.round(b1 + factor * (b2 - b1));\r\n\r\n return rgbToHex(r, g, b);\r\n}\r\n\r\n/**\r\n * Computes a hash and converts a string to a color. Use this function to generate a color from a string from a small set of strings.\r\n * @param str - The string to convert.\r\n * @returns The color.\r\n */\r\nexport function stringToColor(str: string): string {\r\n // (DJB2)\r\n let hash = 5381;\r\n for (let i = 0; i < str.length; i++) {\r\n hash = (hash * 33) ^ str.charCodeAt(i);\r\n }\r\n\r\n let color = '#';\r\n for (let i = 0; i < 3; i++) {\r\n const value = (hash >> (i * 8)) & 0xFF;\r\n color += ('00' + value.toString(16)).slice(-2);\r\n }\r\n\r\n return color;\r\n}\r\n\r\n/**\r\n * Computes a label color (either white or black) based on the background color generated by stringToColor.\r\n * @param str - The string to convert to a color and use as background.\r\n * @returns The label color.\r\n */\r\nexport function stringToColorLabel(str: string): string {\r\n // Generate background color from string\r\n const bgColor = stringToColor(str);\r\n\r\n // Convert hex background color to RGB\r\n const [r, g, b] = hexToRgb(bgColor);\r\n\r\n // Calculate brightness using the YIQ formula\r\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\r\n\r\n // Return white or black label color based on brightness\r\n return brightness > 128 ? '#000000' : '#FFFFFF';\r\n}","import { useCallback, useMemo } from \"react\";\r\n\r\nexport const MarkerSVGConverterFillColorTAG = '{FILL_COLOR}';\r\nexport const MarkerSVGConverterStrokeColorTAG = '{STROKE_COLOR}';\r\nexport const MarkerSVGConverterFillOpacityTAG = '{FILL_OPACITY}';\r\nexport const MarkerSVGConverterStyleTAG = '{STYLES}';\r\nexport const MarkerSVGConverterSelectedStyleTAG = '{SELECTED_STYLE}';\r\n\r\n/**\r\n * Hook that returns a function to convert a SVG image to a URL with the specified colors.\r\n * it replaces the tags {FILL_COLOR}, {STROKE_COLOR} and {FILL_OPACITY} with the specified colors.\r\n * @returns\r\n */\r\nexport function useGoogleMarkerSVGConvertToURL() {\r\n const colorsRegex = useMemo(() => {\r\n\r\n const fillRegex = new RegExp(MarkerSVGConverterFillColorTAG, 'g');\r\n const strokeRegex = new RegExp(MarkerSVGConverterStrokeColorTAG, 'g');\r\n const fillOpacityRegex = new RegExp(MarkerSVGConverterFillOpacityTAG, 'g');\r\n const styleRegex = new RegExp(MarkerSVGConverterStyleTAG, 'g');\r\n const selectedStyleRegex = new RegExp(MarkerSVGConverterSelectedStyleTAG, 'g');\r\n\r\n return { fillRegex, strokeRegex, fillOpacityRegex, styleRegex, selectedStyleRegex };\r\n\r\n }, []);\r\n\r\n const convertToURL = useCallback((svgImage: string, fillColor?: string, strokeColor?: string, fillOpacity?: number, styles?: string, selectedStyle?: string): {icon: string, url?: string} => {\r\n if (!svgImage) return ({ icon: svgImage });\r\n\r\n // replace image tags\r\n let icon = svgImage;\r\n icon = icon.replace(colorsRegex.fillRegex, fillColor ?? '');\r\n icon = icon.replace(colorsRegex.strokeRegex, strokeColor ?? '');\r\n icon = icon.replace(colorsRegex.fillOpacityRegex, (fillOpacity ?? 1).toString());\r\n icon = icon.replace(colorsRegex.styleRegex, styles ?? '');\r\n icon = icon.replace(colorsRegex.selectedStyleRegex, selectedStyle ?? '');\r\n \r\n const url = `data:image/svg+xml;base64,${btoa(icon)}`;\r\n\r\n return {\r\n icon,\r\n url\r\n }\r\n\r\n }, [colorsRegex]);\r\n\r\n return convertToURL;\r\n\r\n}","import { useCallback } from \"react\";\r\nimport { stringToColor, stringToColorLabel } from \"./colorTools\";\r\nimport { MarkerSVGConverterFillColorTAG, MarkerSVGConverterFillOpacityTAG, MarkerSVGConverterSelectedStyleTAG, MarkerSVGConverterStyleTAG, useGoogleMarkerSVGConvertToURL } from \"./useGoogleMarkerSVGConverter\";\r\n\r\n\r\nexport const MapMarkerDefaultShadowStyle = \"-webkit-filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .7)); filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .7));\";\r\n//export const MapMarkerDefaultSelectedStyle = \"-webkit-filter: drop-shadow(3px 3px 0px rgba(220, 20, 60, 1)); filter: drop-shadow(3px 3px 0px rgba(220, 20, 60, 1));\";\r\nexport const MapMarkerDefaultSelectedStyle = \"-webkit-filter: drop-shadow(0px 0px 3px rgba(0, 0, 0, .8)); filter: drop-shadow(0px 0px 3px rgba(0, 0, 0, .8));\";\r\n//export const MapMarkerDefaultSelectedStyle = \"\";\r\n\r\nexport const MapMarkerCircleFilledSVGIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"${MarkerSVGConverterStyleTAG}${MarkerSVGConverterSelectedStyleTAG}\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"${MarkerSVGConverterFillColorTAG}\" class=\"icon icon-tabler icons-tabler-filled icon-tabler-circle\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 3.34a10 10 0 1 1 -4.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 4.995 -8.336z\" /></svg>`;\r\n\r\nexport const MapMarkerCircleCheckedSVGIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"${MarkerSVGConverterStyleTAG}${MarkerSVGConverterSelectedStyleTAG}\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"${MarkerSVGConverterFillColorTAG}\" class=\"icon icon-tabler icons-tabler-filled icon-tabler-circle-check\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M17 3.34a10 10 0 1 1 -14.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 14.995 -8.336zm-1.293 5.953a1 1 0 0 0 -1.32 -.083l-.094 .083l-3.293 3.292l-1.293 -1.292l-.094 -.083a1 1 0 0 0 -1.403 1.403l.083 .094l2 2l.094 .083a1 1 0 0 0 1.226 0l.094 -.083l4 -4l.083 -.094a1 1 0 0 0 -.083 -1.32z\" /></svg>`;\r\n\r\nexport const MapMarkerDefaultSelectedSVGIcon = MapMarkerCircleFilledSVGIcon;\r\n\r\n\r\nexport const MapMarkerDefaultSVGIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"${MarkerSVGConverterStyleTAG}${MarkerSVGConverterSelectedStyleTAG}\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"${MarkerSVGConverterFillColorTAG}\" fill-opacity=\"${MarkerSVGConverterFillOpacityTAG}\" class=\"icon icon-tabler icons-tabler-filled icon-tabler-map-pin\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M18.364 4.636a9 9 0 0 1 .203 12.519l-.203 .21l-4.243 4.242a3 3 0 0 1 -4.097 .135l-.144 -.135l-4.244 -4.243a9 9 0 0 1 12.728 -12.728zm-6.364 3.364a3 3 0 1 0 0 6a3 3 0 0 0 0 -6z\" /></svg>`;\r\nexport const MapMarkerDefaultFillColor = '#1e72c1';\r\nexport const MapMarkerDefaultFillOpacity = .7;\r\n\r\nexport const MapMarkerGroupDefaultSVGIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"${MarkerSVGConverterStyleTAG}${MarkerSVGConverterSelectedStyleTAG}\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"${MarkerSVGConverterFillColorTAG}\" fill-opacity=\"${MarkerSVGConverterFillOpacityTAG}\" class=\"icon icon-tabler icons-tabler-filled icon-tabler-hexagon\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M10.425 1.414l-6.775 3.996a3.21 3.21 0 0 0 -1.65 2.807v7.285a3.226 3.226 0 0 0 1.678 2.826l6.695 4.237c1.034 .57 2.22 .57 3.2 .032l6.804 -4.302c.98 -.537 1.623 -1.618 1.623 -2.793v-7.284l-.005 -.204a3.223 3.223 0 0 0 -1.284 -2.39l-.107 -.075l-.007 -.007a1.074 1.074 0 0 0 -.181 -.133l-6.776 -3.995a3.33 3.33 0 0 0 -3.216 0z\" /></svg>`;\r\nexport const MapMarkerGroupDefaultFillColor = 'red';\r\nexport const MapMarkerGroupDefaultLabelOrigin = { x: 20, y: 19 };\r\n\r\nexport interface UseCreateMarkerOptionsProps {\r\n svgIcon?: string,\r\n fillColor?: string,\r\n strokeColor?: string,\r\n fillOpacity?: number,\r\n styles?: string,\r\n\r\n selectedSvgIcon?: string,\r\n selectedFillColor?: string,\r\n selectedStrokeColor?: string,\r\n selectedFillOpacity?: number,\r\n selectedStyles?: string,\r\n selectedLabelOrigin?: google.maps.Point,\r\n selectedLabel?: google.maps.MarkerLabel,\r\n\r\n position: google.maps.LatLng | google.maps.LatLngLiteral,\r\n assignColorByValue?: string,\r\n\r\n title?: string,\r\n\r\n dataSetId?: string,\r\n recordIndex?: number,\r\n\r\n //markerUniqueKey?: string,\r\n labelOrigin?: google.maps.Point,\r\n label?: google.maps.MarkerLabel,\r\n\r\n isMapCenter?: boolean;\r\n}\r\n\r\nexport function useCreateMarkerOptions() {\r\n const svgConverter = useGoogleMarkerSVGConvertToURL();\r\n\r\n\r\n\r\n const createMarkerOptions = useCallback((props: UseCreateMarkerOptionsProps) => {\r\n const {\r\n svgIcon, fillColor, strokeColor, fillOpacity, position, assignColorByValue, title, label, labelOrigin, styles,\r\n selectedSvgIcon, selectedFillColor, selectedStrokeColor, selectedFillOpacity, selectedStyles, selectedLabel, selectedLabelOrigin, isMapCenter\r\n } = props;\r\n\r\n const markerOptions: google.maps.MarkerOptions = { position, title };\r\n\r\n let newFillColor = fillColor ?? MapMarkerDefaultFillColor;\r\n if (assignColorByValue) {\r\n newFillColor = stringToColor(assignColorByValue);\r\n }\r\n\r\n const icon = svgConverter(svgIcon ? svgIcon : MapMarkerDefaultSVGIcon, newFillColor, strokeColor, fillOpacity ? fillOpacity : MapMarkerDefaultFillOpacity, styles ?? MapMarkerDefaultShadowStyle, '');\r\n\r\n // This is to render correctly svg icons with styles\r\n markerOptions.optimized = false;\r\n\r\n markerOptions.icon = {\r\n url: icon.url!,\r\n scaledSize: new google.maps.Size(40, 40),\r\n origin: new google.maps.Point(0, 0),\r\n anchor: new google.maps.Point(20, 40),\r\n };\r\n\r\n if (label) {\r\n if (assignColorByValue) label.color = stringToColorLabel(assignColorByValue);\r\n markerOptions.label = label;\r\n }\r\n\r\n if (labelOrigin) {\r\n markerOptions.icon.labelOrigin = labelOrigin;\r\n }\r\n\r\n const selectedMarkerOptions: google.maps.MarkerOptions = { ...markerOptions };\r\n delete selectedMarkerOptions.label;\r\n\r\n const selectedIcon = svgConverter(selectedSvgIcon ?? MapMarkerDefaultSelectedSVGIcon ?? svgIcon ?? MapMarkerDefaultSVGIcon, selectedFillColor ?? newFillColor, selectedStrokeColor ?? strokeColor, selectedFillOpacity ?? fillOpacity ?? MapMarkerDefaultFillOpacity, '', selectedStyles ?? MapMarkerDefaultSelectedStyle);\r\n selectedMarkerOptions.icon = {\r\n url: selectedIcon.url!,\r\n scaledSize: new google.maps.Size(40, 40),\r\n origin: new google.maps.Point(0, 0),\r\n anchor: new google.maps.Point(20, 40),\r\n };\r\n\r\n if (selectedLabel) {\r\n selectedMarkerOptions.label = label;\r\n }\r\n\r\n if (selectedLabelOrigin) {\r\n selectedMarkerOptions.icon.labelOrigin = labelOrigin;\r\n }\r\n\r\n return { markerOptions, selectedMarkerOptions, isMapCenter };\r\n\r\n }, [svgConverter]);\r\n\r\n\r\n return createMarkerOptions;\r\n\r\n}","import { RefObject, useCallback, useMemo, useRef } from \"react\";\r\nimport { ValuesRecord } from \"../../client\";\r\n\r\n\r\nexport type GroupRecord = {\r\n recordIndex: number,\r\n recordValue: ValuesRecord\r\n}\r\n\r\nexport interface LocationGroup {\r\n locationKey: string,\r\n location: google.maps.LatLng | google.maps.LatLngLiteral,\r\n records: GroupRecord[]\r\n}\r\n\r\nexport interface RecordGroupManager {\r\n locationGroups: RefObject<LocationGroup[]>,\r\n getGroupByLocation: (location: google.maps.LatLng | google.maps.LatLngLiteral) => LocationGroup | undefined,\r\n addRecordToGroup: (location: google.maps.LatLng | google.maps.LatLngLiteral, recordIndex: number, recordValue: ValuesRecord) => LocationGroup,\r\n clearAllGroups: () => void,\r\n clearOneRecordGroups: () => void,\r\n}\r\n\r\nexport function useRecordGroupManager(): RecordGroupManager {\r\n const locationGroups = useRef<LocationGroup[]>([]);\r\n const locationMap = useRef<Map<string, LocationGroup>>(new Map());\r\n\r\n const addRecordToGroup = useCallback((location: google.maps.LatLng | google.maps.LatLngLiteral, recordIndex: number, recordValue: ValuesRecord) => {\r\n const locationKey = `${location.lat}_${location.lng}`;\r\n let group = locationMap.current.get(locationKey);\r\n if (!group) {\r\n group = { locationKey, location, records: [] };\r\n locationGroups.current.push(group);\r\n locationMap.current.set(locationKey, group);\r\n }\r\n group.records.push({ recordIndex, recordValue });\r\n return group;\r\n }, []);\r\n\r\n const getGroupByLocation = useCallback((location: google.maps.LatLng | google.maps.LatLngLiteral) => {\r\n const locationKey = `${location.lat}_${location.lng}`;\r\n return locationMap.current.get(locationKey);\r\n }, []);\r\n\r\n const clearAllGroups = useCallback(() => {\r\n locationGroups.current = [];\r\n locationMap.current.clear();\r\n }, []);\r\n\r\n const clearOneRecordGroups = useCallback(() => {\r\n locationGroups.current.forEach(group => {\r\n if (group.records.length === 1) {\r\n locationMap.current.delete(group.locationKey);\r\n }\r\n });\r\n locationGroups.current = locationGroups.current.filter(group => group.records.length > 1);\r\n }, []);\r\n\r\n const manager = useMemo<RecordGroupManager>(() => ({\r\n locationGroups,\r\n getGroupByLocation,\r\n addRecordToGroup,\r\n clearAllGroups,\r\n clearOneRecordGroups,\r\n }), [addRecordToGroup, clearAllGroups, clearOneRecordGroups, getGroupByLocation]);\r\n\r\n return manager;\r\n\r\n}","import { Group, MantineTheme, Select, SelectItem, Stack, Tabs, Text, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconGridDots, IconMap } from \"@tabler/icons-react\";\r\nimport { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { ValuesRecord } from \"../../client\";\r\nimport { Entity, EntityDefinition } from \"../../Entity\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI\";\r\nimport { FakeProgressBar, latLng, ModalContextType, useEntityUI, useExecuteView, useModal, useViewState } from \"../Core\";\r\nimport { DataGridDefaultProps, DataGridProps, DataGridToolbar } from \"../DataGrid\";\r\nimport { DataGridActionsToolbar } from \"../DataGrid/DataGridActionsToolbar\";\r\nimport { useDataGrid } from \"../DataGrid/useDatagrid\";\r\nimport { DataViewLimitData } from \"../DataView\";\r\nimport { DEFAULT_MAP_CENTER, MapOptions, MarkerProps } from \"../GoogleMaps\";\r\nimport { DefaultMapClusterProps, GoogleMapCluster, MapClusterOptions, SelectedMarkerProps } from \"../GoogleMaps/GoogleMapCluster\";\r\nimport { GoogleMapsInfoWindow } from \"../GoogleMaps/GoogleMapsInfoWindow\";\r\nimport { GridSelection } from \"../Grid\";\r\nimport { DataMapGrid } from \"./DataMapGrid\";\r\nimport { MapMarkerGroupDefaultFillColor, MapMarkerGroupDefaultLabelOrigin, MapMarkerGroupDefaultSVGIcon, useCreateMarkerOptions, UseCreateMarkerOptionsProps } from \"./useCreateMarkerOptions\";\r\nimport { LocationGroup, RecordGroupManager, useRecordGroupManager } from \"./useRecordGroupManager\";\r\n\r\n\r\nexport interface DataMapMarkerProps extends UseCreateMarkerOptionsProps {\r\n}\r\n\r\nexport interface DataMapSVGIcon {\r\n svgIcon: string,\r\n svgSelectedIcon?: string\r\n}\r\n\r\nexport type DataMapInfoWindowRenderer = (\r\n record: ValuesRecord,\r\n position: latLng,\r\n groupManager: RecordGroupManager,\r\n infoWindow: google.maps.InfoWindow,\r\n UIAPI: ReturnType<typeof useEntityUI>,\r\n theme: MantineTheme,\r\n entity: Entity<EntityDefinition>,\r\n modal: ModalContextType\r\n) => ReactNode;\r\n\r\nexport type DataMapSelectRecordsRenderer = (\r\n record: ValuesRecord,\r\n recordIndex: number,\r\n position: latLng,\r\n groupManager: RecordGroupManager,\r\n infoWindow: google.maps.InfoWindow,\r\n UIAPI: ReturnType<typeof useEntityUI>,\r\n theme: MantineTheme,\r\n entity: Entity<EntityDefinition>\r\n) => ReactNode | null;\r\n\r\nexport type DataMapMarkerRenderer = (record: ValuesRecord, position: latLng, theme: MantineTheme) => DataMapMarkerProps | null;\r\n\r\nexport type DataMapGroupMarkerRenderer = (group: LocationGroup, markerOptions: DataMapMarkerProps, theme: MantineTheme) => DataMapMarkerProps | null;\r\nexport interface DataMapProps {\r\n dataGridProps: Omit<DataGridProps, 'gridHeight'>,\r\n latitudRecordIndex: number,\r\n longitudRecordIndex: number,\r\n mapStyle?: google.maps.MapTypeStyle[],\r\n mapOptions?: google.maps.MapOptions,\r\n markerClustererOptions?: MapClusterOptions,\r\n markerRenderer?: DataMapMarkerRenderer,\r\n groupMarkerRenderer?: DataMapGroupMarkerRenderer,\r\n InfoWindowRenderer?: DataMapInfoWindowRenderer,\r\n selectRecordsRenderer?: DataMapSelectRecordsRenderer,\r\n labels?: {\r\n gridTabLabel?: string,\r\n mapTabLabel?: string,\r\n }\r\n mapHeight?: string | number,\r\n centerMarker?: DataMapMarkerProps,\r\n onDataRefresh?: () => void\r\n}\r\n\r\nexport const DataMapDefaultProps: Partial<DataMapProps> = {\r\n labels: {\r\n gridTabLabel: 'Data',\r\n mapTabLabel: 'Map',\r\n },\r\n mapStyle: [\r\n {\r\n featureType: 'poi',\r\n stylers: [{ visibility: 'off' }],\r\n },\r\n {\r\n featureType: 'transit',\r\n stylers: [{ visibility: 'off' }],\r\n },\r\n ],\r\n mapOptions: {\r\n zoom: 10,\r\n fullscreenControl: true,\r\n center: DEFAULT_MAP_CENTER,\r\n gestureHandling: 'greedy'\r\n },\r\n mapHeight: 'auto'\r\n}\r\n\r\n\r\nexport const DataMapDefaultDataGridProps: Partial<DataGridProps> = { ...DataGridDefaultProps, autoSelectFirstRow: false, renderOnlyWhenVisible: false };\r\n\r\nexport function DataMap(props: DataMapProps) {\r\n const {\r\n dataGridProps, labels: dataMapLabels,\r\n mapOptions, mapStyle, mapHeight, markerRenderer, InfoWindowRenderer,\r\n latitudRecordIndex, longitudRecordIndex, groupMarkerRenderer, selectRecordsRenderer, centerMarker\r\n } = useComponentDefaultProps('DataMap', DataMapDefaultProps, props);\r\n\r\n const effectiveDatagridProps = useComponentDefaultProps('DataGrid', DataMapDefaultDataGridProps, dataGridProps);\r\n\r\n const {\r\n search, limit, entity, parentKeys, viewName, labels,\r\n enableAdd, enableEdit, enableDelete, enableView, enableExport,\r\n autoFocus, actionsButtonVariant, toolbarIconVariant, toolbarSize,\r\n showActions, filtersFormSize, renderOnlyWhenVisible, columnsOverrides,\r\n setInitialFiltersFromColumns, visibleFilters\r\n } = effectiveDatagridProps;\r\n\r\n const theme = useMantineTheme();\r\n const modal = useModal();\r\n\r\n // infoWindow\r\n const infoWindowContentRef = useRef(document.createElement('div'));\r\n const [infoWindowContent, setInfoWindowContent] = useState<React.ReactNode>(null);\r\n\r\n // Map\r\n const googleMapsAPI = useGoogleMapsAPI();\r\n\r\n const { mapReady, placesReady, geocoderReady } = googleMapsAPI;\r\n\r\n const currentMapOptions = useMemo<MapOptions>(() => ({\r\n ...mapOptions, styles: mapStyle\r\n }), [mapOptions, mapStyle]);\r\n\r\n const [selectedMarkers, setSelectedMarkers] = useState<SelectedMarkerProps>({});\r\n\r\n // Grid\r\n\r\n //toolbar\r\n const [searchData, setSearchData] = useState<SelectItem[]>(search?.map(s => { return { value: s, label: s } }) as SelectItem[]);\r\n const [selectedRows, setSelectedRows] = useState<GridSelection>([]);\r\n\r\n const viewState = useViewState(search, limit);\r\n\r\n const executeViewState = useExecuteView(entity, parentKeys, viewName, viewState.searchText, viewState.limitRows, viewState.refresh, viewState.filterValues);\r\n\r\n const dataGridAPI = useDataGrid(effectiveDatagridProps, { executeViewState, setRefresh: viewState.setRefresh, setSearchText: viewState.setSearchText });\r\n\r\n const { isLoading, rows } = dataGridAPI;\r\n\r\n const { UIAPI } = dataGridAPI;\r\n\r\n\r\n const getMarkerOptions = useCreateMarkerOptions();\r\n\r\n const groupManager = useRecordGroupManager();\r\n\r\n const TN = {\r\n grid: 'gridTab', gridIcon: <IconGridDots size=\"1rem\" />,\r\n map: 'mapTab', mapIcon: <IconMap size=\"1rem\" />,\r\n };\r\n\r\n const effectiveColumnOverrides = useMemo(() => {\r\n if (!entity || !viewName) return undefined;\r\n return columnsOverrides ? columnsOverrides : entity.def.views[viewName].gridColumnsOverrides?.(theme);\r\n }, [columnsOverrides, entity, theme, viewName]);\r\n //\r\n\r\n\r\n // Markers handling\r\n\r\n // Default select records renderer\r\n const DefaultSelectRecordsRenderer = useCallback((record: ValuesRecord, recordIndex: number, position: latLng, groupManager: RecordGroupManager, infoWindow: google.maps.InfoWindow, UIAPI: ReturnType<typeof useEntityUI>, theme: MantineTheme) => {\r\n if (recordIndex === undefined || recordIndex === null) return;\r\n\r\n setSelectedRows((prevSelectedRows) => {\r\n const recid = recordIndex + 1;\r\n const isAlreadySelected = prevSelectedRows.some(row => row.recid === recid);\r\n\r\n if (isAlreadySelected) {\r\n return prevSelectedRows.filter(row => row.recid !== recid);\r\n } else {\r\n return [...prevSelectedRows, { ...record, recid }];\r\n }\r\n });\r\n\r\n return null;\r\n }, []);\r\n\r\n // Click handler for selection and Infowindow\r\n const effectiveInfoWindowRenderer = useMemo(() =>\r\n ((entity && viewName) ? entity.def.views[viewName].mapInfoWindowRenderer : InfoWindowRenderer)\r\n , [InfoWindowRenderer, entity, viewName]);\r\n\r\n const effectiveSelectionClickHandler = useMemo(() =>\r\n ((entity && viewName) ? entity.def.views[viewName].mapSelectRecordsRenderer : selectRecordsRenderer) ?? DefaultSelectRecordsRenderer\r\n , [DefaultSelectRecordsRenderer, entity, selectRecordsRenderer, viewName]);\r\n\r\n const getInfoWindowClickHandler = useCallback((record: ValuesRecord, recordIndex: number) => {\r\n if (!latitudRecordIndex || !longitudRecordIndex) return null;\r\n\r\n if (!record || recordIndex === undefined || recordIndex === null) return null;\r\n const position = { lat: record[latitudRecordIndex] as number, lng: record[longitudRecordIndex] as number };\r\n\r\n if (dataGridAPI.showSelectCheckbox) {\r\n if (!effectiveSelectionClickHandler) return null;\r\n const clickHandler = (infoWindow: google.maps.InfoWindow) => {\r\n return effectiveSelectionClickHandler(record, recordIndex, position, groupManager, infoWindow, UIAPI, theme, entity!);\r\n }\r\n return clickHandler;\r\n }\r\n else {\r\n if (!effectiveInfoWindowRenderer) return null;\r\n const clickHandler = (infoWindow: google.maps.InfoWindow) => {\r\n return effectiveInfoWindowRenderer(record, position, groupManager, infoWindow, UIAPI, theme, entity!, modal);\r\n\r\n }\r\n return clickHandler;\r\n }\r\n\r\n }, [UIAPI, dataGridAPI.showSelectCheckbox, effectiveInfoWindowRenderer, effectiveSelectionClickHandler, groupManager, latitudRecordIndex, longitudRecordIndex, theme]);\r\n\r\n // Group Markers\r\n const defaultGroupMarkerRenderer = useCallback((group: LocationGroup, markerOptions: DataMapMarkerProps, theme: MantineTheme) => {\r\n const markerCreateOptions = markerOptions;\r\n\r\n markerCreateOptions.svgIcon = MapMarkerGroupDefaultSVGIcon;\r\n markerCreateOptions.fillColor = MapMarkerGroupDefaultFillColor;\r\n markerCreateOptions.assignColorByValue = undefined;\r\n markerCreateOptions.title = `${group.records.length} ${DefaultMapClusterProps.labels?.locationsLabel}`;\r\n\r\n markerCreateOptions.label = { text: group.records.length.toString(), color: 'white', fontSize: '0.7rem', fontWeight: '500' }\r\n markerCreateOptions.labelOrigin = new google.maps.Point(MapMarkerGroupDefaultLabelOrigin.x, MapMarkerGroupDefaultLabelOrigin.y);\r\n\r\n return markerCreateOptions;\r\n }, []);\r\n\r\n const effectiveGroupMarkerRenderer = useMemo(() =>\r\n ((entity && viewName) ? entity.def.views[viewName].mapGroupMarkerRenderer : groupMarkerRenderer) ?? defaultGroupMarkerRenderer\r\n , [defaultGroupMarkerRenderer, entity, groupMarkerRenderer, viewName]);\r\n\r\n\r\n // newMarkers\r\n const effectiveMarkerRenderer = useMemo(() => {\r\n if (!entity || !viewName) return undefined;\r\n return entity.def.views[viewName].mapMarkerRenderer ?? markerRenderer;\r\n }, [entity, markerRenderer, viewName]);\r\n\r\n\r\n const [markers, setMarkers] = useState<MarkerProps[]>([]);\r\n\r\n useEffect(() => {\r\n if (!mapReady || !placesReady || !geocoderReady) return;\r\n if (!executeViewState.data || executeViewState.data.length === 0 || !executeViewState.data[0].records || executeViewState.data[0].records.length === 0) return;\r\n if (!effectiveGroupMarkerRenderer) return;\r\n if (!latitudRecordIndex || !longitudRecordIndex) {\r\n console.warn(`DataMap: latitudRecordIndex or longitudRecordIndex not specified in ${entity?.name} view: ${viewName}`);\r\n return;\r\n }\r\n\r\n const records = executeViewState.data[0].records;\r\n\r\n groupManager.clearAllGroups();\r\n\r\n // Get the groups and marker options\r\n const processedMarkerCreateOptions: DataMapMarkerProps[] = [];\r\n\r\n // To spiderify newMarkers with the same location. Number is the of marker rendered so far to multiply by the offset\r\n //const processedLocations: Record<string, DataMapMarkerProps & { markersCount: number }> = {};\r\n\r\n if (centerMarker) processedMarkerCreateOptions.push(centerMarker);\r\n\r\n for (let i = 0; i < records.length; i++) {\r\n const record = records[i];\r\n if (latitudRecordIndex === -1 || longitudRecordIndex === -1) continue;\r\n if (!record[latitudRecordIndex!] || !record[longitudRecordIndex!]) continue; // skip records that have no location\r\n\r\n const position = { lat: record[latitudRecordIndex] as number, lng: record[longitudRecordIndex] as number };\r\n\r\n // Ignore invalid newMarkers\r\n if (!position.lat || !position.lng) continue;\r\n\r\n const markerCreateOptions = effectiveMarkerRenderer ? effectiveMarkerRenderer(record, position, theme) : {\r\n position: position,\r\n title: `${record[0]}`,\r\n fillColor: 'red'\r\n };\r\n\r\n if (markerCreateOptions === null) continue;\r\n\r\n markerCreateOptions.recordIndex = i;\r\n groupManager.addRecordToGroup(markerCreateOptions.position, i, record);\r\n\r\n processedMarkerCreateOptions.push(markerCreateOptions);\r\n }\r\n\r\n // delete groups with only one record\r\n groupManager.clearOneRecordGroups();\r\n\r\n // Create the newMarkers\r\n const renderedGroups: { [key: string]: boolean } = {};\r\n\r\n const newMarkers: MarkerProps[] = [];\r\n for (let i = 0; i < processedMarkerCreateOptions.length; i++) {\r\n const createMarkerRecord = processedMarkerCreateOptions[i];\r\n\r\n const group = groupManager.getGroupByLocation(createMarkerRecord.position);\r\n\r\n\r\n let markerOptions: google.maps.MarkerOptions;\r\n let selectedMarkerOptions: google.maps.MarkerOptions | undefined;\r\n\r\n if (group) {\r\n // Check if the group was already rendered\r\n if (renderedGroups[group.locationKey]) continue;\r\n renderedGroups[group.locationKey] = true;\r\n\r\n const markerCreateOptions = effectiveGroupMarkerRenderer(group, createMarkerRecord, theme);\r\n\r\n if (markerCreateOptions === null) continue;\r\n\r\n const optionsResult = getMarkerOptions(markerCreateOptions);\r\n markerOptions = optionsResult.markerOptions;\r\n selectedMarkerOptions = optionsResult.selectedMarkerOptions;\r\n\r\n }\r\n else {\r\n const optionsResult = getMarkerOptions(createMarkerRecord);\r\n markerOptions = optionsResult.markerOptions;\r\n selectedMarkerOptions = optionsResult.selectedMarkerOptions;\r\n }\r\n\r\n const clickHandler = getInfoWindowClickHandler(records[createMarkerRecord.recordIndex!], createMarkerRecord.recordIndex!);\r\n if (clickHandler) markerOptions.clickable = true;\r\n\r\n newMarkers.push({\r\n markerOptions,\r\n selectedMarkerOptions,\r\n onMarkerClick: clickHandler ?? undefined,\r\n recordIndex: group ? undefined : createMarkerRecord.recordIndex,\r\n dataSetId: 'default'\r\n });\r\n\r\n }\r\n\r\n setMarkers(newMarkers);\r\n\r\n }, [executeViewState.data, latitudRecordIndex, longitudRecordIndex, dataGridAPI.showSelectCheckbox, centerMarker]);\r\n // intentionally left out mapReady, placesReady and geocoderReady dependencies to avoid re-rendering the map when the map is not ready yet\r\n\r\n // newMarkers selection\r\n useEffect(() => {\r\n\r\n if (selectedRows.length === 0) {\r\n setSelectedMarkers({});\r\n return;\r\n }\r\n\r\n const selectedRowsMap: Record<number, number> = {};\r\n selectedRows.forEach((row, index) => {\r\n selectedRowsMap[row.recid] = index;\r\n });\r\n\r\n // Filtrar y mapear los newMarkers seleccionados\r\n const currentSelection = markers.reduce((acc: SelectedMarkerProps, marker) => {\r\n if (marker.recordIndex !== undefined && selectedRowsMap[marker.recordIndex + 1] !== undefined) {\r\n const dataSetId = marker.dataSetId!;\r\n if (!acc[dataSetId]) acc[dataSetId] = {};\r\n\r\n marker.selectedMarkerOptions!.label = selectedRowsMap[marker.recordIndex + 1].toString();\r\n marker.selectedOrder = selectedRowsMap[marker.recordIndex + 1];\r\n\r\n acc[dataSetId][marker.recordIndex] = marker;\r\n }\r\n return acc;\r\n }, {});\r\n\r\n\r\n setSelectedMarkers(currentSelection);\r\n\r\n }, [selectedRows]); // intentionally left out markers dependencies to avoid re-rendering the map when the markers are not ready yet\r\n\r\n return (\r\n <>\r\n <DataGridToolbar\r\n {...labels!}\r\n\r\n enableExport={enableExport}\r\n onExportClick={dataGridAPI.handleExport}\r\n\r\n onRefreshClick={dataGridAPI.handleRefresh}\r\n onCheckboxToggle={dataGridAPI.handleToggleSelectable}\r\n autoFocus={autoFocus}\r\n toolbarIconVariant={toolbarIconVariant}\r\n size={toolbarSize}\r\n\r\n searchText={viewState.searchText}\r\n setSearchText={viewState.setSearchText}\r\n searchData={searchData}\r\n setSearchData={setSearchData}\r\n\r\n client={entity?.API.client}\r\n\r\n FiltersEntity={(entity && viewName) ? entity?.def.views[viewName].FiltersEntity : undefined}\r\n\r\n filterValues={viewState.filterValues}\r\n setFilterValues={viewState.setFilterValues}\r\n\r\n filtersDescription={viewState.filtersDescription}\r\n setFiltersDescription={viewState.setFiltersDescription}\r\n\r\n filtersFormSize={filtersFormSize!}\r\n\r\n initialColumnFilters={setInitialFiltersFromColumns && entity ? entity.def.columns : undefined}\r\n />\r\n <Tabs pt=\"xs\" defaultValue={TN.map}>\r\n <Tabs.List>\r\n <Tabs.Tab value={TN.map} icon={TN.mapIcon} >{dataMapLabels?.mapTabLabel}</Tabs.Tab>\r\n <Tabs.Tab value={TN.grid} icon={TN.gridIcon} >{dataMapLabels?.gridTabLabel}</Tabs.Tab>\r\n </Tabs.List>\r\n <Tabs.Panel value={TN.grid} pt=\"xs\">\r\n <DataMapGrid\r\n {...effectiveDatagridProps}\r\n columnsOverrides={effectiveColumnOverrides}\r\n selectedRows={selectedRows}\r\n setSelectedRows={setSelectedRows}\r\n executeViewState={executeViewState}\r\n dataGridAPI={dataGridAPI}\r\n viewState={viewState}\r\n renderOnlyWhenVisible={renderOnlyWhenVisible}\r\n gridHeight={mapHeight}\r\n formMode={effectiveDatagridProps.parentFormAPI?.formMode}\r\n />\r\n </Tabs.Panel>\r\n <Tabs.Panel value={TN.map} pt='xs'>\r\n <Stack spacing=\"sm\">\r\n <DataGridActionsToolbar\r\n {...labels!}\r\n size={toolbarSize}\r\n viewName={viewName}\r\n\r\n onAddClick={dataGridAPI.handleAddClick}\r\n onEditClick={dataGridAPI.handleEditClick}\r\n onDeleteClick={dataGridAPI.handleDeleteClick}\r\n onViewClick={dataGridAPI.handleViewClick}\r\n\r\n enableAdd={enableAdd}\r\n enableEdit={enableEdit}\r\n enableDelete={enableDelete}\r\n enableView={enableView}\r\n\r\n actionsButtonVariant={actionsButtonVariant}\r\n clientActions={entity ? entity.def.clientActions : {}}\r\n handleExecuteAction={dataGridAPI.handleExecuteAction}\r\n showActions={showActions}\r\n\r\n parentFormMode={effectiveDatagridProps.parentFormAPI?.formMode}\r\n />\r\n {mapReady && placesReady && geocoderReady &&\r\n <>\r\n {((isLoading || executeViewState.loading) && markers.length === 0) &&\r\n <FakeProgressBar size=\"xs\" />\r\n }\r\n <GoogleMapsInfoWindow container={infoWindowContentRef.current} infoWindowContent={infoWindowContent} />\r\n <GoogleMapCluster\r\n style={{ height: mapHeight === 'auto' ? '50vh' : mapHeight }}\r\n mapOptions={currentMapOptions}\r\n infoWindowContentRef={infoWindowContentRef}\r\n setInfoWindowContent={setInfoWindowContent}\r\n markers={markers}\r\n selectedMarkers={selectedMarkers}\r\n />\r\n\r\n </>\r\n }\r\n <Group>\r\n {executeViewState && !executeViewState.error &&\r\n <>\r\n <Text fz=\"sm\">{labels?.limitLabel}</Text>\r\n <Select size=\"xs\" sx={{ maxWidth: '7rem' }}\r\n data={DataViewLimitData(labels!.rowsLabel, labels!.unlimitedLabel)}\r\n value={viewState.limitRows}\r\n onChange={viewState.setLimitRows}\r\n />\r\n </>\r\n }\r\n {rows &&\r\n <Text fz=\"xs\" c=\"dimmed\">{labels?.rowsReturnedLabel} {rows.length}{dataGridAPI.selectedRowsCount ? <>, {dataGridAPI.selectedRowsCount} {labels?.selectedRowsLabel}</> : \"\"}</Text>\r\n }\r\n </Group>\r\n </Stack>\r\n </Tabs.Panel>\r\n </Tabs>\r\n\r\n </>\r\n )\r\n}","import { Accordion, Card, Stack, Text, ThemeIcon, Title, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconHelp } from \"@tabler/icons-react\";\r\nimport { ReactNode, useMemo, useRef } from \"react\";\r\nimport { MicroMClient } from \"../../client\";\r\nimport { Entity, EntityDefinition } from \"../../Entity\";\r\nimport { FormMode } from \"../Core\";\r\nimport { DataGridProps } from \"../DataGrid\";\r\nimport { DataMap, DataMapProps } from \"./DataMap\";\r\n\r\nexport interface DataMapPageProps extends Omit<DataMapProps, 'dataGridProps'> {\r\n dataGridProps: Omit<DataGridProps, 'gridHeight' | 'entity'>,\r\n title?: string,\r\n icon?: ReactNode,\r\n helpText?: string,\r\n formMode: FormMode,\r\n client: MicroMClient,\r\n entityConstructor: (client: MicroMClient) => Entity<EntityDefinition>,\r\n showTitle?: boolean\r\n}\r\n\r\nexport const DataMapPageDefaultProps: Partial<DataMapPageProps> = {\r\n showTitle: true\r\n}\r\n\r\n\r\nexport function DataMapPage(props: DataMapPageProps) {\r\n const {\r\n showTitle, entityConstructor, client, formMode, title, icon, helpText, dataGridProps, ...others\r\n } = useComponentDefaultProps('DataMapPage', props, DataMapPageDefaultProps);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const entity = useRef<Entity<EntityDefinition>>(entityConstructor(client));\r\n\r\n const EntityIcon = entity.current.Icon;\r\n\r\n const dgProps = useMemo<DataGridProps>(() => {\r\n const enableAdd = formMode === 'view' ? false : dataGridProps.enableAdd;\r\n const enableEdit = formMode === 'view' ? false : dataGridProps.enableEdit;\r\n const enableDelete = formMode === 'view' ? false : dataGridProps.enableDelete;\r\n return {\r\n ...dataGridProps,\r\n entity: entity.current,\r\n enableAdd: enableAdd,\r\n enableEdit: enableEdit,\r\n enableDelete: enableDelete,\r\n }\r\n }, [dataGridProps, formMode])\r\n\r\n return (\r\n <Stack>\r\n {showTitle &&\r\n <Accordion\r\n variant=\"filled\"\r\n chevron={<IconHelp size=\"1.5rem\" />}\r\n styles={{ item: { '&[data-active]': { backgroundColor: \"unset\" } }, label: { paddingBottom: 0, paddingTop: 0 } }}\r\n >\r\n <Accordion.Item value={entity.current.name} >\r\n <Accordion.Control icon={(icon) ? <ThemeIcon>{icon}</ThemeIcon> : (EntityIcon) ? <ThemeIcon><EntityIcon size=\"1.3rem\" /></ThemeIcon> : undefined}>\r\n <Title order={2} >{title ?? entity.current.Title}</Title>\r\n </Accordion.Control>\r\n <Accordion.Panel>\r\n <Text size=\"sm\">\r\n {helpText ?? entity.current.HelpText}\r\n </Text>\r\n </Accordion.Panel>\r\n </Accordion.Item>\r\n </Accordion>\r\n }\r\n <Card shadow=\"sm\" withBorder={theme.colorScheme === 'dark' ? false : true}>\r\n <DataMap\r\n dataGridProps={dgProps}\r\n {...others}\r\n />\r\n </Card>\r\n </Stack>\r\n );\r\n}","import { Accordion, Card, Text, ThemeIcon, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconHelp } from \"@tabler/icons-react\";\r\nimport { ReactNode, useMemo } from \"react\";\r\nimport { FormMode } from \"../Core\";\r\nimport { DataGridProps } from \"../DataGrid\";\r\nimport { DataMap, DataMapProps } from \"./DataMap\";\r\n\r\nexport interface DataMapFormProps extends DataMapProps {\r\n customTitle?: ReactNode,\r\n title?: string,\r\n icon?: ReactNode,\r\n helpText?: string,\r\n formMode: FormMode,\r\n showTitle?: boolean,\r\n}\r\n\r\nexport const DataMapFormDefaultProps: Partial<DataMapFormProps> = {\r\n showTitle: true\r\n}\r\n\r\nexport function DataMapForm(props: DataMapFormProps) {\r\n const {\r\n showTitle, formMode, title, icon, helpText, customTitle, dataGridProps, ...others\r\n } = useComponentDefaultProps('DataMapForm', props, DataMapFormDefaultProps);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const dgProps = useMemo<DataGridProps>(() => {\r\n const enableAdd = formMode === 'view' ? false : dataGridProps.enableAdd;\r\n const enableEdit = formMode === 'view' ? false : dataGridProps.enableEdit;\r\n const enableDelete = formMode === 'view' ? false : dataGridProps.enableDelete;\r\n return {\r\n ...dataGridProps,\r\n enableAdd: enableAdd,\r\n enableEdit: enableEdit,\r\n enableDelete: enableDelete,\r\n }\r\n }, [dataGridProps, formMode])\r\n\r\n const { entity } = dgProps;\r\n\r\n const EntityIcon = entity?.Icon;\r\n const IconNode = (icon) ? <ThemeIcon>{icon}</ThemeIcon> : (EntityIcon) ? <ThemeIcon><EntityIcon size=\"1rem\" /></ThemeIcon> : undefined;\r\n\r\n return (\r\n <Card shadow=\"sm\" withBorder={theme.colorScheme === 'dark' ? false : true}>\r\n {showTitle && customTitle &&\r\n <Card.Section p=\"xs\" bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]} mb=\"1rem\">\r\n {customTitle}\r\n </Card.Section>\r\n }\r\n {showTitle && !customTitle &&\r\n <Card.Section p=\"xs\" bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]} mb=\"1rem\">\r\n <Accordion\r\n variant=\"filled\"\r\n chevron={<IconHelp size=\"1rem\" />}\r\n styles={{ item: { '&[data-active]': { backgroundColor: \"unset\" } }, label: { paddingBottom: 0, paddingTop: 0 }, control: { padding: 0 } }}\r\n >\r\n <Accordion.Item value={entity?.name ?? 'dmfEntity'} >\r\n <Accordion.Control icon={IconNode}>\r\n <Text size=\"sm\">{title ?? entity?.Title}</Text>\r\n </Accordion.Control>\r\n <Accordion.Panel>\r\n <Text size=\"xs\">\r\n {helpText ?? entity?.HelpText}\r\n </Text>\r\n </Accordion.Panel>\r\n </Accordion.Item>\r\n </Accordion>\r\n </Card.Section>\r\n }\r\n <DataMap\r\n dataGridProps={dgProps}\r\n {...others}\r\n />\r\n </Card>\r\n );\r\n}","import { ActionIcon, Box, Button, Group, Menu, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconEye, IconEyeOff, IconSettingsPin } from \"@tabler/icons-react\";\r\nimport { useRef } from \"react\";\r\nimport { EntityClientAction } from \"../../Entity\";\r\nimport { ActionIconVariant, ButtonVariant, FormMode } from \"../Core\";\r\nimport { DataGridToolbarSizes } from \"../DataGrid\";\r\nimport { getToolbarSizes } from \"../DataGrid/ToolBarFunctions\";\r\nimport { useMultiDataMapGrid } from \"./useMultiDataMapGrid\";\r\n\r\nexport interface MultiDataMapActionsToolbarProps {\r\n showMapConfig?: boolean,\r\n clientActions?: Record<string, EntityClientAction>,\r\n parentFormMode?: FormMode,\r\n data1?: ReturnType<typeof useMultiDataMapGrid>,\r\n data2?: ReturnType<typeof useMultiDataMapGrid>,\r\n data3?: ReturnType<typeof useMultiDataMapGrid>,\r\n data4?: ReturnType<typeof useMultiDataMapGrid>,\r\n data5?: ReturnType<typeof useMultiDataMapGrid>,\r\n configMenuTitle?: string,\r\n size?: DataGridToolbarSizes,\r\n toolbarIconVariant?: ActionIconVariant,\r\n actionsButtonVariant?: ButtonVariant,\r\n \r\n}\r\n\r\nexport const MultiDataMapActionsToolbarDefaultProps: Partial<MultiDataMapActionsToolbarProps> = {\r\n showMapConfig: true,\r\n configMenuTitle: 'Map Config',\r\n size: \"sm\",\r\n toolbarIconVariant: \"light\",\r\n actionsButtonVariant: \"light\",\r\n \r\n}\r\n\r\nexport function MultiDataMapActionsToolbar(props: MultiDataMapActionsToolbarProps) {\r\n const {\r\n showMapConfig, data1, data2, data3, data4, data5, configMenuTitle, size, toolbarIconVariant, parentFormMode,\r\n actionsButtonVariant\r\n } = useComponentDefaultProps('MultiDataMapActionsToolbar', MultiDataMapActionsToolbarDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n const { buttonsSize, actionIconSize, iconsSize } = getToolbarSizes(size!);\r\n\r\n const actionElements = useRef<(HTMLButtonElement | null)[]>([]);\r\n\r\n return (\r\n <Box>\r\n <Group>\r\n {data1?.showOnMap && data1.dgProps.entity && data1.dgProps.showActions && data1.dgProps.entity.def.clientActions &&\r\n Object.values(data1.dgProps.entity.def.clientActions).map(\r\n (action, index) => {\r\n if (parentFormMode === 'view' && !action.showActionInViewMode) return null;\r\n if (data1.dgProps.viewName && action.views && !action.views.includes(data1.dgProps.viewName)) return null;\r\n return (\r\n <Button leftIcon={action.icon} key={action.name} ref={(el) => (actionElements.current[index] = el)} size={buttonsSize} variant={actionsButtonVariant} onClick={() => data1.dataGridAPI.handleExecuteAction(action, undefined, actionElements.current[index] ?? undefined)}>{action.label}</Button>\r\n )\r\n }\r\n )\r\n }\r\n {data2?.showOnMap && data2.dgProps.entity && data2.dgProps.showActions && data2.dgProps.entity.def.clientActions &&\r\n Object.values(data2.dgProps.entity.def.clientActions).map(\r\n (action, index) => {\r\n if (parentFormMode === 'view' && !action.showActionInViewMode) return null;\r\n if (data2.dgProps.viewName && action.views && !action.views.includes(data2.dgProps.viewName)) return null;\r\n return (\r\n <Button leftIcon={action.icon} key={action.name} ref={(el) => (actionElements.current[index] = el)} size={buttonsSize} variant={actionsButtonVariant} onClick={() => data2.dataGridAPI.handleExecuteAction(action, undefined, actionElements.current[index] ?? undefined)}>{action.label}</Button>\r\n )\r\n }\r\n )\r\n }\r\n {data3?.showOnMap && data3.dgProps.entity && data3.dgProps.showActions && data3.dgProps.entity.def.clientActions &&\r\n Object.values(data3.dgProps.entity.def.clientActions).map(\r\n (action, index) => {\r\n if (parentFormMode === 'view' && !action.showActionInViewMode) return null;\r\n if (data3.dgProps.viewName && action.views && !action.views.includes(data3.dgProps.viewName)) return null;\r\n return (\r\n <Button leftIcon={action.icon} key={action.name} ref={(el) => (actionElements.current[index] = el)} size={buttonsSize} variant={actionsButtonVariant} onClick={() => data3.dataGridAPI.handleExecuteAction(action, undefined, actionElements.current[index] ?? undefined)}>{action.label}</Button>\r\n )\r\n }\r\n )\r\n }\r\n {data4?.showOnMap && data4.dgProps.entity && data4.dgProps.showActions && data4.dgProps.entity.def.clientActions &&\r\n Object.values(data4.dgProps.entity.def.clientActions).map(\r\n (action, index) => {\r\n if (parentFormMode === 'view' && !action.showActionInViewMode) return null;\r\n if (data4.dgProps.viewName && action.views && !action.views.includes(data4.dgProps.viewName)) return null;\r\n return (\r\n <Button leftIcon={action.icon} key={action.name} ref={(el) => (actionElements.current[index] = el)} size={buttonsSize} variant={actionsButtonVariant} onClick={() => data4.dataGridAPI.handleExecuteAction(action, undefined, actionElements.current[index] ?? undefined)}>{action.label}</Button>\r\n )\r\n }\r\n )\r\n }\r\n {data5?.showOnMap && data5.dgProps.entity && data5.dgProps.showActions && data5.dgProps.entity.def.clientActions &&\r\n Object.values(data5.dgProps.entity.def.clientActions).map(\r\n (action, index) => {\r\n if (parentFormMode === 'view' && !action.showActionInViewMode) return null;\r\n if (data5.dgProps.viewName && action.views && !action.views.includes(data5.dgProps.viewName)) return null;\r\n return (\r\n <Button leftIcon={action.icon} key={action.name} ref={(el) => (actionElements.current[index] = el)} size={buttonsSize} variant={actionsButtonVariant} onClick={() => data5.dataGridAPI.handleExecuteAction(action, undefined, actionElements.current[index] ?? undefined)}>{action.label}</Button>\r\n )\r\n }\r\n )\r\n }\r\n {showMapConfig &&\r\n <Menu>\r\n <Menu.Target>\r\n <ActionIcon\r\n title={configMenuTitle}\r\n ml=\"auto\"\r\n size={actionIconSize}\r\n radius=\"xl\"\r\n color={theme.primaryColor}\r\n variant={toolbarIconVariant} >\r\n <IconSettingsPin size={iconsSize} stroke=\"1.5\" />\r\n </ActionIcon>\r\n </Menu.Target>\r\n <Menu.Dropdown>\r\n {data1?.dgProps.entity &&\r\n <Menu.Item\r\n icon={data1.showOnMap ? <IconEye size=\"1rem\" /> : <IconEyeOff size=\"1rem\" />}\r\n onClick={() => data1.setShowOnMap((prev) => prev = !prev)}\r\n >\r\n {data1.dgProps.tabLabel}\r\n </Menu.Item>\r\n }\r\n {data2?.dgProps.entity &&\r\n <Menu.Item\r\n icon={data2.showOnMap ? <IconEye size=\"1rem\" /> : <IconEyeOff size=\"1rem\" />}\r\n onClick={() => data2.setShowOnMap((prev) => prev = !prev)}\r\n >\r\n {data2.dgProps.tabLabel}\r\n </Menu.Item>\r\n }\r\n {data3?.dgProps.entity &&\r\n <Menu.Item\r\n icon={data3.showOnMap ? <IconEye size=\"1rem\" /> : <IconEyeOff size=\"1rem\" />}\r\n onClick={() => data3.setShowOnMap((prev) => prev = !prev)}\r\n >\r\n {data3.dgProps.tabLabel}\r\n </Menu.Item>\r\n }\r\n {data4?.dgProps.entity &&\r\n <Menu.Item\r\n icon={data4.showOnMap ? <IconEye size=\"1rem\" /> : <IconEyeOff size=\"1rem\" />}\r\n onClick={() => data4.setShowOnMap((prev) => prev = !prev)}\r\n >\r\n {data4.dgProps.tabLabel}\r\n </Menu.Item>\r\n }\r\n {data5?.dgProps.entity &&\r\n <Menu.Item\r\n icon={data5.showOnMap ? <IconEye size=\"1rem\" /> : <IconEyeOff size=\"1rem\" />}\r\n onClick={() => data5.setShowOnMap((prev) => prev = !prev)}\r\n >\r\n {data5.dgProps.tabLabel}\r\n </Menu.Item>\r\n }\r\n </Menu.Dropdown>\r\n </Menu>\r\n }\r\n </Group>\r\n </Box>\r\n );\r\n}","import { MantineTheme, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { ValuesRecord } from \"../../client\";\r\nimport { latLng, useEntityUI, useExecuteView, useModal, useViewState } from \"../Core\";\r\nimport { useDataGrid } from \"../DataGrid/useDatagrid\";\r\nimport { DataMapMarkerProps } from \"../DataMap\";\r\nimport { DataMapDefaultDataGridProps } from \"../DataMap/DataMap\";\r\nimport { MapMarkerGroupDefaultFillColor, MapMarkerGroupDefaultLabelOrigin, MapMarkerGroupDefaultSVGIcon, useCreateMarkerOptions } from \"../DataMap/useCreateMarkerOptions\";\r\nimport { LocationGroup, RecordGroupManager, useRecordGroupManager } from \"../DataMap/useRecordGroupManager\";\r\nimport { DefaultMapClusterProps, MarkerProps, SelectedMarkerProps } from \"../GoogleMaps\";\r\nimport { GridSelection, GridSelectionMode } from \"../Grid\";\r\nimport { MultiDataMapViewProps } from \"./MultiDataMap\";\r\n\r\nexport interface UseMultiDataMapGridProps {\r\n dataMapView: MultiDataMapViewProps,\r\n viewState: ReturnType<typeof useViewState>,\r\n selectionMode?: GridSelectionMode,\r\n mapReady: boolean,\r\n placesReady: boolean,\r\n geocoderReady: boolean,\r\n clearSelectionOnActionExecuted?: boolean\r\n}\r\nexport function useMultiDataMapGrid({\r\n dataMapView, viewState, selectionMode, mapReady, placesReady, geocoderReady, clearSelectionOnActionExecuted\r\n}: UseMultiDataMapGridProps) {\r\n const theme = useMantineTheme();\r\n const modal = useModal();\r\n\r\n const [selectedRows, setSelectedRows] = useState<GridSelection>([]);\r\n const [selectedMarkers, setSelectedMarkers] = useState<SelectedMarkerProps>({});\r\n const [showOnMap, setShowOnMap] = useState(true);\r\n\r\n const defaultProps = useComponentDefaultProps('MultiDataMapView', DataMapDefaultDataGridProps, dataMapView);\r\n\r\n // Handler for clearingSelection after executing an action\r\n const handleActionExecuted = useCallback((actionName: string, result?: boolean) => {\r\n if (defaultProps.onActionExecuted) defaultProps.onActionExecuted(actionName, result);\r\n if (clearSelectionOnActionExecuted) if (result) setSelectedRows([]);\r\n }, [clearSelectionOnActionExecuted, defaultProps]);\r\n\r\n const dgProps = useMemo(() => ({ ...defaultProps, onActionExecuted: handleActionExecuted, selectionMode: selectionMode || 'multi' }), [defaultProps, handleActionExecuted, selectionMode]);\r\n\r\n const {\r\n entity, viewName, columnsOverrides,\r\n latitudRecordIndex, longitudRecordIndex,\r\n markerRenderer, InfoWindowRenderer, groupMarkerRenderer, selectRecordsRenderer, parentKeys, centerMarkerColumnIndex\r\n } = dgProps;\r\n\r\n const groupManager = useRecordGroupManager();\r\n\r\n const { searchText, limitRows, refresh, filterValues } = viewState;\r\n const executeViewState = useExecuteView(entity, parentKeys, viewName, searchText, limitRows, refresh, filterValues);\r\n\r\n const dataGridAPI = useDataGrid(dgProps, { executeViewState, setRefresh: viewState.setRefresh, setSearchText: viewState.setSearchText });\r\n\r\n const actualColumnsOverrides = useMemo(() => {\r\n if (!entity || !viewName) {\r\n if (!viewName && entity) console.warn(`MultiDataMapView: viewName not specified for ${entity?.name}`);\r\n return undefined;\r\n }\r\n return columnsOverrides ? columnsOverrides : entity.def.views[viewName].gridColumnsOverrides?.(theme);\r\n }, [columnsOverrides, entity, theme, viewName]);\r\n\r\n const getMarkerOptions = useCreateMarkerOptions();\r\n\r\n // Default selected records renderer\r\n const DefaultSelectRecordsRenderer = useCallback((record: ValuesRecord, recordIndex: number, position: latLng, groupManager: RecordGroupManager, infoWindow: google.maps.InfoWindow, UIAPI: ReturnType<typeof useEntityUI>, theme: MantineTheme) => {\r\n if (recordIndex === undefined || recordIndex === null) return;\r\n\r\n setSelectedRows((prevSelectedRows) => {\r\n const recid = recordIndex + 1;\r\n\r\n const isAlreadySelected = prevSelectedRows.some(row => row.recid === recid);\r\n\r\n if (isAlreadySelected) {\r\n return prevSelectedRows.filter(row => row.recid !== recid);\r\n } else {\r\n return [...prevSelectedRows, { ...record, recid }];\r\n }\r\n\r\n\r\n });\r\n\r\n return null;\r\n }, [setSelectedRows]);\r\n\r\n // Click handler for selection and Infowindow\r\n const actualInfoWindowRenderer = useMemo(() =>\r\n ((entity && viewName) ? entity.def.views[viewName].mapInfoWindowRenderer : InfoWindowRenderer)\r\n , [InfoWindowRenderer, entity, viewName]);\r\n\r\n const actualSelectionClickHandler = useMemo(() =>\r\n ((entity && viewName) ? entity.def.views[viewName].mapSelectRecordsRenderer : selectRecordsRenderer) ?? DefaultSelectRecordsRenderer\r\n , [entity, viewName, selectRecordsRenderer, DefaultSelectRecordsRenderer]);\r\n\r\n // InfoWindow Click handler\r\n const getInfoWindowClickHandler = useCallback((dataSetId: string, record: ValuesRecord, recordIndex: number) => {\r\n if (!latitudRecordIndex || !longitudRecordIndex) return null;\r\n\r\n const position = { lat: record[latitudRecordIndex] as number, lng: record[longitudRecordIndex] as number };\r\n\r\n if (dataGridAPI.showSelectCheckbox) {\r\n if (!actualSelectionClickHandler) return null;\r\n const clickHandler = (infoWindow: google.maps.InfoWindow) => {\r\n return actualSelectionClickHandler(record, recordIndex, position, groupManager, infoWindow, dataGridAPI.UIAPI, theme, entity!);\r\n }\r\n return clickHandler;\r\n }\r\n else {\r\n if (!actualInfoWindowRenderer) return null;\r\n const clickHandler = (infoWindow: google.maps.InfoWindow) => {\r\n return actualInfoWindowRenderer(record, position, groupManager, infoWindow, dataGridAPI.UIAPI, theme, entity!, modal);\r\n\r\n }\r\n return clickHandler;\r\n }\r\n\r\n }, [actualInfoWindowRenderer, actualSelectionClickHandler, dataGridAPI.UIAPI, dataGridAPI.showSelectCheckbox, groupManager, latitudRecordIndex, longitudRecordIndex, theme, modal]);\r\n\r\n // Group Markers\r\n const defaultGroupMarkerRenderer = useCallback((group: LocationGroup, markerOptions: DataMapMarkerProps, theme: MantineTheme) => {\r\n const markerCreateOptions = markerOptions;\r\n\r\n markerCreateOptions.svgIcon = MapMarkerGroupDefaultSVGIcon;\r\n markerCreateOptions.fillColor = MapMarkerGroupDefaultFillColor;\r\n markerCreateOptions.assignColorByValue = undefined;\r\n markerCreateOptions.title = `${group.records.length} ${DefaultMapClusterProps.labels?.locationsLabel}`;\r\n\r\n markerCreateOptions.label = { text: group.records.length.toString(), color: 'white', fontSize: '0.7rem', fontWeight: '500' }\r\n markerCreateOptions.labelOrigin = new google.maps.Point(MapMarkerGroupDefaultLabelOrigin.x, MapMarkerGroupDefaultLabelOrigin.y);\r\n\r\n return markerCreateOptions;\r\n }, []);\r\n\r\n const actualGroupMarkerRenderer = useMemo(() => {\r\n if (entity && viewName) {\r\n return entity.def.views[viewName]?.mapGroupMarkerRenderer ?? groupMarkerRenderer ?? defaultGroupMarkerRenderer;\r\n }\r\n return groupMarkerRenderer ?? defaultGroupMarkerRenderer;\r\n }, [defaultGroupMarkerRenderer, entity, groupMarkerRenderer, viewName]);\r\n\r\n // Marker renderer\r\n const actualMarkerRenderer = useMemo(() => {\r\n if (!entity || !viewName) return undefined;\r\n return entity.def.views[viewName].mapMarkerRenderer ?? markerRenderer;\r\n }, [entity, markerRenderer, viewName]);\r\n\r\n\r\n const [centerMarker, setCenterMarker] = useState<MarkerProps | undefined>(undefined);\r\n const [markers, setMarkers] = useState<MarkerProps[]>([]);\r\n\r\n useEffect(() => {\r\n if (!viewName) return;\r\n if (!showOnMap) {\r\n setMarkers([]);\r\n return;\r\n };\r\n if (!mapReady || !placesReady || !geocoderReady) return;\r\n if (!actualGroupMarkerRenderer) return;\r\n if (!latitudRecordIndex || !longitudRecordIndex) {\r\n console.warn(`MultiDataMapView: latitudRecordIndex or longitudRecordIndex not specified in ${entity?.name} view: ${viewName}`);\r\n return;\r\n }\r\n\r\n if (!executeViewState.data || executeViewState.data.length === 0 || !executeViewState.data[0].records || executeViewState.data[0].records.length === 0) {\r\n groupManager.clearAllGroups();\r\n setMarkers([]);\r\n return;\r\n }\r\n\r\n const records = executeViewState.data[0].records;\r\n\r\n groupManager.clearAllGroups();\r\n\r\n // Get the groups and marker options\r\n const processedMarkerCreateOptions: DataMapMarkerProps[] = [];\r\n\r\n for (let i = 0; i < records.length; i++) {\r\n const record = records[i];\r\n\r\n if (!record[latitudRecordIndex!] || !record[longitudRecordIndex!]) continue; // skip records that have no location\r\n\r\n const position = { lat: record[latitudRecordIndex!] as number, lng: record[longitudRecordIndex!] as number };\r\n\r\n const markerCreateOptions = actualMarkerRenderer ? actualMarkerRenderer(record, position, theme) : {\r\n position: position,\r\n title: `${record[0]}`,\r\n fillColor: 'red'\r\n };\r\n\r\n if (markerCreateOptions === null) continue;\r\n\r\n markerCreateOptions.dataSetId = dataMapView.dataSetId;\r\n markerCreateOptions.recordIndex = i;\r\n markerCreateOptions.isMapCenter = (centerMarkerColumnIndex && record[centerMarkerColumnIndex]) ? true : undefined;\r\n\r\n groupManager.addRecordToGroup(markerCreateOptions.position, i, record);\r\n\r\n processedMarkerCreateOptions.push(markerCreateOptions);\r\n }\r\n\r\n // delete groups with only one record\r\n groupManager.clearOneRecordGroups();\r\n\r\n // Create the newMarkers\r\n const renderedGroups: { [key: string]: boolean } = {};\r\n\r\n const newMarkers: MarkerProps[] = [];\r\n for (let i = 0; i < processedMarkerCreateOptions.length; i++) {\r\n const createMarkerRecord = processedMarkerCreateOptions[i];\r\n\r\n const group = groupManager.getGroupByLocation(createMarkerRecord.position);\r\n\r\n\r\n let markerOptions: google.maps.MarkerOptions;\r\n let selectedMarkerOptions: google.maps.MarkerOptions | undefined;\r\n\r\n if (group) {\r\n // Check if the group was already rendered\r\n if (renderedGroups[group.locationKey]) continue;\r\n renderedGroups[group.locationKey] = true;\r\n\r\n const markerCreateOptions = actualGroupMarkerRenderer(group, createMarkerRecord, theme);\r\n\r\n if (markerCreateOptions === null) continue;\r\n\r\n const optionsResult = getMarkerOptions(markerCreateOptions);\r\n markerOptions = optionsResult.markerOptions;\r\n selectedMarkerOptions = optionsResult.selectedMarkerOptions;\r\n\r\n }\r\n else {\r\n const optionsResult = getMarkerOptions(createMarkerRecord);\r\n markerOptions = optionsResult.markerOptions;\r\n selectedMarkerOptions = optionsResult.selectedMarkerOptions;\r\n }\r\n\r\n const clickHandler = getInfoWindowClickHandler(dataMapView.dataSetId!, records[createMarkerRecord.recordIndex!], createMarkerRecord.recordIndex!);\r\n if (clickHandler) markerOptions.clickable = true;\r\n\r\n if (createMarkerRecord.isMapCenter) setCenterMarker({ markerOptions, selectedMarkerOptions });\r\n\r\n newMarkers.push({\r\n markerOptions,\r\n selectedMarkerOptions,\r\n onMarkerClick: clickHandler ?? undefined,\r\n recordIndex: group ? undefined : createMarkerRecord.recordIndex,\r\n dataSetId: dataMapView.dataSetId ?? dataMapView.tabLabel ?? dataMapView.viewName,\r\n isMapCenter: createMarkerRecord.isMapCenter\r\n });\r\n }\r\n\r\n setMarkers(newMarkers);\r\n\r\n }, [executeViewState.data, latitudRecordIndex, longitudRecordIndex, dataGridAPI.showSelectCheckbox, showOnMap, mapReady, placesReady, geocoderReady, centerMarkerColumnIndex, viewName]);\r\n\r\n\r\n // newMarkers selection\r\n useEffect(() => {\r\n\r\n if (selectedRows.length === 0) {\r\n setSelectedMarkers({});\r\n return;\r\n }\r\n\r\n const selectedRowsMap: Record<number, number> = {};\r\n selectedRows.forEach((row, index) => {\r\n selectedRowsMap[row.recid] = index;\r\n });\r\n\r\n // Filtrar y mapear los newMarkers seleccionados\r\n const currentSelection = markers.reduce((acc: SelectedMarkerProps, marker) => {\r\n if (marker.recordIndex !== undefined && selectedRowsMap[marker.recordIndex + 1] !== undefined) {\r\n const dataSetId = marker.dataSetId!;\r\n if (!acc[dataSetId]) acc[dataSetId] = {};\r\n\r\n marker.selectedMarkerOptions!.label = selectedRowsMap[marker.recordIndex + 1].toString();\r\n marker.selectedOrder = selectedRowsMap[marker.recordIndex + 1];\r\n\r\n acc[dataSetId][marker.recordIndex] = marker;\r\n }\r\n return acc;\r\n }, {} as SelectedMarkerProps);\r\n\r\n setSelectedMarkers(currentSelection);\r\n\r\n }, [selectedRows]); // el resto de las dependencias está intencionalmente dejado fuera\r\n\r\n return {\r\n dgProps,\r\n viewState,\r\n executeViewState,\r\n dataGridAPI,\r\n actualColumnsOverrides,\r\n //actualInfoWindowRenderer,\r\n actualSelectionClickHandler,\r\n selectedRows,\r\n setSelectedRows,\r\n getInfoWindowClickHandler,\r\n //actualGroupMarkerRenderer,\r\n //actualMarkerRenderer,\r\n markers: markers,\r\n selectedMarkers,\r\n showOnMap,\r\n setShowOnMap,\r\n centerMarker\r\n }\r\n}","import { MantineNumberSize, SelectItem, Stack, Tabs, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconMap, IconProps } from \"@tabler/icons-react\";\r\nimport { ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI\";\r\nimport { ActionIconVariant, FakeProgressBar, FormMode, useViewState } from \"../Core\";\r\nimport { DataGridProps, DataGridToolbar, DataGridToolbarSizes } from \"../DataGrid\";\r\nimport { DataMapGroupMarkerRenderer, DataMapInfoWindowRenderer, DataMapMarkerRenderer, DataMapSelectRecordsRenderer, useCreateMarkerOptions } from \"../DataMap\";\r\nimport { DataMapDefaultDataGridProps, DataMapMarkerProps } from \"../DataMap/DataMap\";\r\nimport { DataMapGrid } from \"../DataMap/DataMapGrid\";\r\nimport { DataViewLimit } from \"../DataView\";\r\nimport { DEFAULT_MAP_CENTER, MapOptions, MarkerProps } from \"../GoogleMaps\";\r\nimport { GoogleMapCluster, MapClusterOptions, SelectedMarkerProps } from \"../GoogleMaps/GoogleMapCluster\";\r\nimport { GoogleMapsInfoWindow } from \"../GoogleMaps/GoogleMapsInfoWindow\";\r\nimport { GridSelectionMode } from \"../Grid\";\r\nimport { MultiDataMapActionsToolbar } from \"./MultiDataMapActionsToolbar\";\r\nimport { useMultiDataMapGrid } from \"./useMultiDataMapGrid\";\r\n\r\nexport interface MultiDataMapViewProps extends Omit<DataGridProps, 'gridHeight' | 'selectionMode' | 'enableExport' | 'autoFocus' | 'toolbarIconVariant' | 'toolbarSize' | 'filtersFormSize' | 'parentFormAPI'> {\r\n latitudRecordIndex?: number,\r\n longitudRecordIndex?: number,\r\n dataSetId?: string,\r\n tabLabel?: string,\r\n tabIcon?: (props: IconProps) => ReactNode,\r\n InfoWindowRenderer?: DataMapInfoWindowRenderer,\r\n selectRecordsRenderer?: DataMapSelectRecordsRenderer,\r\n markerRenderer?: DataMapMarkerRenderer,\r\n groupMarkerRenderer?: DataMapGroupMarkerRenderer,\r\n centerMarkerColumnIndex?: number, // Column index on the recordset to get the center marker, if it has any value, it will be used as the center marker\r\n}\r\n\r\nexport interface MultiDataMapProps {\r\n dataMapView1: MultiDataMapViewProps,\r\n dataMapView2?: MultiDataMapViewProps,\r\n dataMapView3?: MultiDataMapViewProps,\r\n dataMapView4?: MultiDataMapViewProps,\r\n dataMapView5?: MultiDataMapViewProps,\r\n\r\n search?: string[],\r\n limit?: DataViewLimit,\r\n enableExport?: boolean,\r\n autoFocus?: boolean,\r\n toolbarIconVariant?: ActionIconVariant,\r\n toolbarSize?: DataGridToolbarSizes,\r\n filtersFormSize?: MantineNumberSize,\r\n selectionMode?: GridSelectionMode,\r\n\r\n mapStyle?: google.maps.MapTypeStyle[],\r\n mapOptions?: google.maps.MapOptions,\r\n markerClustererOptions?: MapClusterOptions,\r\n labels?: {\r\n mapTabLabel?: string,\r\n }\r\n mapHeight?: string | number,\r\n\r\n centerMarker?: DataMapMarkerProps,\r\n\r\n onDataRefresh?: () => void,\r\n clearSelectionOnActionExecuted?: boolean\r\n formMode?: FormMode\r\n}\r\n\r\nexport const MultiDataMapDefaultProps: Partial<MultiDataMapProps> = {\r\n dataMapView2: DataMapDefaultDataGridProps,\r\n dataMapView3: DataMapDefaultDataGridProps,\r\n dataMapView4: DataMapDefaultDataGridProps,\r\n dataMapView5: DataMapDefaultDataGridProps,\r\n labels: {\r\n mapTabLabel: 'Map',\r\n },\r\n mapStyle: [\r\n {\r\n featureType: 'poi',\r\n stylers: [{ visibility: 'off' }],\r\n },\r\n {\r\n featureType: 'transit',\r\n stylers: [{ visibility: 'off' }],\r\n },\r\n ],\r\n mapOptions: {\r\n zoom: 10,\r\n fullscreenControl: true,\r\n center: DEFAULT_MAP_CENTER,\r\n gestureHandling: 'greedy'\r\n },\r\n mapHeight: 'auto',\r\n\r\n enableExport: true,\r\n selectionMode: 'multi',\r\n search: [],\r\n limit: \"10000\",\r\n toolbarIconVariant: \"light\",\r\n filtersFormSize: \"md\",\r\n clearSelectionOnActionExecuted: true\r\n}\r\n\r\nexport function MultiDataMap(props: MultiDataMapProps) {\r\n const {\r\n dataMapView1, dataMapView2, dataMapView3, dataMapView4, dataMapView5,\r\n labels: dataMapLabels, search, limit, enableExport, autoFocus, toolbarIconVariant, toolbarSize, filtersFormSize, selectionMode,\r\n mapOptions, mapStyle, mapHeight, centerMarker, clearSelectionOnActionExecuted, formMode\r\n } = useComponentDefaultProps('MultiDataMap', MultiDataMapDefaultProps, props);\r\n\r\n const theme = useMantineTheme();\r\n\r\n // Map\r\n const googleMapsAPI = useGoogleMapsAPI();\r\n\r\n // infoWindow\r\n const infoWindowContentRef = useRef(document.createElement('div'));\r\n const [infoWindowContent, setInfoWindowContent] = useState<React.ReactNode>(null);\r\n\r\n const { mapReady, placesReady, geocoderReady } = googleMapsAPI;\r\n\r\n const currentMapOptionsRef = useRef<MapOptions>({ ...mapOptions, styles: mapStyle });\r\n\r\n // Multidatamap selected markers\r\n const [selectedMarkers, setSelectedMarkers] = useState<SelectedMarkerProps>({});\r\n\r\n // Common grid properties\r\n\r\n //toolbar\r\n const [searchData, setSearchData] = useState<SelectItem[]>(search?.map(s => { return { value: s, label: s } }) as SelectItem[]);\r\n\r\n // TODO: add support for setInitialFiltersFromColumns\r\n const viewState = useViewState(search, limit);\r\n\r\n // Grids\r\n // \r\n\r\n const data1 = useMultiDataMapGrid({ dataMapView: dataMapView1, viewState, mapReady, geocoderReady, placesReady, clearSelectionOnActionExecuted });\r\n const data2 = useMultiDataMapGrid({ dataMapView: dataMapView2!, viewState, mapReady, geocoderReady, placesReady, clearSelectionOnActionExecuted });\r\n const data3 = useMultiDataMapGrid({ dataMapView: dataMapView3!, viewState, mapReady, geocoderReady, placesReady, clearSelectionOnActionExecuted });\r\n const data4 = useMultiDataMapGrid({ dataMapView: dataMapView4!, viewState, mapReady, geocoderReady, placesReady, clearSelectionOnActionExecuted });\r\n const data5 = useMultiDataMapGrid({ dataMapView: dataMapView5!, viewState, mapReady, geocoderReady, placesReady, clearSelectionOnActionExecuted });\r\n\r\n const IconData1 = data1.dgProps.tabIcon ?? data1.dgProps.entity?.Icon;\r\n const IconData2 = data2.dgProps.tabIcon ?? data2.dgProps.entity?.Icon;\r\n const IconData3 = data3.dgProps.tabIcon ?? data3.dgProps.entity?.Icon;\r\n const IconData4 = data4.dgProps.tabIcon ?? data4.dgProps.entity?.Icon;\r\n const IconData5 = data5.dgProps.tabIcon ?? data5.dgProps.entity?.Icon;\r\n\r\n const TN = {\r\n map: 'mapTab', mapIcon: <IconMap size=\"1rem\" />,\r\n tab1: 'mapTab1', tab1Icon: IconData1 ? <IconData1 size=\"1rem\" /> : null,\r\n tab2: 'mapTab2', tab2Icon: IconData2 ? <IconData2 size=\"1rem\" /> : null,\r\n tab3: 'mapTab3', tab3Icon: IconData3 ? <IconData3 size=\"1rem\" /> : null,\r\n tab4: 'mapTab4', tab4Icon: IconData4 ? <IconData4 size=\"1rem\" /> : null,\r\n tab5: 'mapTab5', tab5Icon: IconData5 ? <IconData5 size=\"1rem\" /> : null,\r\n };\r\n\r\n\r\n //\r\n\r\n const handleExport = useCallback(() => {\r\n if (data1.dgProps.entity) {\r\n data1.dataGridAPI.handleExport();\r\n }\r\n if (data2.dgProps.entity) {\r\n data2.dataGridAPI.handleExport();\r\n }\r\n if (data3.dgProps.entity) {\r\n data3.dataGridAPI.handleExport();\r\n }\r\n if (data4.dgProps.entity) {\r\n data4.dataGridAPI.handleExport();\r\n }\r\n if (data5.dgProps.entity) {\r\n data5.dataGridAPI.handleExport();\r\n }\r\n }, [data1.dataGridAPI, data1.dgProps.entity, data2.dataGridAPI, data2.dgProps.entity, data3.dataGridAPI, data3.dgProps.entity, data4.dataGridAPI, data4.dgProps.entity, data5.dataGridAPI, data5.dgProps.entity]);\r\n\r\n const handleRefresh = useCallback(() => {\r\n viewState.setRefresh((prev) => !prev);\r\n }, [viewState]);\r\n\r\n const handleToggleSelectable = useCallback(() => {\r\n if (data1.dgProps.entity) {\r\n data1.dataGridAPI.handleToggleSelectable();\r\n }\r\n if (data2.dgProps.entity) {\r\n data2.dataGridAPI.handleToggleSelectable();\r\n }\r\n if (data3.dgProps.entity) {\r\n data3.dataGridAPI.handleToggleSelectable();\r\n }\r\n if (data4.dgProps.entity) {\r\n data4.dataGridAPI.handleToggleSelectable();\r\n }\r\n if (data5.dgProps.entity) {\r\n data5.dataGridAPI.handleToggleSelectable();\r\n }\r\n }, [\r\n data1.dataGridAPI,\r\n data1.dgProps.entity,\r\n data2.dataGridAPI,\r\n data2.dgProps.entity,\r\n data3.dataGridAPI,\r\n data3.dgProps.entity,\r\n data4.dataGridAPI,\r\n data4.dgProps.entity,\r\n data5.dataGridAPI,\r\n data5.dgProps.entity,\r\n ]);\r\n\r\n\r\n // Effect for currentMapOptions\r\n useEffect(() => {\r\n currentMapOptionsRef.current = { ...mapOptions, styles: mapStyle };\r\n }, [mapOptions, mapStyle, centerMarker]);\r\n\r\n const getMarkerOptions = useCreateMarkerOptions();\r\n\r\n // Join Map Makers from Data1, 2, 3, 4, 5\r\n const [markers, setMarkers] = useState<MarkerProps[]>([]);\r\n useEffect(() => {\r\n const markers1 = data1.markers;\r\n const markers2 = data2.markers;\r\n const markers3 = data3.markers;\r\n const markers4 = data4.markers;\r\n const markers5 = data5.markers;\r\n\r\n const centerMarkerMarker: MarkerProps[] = [];\r\n\r\n if (centerMarker) {\r\n const optionsResult = getMarkerOptions(centerMarker);\r\n const markerOptions = optionsResult.markerOptions;\r\n const selectedMarkerOptions = optionsResult.selectedMarkerOptions;\r\n centerMarkerMarker.push({ markerOptions, selectedMarkerOptions });\r\n currentMapOptionsRef.current.center = markerOptions.position;\r\n }\r\n else if (data1.centerMarker) {\r\n currentMapOptionsRef.current.center = data1.centerMarker.markerOptions.position;\r\n }\r\n else if (data2.centerMarker) {\r\n currentMapOptionsRef.current.center = data2.centerMarker.markerOptions.position;\r\n }\r\n else if (data3.centerMarker) {\r\n currentMapOptionsRef.current.center = data3.centerMarker.markerOptions.position;\r\n }\r\n else if (data4.centerMarker) {\r\n currentMapOptionsRef.current.center = data4.centerMarker.markerOptions.position;\r\n }\r\n else if (data5.centerMarker) {\r\n currentMapOptionsRef.current.center = data5.centerMarker.markerOptions.position;\r\n }\r\n\r\n if (!currentMapOptionsRef.current.center) currentMapOptionsRef.current.center = DEFAULT_MAP_CENTER;\r\n\r\n setMarkers([...markers1, ...markers2, ...markers3, ...markers4, ...markers5, ...centerMarkerMarker]);\r\n\r\n }, [centerMarker, data1.markers, data2.markers, data3.markers, data4.markers, data5.markers])\r\n\r\n\r\n useEffect(() => {\r\n const selectedMarkers1 = data1.selectedMarkers;\r\n const selectedMarkers2 = data2.selectedMarkers;\r\n const selectedMarkers3 = data3.selectedMarkers;\r\n const selectedMarkers4 = data4.selectedMarkers;\r\n const selectedMarkers5 = data5.selectedMarkers;\r\n\r\n setSelectedMarkers({ ...selectedMarkers1, ...selectedMarkers2, ...selectedMarkers3, ...selectedMarkers4, ...selectedMarkers5 })\r\n }, [data1.selectedMarkers, data2.selectedMarkers, data3.selectedMarkers, data4.selectedMarkers, data5.selectedMarkers]);\r\n\r\n\r\n return (\r\n <>\r\n <DataGridToolbar\r\n enableExport={enableExport}\r\n onExportClick={handleExport}\r\n\r\n onRefreshClick={handleRefresh}\r\n onCheckboxToggle={handleToggleSelectable}\r\n autoFocus={autoFocus}\r\n toolbarIconVariant={toolbarIconVariant}\r\n size={toolbarSize}\r\n\r\n searchText={viewState.searchText}\r\n setSearchText={viewState.setSearchText}\r\n searchData={searchData}\r\n setSearchData={setSearchData}\r\n\r\n client={dataMapView1?.entity?.API.client}\r\n\r\n FiltersEntity={(dataMapView1?.entity && dataMapView1?.viewName) ? dataMapView1.entity.def.views[dataMapView1.viewName].FiltersEntity : undefined}\r\n\r\n filterValues={viewState.filterValues}\r\n setFilterValues={viewState.setFilterValues}\r\n\r\n filtersDescription={viewState.filtersDescription}\r\n setFiltersDescription={viewState.setFiltersDescription}\r\n\r\n filtersFormSize={filtersFormSize!}\r\n />\r\n <Tabs pt=\"xs\" defaultValue={TN.map}>\r\n <Tabs.List>\r\n <Tabs.Tab value={TN.map} icon={TN.mapIcon} >{dataMapLabels?.mapTabLabel}</Tabs.Tab>\r\n {data1.dgProps.entity &&\r\n <Tabs.Tab value={TN.tab1} icon={TN.tab1Icon} >{data1.dgProps.tabLabel ?? data1.dgProps.entity.Title}</Tabs.Tab>\r\n }\r\n {data2.dgProps.entity &&\r\n <Tabs.Tab value={TN.tab2} icon={TN.tab2Icon} >{data2.dgProps.tabLabel ?? data2.dgProps.entity.Title}</Tabs.Tab>\r\n }\r\n {data3.dgProps.entity &&\r\n <Tabs.Tab value={TN.tab3} icon={TN.tab3Icon} >{data3.dgProps.tabLabel ?? data3.dgProps.entity.Title}</Tabs.Tab>\r\n }\r\n {data4.dgProps.entity &&\r\n <Tabs.Tab value={TN.tab4} icon={TN.tab4Icon} >{data4.dgProps.tabLabel ?? data4.dgProps.entity.Title}</Tabs.Tab>\r\n }\r\n {data5.dgProps.entity &&\r\n <Tabs.Tab value={TN.tab5} icon={TN.tab5Icon} >{data5.dgProps.tabLabel ?? data5.dgProps.entity.Title}</Tabs.Tab>\r\n }\r\n </Tabs.List>\r\n {data1.dgProps.entity &&\r\n <Tabs.Panel value={TN.tab1} pt=\"xs\">\r\n <DataMapGrid\r\n {...data1.dgProps}\r\n columnsOverrides={data1.actualColumnsOverrides}\r\n selectedRows={data1.selectedRows}\r\n setSelectedRows={data1.setSelectedRows}\r\n executeViewState={data1.executeViewState}\r\n dataGridAPI={data1.dataGridAPI}\r\n viewState={data1.viewState}\r\n gridHeight={mapHeight}\r\n selectionMode={selectionMode!}\r\n key={`dmg${TN.tab1}`}\r\n renderOnlyWhenVisible={false}\r\n formMode={formMode}\r\n />\r\n </Tabs.Panel>\r\n }\r\n {data2.dgProps.entity &&\r\n <Tabs.Panel value={TN.tab2} pt=\"xs\">\r\n <DataMapGrid\r\n {...data2.dgProps}\r\n columnsOverrides={data2.actualColumnsOverrides}\r\n selectedRows={data2.selectedRows}\r\n setSelectedRows={data2.setSelectedRows}\r\n executeViewState={data2.executeViewState}\r\n dataGridAPI={data2.dataGridAPI}\r\n viewState={data2.viewState}\r\n gridHeight={mapHeight}\r\n selectionMode={selectionMode!}\r\n key={`dmg${TN.tab2}`}\r\n renderOnlyWhenVisible={false}\r\n formMode={formMode}\r\n />\r\n </Tabs.Panel>\r\n }\r\n {data3.dgProps.entity &&\r\n <Tabs.Panel value={TN.tab3} pt=\"xs\">\r\n <DataMapGrid\r\n {...data3.dgProps}\r\n columnsOverrides={data3.actualColumnsOverrides}\r\n selectedRows={data3.selectedRows}\r\n setSelectedRows={data3.setSelectedRows}\r\n executeViewState={data3.executeViewState}\r\n dataGridAPI={data3.dataGridAPI}\r\n viewState={data3.viewState}\r\n gridHeight={mapHeight}\r\n selectionMode={selectionMode!}\r\n key={`dmg${TN.tab3}`}\r\n renderOnlyWhenVisible={false}\r\n formMode={formMode}\r\n />\r\n </Tabs.Panel>\r\n }\r\n {data4.dgProps.entity &&\r\n <Tabs.Panel value={TN.tab4} pt=\"xs\">\r\n <DataMapGrid\r\n {...data4.dgProps}\r\n columnsOverrides={data4.actualColumnsOverrides}\r\n selectedRows={data4.selectedRows}\r\n setSelectedRows={data4.setSelectedRows}\r\n executeViewState={data4.executeViewState}\r\n dataGridAPI={data4.dataGridAPI}\r\n viewState={data4.viewState}\r\n gridHeight={mapHeight}\r\n selectionMode={selectionMode!}\r\n key={`dmg${TN.tab4}`}\r\n renderOnlyWhenVisible={false}\r\n formMode={formMode}\r\n />\r\n </Tabs.Panel>\r\n }\r\n {data5.dgProps.entity &&\r\n <Tabs.Panel value={TN.tab5} pt=\"xs\">\r\n <DataMapGrid\r\n {...data5.dgProps}\r\n columnsOverrides={data5.actualColumnsOverrides}\r\n selectedRows={data5.selectedRows}\r\n setSelectedRows={data5.setSelectedRows}\r\n executeViewState={data5.executeViewState}\r\n dataGridAPI={data5.dataGridAPI}\r\n viewState={data5.viewState}\r\n gridHeight={mapHeight}\r\n selectionMode={selectionMode!}\r\n key={`dmg${TN.tab5}`}\r\n renderOnlyWhenVisible={false}\r\n formMode={formMode}\r\n />\r\n </Tabs.Panel>\r\n }\r\n <Tabs.Panel value={TN.map} pt='xs'>\r\n <Stack spacing=\"sm\">\r\n <MultiDataMapActionsToolbar\r\n data1={data1}\r\n data2={data2}\r\n data3={data3}\r\n data4={data4}\r\n data5={data5}\r\n parentFormMode={formMode}\r\n />\r\n {mapReady && placesReady && geocoderReady &&\r\n <>\r\n {((data1.dataGridAPI.isLoading || data1.executeViewState.loading) && markers.length === 0) &&\r\n <FakeProgressBar size=\"xs\" />\r\n }\r\n <GoogleMapsInfoWindow container={infoWindowContentRef.current} infoWindowContent={infoWindowContent} />\r\n <GoogleMapCluster\r\n style={{ height: mapHeight === 'auto' ? '50vh' : mapHeight }}\r\n mapOptions={currentMapOptionsRef.current}\r\n infoWindowContentRef={infoWindowContentRef}\r\n setInfoWindowContent={setInfoWindowContent}\r\n markers={markers}\r\n selectedMarkers={selectedMarkers}\r\n />\r\n\r\n </>\r\n }\r\n </Stack>\r\n </Tabs.Panel>\r\n </Tabs>\r\n\r\n </>\r\n )\r\n}","import { Accordion, Card, Stack, Text, ThemeIcon, Title, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconHelp } from \"@tabler/icons-react\";\r\nimport { ReactNode, useMemo, useRef } from \"react\";\r\nimport { MicroMClient } from \"../../client\";\r\nimport { Entity, EntityDefinition } from \"../../Entity\";\r\nimport { FormMode } from \"../Core\";\r\nimport { MultiDataMap, MultiDataMapProps, MultiDataMapViewProps } from \"./MultiDataMap\";\r\n\r\nexport interface MultiDataMapPageViewProps extends Omit<MultiDataMapViewProps, 'entity'> {\r\n entityConstructor: (client: MicroMClient) => Entity<EntityDefinition>,\r\n}\r\n\r\nexport interface MultiDataMapPageProps extends Omit<MultiDataMapProps, 'dataMapView1' | 'dataMapView2' | 'dataMapView3' | 'dataMapView4' | 'dataMapView5'> {\r\n dataMapView1: MultiDataMapPageViewProps,\r\n dataMapView2?: MultiDataMapPageViewProps,\r\n dataMapView3?: MultiDataMapPageViewProps,\r\n dataMapView4?: MultiDataMapPageViewProps,\r\n dataMapView5?: MultiDataMapPageViewProps,\r\n title?: string,\r\n icon?: ReactNode,\r\n helpText?: string,\r\n formMode: FormMode,\r\n client: MicroMClient,\r\n showTitle?: boolean\r\n}\r\n\r\nexport const MultiDataMapPageDefaultProps: Partial<MultiDataMapPageProps> = {\r\n showTitle: true\r\n}\r\n\r\nexport function MultiDataMapPage(props: MultiDataMapPageProps) {\r\n const {\r\n showTitle, client, formMode, title, icon, helpText, dataMapView1, dataMapView2, dataMapView3, dataMapView4, dataMapView5, ...others\r\n } = useComponentDefaultProps('MultiDataMapPage', props, MultiDataMapPageDefaultProps);\r\n\r\n const theme = useMantineTheme();\r\n\r\n const entity1 = useRef<Entity<EntityDefinition>>(dataMapView1.entityConstructor(client));\r\n const entity2 = useRef<Entity<EntityDefinition> | undefined>(dataMapView2?.entityConstructor(client));\r\n const entity3 = useRef<Entity<EntityDefinition> | undefined>(dataMapView3?.entityConstructor(client));\r\n const entity4 = useRef<Entity<EntityDefinition> | undefined>(dataMapView4?.entityConstructor(client));\r\n const entity5 = useRef<Entity<EntityDefinition> | undefined>(dataMapView5?.entityConstructor(client));\r\n\r\n\r\n const dataMapViews = useMemo(() => {\r\n const updateDataMapView = (dataMapView: MultiDataMapViewProps | undefined, entity: Entity<EntityDefinition> | undefined) => {\r\n if (!dataMapView) return dataMapView;\r\n const updatedDataMapView: MultiDataMapViewProps = {\r\n ...dataMapView,\r\n entity: entity,\r\n enableAdd: formMode === 'view' ? false : dataMapView.enableAdd,\r\n enableEdit: formMode === 'view' ? false : dataMapView.enableEdit,\r\n enableDelete: formMode === 'view' ? false : dataMapView.enableDelete,\r\n enableView: dataMapView.enableView,\r\n };\r\n\r\n // Only return a new object if any of the properties changed\r\n if (\r\n updatedDataMapView.enableAdd !== dataMapView.enableAdd ||\r\n updatedDataMapView.enableEdit !== dataMapView.enableEdit ||\r\n updatedDataMapView.enableDelete !== dataMapView.enableDelete ||\r\n updatedDataMapView.enableView !== dataMapView.enableView ||\r\n (updatedDataMapView.entity && !dataMapView.entity)\r\n ) {\r\n return updatedDataMapView;\r\n }\r\n\r\n return dataMapView;\r\n };\r\n\r\n return {\r\n newDataMapView1: updateDataMapView(dataMapView1, entity1.current),\r\n newDataMapView2: updateDataMapView(dataMapView2, entity2.current),\r\n newDataMapView3: updateDataMapView(dataMapView3, entity3.current),\r\n newDataMapView4: updateDataMapView(dataMapView4, entity4.current),\r\n newDataMapView5: updateDataMapView(dataMapView5, entity5.current),\r\n };\r\n\r\n }, [dataMapView1, dataMapView2, dataMapView3, dataMapView4, dataMapView5, formMode]);\r\n\r\n const { newDataMapView1, newDataMapView2, newDataMapView3, newDataMapView4, newDataMapView5 } = dataMapViews;\r\n\r\n const EntityIcon = entity1.current.Icon;\r\n\r\n return (\r\n <Stack>\r\n {showTitle &&\r\n <Accordion\r\n variant=\"filled\"\r\n chevron={<IconHelp size=\"1.5rem\" />}\r\n styles={{ item: { '&[data-active]': { backgroundColor: \"unset\" } }, label: { paddingBottom: 0, paddingTop: 0 } }}\r\n >\r\n <Accordion.Item value={entity1.current.name} >\r\n <Accordion.Control icon={(icon) ? <ThemeIcon>{icon}</ThemeIcon> : (EntityIcon) ? <ThemeIcon><EntityIcon size=\"1.3rem\" /></ThemeIcon> : undefined}>\r\n <Title order={2} >{title ?? entity1.current.Title}</Title>\r\n </Accordion.Control>\r\n <Accordion.Panel>\r\n <Text size=\"sm\">\r\n {helpText ?? entity1.current.HelpText}\r\n </Text>\r\n </Accordion.Panel>\r\n </Accordion.Item>\r\n </Accordion>\r\n }\r\n <Card shadow=\"sm\" withBorder={theme.colorScheme === 'dark' ? false : true}>\r\n <MultiDataMap\r\n dataMapView1={newDataMapView1!}\r\n dataMapView2={newDataMapView2}\r\n dataMapView3={newDataMapView3}\r\n dataMapView4={newDataMapView4}\r\n dataMapView5={newDataMapView5}\r\n formMode={formMode}\r\n {...others}\r\n />\r\n </Card>\r\n </Stack>\r\n );\r\n}","import { Accordion, Card, Text, ThemeIcon, useComponentDefaultProps, useMantineTheme } from \"@mantine/core\";\r\nimport { IconHelp } from \"@tabler/icons-react\";\r\nimport { ReactNode, useMemo } from \"react\";\r\nimport { FormMode } from \"../Core\";\r\nimport { MultiDataMap, MultiDataMapProps, MultiDataMapViewProps } from \"./MultiDataMap\";\r\n\r\nexport interface MultiDataMapFormProps extends MultiDataMapProps {\r\n customTitle?: ReactNode,\r\n title?: string,\r\n icon?: ReactNode,\r\n helpText?: string,\r\n formMode: FormMode,\r\n showTitle?: boolean\r\n}\r\n\r\nexport const MultiDataMapFormDefaultProps: Partial<MultiDataMapFormProps> = {\r\n showTitle: true\r\n}\r\n\r\nexport function MultiDataMapForm(props: MultiDataMapFormProps) {\r\n const {\r\n showTitle, formMode, title, icon, helpText, customTitle, dataMapView1, dataMapView2, dataMapView3, dataMapView4, dataMapView5, ...others\r\n } = useComponentDefaultProps('MultiDataMapForm', props, MultiDataMapFormDefaultProps);\r\n\r\n const theme = useMantineTheme();\r\n\r\n\r\n const { entity } = dataMapView1;\r\n\r\n const EntityIcon = dataMapView1.entity?.Icon;\r\n const IconNode = (icon) ? <ThemeIcon>{icon}</ThemeIcon> : (EntityIcon) ? <ThemeIcon><EntityIcon size=\"1rem\" /></ThemeIcon> : undefined;\r\n\r\n const dataMapViews = useMemo(() => {\r\n const updateDataMapView = (dataMapView?: MultiDataMapViewProps) => {\r\n if (!dataMapView) return dataMapView;\r\n const updatedDataMapView = {\r\n ...dataMapView,\r\n enableAdd: formMode === 'view' ? false : dataMapView.enableAdd,\r\n enableEdit: formMode === 'view' ? false : dataMapView.enableEdit,\r\n enableDelete: formMode === 'view' ? false : dataMapView.enableDelete,\r\n enableView: dataMapView.enableView\r\n };\r\n\r\n // Only return a new object if any of the properties changed\r\n if (\r\n updatedDataMapView.enableAdd !== dataMapView.enableAdd ||\r\n updatedDataMapView.enableEdit !== dataMapView.enableEdit ||\r\n updatedDataMapView.enableDelete !== dataMapView.enableDelete ||\r\n updatedDataMapView.enableView !== dataMapView.enableView\r\n ) {\r\n return updatedDataMapView;\r\n }\r\n\r\n return dataMapView;\r\n };\r\n\r\n return {\r\n newDataMapView1: updateDataMapView(dataMapView1),\r\n newDataMapView2: updateDataMapView(dataMapView2),\r\n newDataMapView3: updateDataMapView(dataMapView3),\r\n newDataMapView4: updateDataMapView(dataMapView4),\r\n newDataMapView5: updateDataMapView(dataMapView5),\r\n };\r\n\r\n }, [dataMapView1, dataMapView2, dataMapView3, dataMapView4, dataMapView5, formMode]);\r\n\r\n const { newDataMapView1, newDataMapView2, newDataMapView3, newDataMapView4, newDataMapView5 } = dataMapViews;\r\n\r\n return (\r\n <Card shadow=\"sm\" withBorder={theme.colorScheme === 'dark' ? false : true}>\r\n {showTitle && customTitle &&\r\n <Card.Section p=\"xs\" bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]} mb=\"1rem\">\r\n {customTitle}\r\n </Card.Section>\r\n }\r\n {showTitle && !customTitle &&\r\n <Card.Section p=\"xs\" bg={theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors[theme.primaryColor][3]} mb=\"1rem\">\r\n <Accordion\r\n variant=\"filled\"\r\n chevron={<IconHelp size=\"1rem\" />}\r\n styles={{ item: { '&[data-active]': { backgroundColor: \"unset\" } }, label: { paddingBottom: 0, paddingTop: 0 }, control: { padding: 0 } }}\r\n >\r\n <Accordion.Item value={entity?.name ?? 'dmfEntity'} >\r\n <Accordion.Control icon={IconNode}>\r\n <Text size=\"sm\">{title ?? entity?.Title}</Text>\r\n </Accordion.Control>\r\n <Accordion.Panel>\r\n <Text size=\"xs\">\r\n {helpText ?? entity?.HelpText}\r\n </Text>\r\n </Accordion.Panel>\r\n </Accordion.Item>\r\n </Accordion>\r\n </Card.Section>\r\n }\r\n <MultiDataMap\r\n dataMapView1={newDataMapView1!}\r\n dataMapView2={newDataMapView2}\r\n dataMapView3={newDataMapView3}\r\n dataMapView4={newDataMapView4}\r\n dataMapView5={newDataMapView5}\r\n formMode={formMode}\r\n {...others}\r\n />\r\n </Card>\r\n );\r\n}","import { ActionIcon, Badge, BadgeProps } from \"@mantine/core\";\r\nimport { IconX } from \"@tabler/icons-react\";\r\n\r\nexport interface RegionSelectorItemProps extends Omit<BadgeProps, 'rightSection'> {\r\n onCloseClick?: () => void,\r\n}\r\n\r\nexport function RegionSelectorItem({ onCloseClick, children, ...rest }: RegionSelectorItemProps) {\r\n\r\n const removeButton = (\r\n <ActionIcon size=\"xs\" radius=\"xl\" variant=\"transparent\" onClick={() => { if (onCloseClick) onCloseClick() }}>\r\n <IconX size=\"0.75rem\" />\r\n </ActionIcon>\r\n )\r\n\r\n return (\r\n <Badge size=\"md\" {...rest} rightSection={onCloseClick && removeButton} styles={{ root: { width: 'fit-content' } }}>\r\n {children}\r\n </Badge>\r\n )\r\n}","import { ActionIcon, Card, Group, Loader, MantineNumberSize, Skeleton, Stack, Text, useComponentDefaultProps } from \"@mantine/core\";\r\nimport { IconX } from \"@tabler/icons-react\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport { useGoogleMapsAPI } from \"../../GoogleMapsAPI\";\r\nimport { AlertError, latLng } from \"../Core\";\r\nimport { GoogleAddressAutocomplete, GoogleAddressAutocompleteRestrictions, OnAddressFoundCallback } from \"../GoogleMaps/GoogleAddressAutocomplete\";\r\nimport { GoogleMapRegionSelectorMap } from \"../GoogleMaps/GoogleMapRegionSelectorMap\";\r\nimport { ClickedRegionData, GoogleMapRegionSelectorProps, SelectedRegionData } from \"../GoogleMaps/GoogleMapRegionSelectorTypes\";\r\nimport { GoogleMarker } from \"../GoogleMaps/GoogleMarker\";\r\nimport { DEFAULT_MAP_CENTER, GoogleMapsErrorStatus, MapOptions } from \"../GoogleMaps/Mapping.types\";\r\nimport { RegionSelectorItem } from \"./RegionSelectorItem\";\r\n\r\n\r\nexport interface RegionSelectorProps extends Omit<GoogleMapRegionSelectorProps, 'googleMapsAPI'> {\r\n mapId: string,\r\n readOnly?: boolean,\r\n mapRestrictions?: google.maps.LatLngBoundsLiteral[],\r\n defaultMapCenter?: latLng,\r\n onAPIError?: (status: GoogleMapsErrorStatus) => void,\r\n errorTitle?: string,\r\n errorMessage?: string,\r\n mapHeight?: MantineNumberSize,\r\n showErrors?: boolean,\r\n searchLabel?: string,\r\n loadingLabel?: string,\r\n unknownStateLabel?: string,\r\n regionListMode?: 'count' | 'names',\r\n suppressCountyString?: string,\r\n searchDescriptionLabel?: string,\r\n mapHelpLabel?: string,\r\n selectedRegionsLabel?: string,\r\n autoFocus?: boolean,\r\n}\r\n\r\nexport const RegionSelectorDefaultProps: Partial<RegionSelectorProps> = {\r\n defaultMapCenter: DEFAULT_MAP_CENTER,\r\n mapHeight: \"50vh\",\r\n errorTitle: \"Google maps error\",\r\n errorMessage: \"An error occurred with google maps API:\",\r\n mapCenter: DEFAULT_MAP_CENTER,\r\n searchLabel: \"Search\",\r\n loadingLabel: \"Loading\",\r\n unknownStateLabel: \"Unknown state\",\r\n regionListMode: 'names',\r\n suppressCountyString: 'county',\r\n searchDescriptionLabel: \"Search for a region, place or address and click on the map to select regions\",\r\n mapHelpLabel: \"* Use the zoom to select States, Counties or Zip codes. Click over the region to select/deselect\",\r\n selectedRegionsLabel: \"Selected Regions\",\r\n maxRegions: Infinity\r\n}\r\n\r\nexport function RegionSelector(props: RegionSelectorProps) {\r\n const { mapReady, placesReady, geocoderReady } = useGoogleMapsAPI();\r\n\r\n const selectorProps = useComponentDefaultProps('RegionSelector', RegionSelectorDefaultProps, props);\r\n\r\n return (\r\n <>\r\n {mapReady && placesReady && geocoderReady ?\r\n (<RegionSelectorInternal {...selectorProps} />)\r\n :\r\n (<Skeleton height=\"50vh\" />)\r\n }\r\n </>\r\n )\r\n}\r\n\r\nfunction RegionSelectorInternal(props: RegionSelectorProps) {\r\n const {\r\n mapHeight, mapCenter, mapId, readOnly, showErrors, errorTitle, errorMessage,\r\n countries, searchLabel, onAPIError, onRegionClicked, onSelectionChanged, selectedRegions,\r\n setSelectedRegions, loadingLabel, unknownStateLabel, regionListMode, suppressCountyString,\r\n searchDescriptionLabel, mapHelpLabel, clickedRegions, setClickedRegions, selectedRegionsLabel,\r\n autoFocus,\r\n ...regionSelectorProps\r\n } = props;\r\n\r\n const [markerActualPos, setMarkerActualPos] = useState<latLng | undefined>();\r\n const [errorStatus, setErrorStatus] = useState<GoogleMapsErrorStatus | undefined>();\r\n const [internalMapCenter, setInternalMapCenter] = useState<latLng>(mapCenter || DEFAULT_MAP_CENTER);\r\n const [internalMapZoom, setInternalMapZoom] = useState<number>(5);\r\n\r\n const mapOptions = useMemo<MapOptions>(() => ({\r\n zoom: internalMapZoom,\r\n center: internalMapCenter,\r\n mapId: mapId,\r\n streetViewControl: false,\r\n fullscreenControl: false,\r\n mapTypeControl: false,\r\n gestureHandling: 'greedy',\r\n //clickableIcons: false,\r\n }), [internalMapCenter, internalMapZoom, mapId]);\r\n\r\n const addressMarkerOptions = useMemo(() => ({\r\n position: markerActualPos,\r\n visible: !!markerActualPos,\r\n animation: google.maps.Animation.DROP,\r\n draggable: false,\r\n }), [markerActualPos]);\r\n\r\n // Autocomplete\r\n const autocompleteRestrictions = useMemo<GoogleAddressAutocompleteRestrictions>(() => ({\r\n country: countries || []\r\n }), [countries]);\r\n\r\n const handleAddressFound = useCallback<OnAddressFoundCallback>(found => {\r\n if (found.place.geometry?.location) {\r\n const currentPos = { lat: found.place.geometry.location.lat(), lng: found.place.geometry.location.lng() };\r\n setMarkerActualPos(currentPos);\r\n setInternalMapCenter(currentPos);\r\n setInternalMapZoom(11);\r\n } else {\r\n setMarkerActualPos(undefined);\r\n }\r\n }, []);\r\n\r\n const handleAutocompleteError = useCallback((status: string) => {\r\n const apiError: GoogleMapsErrorStatus = { status: status, origin: \"Places\" };\r\n setErrorStatus(apiError);\r\n if (onAPIError) onAPIError(apiError);\r\n }, [onAPIError]);\r\n\r\n // Region selector\r\n const handleRegionClicked = useCallback((place_id: string) => {\r\n setMarkerActualPos(undefined);\r\n }, []);\r\n\r\n const selectorProps = useMemo<Omit<GoogleMapRegionSelectorProps, 'googleMapsAPI'>>(() => ({\r\n ...regionSelectorProps,\r\n countries,\r\n selectedRegions,\r\n setSelectedRegions,\r\n clickedRegions,\r\n setClickedRegions,\r\n onSelectionChanged: (selected: Record<string, SelectedRegionData>) => {\r\n if (onSelectionChanged) onSelectionChanged(selected);\r\n },\r\n onRegionClicked: (place_id) => {\r\n handleRegionClicked(place_id); if (onRegionClicked) onRegionClicked(place_id);\r\n }\r\n }), [clickedRegions, countries, handleRegionClicked, onRegionClicked, onSelectionChanged, regionSelectorProps, selectedRegions, setClickedRegions, setSelectedRegions]);\r\n\r\n // Grouped regions\r\n const groupedRegions = useMemo(() => {\r\n const groups = new Map<string, {\r\n countryId?: string;\r\n stateId: string;\r\n stateName?: string;\r\n counties: Set<string>;\r\n postalCodes: Set<string>;\r\n regions: SelectedRegionData[];\r\n }>();\r\n\r\n Object.values(selectedRegions).forEach((region) => {\r\n\r\n const stateId = region.administrativeAreaLevel1Id || 'UNKNOWN_STATE';\r\n\r\n const group_key = `${region.countryId}-${stateId}`;\r\n let group = groups.get(group_key);\r\n\r\n if (!group) {\r\n group = {\r\n countryId: region.countryId,\r\n stateId: stateId,\r\n stateName: region.administrativeAreaLevel1Name,\r\n counties: new Set<string>(),\r\n postalCodes: new Set<string>(),\r\n regions: [],\r\n };\r\n groups.set(group_key, group);\r\n }\r\n\r\n if (region.featureType === google.maps.FeatureType.ADMINISTRATIVE_AREA_LEVEL_2) {\r\n group.counties.add(region.administrativeAreaLevel2Id || 'UNKNOWN_COUNTY');\r\n }\r\n\r\n if (region.featureType === google.maps.FeatureType.POSTAL_CODE) {\r\n group.postalCodes.add(region.postalCode || 'UNKNOWN_POSTAL_CODE');\r\n }\r\n\r\n group.regions.push(region);\r\n });\r\n\r\n return Array.from(groups.values());\r\n }, [selectedRegions]);\r\n\r\n\r\n // Delete group\r\n const handleDeleteGroup = useCallback((groupRegions: SelectedRegionData[]) => {\r\n setClickedRegions((prev) => {\r\n const updated: Record<string, ClickedRegionData> = { ...prev };\r\n groupRegions.forEach(region => {\r\n delete updated[region.placeId];\r\n });\r\n return updated;\r\n });\r\n }, [setClickedRegions]);\r\n\r\n return (\r\n <Stack spacing=\"md\">\r\n <GoogleAddressAutocomplete\r\n label={searchLabel}\r\n restrictions={autocompleteRestrictions}\r\n onAddressFound={handleAddressFound}\r\n readOnly={readOnly}\r\n onAPIError={handleAutocompleteError}\r\n description={searchDescriptionLabel}\r\n data-autofocus={autoFocus}\r\n autoFocus={autoFocus}\r\n />\r\n <Stack spacing=\"0.2rem\">\r\n <Text size=\"xs\" weight={600} color=\"dimmed\">{mapHelpLabel}</Text>\r\n <GoogleMapRegionSelectorMap style={{ height: mapHeight, resize: \"vertical\", flexGrow: 1 }} mapOptions={mapOptions} regionSelectorProps={selectorProps}>\r\n <GoogleMarker key=\"address-marker\" markerOptions={addressMarkerOptions} />\r\n </GoogleMapRegionSelectorMap>\r\n </Stack>\r\n <Card withBorder>\r\n <Stack spacing=\"xs\">\r\n <Group>\r\n {// check to see if any selected regions are loading and show a loader\r\n (Object.keys(clickedRegions).length !== Object.keys(selectedRegions).length) && <Loader size=\"xs\" />\r\n }\r\n <Text size=\"sm\">{selectedRegionsLabel}</Text>\r\n <ActionIcon size=\"xs\" radius=\"xl\" variant=\"transparent\" onClick={() => { setClickedRegions({}); setSelectedRegions({}); }}>\r\n <IconX size=\"0.75rem\" />\r\n </ActionIcon>\r\n </Group>\r\n <Group spacing=\"xs\">\r\n {\r\n groupedRegions.map((group) => (\r\n <RegionSelectorItem\r\n key={`group-${group.countryId}-${group.stateId}`}\r\n onCloseClick={() => handleDeleteGroup(group.regions)}\r\n >\r\n {\r\n [\r\n group.stateName === undefined ? loadingLabel : group.stateName || unknownStateLabel,\r\n group.counties.size > 0 ? (\r\n regionListMode === 'names'\r\n ? `counties: [${Array.from(group.counties)\r\n .map(county => county.replace(new RegExp(`\\\\s*${suppressCountyString}\\\\s*`, 'i'), ''))\r\n .join(', ')}]`\r\n : `counties: ${group.counties.size}`\r\n ) : null,\r\n group.postalCodes.size > 0 ? (\r\n regionListMode === 'names'\r\n ? `zipcodes: [${Array.from(group.postalCodes).join(', ')}]`\r\n : `zipcodes: ${group.postalCodes.size}`\r\n ) : null,\r\n group.countryId,\r\n ].filter(Boolean).join(', ')\r\n }\r\n </RegionSelectorItem>\r\n ))\r\n }\r\n </Group>\r\n </Stack>\r\n </Card>\r\n {showErrors && errorStatus && <AlertError title={errorTitle}>{errorMessage} {errorStatus.status} ({errorStatus.origin})</AlertError>}\r\n </Stack>\r\n )\r\n}\r\n","import { Skeleton } from \"@mantine/core\";\r\nimport { useEffect } from \"react\";\r\nimport { DataResult, ValuesObject } from \"../../client\";\r\nimport { Entity, EntityDefinition } from \"../../Entity\";\r\nimport { AlertError, useExecuteProc } from \"../Core\";\r\nimport { ClickedRegionData, SelectedRegionData } from \"../GoogleMaps\";\r\nimport { RegionSelector, RegionSelectorProps } from \"../RegionSelector\";\r\n\r\n\r\nexport interface DataRegionSelectorProps extends RegionSelectorProps {\r\n entity: Entity<EntityDefinition>,\r\n queryName: string,\r\n parentKeys?: ValuesObject,\r\n mapDataResult: (data: DataResult) => Record<string, SelectedRegionData>,\r\n}\r\n\r\nexport function DataRegion(props: DataRegionSelectorProps) {\r\n const {\r\n entity, queryName, parentKeys, mapId, countries, mapCenter, mapHeight, mapDataResult,\r\n selectedRegions, setSelectedRegions, clickedRegions, setClickedRegions, mapRestrictions,\r\n maxRegions, onMaxRegionsReached\r\n } = props;\r\n\r\n const query = useExecuteProc(entity, entity.def.procs[queryName]);\r\n\r\n useEffect(() => {\r\n const refresh = async () => {\r\n const proc = entity.def.procs[queryName];\r\n if (!proc) {\r\n console.error(`Proc ${queryName} not found in entity ${entity.def.name}`);\r\n return;\r\n }\r\n\r\n const result = await query.execute(parentKeys || {});\r\n if (result?.data) {\r\n const regions = mapDataResult(result.data[0]);\r\n setSelectedRegions(regions);\r\n\r\n const clickedRegionsData: Record<string, ClickedRegionData> = Object.entries(regions).reduce((acc, [key, value]) => {\r\n acc[key] = {\r\n featuretype: value.featuretype,\r\n placeId: value.placeId\r\n };\r\n return acc;\r\n }, {} as Record<string, ClickedRegionData>);\r\n\r\n setClickedRegions(clickedRegionsData);\r\n }\r\n }\r\n refresh();\r\n }, [entity.def.name, entity.def.procs, mapDataResult, parentKeys, query, queryName, setClickedRegions, setSelectedRegions]);\r\n\r\n return (\r\n <>\r\n {query.status.loading && <Skeleton height={mapHeight} />}\r\n {query.status.error &&\r\n <AlertError mb=\"xs\">{query.status.error.status} {query.status.error.message} {query.status.error.statusMessage}</AlertError>\r\n }\r\n {!query.status.loading && !query.status.error &&\r\n <RegionSelector\r\n mapId={mapId}\r\n mapHeight={mapHeight}\r\n countries={countries}\r\n mapCenter={mapCenter}\r\n selectedRegions={selectedRegions}\r\n setSelectedRegions={setSelectedRegions}\r\n clickedRegions={clickedRegions}\r\n setClickedRegions={setClickedRegions}\r\n mapRestrictions={mapRestrictions}\r\n maxRegions={maxRegions}\r\n onMaxRegionsReached={onMaxRegionsReached}\r\n />\r\n }\r\n </>\r\n )\r\n}","import { useRef } from \"react\";\r\nimport { MicroMClient } from \"../../client/MicromClient\";\r\nimport { MicromEntitiesTypes, MicromEntitiesTypesDef } from \"../../DataDictionary\";\r\nimport { Entity, EntityDefinition, nameof } from \"../../Entity\";\r\nimport { DataGrid, DataGridProps } from \"../DataGrid\";\r\n\r\nexport interface DeveloperToolsPanelProps extends Omit<DataGridProps, 'entity' | 'title' | 'formMode'> {\r\n client: MicroMClient,\r\n}\r\n\r\nexport function DeveloperToolsPanel({ client, ...rest }: DeveloperToolsPanelProps) {\r\n const entity = useRef<Entity<EntityDefinition>>(new MicromEntitiesTypes(client));\r\n\r\n return (\r\n <DataGrid\r\n {...rest}\r\n formMode=\"view\"\r\n viewName={nameof(MicromEntitiesTypesDef, v => v.views.mty_brwStandard)}\r\n entity={entity.current}\r\n gridHeight=\"flex-grow\"\r\n />\r\n );\r\n}"],"mappings":"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"}