@solidxai/core-ui 0.1.8-beta.19 → 0.1.8-beta.20

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 (302) hide show
  1. package/dist/adapters/auth/getSession.d.ts.map +1 -1
  2. package/dist/adapters/auth/getSession.js +1 -1
  3. package/dist/adapters/auth/getSession.js.map +1 -1
  4. package/dist/adapters/auth/getSession.ts +1 -0
  5. package/dist/adapters/auth/helper.d.ts.map +1 -1
  6. package/dist/adapters/auth/helper.js +1 -0
  7. package/dist/adapters/auth/helper.js.map +1 -1
  8. package/dist/adapters/auth/helper.ts +3 -1
  9. package/dist/adapters/auth/signIn.d.ts.map +1 -1
  10. package/dist/adapters/auth/signIn.js +1 -0
  11. package/dist/adapters/auth/signIn.js.map +1 -1
  12. package/dist/adapters/auth/signIn.ts +3 -1
  13. package/dist/adapters/auth/signInWithOAuthAccessCode.d.ts +1 -0
  14. package/dist/adapters/auth/signInWithOAuthAccessCode.d.ts.map +1 -1
  15. package/dist/adapters/auth/signInWithOAuthAccessCode.js +10 -9
  16. package/dist/adapters/auth/signInWithOAuthAccessCode.js.map +1 -1
  17. package/dist/adapters/auth/signInWithOAuthAccessCode.ts +6 -3
  18. package/dist/adapters/auth/signOut.d.ts.map +1 -1
  19. package/dist/adapters/auth/signOut.js +7 -1
  20. package/dist/adapters/auth/signOut.js.map +1 -1
  21. package/dist/adapters/auth/signOut.ts +7 -1
  22. package/dist/adapters/auth/types.d.ts +1 -0
  23. package/dist/adapters/auth/types.d.ts.map +1 -1
  24. package/dist/adapters/auth/types.js.map +1 -1
  25. package/dist/adapters/auth/types.ts +1 -0
  26. package/dist/components/auth/AuthLayout.d.ts.map +1 -1
  27. package/dist/components/auth/AuthLayout.js +2 -1
  28. package/dist/components/auth/AuthLayout.js.map +1 -1
  29. package/dist/components/auth/AuthLayout.tsx +2 -1
  30. package/dist/components/auth/FacebookAuthChecking.d.ts +2 -0
  31. package/dist/components/auth/FacebookAuthChecking.d.ts.map +1 -0
  32. package/dist/components/auth/FacebookAuthChecking.js +103 -0
  33. package/dist/components/auth/FacebookAuthChecking.js.map +1 -0
  34. package/dist/components/auth/FacebookAuthChecking.tsx +64 -0
  35. package/dist/components/auth/GoogleAuthChecking.js +0 -1
  36. package/dist/components/auth/GoogleAuthChecking.js.map +1 -1
  37. package/dist/components/auth/GoogleAuthChecking.tsx +1 -1
  38. package/dist/components/auth/MicrosoftAuthChecking.d.ts +2 -0
  39. package/dist/components/auth/MicrosoftAuthChecking.d.ts.map +1 -0
  40. package/dist/components/auth/MicrosoftAuthChecking.js +103 -0
  41. package/dist/components/auth/MicrosoftAuthChecking.js.map +1 -0
  42. package/dist/components/auth/MicrosoftAuthChecking.tsx +64 -0
  43. package/dist/components/auth/SolidInitialLoginOtp.js +0 -1
  44. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  45. package/dist/components/auth/SolidInitialLoginOtp.tsx +1 -1
  46. package/dist/components/auth/SolidInitiateRegisterOtp.d.ts.map +1 -1
  47. package/dist/components/auth/SolidInitiateRegisterOtp.js +28 -12
  48. package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
  49. package/dist/components/auth/SolidInitiateRegisterOtp.tsx +26 -11
  50. package/dist/components/auth/SolidLogin.d.ts.map +1 -1
  51. package/dist/components/auth/SolidLogin.js +7 -4
  52. package/dist/components/auth/SolidLogin.js.map +1 -1
  53. package/dist/components/auth/SolidLogin.tsx +15 -3
  54. package/dist/components/auth/SolidRegister.d.ts.map +1 -1
  55. package/dist/components/auth/SolidRegister.js +48 -17
  56. package/dist/components/auth/SolidRegister.js.map +1 -1
  57. package/dist/components/auth/SolidRegister.tsx +87 -30
  58. package/dist/components/common/AuthBanner.js.map +1 -1
  59. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  60. package/dist/components/common/GeneralSettings.js +228 -146
  61. package/dist/components/common/GeneralSettings.js.map +1 -1
  62. package/dist/components/common/GeneralSettings.tsx +1103 -772
  63. package/dist/components/common/SettingsComponent.d.ts +2 -0
  64. package/dist/components/common/SettingsComponent.d.ts.map +1 -0
  65. package/dist/components/common/SettingsComponent.js +351 -0
  66. package/dist/components/common/SettingsComponent.js.map +1 -0
  67. package/dist/components/common/SettingsComponent.module.css +421 -0
  68. package/dist/components/common/SettingsComponent.tsx +582 -0
  69. package/dist/components/common/SocialMediaLogin.d.ts +8 -1
  70. package/dist/components/common/SocialMediaLogin.d.ts.map +1 -1
  71. package/dist/components/common/SocialMediaLogin.js +6 -13
  72. package/dist/components/common/SocialMediaLogin.js.map +1 -1
  73. package/dist/components/common/SocialMediaLogin.tsx +120 -58
  74. package/dist/components/common/SolidExport.d.ts.map +1 -1
  75. package/dist/components/common/SolidExport.js +1 -1
  76. package/dist/components/common/SolidExport.js.map +1 -1
  77. package/dist/components/common/SolidExport.tsx +2 -1
  78. package/dist/components/common/SolidFormStepper.d.ts.map +1 -1
  79. package/dist/components/common/SolidFormStepper.js +2 -1
  80. package/dist/components/common/SolidFormStepper.js.map +1 -1
  81. package/dist/components/common/SolidFormStepper.tsx +2 -1
  82. package/dist/components/common/solid-export.css +26 -0
  83. package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
  84. package/dist/components/core/card/SolidCardView.js +24 -25
  85. package/dist/components/core/card/SolidCardView.js.map +1 -1
  86. package/dist/components/core/card/SolidCardView.tsx +22 -27
  87. package/dist/components/core/card/SolidCardViewConfigure.js +1 -1
  88. package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
  89. package/dist/components/core/card/SolidCardViewConfigure.tsx +1 -1
  90. package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
  91. package/dist/components/core/chatter/SolidChatter.js +39 -9
  92. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  93. package/dist/components/core/chatter/SolidChatter.tsx +42 -7
  94. package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts.map +1 -1
  95. package/dist/components/core/chatter/SolidChatterAuditMessage.js +19 -1
  96. package/dist/components/core/chatter/SolidChatterAuditMessage.js.map +1 -1
  97. package/dist/components/core/chatter/SolidChatterAuditMessage.tsx +22 -1
  98. package/dist/components/core/chatter/SolidChatterMessageBox.d.ts +3 -0
  99. package/dist/components/core/chatter/SolidChatterMessageBox.d.ts.map +1 -1
  100. package/dist/components/core/chatter/SolidChatterMessageBox.js +68 -4
  101. package/dist/components/core/chatter/SolidChatterMessageBox.js.map +1 -1
  102. package/dist/components/core/chatter/SolidChatterMessageBox.tsx +45 -3
  103. package/dist/components/core/chatter/chatter.module.css +0 -3
  104. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.d.ts.map +1 -1
  105. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.js +3 -1
  106. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.js.map +1 -1
  107. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx +3 -1
  108. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.d.ts.map +1 -1
  109. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.js +9 -8
  110. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.js.map +1 -1
  111. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.tsx +4 -2
  112. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.d.ts +3 -0
  113. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.d.ts.map +1 -0
  114. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.js +81 -0
  115. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.js.map +1 -0
  116. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.tsx +114 -0
  117. package/dist/components/core/form/SolidFormActionHeader.d.ts +1 -1
  118. package/dist/components/core/form/SolidFormActionHeader.d.ts.map +1 -1
  119. package/dist/components/core/form/SolidFormActionHeader.js +5 -3
  120. package/dist/components/core/form/SolidFormActionHeader.js.map +1 -1
  121. package/dist/components/core/form/SolidFormActionHeader.tsx +27 -1
  122. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  123. package/dist/components/core/form/SolidFormView.js +67 -27
  124. package/dist/components/core/form/SolidFormView.js.map +1 -1
  125. package/dist/components/core/form/SolidFormView.tsx +54 -7
  126. package/dist/components/core/form/fields/SolidComputedField.d.ts +25 -0
  127. package/dist/components/core/form/fields/SolidComputedField.d.ts.map +1 -0
  128. package/dist/components/core/form/fields/SolidComputedField.js +128 -0
  129. package/dist/components/core/form/fields/SolidComputedField.js.map +1 -0
  130. package/dist/components/core/form/fields/SolidComputedField.tsx +134 -0
  131. package/dist/components/core/form/fields/SolidSelectionDynamicField.d.ts.map +1 -1
  132. package/dist/components/core/form/fields/SolidSelectionDynamicField.js +11 -3
  133. package/dist/components/core/form/fields/SolidSelectionDynamicField.js.map +1 -1
  134. package/dist/components/core/form/fields/SolidSelectionDynamicField.tsx +13 -4
  135. package/dist/components/core/kanban/KanbanBoard.js +1 -1
  136. package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
  137. package/dist/components/core/kanban/KanbanBoard.tsx +1 -1
  138. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  139. package/dist/components/core/kanban/SolidKanbanView.js +216 -102
  140. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  141. package/dist/components/core/kanban/SolidKanbanView.tsx +204 -72
  142. package/dist/components/core/kanban/SolidKanbanViewConfigure.js +1 -1
  143. package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
  144. package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +1 -1
  145. package/dist/components/core/kanban/SolidManyToOneFilterElement.d.ts.map +1 -1
  146. package/dist/components/core/kanban/SolidManyToOneFilterElement.js.map +1 -1
  147. package/dist/components/core/kanban/SolidManyToOneFilterElement.tsx +1 -2
  148. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.d.ts.map +1 -1
  149. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.js +2 -2
  150. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.js.map +1 -1
  151. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.tsx +21 -10
  152. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.d.ts.map +1 -1
  153. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js +2 -2
  154. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js.map +1 -1
  155. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +18 -10
  156. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.d.ts.map +1 -1
  157. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js +3 -6
  158. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js.map +1 -1
  159. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +30 -24
  160. package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.js.map +1 -1
  161. package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.tsx +2 -2
  162. package/dist/components/core/list/SolidDataTablePagination.d.ts +15 -0
  163. package/dist/components/core/list/SolidDataTablePagination.d.ts.map +1 -0
  164. package/dist/components/core/list/SolidDataTablePagination.js +22 -0
  165. package/dist/components/core/list/SolidDataTablePagination.js.map +1 -0
  166. package/dist/components/core/list/SolidDataTablePagination.tsx +71 -0
  167. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  168. package/dist/components/core/list/SolidListView.js +58 -61
  169. package/dist/components/core/list/SolidListView.js.map +1 -1
  170. package/dist/components/core/list/SolidListView.tsx +42 -46
  171. package/dist/components/core/list/SolidListViewConfigure.js +1 -1
  172. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  173. package/dist/components/core/list/SolidListViewConfigure.tsx +1 -1
  174. package/dist/components/core/list/SolidListViewRowButtonContextMenu.d.ts +1 -1
  175. package/dist/components/core/list/SolidListViewRowButtonContextMenu.d.ts.map +1 -1
  176. package/dist/components/core/list/SolidListViewRowButtonContextMenu.js +6 -7
  177. package/dist/components/core/list/SolidListViewRowButtonContextMenu.js.map +1 -1
  178. package/dist/components/core/list/SolidListViewRowButtonContextMenu.tsx +9 -10
  179. package/dist/components/layout/user-profile-menu.d.ts.map +1 -1
  180. package/dist/components/layout/user-profile-menu.js +15 -14
  181. package/dist/components/layout/user-profile-menu.js.map +1 -1
  182. package/dist/components/layout/user-profile-menu.tsx +8 -6
  183. package/dist/components/shad-cn-ui/SolidDialog.d.ts +1 -1
  184. package/dist/components/shad-cn-ui/SolidDialog.d.ts.map +1 -1
  185. package/dist/components/shad-cn-ui/SolidDialog.js.map +1 -1
  186. package/dist/components/shad-cn-ui/SolidDialog.tsx +1 -1
  187. package/dist/components/shad-cn-ui/SolidIcon.d.ts +2 -2
  188. package/dist/components/shad-cn-ui/SolidIcon.d.ts.map +1 -1
  189. package/dist/components/shad-cn-ui/SolidIcon.js +3 -4
  190. package/dist/components/shad-cn-ui/SolidIcon.js.map +1 -1
  191. package/dist/components/shad-cn-ui/SolidIcon.tsx +12 -15
  192. package/dist/components/shad-cn-ui/SolidRichTextEditor.d.ts.map +1 -1
  193. package/dist/components/shad-cn-ui/SolidRichTextEditor.js +9 -1
  194. package/dist/components/shad-cn-ui/SolidRichTextEditor.js.map +1 -1
  195. package/dist/components/shad-cn-ui/SolidRichTextEditor.tsx +8 -1
  196. package/dist/components/shad-cn-ui/SolidTabs.d.ts +2 -1
  197. package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -1
  198. package/dist/components/shad-cn-ui/SolidTabs.js +2 -2
  199. package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -1
  200. package/dist/components/shad-cn-ui/SolidTabs.tsx +12 -1
  201. package/dist/components/solid-ui/SolidButton.d.ts +14 -0
  202. package/dist/components/solid-ui/SolidButton.d.ts.map +1 -0
  203. package/dist/components/solid-ui/SolidButton.js +36 -0
  204. package/dist/components/solid-ui/SolidButton.js.map +1 -0
  205. package/dist/components/solid-ui/SolidButton.tsx +54 -0
  206. package/dist/components/solid-ui/SolidTabs.d.ts +18 -0
  207. package/dist/components/solid-ui/SolidTabs.d.ts.map +1 -0
  208. package/dist/components/solid-ui/SolidTabs.js +22 -0
  209. package/dist/components/solid-ui/SolidTabs.js.map +1 -0
  210. package/dist/components/solid-ui/SolidTabs.tsx +73 -0
  211. package/dist/components/solid-ui/index.d.ts +3 -0
  212. package/dist/components/solid-ui/index.d.ts.map +1 -0
  213. package/dist/components/solid-ui/index.js +3 -0
  214. package/dist/components/solid-ui/index.js.map +1 -0
  215. package/dist/components/solid-ui/index.ts +2 -0
  216. package/dist/helpers/registry.d.ts +2 -2
  217. package/dist/helpers/registry.d.ts.map +1 -1
  218. package/dist/helpers/registry.js +4 -0
  219. package/dist/helpers/registry.js.map +1 -1
  220. package/dist/helpers/registry.ts +5 -3
  221. package/dist/helpers/settingsPayload.d.ts +32 -0
  222. package/dist/helpers/settingsPayload.d.ts.map +1 -0
  223. package/dist/helpers/settingsPayload.js +72 -0
  224. package/dist/helpers/settingsPayload.js.map +1 -0
  225. package/dist/helpers/settingsPayload.ts +125 -0
  226. package/dist/index.d.ts +4 -0
  227. package/dist/index.d.ts.map +1 -1
  228. package/dist/index.js +4 -0
  229. package/dist/index.js.map +1 -1
  230. package/dist/index.ts +4 -0
  231. package/dist/redux/api/solidChatterMessageApi.d.ts +2 -1
  232. package/dist/redux/api/solidChatterMessageApi.d.ts.map +1 -1
  233. package/dist/redux/api/solidChatterMessageApi.js +11 -1
  234. package/dist/redux/api/solidChatterMessageApi.js.map +1 -1
  235. package/dist/redux/api/solidChatterMessageApi.ts +10 -1
  236. package/dist/redux/store/defaultStoreConfig.d.ts +1 -0
  237. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  238. package/dist/resources/globals.css +5 -1
  239. package/dist/resources/shadcn-base.css +242 -81
  240. package/dist/resources/solid-responsive.css +22 -4
  241. package/dist/routes/AppEventListener.js +1 -1
  242. package/dist/routes/AppEventListener.js.map +1 -1
  243. package/dist/routes/AppEventListener.tsx +1 -1
  244. package/dist/routes/pages/admin/core/SettingsPage.js +2 -2
  245. package/dist/routes/pages/admin/core/SettingsPage.js.map +1 -1
  246. package/dist/routes/pages/admin/core/SettingsPage.tsx +2 -2
  247. package/dist/routes/pages/auth/InitiateFacebookOauthPage.d.ts +2 -0
  248. package/dist/routes/pages/auth/InitiateFacebookOauthPage.d.ts.map +1 -0
  249. package/dist/routes/pages/auth/InitiateFacebookOauthPage.js +6 -0
  250. package/dist/routes/pages/auth/InitiateFacebookOauthPage.js.map +1 -0
  251. package/dist/routes/pages/auth/InitiateFacebookOauthPage.tsx +5 -0
  252. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.d.ts +2 -0
  253. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.d.ts.map +1 -0
  254. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.js +6 -0
  255. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.js.map +1 -0
  256. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.tsx +5 -0
  257. package/dist/routes/solidRoutes.d.ts.map +1 -1
  258. package/dist/routes/solidRoutes.js +5 -1
  259. package/dist/routes/solidRoutes.js.map +1 -1
  260. package/dist/routes/solidRoutes.tsx +5 -1
  261. package/dist/routes/types.d.ts +1 -1
  262. package/dist/routes/types.d.ts.map +1 -1
  263. package/dist/routes/types.js.map +1 -1
  264. package/dist/routes/types.ts +2 -0
  265. package/dist/types/extension-registry.d.ts +1 -0
  266. package/dist/types/extension-registry.d.ts.map +1 -1
  267. package/dist/types/extension-registry.js +1 -0
  268. package/dist/types/extension-registry.js.map +1 -1
  269. package/dist/types/extension-registry.ts +1 -0
  270. package/dist/types/index.d.ts +2 -0
  271. package/dist/types/solid-core.d.ts +10 -0
  272. package/package.json +1 -1
  273. package/dist/components/auth/SolidOTPVerify.d.ts +0 -3
  274. package/dist/components/auth/SolidOTPVerify.d.ts.map +0 -1
  275. package/dist/components/auth/SolidOTPVerify.js +0 -67
  276. package/dist/components/auth/SolidOTPVerify.js.map +0 -1
  277. package/dist/components/auth/SolidOTPVerify.tsx +0 -133
  278. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts +0 -2
  279. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts.map +0 -1
  280. package/dist/components/core/common/LoadDynamicJsxComponent.js +0 -50
  281. package/dist/components/core/common/LoadDynamicJsxComponent.js.map +0 -1
  282. package/dist/components/core/common/LoadDynamicJsxComponent.tsx +0 -70
  283. package/dist/nextAuth/authProviders.d.ts +0 -4
  284. package/dist/nextAuth/authProviders.d.ts.map +0 -1
  285. package/dist/nextAuth/authProviders.js +0 -198
  286. package/dist/nextAuth/authProviders.js.map +0 -1
  287. package/dist/nextAuth/authProviders.tsx +0 -232
  288. package/dist/nextAuth/handleLogout.d.ts +0 -2
  289. package/dist/nextAuth/handleLogout.d.ts.map +0 -1
  290. package/dist/nextAuth/handleLogout.js +0 -36
  291. package/dist/nextAuth/handleLogout.js.map +0 -1
  292. package/dist/nextAuth/handleLogout.tsx +0 -39
  293. package/dist/nextAuth/refreshAccessToken.d.ts +0 -2
  294. package/dist/nextAuth/refreshAccessToken.d.ts.map +0 -1
  295. package/dist/nextAuth/refreshAccessToken.js +0 -24
  296. package/dist/nextAuth/refreshAccessToken.js.map +0 -1
  297. package/dist/nextAuth/refreshAccessToken.tsx +0 -28
  298. package/dist/redux/features/settingsSlice.d.ts +0 -20
  299. package/dist/redux/features/settingsSlice.d.ts.map +0 -1
  300. package/dist/redux/features/settingsSlice.js +0 -39
  301. package/dist/redux/features/settingsSlice.js.map +0 -1
  302. package/dist/redux/features/settingsSlice.ts +0 -60
@@ -1,3 +1,39 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
1
37
  var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
38
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
39
  if (ar || !(i in from)) {
@@ -14,8 +50,9 @@ import { useMemo, useState } from 'react';
14
50
  import styles from './chatter.module.css';
15
51
  import { SolidChatterCustomMessage } from './SolidChatterCustomMessage';
16
52
  import { SolidChatterAuditMessage } from './SolidChatterAuditMessage';
17
- import { GitBranch, MessageSquare } from 'lucide-react';
18
- import { SolidLightbox, SolidTooltip, SolidTooltipContent, SolidTooltipTrigger, SolidIcon } from '../../shad-cn-ui';
53
+ import { Check, GitBranch, MessageSquare } from 'lucide-react';
54
+ import { SolidButton, SolidLightbox, SolidTag, SolidTooltip, SolidTooltipContent, SolidTooltipTrigger, SolidIcon } from '../../shad-cn-ui';
55
+ import { usePatchChatterMessageMutation } from '../../../redux/api/solidChatterMessageApi';
19
56
  var getFileIcon = function (mimeType) {
20
57
  if (mimeType.startsWith('image/')) {
21
58
  return 'si-image';
@@ -36,9 +73,11 @@ var getFileIcon = function (mimeType) {
36
73
  }
37
74
  };
38
75
  export var SolidChatterMessageBox = function (props) {
39
- var user = props.user, messageType = props.messageType, message = props.message, time = props.time, auditRecord = props.auditRecord, media = props.media, messageSubType = props.messageSubType, modelDisplayName = props.modelDisplayName, modelUserKey = props.modelUserKey;
76
+ var messageId = props.messageId, user = props.user, messageType = props.messageType, message = props.message, time = props.time, auditRecord = props.auditRecord, media = props.media, messageSubType = props.messageSubType, status = props.status, modelDisplayName = props.modelDisplayName, modelUserKey = props.modelUserKey, onRefresh = props.onRefresh;
40
77
  var _a = useState([]), lightboxSlides = _a[0], setLightboxSlides = _a[1];
41
78
  var _b = useState(false), openLightbox = _b[0], setOpenLightbox = _b[1];
79
+ var _c = useState(status), taskStatus = _c[0], setTaskStatus = _c[1];
80
+ var _d = usePatchChatterMessageMutation(), patchChatterMessage = _d[0], isUpdatingTaskStatus = _d[1].isLoading;
42
81
  var avatarStyle = useMemo(function () {
43
82
  var bg = stringToColor(user);
44
83
  var color = getTextColor(bg);
@@ -86,9 +125,34 @@ export var SolidChatterMessageBox = function (props) {
86
125
  : "Audit record")
87
126
  : "Internal note";
88
127
  var TypeIcon = messageType === 'audit' ? GitBranch : MessageSquare;
128
+ var isTaskMessage = messageSubType === 'task';
129
+ var isTaskCompleted = (taskStatus !== null && taskStatus !== void 0 ? taskStatus : '').toLowerCase() === 'completed';
130
+ var handleMarkTaskDone = function () { return __awaiter(void 0, void 0, void 0, function () {
131
+ var e_1;
132
+ return __generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0:
135
+ if (!messageId || isUpdatingTaskStatus)
136
+ return [2 /*return*/];
137
+ _a.label = 1;
138
+ case 1:
139
+ _a.trys.push([1, 3, , 4]);
140
+ return [4 /*yield*/, patchChatterMessage({ id: messageId, data: { status: 'completed' } }).unwrap()];
141
+ case 2:
142
+ _a.sent();
143
+ setTaskStatus('completed');
144
+ onRefresh === null || onRefresh === void 0 ? void 0 : onRefresh();
145
+ return [3 /*break*/, 4];
146
+ case 3:
147
+ e_1 = _a.sent();
148
+ return [3 /*break*/, 4];
149
+ case 4: return [2 /*return*/];
150
+ }
151
+ });
152
+ }); };
89
153
  return (_jsxs("div", { className: styles.solidChatterMessageBox, children: [_jsx("div", { className: styles.solidChatterMessageCard, children: _jsxs("div", { className: styles.solidChatterMessageLayout, children: [_jsx("div", { className: styles.solidChatterAvatar, style: avatarStyle, children: initials || user.charAt(0).toUpperCase() }), _jsxs("div", { className: styles.solidChatterMessageContent, children: [_jsxs("div", { className: styles.solidChatterMessageHeader, children: [_jsxs("div", { className: 'flex align-items-center gap-2 flex-wrap', children: [_jsx("p", { className: styles.solidChatterUser, children: user }), _jsxs(SolidTooltip, { children: [_jsx(SolidTooltipTrigger, { asChild: true, children: _jsx("span", { className: "".concat(styles.solidChatterBadge, " ").concat(messageType === 'audit' ? styles.audit : styles.custom), "aria-label": messageLabel, children: _jsx(TypeIcon, { size: 12 }) }) }), _jsx(SolidTooltipContent, { side: "right", children: messageLabel })] })] }), _jsx("span", { className: styles.solidChatterTime, children: time })] }), modelDisplayName && (_jsxs("p", { className: "".concat(styles.solidChatterMeta, " m-0"), children: [modelDisplayName, modelUserKey && _jsxs(_Fragment, { children: [" \u00B7 ", _jsx("span", { className: 'font-medium', children: modelUserKey })] })] })), message && (_jsx("div", { className: styles.solidMessageWrapper, children: renderMessageContent() })), (media === null || media === void 0 ? void 0 : media.messageAttachments) && media.messageAttachments.length > 0 && (_jsx("div", { className: styles.solidChatterAttachments, children: media.messageAttachments.map(function (attachment) {
90
154
  var isImage = attachment.mimeType.startsWith('image/');
91
155
  return (_jsx("div", { className: styles.solidChatterAttachment, children: isImage ? (_jsx("div", { className: 'cursor-pointer', onClick: function () { return handleImageClick(attachment._full_url); }, children: _jsx(Image, { src: encodeURI(attachment._full_url), alt: attachment.originalFileName, width: 54, height: 54, style: { objectFit: 'cover' } }) })) : (_jsxs("a", { href: encodeURI(attachment._full_url), target: "_blank", rel: "noopener noreferrer", className: 'flex align-items-center gap-2 text-decoration-none text-sm', children: [_jsx(SolidIcon, { name: getFileIcon(attachment.mimeType), "aria-hidden": true }), _jsx("span", { children: attachment.originalFileName })] })) }, attachment.id));
92
- }) }))] })] }) }), openLightbox && (_jsx(SolidLightbox, { open: openLightbox, slides: lightboxSlides, onClose: function () { return setOpenLightbox(false); } }))] }));
156
+ }) })), isTaskMessage && (_jsx("div", { className: 'flex align-items-center justify-content-end', children: isTaskCompleted ? (_jsxs(SolidTag, { tone: "success", className: "inline-flex align-items-center gap-1 text-xs px-2 py-1", children: [_jsx(Check, { size: 12, "aria-hidden": true }), _jsx("span", { className: "font-medium", children: "Done" })] })) : (_jsx(SolidButton, { type: "button", size: "sm", variant: "outline", className: "text-xs px-2 py-1", leftIcon: _jsx(Check, { size: 12 }), loading: isUpdatingTaskStatus, onClick: handleMarkTaskDone, children: _jsx("span", { className: "font-semibold", children: "Mark as done" }) })) }))] })] }) }), openLightbox && (_jsx(SolidLightbox, { open: openLightbox, slides: lightboxSlides, onClose: function () { return setOpenLightbox(false); } }))] }));
93
157
  };
94
158
  //# sourceMappingURL=SolidChatterMessageBox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SolidChatterMessageBox.js","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatterMessageBox.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport { getTextColor, stringToColor } from '../../../helpers/getRandomColors'\nimport Image from \"../../common/Image\"\nimport { useMemo, useState } from 'react'\nimport styles from './chatter.module.css'\nimport { SolidChatterCustomMessage } from './SolidChatterCustomMessage'\nimport { SolidChatterAuditMessage } from './SolidChatterAuditMessage'\nimport { GitBranch, MessageSquare } from 'lucide-react'\nimport { SolidLightbox, SolidTooltip, SolidTooltipContent, SolidTooltipTrigger, SolidIcon, type SolidIconName } from '../../shad-cn-ui'\nimport type { SolidLightboxSlide } from '../../shad-cn-ui/SolidLightbox'\n\ninterface Props {\n user: string,\n messageType?: string,\n message?: any,\n time?: string,\n auditRecord?: any,\n messageSubType?: string,\n modelDisplayName?: string,\n modelUserKey?: string,\n media?: {\n messageAttachments?: Array<{\n id: number;\n relativeUri: string;\n mimeType: string;\n originalFileName: string;\n _full_url: string;\n }>;\n };\n}\n\nconst getFileIcon = (mimeType: string): SolidIconName => {\n if (mimeType.startsWith('image/')) {\n return 'si-image';\n }\n switch (mimeType) {\n case 'application/pdf':\n return 'si-file-pdf';\n case 'application/vnd.ms-excel':\n case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n return 'si-file-excel';\n case 'application/msword':\n case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n return 'si-file-word';\n case 'text/plain':\n return 'si-file';\n default:\n return 'si-file';\n }\n};\n\nexport const SolidChatterMessageBox = (props: Props) => {\n const { user, messageType, message, time, auditRecord, media, messageSubType, modelDisplayName, modelUserKey } = props;\n const [lightboxSlides, setLightboxSlides] = useState<SolidLightboxSlide[]>([]);\n const [openLightbox, setOpenLightbox] = useState(false);\n\n const avatarStyle = useMemo(() => {\n const bg = stringToColor(user)\n const color = getTextColor(bg)\n return { backgroundColor: bg, color }\n }, [user])\n\n const initials = useMemo(() => {\n if (!user) return \"\";\n return user\n .split(\" \")\n .map(part => part.charAt(0))\n .filter(Boolean)\n .slice(0, 2)\n .join(\"\")\n .toUpperCase();\n }, [user]);\n\n const handleImageClick = (url: string) => {\n const imageAttachments = media?.messageAttachments?.filter(att => att.mimeType?.startsWith('image/')) || [];\n if (imageAttachments.length === 0) return;\n\n const startIndex = imageAttachments.findIndex(att => att._full_url === url);\n const ordered = startIndex >= 0\n ? [...imageAttachments.slice(startIndex), ...imageAttachments.slice(0, startIndex)]\n : imageAttachments;\n\n const slides: SolidLightboxSlide[] = ordered.map(att => ({\n src: att._full_url\n }));\n\n setLightboxSlides(slides);\n setOpenLightbox(true);\n };\n\n const renderMessageContent = () => {\n switch (messageType) {\n case 'audit':\n return <SolidChatterAuditMessage auditRecord={auditRecord} />;\n case 'custom':\n default:\n return <SolidChatterCustomMessage message={message} />;\n }\n };\n\n const messageLabel = messageType === 'audit'\n ? (messageSubType === \"audit_update\"\n ? \"Updated\"\n : messageSubType === \"audit_insert\"\n ? \"Inserted\"\n : \"Audit record\")\n : \"Internal note\";\n\n const TypeIcon = messageType === 'audit' ? GitBranch : MessageSquare;\n\n return (\n <div className={styles.solidChatterMessageBox}>\n <div className={styles.solidChatterMessageCard}>\n <div className={styles.solidChatterMessageLayout}>\n <div className={styles.solidChatterAvatar} style={avatarStyle}>\n {initials || user.charAt(0).toUpperCase()}\n </div>\n <div className={styles.solidChatterMessageContent}>\n <div className={styles.solidChatterMessageHeader}>\n <div className='flex align-items-center gap-2 flex-wrap'>\n <p className={styles.solidChatterUser}>{user}</p>\n <SolidTooltip>\n <SolidTooltipTrigger asChild>\n <span\n className={`${styles.solidChatterBadge} ${messageType === 'audit' ? styles.audit : styles.custom}`}\n aria-label={messageLabel}\n >\n <TypeIcon size={12} />\n </span>\n </SolidTooltipTrigger>\n <SolidTooltipContent side=\"right\">\n {messageLabel}\n </SolidTooltipContent>\n </SolidTooltip>\n </div>\n <span className={styles.solidChatterTime}>{time}</span>\n </div>\n {modelDisplayName && (\n <p className={`${styles.solidChatterMeta} m-0`}>\n {modelDisplayName}\n {modelUserKey && <> · <span className='font-medium'>{modelUserKey}</span></>}\n </p>\n )}\n {message && (\n <div className={styles.solidMessageWrapper}>\n {renderMessageContent()}\n </div>\n )}\n {media?.messageAttachments && media.messageAttachments.length > 0 && (\n <div className={styles.solidChatterAttachments}>\n {media.messageAttachments.map((attachment) => {\n const isImage = attachment.mimeType.startsWith('image/');\n return (\n <div key={attachment.id} className={styles.solidChatterAttachment}>\n {isImage ? (\n <div\n className='cursor-pointer'\n onClick={() => handleImageClick(attachment._full_url)}\n >\n <Image\n src={encodeURI(attachment._full_url)}\n alt={attachment.originalFileName}\n width={54}\n height={54}\n style={{ objectFit: 'cover' }}\n />\n </div>\n ) : (\n <a\n href={encodeURI(attachment._full_url)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className='flex align-items-center gap-2 text-decoration-none text-sm'\n >\n <SolidIcon name={getFileIcon(attachment.mimeType)} aria-hidden />\n <span>{attachment.originalFileName}</span>\n </a>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n {openLightbox && (\n <SolidLightbox\n open={openLightbox}\n slides={lightboxSlides}\n onClose={() => setOpenLightbox(false)}\n />\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"file":"SolidChatterMessageBox.js","sourceRoot":"","sources":["../../../../src/components/core/chatter/SolidChatterMessageBox.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport { getTextColor, stringToColor } from '../../../helpers/getRandomColors'\nimport Image from \"../../common/Image\"\nimport { useMemo, useState } from 'react'\nimport styles from './chatter.module.css'\nimport { SolidChatterCustomMessage } from './SolidChatterCustomMessage'\nimport { SolidChatterAuditMessage } from './SolidChatterAuditMessage'\nimport { Check, GitBranch, MessageSquare } from 'lucide-react'\nimport { SolidButton, SolidLightbox, SolidTag, SolidTooltip, SolidTooltipContent, SolidTooltipTrigger, SolidIcon, type SolidIconName } from '../../shad-cn-ui'\nimport type { SolidLightboxSlide } from '../../shad-cn-ui/SolidLightbox'\nimport { usePatchChatterMessageMutation } from '../../../redux/api/solidChatterMessageApi'\n\ninterface Props {\n messageId?: number | string,\n user: string,\n messageType?: string,\n message?: any,\n time?: string,\n auditRecord?: any,\n messageSubType?: string,\n status?: string,\n modelDisplayName?: string,\n modelUserKey?: string,\n onRefresh?: () => void,\n media?: {\n messageAttachments?: Array<{\n id: number;\n relativeUri: string;\n mimeType: string;\n originalFileName: string;\n _full_url: string;\n }>;\n };\n}\n\nconst getFileIcon = (mimeType: string): SolidIconName => {\n if (mimeType.startsWith('image/')) {\n return 'si-image';\n }\n switch (mimeType) {\n case 'application/pdf':\n return 'si-file-pdf';\n case 'application/vnd.ms-excel':\n case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n return 'si-file-excel';\n case 'application/msword':\n case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n return 'si-file-word';\n case 'text/plain':\n return 'si-file';\n default:\n return 'si-file';\n }\n};\n\nexport const SolidChatterMessageBox = (props: Props) => {\n const { messageId, user, messageType, message, time, auditRecord, media, messageSubType, status, modelDisplayName, modelUserKey, onRefresh } = props;\n const [lightboxSlides, setLightboxSlides] = useState<SolidLightboxSlide[]>([]);\n const [openLightbox, setOpenLightbox] = useState(false);\n const [taskStatus, setTaskStatus] = useState<string | undefined>(status);\n const [patchChatterMessage, { isLoading: isUpdatingTaskStatus }] = usePatchChatterMessageMutation();\n\n const avatarStyle = useMemo(() => {\n const bg = stringToColor(user)\n const color = getTextColor(bg)\n return { backgroundColor: bg, color }\n }, [user])\n\n const initials = useMemo(() => {\n if (!user) return \"\";\n return user\n .split(\" \")\n .map(part => part.charAt(0))\n .filter(Boolean)\n .slice(0, 2)\n .join(\"\")\n .toUpperCase();\n }, [user]);\n\n const handleImageClick = (url: string) => {\n const imageAttachments = media?.messageAttachments?.filter(att => att.mimeType?.startsWith('image/')) || [];\n if (imageAttachments.length === 0) return;\n\n const startIndex = imageAttachments.findIndex(att => att._full_url === url);\n const ordered = startIndex >= 0\n ? [...imageAttachments.slice(startIndex), ...imageAttachments.slice(0, startIndex)]\n : imageAttachments;\n\n const slides: SolidLightboxSlide[] = ordered.map(att => ({\n src: att._full_url\n }));\n\n setLightboxSlides(slides);\n setOpenLightbox(true);\n };\n\n const renderMessageContent = () => {\n switch (messageType) {\n case 'audit':\n return <SolidChatterAuditMessage auditRecord={auditRecord} />;\n case 'custom':\n default:\n return <SolidChatterCustomMessage message={message} />;\n }\n };\n\n const messageLabel = messageType === 'audit'\n ? (messageSubType === \"audit_update\"\n ? \"Updated\"\n : messageSubType === \"audit_insert\"\n ? \"Inserted\"\n : \"Audit record\")\n : \"Internal note\";\n\n const TypeIcon = messageType === 'audit' ? GitBranch : MessageSquare;\n\n const isTaskMessage = messageSubType === 'task';\n const isTaskCompleted = (taskStatus ?? '').toLowerCase() === 'completed';\n\n const handleMarkTaskDone = async () => {\n if (!messageId || isUpdatingTaskStatus) return;\n try {\n await patchChatterMessage({ id: messageId, data: { status: 'completed' } }).unwrap();\n setTaskStatus('completed');\n onRefresh?.();\n } catch (e) {\n // no-op (parent/global error handling if any)\n }\n };\n\n return (\n <div className={styles.solidChatterMessageBox}>\n <div className={styles.solidChatterMessageCard}>\n <div className={styles.solidChatterMessageLayout}>\n <div className={styles.solidChatterAvatar} style={avatarStyle}>\n {initials || user.charAt(0).toUpperCase()}\n </div>\n <div className={styles.solidChatterMessageContent}>\n <div className={styles.solidChatterMessageHeader}>\n <div className='flex align-items-center gap-2 flex-wrap'>\n <p className={styles.solidChatterUser}>{user}</p>\n <SolidTooltip>\n <SolidTooltipTrigger asChild>\n <span\n className={`${styles.solidChatterBadge} ${messageType === 'audit' ? styles.audit : styles.custom}`}\n aria-label={messageLabel}\n >\n <TypeIcon size={12} />\n </span>\n </SolidTooltipTrigger>\n <SolidTooltipContent side=\"right\">\n {messageLabel}\n </SolidTooltipContent>\n </SolidTooltip>\n </div>\n <span className={styles.solidChatterTime}>{time}</span>\n </div>\n {modelDisplayName && (\n <p className={`${styles.solidChatterMeta} m-0`}>\n {modelDisplayName}\n {modelUserKey && <> · <span className='font-medium'>{modelUserKey}</span></>}\n </p>\n )}\n {message && (\n <div className={styles.solidMessageWrapper}>\n {renderMessageContent()}\n </div>\n )}\n {media?.messageAttachments && media.messageAttachments.length > 0 && (\n <div className={styles.solidChatterAttachments}>\n {media.messageAttachments.map((attachment) => {\n const isImage = attachment.mimeType.startsWith('image/');\n return (\n <div key={attachment.id} className={styles.solidChatterAttachment}>\n {isImage ? (\n <div\n className='cursor-pointer'\n onClick={() => handleImageClick(attachment._full_url)}\n >\n <Image\n src={encodeURI(attachment._full_url)}\n alt={attachment.originalFileName}\n width={54}\n height={54}\n style={{ objectFit: 'cover' }}\n />\n </div>\n ) : (\n <a\n href={encodeURI(attachment._full_url)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className='flex align-items-center gap-2 text-decoration-none text-sm'\n >\n <SolidIcon name={getFileIcon(attachment.mimeType)} aria-hidden />\n <span>{attachment.originalFileName}</span>\n </a>\n )}\n </div>\n );\n })}\n </div>\n )}\n {isTaskMessage && (\n <div className='flex align-items-center justify-content-end'>\n {isTaskCompleted ? (\n <SolidTag tone=\"success\" className=\"inline-flex align-items-center gap-1 text-xs px-2 py-1\">\n <Check size={12} aria-hidden />\n <span className=\"font-medium\">Done</span>\n </SolidTag>\n ) : (\n <SolidButton\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"text-xs px-2 py-1\"\n leftIcon={<Check size={12} />}\n loading={isUpdatingTaskStatus}\n onClick={handleMarkTaskDone}\n >\n <span className=\"font-semibold\">Mark as done</span>\n </SolidButton>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n {openLightbox && (\n <SolidLightbox\n open={openLightbox}\n slides={lightboxSlides}\n onClose={() => setOpenLightbox(false)}\n />\n )}\n </div>\n )\n}\n"]}
@@ -5,19 +5,23 @@ import { useMemo, useState } from 'react'
5
5
  import styles from './chatter.module.css'
6
6
  import { SolidChatterCustomMessage } from './SolidChatterCustomMessage'
7
7
  import { SolidChatterAuditMessage } from './SolidChatterAuditMessage'
8
- import { GitBranch, MessageSquare } from 'lucide-react'
9
- import { SolidLightbox, SolidTooltip, SolidTooltipContent, SolidTooltipTrigger, SolidIcon, type SolidIconName } from '../../shad-cn-ui'
8
+ import { Check, GitBranch, MessageSquare } from 'lucide-react'
9
+ import { SolidButton, SolidLightbox, SolidTag, SolidTooltip, SolidTooltipContent, SolidTooltipTrigger, SolidIcon, type SolidIconName } from '../../shad-cn-ui'
10
10
  import type { SolidLightboxSlide } from '../../shad-cn-ui/SolidLightbox'
11
+ import { usePatchChatterMessageMutation } from '../../../redux/api/solidChatterMessageApi'
11
12
 
12
13
  interface Props {
14
+ messageId?: number | string,
13
15
  user: string,
14
16
  messageType?: string,
15
17
  message?: any,
16
18
  time?: string,
17
19
  auditRecord?: any,
18
20
  messageSubType?: string,
21
+ status?: string,
19
22
  modelDisplayName?: string,
20
23
  modelUserKey?: string,
24
+ onRefresh?: () => void,
21
25
  media?: {
22
26
  messageAttachments?: Array<{
23
27
  id: number;
@@ -50,9 +54,11 @@ const getFileIcon = (mimeType: string): SolidIconName => {
50
54
  };
51
55
 
52
56
  export const SolidChatterMessageBox = (props: Props) => {
53
- const { user, messageType, message, time, auditRecord, media, messageSubType, modelDisplayName, modelUserKey } = props;
57
+ const { messageId, user, messageType, message, time, auditRecord, media, messageSubType, status, modelDisplayName, modelUserKey, onRefresh } = props;
54
58
  const [lightboxSlides, setLightboxSlides] = useState<SolidLightboxSlide[]>([]);
55
59
  const [openLightbox, setOpenLightbox] = useState(false);
60
+ const [taskStatus, setTaskStatus] = useState<string | undefined>(status);
61
+ const [patchChatterMessage, { isLoading: isUpdatingTaskStatus }] = usePatchChatterMessageMutation();
56
62
 
57
63
  const avatarStyle = useMemo(() => {
58
64
  const bg = stringToColor(user)
@@ -108,6 +114,20 @@ export const SolidChatterMessageBox = (props: Props) => {
108
114
 
109
115
  const TypeIcon = messageType === 'audit' ? GitBranch : MessageSquare;
110
116
 
117
+ const isTaskMessage = messageSubType === 'task';
118
+ const isTaskCompleted = (taskStatus ?? '').toLowerCase() === 'completed';
119
+
120
+ const handleMarkTaskDone = async () => {
121
+ if (!messageId || isUpdatingTaskStatus) return;
122
+ try {
123
+ await patchChatterMessage({ id: messageId, data: { status: 'completed' } }).unwrap();
124
+ setTaskStatus('completed');
125
+ onRefresh?.();
126
+ } catch (e) {
127
+ // no-op (parent/global error handling if any)
128
+ }
129
+ };
130
+
111
131
  return (
112
132
  <div className={styles.solidChatterMessageBox}>
113
133
  <div className={styles.solidChatterMessageCard}>
@@ -181,6 +201,28 @@ export const SolidChatterMessageBox = (props: Props) => {
181
201
  })}
182
202
  </div>
183
203
  )}
204
+ {isTaskMessage && (
205
+ <div className='flex align-items-center justify-content-end'>
206
+ {isTaskCompleted ? (
207
+ <SolidTag tone="success" className="inline-flex align-items-center gap-1 text-xs px-2 py-1">
208
+ <Check size={12} aria-hidden />
209
+ <span className="font-medium">Done</span>
210
+ </SolidTag>
211
+ ) : (
212
+ <SolidButton
213
+ type="button"
214
+ size="sm"
215
+ variant="outline"
216
+ className="text-xs px-2 py-1"
217
+ leftIcon={<Check size={12} />}
218
+ loading={isUpdatingTaskStatus}
219
+ onClick={handleMarkTaskDone}
220
+ >
221
+ <span className="font-semibold">Mark as done</span>
222
+ </SolidButton>
223
+ )}
224
+ </div>
225
+ )}
184
226
  </div>
185
227
  </div>
186
228
  </div>
@@ -3,9 +3,6 @@
3
3
  border-bottom: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
4
4
  }
5
5
 
6
- .chatterTitleWithLabel {
7
- padding-left: 2.4rem;
8
- }
9
6
 
10
7
  .chatterMessageComposer .chatterMessageInput {
11
8
  background-color: var(--background);
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAccountSettings.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,oBAAoB,gEAAiE,GAAG,mDA0EpG,CAAC"}
1
+ {"version":3,"file":"SolidAccountSettings.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,gEAAiE,GAAG,mDA2EpG,CAAC"}
@@ -5,6 +5,7 @@ import { SolidChangePassword } from "./SolidChangePassword";
5
5
  import { SolidVersionInfo } from "./SolidVersionInfo";
6
6
  import styles from "./SolidAccountSettings.module.css";
7
7
  import { useLazyGetSolidSettingsQuery } from "../../../../redux/api/solidSettingsApi";
8
+ import { toLegacySettingsShape } from "../../../../helpers/settingsPayload";
8
9
  export var SolidAccountSettings = function (_a) {
9
10
  var showProfileSettingsDialog = _a.showProfileSettingsDialog, setShowProfileSettingsDialog = _a.setShowProfileSettingsDialog;
10
11
  var _b = useState("personal_info"), settingKey = _b[0], setSettingKey = _b[1];
@@ -18,11 +19,12 @@ export var SolidAccountSettings = function (_a) {
18
19
  { label: "About", key: "about" },
19
20
  ];
20
21
  var renderSettingComponent = useMemo(function () {
22
+ var legacySettings = toLegacySettingsShape(solidSettingsData);
21
23
  switch (settingKey) {
22
24
  case "personal_info":
23
25
  return _jsx(SolidPersonalInfo, {});
24
26
  case "change_password":
25
- return _jsx(SolidChangePassword, { solidSettingsData: solidSettingsData });
27
+ return _jsx(SolidChangePassword, { solidSettingsData: legacySettings });
26
28
  case "about":
27
29
  return _jsx(SolidVersionInfo, {});
28
30
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAccountSettings.js","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { SolidPersonalInfo } from \"./SolidPersonalInfo\";\nimport { SolidChangePassword } from \"./SolidChangePassword\";\nimport { SolidVersionInfo } from \"./SolidVersionInfo\";\nimport styles from \"./SolidAccountSettings.module.css\";\nimport { useLazyGetSolidSettingsQuery } from \"../../../../redux/api/solidSettingsApi\";\n\nexport const SolidAccountSettings = ({ showProfileSettingsDialog, setShowProfileSettingsDialog }: any) => {\n const [settingKey, setSettingKey] = useState(\"personal_info\");\n\n const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();\n useEffect(() => {\n trigger(\"\");\n }, [trigger]);\n\n const settings = [\n { label: \"Personal Info\", key: \"personal_info\" },\n { label: \"Change Password\", key: \"change_password\" },\n { label: \"About\", key: \"about\" },\n ];\n\n const renderSettingComponent = useMemo(() => {\n switch (settingKey) {\n case \"personal_info\":\n return <SolidPersonalInfo />;\n case \"change_password\":\n return <SolidChangePassword solidSettingsData={solidSettingsData} />;\n case \"about\":\n return <SolidVersionInfo />;\n default:\n return null;\n }\n }, [settingKey, solidSettingsData]);\n\n if (!showProfileSettingsDialog) return null;\n\n return (\n <div className={styles.backdrop} role=\"presentation\" onClick={() => setShowProfileSettingsDialog(false)}>\n <section\n className={styles.modal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"solid-account-settings-title\"\n onClick={(event) => event.stopPropagation()}\n >\n <header className={styles.header}>\n <div>\n <h2 id=\"solid-account-settings-title\" className={styles.title}>\n Account Settings\n </h2>\n <p className={styles.subtitle}>Manage your profile and security settings.</p>\n </div>\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={() => setShowProfileSettingsDialog(false)}\n aria-label=\"Close account settings\"\n >\n ×\n </button>\n </header>\n\n <div className={styles.tabsLine} role=\"tablist\" aria-label=\"Account setting sections\">\n {settings.map((option) => (\n <button\n key={option.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={option.key === settingKey}\n className={`${styles.tabTrigger} ${option.key === settingKey ? styles.tabActive : \"\"}`}\n onClick={() => setSettingKey(option.key)}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n <div className={styles.formWrapper}>{renderSettingComponent}</div>\n </section>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"SolidAccountSettings.js","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { SolidPersonalInfo } from \"./SolidPersonalInfo\";\nimport { SolidChangePassword } from \"./SolidChangePassword\";\nimport { SolidVersionInfo } from \"./SolidVersionInfo\";\nimport styles from \"./SolidAccountSettings.module.css\";\nimport { useLazyGetSolidSettingsQuery } from \"../../../../redux/api/solidSettingsApi\";\nimport { toLegacySettingsShape } from \"../../../../helpers/settingsPayload\";\n\nexport const SolidAccountSettings = ({ showProfileSettingsDialog, setShowProfileSettingsDialog }: any) => {\n const [settingKey, setSettingKey] = useState(\"personal_info\");\n\n const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();\n useEffect(() => {\n trigger(\"\");\n }, [trigger]);\n\n const settings = [\n { label: \"Personal Info\", key: \"personal_info\" },\n { label: \"Change Password\", key: \"change_password\" },\n { label: \"About\", key: \"about\" },\n ];\n\n const renderSettingComponent = useMemo(() => {\n const legacySettings = toLegacySettingsShape(solidSettingsData);\n switch (settingKey) {\n case \"personal_info\":\n return <SolidPersonalInfo />;\n case \"change_password\":\n return <SolidChangePassword solidSettingsData={legacySettings} />;\n case \"about\":\n return <SolidVersionInfo />;\n default:\n return null;\n }\n }, [settingKey, solidSettingsData]);\n\n if (!showProfileSettingsDialog) return null;\n\n return (\n <div className={styles.backdrop} role=\"presentation\" onClick={() => setShowProfileSettingsDialog(false)}>\n <section\n className={styles.modal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"solid-account-settings-title\"\n onClick={(event) => event.stopPropagation()}\n >\n <header className={styles.header}>\n <div>\n <h2 id=\"solid-account-settings-title\" className={styles.title}>\n Account Settings\n </h2>\n <p className={styles.subtitle}>Manage your profile and security settings.</p>\n </div>\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={() => setShowProfileSettingsDialog(false)}\n aria-label=\"Close account settings\"\n >\n ×\n </button>\n </header>\n\n <div className={styles.tabsLine} role=\"tablist\" aria-label=\"Account setting sections\">\n {settings.map((option) => (\n <button\n key={option.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={option.key === settingKey}\n className={`${styles.tabTrigger} ${option.key === settingKey ? styles.tabActive : \"\"}`}\n onClick={() => setSettingKey(option.key)}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n <div className={styles.formWrapper}>{renderSettingComponent}</div>\n </section>\n </div>\n );\n};\n"]}
@@ -4,6 +4,7 @@ import { SolidChangePassword } from "./SolidChangePassword";
4
4
  import { SolidVersionInfo } from "./SolidVersionInfo";
5
5
  import styles from "./SolidAccountSettings.module.css";
6
6
  import { useLazyGetSolidSettingsQuery } from "../../../../redux/api/solidSettingsApi";
7
+ import { toLegacySettingsShape } from "../../../../helpers/settingsPayload";
7
8
 
8
9
  export const SolidAccountSettings = ({ showProfileSettingsDialog, setShowProfileSettingsDialog }: any) => {
9
10
  const [settingKey, setSettingKey] = useState("personal_info");
@@ -20,11 +21,12 @@ export const SolidAccountSettings = ({ showProfileSettingsDialog, setShowProfile
20
21
  ];
21
22
 
22
23
  const renderSettingComponent = useMemo(() => {
24
+ const legacySettings = toLegacySettingsShape(solidSettingsData);
23
25
  switch (settingKey) {
24
26
  case "personal_info":
25
27
  return <SolidPersonalInfo />;
26
28
  case "change_password":
27
- return <SolidChangePassword solidSettingsData={solidSettingsData} />;
29
+ return <SolidChangePassword solidSettingsData={legacySettings} />;
28
30
  case "about":
29
31
  return <SolidVersionInfo />;
30
32
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"SolidNotifications.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidNotifications.tsx"],"names":[],"mappings":"AAcA,eAAO,MAAM,kBAAkB,+CA+F9B,CAAC"}
1
+ {"version":3,"file":"SolidNotifications.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidNotifications.tsx"],"names":[],"mappings":"AAeA,eAAO,MAAM,kBAAkB,+CAgG9B,CAAC"}
@@ -41,9 +41,11 @@ import { ERROR_MESSAGES } from "../../../../constants/error-messages";
41
41
  import { useBulkUpdateSolidUserSettingsMutation, useGetSolidSettingsQuery } from "../../../../redux/api/solidSettingsApi";
42
42
  import { SolidButton } from "../../../shad-cn-ui/SolidButton";
43
43
  import styles from "./SolidAccountSettings.module.css";
44
+ import { getSettingsMap } from "../../../../helpers/settingsPayload";
44
45
  export var SolidNotifications = function () {
45
46
  var _a, _b;
46
47
  var _c = useGetSolidSettingsQuery(undefined), solidSettingsData = _c.data, refetch = _c.refetch;
48
+ var settingsMap = getSettingsMap(solidSettingsData);
47
49
  var bulkUpdateSolidSettings = useBulkUpdateSolidUserSettingsMutation()[0];
48
50
  var _d = useState(null), toast = _d[0], setToast = _d[1];
49
51
  useEffect(function () {
@@ -54,18 +56,17 @@ export var SolidNotifications = function () {
54
56
  };
55
57
  var formik = useFormik({
56
58
  initialValues: {
57
- enableNotification: (_b = (_a = solidSettingsData === null || solidSettingsData === void 0 ? void 0 : solidSettingsData.data) === null || _a === void 0 ? void 0 : _a.enableNotification) !== null && _b !== void 0 ? _b : true,
59
+ enableNotification: (_b = (_a = settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.enableNotification) !== null && _a !== void 0 ? _a : settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.enabledNotification) !== null && _b !== void 0 ? _b : true,
58
60
  },
59
61
  enableReinitialize: true,
60
62
  onSubmit: function (values) { return __awaiter(void 0, void 0, void 0, function () {
61
63
  var updatedSettingsArray_1, currentSettings_1, formData, response, _a;
62
- var _b;
63
- return __generator(this, function (_c) {
64
- switch (_c.label) {
64
+ return __generator(this, function (_b) {
65
+ switch (_b.label) {
65
66
  case 0:
66
- _c.trys.push([0, 2, , 3]);
67
+ _b.trys.push([0, 2, , 3]);
67
68
  updatedSettingsArray_1 = [];
68
- currentSettings_1 = ((_b = solidSettingsData === null || solidSettingsData === void 0 ? void 0 : solidSettingsData.data) === null || _b === void 0 ? void 0 : _b.user) || {};
69
+ currentSettings_1 = settingsMap || {};
69
70
  Object.entries(values).forEach(function (_a) {
70
71
  var _b;
71
72
  var key = _a[0], value = _a[1];
@@ -81,7 +82,7 @@ export var SolidNotifications = function () {
81
82
  formData.append("settings", JSON.stringify(updatedSettingsArray_1));
82
83
  return [4 /*yield*/, bulkUpdateSolidSettings({ data: formData }).unwrap()];
83
84
  case 1:
84
- response = _c.sent();
85
+ response = _b.sent();
85
86
  if (response.statusCode === 200) {
86
87
  notify("success", ERROR_MESSAGES.UPDATED, ERROR_MESSAGES.SETTING_UPDATED);
87
88
  }
@@ -90,7 +91,7 @@ export var SolidNotifications = function () {
90
91
  }
91
92
  return [3 /*break*/, 3];
92
93
  case 2:
93
- _a = _c.sent();
94
+ _a = _b.sent();
94
95
  notify("error", ERROR_MESSAGES.FAILED, ERROR_MESSAGES.SOMETHING_WRONG);
95
96
  return [3 /*break*/, 3];
96
97
  case 3: return [2 /*return*/];
@@ -1 +1 @@
1
- {"version":3,"file":"SolidNotifications.js","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidNotifications.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,sCAAsC,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAC1H,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,MAAM,MAAM,mCAAmC,CAAC;AASvD,MAAM,CAAC,IAAM,kBAAkB,GAAG;;IAC1B,IAAA,KAAuC,wBAAwB,CAAC,SAAS,CAAC,EAAlE,iBAAiB,UAAA,EAAE,OAAO,aAAwC,CAAC;IAC1E,IAAA,uBAAuB,GAAI,sCAAsC,EAAE,GAA5C,CAA6C;IACrE,IAAA,KAAoB,QAAQ,CAAa,IAAI,CAAC,EAA7C,KAAK,QAAA,EAAE,QAAQ,QAA8B,CAAC;IAErD,SAAS,CAAC;QACR,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,IAAM,MAAM,GAAG,UAAC,QAA+C,EAAE,OAAe,EAAE,MAAc;QAC9F,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,UAAA,EAAE,OAAO,SAAA,EAAE,MAAM,QAAA,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,IAAM,MAAM,GAAG,SAAS,CAAC;QACvB,aAAa,EAAE;YACb,kBAAkB,EAAE,MAAA,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,IAAI,0CAAE,kBAAkB,mCAAI,IAAI;SACxE;QACD,kBAAkB,EAAE,IAAI;QACxB,QAAQ,EAAE,UAAO,MAAM;;;;;;;wBAEb,yBAAsF,EAAE,CAAC;wBACzF,oBAAkB,CAAA,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,IAAI,0CAAE,IAAI,KAAI,EAAE,CAAC;wBAC5D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,EAAY;;gCAAX,GAAG,QAAA,EAAE,KAAK,QAAA;4BACzC,IAAI,CAAC,MAAA,iBAAe,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC,KAAK,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC,EAAE;gCAClD,sBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG,KAAA,EAAE,KAAK,OAAA,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;6BACzD;wBACH,CAAC,CAAC,CAAC;wBAEH,IAAI,CAAC,sBAAoB,CAAC,MAAM,EAAE;4BAChC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;4BAC3E,sBAAO;yBACR;wBAEK,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;wBAChC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,sBAAoB,CAAC,CAAC,CAAC;wBACjD,qBAAM,uBAAuB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAA;;wBAArE,QAAQ,GAAG,SAA0D;wBAE3E,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE;4BAC/B,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;yBAC3E;6BAAM;4BACL,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;yBACxE;;;;wBAED,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;;;;;aAE1E;KACF,CAAC,CAAC;IAEH,IAAM,aAAa,GACjB,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,MAAK,OAAO;QACzB,CAAC,CAAC,MAAM,CAAC,UAAU;QACnB,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,MAAK,SAAS;YAC7B,CAAC,CAAC,MAAM,CAAC,YAAY;YACrB,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,MAAK,MAAM;gBAC1B,CAAC,CAAC,MAAM,CAAC,SAAS;gBAClB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IAE3B,OAAO,CACL,gBAAM,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,aAC/D,KAAK,CAAC,CAAC,CAAC,CACP,eAAK,SAAS,EAAE,UAAG,MAAM,CAAC,KAAK,cAAI,aAAa,CAAE,EAAE,IAAI,EAAC,QAAQ,eAAW,QAAQ,aAClF,0BACE,cAAK,SAAS,EAAE,MAAM,CAAC,UAAU,YAAG,KAAK,CAAC,OAAO,GAAO,EACxD,cAAK,SAAS,EAAE,MAAM,CAAC,SAAS,YAAG,KAAK,CAAC,MAAM,GAAO,IAClD,EACN,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,cAAM,OAAA,QAAQ,CAAC,IAAI,CAAC,EAAd,CAAc,gBAAa,oBAAoB,uBAEzG,IACL,CACP,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAE,MAAM,CAAC,aAAa,YAClC,eAAK,SAAS,EAAE,MAAM,CAAC,SAAS,aAC9B,0BACE,gBAAO,SAAS,EAAE,MAAM,CAAC,YAAY,oCAA6B,EAClE,cAAK,SAAS,EAAE,MAAM,CAAC,cAAc,mFAA0E,IAC3G,EACN,iBAAO,SAAS,EAAE,MAAM,CAAC,MAAM,gBAAa,qBAAqB,aAC/D,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAClD,QAAQ,EAAE,UAAC,KAAK,IAAK,OAAA,MAAM,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAhE,CAAgE,GACrF,EACF,eAAM,SAAS,EAAE,MAAM,CAAC,WAAW,GAAI,IACjC,IACJ,GACF,EAEN,cAAK,SAAS,EAAE,MAAM,CAAC,aAAa,YAClC,KAAC,WAAW,IAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,MAAM,CAAC,YAAY,qBAEnD,GACV,IACD,CACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useFormik } from \"formik\";\nimport { ERROR_MESSAGES } from \"../../../../constants/error-messages\";\nimport { useBulkUpdateSolidUserSettingsMutation, useGetSolidSettingsQuery } from \"../../../../redux/api/solidSettingsApi\";\nimport { SolidButton } from \"../../../shad-cn-ui/SolidButton\";\nimport styles from \"./SolidAccountSettings.module.css\";\n\ntype ToastState = {\n id: number;\n severity: \"success\" | \"error\" | \"info\" | \"warn\";\n summary: string;\n detail: string;\n} | null;\n\nexport const SolidNotifications = () => {\n const { data: solidSettingsData, refetch } = useGetSolidSettingsQuery(undefined);\n const [bulkUpdateSolidSettings] = useBulkUpdateSolidUserSettingsMutation();\n const [toast, setToast] = useState<ToastState>(null);\n\n useEffect(() => {\n refetch();\n }, [refetch]);\n\n const notify = (severity: \"success\" | \"error\" | \"info\" | \"warn\", summary: string, detail: string) => {\n setToast({ id: Date.now(), severity, summary, detail });\n };\n\n const formik = useFormik({\n initialValues: {\n enableNotification: solidSettingsData?.data?.enableNotification ?? true,\n },\n enableReinitialize: true,\n onSubmit: async (values) => {\n try {\n const updatedSettingsArray: Array<{ key: string; value: string | boolean; type: string }> = [];\n const currentSettings = solidSettingsData?.data?.user || {};\n Object.entries(values).forEach(([key, value]) => {\n if ((currentSettings[key] ?? \"\") !== (value ?? \"\")) {\n updatedSettingsArray.push({ key, value, type: \"user\" });\n }\n });\n\n if (!updatedSettingsArray.length) {\n notify(\"info\", ERROR_MESSAGES.NO_CHANGE, ERROR_MESSAGES.NO_SETTING_UPDATE);\n return;\n }\n\n const formData = new FormData();\n formData.append(\"settings\", JSON.stringify(updatedSettingsArray));\n const response = await bulkUpdateSolidSettings({ data: formData }).unwrap();\n\n if (response.statusCode === 200) {\n notify(\"success\", ERROR_MESSAGES.UPDATED, ERROR_MESSAGES.SETTING_UPDATED);\n } else {\n notify(\"error\", ERROR_MESSAGES.FAILED, ERROR_MESSAGES.SOMETHING_WRONG);\n }\n } catch {\n notify(\"error\", ERROR_MESSAGES.FAILED, ERROR_MESSAGES.SOMETHING_WRONG);\n }\n },\n });\n\n const severityClass =\n toast?.severity === \"error\"\n ? styles.toastError\n : toast?.severity === \"success\"\n ? styles.toastSuccess\n : toast?.severity === \"warn\"\n ? styles.toastWarn\n : styles.toastInfo;\n\n return (\n <form onSubmit={formik.handleSubmit} className={styles.accountForm}>\n {toast ? (\n <div className={`${styles.toast} ${severityClass}`} role=\"status\" aria-live=\"polite\">\n <div>\n <div className={styles.toastTitle}>{toast.summary}</div>\n <div className={styles.toastBody}>{toast.detail}</div>\n </div>\n <button type=\"button\" className={styles.toastClose} onClick={() => setToast(null)} aria-label=\"Close notification\">\n ×\n </button>\n </div>\n ) : null}\n\n <div className={styles.accountScroll}>\n <div className={styles.switchRow}>\n <div>\n <label className={styles.sectionTitle}>Enable Notification</label>\n <div className={styles.versionCaption}>Decide whether you want to be notified of new messages or updates.</div>\n </div>\n <label className={styles.switch} aria-label=\"Enable notification\">\n <input\n type=\"checkbox\"\n checked={Boolean(formik.values.enableNotification)}\n onChange={(event) => formik.setFieldValue(\"enableNotification\", event.target.checked)}\n />\n <span className={styles.switchTrack} />\n </label>\n </div>\n </div>\n\n <div className={styles.footerActions}>\n <SolidButton type=\"submit\" size=\"sm\" loading={formik.isSubmitting}>\n Save\n </SolidButton>\n </div>\n </form>\n );\n};\n"]}
1
+ {"version":3,"file":"SolidNotifications.js","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidNotifications.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useFormik } from \"formik\";\nimport { ERROR_MESSAGES } from \"../../../../constants/error-messages\";\nimport { useBulkUpdateSolidUserSettingsMutation, useGetSolidSettingsQuery } from \"../../../../redux/api/solidSettingsApi\";\nimport { SolidButton } from \"../../../shad-cn-ui/SolidButton\";\nimport styles from \"./SolidAccountSettings.module.css\";\nimport { getSettingsMap } from \"../../../../helpers/settingsPayload\";\n\ntype ToastState = {\n id: number;\n severity: \"success\" | \"error\" | \"info\" | \"warn\";\n summary: string;\n detail: string;\n} | null;\n\nexport const SolidNotifications = () => {\n const { data: solidSettingsData, refetch } = useGetSolidSettingsQuery(undefined);\n const settingsMap = getSettingsMap(solidSettingsData);\n const [bulkUpdateSolidSettings] = useBulkUpdateSolidUserSettingsMutation();\n const [toast, setToast] = useState<ToastState>(null);\n\n useEffect(() => {\n refetch();\n }, [refetch]);\n\n const notify = (severity: \"success\" | \"error\" | \"info\" | \"warn\", summary: string, detail: string) => {\n setToast({ id: Date.now(), severity, summary, detail });\n };\n\n const formik = useFormik({\n initialValues: {\n enableNotification: settingsMap?.enableNotification ?? settingsMap?.enabledNotification ?? true,\n },\n enableReinitialize: true,\n onSubmit: async (values) => {\n try {\n const updatedSettingsArray: Array<{ key: string; value: string | boolean; type: string }> = [];\n const currentSettings = settingsMap || {};\n Object.entries(values).forEach(([key, value]) => {\n if ((currentSettings[key] ?? \"\") !== (value ?? \"\")) {\n updatedSettingsArray.push({ key, value, type: \"user\" });\n }\n });\n\n if (!updatedSettingsArray.length) {\n notify(\"info\", ERROR_MESSAGES.NO_CHANGE, ERROR_MESSAGES.NO_SETTING_UPDATE);\n return;\n }\n\n const formData = new FormData();\n formData.append(\"settings\", JSON.stringify(updatedSettingsArray));\n const response = await bulkUpdateSolidSettings({ data: formData }).unwrap();\n\n if (response.statusCode === 200) {\n notify(\"success\", ERROR_MESSAGES.UPDATED, ERROR_MESSAGES.SETTING_UPDATED);\n } else {\n notify(\"error\", ERROR_MESSAGES.FAILED, ERROR_MESSAGES.SOMETHING_WRONG);\n }\n } catch {\n notify(\"error\", ERROR_MESSAGES.FAILED, ERROR_MESSAGES.SOMETHING_WRONG);\n }\n },\n });\n\n const severityClass =\n toast?.severity === \"error\"\n ? styles.toastError\n : toast?.severity === \"success\"\n ? styles.toastSuccess\n : toast?.severity === \"warn\"\n ? styles.toastWarn\n : styles.toastInfo;\n\n return (\n <form onSubmit={formik.handleSubmit} className={styles.accountForm}>\n {toast ? (\n <div className={`${styles.toast} ${severityClass}`} role=\"status\" aria-live=\"polite\">\n <div>\n <div className={styles.toastTitle}>{toast.summary}</div>\n <div className={styles.toastBody}>{toast.detail}</div>\n </div>\n <button type=\"button\" className={styles.toastClose} onClick={() => setToast(null)} aria-label=\"Close notification\">\n ×\n </button>\n </div>\n ) : null}\n\n <div className={styles.accountScroll}>\n <div className={styles.switchRow}>\n <div>\n <label className={styles.sectionTitle}>Enable Notification</label>\n <div className={styles.versionCaption}>Decide whether you want to be notified of new messages or updates.</div>\n </div>\n <label className={styles.switch} aria-label=\"Enable notification\">\n <input\n type=\"checkbox\"\n checked={Boolean(formik.values.enableNotification)}\n onChange={(event) => formik.setFieldValue(\"enableNotification\", event.target.checked)}\n />\n <span className={styles.switchTrack} />\n </label>\n </div>\n </div>\n\n <div className={styles.footerActions}>\n <SolidButton type=\"submit\" size=\"sm\" loading={formik.isSubmitting}>\n Save\n </SolidButton>\n </div>\n </form>\n );\n};\n"]}
@@ -4,6 +4,7 @@ import { ERROR_MESSAGES } from "../../../../constants/error-messages";
4
4
  import { useBulkUpdateSolidUserSettingsMutation, useGetSolidSettingsQuery } from "../../../../redux/api/solidSettingsApi";
5
5
  import { SolidButton } from "../../../shad-cn-ui/SolidButton";
6
6
  import styles from "./SolidAccountSettings.module.css";
7
+ import { getSettingsMap } from "../../../../helpers/settingsPayload";
7
8
 
8
9
  type ToastState = {
9
10
  id: number;
@@ -14,6 +15,7 @@ type ToastState = {
14
15
 
15
16
  export const SolidNotifications = () => {
16
17
  const { data: solidSettingsData, refetch } = useGetSolidSettingsQuery(undefined);
18
+ const settingsMap = getSettingsMap(solidSettingsData);
17
19
  const [bulkUpdateSolidSettings] = useBulkUpdateSolidUserSettingsMutation();
18
20
  const [toast, setToast] = useState<ToastState>(null);
19
21
 
@@ -27,13 +29,13 @@ export const SolidNotifications = () => {
27
29
 
28
30
  const formik = useFormik({
29
31
  initialValues: {
30
- enableNotification: solidSettingsData?.data?.enableNotification ?? true,
32
+ enableNotification: settingsMap?.enableNotification ?? settingsMap?.enabledNotification ?? true,
31
33
  },
32
34
  enableReinitialize: true,
33
35
  onSubmit: async (values) => {
34
36
  try {
35
37
  const updatedSettingsArray: Array<{ key: string; value: string | boolean; type: string }> = [];
36
- const currentSettings = solidSettingsData?.data?.user || {};
38
+ const currentSettings = settingsMap || {};
37
39
  Object.entries(values).forEach(([key, value]) => {
38
40
  if ((currentSettings[key] ?? "") !== (value ?? "")) {
39
41
  updatedSettingsArray.push({ key, value, type: "user" });
@@ -0,0 +1,3 @@
1
+ import type { SolidSettingsWidgetProps } from "../../../../../types/solid-core";
2
+ export default function solidXGenAiCodeBuilderConfigWidget({ setting, value, updateValue }: SolidSettingsWidgetProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=solidXGenAiCodeBuilderConfigWidget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solidXGenAiCodeBuilderConfigWidget.d.ts","sourceRoot":"","sources":["../../../../../../src/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAwChF,MAAM,CAAC,OAAO,UAAU,kCAAkC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAuEnH"}
@@ -0,0 +1,81 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { useMemo, useState } from "react";
14
+ import { SolidButton, SolidTabGroup } from "../../../../shad-cn-ui";
15
+ import { ModelConfigTab, ProvidersTab, ensureBuiltInProviders, } from "../../../../common/SolidSettings/LlmSettings/AiModelConfigTab";
16
+ var DEFAULT_BEHAVIOR = { streaming: false, custom: "" };
17
+ var DEFAULT_MODEL_ENTRY = { providerId: "", model: "", behavior: DEFAULT_BEHAVIOR };
18
+ function toSolidAiConfig(value) {
19
+ var _a, _b, _c, _d, _e;
20
+ var defaultConfig = {
21
+ models: {
22
+ default: DEFAULT_MODEL_ENTRY,
23
+ fast: DEFAULT_MODEL_ENTRY,
24
+ },
25
+ providers: {},
26
+ };
27
+ if (!value)
28
+ return defaultConfig;
29
+ try {
30
+ var parsed = typeof value === "string" ? JSON.parse(value) : value;
31
+ if (!parsed || typeof parsed !== "object")
32
+ return defaultConfig;
33
+ var typed = parsed;
34
+ return {
35
+ models: {
36
+ default: (_b = (_a = typed.models) === null || _a === void 0 ? void 0 : _a.default) !== null && _b !== void 0 ? _b : DEFAULT_MODEL_ENTRY,
37
+ fast: (_d = (_c = typed.models) === null || _c === void 0 ? void 0 : _c.fast) !== null && _d !== void 0 ? _d : DEFAULT_MODEL_ENTRY,
38
+ },
39
+ providers: (_e = typed.providers) !== null && _e !== void 0 ? _e : {},
40
+ };
41
+ }
42
+ catch (_f) {
43
+ return defaultConfig;
44
+ }
45
+ }
46
+ export default function solidXGenAiCodeBuilderConfigWidget(_a) {
47
+ var _b, _c, _d, _e, _f;
48
+ var setting = _a.setting, value = _a.value, updateValue = _a.updateValue;
49
+ var _g = useState("providers"), activeTab = _g[0], setActiveTab = _g[1];
50
+ var _h = useState(false), showAddProvider = _h[0], setShowAddProvider = _h[1];
51
+ var aiConfig = useMemo(function () { return toSolidAiConfig(value); }, [value]);
52
+ var providers = ensureBuiltInProviders((_b = aiConfig.providers) !== null && _b !== void 0 ? _b : {});
53
+ var onAiConfigChange = function (nextConfig) {
54
+ updateValue(setting.key, nextConfig);
55
+ };
56
+ var tabs = [
57
+ {
58
+ value: "providers",
59
+ label: "Providers",
60
+ content: (_jsx(ProvidersTab, { providers: providers, onProvidersChange: function (nextProviders) {
61
+ onAiConfigChange(__assign(__assign({}, aiConfig), { providers: nextProviders }));
62
+ }, showAddModal: showAddProvider, onAddModalClose: function () { return setShowAddProvider(false); } })),
63
+ },
64
+ {
65
+ value: "default",
66
+ label: "Intelligent Model",
67
+ content: (_jsx(ModelConfigTab, { modelEntry: (_d = (_c = aiConfig.models) === null || _c === void 0 ? void 0 : _c.default) !== null && _d !== void 0 ? _d : DEFAULT_MODEL_ENTRY, providers: providers, onModelEntryChange: function (entry) {
68
+ onAiConfigChange(__assign(__assign({}, aiConfig), { models: __assign(__assign({}, aiConfig.models), { default: entry }) }));
69
+ } })),
70
+ },
71
+ {
72
+ value: "fast",
73
+ label: "Fast Model",
74
+ content: (_jsx(ModelConfigTab, { modelEntry: (_f = (_e = aiConfig.models) === null || _e === void 0 ? void 0 : _e.fast) !== null && _f !== void 0 ? _f : DEFAULT_MODEL_ENTRY, providers: providers, onModelEntryChange: function (entry) {
75
+ onAiConfigChange(__assign(__assign({}, aiConfig), { models: __assign(__assign({}, aiConfig.models), { fast: entry }) }));
76
+ } })),
77
+ },
78
+ ];
79
+ return (_jsx("div", { children: _jsx(SolidTabGroup, { tabs: tabs, value: activeTab, onValueChange: function (tab) { return setActiveTab(tab); }, tabPosition: "left", extra: activeTab === "providers" ? (_jsx(SolidButton, { size: "sm", onClick: function () { return setShowAddProvider(true); }, children: "Add" })) : undefined }) }));
80
+ }
81
+ //# sourceMappingURL=solidXGenAiCodeBuilderConfigWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solidXGenAiCodeBuilderConfigWidget.js","sourceRoot":"","sources":["../../../../../../src/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState } from \"react\";\nimport { SolidButton, SolidTabGroup } from \"../../../../shad-cn-ui\";\nimport type { SolidSettingsWidgetProps } from \"../../../../../types/solid-core\";\nimport {\n ModelConfigTab,\n ProvidersTab,\n type ModelBehavior,\n type ModelEntry,\n type SolidAiConfig,\n ensureBuiltInProviders,\n} from \"../../../../common/SolidSettings/LlmSettings/AiModelConfigTab\";\n\nconst DEFAULT_BEHAVIOR: ModelBehavior = { streaming: false, custom: \"\" };\nconst DEFAULT_MODEL_ENTRY: ModelEntry = { providerId: \"\", model: \"\", behavior: DEFAULT_BEHAVIOR };\n\nfunction toSolidAiConfig(value: unknown): SolidAiConfig {\n const defaultConfig: SolidAiConfig = {\n models: {\n default: DEFAULT_MODEL_ENTRY,\n fast: DEFAULT_MODEL_ENTRY,\n },\n providers: {},\n };\n\n if (!value) return defaultConfig;\n\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (!parsed || typeof parsed !== \"object\") return defaultConfig;\n const typed = parsed as SolidAiConfig;\n return {\n models: {\n default: typed.models?.default ?? DEFAULT_MODEL_ENTRY,\n fast: typed.models?.fast ?? DEFAULT_MODEL_ENTRY,\n },\n providers: typed.providers ?? {},\n };\n } catch {\n return defaultConfig;\n }\n}\n\nexport default function solidXGenAiCodeBuilderConfigWidget({ setting, value, updateValue }: SolidSettingsWidgetProps) {\n const [activeTab, setActiveTab] = useState<\"providers\" | \"default\" | \"fast\">(\"providers\");\n const [showAddProvider, setShowAddProvider] = useState(false);\n\n const aiConfig = useMemo(() => toSolidAiConfig(value), [value]);\n const providers = ensureBuiltInProviders(aiConfig.providers ?? {});\n\n const onAiConfigChange = (nextConfig: SolidAiConfig) => {\n updateValue(setting.key, nextConfig);\n };\n\n const tabs = [\n {\n value: \"providers\" as const,\n label: \"Providers\",\n content: (\n <ProvidersTab\n providers={providers}\n onProvidersChange={(nextProviders: SolidAiConfig[\"providers\"]) => {\n onAiConfigChange({ ...aiConfig, providers: nextProviders });\n }}\n showAddModal={showAddProvider}\n onAddModalClose={() => setShowAddProvider(false)}\n />\n ),\n },\n {\n value: \"default\" as const,\n label: \"Intelligent Model\",\n content: (\n <ModelConfigTab\n modelEntry={aiConfig.models?.default ?? DEFAULT_MODEL_ENTRY}\n providers={providers}\n onModelEntryChange={(entry: ModelEntry) => {\n onAiConfigChange({ ...aiConfig, models: { ...aiConfig.models, default: entry } });\n }}\n />\n ),\n },\n {\n value: \"fast\" as const,\n label: \"Fast Model\",\n content: (\n <ModelConfigTab\n modelEntry={aiConfig.models?.fast ?? DEFAULT_MODEL_ENTRY}\n providers={providers}\n onModelEntryChange={(entry: ModelEntry) => {\n onAiConfigChange({ ...aiConfig, models: { ...aiConfig.models, fast: entry } });\n }}\n />\n ),\n },\n ];\n\n return (\n <div>\n <SolidTabGroup\n tabs={tabs}\n value={activeTab}\n onValueChange={(tab: string) => setActiveTab(tab as \"providers\" | \"default\" | \"fast\")}\n tabPosition=\"left\"\n extra={\n activeTab === \"providers\" ? (\n <SolidButton size=\"sm\" onClick={() => setShowAddProvider(true)}>\n Add\n </SolidButton>\n ) : undefined\n }\n />\n </div>\n );\n}\n"]}