@nocios/crudify-components 2.0.61 → 2.0.81

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 (363) hide show
  1. package/.scannerwork/.sonar_lock +0 -0
  2. package/.scannerwork/report-task.txt +6 -0
  3. package/coverage/components/CrudiaAutoGenerate.tsx.html +616 -0
  4. package/coverage/components/CrudiaFileField/CrudiaFileField.tsx.html +1312 -0
  5. package/coverage/components/CrudiaFileField/components/DeleteConfirmationDialog.tsx.html +355 -0
  6. package/coverage/components/CrudiaFileField/components/DropZone.tsx.html +523 -0
  7. package/coverage/components/CrudiaFileField/components/FileItemRow.tsx.html +835 -0
  8. package/coverage/components/CrudiaFileField/components/FileThumbnail.tsx.html +1585 -0
  9. package/coverage/components/CrudiaFileField/components/index.html +176 -0
  10. package/coverage/components/CrudiaFileField/components/index.ts.html +115 -0
  11. package/coverage/components/CrudiaFileField/hooks/index.html +146 -0
  12. package/coverage/components/CrudiaFileField/hooks/index.ts.html +112 -0
  13. package/coverage/components/CrudiaFileField/hooks/useDeleteConfirmation.ts.html +433 -0
  14. package/coverage/components/CrudiaFileField/hooks/useDragDrop.ts.html +409 -0
  15. package/coverage/components/CrudiaFileField/index.html +131 -0
  16. package/coverage/components/CrudiaFileField/index.ts.html +112 -0
  17. package/coverage/components/CrudiaFileField/utils/formatters.ts.html +169 -0
  18. package/coverage/components/CrudiaFileField/utils/icons.tsx.html +253 -0
  19. package/coverage/components/CrudiaFileField/utils/index.html +146 -0
  20. package/coverage/components/CrudiaFileField/utils/index.ts.html +103 -0
  21. package/coverage/components/CrudiaMarkdownField.tsx.html +676 -0
  22. package/coverage/components/CrudifyInitializer.tsx.html +712 -0
  23. package/coverage/components/CrudifyLogin/Forms/CheckCodeForm.tsx.html +640 -0
  24. package/coverage/components/CrudifyLogin/Forms/ForgotPasswordForm.tsx.html +730 -0
  25. package/coverage/components/CrudifyLogin/Forms/LoginForm.tsx.html +892 -0
  26. package/coverage/components/CrudifyLogin/Forms/ResetPasswordForm.tsx.html +1219 -0
  27. package/coverage/components/CrudifyLogin/Forms/components/CodeInput.tsx.html +289 -0
  28. package/coverage/components/CrudifyLogin/Forms/components/FormAlert.tsx.html +202 -0
  29. package/coverage/components/CrudifyLogin/Forms/components/PasswordInput.tsx.html +346 -0
  30. package/coverage/components/CrudifyLogin/Forms/components/index.html +161 -0
  31. package/coverage/components/CrudifyLogin/Forms/components/index.ts.html +106 -0
  32. package/coverage/components/CrudifyLogin/Forms/index.html +176 -0
  33. package/coverage/components/CrudifyLogin/Forms/index.ts.html +145 -0
  34. package/coverage/components/CrudifyLogin/Forms/utils/errorTranslation.ts.html +268 -0
  35. package/coverage/components/CrudifyLogin/Forms/utils/index.html +161 -0
  36. package/coverage/components/CrudifyLogin/Forms/utils/index.ts.html +121 -0
  37. package/coverage/components/CrudifyLogin/Forms/utils/paramUtils.ts.html +496 -0
  38. package/coverage/components/CrudifyLogin/Forms/utils/validation.ts.html +307 -0
  39. package/coverage/components/CrudifyLogin/components/CrudifyInitializer.tsx.html +268 -0
  40. package/coverage/components/CrudifyLogin/components/index.html +116 -0
  41. package/coverage/components/CrudifyLogin/context/CrudifyProvider.tsx.html +409 -0
  42. package/coverage/components/CrudifyLogin/context/I18nProvider.tsx.html +430 -0
  43. package/coverage/components/CrudifyLogin/context/LoginStateProvider.tsx.html +1261 -0
  44. package/coverage/components/CrudifyLogin/context/index.html +161 -0
  45. package/coverage/components/CrudifyLogin/context/index.ts.html +91 -0
  46. package/coverage/components/CrudifyLogin/hooks/index.html +131 -0
  47. package/coverage/components/CrudifyLogin/hooks/useCrudifyLogin.ts.html +463 -0
  48. package/coverage/components/CrudifyLogin/hooks/useTranslationsFromUrl.ts.html +391 -0
  49. package/coverage/components/CrudifyLogin/index.html +116 -0
  50. package/coverage/components/CrudifyLogin/index.tsx.html +466 -0
  51. package/coverage/components/CrudifyLogin/utils/index.html +116 -0
  52. package/coverage/components/CrudifyLogin/utils/secureStorage.ts.html +859 -0
  53. package/coverage/components/GlobalNotificationProvider.tsx.html +844 -0
  54. package/coverage/components/LoginComponent.tsx.html +676 -0
  55. package/coverage/components/PasswordRequirements/index.html +116 -0
  56. package/coverage/components/PasswordRequirements/index.tsx.html +232 -0
  57. package/coverage/components/PublicPolicies/FieldSelector/FieldSelector.tsx.html +1078 -0
  58. package/coverage/components/PublicPolicies/FieldSelector/index.html +131 -0
  59. package/coverage/components/PublicPolicies/FieldSelector/index.ts.html +88 -0
  60. package/coverage/components/PublicPolicies/Policies.tsx.html +625 -0
  61. package/coverage/components/PublicPolicies/PolicyItem/PolicyItem.tsx.html +886 -0
  62. package/coverage/components/PublicPolicies/PolicyItem/index.html +131 -0
  63. package/coverage/components/PublicPolicies/PolicyItem/index.ts.html +88 -0
  64. package/coverage/components/PublicPolicies/constants.ts.html +106 -0
  65. package/coverage/components/PublicPolicies/index.html +146 -0
  66. package/coverage/components/PublicPolicies/index.ts.html +88 -0
  67. package/coverage/components/Routing/AuthRoute.tsx.html +382 -0
  68. package/coverage/components/Routing/GuestRoute.tsx.html +352 -0
  69. package/coverage/components/Routing/ProtectedRoute.tsx.html +316 -0
  70. package/coverage/components/Routing/index.html +161 -0
  71. package/coverage/components/Routing/index.ts.html +109 -0
  72. package/coverage/components/SessionLoadingScreen/index.html +116 -0
  73. package/coverage/components/SessionLoadingScreen/index.tsx.html +379 -0
  74. package/coverage/components/SessionTimeIndicator/index.html +116 -0
  75. package/coverage/components/SessionTimeIndicator/index.tsx.html +523 -0
  76. package/coverage/components/UserProfile/UserProfileDisplay.tsx.html +931 -0
  77. package/coverage/components/UserProfile/index.html +131 -0
  78. package/coverage/components/UserProfile/index.ts.html +88 -0
  79. package/coverage/components/index.html +191 -0
  80. package/coverage/components/index.ts.html +178 -0
  81. package/coverage/core/CrossTabSyncManager.ts.html +853 -0
  82. package/coverage/core/CrudifyInitializationManager.ts.html +1279 -0
  83. package/coverage/core/SessionManager.ts.html +3064 -0
  84. package/coverage/core/index.html +146 -0
  85. package/coverage/coverage-final.json +74 -77
  86. package/coverage/hooks/index.html +191 -0
  87. package/coverage/hooks/index.ts.html +136 -0
  88. package/coverage/hooks/useAuth.ts.html +529 -0
  89. package/coverage/hooks/useAutoGenerate.ts.html +571 -0
  90. package/coverage/hooks/useCrudifyWithNotifications/constants.ts.html +247 -0
  91. package/coverage/hooks/useCrudifyWithNotifications/hooks/index.html +116 -0
  92. package/coverage/hooks/useCrudifyWithNotifications/hooks/useCrudOperations.ts.html +820 -0
  93. package/coverage/hooks/useCrudifyWithNotifications/index.html +146 -0
  94. package/coverage/hooks/useCrudifyWithNotifications/index.ts.html +118 -0
  95. package/coverage/hooks/useCrudifyWithNotifications/useCrudifyWithNotifications.ts.html +565 -0
  96. package/coverage/hooks/useCrudifyWithNotifications/utils/errorMessageResolver.ts.html +847 -0
  97. package/coverage/hooks/useCrudifyWithNotifications/utils/index.html +146 -0
  98. package/coverage/hooks/useCrudifyWithNotifications/utils/notificationFilters.ts.html +313 -0
  99. package/coverage/hooks/useCrudifyWithNotifications/utils/successMessageResolver.ts.html +265 -0
  100. package/coverage/hooks/useData.ts.html +829 -0
  101. package/coverage/hooks/useFileUpload/index.html +131 -0
  102. package/coverage/hooks/useFileUpload/index.ts.html +112 -0
  103. package/coverage/hooks/useFileUpload/services/index.html +131 -0
  104. package/coverage/hooks/useFileUpload/services/index.ts.html +106 -0
  105. package/coverage/hooks/useFileUpload/services/uploadService.ts.html +610 -0
  106. package/coverage/hooks/useFileUpload/useFileUpload.ts.html +2092 -0
  107. package/coverage/hooks/useFileUpload/utils/fileUtils.ts.html +271 -0
  108. package/coverage/hooks/useFileUpload/utils/index.html +161 -0
  109. package/coverage/hooks/useFileUpload/utils/index.ts.html +109 -0
  110. package/coverage/hooks/useFileUpload/utils/mimeTypes.ts.html +235 -0
  111. package/coverage/hooks/useFileUpload/utils/validation.ts.html +403 -0
  112. package/coverage/hooks/useSession/constants.ts.html +217 -0
  113. package/coverage/hooks/useSession/hooks/index.html +176 -0
  114. package/coverage/hooks/useSession/hooks/useAuthEventSubscriber.ts.html +331 -0
  115. package/coverage/hooks/useSession/hooks/useCrossTabSync.ts.html +535 -0
  116. package/coverage/hooks/useSession/hooks/useSessionActions.ts.html +664 -0
  117. package/coverage/hooks/useSession/hooks/useSessionState.ts.html +295 -0
  118. package/coverage/hooks/useSession/hooks/useTokenRefreshScheduler.ts.html +535 -0
  119. package/coverage/hooks/useSession/index.html +161 -0
  120. package/coverage/hooks/useSession/index.ts.html +127 -0
  121. package/coverage/hooks/useSession/types.ts.html +427 -0
  122. package/coverage/hooks/useSession/useSession.ts.html +526 -0
  123. package/coverage/hooks/useSession/utils/index.html +131 -0
  124. package/coverage/hooks/useSession/utils/initializeSession.ts.html +424 -0
  125. package/coverage/hooks/useSession/utils/tokenUtils.ts.html +298 -0
  126. package/coverage/hooks/useUserData.ts.html +1210 -0
  127. package/coverage/hooks/useUserProfile.ts.html +820 -0
  128. package/coverage/index.html +205 -235
  129. package/coverage/lcov-report/components/CrudiaAutoGenerate.tsx.html +616 -0
  130. package/coverage/lcov-report/components/CrudiaFileField/CrudiaFileField.tsx.html +1312 -0
  131. package/coverage/lcov-report/components/CrudiaFileField/components/DeleteConfirmationDialog.tsx.html +355 -0
  132. package/coverage/lcov-report/components/CrudiaFileField/components/DropZone.tsx.html +523 -0
  133. package/coverage/lcov-report/components/CrudiaFileField/components/FileItemRow.tsx.html +835 -0
  134. package/coverage/lcov-report/components/CrudiaFileField/components/FileThumbnail.tsx.html +1585 -0
  135. package/coverage/lcov-report/components/CrudiaFileField/components/index.html +176 -0
  136. package/coverage/lcov-report/components/CrudiaFileField/components/index.ts.html +115 -0
  137. package/coverage/lcov-report/components/CrudiaFileField/hooks/index.html +146 -0
  138. package/coverage/lcov-report/components/CrudiaFileField/hooks/index.ts.html +112 -0
  139. package/coverage/lcov-report/components/CrudiaFileField/hooks/useDeleteConfirmation.ts.html +433 -0
  140. package/coverage/lcov-report/components/CrudiaFileField/hooks/useDragDrop.ts.html +409 -0
  141. package/coverage/lcov-report/components/CrudiaFileField/index.html +131 -0
  142. package/coverage/lcov-report/components/CrudiaFileField/index.ts.html +112 -0
  143. package/coverage/lcov-report/components/CrudiaFileField/utils/formatters.ts.html +169 -0
  144. package/coverage/lcov-report/components/CrudiaFileField/utils/icons.tsx.html +253 -0
  145. package/coverage/lcov-report/components/CrudiaFileField/utils/index.html +146 -0
  146. package/coverage/lcov-report/components/CrudiaFileField/utils/index.ts.html +103 -0
  147. package/coverage/lcov-report/components/CrudiaMarkdownField.tsx.html +676 -0
  148. package/coverage/lcov-report/components/CrudifyInitializer.tsx.html +712 -0
  149. package/coverage/lcov-report/components/CrudifyLogin/Forms/CheckCodeForm.tsx.html +640 -0
  150. package/coverage/lcov-report/components/CrudifyLogin/Forms/ForgotPasswordForm.tsx.html +730 -0
  151. package/coverage/lcov-report/components/CrudifyLogin/Forms/LoginForm.tsx.html +892 -0
  152. package/coverage/lcov-report/components/CrudifyLogin/Forms/ResetPasswordForm.tsx.html +1219 -0
  153. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/CodeInput.tsx.html +289 -0
  154. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/FormAlert.tsx.html +202 -0
  155. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/PasswordInput.tsx.html +346 -0
  156. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/index.html +161 -0
  157. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/index.ts.html +106 -0
  158. package/coverage/lcov-report/components/CrudifyLogin/Forms/index.html +176 -0
  159. package/coverage/lcov-report/components/CrudifyLogin/Forms/index.ts.html +145 -0
  160. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/errorTranslation.ts.html +268 -0
  161. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/index.html +161 -0
  162. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/index.ts.html +121 -0
  163. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/paramUtils.ts.html +496 -0
  164. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/validation.ts.html +307 -0
  165. package/coverage/lcov-report/components/CrudifyLogin/components/CrudifyInitializer.tsx.html +268 -0
  166. package/coverage/lcov-report/components/CrudifyLogin/components/index.html +116 -0
  167. package/coverage/lcov-report/components/CrudifyLogin/context/CrudifyProvider.tsx.html +409 -0
  168. package/coverage/lcov-report/components/CrudifyLogin/context/I18nProvider.tsx.html +430 -0
  169. package/coverage/lcov-report/components/CrudifyLogin/context/LoginStateProvider.tsx.html +1261 -0
  170. package/coverage/lcov-report/components/CrudifyLogin/context/index.html +161 -0
  171. package/coverage/lcov-report/components/CrudifyLogin/context/index.ts.html +91 -0
  172. package/coverage/lcov-report/components/CrudifyLogin/hooks/index.html +131 -0
  173. package/coverage/lcov-report/components/CrudifyLogin/hooks/useCrudifyLogin.ts.html +463 -0
  174. package/coverage/lcov-report/components/CrudifyLogin/hooks/useTranslationsFromUrl.ts.html +391 -0
  175. package/coverage/lcov-report/components/CrudifyLogin/index.html +116 -0
  176. package/coverage/lcov-report/components/CrudifyLogin/index.tsx.html +466 -0
  177. package/coverage/lcov-report/components/CrudifyLogin/utils/index.html +116 -0
  178. package/coverage/lcov-report/components/CrudifyLogin/utils/secureStorage.ts.html +859 -0
  179. package/coverage/lcov-report/components/GlobalNotificationProvider.tsx.html +844 -0
  180. package/coverage/lcov-report/components/LoginComponent.tsx.html +676 -0
  181. package/coverage/lcov-report/components/PasswordRequirements/index.html +116 -0
  182. package/coverage/lcov-report/components/PasswordRequirements/index.tsx.html +232 -0
  183. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/FieldSelector.tsx.html +1078 -0
  184. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/index.html +131 -0
  185. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/index.ts.html +88 -0
  186. package/coverage/lcov-report/components/PublicPolicies/Policies.tsx.html +625 -0
  187. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/PolicyItem.tsx.html +886 -0
  188. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/index.html +131 -0
  189. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/index.ts.html +88 -0
  190. package/coverage/lcov-report/components/PublicPolicies/constants.ts.html +106 -0
  191. package/coverage/lcov-report/components/PublicPolicies/index.html +146 -0
  192. package/coverage/lcov-report/components/PublicPolicies/index.ts.html +88 -0
  193. package/coverage/lcov-report/components/Routing/AuthRoute.tsx.html +382 -0
  194. package/coverage/lcov-report/components/Routing/GuestRoute.tsx.html +352 -0
  195. package/coverage/lcov-report/components/Routing/ProtectedRoute.tsx.html +316 -0
  196. package/coverage/lcov-report/components/Routing/index.html +161 -0
  197. package/coverage/lcov-report/components/Routing/index.ts.html +109 -0
  198. package/coverage/lcov-report/components/SessionLoadingScreen/index.html +116 -0
  199. package/coverage/lcov-report/components/SessionLoadingScreen/index.tsx.html +379 -0
  200. package/coverage/lcov-report/components/SessionTimeIndicator/index.html +116 -0
  201. package/coverage/lcov-report/components/SessionTimeIndicator/index.tsx.html +523 -0
  202. package/coverage/lcov-report/components/UserProfile/UserProfileDisplay.tsx.html +931 -0
  203. package/coverage/lcov-report/components/UserProfile/index.html +131 -0
  204. package/coverage/lcov-report/components/UserProfile/index.ts.html +88 -0
  205. package/coverage/lcov-report/components/index.html +191 -0
  206. package/coverage/lcov-report/components/index.ts.html +178 -0
  207. package/coverage/lcov-report/core/CrossTabSyncManager.ts.html +853 -0
  208. package/coverage/lcov-report/core/CrudifyInitializationManager.ts.html +1279 -0
  209. package/coverage/lcov-report/core/SessionManager.ts.html +3064 -0
  210. package/coverage/lcov-report/core/index.html +146 -0
  211. package/coverage/lcov-report/hooks/index.html +191 -0
  212. package/coverage/lcov-report/hooks/index.ts.html +136 -0
  213. package/coverage/lcov-report/hooks/useAuth.ts.html +529 -0
  214. package/coverage/lcov-report/hooks/useAutoGenerate.ts.html +571 -0
  215. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/constants.ts.html +247 -0
  216. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/hooks/index.html +116 -0
  217. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/hooks/useCrudOperations.ts.html +820 -0
  218. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/index.html +146 -0
  219. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/index.ts.html +118 -0
  220. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/useCrudifyWithNotifications.ts.html +565 -0
  221. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/errorMessageResolver.ts.html +847 -0
  222. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/index.html +146 -0
  223. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/notificationFilters.ts.html +313 -0
  224. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/successMessageResolver.ts.html +265 -0
  225. package/coverage/lcov-report/hooks/useData.ts.html +829 -0
  226. package/coverage/lcov-report/hooks/useFileUpload/index.html +131 -0
  227. package/coverage/lcov-report/hooks/useFileUpload/index.ts.html +112 -0
  228. package/coverage/lcov-report/hooks/useFileUpload/services/index.html +131 -0
  229. package/coverage/lcov-report/hooks/useFileUpload/services/index.ts.html +106 -0
  230. package/coverage/lcov-report/hooks/useFileUpload/services/uploadService.ts.html +610 -0
  231. package/coverage/lcov-report/hooks/useFileUpload/useFileUpload.ts.html +2092 -0
  232. package/coverage/lcov-report/hooks/useFileUpload/utils/fileUtils.ts.html +271 -0
  233. package/coverage/lcov-report/hooks/useFileUpload/utils/index.html +161 -0
  234. package/coverage/lcov-report/hooks/useFileUpload/utils/index.ts.html +109 -0
  235. package/coverage/lcov-report/hooks/useFileUpload/utils/mimeTypes.ts.html +235 -0
  236. package/coverage/lcov-report/hooks/useFileUpload/utils/validation.ts.html +403 -0
  237. package/coverage/lcov-report/hooks/useSession/constants.ts.html +217 -0
  238. package/coverage/lcov-report/hooks/useSession/hooks/index.html +176 -0
  239. package/coverage/lcov-report/hooks/useSession/hooks/useAuthEventSubscriber.ts.html +331 -0
  240. package/coverage/lcov-report/hooks/useSession/hooks/useCrossTabSync.ts.html +535 -0
  241. package/coverage/lcov-report/hooks/useSession/hooks/useSessionActions.ts.html +664 -0
  242. package/coverage/lcov-report/hooks/useSession/hooks/useSessionState.ts.html +295 -0
  243. package/coverage/lcov-report/hooks/useSession/hooks/useTokenRefreshScheduler.ts.html +535 -0
  244. package/coverage/lcov-report/hooks/useSession/index.html +161 -0
  245. package/coverage/lcov-report/hooks/useSession/index.ts.html +127 -0
  246. package/coverage/lcov-report/hooks/useSession/types.ts.html +427 -0
  247. package/coverage/lcov-report/hooks/useSession/useSession.ts.html +526 -0
  248. package/coverage/lcov-report/hooks/useSession/utils/index.html +131 -0
  249. package/coverage/lcov-report/hooks/useSession/utils/initializeSession.ts.html +424 -0
  250. package/coverage/lcov-report/hooks/useSession/utils/tokenUtils.ts.html +298 -0
  251. package/coverage/lcov-report/hooks/useUserData.ts.html +1210 -0
  252. package/coverage/lcov-report/hooks/useUserProfile.ts.html +820 -0
  253. package/coverage/lcov-report/index.html +205 -235
  254. package/coverage/lcov-report/providers/CrudifyThemeProvider.tsx.html +316 -0
  255. package/coverage/lcov-report/providers/SessionProvider.tsx.html +1120 -0
  256. package/coverage/lcov-report/providers/TranslationsProvider.tsx.html +1756 -0
  257. package/coverage/lcov-report/providers/index.html +146 -0
  258. package/coverage/lcov-report/services/credentialsEventBus.ts.html +319 -0
  259. package/coverage/lcov-report/services/crudifyAdminWrapper.ts.html +754 -0
  260. package/coverage/lcov-report/services/index.html +146 -0
  261. package/coverage/lcov-report/services/translationService.ts.html +1558 -0
  262. package/coverage/lcov-report/translations/critical.ts.html +1216 -0
  263. package/coverage/lcov-report/translations/index.html +116 -0
  264. package/coverage/lcov-report/types/index.html +116 -0
  265. package/coverage/lcov-report/types/password.ts.html +178 -0
  266. package/coverage/lcov-report/utils/authErrorDetector.ts.html +793 -0
  267. package/coverage/lcov-report/utils/authEventBus.ts.html +454 -0
  268. package/coverage/lcov-report/utils/configResolver.ts.html +460 -0
  269. package/coverage/lcov-report/utils/cookieSync.ts.html +595 -0
  270. package/coverage/lcov-report/utils/errorHandler.ts.html +1480 -0
  271. package/coverage/lcov-report/utils/errorTranslation.ts.html +868 -0
  272. package/coverage/lcov-report/utils/index.html +341 -0
  273. package/coverage/lcov-report/utils/index.ts.html +193 -0
  274. package/coverage/lcov-report/utils/jwtUtils.ts.html +325 -0
  275. package/coverage/lcov-report/utils/logger.ts.html +952 -0
  276. package/coverage/lcov-report/utils/navigationTracker.ts.html +562 -0
  277. package/coverage/lcov-report/utils/passwordValidation.ts.html +259 -0
  278. package/coverage/lcov-report/utils/preAuthCheck.ts.html +442 -0
  279. package/coverage/lcov-report/utils/redirectSecurity.ts.html +733 -0
  280. package/coverage/lcov-report/utils/tenantConfig.ts.html +712 -0
  281. package/coverage/lcov-report/utils/tokenStorage.ts.html +1825 -0
  282. package/coverage/lcov-report/utils/webCrypto.ts.html +490 -0
  283. package/coverage/lcov.info +14988 -14009
  284. package/coverage/providers/CrudifyThemeProvider.tsx.html +316 -0
  285. package/coverage/providers/SessionProvider.tsx.html +1120 -0
  286. package/coverage/providers/TranslationsProvider.tsx.html +1756 -0
  287. package/coverage/providers/index.html +146 -0
  288. package/coverage/services/credentialsEventBus.ts.html +319 -0
  289. package/coverage/services/crudifyAdminWrapper.ts.html +754 -0
  290. package/coverage/services/index.html +146 -0
  291. package/coverage/services/translationService.ts.html +1558 -0
  292. package/coverage/translations/critical.ts.html +1216 -0
  293. package/coverage/translations/index.html +116 -0
  294. package/coverage/types/index.html +116 -0
  295. package/coverage/types/password.ts.html +178 -0
  296. package/coverage/utils/authErrorDetector.ts.html +793 -0
  297. package/coverage/utils/authEventBus.ts.html +454 -0
  298. package/coverage/utils/configResolver.ts.html +460 -0
  299. package/coverage/utils/cookieSync.ts.html +595 -0
  300. package/coverage/utils/errorHandler.ts.html +1480 -0
  301. package/coverage/utils/errorTranslation.ts.html +868 -0
  302. package/coverage/utils/index.html +341 -0
  303. package/coverage/utils/index.ts.html +193 -0
  304. package/coverage/utils/jwtUtils.ts.html +325 -0
  305. package/coverage/utils/logger.ts.html +952 -0
  306. package/coverage/utils/navigationTracker.ts.html +562 -0
  307. package/coverage/utils/passwordValidation.ts.html +259 -0
  308. package/coverage/utils/preAuthCheck.ts.html +442 -0
  309. package/coverage/utils/redirectSecurity.ts.html +733 -0
  310. package/coverage/utils/tenantConfig.ts.html +712 -0
  311. package/coverage/utils/tokenStorage.ts.html +1825 -0
  312. package/coverage/utils/webCrypto.ts.html +490 -0
  313. package/dist/{CrudiaMarkdownField-CkiBwG-U.d.ts → CrudiaMarkdownField-DM6NR8zw.d.mts} +22 -22
  314. package/dist/{CrudiaMarkdownField-D-DqiXMQ.d.mts → CrudiaMarkdownField-UJaiSq9_.d.ts} +22 -22
  315. package/dist/{GlobalNotificationProvider-CdwdNv_8.d.mts → GlobalNotificationProvider-Cx540WKg.d.mts} +15 -15
  316. package/dist/{GlobalNotificationProvider-CdwdNv_8.d.ts → GlobalNotificationProvider-Cx540WKg.d.ts} +15 -15
  317. package/dist/chunk-2DXLCBOT.mjs +1 -0
  318. package/dist/chunk-DYRZIARH.js +1 -0
  319. package/dist/chunk-GCSJXEGT.mjs +1 -0
  320. package/dist/chunk-GJUZD5ZN.js +1 -0
  321. package/dist/chunk-K47I475N.js +1 -0
  322. package/dist/chunk-OCYZGEM5.mjs +1 -0
  323. package/dist/chunk-PI7HPRDB.js +1 -0
  324. package/dist/chunk-QVEUGJBY.mjs +1 -0
  325. package/dist/chunk-UROR7G7N.mjs +1 -0
  326. package/dist/chunk-XFT47DEL.js +1 -0
  327. package/dist/components.d.mts +8 -8
  328. package/dist/components.d.ts +8 -8
  329. package/dist/components.js +1 -1
  330. package/dist/components.mjs +1 -1
  331. package/dist/{errorTranslation-CF-5JClP.d.ts → errorTranslation-BEWwDbCH.d.ts} +1 -1
  332. package/dist/{errorTranslation-BcX8AaK7.d.mts → errorTranslation-DsGZon0M.d.mts} +1 -1
  333. package/dist/hooks.d.mts +3 -3
  334. package/dist/hooks.d.ts +3 -3
  335. package/dist/hooks.js +1 -1
  336. package/dist/hooks.mjs +1 -1
  337. package/dist/{index-DEDnmsdO.d.ts → index-Dnmttf62.d.ts} +131 -114
  338. package/dist/{index-D06kTP0C.d.mts → index-ZcF6nJt4.d.mts} +131 -114
  339. package/dist/index.d.mts +153 -106
  340. package/dist/index.d.ts +153 -106
  341. package/dist/index.js +2 -2
  342. package/dist/index.mjs +2 -2
  343. package/dist/{tenantConfig-CYnS9TPV.d.mts → tenantConfig-DxpfrAof.d.mts} +1 -1
  344. package/dist/{tenantConfig-CYnS9TPV.d.ts → tenantConfig-DxpfrAof.d.ts} +1 -1
  345. package/dist/utils.d.mts +25 -25
  346. package/dist/utils.d.ts +25 -25
  347. package/dist/utils.js +1 -1
  348. package/dist/utils.mjs +1 -1
  349. package/eslint.config.mjs +2 -2
  350. package/package.json +1 -1
  351. package/tests/helpers/mockFactories.ts +218 -0
  352. package/tests/helpers/testUtils.tsx +66 -1
  353. package/vitest.config.ts +1 -0
  354. package/dist/chunk-2WAUZ6KI.js +0 -1
  355. package/dist/chunk-3IGZNZCT.mjs +0 -1
  356. package/dist/chunk-43L2PP77.mjs +0 -1
  357. package/dist/chunk-6VS5OT3A.mjs +0 -1
  358. package/dist/chunk-BWJTTMKS.js +0 -1
  359. package/dist/chunk-EMPPCCVU.js +0 -1
  360. package/dist/chunk-J43UPGBE.js +0 -1
  361. package/dist/chunk-K6ZRXOJ7.mjs +0 -1
  362. package/dist/chunk-RYQQZTEP.js +0 -1
  363. package/dist/chunk-VTMSOK4V.mjs +0 -1
@@ -0,0 +1,1312 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for components/CrudiaFileField/CrudiaFileField.tsx</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">components/CrudiaFileField</a> CrudiaFileField.tsx</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">97.31% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>398/409</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">87.75% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>43/49</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">80% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>4/5</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">97.31% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>398/409</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
476
+ <span class="cline-any cline-yes">1x</span>
477
+ <span class="cline-any cline-yes">1x</span>
478
+ <span class="cline-any cline-yes">1x</span>
479
+ <span class="cline-any cline-yes">1x</span>
480
+ <span class="cline-any cline-yes">1x</span>
481
+ <span class="cline-any cline-yes">1x</span>
482
+ <span class="cline-any cline-yes">1x</span>
483
+ <span class="cline-any cline-yes">1x</span>
484
+ <span class="cline-any cline-yes">1x</span>
485
+ <span class="cline-any cline-yes">1x</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">1x</span>
488
+ <span class="cline-any cline-yes">1x</span>
489
+ <span class="cline-any cline-yes">1x</span>
490
+ <span class="cline-any cline-yes">1x</span>
491
+ <span class="cline-any cline-yes">1x</span>
492
+ <span class="cline-any cline-yes">1x</span>
493
+ <span class="cline-any cline-yes">1x</span>
494
+ <span class="cline-any cline-yes">1x</span>
495
+ <span class="cline-any cline-yes">1x</span>
496
+ <span class="cline-any cline-yes">1x</span>
497
+ <span class="cline-any cline-yes">1x</span>
498
+ <span class="cline-any cline-yes">1x</span>
499
+ <span class="cline-any cline-yes">1x</span>
500
+ <span class="cline-any cline-yes">1x</span>
501
+ <span class="cline-any cline-yes">1x</span>
502
+ <span class="cline-any cline-yes">1x</span>
503
+ <span class="cline-any cline-yes">1x</span>
504
+ <span class="cline-any cline-yes">1x</span>
505
+ <span class="cline-any cline-yes">1x</span>
506
+ <span class="cline-any cline-yes">1x</span>
507
+ <span class="cline-any cline-yes">1x</span>
508
+ <span class="cline-any cline-yes">1x</span>
509
+ <span class="cline-any cline-yes">1x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">33x</span>
512
+ <span class="cline-any cline-yes">33x</span>
513
+ <span class="cline-any cline-yes">1x</span>
514
+ <span class="cline-any cline-yes">1x</span>
515
+ <span class="cline-any cline-yes">1x</span>
516
+ <span class="cline-any cline-yes">1x</span>
517
+ <span class="cline-any cline-yes">1x</span>
518
+ <span class="cline-any cline-yes">1x</span>
519
+ <span class="cline-any cline-yes">1x</span>
520
+ <span class="cline-any cline-yes">1x</span>
521
+ <span class="cline-any cline-yes">1x</span>
522
+ <span class="cline-any cline-yes">1x</span>
523
+ <span class="cline-any cline-yes">1x</span>
524
+ <span class="cline-any cline-yes">1x</span>
525
+ <span class="cline-any cline-yes">1x</span>
526
+ <span class="cline-any cline-yes">1x</span>
527
+ <span class="cline-any cline-yes">1x</span>
528
+ <span class="cline-any cline-yes">1x</span>
529
+ <span class="cline-any cline-yes">1x</span>
530
+ <span class="cline-any cline-yes">1x</span>
531
+ <span class="cline-any cline-yes">1x</span>
532
+ <span class="cline-any cline-yes">1x</span>
533
+ <span class="cline-any cline-yes">1x</span>
534
+ <span class="cline-any cline-yes">1x</span>
535
+ <span class="cline-any cline-yes">1x</span>
536
+ <span class="cline-any cline-yes">1x</span>
537
+ <span class="cline-any cline-yes">1x</span>
538
+ <span class="cline-any cline-yes">1x</span>
539
+ <span class="cline-any cline-yes">1x</span>
540
+ <span class="cline-any cline-yes">1x</span>
541
+ <span class="cline-any cline-yes">1x</span>
542
+ <span class="cline-any cline-yes">1x</span>
543
+ <span class="cline-any cline-yes">1x</span>
544
+ <span class="cline-any cline-yes">1x</span>
545
+ <span class="cline-any cline-yes">1x</span>
546
+ <span class="cline-any cline-yes">1x</span>
547
+ <span class="cline-any cline-yes">108x</span>
548
+ <span class="cline-any cline-yes">108x</span>
549
+ <span class="cline-any cline-yes">108x</span>
550
+ <span class="cline-any cline-yes">108x</span>
551
+ <span class="cline-any cline-yes">108x</span>
552
+ <span class="cline-any cline-yes">108x</span>
553
+ <span class="cline-any cline-yes">108x</span>
554
+ <span class="cline-any cline-yes">108x</span>
555
+ <span class="cline-any cline-yes">108x</span>
556
+ <span class="cline-any cline-yes">108x</span>
557
+ <span class="cline-any cline-yes">108x</span>
558
+ <span class="cline-any cline-yes">108x</span>
559
+ <span class="cline-any cline-yes">108x</span>
560
+ <span class="cline-any cline-yes">108x</span>
561
+ <span class="cline-any cline-yes">108x</span>
562
+ <span class="cline-any cline-yes">108x</span>
563
+ <span class="cline-any cline-yes">108x</span>
564
+ <span class="cline-any cline-yes">108x</span>
565
+ <span class="cline-any cline-yes">108x</span>
566
+ <span class="cline-any cline-yes">108x</span>
567
+ <span class="cline-any cline-yes">108x</span>
568
+ <span class="cline-any cline-yes">108x</span>
569
+ <span class="cline-any cline-yes">108x</span>
570
+ <span class="cline-any cline-yes">108x</span>
571
+ <span class="cline-any cline-yes">108x</span>
572
+ <span class="cline-any cline-yes">108x</span>
573
+ <span class="cline-any cline-yes">108x</span>
574
+ <span class="cline-any cline-yes">108x</span>
575
+ <span class="cline-any cline-yes">108x</span>
576
+ <span class="cline-any cline-yes">108x</span>
577
+ <span class="cline-any cline-yes">108x</span>
578
+ <span class="cline-any cline-yes">108x</span>
579
+ <span class="cline-any cline-yes">108x</span>
580
+ <span class="cline-any cline-yes">108x</span>
581
+ <span class="cline-any cline-yes">108x</span>
582
+ <span class="cline-any cline-yes">108x</span>
583
+ <span class="cline-any cline-yes">108x</span>
584
+ <span class="cline-any cline-yes">108x</span>
585
+ <span class="cline-any cline-yes">108x</span>
586
+ <span class="cline-any cline-yes">37x</span>
587
+ <span class="cline-any cline-yes">28x</span>
588
+ <span class="cline-any cline-yes">28x</span>
589
+ <span class="cline-any cline-yes">28x</span>
590
+ <span class="cline-any cline-yes">28x</span>
591
+ <span class="cline-any cline-yes">28x</span>
592
+ <span class="cline-any cline-no">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-yes">28x</span>
595
+ <span class="cline-any cline-yes">37x</span>
596
+ <span class="cline-any cline-yes">37x</span>
597
+ <span class="cline-any cline-yes">37x</span>
598
+ <span class="cline-any cline-yes">108x</span>
599
+ <span class="cline-any cline-yes">108x</span>
600
+ <span class="cline-any cline-yes">108x</span>
601
+ <span class="cline-any cline-yes">108x</span>
602
+ <span class="cline-any cline-yes">108x</span>
603
+ <span class="cline-any cline-yes">108x</span>
604
+ <span class="cline-any cline-yes">108x</span>
605
+ <span class="cline-any cline-yes">108x</span>
606
+ <span class="cline-any cline-yes">108x</span>
607
+ <span class="cline-any cline-yes">108x</span>
608
+ <span class="cline-any cline-yes">108x</span>
609
+ <span class="cline-any cline-yes">108x</span>
610
+ <span class="cline-any cline-yes">108x</span>
611
+ <span class="cline-any cline-yes">108x</span>
612
+ <span class="cline-any cline-yes">108x</span>
613
+ <span class="cline-any cline-yes">108x</span>
614
+ <span class="cline-any cline-yes">108x</span>
615
+ <span class="cline-any cline-yes">108x</span>
616
+ <span class="cline-any cline-yes">108x</span>
617
+ <span class="cline-any cline-yes">108x</span>
618
+ <span class="cline-any cline-yes">108x</span>
619
+ <span class="cline-any cline-yes">108x</span>
620
+ <span class="cline-any cline-yes">108x</span>
621
+ <span class="cline-any cline-yes">108x</span>
622
+ <span class="cline-any cline-yes">108x</span>
623
+ <span class="cline-any cline-yes">108x</span>
624
+ <span class="cline-any cline-yes">108x</span>
625
+ <span class="cline-any cline-yes">108x</span>
626
+ <span class="cline-any cline-no">&nbsp;</span>
627
+ <span class="cline-any cline-yes">108x</span>
628
+ <span class="cline-any cline-yes">108x</span>
629
+ <span class="cline-any cline-yes">108x</span>
630
+ <span class="cline-any cline-yes">108x</span>
631
+ <span class="cline-any cline-yes">108x</span>
632
+ <span class="cline-any cline-yes">108x</span>
633
+ <span class="cline-any cline-yes">108x</span>
634
+ <span class="cline-any cline-yes">108x</span>
635
+ <span class="cline-any cline-yes">108x</span>
636
+ <span class="cline-any cline-yes">108x</span>
637
+ <span class="cline-any cline-yes">108x</span>
638
+ <span class="cline-any cline-yes">108x</span>
639
+ <span class="cline-any cline-yes">108x</span>
640
+ <span class="cline-any cline-yes">22x</span>
641
+ <span class="cline-any cline-yes">22x</span>
642
+ <span class="cline-any cline-yes">22x</span>
643
+ <span class="cline-any cline-yes">22x</span>
644
+ <span class="cline-any cline-yes">22x</span>
645
+ <span class="cline-any cline-yes">22x</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-yes">22x</span>
648
+ <span class="cline-any cline-yes">22x</span>
649
+ <span class="cline-any cline-yes">22x</span>
650
+ <span class="cline-any cline-yes">22x</span>
651
+ <span class="cline-any cline-yes">108x</span>
652
+ <span class="cline-any cline-yes">108x</span>
653
+ <span class="cline-any cline-yes">108x</span>
654
+ <span class="cline-any cline-yes">108x</span>
655
+ <span class="cline-any cline-yes">66x</span>
656
+ <span class="cline-any cline-yes">108x</span>
657
+ <span class="cline-any cline-yes">108x</span>
658
+ <span class="cline-any cline-yes">108x</span>
659
+ <span class="cline-any cline-yes">108x</span>
660
+ <span class="cline-any cline-yes">108x</span>
661
+ <span class="cline-any cline-yes">108x</span>
662
+ <span class="cline-any cline-yes">108x</span>
663
+ <span class="cline-any cline-yes">1x</span>
664
+ <span class="cline-any cline-yes">1x</span>
665
+ <span class="cline-any cline-yes">1x</span>
666
+ <span class="cline-any cline-yes">1x</span>
667
+ <span class="cline-any cline-yes">1x</span>
668
+ <span class="cline-any cline-yes">1x</span>
669
+ <span class="cline-any cline-yes">1x</span>
670
+ <span class="cline-any cline-yes">1x</span>
671
+ <span class="cline-any cline-yes">1x</span>
672
+ <span class="cline-any cline-yes">1x</span>
673
+ <span class="cline-any cline-yes">1x</span>
674
+ <span class="cline-any cline-yes">108x</span>
675
+ <span class="cline-any cline-yes">108x</span>
676
+ <span class="cline-any cline-yes">108x</span>
677
+ <span class="cline-any cline-yes">108x</span>
678
+ <span class="cline-any cline-yes">108x</span>
679
+ <span class="cline-any cline-yes">108x</span>
680
+ <span class="cline-any cline-yes">108x</span>
681
+ <span class="cline-any cline-yes">108x</span>
682
+ <span class="cline-any cline-yes">108x</span>
683
+ <span class="cline-any cline-yes">108x</span>
684
+ <span class="cline-any cline-yes">108x</span>
685
+ <span class="cline-any cline-yes">108x</span>
686
+ <span class="cline-any cline-yes">108x</span>
687
+ <span class="cline-any cline-yes">108x</span>
688
+ <span class="cline-any cline-yes">108x</span>
689
+ <span class="cline-any cline-yes">108x</span>
690
+ <span class="cline-any cline-no">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-yes">108x</span>
693
+ <span class="cline-any cline-yes">108x</span>
694
+ <span class="cline-any cline-yes">108x</span>
695
+ <span class="cline-any cline-yes">108x</span>
696
+ <span class="cline-any cline-yes">108x</span>
697
+ <span class="cline-any cline-yes">108x</span>
698
+ <span class="cline-any cline-yes">108x</span>
699
+ <span class="cline-any cline-yes">108x</span>
700
+ <span class="cline-any cline-yes">108x</span>
701
+ <span class="cline-any cline-yes">108x</span>
702
+ <span class="cline-any cline-yes">108x</span>
703
+ <span class="cline-any cline-yes">108x</span>
704
+ <span class="cline-any cline-yes">108x</span>
705
+ <span class="cline-any cline-yes">5x</span>
706
+ <span class="cline-any cline-yes">5x</span>
707
+ <span class="cline-any cline-yes">5x</span>
708
+ <span class="cline-any cline-yes">5x</span>
709
+ <span class="cline-any cline-yes">5x</span>
710
+ <span class="cline-any cline-yes">5x</span>
711
+ <span class="cline-any cline-yes">5x</span>
712
+ <span class="cline-any cline-yes">5x</span>
713
+ <span class="cline-any cline-yes">5x</span>
714
+ <span class="cline-any cline-yes">5x</span>
715
+ <span class="cline-any cline-yes">108x</span>
716
+ <span class="cline-any cline-yes">108x</span>
717
+ <span class="cline-any cline-yes">108x</span>
718
+ <span class="cline-any cline-yes">108x</span>
719
+ <span class="cline-any cline-yes">108x</span>
720
+ <span class="cline-any cline-yes">108x</span>
721
+ <span class="cline-any cline-yes">108x</span>
722
+ <span class="cline-any cline-yes">108x</span>
723
+ <span class="cline-any cline-yes">108x</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-yes">108x</span>
728
+ <span class="cline-any cline-yes">108x</span>
729
+ <span class="cline-any cline-yes">108x</span>
730
+ <span class="cline-any cline-yes">108x</span>
731
+ <span class="cline-any cline-yes">108x</span>
732
+ <span class="cline-any cline-yes">108x</span>
733
+ <span class="cline-any cline-yes">108x</span>
734
+ <span class="cline-any cline-yes">108x</span>
735
+ <span class="cline-any cline-yes">6x</span>
736
+ <span class="cline-any cline-yes">6x</span>
737
+ <span class="cline-any cline-yes">6x</span>
738
+ <span class="cline-any cline-yes">3x</span>
739
+ <span class="cline-any cline-yes">3x</span>
740
+ <span class="cline-any cline-yes">3x</span>
741
+ <span class="cline-any cline-yes">6x</span>
742
+ <span class="cline-any cline-yes">6x</span>
743
+ <span class="cline-any cline-yes">108x</span>
744
+ <span class="cline-any cline-yes">108x</span>
745
+ <span class="cline-any cline-yes">108x</span>
746
+ <span class="cline-any cline-yes">108x</span>
747
+ <span class="cline-any cline-yes">108x</span>
748
+ <span class="cline-any cline-yes">108x</span>
749
+ <span class="cline-any cline-yes">108x</span>
750
+ <span class="cline-any cline-yes">108x</span>
751
+ <span class="cline-any cline-yes">108x</span>
752
+ <span class="cline-any cline-yes">108x</span>
753
+ <span class="cline-any cline-yes">108x</span>
754
+ <span class="cline-any cline-yes">108x</span>
755
+ <span class="cline-any cline-yes">108x</span>
756
+ <span class="cline-any cline-yes">108x</span>
757
+ <span class="cline-any cline-yes">108x</span>
758
+ <span class="cline-any cline-yes">108x</span>
759
+ <span class="cline-any cline-yes">108x</span>
760
+ <span class="cline-any cline-yes">108x</span>
761
+ <span class="cline-any cline-yes">108x</span>
762
+ <span class="cline-any cline-yes">108x</span>
763
+ <span class="cline-any cline-yes">108x</span>
764
+ <span class="cline-any cline-yes">108x</span>
765
+ <span class="cline-any cline-yes">108x</span>
766
+ <span class="cline-any cline-yes">108x</span>
767
+ <span class="cline-any cline-yes">108x</span>
768
+ <span class="cline-any cline-yes">102x</span>
769
+ <span class="cline-any cline-yes">108x</span>
770
+ <span class="cline-any cline-yes">108x</span>
771
+ <span class="cline-any cline-yes">108x</span>
772
+ <span class="cline-any cline-yes">108x</span>
773
+ <span class="cline-any cline-yes">108x</span>
774
+ <span class="cline-any cline-yes">66x</span>
775
+ <span class="cline-any cline-yes">2x</span>
776
+ <span class="cline-any cline-yes">2x</span>
777
+ <span class="cline-any cline-yes">64x</span>
778
+ <span class="cline-any cline-yes">66x</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-yes">64x</span>
782
+ <span class="cline-any cline-yes">64x</span>
783
+ <span class="cline-any cline-yes">66x</span>
784
+ <span class="cline-any cline-yes">108x</span>
785
+ <span class="cline-any cline-yes">108x</span>
786
+ <span class="cline-any cline-yes">108x</span>
787
+ <span class="cline-any cline-yes">108x</span>
788
+ <span class="cline-any cline-yes">108x</span>
789
+ <span class="cline-any cline-yes">108x</span>
790
+ <span class="cline-any cline-yes">6x</span>
791
+ <span class="cline-any cline-yes">6x</span>
792
+ <span class="cline-any cline-yes">6x</span>
793
+ <span class="cline-any cline-yes">6x</span>
794
+ <span class="cline-any cline-yes">6x</span>
795
+ <span class="cline-any cline-yes">6x</span>
796
+ <span class="cline-any cline-yes">6x</span>
797
+ <span class="cline-any cline-yes">6x</span>
798
+ <span class="cline-any cline-yes">6x</span>
799
+ <span class="cline-any cline-yes">6x</span>
800
+ <span class="cline-any cline-yes">6x</span>
801
+ <span class="cline-any cline-yes">108x</span>
802
+ <span class="cline-any cline-yes">108x</span>
803
+ <span class="cline-any cline-yes">108x</span>
804
+ <span class="cline-any cline-yes">108x</span>
805
+ <span class="cline-any cline-yes">108x</span>
806
+ <span class="cline-any cline-yes">108x</span>
807
+ <span class="cline-any cline-yes">108x</span>
808
+ <span class="cline-any cline-yes">108x</span>
809
+ <span class="cline-any cline-yes">108x</span>
810
+ <span class="cline-any cline-yes">108x</span>
811
+ <span class="cline-any cline-yes">108x</span>
812
+ <span class="cline-any cline-yes">108x</span>
813
+ <span class="cline-any cline-yes">108x</span>
814
+ <span class="cline-any cline-yes">108x</span>
815
+ <span class="cline-any cline-yes">108x</span>
816
+ <span class="cline-any cline-yes">108x</span>
817
+ <span class="cline-any cline-yes">66x</span>
818
+ <span class="cline-any cline-yes">66x</span>
819
+ <span class="cline-any cline-yes">66x</span>
820
+ <span class="cline-any cline-yes">66x</span>
821
+ <span class="cline-any cline-yes">66x</span>
822
+ <span class="cline-any cline-yes">66x</span>
823
+ <span class="cline-any cline-yes">66x</span>
824
+ <span class="cline-any cline-yes">66x</span>
825
+ <span class="cline-any cline-yes">66x</span>
826
+ <span class="cline-any cline-yes">66x</span>
827
+ <span class="cline-any cline-yes">66x</span>
828
+ <span class="cline-any cline-yes">108x</span>
829
+ <span class="cline-any cline-yes">108x</span>
830
+ <span class="cline-any cline-yes">108x</span>
831
+ <span class="cline-any cline-yes">108x</span>
832
+ <span class="cline-any cline-yes">39x</span>
833
+ <span class="cline-any cline-yes">39x</span>
834
+ <span class="cline-any cline-yes">39x</span>
835
+ <span class="cline-any cline-yes">39x</span>
836
+ <span class="cline-any cline-yes">39x</span>
837
+ <span class="cline-any cline-yes">39x</span>
838
+ <span class="cline-any cline-yes">39x</span>
839
+ <span class="cline-any cline-yes">39x</span>
840
+ <span class="cline-any cline-yes">39x</span>
841
+ <span class="cline-any cline-yes">39x</span>
842
+ <span class="cline-any cline-yes">39x</span>
843
+ <span class="cline-any cline-yes">39x</span>
844
+ <span class="cline-any cline-yes">39x</span>
845
+ <span class="cline-any cline-yes">108x</span>
846
+ <span class="cline-any cline-yes">108x</span>
847
+ <span class="cline-any cline-yes">108x</span>
848
+ <span class="cline-any cline-yes">108x</span>
849
+ <span class="cline-any cline-yes">10x</span>
850
+ <span class="cline-any cline-yes">10x</span>
851
+ <span class="cline-any cline-yes">10x</span>
852
+ <span class="cline-any cline-yes">10x</span>
853
+ <span class="cline-any cline-yes">10x</span>
854
+ <span class="cline-any cline-yes">10x</span>
855
+ <span class="cline-any cline-yes">108x</span>
856
+ <span class="cline-any cline-yes">108x</span>
857
+ <span class="cline-any cline-yes">108x</span>
858
+ <span class="cline-any cline-yes">108x</span>
859
+ <span class="cline-any cline-yes">6x</span>
860
+ <span class="cline-any cline-yes">6x</span>
861
+ <span class="cline-any cline-yes">6x</span>
862
+ <span class="cline-any cline-yes">6x</span>
863
+ <span class="cline-any cline-yes">6x</span>
864
+ <span class="cline-any cline-yes">108x</span>
865
+ <span class="cline-any cline-yes">108x</span>
866
+ <span class="cline-any cline-yes">108x</span>
867
+ <span class="cline-any cline-yes">108x</span>
868
+ <span class="cline-any cline-yes">108x</span>
869
+ <span class="cline-any cline-yes">108x</span>
870
+ <span class="cline-any cline-yes">108x</span>
871
+ <span class="cline-any cline-yes">108x</span>
872
+ <span class="cline-any cline-yes">108x</span>
873
+ <span class="cline-any cline-yes">108x</span>
874
+ <span class="cline-any cline-yes">108x</span>
875
+ <span class="cline-any cline-yes">108x</span>
876
+ <span class="cline-any cline-yes">108x</span>
877
+ <span class="cline-any cline-yes">108x</span>
878
+ <span class="cline-any cline-yes">108x</span>
879
+ <span class="cline-any cline-yes">108x</span>
880
+ <span class="cline-any cline-yes">108x</span>
881
+ <span class="cline-any cline-yes">108x</span>
882
+ <span class="cline-any cline-yes">1x</span>
883
+ <span class="cline-any cline-yes">1x</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
885
+ * File field component with:
886
+ * - Drag &amp; drop
887
+ * - File preview
888
+ * - Progress bar during upload
889
+ * - Delete files (soft delete)
890
+ * - Type and size validation
891
+ * - Single/multiple support
892
+ */
893
+ &nbsp;
894
+ import React, { useCallback, useRef } from 'react';
895
+ import { logger } from '../../utils/logger';
896
+ import Box from '@mui/material/Box';
897
+ import Typography from '@mui/material/Typography';
898
+ import CircularProgress from '@mui/material/CircularProgress';
899
+ import List from '@mui/material/List';
900
+ import FormHelperText from '@mui/material/FormHelperText';
901
+ import { useFileUpload, type FileItem, type UseFileUploadOptions } from '../../hooks/useFileUpload';
902
+ import { useTranslations } from '../../providers/TranslationsProvider';
903
+ &nbsp;
904
+ // Import types from dedicated types file
905
+ import type { CrudiaFileFieldProps } from './types';
906
+ &nbsp;
907
+ // Import utilities
908
+ import { sanitizeHelperTextHtml } from './utils/formatters';
909
+ &nbsp;
910
+ // Import extracted hooks
911
+ import { useDragDrop, useDeleteConfirmation } from './hooks';
912
+ &nbsp;
913
+ // Import extracted components
914
+ import { FileItemRow, DropZone, DeleteConfirmationDialog } from './components';
915
+ &nbsp;
916
+ // Re-export types for backwards compatibility
917
+ export type { CrudiaFileFieldDeletionHandlers, CrudiaFileFieldProps } from './types';
918
+ &nbsp;
919
+ const hasCompletedFilePath = (file: FileItem): file is FileItem &amp; { filePath: string } =&gt; {
920
+ return file.status === 'completed' &amp;&amp; typeof file.filePath === 'string' &amp;&amp; file.filePath.length &gt; 0;
921
+ };
922
+ &nbsp;
923
+ /**
924
+ * Main file field component
925
+ *
926
+ * @example
927
+ * ```tsx
928
+ * // Basic usage - single file
929
+ * &lt;CrudiaFileField
930
+ * label="Document"
931
+ * accept={["application/pdf"]}
932
+ * onChange={(filePaths) =&gt; setFormData({ ...formData, document: filePaths[0] })}
933
+ * /&gt;
934
+ *
935
+ * // Multiple files with limits
936
+ * &lt;CrudiaFileField
937
+ * label="Images"
938
+ * accept={["image/png", "image/jpeg"]}
939
+ * multiple
940
+ * maxFiles={5}
941
+ * minFiles={1}
942
+ * maxFileSize={5 * 1024 * 1024}
943
+ * onChange={(filePaths) =&gt; setFormData({ ...formData, images: filePaths })}
944
+ * /&gt;
945
+ *
946
+ * // With initial files (edit mode)
947
+ * &lt;CrudiaFileField
948
+ * label="Attachments"
949
+ * multiple
950
+ * initialFiles={existingFiles}
951
+ * onChange={handleFilesChange}
952
+ * /&gt;
953
+ * ```
954
+ */
955
+ export const CrudiaFileField: React.FC&lt;CrudiaFileFieldProps&gt; = ({
956
+ label,
957
+ accept,
958
+ maxFileSize = 10 * 1024 * 1024,
959
+ multiple = false,
960
+ maxFiles,
961
+ minFiles = 0,
962
+ required = false,
963
+ disabled = false,
964
+ error: externalError = false,
965
+ helperText: externalHelperText,
966
+ onChange,
967
+ onValidation,
968
+ initialFiles,
969
+ placeholder,
970
+ showFileList = true,
971
+ visibility = 'private',
972
+ showPreview: _showPreview = true,
973
+ baseUrl,
974
+ onDeletionHandlersReady,
975
+ mode = 'create',
976
+ name,
977
+ containerRef,
978
+ }) =&gt; {
979
+ const { t } = useTranslations();
980
+ const inputRef = useRef&lt;HTMLInputElement&gt;(null);
981
+ &nbsp;
982
+ // Calculate effective file limit
983
+ const effectiveMaxFiles = multiple ? maxFiles : 1;
984
+ const effectiveMinFiles = required ? Math.max(minFiles, 1) : minFiles;
985
+ &nbsp;
986
+ // Configure hook options
987
+ const uploadOptions: UseFileUploadOptions = {
988
+ acceptedTypes: accept,
989
+ maxFileSize,
990
+ maxFiles: effectiveMaxFiles,
991
+ minFiles: effectiveMinFiles,
992
+ visibility,
993
+ mode,
994
+ onFilesChange: (files) =&gt; {
995
+ const filePaths = files.filter(hasCompletedFilePath).map((f) =&gt; {
996
+ const path = f.filePath;
997
+ // Return only the relative path (without baseUrl)
998
+ // baseUrl is only used for displaying/downloading, not for saving
999
+ // Ensure path starts with /
1000
+ if (path.startsWith('/')) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1001
+ <span class="cstat-no" title="statement not covered" > return path;</span>
1002
+ <span class="cstat-no" title="statement not covered" > }</span>
1003
+ return `/${path}`;
1004
+ });
1005
+ onChange?.(filePaths);
1006
+ },
1007
+ };
1008
+ &nbsp;
1009
+ const {
1010
+ files,
1011
+ isUploading,
1012
+ addFiles,
1013
+ removeFile,
1014
+ restoreFile,
1015
+ retryUpload,
1016
+ isValid,
1017
+ validationError,
1018
+ validationErrorKey,
1019
+ validationErrorParams,
1020
+ initializeFiles,
1021
+ markAsTouched,
1022
+ isSubmitted,
1023
+ markAsSubmitted,
1024
+ commitDeletions,
1025
+ restorePendingDeletions,
1026
+ hasPendingDeletions,
1027
+ deleteFileImmediately,
1028
+ activeFileCount,
1029
+ waitForUploads,
1030
+ completedFilePaths,
1031
+ } = useFileUpload(uploadOptions);
1032
+ &nbsp;
1033
+ // Create a stable callback to get completed file paths
1034
+ const getCompletedFilePaths = useCallback(() =&gt; {
1035
+ <span class="cstat-no" title="statement not covered" > return completedFilePaths;</span>
1036
+ }, [completedFilePaths]);
1037
+ &nbsp;
1038
+ // Track if we've already initialized to avoid re-initializing on every render
1039
+ const hasInitializedRef = useRef(false);
1040
+ const initializationInProgressRef = useRef(false);
1041
+ &nbsp;
1042
+ // Initialize existing files - handles async loading of initialFiles
1043
+ // Pass baseUrl so the hook can extract relative paths from full URLs
1044
+ React.useEffect(() =&gt; {
1045
+ const shouldInitialize =
1046
+ initialFiles &amp;&amp; initialFiles.length &gt; 0 &amp;&amp; !hasInitializedRef.current &amp;&amp; !initializationInProgressRef.current;
1047
+ &nbsp;
1048
+ if (shouldInitialize) {
1049
+ initializationInProgressRef.current = true;
1050
+ &nbsp;
1051
+ try {
1052
+ initializeFiles(initialFiles, baseUrl);
1053
+ hasInitializedRef.current = true;
1054
+ <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
1055
+ <span class="cstat-no" title="statement not covered" > logger.error('Failed to initialize files', { error });</span>
1056
+ } finally {
1057
+ initializationInProgressRef.current = false;
1058
+ }
1059
+ }
1060
+ }, [initialFiles, initializeFiles, baseUrl]);
1061
+ &nbsp;
1062
+ // Notify validation
1063
+ React.useEffect(() =&gt; {
1064
+ onValidation?.(isValid, validationError);
1065
+ }, [isValid, validationError, onValidation]);
1066
+ &nbsp;
1067
+ // Notify deletion handlers when ready
1068
+ // This effect intentionally runs when any handler/state changes
1069
+ // to keep the consumer updated with the latest values
1070
+ React.useEffect(() =&gt; {
1071
+ if (onDeletionHandlersReady) {
1072
+ onDeletionHandlersReady({
1073
+ commitDeletions,
1074
+ restorePendingDeletions,
1075
+ hasPendingDeletions,
1076
+ markAsSubmitted,
1077
+ isValid,
1078
+ isUploading,
1079
+ waitForUploads,
1080
+ getCompletedFilePaths,
1081
+ });
1082
+ }
1083
+ }, [
1084
+ onDeletionHandlersReady,
1085
+ commitDeletions,
1086
+ restorePendingDeletions,
1087
+ hasPendingDeletions,
1088
+ markAsSubmitted,
1089
+ isValid,
1090
+ isUploading,
1091
+ waitForUploads,
1092
+ getCompletedFilePaths,
1093
+ ]);
1094
+ &nbsp;
1095
+ // Use extracted drag &amp; drop hook
1096
+ const { isDragging, handleDragOver, handleDragLeave, handleDrop } = useDragDrop({
1097
+ disabled,
1098
+ onFilesDropped: <span class="fstat-no" title="function not covered" >(files) =&gt; {</span>
1099
+ <span class="cstat-no" title="statement not covered" > void addFiles(files);</span>
1100
+ <span class="cstat-no" title="statement not covered" > },</span>
1101
+ onInteraction: markAsTouched,
1102
+ });
1103
+ &nbsp;
1104
+ // Use extracted delete confirmation hook
1105
+ const deleteConfirmation = useDeleteConfirmation({
1106
+ deleteFileImmediately,
1107
+ });
1108
+ &nbsp;
1109
+ /**
1110
+ * Handles file selection from input
1111
+ */
1112
+ const handleFileSelect = useCallback(
1113
+ (event: React.ChangeEvent&lt;HTMLInputElement&gt;) =&gt; {
1114
+ markAsTouched();
1115
+ const selectedFiles = event.target.files;
1116
+ if (selectedFiles &amp;&amp; selectedFiles.length &gt; 0) {
1117
+ addFiles(selectedFiles);
1118
+ }
1119
+ // Reset input to allow selecting the same file
1120
+ if (inputRef.current) {
1121
+ inputRef.current.value = '';
1122
+ }
1123
+ },
1124
+ [addFiles, markAsTouched]
1125
+ );
1126
+ &nbsp;
1127
+ /**
1128
+ * Opens file selector
1129
+ * Note: We don't call markAsTouched() here to avoid showing errors prematurely
1130
+ * Errors should only show after user interaction with files or form submission
1131
+ */
1132
+ const handleClick = useCallback(() =&gt; {
1133
+ <span class="cstat-no" title="statement not covered" > if (!disabled) {</span>
1134
+ <span class="cstat-no" title="statement not covered" > inputRef.current?.click();</span>
1135
+ <span class="cstat-no" title="statement not covered" > }</span>
1136
+ }, [disabled]);
1137
+ &nbsp;
1138
+ /**
1139
+ * Handle remove click - shows confirmation for immediate deletions
1140
+ * or marks as pendingDeletion for existing files in edit mode
1141
+ */
1142
+ const handleRemoveClick = useCallback(
1143
+ async (fileId: string) =&gt; {
1144
+ const result = await removeFile(fileId);
1145
+ &nbsp;
1146
+ if (result.needsConfirmation) {
1147
+ // Show confirmation dialog
1148
+ deleteConfirmation.openConfirmation(fileId);
1149
+ }
1150
+ // If no confirmation needed, file was marked as pendingDeletion
1151
+ },
1152
+ [removeFile, deleteConfirmation]
1153
+ );
1154
+ &nbsp;
1155
+ /**
1156
+ * Generates accept string for input
1157
+ */
1158
+ const acceptString = accept?.join(',') ?? '';
1159
+ &nbsp;
1160
+ /**
1161
+ * Determines whether to show drop zone
1162
+ * Don't show when disabled (readonly mode only shows file list)
1163
+ * Use activeFileCount to allow uploading when files are pending deletion
1164
+ */
1165
+ const showDropZone = !disabled &amp;&amp; (multiple || activeFileCount === 0);
1166
+ &nbsp;
1167
+ /**
1168
+ * Determines final error text
1169
+ * - External errors always show
1170
+ * - Internal validation errors only show after form submission (isSubmitted)
1171
+ * - NOT when just clicking the dropzone (isTouched)
1172
+ */
1173
+ const showInternalValidationError = <span class="branch-0 cbranch-no" title="branch not covered" >isSubmitted &amp;&amp; !isValid;</span>
1174
+ const hasError = externalError || showInternalValidationError;
1175
+ const finalHelperText =
1176
+ externalHelperText ||
1177
+ (<span class="branch-0 cbranch-no" title="branch not covered" >showInternalValidationError &amp;&amp; <span class="branch-0 cbranch-no" title="branch not covered" >validationErrorKey ? t</span>(validationErrorKey, validationErrorParams) : n</span>ull);
1178
+ &nbsp;
1179
+ /**
1180
+ * Generates placeholder text
1181
+ */
1182
+ const getPlaceholderText = (): string =&gt; {
1183
+ if (placeholder) {
1184
+ return placeholder;
1185
+ }
1186
+ &nbsp;
1187
+ if (isDragging) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1188
+ <span class="cstat-no" title="statement not covered" > return t('base.file.dropHere');</span>
1189
+ <span class="cstat-no" title="statement not covered" > }</span>
1190
+ &nbsp;
1191
+ return t('base.file.dragOrClick');
1192
+ };
1193
+ &nbsp;
1194
+ return (
1195
+ &lt;div ref={containerRef}&gt;
1196
+ &lt;Box sx={{ width: '100%' }}&gt;
1197
+ {/* Label */}
1198
+ {label &amp;&amp; (
1199
+ &lt;Typography
1200
+ variant="body2"
1201
+ sx={{
1202
+ mb: 1,
1203
+ fontWeight: 500,
1204
+ color: hasError ? 'error.main' : 'text.primary',
1205
+ }}
1206
+ &gt;
1207
+ {label}
1208
+ {required &amp;&amp; &lt;span style={{ color: 'red' }}&gt; *&lt;/span&gt;}
1209
+ &lt;/Typography&gt;
1210
+ )}
1211
+ &nbsp;
1212
+ {/* Hidden input */}
1213
+ &lt;input
1214
+ ref={inputRef}
1215
+ type="file"
1216
+ name={name}
1217
+ accept={acceptString}
1218
+ multiple={multiple}
1219
+ onChange={handleFileSelect}
1220
+ disabled={disabled}
1221
+ style={{ display: 'none' }}
1222
+ /&gt;
1223
+ &nbsp;
1224
+ {/* Drop Zone */}
1225
+ {showDropZone &amp;&amp; (
1226
+ &lt;DropZone
1227
+ isDragging={isDragging}
1228
+ disabled={disabled}
1229
+ hasError={hasError}
1230
+ placeholder={getPlaceholderText()}
1231
+ accept={accept}
1232
+ onClick={handleClick}
1233
+ onDragOver={handleDragOver}
1234
+ onDragLeave={handleDragLeave}
1235
+ onDrop={handleDrop}
1236
+ /&gt;
1237
+ )}
1238
+ &nbsp;
1239
+ {/* File list with thumbnails - works in all modes (edit and readonly) */}
1240
+ {showFileList &amp;&amp; files.length &gt; 0 &amp;&amp; (
1241
+ &lt;List dense sx={{ mt: 1, p: 0 }}&gt;
1242
+ {files.map((file) =&gt; (
1243
+ &lt;FileItemRow
1244
+ key={file.id}
1245
+ file={file}
1246
+ baseUrl={baseUrl}
1247
+ disabled={disabled}
1248
+ onRemove={handleRemoveClick}
1249
+ onRestore={restoreFile}
1250
+ onRetry={retryUpload}
1251
+ /&gt;
1252
+ ))}
1253
+ &lt;/List&gt;
1254
+ )}
1255
+ &nbsp;
1256
+ {/* Upload progress indicator */}
1257
+ {isUploading &amp;&amp; (
1258
+ &lt;Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mt: 1 }}&gt;
1259
+ &lt;CircularProgress size={16} /&gt;
1260
+ &lt;Typography variant="caption" color="text.secondary"&gt;
1261
+ {t('base.file.uploading')}
1262
+ &lt;/Typography&gt;
1263
+ &lt;/Box&gt;
1264
+ )}
1265
+ &nbsp;
1266
+ {/* Helper text / Error - renders HTML safely for formatting like &lt;b&gt; tags */}
1267
+ {finalHelperText &amp;&amp; (
1268
+ &lt;FormHelperText
1269
+ error={hasError}
1270
+ sx={{ mt: 0.5 }}
1271
+ dangerouslySetInnerHTML={{ __html: sanitizeHelperTextHtml(finalHelperText) }}
1272
+ /&gt;
1273
+ )}
1274
+ &nbsp;
1275
+ {/* Delete confirmation dialog */}
1276
+ &lt;DeleteConfirmationDialog
1277
+ open={deleteConfirmation.isOpen}
1278
+ isDeleting={deleteConfirmation.isDeleting}
1279
+ onConfirm={deleteConfirmation.handleConfirm}
1280
+ onCancel={deleteConfirmation.handleCancel}
1281
+ title={t('base.file.confirmDelete.title')}
1282
+ message={t('base.file.confirmDelete.message')}
1283
+ cancelText={t('base.file.confirmDelete.cancel')}
1284
+ confirmText={t('base.file.confirmDelete.confirm')}
1285
+ deletingText={t('base.file.deleting')}
1286
+ /&gt;
1287
+ &lt;/Box&gt;
1288
+ &lt;/div&gt;
1289
+ );
1290
+ };
1291
+ &nbsp;
1292
+ export default CrudiaFileField;
1293
+ &nbsp;</pre></td></tr></table></pre>
1294
+
1295
+ <div class='push'></div><!-- for sticky footer -->
1296
+ </div><!-- /wrapper -->
1297
+ <div class='footer quiet pad2 space-top1 center small'>
1298
+ Code coverage generated by
1299
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1300
+ at 2026-02-07T06:55:20.810Z
1301
+ </div>
1302
+ <script src="../../prettify.js"></script>
1303
+ <script>
1304
+ window.onload = function () {
1305
+ prettyPrint();
1306
+ };
1307
+ </script>
1308
+ <script src="../../sorter.js"></script>
1309
+ <script src="../../block-navigation.js"></script>
1310
+ </body>
1311
+ </html>
1312
+