@oneuptime/common 9.2.26 → 9.3.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 (278) hide show
  1. package/Models/DatabaseModels/AIAgent.ts +589 -0
  2. package/Models/DatabaseModels/AIAgentOwnerTeam.ts +434 -0
  3. package/Models/DatabaseModels/AIAgentOwnerUser.ts +433 -0
  4. package/Models/DatabaseModels/AIAgentTask.ts +549 -0
  5. package/Models/DatabaseModels/AIAgentTaskLog.ts +417 -0
  6. package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +731 -0
  7. package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +388 -0
  8. package/Models/DatabaseModels/Index.ts +15 -0
  9. package/Models/DatabaseModels/Monitor.ts +33 -0
  10. package/Models/DatabaseModels/Project.ts +25 -0
  11. package/Models/DatabaseModels/TelemetryException.ts +1 -1
  12. package/Server/API/AIAgentAPI.ts +200 -0
  13. package/Server/API/AIAgentDataAPI.ts +692 -0
  14. package/Server/API/AIAgentTaskAPI.ts +286 -0
  15. package/Server/API/AIAgentTaskLogAPI.ts +165 -0
  16. package/Server/API/AIAgentTaskPullRequestAPI.ts +14 -0
  17. package/Server/API/GitHubAPI.ts +25 -7
  18. package/Server/API/TelemetryExceptionAPI.ts +169 -0
  19. package/Server/EnvironmentConfig.ts +3 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.ts +195 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.ts +31 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.ts +17 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.ts +63 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.ts +75 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.ts +157 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.ts +33 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.ts +27 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.ts +37 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.ts +31 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.ts +35 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +22 -0
  32. package/Server/Services/AIAgentOwnerTeamService.ts +10 -0
  33. package/Server/Services/AIAgentOwnerUserService.ts +10 -0
  34. package/Server/Services/AIAgentService.ts +564 -0
  35. package/Server/Services/AIAgentTaskLogService.ts +10 -0
  36. package/Server/Services/AIAgentTaskPullRequestService.ts +10 -0
  37. package/Server/Services/AIAgentTaskService.ts +178 -0
  38. package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +39 -0
  39. package/Server/Services/Index.ts +10 -0
  40. package/Server/Services/TelemetryExceptionService.ts +162 -0
  41. package/Server/Types/Workflow/Components/Index.ts +2 -0
  42. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +146 -0
  43. package/Server/Utils/Monitor/MonitorResource.ts +228 -0
  44. package/Server/Utils/PushNotificationUtil.ts +29 -0
  45. package/Server/Utils/WhatsAppTemplateUtil.ts +6 -0
  46. package/Tests/UI/Components/Badge.test.tsx +5 -5
  47. package/Tests/UI/Components/Card.test.tsx +4 -8
  48. package/Tests/UI/Components/HiddenText.test.tsx +2 -5
  49. package/Tests/UI/Components/SideMenuItem.test.tsx +4 -2
  50. package/Types/AI/AIAgentTaskMetadata.ts +25 -0
  51. package/Types/AI/AIAgentTaskStatus.ts +65 -0
  52. package/Types/AI/AIAgentTaskType.ts +40 -0
  53. package/Types/Email/EmailTemplateType.ts +2 -0
  54. package/Types/Monitor/MonitorEvaluationSummary.ts +2 -1
  55. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  56. package/Types/Permission.ts +176 -0
  57. package/Types/WhatsApp/WhatsAppTemplates.ts +9 -0
  58. package/Types/Workflow/ComponentID.ts +1 -0
  59. package/Types/Workflow/Components/Telegram.ts +76 -0
  60. package/Types/Workflow/Components.ts +7 -0
  61. package/UI/Components/AIAgent/AIAgent.tsx +69 -0
  62. package/UI/Components/Badge/Badge.tsx +9 -5
  63. package/UI/Components/Banner/Banner.tsx +1 -1
  64. package/UI/Components/Card/Card.tsx +14 -12
  65. package/UI/Components/CodeBlock/CodeBlock.tsx +47 -4
  66. package/UI/Components/Detail/Detail.tsx +239 -49
  67. package/UI/Components/Detail/FieldLabel.tsx +35 -11
  68. package/UI/Components/Detail/PlaceholderText.tsx +18 -1
  69. package/UI/Components/Footer/Footer.tsx +9 -7
  70. package/UI/Components/Header/Header.tsx +4 -3
  71. package/UI/Components/Header/HeaderIconDropdownButton.tsx +13 -11
  72. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +3 -3
  73. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +1 -1
  74. package/UI/Components/Header/ProjectPicker/CreateNewProjectButton.tsx +4 -4
  75. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -6
  76. package/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.tsx +3 -3
  77. package/UI/Components/Header/ProjectPicker/ProjectPickerMenu.tsx +1 -1
  78. package/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.tsx +4 -4
  79. package/UI/Components/HeaderAlert/HeaderAlert.tsx +32 -32
  80. package/UI/Components/HeaderAlert/HeaderAlertGroup.tsx +1 -7
  81. package/UI/Components/HiddenText/HiddenText.tsx +98 -27
  82. package/UI/Components/Icon/Icon.tsx +12 -9
  83. package/UI/Components/InfoCard/InfoCard.tsx +7 -3
  84. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  85. package/UI/Components/ObjectID/ObjectIDView.tsx +73 -0
  86. package/UI/Components/Page/Page.tsx +3 -5
  87. package/UI/Components/SideMenu/SideMenu.tsx +175 -40
  88. package/UI/Components/SideMenu/SideMenuDivider.tsx +17 -0
  89. package/UI/Components/SideMenu/SideMenuItem.tsx +111 -158
  90. package/UI/Components/SideMenu/SideMenuSection.tsx +53 -3
  91. package/UI/Components/Table/Table.tsx +1 -1
  92. package/UI/Components/Types/FieldType.ts +2 -0
  93. package/UI/Config.ts +5 -0
  94. package/build/dist/Models/DatabaseModels/AIAgent.js +614 -0
  95. package/build/dist/Models/DatabaseModels/AIAgent.js.map +1 -0
  96. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +452 -0
  97. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -0
  98. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +451 -0
  99. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -0
  100. package/build/dist/Models/DatabaseModels/AIAgentTask.js +580 -0
  101. package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +1 -0
  102. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +438 -0
  103. package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +1 -0
  104. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +771 -0
  105. package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -0
  106. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +404 -0
  107. package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +1 -0
  108. package/build/dist/Models/DatabaseModels/Index.js +14 -0
  109. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  110. package/build/dist/Models/DatabaseModels/Monitor.js +34 -0
  111. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  112. package/build/dist/Models/DatabaseModels/Project.js +26 -0
  113. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  114. package/build/dist/Models/DatabaseModels/TelemetryException.js +1 -1
  115. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  116. package/build/dist/Server/API/AIAgentAPI.js +141 -0
  117. package/build/dist/Server/API/AIAgentAPI.js.map +1 -0
  118. package/build/dist/Server/API/AIAgentDataAPI.js +415 -0
  119. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -0
  120. package/build/dist/Server/API/AIAgentTaskAPI.js +199 -0
  121. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -0
  122. package/build/dist/Server/API/AIAgentTaskLogAPI.js +106 -0
  123. package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -0
  124. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +9 -0
  125. package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -0
  126. package/build/dist/Server/API/GitHubAPI.js +23 -8
  127. package/build/dist/Server/API/GitHubAPI.js.map +1 -1
  128. package/build/dist/Server/API/TelemetryExceptionAPI.js +120 -0
  129. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -0
  130. package/build/dist/Server/EnvironmentConfig.js +2 -0
  131. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  132. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.js +74 -0
  133. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766590916627-MigrationName.js.map +1 -0
  134. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.js +18 -0
  135. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766600860972-MigrationName.js.map +1 -0
  136. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.js +12 -0
  137. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766606720183-MigrationName.js.map +1 -0
  138. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.js +28 -0
  139. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766688107858-MigrationName.js.map +1 -0
  140. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.js +32 -0
  141. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766754182870-MigrationName.js.map +1 -0
  142. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.js +60 -0
  143. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766774689743-MigrationName.js.map +1 -0
  144. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.js +18 -0
  145. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766777986427-MigrationName.js.map +1 -0
  146. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.js +16 -0
  147. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766918848434-AddAIAgentIsDefault.js.map +1 -0
  148. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.js +20 -0
  149. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766923324521-MigrationName.js.map +1 -0
  150. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.js +16 -0
  151. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1766958924188-AddGitHubAppInstallationIdToProject.js.map +1 -0
  152. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.js +18 -0
  153. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1767009661768-MigrationName.js.map +1 -0
  154. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +22 -0
  155. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  156. package/build/dist/Server/Services/AIAgentOwnerTeamService.js +9 -0
  157. package/build/dist/Server/Services/AIAgentOwnerTeamService.js.map +1 -0
  158. package/build/dist/Server/Services/AIAgentOwnerUserService.js +9 -0
  159. package/build/dist/Server/Services/AIAgentOwnerUserService.js.map +1 -0
  160. package/build/dist/Server/Services/AIAgentService.js +471 -0
  161. package/build/dist/Server/Services/AIAgentService.js.map +1 -0
  162. package/build/dist/Server/Services/AIAgentTaskLogService.js +9 -0
  163. package/build/dist/Server/Services/AIAgentTaskLogService.js.map +1 -0
  164. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +9 -0
  165. package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -0
  166. package/build/dist/Server/Services/AIAgentTaskService.js +158 -0
  167. package/build/dist/Server/Services/AIAgentTaskService.js.map +1 -0
  168. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +36 -0
  169. package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +1 -0
  170. package/build/dist/Server/Services/Index.js +10 -0
  171. package/build/dist/Server/Services/Index.js.map +1 -1
  172. package/build/dist/Server/Services/TelemetryExceptionService.js +137 -0
  173. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  174. package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
  175. package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
  176. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +119 -0
  177. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -0
  178. package/build/dist/Server/Utils/Monitor/MonitorResource.js +168 -0
  179. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  180. package/build/dist/Server/Utils/PushNotificationUtil.js +21 -0
  181. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  182. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +4 -0
  183. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  184. package/build/dist/Tests/UI/Components/Badge.test.js +5 -5
  185. package/build/dist/Tests/UI/Components/Badge.test.js.map +1 -1
  186. package/build/dist/Tests/UI/Components/Card.test.js +4 -8
  187. package/build/dist/Tests/UI/Components/Card.test.js.map +1 -1
  188. package/build/dist/Tests/UI/Components/HiddenText.test.js +2 -3
  189. package/build/dist/Tests/UI/Components/HiddenText.test.js.map +1 -1
  190. package/build/dist/Tests/UI/Components/SideMenuItem.test.js +3 -2
  191. package/build/dist/Tests/UI/Components/SideMenuItem.test.js.map +1 -1
  192. package/build/dist/Types/AI/AIAgentTaskMetadata.js +6 -0
  193. package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +1 -0
  194. package/build/dist/Types/AI/AIAgentTaskStatus.js +51 -0
  195. package/build/dist/Types/AI/AIAgentTaskStatus.js.map +1 -0
  196. package/build/dist/Types/AI/AIAgentTaskType.js +29 -0
  197. package/build/dist/Types/AI/AIAgentTaskType.js.map +1 -0
  198. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  199. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  200. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  201. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  202. package/build/dist/Types/Permission.js +160 -0
  203. package/build/dist/Types/Permission.js.map +1 -1
  204. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +6 -0
  205. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
  206. package/build/dist/Types/Workflow/ComponentID.js +1 -0
  207. package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
  208. package/build/dist/Types/Workflow/Components/Telegram.js +69 -0
  209. package/build/dist/Types/Workflow/Components/Telegram.js.map +1 -0
  210. package/build/dist/Types/Workflow/Components.js +7 -0
  211. package/build/dist/Types/Workflow/Components.js.map +1 -1
  212. package/build/dist/UI/Components/AIAgent/AIAgent.js +32 -0
  213. package/build/dist/UI/Components/AIAgent/AIAgent.js.map +1 -0
  214. package/build/dist/UI/Components/Badge/Badge.js +9 -5
  215. package/build/dist/UI/Components/Badge/Badge.js.map +1 -1
  216. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  217. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  218. package/build/dist/UI/Components/Card/Card.js +12 -12
  219. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  220. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +22 -2
  221. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  222. package/build/dist/UI/Components/Detail/Detail.js +117 -37
  223. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  224. package/build/dist/UI/Components/Detail/FieldLabel.js +12 -7
  225. package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
  226. package/build/dist/UI/Components/Detail/PlaceholderText.js +4 -1
  227. package/build/dist/UI/Components/Detail/PlaceholderText.js.map +1 -1
  228. package/build/dist/UI/Components/Footer/Footer.js +6 -6
  229. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  230. package/build/dist/UI/Components/Header/Header.js +4 -3
  231. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  232. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +7 -7
  233. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  234. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +3 -3
  235. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  236. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +1 -1
  237. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  238. package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js +4 -4
  239. package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js.map +1 -1
  240. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +6 -6
  241. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  242. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js +2 -2
  243. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js.map +1 -1
  244. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenu.js +1 -1
  245. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenu.js.map +1 -1
  246. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.js +4 -4
  247. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerMenuItem.js.map +1 -1
  248. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +31 -29
  249. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  250. package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js +1 -3
  251. package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js.map +1 -1
  252. package/build/dist/UI/Components/HiddenText/HiddenText.js +33 -14
  253. package/build/dist/UI/Components/HiddenText/HiddenText.js.map +1 -1
  254. package/build/dist/UI/Components/Icon/Icon.js +3 -4
  255. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  256. package/build/dist/UI/Components/InfoCard/InfoCard.js +3 -3
  257. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  258. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  259. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  260. package/build/dist/UI/Components/ObjectID/ObjectIDView.js +30 -0
  261. package/build/dist/UI/Components/ObjectID/ObjectIDView.js.map +1 -0
  262. package/build/dist/UI/Components/Page/Page.js +3 -3
  263. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  264. package/build/dist/UI/Components/SideMenu/SideMenu.js +82 -17
  265. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  266. package/build/dist/UI/Components/SideMenu/SideMenuDivider.js +7 -0
  267. package/build/dist/UI/Components/SideMenu/SideMenuDivider.js.map +1 -0
  268. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +68 -97
  269. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  270. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +18 -3
  271. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  272. package/build/dist/UI/Components/Table/Table.js +1 -1
  273. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  274. package/build/dist/UI/Components/Types/FieldType.js +2 -0
  275. package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
  276. package/build/dist/UI/Config.js +2 -0
  277. package/build/dist/UI/Config.js.map +1 -1
  278. package/package.json +1 -1
@@ -4,7 +4,7 @@ import React, {
4
4
  useState,
5
5
  useEffect,
6
6
  } from "react";
7
- import Button, { ButtonStyleType } from "../Button/Button";
7
+ import Icon from "../Icon/Icon";
8
8
  import IconProp from "../../../Types/Icon/IconProp";
9
9
  import useComponentOutsideClick from "../../Types/UseComponentOutsideClick";
10
10
  import Navigation from "../../Utils/Navigation";
@@ -37,12 +37,17 @@ export interface SideMenuItemProps {
37
37
  export interface SideMenuSectionProps {
38
38
  title: string;
39
39
  items: SideMenuItemProps[];
40
+ icon?: IconProp;
41
+ defaultCollapsed?: boolean;
42
+ collapsible?: boolean;
40
43
  }
41
44
 
42
45
  export interface ComponentProps {
43
46
  sections?: SideMenuSectionProps[];
44
47
  items?: SideMenuItemProps[];
45
48
  className?: string;
49
+ header?: ReactElement;
50
+ footer?: ReactElement;
46
51
  // Keep children support for backward compatibility
47
52
  children?: ReactElement | Array<ReactElement>;
48
53
  }
@@ -89,19 +94,29 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
89
94
  const findActiveMenuItem: () => {
90
95
  sectionTitle?: string;
91
96
  itemTitle?: string;
97
+ icon?: IconProp;
92
98
  } = (): {
93
99
  sectionTitle?: string;
94
100
  itemTitle?: string;
101
+ icon?: IconProp;
95
102
  } => {
96
103
  // Check sections first
97
104
  if (props.sections) {
98
105
  for (const section of props.sections) {
99
106
  for (const item of section.items) {
100
107
  if (Navigation.isOnThisPage(item.link.to)) {
101
- return {
108
+ const result: {
109
+ sectionTitle: string;
110
+ itemTitle: string;
111
+ icon?: IconProp;
112
+ } = {
102
113
  sectionTitle: section.title,
103
114
  itemTitle: item.link.title,
104
115
  };
116
+ if (item.icon) {
117
+ result.icon = item.icon;
118
+ }
119
+ return result;
105
120
  }
106
121
  }
107
122
  }
@@ -111,9 +126,16 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
111
126
  if (props.items) {
112
127
  for (const item of props.items) {
113
128
  if (Navigation.isOnThisPage(item.link.to)) {
114
- return {
129
+ const result: {
130
+ itemTitle: string;
131
+ icon?: IconProp;
132
+ } = {
115
133
  itemTitle: item.link.title,
116
134
  };
135
+ if (item.icon) {
136
+ result.icon = item.icon;
137
+ }
138
+ return result;
117
139
  }
118
140
  }
119
141
  }
@@ -124,10 +146,11 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
124
146
  const activeItem: {
125
147
  sectionTitle?: string;
126
148
  itemTitle?: string;
149
+ icon?: IconProp;
127
150
  } = findActiveMenuItem();
128
151
  const displayText: string =
129
152
  activeItem.sectionTitle && activeItem.itemTitle
130
- ? `${activeItem.sectionTitle} - ${activeItem.itemTitle}`
153
+ ? `${activeItem.sectionTitle} / ${activeItem.itemTitle}`
131
154
  : activeItem.itemTitle || "Navigation";
132
155
 
133
156
  // Re-run active item detection when location changes
@@ -146,11 +169,30 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
146
169
  if (props.sections) {
147
170
  props.sections.forEach(
148
171
  (section: SideMenuSectionProps, sectionIndex: number) => {
172
+ // Build section props conditionally to avoid undefined values
173
+ const sectionProps: {
174
+ key: string;
175
+ title: string;
176
+ icon?: IconProp;
177
+ defaultCollapsed?: boolean;
178
+ collapsible?: boolean;
179
+ } = {
180
+ key: `section-${sectionIndex}`,
181
+ title: section.title,
182
+ };
183
+
184
+ if (section.icon) {
185
+ sectionProps.icon = section.icon;
186
+ }
187
+ if (section.defaultCollapsed !== undefined) {
188
+ sectionProps.defaultCollapsed = section.defaultCollapsed;
189
+ }
190
+ if (section.collapsible !== undefined) {
191
+ sectionProps.collapsible = section.collapsible;
192
+ }
193
+
149
194
  content.push(
150
- <SideMenuSection
151
- key={`section-${sectionIndex}`}
152
- title={section.title}
153
- >
195
+ <SideMenuSection {...sectionProps}>
154
196
  {section.items.map(
155
197
  (item: SideMenuItemProps, itemIndex: number) => {
156
198
  // If item has modelType, render CountModelSideMenuItem
@@ -250,40 +292,105 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
250
292
  return (
251
293
  <div className="md:hidden mb-6">
252
294
  {/* Mobile toggle button */}
253
- <div className="flex items-center justify-between w-full mb-4 px-4 py-3 bg-white rounded-lg border border-gray-200">
254
- <div className="flex-1 mr-3">
255
- <h3 className="text-base font-medium text-gray-900 truncate">
256
- {displayText}
257
- </h3>
295
+ <button
296
+ type="button"
297
+ onClick={() => {
298
+ setIsMobileMenuOpen(!isMobileMenuVisible);
299
+ }}
300
+ className={`
301
+ w-full flex items-center justify-between
302
+ px-3 py-2.5
303
+ bg-white rounded-xl
304
+ border border-gray-200
305
+ shadow-sm
306
+ transition-all duration-200
307
+ ${isMobileMenuVisible ? "ring-2 ring-indigo-100 border-indigo-200" : "hover:border-gray-300"}
308
+ `}
309
+ aria-expanded={isMobileMenuVisible}
310
+ aria-label={
311
+ isMobileMenuVisible
312
+ ? "Close navigation menu"
313
+ : "Open navigation menu"
314
+ }
315
+ data-testid="mobile-sidemenu-toggle"
316
+ >
317
+ <div className="flex items-center gap-2 min-w-0">
318
+ {activeItem.icon && (
319
+ <div className="flex items-center justify-center w-6 h-6 rounded-md bg-indigo-50 text-indigo-600 flex-shrink-0">
320
+ <Icon icon={activeItem.icon} className="h-3.5 w-3.5" />
321
+ </div>
322
+ )}
323
+ <div className="min-w-0">
324
+ <p className="text-xs text-gray-400 font-medium">Navigate to</p>
325
+ <h3 className="text-sm font-semibold text-gray-900 truncate">
326
+ {displayText}
327
+ </h3>
328
+ </div>
258
329
  </div>
259
- <Button
260
- buttonStyle={ButtonStyleType.OUTLINE}
261
- onClick={() => {
262
- setIsMobileMenuOpen(!isMobileMenuVisible);
263
- }}
264
- className="p-2 flex-shrink-0"
265
- icon={isMobileMenuVisible ? IconProp.Close : IconProp.Bars3}
266
- dataTestId="mobile-sidemenu-toggle"
267
- tooltip={
268
- isMobileMenuVisible
269
- ? "Close navigation menu"
270
- : "Open navigation menu"
271
- }
272
- />
273
- </div>
274
-
275
- {/* Mobile collapsible menu */}
276
- {isMobileMenuVisible && (
277
330
  <div
278
- ref={mobileMenuRef}
279
- className="bg-white rounded-lg border border-gray-200 py-4 px-4 mb-6 transition-all duration-200 ease-in-out"
280
- role="navigation"
281
- aria-label="Main navigation"
331
+ className={`
332
+ flex items-center justify-center
333
+ w-6 h-6 rounded-md
334
+ transition-all duration-200
335
+ ${isMobileMenuVisible ? "bg-indigo-100 text-indigo-600" : "bg-gray-100 text-gray-500"}
336
+ `}
282
337
  >
283
- <nav className="space-y-3" onClick={handleMenuItemClick}>
284
- {renderMenuContent()}
285
- </nav>
338
+ <Icon
339
+ icon={isMobileMenuVisible ? IconProp.Close : IconProp.Bars3}
340
+ className="h-3.5 w-3.5"
341
+ />
286
342
  </div>
343
+ </button>
344
+
345
+ {/* Mobile collapsible menu with overlay */}
346
+ {isMobileMenuVisible && (
347
+ <>
348
+ {/* Backdrop */}
349
+ <div
350
+ className="fixed inset-0 bg-black/20 z-40 animate-in fade-in duration-200"
351
+ onClick={() => {
352
+ setIsMobileMenuOpen(false);
353
+ }}
354
+ />
355
+
356
+ {/* Menu Panel */}
357
+ <div
358
+ ref={mobileMenuRef}
359
+ className={`
360
+ relative z-50
361
+ mt-2
362
+ bg-white rounded-xl
363
+ border border-gray-200
364
+ shadow-xl
365
+ overflow-hidden
366
+ animate-in slide-in-from-top-2 fade-in duration-200
367
+ `}
368
+ role="navigation"
369
+ aria-label="Main navigation"
370
+ >
371
+ {/* Optional Header */}
372
+ {props.header && (
373
+ <div className="px-3 py-2 border-b border-gray-100 bg-gray-50/50">
374
+ {props.header}
375
+ </div>
376
+ )}
377
+
378
+ {/* Menu Items */}
379
+ <nav
380
+ className="p-2 max-h-[60vh] overflow-y-auto"
381
+ onClick={handleMenuItemClick}
382
+ >
383
+ <div className="space-y-0.5">{renderMenuContent()}</div>
384
+ </nav>
385
+
386
+ {/* Optional Footer */}
387
+ {props.footer && (
388
+ <div className="px-3 py-2 border-t border-gray-100 bg-gray-50/50">
389
+ {props.footer}
390
+ </div>
391
+ )}
392
+ </div>
393
+ </>
287
394
  )}
288
395
  </div>
289
396
  );
@@ -292,11 +399,39 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
292
399
  // Desktop view
293
400
  return (
294
401
  <aside
295
- className={`hidden md:block py-6 px-2 sm:px-6 lg:col-span-2 md:col-span-3 lg:py-0 lg:px-0 mb-10 ${props.className || ""}`}
402
+ className={`hidden md:block w-52 lg:w-60 flex-shrink-0 mb-10 ${props.className || ""}`}
296
403
  role="navigation"
297
404
  aria-label="Main navigation"
298
405
  >
299
- <nav className="space-y-3">{renderMenuContent()}</nav>
406
+ <div className="sticky top-6">
407
+ <div
408
+ className={`
409
+ bg-white rounded-2xl
410
+ border border-gray-200/80
411
+ shadow-sm
412
+ overflow-hidden
413
+ `}
414
+ >
415
+ {/* Optional Header */}
416
+ {props.header && (
417
+ <div className="px-3 py-3 border-b border-gray-100 bg-gradient-to-b from-gray-50 to-white">
418
+ {props.header}
419
+ </div>
420
+ )}
421
+
422
+ {/* Menu Content */}
423
+ <nav className="p-2">
424
+ <div className="space-y-0.5">{renderMenuContent()}</div>
425
+ </nav>
426
+
427
+ {/* Optional Footer */}
428
+ {props.footer && (
429
+ <div className="px-3 py-2 border-t border-gray-100 bg-gray-50/50">
430
+ {props.footer}
431
+ </div>
432
+ )}
433
+ </div>
434
+ </div>
300
435
  </aside>
301
436
  );
302
437
  };
@@ -0,0 +1,17 @@
1
+ import React, { FunctionComponent } from "react";
2
+
3
+ export interface ComponentProps {
4
+ className?: string;
5
+ }
6
+
7
+ const SideMenuDivider: FunctionComponent<ComponentProps> = (
8
+ props: ComponentProps,
9
+ ) => {
10
+ return (
11
+ <div className={`my-3 px-3 ${props.className || ""}`}>
12
+ <div className="h-px bg-gradient-to-r from-transparent via-gray-200 to-transparent" />
13
+ </div>
14
+ );
15
+ };
16
+
17
+ export default SideMenuDivider;
@@ -21,195 +21,148 @@ export interface ComponentProps {
21
21
  const SideMenuItem: FunctionComponent<ComponentProps> = (
22
22
  props: ComponentProps,
23
23
  ) => {
24
- const badgeClasName: string = `p-1 rounded-full pr-3 pl-3 text-white text-sm`;
25
-
26
- let linkClassName: string = `text-gray-500 hover:text-gray-900 hover:bg-gray-100 group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
27
-
28
- if (Navigation.isOnThisPage(props.link.to)) {
29
- linkClassName = `bg-gray-100 text-indigo-600 hover:bg-white group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
30
- }
31
-
32
- let subItemLinkClassName: string = `text-gray-500 hover:text-gray-900 hover:bg-gray-100 group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
33
-
34
- if (props.subItemLink && Navigation.isOnThisPage(props.subItemLink.to)) {
35
- subItemLinkClassName = `bg-gray-100 text-indigo-600 hover:bg-white group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
36
- }
37
-
38
- /*
39
- * if(props.badge && props.badge > 0){
40
- * if(props.badgeType === BadgeType.DANGER){
41
- * linkClassName = `text-red-400 hover:text-red-600 hover:bg-gray-100 group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
42
- */
43
-
44
- /*
45
- * if(Navigation.isOnThisPage(props.link.to)){
46
- * linkClassName = `bg-gray-100 text-red-600 hover:bg-white group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
47
- * }
48
- */
49
-
50
- // }
51
-
52
- /*
53
- * if(props.badgeType === BadgeType.WARNING){
54
- * linkClassName = `text-yellow-400 hover:text-yellow-600 hover:bg-gray-100 group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
55
- */
56
-
57
- /*
58
- * if(Navigation.isOnThisPage(props.link.to)){
59
- * linkClassName = `bg-gray-100 text-yellow-600 hover:bg-white group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
60
- * }
61
- * }
62
- */
63
-
64
- /*
65
- * if(props.badgeType === BadgeType.SUCCESS){
66
- * linkClassName = `text-emerald-400 hover:text-emerald-600 hover:bg-gray-100 group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
67
- */
68
-
69
- /*
70
- * if(Navigation.isOnThisPage(props.link.to)){
71
- * linkClassName = `bg-gray-100 text-emerald-600 hover:bg-white group rounded-md px-3 py-2 flex items-center text-sm font-medium`;
72
- * }
73
- * }
74
- * }
75
- */
76
-
77
- let iconClassName: string =
78
- "text-gray-400 group-hover:text-gray-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6";
79
-
80
- if (Navigation.isOnThisPage(props.link.to)) {
81
- iconClassName = "text-indigo-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6";
82
- }
83
-
84
- let subItemIconClassName: string =
85
- "text-gray-400 group-hover:text-gray-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6";
86
-
87
- if (props.subItemLink && Navigation.isOnThisPage(props.subItemLink.to)) {
88
- subItemIconClassName = "text-indigo-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6";
89
- }
90
-
91
- /*
92
- * if(props.badge && props.badge > 0){
93
- * if(props.badgeType === BadgeType.DANGER){
94
- * iconClassName = `text-red-400 group-hover:text-red-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6`;
95
- */
96
-
97
- /*
98
- * if(Navigation.isOnThisPage(props.link.to)){
99
- * iconClassName = `text-red-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6`;
100
- * }
101
- */
102
-
103
- // }
104
-
105
- /*
106
- * if(props.badgeType === BadgeType.WARNING){
107
- * iconClassName = `text-yellow-400 group-hover:text-yellow-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6`;
108
- */
109
-
110
- /*
111
- * if(Navigation.isOnThisPage(props.link.to)){
112
- * iconClassName = `text-yellow-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6`;
113
- * }
114
- * }
115
- */
116
-
117
- /*
118
- * if(props.badgeType === BadgeType.SUCCESS){
119
- * iconClassName = `text-emerald-400 group-hover:text-emerald-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6`;
120
- */
121
-
122
- /*
123
- * if(Navigation.isOnThisPage(props.link.to)){
124
- * iconClassName = `text-emerald-500 flex-shrink-0 -ml-1 mr-3 h-6 w-6`;
125
- * }
126
- * }
127
- * }
128
- */
24
+ const isActive: boolean = Navigation.isOnThisPage(props.link.to);
25
+ const isSubItemActive: boolean = props.subItemLink
26
+ ? Navigation.isOnThisPage(props.subItemLink.to)
27
+ : false;
129
28
 
130
29
  return (
131
30
  <>
31
+ {/* Main Menu Item */}
132
32
  <UILink
133
- className={`${
134
- props.className ? props.className : ""
135
- } ${linkClassName} flex justify-between`}
33
+ className={`
34
+ ${props.className || ""}
35
+ group relative flex items-center justify-between
36
+ px-2 py-1.5 rounded-lg
37
+ text-sm font-medium
38
+ transition-all duration-200 ease-out
39
+ ${
40
+ isActive
41
+ ? "bg-gradient-to-r from-indigo-50 to-indigo-50/50 text-indigo-700 shadow-sm"
42
+ : "text-gray-600 hover:bg-gray-50 hover:text-gray-900"
43
+ }
44
+ `}
136
45
  to={props.link.to}
137
46
  onClick={() => {
138
47
  window.scrollTo({ top: 0, behavior: "smooth" });
139
48
  }}
140
49
  >
141
- <div className="flex">
142
- {props.icon ? (
143
- <>
144
- <Icon className={iconClassName} icon={props.icon} />
145
- </>
146
- ) : (
147
- <></>
50
+ {/* Active Indicator Bar */}
51
+ <div
52
+ className={`
53
+ absolute left-0 top-1/2 -translate-y-1/2
54
+ w-0.5 rounded-full
55
+ transition-all duration-200 ease-out
56
+ ${isActive ? "h-5 bg-indigo-600" : "h-0 bg-transparent"}
57
+ `}
58
+ />
59
+
60
+ {/* Content Container */}
61
+ <div className="flex items-center min-w-0 gap-2">
62
+ {/* Icon with background on active */}
63
+ {props.icon && (
64
+ <div
65
+ className={`
66
+ flex items-center justify-center
67
+ w-6 h-6 rounded-md
68
+ transition-all duration-200
69
+ ${
70
+ isActive
71
+ ? "bg-indigo-100 text-indigo-600"
72
+ : "bg-gray-100 text-gray-500 group-hover:bg-gray-200 group-hover:text-gray-700"
73
+ }
74
+ `}
75
+ >
76
+ <Icon icon={props.icon} className="h-3.5 w-3.5" />
77
+ </div>
148
78
  )}
149
79
 
150
- <span className="truncate mt-1">{props.link.title}</span>
80
+ {/* Title */}
81
+ <span
82
+ className={`
83
+ truncate transition-colors duration-200
84
+ ${isActive ? "font-semibold" : ""}
85
+ `}
86
+ >
87
+ {props.link.title}
88
+ </span>
151
89
  </div>
152
90
 
153
- {props.badge || props.showAlert || props.showWarning ? (
154
- <div className={badgeClasName}>
155
- {props.badge ? (
91
+ {/* Badge / Alert / Warning Container */}
92
+ {(props.badge !== undefined ||
93
+ props.showAlert ||
94
+ props.showWarning) && (
95
+ <div className="flex items-center gap-1.5 ml-2 flex-shrink-0">
96
+ {props.badge !== undefined && (
156
97
  <Badge badgeCount={props.badge} badgeType={props.badgeType} />
157
- ) : (
158
- <></>
159
98
  )}
160
-
161
- {props.showAlert ? (
162
- <>
163
- <Icon
164
- className="float-end text-red-900"
165
- icon={IconProp.Error}
166
- />
167
- </>
168
- ) : (
169
- <></>
99
+ {props.showAlert && (
100
+ <div className="flex items-center justify-center w-5 h-5 rounded-full bg-gradient-to-br from-red-50 to-red-100 ring-1 ring-inset ring-red-200/60 shadow-sm">
101
+ <Icon icon={IconProp.Error} className="text-red-600 h-3 w-3" />
102
+ </div>
170
103
  )}
171
- {props.showWarning ? (
172
- <>
104
+ {props.showWarning && (
105
+ <div className="flex items-center justify-center w-5 h-5 rounded-full bg-gradient-to-br from-amber-50 to-amber-100 ring-1 ring-inset ring-amber-200/60 shadow-sm">
173
106
  <Icon
174
- className="float-end text-yellow-900"
175
107
  icon={IconProp.Alert}
108
+ className="text-amber-600 h-3 w-3"
176
109
  />
177
- </>
178
- ) : (
179
- <></>
110
+ </div>
180
111
  )}
181
112
  </div>
182
- ) : (
183
- <></>
184
113
  )}
114
+
115
+ {/* Hover indicator */}
116
+ <div
117
+ className={`
118
+ absolute inset-0 rounded-lg
119
+ border-2 border-transparent
120
+ transition-all duration-200
121
+ ${!isActive ? "group-hover:border-gray-200" : ""}
122
+ pointer-events-none
123
+ `}
124
+ />
185
125
  </UILink>
186
- {props.subItemLink ? (
126
+
127
+ {/* Sub Item */}
128
+ {props.subItemLink && (
187
129
  <UILink
188
- className={`${
189
- props.className ? props.className : ""
190
- } ${subItemLinkClassName} flex justify-between`}
130
+ className={`
131
+ ${props.className || ""}
132
+ group relative flex items-center justify-between
133
+ ml-8 px-2 py-1.5 rounded-lg
134
+ text-sm font-medium
135
+ transition-all duration-200 ease-out
136
+ ${
137
+ isSubItemActive
138
+ ? "bg-indigo-50/70 text-indigo-700"
139
+ : "text-gray-500 hover:bg-gray-50 hover:text-gray-700"
140
+ }
141
+ `}
191
142
  to={props.subItemLink.to}
192
143
  onClick={() => {
193
144
  window.scrollTo({ top: 0, behavior: "smooth" });
194
145
  }}
195
146
  >
196
- <div className="ml-8 flex">
197
- {props.icon ? (
198
- <>
199
- <Icon
200
- className={subItemIconClassName}
201
- icon={props.subItemIcon || IconProp.MinusSmall}
202
- />
203
- </>
204
- ) : (
205
- <></>
206
- )}
207
-
208
- <span className="truncate mt-1">{props.subItemLink.title}</span>
147
+ {/* Connector Line */}
148
+ <div className="absolute -left-3 top-1/2 w-2 h-px bg-gray-200" />
149
+
150
+ {/* Sub Item Icon */}
151
+ <div className="flex items-center min-w-0 gap-2">
152
+ <Icon
153
+ icon={props.subItemIcon || IconProp.MinusSmall}
154
+ className={`
155
+ h-4 w-4 transition-colors duration-200
156
+ ${
157
+ isSubItemActive
158
+ ? "text-indigo-500"
159
+ : "text-gray-400 group-hover:text-gray-600"
160
+ }
161
+ `}
162
+ />
163
+ <span className="truncate">{props.subItemLink.title}</span>
209
164
  </div>
210
165
  </UILink>
211
- ) : (
212
- <> </>
213
166
  )}
214
167
  </>
215
168
  );