@solidstarters/solid-core-ui 1.1.211 → 1.1.212

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 (373) hide show
  1. package/dist/components/Svg/DevDocs.tsx +9 -0
  2. package/dist/components/Svg/DocsSvg.tsx +9 -0
  3. package/dist/components/Svg/ExcelSvg.tsx +15 -0
  4. package/dist/components/Svg/FieldSvg.tsx +9 -0
  5. package/dist/components/Svg/FileSvg.tsx +18 -0
  6. package/dist/components/Svg/HomePageModuleSvg.tsx +179 -0
  7. package/dist/components/Svg/ModelSvg.tsx +9 -0
  8. package/dist/components/Svg/ModuleSvg.tsx +9 -0
  9. package/dist/components/Svg/PDFSvg.tsx +15 -0
  10. package/dist/components/Svg/RightArrowSvg.tsx +9 -0
  11. package/dist/components/Svg/SettingsSvg.tsx +9 -0
  12. package/dist/components/auth/AuthLayout.tsx +223 -0
  13. package/dist/components/auth/ForgotPasswordThankYou.tsx +33 -0
  14. package/dist/components/auth/GoogleAuthChecking.tsx +63 -0
  15. package/dist/components/auth/SolidChangeForcePassword.tsx +222 -0
  16. package/dist/components/auth/SolidForgotPassword.tsx +127 -0
  17. package/dist/components/auth/SolidInitialLoginOtp.tsx +271 -0
  18. package/dist/components/auth/SolidInitiateRegisterOtp.tsx +218 -0
  19. package/dist/components/auth/SolidLogin.d.ts.map +1 -1
  20. package/dist/components/auth/SolidLogin.js +14 -8
  21. package/dist/components/auth/SolidLogin.js.map +1 -1
  22. package/dist/components/auth/SolidLogin.tsx +428 -0
  23. package/dist/components/auth/SolidOTPVerify.tsx +133 -0
  24. package/dist/components/auth/SolidRegister.tsx +454 -0
  25. package/dist/components/auth/SolidResetPassword.tsx +194 -0
  26. package/dist/components/common/AuthBanner.tsx +41 -0
  27. package/dist/components/common/AutoCompleteField.tsx +79 -0
  28. package/dist/components/common/BackButton.tsx +72 -0
  29. package/dist/components/common/CancelButton.tsx +61 -0
  30. package/dist/components/common/CodeEditor.tsx +38 -0
  31. package/dist/components/common/CreateButton.tsx +17 -0
  32. package/dist/components/common/DownloadProgressToast.tsx +55 -0
  33. package/dist/components/common/DropzonePlaceholder.tsx +31 -0
  34. package/dist/components/common/DropzoneUpload.tsx +11 -0
  35. package/dist/components/common/FileReaderExt.tsx +20 -0
  36. package/dist/components/common/GeneralSettings.tsx +1225 -0
  37. package/dist/components/common/HeaderDynamicTitles.tsx +13 -0
  38. package/dist/components/common/MarkdownViewer.tsx +84 -0
  39. package/dist/components/common/MultipleSelectAutoCompleteField.tsx +64 -0
  40. package/dist/components/common/NotFound.tsx +22 -0
  41. package/dist/components/common/SingleSelectAutoCompleteField.tsx +73 -0
  42. package/dist/components/common/SocialMediaLogin.tsx +53 -0
  43. package/dist/components/common/SolidAdmin.tsx +6 -0
  44. package/dist/components/common/SolidBreadcrumb.tsx +129 -0
  45. package/dist/components/common/SolidExport.tsx +563 -0
  46. package/dist/components/common/SolidExportStepper.tsx +135 -0
  47. package/dist/components/common/SolidFieldTooltip.tsx +23 -0
  48. package/dist/components/common/SolidFormHeader.tsx +25 -0
  49. package/dist/components/common/SolidFormStepper.tsx +350 -0
  50. package/dist/components/common/SolidModuleHome.tsx +128 -0
  51. package/dist/components/common/SolidPopupContainer.tsx +37 -0
  52. package/dist/components/common/SolidSettings/LlmSettings/AnthropicProviderComponent.tsx +45 -0
  53. package/dist/components/common/SolidSettings/LlmSettings/OpenAiProviderComponent.tsx +45 -0
  54. package/dist/components/common/SolidSettings/SettingDropzoneActivePlaceholder.tsx +20 -0
  55. package/dist/components/common/SolidSettings/SettingsImageRemoveButton.tsx +15 -0
  56. package/dist/components/common/SolidSettings/SolidUploadedImage.tsx +16 -0
  57. package/dist/components/common/SolidThemeLink.tsx +6 -0
  58. package/dist/components/common/SolidThemeProvider.tsx +44 -0
  59. package/dist/components/common/StepperArrows/ActiveArrowStep.tsx +18 -0
  60. package/dist/components/common/StepperArrows/ActiveBeforeStepArrow.tsx +18 -0
  61. package/dist/components/common/StepperArrows/InactiveStepArrow.tsx +19 -0
  62. package/dist/components/common/error.tsx +30 -0
  63. package/dist/components/common/useHandleFormCustomButtonClick.ts +40 -0
  64. package/dist/components/common/useHandleListCustomButtonClick.ts +42 -0
  65. package/dist/components/core/chatter/SolidChatter.tsx +248 -0
  66. package/dist/components/core/chatter/SolidChatterAuditMessage.tsx +35 -0
  67. package/dist/components/core/chatter/SolidChatterCustomMessage.tsx +46 -0
  68. package/dist/components/core/chatter/SolidChatterDateDivider.tsx +16 -0
  69. package/dist/components/core/chatter/SolidChatterHeader.tsx +218 -0
  70. package/dist/components/core/chatter/SolidChatterMessageBox.tsx +163 -0
  71. package/dist/components/core/chatter/SolidMessageComposer.tsx +146 -0
  72. package/dist/components/core/common/AvatarWidget.tsx +55 -0
  73. package/dist/components/core/common/DateFieldViewComponent.tsx +36 -0
  74. package/dist/components/core/common/FilterComponent.tsx +458 -0
  75. package/dist/components/core/common/LoadDynamicJsxComponent.tsx +70 -0
  76. package/dist/components/core/common/PDFViewer.tsx +117 -0
  77. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx +89 -0
  78. package/dist/components/core/common/SolidAccountSettings/SolidChangePassword.tsx +188 -0
  79. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.tsx +139 -0
  80. package/dist/components/core/common/SolidAccountSettings/SolidPersonalInfo.tsx +311 -0
  81. package/dist/components/core/common/SolidCreateButton.tsx +48 -0
  82. package/dist/components/core/common/SolidGenericImport/DocumentSvg.tsx +15 -0
  83. package/dist/components/core/common/SolidGenericImport/SolidGenericImport.tsx +64 -0
  84. package/dist/components/core/common/SolidGenericImport/SolidImportDropzone.tsx +125 -0
  85. package/dist/components/core/common/SolidGenericImport/SolidImportInstructions.tsx +122 -0
  86. package/dist/components/core/common/SolidGenericImport/SolidImportStepper.tsx +217 -0
  87. package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.tsx +205 -0
  88. package/dist/components/core/common/SolidGenericImport/SolidImportTransactionStatus.tsx +158 -0
  89. package/dist/components/core/common/SolidGenericImport/SolidImportWrapper.tsx +29 -0
  90. package/dist/components/core/common/SolidGlobalSearchElement.tsx +1470 -0
  91. package/dist/components/core/common/SolidLayoutViews.tsx +87 -0
  92. package/dist/components/core/common/SolidListViewOptions.tsx +31 -0
  93. package/dist/components/core/common/SolidLoaders/SolidCircularLoader.tsx +7 -0
  94. package/dist/components/core/common/SolidPasswordHelperText.tsx +34 -0
  95. package/dist/components/core/common/SolidSaveCustomFilterForm.tsx +75 -0
  96. package/dist/components/core/common/SolidSearchBox.tsx +17 -0
  97. package/dist/components/core/common/SolidViewLayoutManager.ts +421 -0
  98. package/dist/components/core/common/SolidXAiIframe.tsx +77 -0
  99. package/dist/components/core/dashboard/SolidDashboard.tsx +332 -0
  100. package/dist/components/core/dashboard/SolidDashboardBody.tsx +117 -0
  101. package/dist/components/core/dashboard/SolidDashboardFilterRequired.tsx +28 -0
  102. package/dist/components/core/dashboard/SolidDashboardHeader.tsx +10 -0
  103. package/dist/components/core/dashboard/SolidDashboardLoading.tsx +55 -0
  104. package/dist/components/core/dashboard/SolidDashboardNotAvailable.tsx +32 -0
  105. package/dist/components/core/dashboard/SolidDashboardRenderError.tsx +29 -0
  106. package/dist/components/core/dashboard/SolidDashboardVariable.tsx +256 -0
  107. package/dist/components/core/dashboard/SolidQuestionRenderer.tsx +78 -0
  108. package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.tsx +18 -0
  109. package/dist/components/core/dashboard/chart-renderers/PrimeReactDatatableRenderer.tsx +54 -0
  110. package/dist/components/core/dashboard/chart-renderers/init-chartjs.ts +25 -0
  111. package/dist/components/core/dashboard/dashboard-utils.ts +39 -0
  112. package/dist/components/core/extension/solid-core/CustomIcon/StatusIcon.tsx +17 -0
  113. package/dist/components/core/extension/solid-core/dashboardQuestion/ChartFormPreviewWidget.tsx +36 -0
  114. package/dist/components/core/extension/solid-core/emailTemplate/emailFormTypeChangeHandler.ts +18 -0
  115. package/dist/components/core/extension/solid-core/emailTemplate/emailFormTypeLoad.ts +18 -0
  116. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +114 -0
  117. package/dist/components/core/extension/solid-core/modelMetadata/list/GenerateModelCodeRowAction.tsx +213 -0
  118. package/dist/components/core/extension/solid-core/moduleMetadata/list/DeleteModuleRowAction.tsx +138 -0
  119. package/dist/components/core/extension/solid-core/moduleMetadata/list/GenerateModuleCodeRowAction.tsx +209 -0
  120. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +131 -0
  121. package/dist/components/core/field/FieldListViewData.tsx +313 -0
  122. package/dist/components/core/filter/SolidBooleanFilterElement.tsx +30 -0
  123. package/dist/components/core/filter/SolidFilterFields.tsx +131 -0
  124. package/dist/components/core/filter/SolidManyToManyFilterElement.tsx +64 -0
  125. package/dist/components/core/filter/SolidManyToOneFilterElement.tsx +61 -0
  126. package/dist/components/core/filter/SolidSelectionDynamicFilterElement.tsx +50 -0
  127. package/dist/components/core/filter/SolidSelectionStaticFilterElement.tsx +32 -0
  128. package/dist/components/core/filter/SolidVarInputsFilterElement.tsx +209 -0
  129. package/dist/components/core/filter/fields/SolidBigintField.tsx +9 -0
  130. package/dist/components/core/filter/fields/SolidBooleanField.tsx +68 -0
  131. package/dist/components/core/filter/fields/SolidComputedField.tsx +23 -0
  132. package/dist/components/core/filter/fields/SolidDateField.tsx +63 -0
  133. package/dist/components/core/filter/fields/SolidDatetimeField.tsx +54 -0
  134. package/dist/components/core/filter/fields/SolidDecimalField.tsx +9 -0
  135. package/dist/components/core/filter/fields/SolidExternalIdField.tsx +52 -0
  136. package/dist/components/core/filter/fields/SolidFloatField.tsx +9 -0
  137. package/dist/components/core/filter/fields/SolidIdField.tsx +46 -0
  138. package/dist/components/core/filter/fields/SolidIntField.tsx +61 -0
  139. package/dist/components/core/filter/fields/SolidLongTextField.tsx +9 -0
  140. package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +60 -0
  141. package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +62 -0
  142. package/dist/components/core/filter/fields/SolidRelationField.tsx +17 -0
  143. package/dist/components/core/filter/fields/SolidRichTextField.tsx +9 -0
  144. package/dist/components/core/filter/fields/SolidSelectionDynamicField.tsx +52 -0
  145. package/dist/components/core/filter/fields/SolidSelectionStaticField.tsx +54 -0
  146. package/dist/components/core/filter/fields/SolidShortTextField.tsx +60 -0
  147. package/dist/components/core/filter/fields/SolidTimeField.tsx +48 -0
  148. package/dist/components/core/filter/fields/SolidUuidField.tsx +51 -0
  149. package/dist/components/core/filter/fields/relations/SolidRelationManyToManyField.tsx +62 -0
  150. package/dist/components/core/filter/fields/relations/SolidRelationManyToOneField.tsx +84 -0
  151. package/dist/components/core/form/SolidFormActionHeader.tsx +497 -0
  152. package/dist/components/core/form/SolidFormFieldRender.tsx +53 -0
  153. package/dist/components/core/form/SolidFormFieldRenderExtension.tsx +26 -0
  154. package/dist/components/core/form/SolidFormFooter.tsx +162 -0
  155. package/dist/components/core/form/SolidFormLayouts.tsx +104 -0
  156. package/dist/components/core/form/SolidFormUserViewLayout.tsx +84 -0
  157. package/dist/components/core/form/SolidFormView.tsx +1856 -0
  158. package/dist/components/core/form/SolidFormViewContextMenuHeaderButton.tsx +52 -0
  159. package/dist/components/core/form/SolidFormViewNormalHeaderButton.tsx +52 -0
  160. package/dist/components/core/form/SolidFormViewShimmerLoading.tsx +109 -0
  161. package/dist/components/core/form/fields/ISolidField.tsx +71 -0
  162. package/dist/components/core/form/fields/SolidBooleanField.tsx +434 -0
  163. package/dist/components/core/form/fields/SolidDateField.tsx +247 -0
  164. package/dist/components/core/form/fields/SolidDateTimeField.tsx +229 -0
  165. package/dist/components/core/form/fields/SolidDecimalField.tsx +171 -0
  166. package/dist/components/core/form/fields/SolidEmailField.tsx +176 -0
  167. package/dist/components/core/form/fields/SolidIntegerField.tsx +282 -0
  168. package/dist/components/core/form/fields/SolidJsonField.tsx +185 -0
  169. package/dist/components/core/form/fields/SolidLongTextField.tsx +618 -0
  170. package/dist/components/core/form/fields/SolidMediaMultipleField.tsx +663 -0
  171. package/dist/components/core/form/fields/SolidMediaSingleField.tsx +547 -0
  172. package/dist/components/core/form/fields/SolidPasswordField.tsx +390 -0
  173. package/dist/components/core/form/fields/SolidRelationField.tsx +56 -0
  174. package/dist/components/core/form/fields/SolidRichTextField.tsx +188 -0
  175. package/dist/components/core/form/fields/SolidSelectionDynamicField.tsx +340 -0
  176. package/dist/components/core/form/fields/SolidSelectionStaticField.tsx +462 -0
  177. package/dist/components/core/form/fields/SolidShortTextField.tsx +399 -0
  178. package/dist/components/core/form/fields/SolidTimeField.tsx +245 -0
  179. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +453 -0
  180. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +1036 -0
  181. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +627 -0
  182. package/dist/components/core/form/fields/relations/widgets/helpers/InlineRelationEntityDialog.tsx +38 -0
  183. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts +64 -0
  184. package/dist/components/core/form/fields/widgets/SolidAiInteractionMessageFieldFormWidget.tsx +135 -0
  185. package/dist/components/core/form/fields/widgets/SolidAiInteractionMetadataFieldFormWidget.tsx +144 -0
  186. package/dist/components/core/form/fields/widgets/SolidIconEditWidget.tsx +265 -0
  187. package/dist/components/core/form/fields/widgets/SolidIconViewWidget.tsx +32 -0
  188. package/dist/components/core/form/fields/widgets/SolidRelationFieldAvatarFormWidget.tsx +50 -0
  189. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx +222 -0
  190. package/dist/components/core/form/fields/widgets/SolidShortTextFieldAvatarWidget.tsx +70 -0
  191. package/dist/components/core/form/widgets/CustomHtml.tsx +20 -0
  192. package/dist/components/core/kanban/KanbanBoard.tsx +150 -0
  193. package/dist/components/core/kanban/KanbanCard.tsx +279 -0
  194. package/dist/components/core/kanban/KanbanColumn.tsx +139 -0
  195. package/dist/components/core/kanban/KanbanUserViewLayout.tsx +84 -0
  196. package/dist/components/core/kanban/SolidKanbanView.tsx +894 -0
  197. package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +154 -0
  198. package/dist/components/core/kanban/SolidKanbanViewFields.tsx +164 -0
  199. package/dist/components/core/kanban/SolidManyToOneFilterElement.tsx +59 -0
  200. package/dist/components/core/kanban/SolidSelectionDynamicFilterElement.tsx +50 -0
  201. package/dist/components/core/kanban/SolidSelectionStaticFilterElement.tsx +32 -0
  202. package/dist/components/core/kanban/SolidVarInputsFilterElement.tsx +184 -0
  203. package/dist/components/core/kanban/kanban-fields/SolidBigintKanbanField.tsx +9 -0
  204. package/dist/components/core/kanban/kanban-fields/SolidBooleanKanbanField.tsx +16 -0
  205. package/dist/components/core/kanban/kanban-fields/SolidComputedKanbanField.tsx +23 -0
  206. package/dist/components/core/kanban/kanban-fields/SolidDateKanbanField.tsx +14 -0
  207. package/dist/components/core/kanban/kanban-fields/SolidDatetimeKanbanField.tsx +13 -0
  208. package/dist/components/core/kanban/kanban-fields/SolidDecimalKanbanField.tsx +9 -0
  209. package/dist/components/core/kanban/kanban-fields/SolidExternalIdKanbanField.tsx +12 -0
  210. package/dist/components/core/kanban/kanban-fields/SolidFloatKanbanField.tsx +9 -0
  211. package/dist/components/core/kanban/kanban-fields/SolidIdKanbanField.tsx +14 -0
  212. package/dist/components/core/kanban/kanban-fields/SolidIntKanbanField.tsx +20 -0
  213. package/dist/components/core/kanban/kanban-fields/SolidLongTextKanbanField.tsx +9 -0
  214. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.tsx +140 -0
  215. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +164 -0
  216. package/dist/components/core/kanban/kanban-fields/SolidRelationKanbanField.tsx +13 -0
  217. package/dist/components/core/kanban/kanban-fields/SolidRichTextKanbanField.tsx +9 -0
  218. package/dist/components/core/kanban/kanban-fields/SolidSelectionDynamicKanbanField.tsx +14 -0
  219. package/dist/components/core/kanban/kanban-fields/SolidSelectionStaticKanbanField.tsx +14 -0
  220. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +121 -0
  221. package/dist/components/core/kanban/kanban-fields/SolidTimeKanbanField.tsx +12 -0
  222. package/dist/components/core/kanban/kanban-fields/SolidUuidKanbanField.tsx +13 -0
  223. package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.tsx +16 -0
  224. package/dist/components/core/list/ListViewRowActionPopup.tsx +41 -0
  225. package/dist/components/core/list/SolidColumnSelector/SolidListColumnSelector.tsx +242 -0
  226. package/dist/components/core/list/SolidEmptyListViewPlaceholder.tsx +111 -0
  227. package/dist/components/core/list/SolidListView.tsx +2007 -0
  228. package/dist/components/core/list/SolidListViewColumn.tsx +165 -0
  229. package/dist/components/core/list/SolidListViewConfigure.tsx +339 -0
  230. package/dist/components/core/list/SolidListViewHeaderButton.tsx +31 -0
  231. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +30 -0
  232. package/dist/components/core/list/SolidListViewRowButtonContextMenu.tsx +41 -0
  233. package/dist/components/core/list/SolidListViewShimmerLoading.tsx +78 -0
  234. package/dist/components/core/list/SolidListingHeader.tsx +42 -0
  235. package/dist/components/core/list/SolidManyToOneFilterElement.tsx +60 -0
  236. package/dist/components/core/list/SolidSelectionDynamicFilterElement.tsx +50 -0
  237. package/dist/components/core/list/SolidSelectionStaticFilterElement.tsx +32 -0
  238. package/dist/components/core/list/SolidTableRowCell.tsx +35 -0
  239. package/dist/components/core/list/SolidVarInputsFilterElement.tsx +184 -0
  240. package/dist/components/core/list/columns/SolidBigintColumn.tsx +9 -0
  241. package/dist/components/core/list/columns/SolidBooleanColumn.tsx +90 -0
  242. package/dist/components/core/list/columns/SolidComputedColumn.tsx +27 -0
  243. package/dist/components/core/list/columns/SolidDateColumn.tsx +90 -0
  244. package/dist/components/core/list/columns/SolidDatetimeColumn.tsx +79 -0
  245. package/dist/components/core/list/columns/SolidDecimalColumn.tsx +9 -0
  246. package/dist/components/core/list/columns/SolidExternalIdColumn.tsx +80 -0
  247. package/dist/components/core/list/columns/SolidFloatColumn.tsx +9 -0
  248. package/dist/components/core/list/columns/SolidIdColumn.tsx +79 -0
  249. package/dist/components/core/list/columns/SolidIntColumn.tsx +87 -0
  250. package/dist/components/core/list/columns/SolidLongTextColumn.tsx +9 -0
  251. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +301 -0
  252. package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +170 -0
  253. package/dist/components/core/list/columns/SolidRelationColumn.tsx +21 -0
  254. package/dist/components/core/list/columns/SolidRichTextColumn.tsx +9 -0
  255. package/dist/components/core/list/columns/SolidSelectionDynamicColumn.tsx +80 -0
  256. package/dist/components/core/list/columns/SolidSelectionStaticColumn.tsx +81 -0
  257. package/dist/components/core/list/columns/SolidShortTextColumn.tsx +160 -0
  258. package/dist/components/core/list/columns/SolidTimeColumn.tsx +78 -0
  259. package/dist/components/core/list/columns/SolidUuidColumn.tsx +79 -0
  260. package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.tsx +106 -0
  261. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +117 -0
  262. package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.tsx +110 -0
  263. package/dist/components/core/list/widgets/SolidManyToManyRelationAvatarListWidget.tsx +30 -0
  264. package/dist/components/core/list/widgets/SolidManyToOneRelationAvatarListWidget.tsx +30 -0
  265. package/dist/components/core/list/widgets/SolidShortTextAvatarWidget.tsx +70 -0
  266. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.tsx +21 -0
  267. package/dist/components/core/locales/SolidChatterLocaleTabView.tsx +91 -0
  268. package/dist/components/core/locales/SolidLocale.tsx +127 -0
  269. package/dist/components/core/model/CreateModel.tsx +495 -0
  270. package/dist/components/core/model/FieldMetaData.tsx +263 -0
  271. package/dist/components/core/model/FieldMetaDataForm.tsx +3509 -0
  272. package/dist/components/core/model/FieldSelector.tsx +62 -0
  273. package/dist/components/core/model/ModelListViewData.tsx +384 -0
  274. package/dist/components/core/model/ModelMetaData.tsx +921 -0
  275. package/dist/components/core/module/CreateModule.tsx +617 -0
  276. package/dist/components/core/module/ModuleListViewData.tsx +431 -0
  277. package/dist/components/core/solid-ai/SolidAiMainWrapper.tsx +8 -0
  278. package/dist/components/core/solid-ai/SolidXAIIcon.tsx +37 -0
  279. package/dist/components/core/users/CreateUser.tsx +467 -0
  280. package/dist/components/core/users/CreateUserRole.tsx +212 -0
  281. package/dist/components/core/users/UserListView.tsx +376 -0
  282. package/dist/components/layout/AdminLayout.tsx +57 -0
  283. package/dist/components/layout/AdminSidebar.tsx +65 -0
  284. package/dist/components/layout/AppConfig.tsx +104 -0
  285. package/dist/components/layout/AppSidebar.tsx +232 -0
  286. package/dist/components/layout/ButtonLoader.tsx +7 -0
  287. package/dist/components/layout/CustomPagination.tsx +55 -0
  288. package/dist/components/layout/DashboardHeader.tsx +89 -0
  289. package/dist/components/layout/FilterMenu.tsx +122 -0
  290. package/dist/components/layout/Footer.tsx +13 -0
  291. package/dist/components/layout/GlobalSearch.tsx +37 -0
  292. package/dist/components/layout/Header.tsx +8 -0
  293. package/dist/components/layout/Layout.tsx +205 -0
  294. package/dist/components/layout/ListingHeader.tsx +204 -0
  295. package/dist/components/layout/Loader.tsx +16 -0
  296. package/dist/components/layout/UserSidebar.tsx +53 -0
  297. package/dist/components/layout/context/layoutcontext.tsx +52 -0
  298. package/dist/components/layout/navbar-one.tsx +258 -0
  299. package/dist/components/layout/navbar-two-menu.tsx +72 -0
  300. package/dist/components/layout/navbar-two.tsx +37 -0
  301. package/dist/components/layout/user-profile-menu.tsx +213 -0
  302. package/dist/components/layout/user-profile.tsx +7 -0
  303. package/dist/components/modelsComponents/filterIcon.tsx +9 -0
  304. package/dist/constants/error-messages.ts +238 -0
  305. package/dist/declarations.d.ts +22 -0
  306. package/dist/helpers/AppTitle.tsx +12 -0
  307. package/dist/helpers/ToastContainer.tsx +94 -0
  308. package/dist/helpers/autoCompleteVirtualScroll.ts +41 -0
  309. package/dist/helpers/countries.tsx +260 -0
  310. package/dist/helpers/downloadFileWithProgress.ts +91 -0
  311. package/dist/helpers/downloadMediaFile.tsx +21 -0
  312. package/dist/helpers/getAcceptedFileTypes.tsx +22 -0
  313. package/dist/helpers/getRandomColors.tsx +68 -0
  314. package/dist/helpers/helpers.ts +61 -0
  315. package/dist/helpers/hydrateRelationRules.ts +120 -0
  316. package/dist/helpers/permissions.ts +7 -0
  317. package/dist/helpers/registry.ts +337 -0
  318. package/dist/helpers/resendOtpHelper.tsx +5 -0
  319. package/dist/helpers/revalidate.ts +7 -0
  320. package/dist/helpers/rolesHelper.ts +17 -0
  321. package/dist/helpers/solidIcons.tsx +1831 -0
  322. package/dist/helpers/updatePasswordField.ts +41 -0
  323. package/dist/index.ts +421 -0
  324. package/dist/nextAuth/authProviders.d.ts.map +1 -1
  325. package/dist/nextAuth/authProviders.js +6 -5
  326. package/dist/nextAuth/authProviders.js.map +1 -1
  327. package/dist/nextAuth/authProviders.tsx +232 -0
  328. package/dist/nextAuth/handleLogout.tsx +39 -0
  329. package/dist/nextAuth/refreshAccessToken.tsx +28 -0
  330. package/dist/redux/api/aiInteractionApi.ts +59 -0
  331. package/dist/redux/api/authApi.ts +131 -0
  332. package/dist/redux/api/dashboardApi.ts +56 -0
  333. package/dist/redux/api/dashboardQuestionApi.ts +17 -0
  334. package/dist/redux/api/exportTemplateApi.tsx +59 -0
  335. package/dist/redux/api/fetchBaseQuery.tsx +118 -0
  336. package/dist/redux/api/fieldApi.ts +86 -0
  337. package/dist/redux/api/importTransactionApi.tsx +69 -0
  338. package/dist/redux/api/mediaApi.ts +55 -0
  339. package/dist/redux/api/mediaStorageProviderApi.ts +55 -0
  340. package/dist/redux/api/modelApi.ts +80 -0
  341. package/dist/redux/api/moduleApi.ts +72 -0
  342. package/dist/redux/api/permissionApi.ts +32 -0
  343. package/dist/redux/api/pincodeApi.tsx +56 -0
  344. package/dist/redux/api/roleApi.ts +58 -0
  345. package/dist/redux/api/solidActionApi.ts +66 -0
  346. package/dist/redux/api/solidChatterMessageApi.ts +25 -0
  347. package/dist/redux/api/solidEntityApi.tsx +164 -0
  348. package/dist/redux/api/solidMenuApi.ts +71 -0
  349. package/dist/redux/api/solidServiceApi.ts +31 -0
  350. package/dist/redux/api/solidSettingsApi.tsx +83 -0
  351. package/dist/redux/api/solidViewApi.ts +73 -0
  352. package/dist/redux/api/stateApi.tsx +56 -0
  353. package/dist/redux/api/testApi.ts +21 -0
  354. package/dist/redux/api/userApi.ts +135 -0
  355. package/dist/redux/features/authSlice.ts +19 -0
  356. package/dist/redux/features/dataViewSlice.ts +26 -0
  357. package/dist/redux/features/navbarSlice.ts +21 -0
  358. package/dist/redux/features/popupSlice.ts +37 -0
  359. package/dist/redux/features/settingsSlice.ts +60 -0
  360. package/dist/redux/features/themeSlice.ts +17 -0
  361. package/dist/redux/features/userSlice.ts +28 -0
  362. package/dist/redux/hooks/useSolidPopup.ts +20 -0
  363. package/dist/redux/store/defaultStoreConfig.ts +62 -0
  364. package/dist/styles.ts +4 -0
  365. package/dist/types/handlebars.d.ts +4 -0
  366. package/dist/types/index.d.ts +76 -0
  367. package/dist/types/layout.d.ts +94 -0
  368. package/dist/types/next-auth.d.ts +0 -0
  369. package/dist/types/next.d.ts +46 -0
  370. package/dist/types/solid-core.d.ts +320 -0
  371. package/package.json +1 -1
  372. package/src/components/auth/SolidLogin.tsx +26 -13
  373. package/src/nextAuth/authProviders.tsx +9 -5
@@ -0,0 +1,1225 @@
1
+ "use client"
2
+ // import { useBulkUpdateSolidSettingsMutation, useCreateSolidSettingsMutation, useLazyGetSolidSettingsQuery, useUpdateSolidSettingsMutation } from '../../redux/api/solidSettingsApi';
3
+ import { useFormik } from 'formik';
4
+ import { Button } from 'primereact/button';
5
+ import { InputText } from 'primereact/inputtext';
6
+ import { Toast } from 'primereact/toast';
7
+ import { useCallback, useEffect, useRef, useState } from 'react'
8
+ import { CancelButton } from './CancelButton';
9
+ import { InputSwitch } from 'primereact/inputswitch';
10
+ import { RadioButton } from 'primereact/radiobutton';
11
+ import { usePathname } from 'next/navigation';
12
+ import { InputTextarea } from 'primereact/inputtextarea';
13
+ import SolidLogo from '../../resources/images/SolidXLogo.svg'
14
+ import AuthScreenRightBackgroundImage from '../../resources/images/auth/solid-left-layout-bg.png';
15
+ import AuthScreenLeftBackgroundImage from '../../resources/images/auth/solid-right-layout-bg.png';
16
+ import AuthScreenCenterBackgroundImage from '../../resources/images/auth/solid-login-light.png';
17
+ import { useDropzone } from 'react-dropzone';
18
+ import { Divider } from 'primereact/divider';
19
+ import { SettingDropzoneActivePlaceholder } from './SolidSettings/SettingDropzoneActivePlaceholder';
20
+ import { SolidUploadedImage } from './SolidSettings/SolidUploadedImage';
21
+ import { SettingsImageRemoveButton } from './SolidSettings/SettingsImageRemoveButton';
22
+ import { Dropdown } from 'primereact/dropdown';
23
+ import { OpenAiProviderComponent } from './SolidSettings/LlmSettings/OpenAiProviderComponent';
24
+ import { AnthropicProviderComponent } from './SolidSettings/LlmSettings/AnthropicProviderComponent';
25
+ import { useDispatch, useSelector } from 'react-redux';
26
+ import { handleError } from '../../helpers/ToastContainer';
27
+ import { ERROR_MESSAGES } from '../../constants/error-messages';
28
+ import { useBulkUpdateSolidSettingsMutation, useLazyGetSolidSettingsQuery } from '../../redux/api/solidSettingsApi';
29
+
30
+
31
+ export const GeneralSettings = () => {
32
+ const [appLogoPreview, setAppLogoPreview] = useState<string | null>(null);
33
+ const [companyLogoPreview, setCompanyLogoPreview] = useState<string | null>(null);
34
+ const [authScreenRightBackgroundImagePreview, setAuthScreenRightBackgroundImagePreview] = useState<string | null>(null);
35
+ const [authScreenLeftBackgroundImagePreview, setAuthScreenLeftBackgroundImagePreview] = useState<string | null>(null);
36
+ const [authScreenCenterBackgroundImagePreview, setAuthScreenCenterBackgroundImagePreview] = useState<string | null>(null);
37
+ const dispatch = useDispatch()
38
+
39
+ const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();
40
+
41
+ useEffect(() => {
42
+ trigger("") // Fetch settings on mount
43
+ }, [trigger])
44
+ const pathname = usePathname();
45
+ const [bulkUpdateSolidSettings] = useBulkUpdateSolidSettingsMutation();
46
+ const toast = useRef<Toast>(null);
47
+
48
+ const showToast = (severity: "success" | "error", summary: string, detail: string) => {
49
+ toast.current?.show({
50
+ severity,
51
+ summary,
52
+ detail,
53
+ ...(severity === "error"
54
+ ? { sticky: true } // stays until user closes
55
+ : { life: 3000 }),
56
+ });
57
+ };
58
+
59
+ const initialValues = {
60
+ appLogo: solidSettingsData?.data?.appLogo ?? null,
61
+ companylogo: solidSettingsData?.data?.companylogo ?? null,
62
+ passwordlessRegistrationValidateWhat: solidSettingsData?.data?.passwordlessRegistrationValidateWhat ?? "email",
63
+ allowPublicRegistration: solidSettingsData?.data?.allowPublicRegistration ?? false,
64
+ passwordBasedAuth: solidSettingsData?.data?.passwordBasedAuth ?? false,
65
+ passwordLessAuth: solidSettingsData?.data?.passwordLessAuth ?? false,
66
+ activateUserOnRegistration: solidSettingsData?.data?.activateUserOnRegistration ?? false,
67
+ iamGoogleOAuthEnabled: solidSettingsData?.data?.iamGoogleOAuthEnabled ?? false,
68
+ shouldQueueEmails: solidSettingsData?.data?.shouldQueueEmails ?? false,
69
+ shouldQueueSms: solidSettingsData?.data?.shouldQueueSms ?? false,
70
+ authPagesTheme: solidSettingsData?.data?.authPagesTheme ?? "light",
71
+ authPagesLayout: solidSettingsData?.data?.authPagesLayout ?? "center",
72
+ defaultRole: solidSettingsData?.data?.defaultRole ?? "Admin",
73
+ appLogoPosition: solidSettingsData?.data?.appLogoPosition ?? "in_form_view",
74
+ showAuthContent: solidSettingsData?.data?.showAuthContent ?? false,
75
+ appTitle: solidSettingsData?.data?.appTitle ?? "SolidX",
76
+ appSubtitle: solidSettingsData?.data?.appSubtitle ?? "Welcome To",
77
+ appDescription: solidSettingsData?.data?.appDescription ?? "appDescription",
78
+ showLegalLinks: solidSettingsData?.data?.showLegalLinks ?? false,
79
+ appTnc: solidSettingsData?.data?.appTnc ?? null,
80
+ appPrivacyPolicy: solidSettingsData?.data?.appPrivacyPolicy ?? null,
81
+ enableDarkMode: solidSettingsData?.data?.enableDarkMode ?? false,
82
+ copyright: solidSettingsData?.data?.copyright ?? null,
83
+ forceChangePasswordOnFirstLogin: solidSettingsData?.data?.forceChangePasswordOnFirstLogin ?? false,
84
+ contactSupportEmail: solidSettingsData?.data?.contactSupportEmail ?? null,
85
+ contactSupportDisplayName: solidSettingsData?.data?.contactSupportDisplayName ?? null,
86
+ contactSupportIcon: solidSettingsData?.data?.contactSupportIcon ?? null,
87
+ authScreenRightBackgroundImage: solidSettingsData?.data?.authScreenRightBackgroundImage ?? null,
88
+ authScreenLeftBackgroundImage: solidSettingsData?.data?.authScreenLeftBackgroundImage ?? null,
89
+ authScreenCenterBackgroundImage: solidSettingsData?.data?.authScreenCenterBackgroundImage ?? null,
90
+ solidXGenAiCodeBuilderConfig: solidSettingsData?.data?.solidXGenAiCodeBuilderConfig ?? {
91
+ defaultProvider: "",
92
+ availableProviders: []
93
+ }
94
+ // llmProvider: solidSettingsData?.data?.llmProvider ?? null,
95
+ // llModelName: solidSettingsData?.data?.llModelName ?? null,
96
+ // llmProviderApiKey: solidSettingsData?.data?.llmProviderApiKey ?? null,
97
+ // llmProviderBaseURL: solidSettingsData?.data?.llmProviderBaseURL ?? null,
98
+ // llmModelIdentifier: solidSettingsData?.data?.llmModelIdentifier ?? null
99
+
100
+
101
+ };
102
+ const formik = useFormik({
103
+ initialValues: initialValues,
104
+ enableReinitialize: true,
105
+ onSubmit: async (values) => {
106
+ try {
107
+
108
+ const profiles = values.solidXGenAiCodeBuilderConfig.availableProviders;
109
+ console.log("profiles", profiles);
110
+ // ✅ Only set defaultProvider if it's empty AND there is at least one profile
111
+ if (!values.solidXGenAiCodeBuilderConfig.defaultProvider && profiles && profiles.length > 0) {
112
+ values.solidXGenAiCodeBuilderConfig.defaultProvider = profiles[0].provider;
113
+ }
114
+
115
+ const updatedSettingsArray: Array<{ key: string; value: string; type: string }> = [];
116
+ const currentSettings = solidSettingsData || {};
117
+
118
+ const formData = new FormData();
119
+
120
+ // Compare changed fields
121
+ Object.entries(values).forEach(([key, value]) => {
122
+ const currentValue = currentSettings[key];
123
+
124
+ const normalizedCurrent = currentValue ?? "";
125
+ const normalizedValue = value ?? "";
126
+
127
+ if (normalizedCurrent !== normalizedValue) {
128
+ // If file, append to formData and use placeholder value in JSON
129
+ if (value instanceof File) {
130
+ formData.append(key, value);
131
+ updatedSettingsArray.push({
132
+ key,
133
+ value: "",
134
+ type: "system",
135
+ });
136
+ } else {
137
+ updatedSettingsArray.push({
138
+ key,
139
+ value: typeof value === "string" ? value : JSON.stringify(value),
140
+ type: "system",
141
+ });
142
+ }
143
+ }
144
+ });
145
+
146
+ if (updatedSettingsArray.length === 0) {
147
+ showToast("success", "No Changes", "No settings were updated");
148
+ return;
149
+ }
150
+
151
+ // Append settings array to formData
152
+ formData.append("settings", JSON.stringify(updatedSettingsArray));
153
+
154
+ // Call API
155
+ const response = await bulkUpdateSolidSettings({ data: formData }).unwrap();
156
+
157
+ if (response.statusCode === 200) {
158
+ showToast("success", "Updated", "Settings updated");
159
+ trigger("")
160
+ }
161
+
162
+ } catch (error) {
163
+ console.log("Error updating settings:", error);
164
+ showToast("error", ERROR_MESSAGES.FAILED, ERROR_MESSAGES.SOMETHING_WRONG);
165
+ }
166
+ },
167
+ });
168
+
169
+
170
+ const showError = async () => {
171
+ const errors = await formik.validateForm();
172
+ const errorMessages = Object.values(errors);
173
+
174
+ if (errorMessages.length > 0 && toast.current) {
175
+ handleError(errorMessages)
176
+ }
177
+ }
178
+ useEffect(() => {
179
+
180
+ }, [pathname])
181
+
182
+ const positionMap: Record<'left' | 'center' | 'right', string> = {
183
+ left: 'The form will appear on the left side of the screen, while the banner will be positioned on the right side.',
184
+ center: 'The form will be centered in the middle of the screen for balanced alignment.',
185
+ right: 'The form will appear on the right side of the screen, and the banner will be positioned on the left side.'
186
+ };
187
+
188
+ const onAppLogoDrop = useCallback(
189
+ (acceptedFiles: File[]) => {
190
+ const file = acceptedFiles[0];
191
+ if (file) {
192
+ if (file.size > 2 * 1024 * 1024) {
193
+ toast.current?.show({
194
+ severity: "error",
195
+ summary: "File too large",
196
+ detail: "Maximum file size is 2MB",
197
+ sticky: true
198
+ });
199
+ return;
200
+ }
201
+ formik.setFieldValue("appLogo", file);
202
+ setAppLogoPreview(URL.createObjectURL(file));
203
+ }
204
+ },
205
+ [formik]
206
+ );
207
+
208
+ const onCompanyLogoDrop = useCallback((acceptedFiles: File[]) => {
209
+ const file = acceptedFiles[0];
210
+ if (file) {
211
+ if (file.size > 2 * 1024 * 1024) {
212
+ toast.current?.show({
213
+ severity: "error",
214
+ summary: "File too large",
215
+ detail: "Maximum file size is 2MB",
216
+ sticky: true
217
+ });
218
+ return;
219
+ }
220
+ formik.setFieldValue("companylogo", file);
221
+ setCompanyLogoPreview(URL.createObjectURL(file));
222
+ }
223
+ }, [formik]);
224
+
225
+ const {
226
+ getRootProps: getAppLogoRootProps,
227
+ getInputProps: getAppLogoInputProps,
228
+ isDragActive: isAppLogoDragActive
229
+ } = useDropzone({
230
+ accept: {
231
+ 'image/png': ['.png'],
232
+ 'image/jpeg': ['.jpeg', '.jpg'],
233
+ 'image/svg+xml': ['.svg'],
234
+ 'image/webp': ['.webp']
235
+ },
236
+ multiple: false,
237
+ onDrop: onAppLogoDrop
238
+ });
239
+ const {
240
+ getRootProps: getCompanyLogoRootProps,
241
+ getInputProps: getCompanyLogoInputProps,
242
+ isDragActive: isCompanyLogoDragActive
243
+ } = useDropzone({
244
+ accept: {
245
+ 'image/png': ['.png'],
246
+ 'image/jpeg': ['.jpeg', '.jpg'],
247
+ 'image/svg+xml': ['.svg'],
248
+ 'image/webp': ['.webp']
249
+ },
250
+ multiple: false,
251
+ onDrop: onCompanyLogoDrop
252
+ });
253
+
254
+ const removeAppLogo = () => {
255
+ formik.setFieldValue("appLogo", null);
256
+ if (appLogoPreview) {
257
+ URL.revokeObjectURL(appLogoPreview);
258
+ setAppLogoPreview(null);
259
+ }
260
+ };
261
+
262
+ const removeCompanyLogo = () => {
263
+ formik.setFieldValue("companylogo", null);
264
+ if (companyLogoPreview) {
265
+ URL.revokeObjectURL(companyLogoPreview);
266
+ setCompanyLogoPreview(null);
267
+ }
268
+ };
269
+
270
+
271
+ const onAuthScreenRightBackgroundImageDrop = useCallback(
272
+ (acceptedFiles: File[]) => {
273
+ const file = acceptedFiles[0];
274
+ if (file) {
275
+ if (file.size > 2 * 1024 * 1024) {
276
+ toast.current?.show({
277
+ severity: "error",
278
+ summary: ERROR_MESSAGES.FILE_LARGE,
279
+ detail: ERROR_MESSAGES.MAX_FILE_SIZE,
280
+ sticky: true
281
+ });
282
+ return;
283
+ }
284
+ formik.setFieldValue("authScreenRightBackgroundImage", file);
285
+ setAuthScreenRightBackgroundImagePreview(URL.createObjectURL(file));
286
+ }
287
+ },
288
+ [formik]
289
+ );
290
+
291
+ const onAuthScreenLeftBackgroundImageDrop = useCallback((acceptedFiles: File[]) => {
292
+ const file = acceptedFiles[0];
293
+ if (file) {
294
+ if (file.size > 2 * 1024 * 1024) {
295
+ toast.current?.show({
296
+ severity: "error",
297
+ summary: ERROR_MESSAGES.FILE_LARGE,
298
+ detail: ERROR_MESSAGES.MAX_FILE_SIZE,
299
+ sticky: true,
300
+ });
301
+ return;
302
+ }
303
+ formik.setFieldValue("authScreenLeftBackgroundImage", file);
304
+ setAuthScreenLeftBackgroundImagePreview(URL.createObjectURL(file));
305
+ }
306
+ }, [formik]);
307
+
308
+ const onAuthScreenCenterBackgroundImageDrop = useCallback((acceptedFiles: File[]) => {
309
+ const file = acceptedFiles[0];
310
+ if (file) {
311
+ if (file.size > 2 * 1024 * 1024) {
312
+ toast.current?.show({
313
+ severity: "error",
314
+ summary: ERROR_MESSAGES.FILE_LARGE,
315
+ detail: ERROR_MESSAGES.MAX_FILE_SIZE,
316
+ sticky: true,
317
+ });
318
+ return;
319
+ }
320
+ formik.setFieldValue("authScreenCenterBackgroundImage", file);
321
+ setAuthScreenCenterBackgroundImagePreview(URL.createObjectURL(file));
322
+ }
323
+ }, [formik]);
324
+
325
+ const {
326
+ getRootProps: getAuthScreenRightBackgroundImageRootProps,
327
+ getInputProps: getAuthScreenRightBackgroundImageInputProps,
328
+ isDragActive: isAuthScreenRightBackgroundImageDragActive
329
+ } = useDropzone({
330
+ accept: {
331
+ 'image/png': ['.png'],
332
+ 'image/jpeg': ['.jpeg', '.jpg'],
333
+ 'image/svg+xml': ['.svg'],
334
+ 'image/webp': ['.webp']
335
+ },
336
+ multiple: false,
337
+ onDrop: onAuthScreenRightBackgroundImageDrop
338
+ });
339
+
340
+ const {
341
+ getRootProps: getAuthScreenLeftBackgroundImageRootProps,
342
+ getInputProps: getAuthScreenLeftBackgroundImageInputProps,
343
+ isDragActive: isAuthScreenLeftBackgroundImageDragActive
344
+ } = useDropzone({
345
+ accept: {
346
+ 'image/png': ['.png'],
347
+ 'image/jpeg': ['.jpeg', '.jpg'],
348
+ 'image/svg+xml': ['.svg'],
349
+ 'image/webp': ['.webp']
350
+ },
351
+ multiple: false,
352
+ onDrop: onAuthScreenLeftBackgroundImageDrop
353
+ });
354
+
355
+ const {
356
+ getRootProps: getAuthScreenCenterBackgroundImageRootProps,
357
+ getInputProps: getAuthScreenCenterBackgroundImageInputProps,
358
+ isDragActive: isAuthScreenCenterBackgroundImageDragActive
359
+ } = useDropzone({
360
+ accept: {
361
+ 'image/png': ['.png'],
362
+ 'image/jpeg': ['.jpeg', '.jpg'],
363
+ 'image/svg+xml': ['.svg'],
364
+ 'image/webp': ['.webp']
365
+ },
366
+ multiple: false,
367
+ onDrop: onAuthScreenCenterBackgroundImageDrop
368
+ });
369
+
370
+ const removeAuthScreenRightBackgroundImage = () => {
371
+ formik.setFieldValue("authScreenRightBackgroundImage", null);
372
+ if (authScreenRightBackgroundImagePreview) {
373
+ URL.revokeObjectURL(authScreenRightBackgroundImagePreview);
374
+ setAuthScreenRightBackgroundImagePreview(null);
375
+ }
376
+ };
377
+
378
+ const removeAuthScreenLeftBackgroundImage = () => {
379
+ formik.setFieldValue("authScreenLeftBackgroundImage", null);
380
+ if (authScreenLeftBackgroundImagePreview) {
381
+ URL.revokeObjectURL(authScreenLeftBackgroundImagePreview);
382
+ setAuthScreenLeftBackgroundImagePreview(null);
383
+ }
384
+ };
385
+
386
+ const removeAuthScreenCenterBackgroundImage = () => {
387
+ formik.setFieldValue("authScreenCenterBackgroundImage", null);
388
+ if (authScreenCenterBackgroundImagePreview) {
389
+ URL.revokeObjectURL(authScreenCenterBackgroundImagePreview);
390
+ setAuthScreenCenterBackgroundImagePreview(null);
391
+ }
392
+ };
393
+
394
+
395
+
396
+ // const [currentProfile, setcurrentProfile] = useState<string>("");
397
+
398
+ const handleProviderSelect = (value: string) => {
399
+ // 🔄 Add profile if doesn't exist
400
+ const profiles = formik.values.solidXGenAiCodeBuilderConfig.availableProviders;
401
+ const exists = profiles.some((p: any) => p.provider === value);
402
+
403
+ const newProfiles = exists
404
+ ? profiles
405
+ : [
406
+ ...profiles,
407
+ {
408
+ id: Date.now().toString(),
409
+ provider: ""
410
+ },
411
+ ];
412
+
413
+
414
+ formik.setFieldValue("solidXGenAiCodeBuilderConfig.defaultProvider", value);
415
+ formik.setFieldValue("solidXGenAiCodeBuilderConfig.availableProviders", newProfiles);
416
+ };
417
+
418
+ const handleProfileUpdate = (key: string, value: string) => {
419
+ const config = formik.values.solidXGenAiCodeBuilderConfig ?? {
420
+ availableProviders: [],
421
+ defaultProvider: "",
422
+ };
423
+
424
+ const profiles = config.availableProviders ?? [];
425
+ const defaultProvider = config.defaultProvider;
426
+
427
+ let updatedProfiles: any[];
428
+
429
+ // ✅ If profile exists → update it immutably
430
+ if (profiles.some((p: any) => p.provider === defaultProvider)) {
431
+ updatedProfiles = profiles.map((p: any) =>
432
+ p.provider === defaultProvider ? { ...p, [key]: value } : p
433
+ );
434
+ } else {
435
+ // ✅ If profile doesn't exist → create it and set this key
436
+ updatedProfiles = [
437
+ ...profiles,
438
+ {
439
+ id: Date.now().toString(),
440
+ provider: defaultProvider,
441
+ [key]: value,
442
+ },
443
+ ];
444
+ }
445
+
446
+ // ✅ New array reference → Formik dirty check will pass
447
+ formik.setFieldValue(
448
+ "solidXGenAiCodeBuilderConfig.availableProviders",
449
+ updatedProfiles
450
+ );
451
+ };
452
+
453
+ const currentProfile =
454
+ (formik.values.solidXGenAiCodeBuilderConfig.availableProviders ?? []).find(
455
+ (p: any) => p.provider === formik.values.solidXGenAiCodeBuilderConfig.defaultProvider
456
+ ) || null;
457
+
458
+
459
+ return (
460
+ <div className="page-parent-wrapper">
461
+ <Toast ref={toast} />
462
+ <div className="solid-form-wrapper">
463
+ <div className="solid-form-section">
464
+ <form onSubmit={formik.handleSubmit}>
465
+ <div className="page-header secondary-border-bottom">
466
+ <div className="form-wrapper-title ">Settings</div>
467
+ <div className="gap-3 flex">
468
+ {formik.dirty &&
469
+ <Button label="Save" size="small" onClick={() => showError()} type="submit" />
470
+ }
471
+ <CancelButton />
472
+ </div>
473
+ </div>
474
+ <div className="px-4 py-3 md:p-4 solid-form-content">
475
+ {pathname.includes("app-settings") &&
476
+ <>
477
+ <div className='formgrid grid'>
478
+ <div className='col-12 lg:col-10 xl:col-8'>
479
+ <div className="formgrid grid">
480
+ <div className="col-12 md:col-6">
481
+ <p className='font-bold ' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>App Logo </p>
482
+ <div>
483
+ <div {...getAppLogoRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
484
+ <input {...getAppLogoInputProps()} />
485
+ {/* {isAppLogoDragActive && */}
486
+ <SettingDropzoneActivePlaceholder />
487
+ {/* } */}
488
+ </div>
489
+ <div className="mt-2">
490
+ {(() => {
491
+ const logoSrc = (SolidLogo as any).src || SolidLogo;
492
+
493
+ let src = appLogoPreview
494
+ ? appLogoPreview
495
+ : formik.values.appLogo
496
+ ? formik.values.appLogo
497
+ : logoSrc
498
+
499
+ const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
500
+
501
+ if (!isBlobOrAbsolute && !src.startsWith("/")) {
502
+ src = `${process.env.API_URL}/${src}`;
503
+ }
504
+ return (
505
+ <SolidUploadedImage src={src} className='solid-app-logo' />
506
+ );
507
+ })()}
508
+ </div>
509
+ {formik.values.appLogo && (
510
+ <SettingsImageRemoveButton onClick={removeAppLogo} />
511
+ )}
512
+ </div>
513
+ </div>
514
+ <div className="col-12 md:col-6">
515
+ <p className='font-bold ' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Company Logo </p>
516
+ <div>
517
+ <div {...getCompanyLogoRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
518
+ <input {...getCompanyLogoInputProps()} />
519
+ {/* {isCompanyLogoDragActive && */}
520
+ <SettingDropzoneActivePlaceholder />
521
+ {/* } */}
522
+ </div>
523
+ <div className="mt-2">
524
+ {(() => {
525
+ const logoSrc = (SolidLogo as any).src || SolidLogo;
526
+
527
+ let src = companyLogoPreview
528
+ ? companyLogoPreview
529
+ : formik.values.companylogo
530
+ ? formik.values.companylogo
531
+ : logoSrc
532
+
533
+ const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
534
+
535
+ if (!isBlobOrAbsolute && !src.startsWith("/")) {
536
+ src = `${process.env.API_URL}/${src}`;
537
+ }
538
+
539
+ return (
540
+ <SolidUploadedImage src={src} className='solid-compony-logo' />
541
+ );
542
+ })()}
543
+ </div>
544
+ {formik.values.companylogo && (
545
+ <SettingsImageRemoveButton onClick={removeCompanyLogo} />
546
+ )}
547
+ </div>
548
+ </div>
549
+ </div>
550
+ </div>
551
+ </div>
552
+ <p className='font-bold mt-4' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>App Logo Position</p>
553
+ <div className='formgrid grid'>
554
+ <div className='col-12 lg:col-10 xl:col-8'>
555
+ <div className="flex align-items-center gap-3">
556
+ <div className="flex align-items-center">
557
+ <RadioButton
558
+ inputId="appLogoPosition-in_form_view"
559
+ name="appLogoPosition"
560
+ value="in_form_view"
561
+ checked={formik.values.appLogoPosition === "in_form_view"}
562
+ onChange={(e) => formik.setFieldValue("appLogoPosition", e.value)}
563
+ />
564
+ <label htmlFor="appLogoPosition-in_form_view" className="ml-2">In Form View</label>
565
+ </div>
566
+ <div className="flex align-items-center">
567
+ <RadioButton
568
+ inputId="appLogoPosition-in_image_view"
569
+ name="appLogoPosition"
570
+ value="in_image_view"
571
+ checked={formik.values.appLogoPosition === "in_image_view"}
572
+ onChange={(e) => formik.setFieldValue("appLogoPosition", e.value)}
573
+ />
574
+ <label htmlFor="appLogoPosition-in_image_view" className="ml-2">In Image View</label>
575
+ </div>
576
+ </div>
577
+ </div>
578
+ </div>
579
+ <div className='mt-4' style={{ borderBottom: '1px dashed #D8E2EA' }}></div>
580
+ <p className='font-bold mt-4' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Title & Description Details </p>
581
+ <div className='formgrid grid'>
582
+ <div className='col-12 lg:col-10 xl:col-8'>
583
+ <div className="formgrid grid">
584
+ <div className="col-12 md:col-6">
585
+ <div className="formgrid grid align-items-center">
586
+ <div className="col-10 sm:col-9 lg:col-5 pb-2 md:pb-0">
587
+ <label className="form-field-label">Show Details on Authentication Screen</label>
588
+ </div>
589
+ <div className="col-2 sm:col-3 lg:col-7">
590
+ <InputSwitch
591
+ name="showAuthContent"
592
+ checked={formik.values.showAuthContent}
593
+ onChange={(e) => formik.setFieldValue("showAuthContent", e.value)}
594
+ />
595
+ </div>
596
+ </div>
597
+ </div>
598
+ <div className="col-12 md:col-6">
599
+ <div className="formgrid grid align-items-center">
600
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
601
+ <label className="form-field-label">App Title</label>
602
+ </div>
603
+ <div className="col-12 md:col-7">
604
+ <InputText
605
+ type="text"
606
+ id="appTitle"
607
+ name="appTitle"
608
+ onChange={formik.handleChange}
609
+ value={formik.values.appTitle}
610
+ className='w-full'
611
+ />
612
+ </div>
613
+ </div>
614
+ </div>
615
+ <div className="col-12 md:col-6 mt-4">
616
+ <div className="formgrid grid align-items-center">
617
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
618
+ <label className="form-field-label">App Subtitle</label>
619
+ </div>
620
+ <div className="col-12 md:col-7">
621
+ <InputText
622
+ type="text"
623
+ id="appSubtitle"
624
+ name="appSubtitle"
625
+ onChange={formik.handleChange}
626
+ value={formik.values.appSubtitle}
627
+ className='w-full'
628
+ />
629
+ </div>
630
+ </div>
631
+ </div>
632
+ <div className="col-12 md:col-6 mt-4">
633
+ <div className="formgrid grid align-items-start">
634
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
635
+ <label className="form-field-label">Description</label>
636
+ </div>
637
+ <div className="col-12 md:col-7">
638
+ <InputTextarea
639
+ rows={3}
640
+ id="appDescription"
641
+ name="appDescription"
642
+ onChange={formik.handleChange}
643
+ value={formik.values.appDescription}
644
+ className='w-full'
645
+ />
646
+ </div>
647
+ </div>
648
+ </div>
649
+ <div className="col-12 md:col-6 mt-4">
650
+ <div className="formgrid grid align-items-start">
651
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
652
+ <label className="form-field-label">Copyright</label>
653
+ </div>
654
+ <div className="col-12 md:col-7">
655
+ <InputTextarea
656
+ rows={3}
657
+ id="copyright"
658
+ name="copyright"
659
+ onChange={formik.handleChange}
660
+ value={formik.values.copyright}
661
+ className='w-full'
662
+ />
663
+ </div>
664
+ </div>
665
+ </div>
666
+ </div>
667
+ </div>
668
+ </div>
669
+ <div className='mt-4' style={{ borderBottom: '1px dashed #D8E2EA' }}></div>
670
+
671
+ <p className='font-bold mt-4' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Legal Links</p>
672
+ <div className='formgrid grid'>
673
+ <div className='col-12 lg:col-10 xl:col-8'>
674
+ <div className="formgrid grid">
675
+ <div className="col-12 md:col-6">
676
+ <div className="formgrid grid align-items-center">
677
+ <div className="col-10 sm:col-9 lg:col-5">
678
+ <label className="form-field-label">Show Legal Links</label>
679
+ </div>
680
+ <div className="col-2 sm:col-3 lg:col-7">
681
+ <InputSwitch
682
+ name="showLegalLinks"
683
+ checked={formik.values.showLegalLinks}
684
+ onChange={(e) => formik.setFieldValue("showLegalLinks", e.value)}
685
+ />
686
+ </div>
687
+ </div>
688
+ </div>
689
+ <div className="col-12 md:col-6">
690
+ <div className="formgrid grid align-items-center">
691
+ <div className="col-12 md:col-5 py-2 md:py-0">
692
+ <label className="form-field-label">Terms and Conditions Link</label>
693
+ </div>
694
+ <div className="col-12 md:col-7">
695
+ <InputText
696
+ type="text"
697
+ id="appTnc"
698
+ name="appTnc"
699
+ onChange={formik.handleChange}
700
+ value={formik.values.appTnc}
701
+ className='w-full'
702
+ />
703
+ </div>
704
+ </div>
705
+ </div>
706
+ <div className="col-12 md:col-6 mt-3">
707
+ <div className="formgrid grid align-items-center">
708
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
709
+ <label className="form-field-label">Privacy Policy Link</label>
710
+ </div>
711
+ <div className="col-12 md:col-7">
712
+ <InputText
713
+ type="text"
714
+ id="appPrivacyPolicy"
715
+ name="appPrivacyPolicy"
716
+ onChange={formik.handleChange}
717
+ value={formik.values.appPrivacyPolicy}
718
+ className='w-full'
719
+ />
720
+ </div>
721
+ </div>
722
+ </div>
723
+ </div>
724
+ </div>
725
+ </div>
726
+ <div className='mt-4' style={{ borderBottom: '1px dashed #D8E2EA' }}></div>
727
+ <p className='font-bold mt-4' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Theme</p>
728
+ <div className='formgrid grid'>
729
+ <div className='col-12 lg:col-10 xl:col-8'>
730
+ <div className="formgrid grid">
731
+ <div className="col-12 md:col-6">
732
+ <div className="formgrid grid align-items-center">
733
+ <div className="col-10 sm:col-10 lg:col-5">
734
+ <label className="form-field-label">Enable Dark Mode</label>
735
+ </div>
736
+ <div className="col-2 sm:col-3 lg:col-7">
737
+ <InputSwitch
738
+ name="enableDarkMode"
739
+ checked={formik.values.enableDarkMode}
740
+ onChange={(e) => formik.setFieldValue("enableDarkMode", e.value)}
741
+ />
742
+ </div>
743
+ </div>
744
+ </div>
745
+ </div>
746
+ </div>
747
+ </div>
748
+ </>
749
+ }
750
+ {pathname.includes("authentication-settings") &&
751
+ <>
752
+ <p className='font-bold' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>User Authentication </p>
753
+ <div className='formgrid grid'>
754
+ <div className='col-12 lg:col-10 xl:col-8'>
755
+ <div className="formgrid grid">
756
+ <div className="col-12">
757
+ <div className="formgrid grid align-items-center">
758
+ <div className="col-10 sm:col-9 lg:col-5">
759
+ <label className="form-field-label">Public Registration</label>
760
+ </div>
761
+ <div className="col-2 sm:col-3 lg:col-7">
762
+ <InputSwitch
763
+ name="allowPublicRegistration"
764
+ checked={formik.values.allowPublicRegistration}
765
+ onChange={(e) => formik.setFieldValue("allowPublicRegistration", e.value)}
766
+ />
767
+ </div>
768
+ </div>
769
+ </div>
770
+ <div className="col-12 mt-3">
771
+ <div className="formgrid grid align-items-center">
772
+ <div className="col-10 sm:col-9 lg:col-5">
773
+ <label className="form-field-label">Password Based Authentication</label>
774
+ </div>
775
+ <div className="col-2 sm:col-3 lg:col-7">
776
+ <InputSwitch
777
+ name="passwordBasedAuth"
778
+ checked={formik.values.passwordBasedAuth}
779
+ onChange={(e) => formik.setFieldValue("passwordBasedAuth", e.value)}
780
+ />
781
+ </div>
782
+ </div>
783
+ </div>
784
+ <div className="col-12 mt-3">
785
+ <div className="formgrid grid align-items-center">
786
+ <div className="col-10 sm:col-9 lg:col-5">
787
+ <label className="form-field-label">Password Less Authentication</label>
788
+ </div>
789
+ <div className="col-2 sm:col-3 lg:col-7">
790
+ <InputSwitch
791
+ name="passwordLessAuth"
792
+ checked={formik.values.passwordLessAuth}
793
+ onChange={(e) => formik.setFieldValue("passwordLessAuth", e.value)}
794
+ />
795
+ </div>
796
+ </div>
797
+ </div>
798
+ <div className="col-12 mt-3">
799
+ <div className="formgrid grid align-items-center">
800
+ <div className="col-10 sm:col-9 lg:col-5">
801
+ <label className="form-field-label">Auto Activate User on Registration </label>
802
+ </div>
803
+ <div className="col-2 sm:col-3 lg:col-7">
804
+ <InputSwitch
805
+ name="activateUserOnRegistration"
806
+ checked={formik.values.activateUserOnRegistration}
807
+ onChange={(e) => formik.setFieldValue("activateUserOnRegistration", e.value)}
808
+ />
809
+ </div>
810
+ </div>
811
+ </div>
812
+ <div className="col-12 mt-3">
813
+ <div className="formgrid grid align-items-center">
814
+ <div className="col-10 sm:col-9 lg:col-5">
815
+ <label className="form-field-label">Allow Login/ Signup with Google </label>
816
+ </div>
817
+ <div className="col-2 sm:col-3 lg:col-7">
818
+ <InputSwitch
819
+ name="iamGoogleOAuthEnabled"
820
+ checked={formik.values.iamGoogleOAuthEnabled}
821
+ onChange={(e) => formik.setFieldValue("iamGoogleOAuthEnabled", e.value)}
822
+ />
823
+ </div>
824
+ </div>
825
+ </div>
826
+ <div className="col-12 mt-3">
827
+ <div className="formgrid grid align-items-center">
828
+ <div className="col-10 sm:col-9 lg:col-5">
829
+ <label className="form-field-label">Force Password change on first Login </label>
830
+ </div>
831
+ <div className="col-2 sm:col-3 lg:col-7">
832
+ <InputSwitch
833
+ name="forceChangePasswordOnFirstLogin"
834
+ checked={formik.values.forceChangePasswordOnFirstLogin}
835
+ onChange={(e) => formik.setFieldValue("forceChangePasswordOnFirstLogin", e.value)}
836
+ />
837
+ </div>
838
+ </div>
839
+ </div>
840
+ {formik.values.passwordLessAuth === true &&
841
+ <div className="col-12 mt-3">
842
+ <div className="formgrid grid align-items-center">
843
+ <div className="col-12 sm:col-12 lg:col-5 xl:col-5">
844
+ <label className="form-field-label">Password Less Authentication Method</label>
845
+ </div>
846
+ <div className='col-12 sm:col-12 lg:col-6 xl:col-6'>
847
+ <div className="flex align-items-center gap-3 mt-3 lg:mt-0">
848
+ <div className="flex align-items-center">
849
+ <RadioButton
850
+ inputId="passwordlessRegistrationValidateWhat-email"
851
+ name="passwordlessRegistrationValidateWhat"
852
+ value="email"
853
+ checked={formik.values.passwordlessRegistrationValidateWhat === "email"}
854
+ onChange={(e) => formik.setFieldValue("passwordlessRegistrationValidateWhat", e.value)}
855
+ />
856
+ <label htmlFor="passwordlessRegistrationValidateWhat-email" className="ml-2">Email</label>
857
+ </div>
858
+ <div className="flex align-items-center">
859
+ <RadioButton
860
+ inputId="passwordlessRegistrationValidateWhat-mobile"
861
+ name="passwordlessRegistrationValidateWhat"
862
+ value="mobile"
863
+ checked={formik.values.passwordlessRegistrationValidateWhat === "mobile"}
864
+ onChange={(e) => formik.setFieldValue("passwordlessRegistrationValidateWhat", e.value)}
865
+ />
866
+ <label htmlFor="passwordlessRegistrationValidateWhat-mobile" className="ml-2">Mobile</label>
867
+ </div>
868
+ <div className="flex align-items-center">
869
+ <RadioButton
870
+ inputId="passwordlessRegistrationValidateWhat-transactional"
871
+ name="passwordlessRegistrationValidateWhat"
872
+ value="transactional"
873
+ checked={formik.values.passwordlessRegistrationValidateWhat === "transactional"}
874
+ onChange={(e) => formik.setFieldValue("passwordlessRegistrationValidateWhat", e.value)}
875
+ />
876
+ <label htmlFor="passwordlessRegistrationValidateWhat-transactional" className="ml-2">Transactional</label>
877
+ </div>
878
+ </div>
879
+ </div>
880
+ </div>
881
+ {formik.values.passwordlessRegistrationValidateWhat === "transactional" &&
882
+ <p className="mt-3 text-sm font-bold">Note : In this method, you can pass the authentication method from the ui with possible values being either email or mobile. You can also pass both the values here</p>
883
+ }
884
+ </div>
885
+ }
886
+ </div>
887
+ </div>
888
+ </div>
889
+ <div className='mt-4' style={{ borderBottom: '1px dashed #D8E2EA' }}></div>
890
+ <p className='font-bold mt-4' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Authentication Screen Layout</p>
891
+ <div className='formgrid grid'>
892
+ <div className='col-12 lg:col-10 xl:col-8'>
893
+ <div className="flex align-items-center gap-3">
894
+ <div className="flex align-items-center">
895
+ <RadioButton
896
+ inputId="authPagesLayout-left"
897
+ name="authPagesLayout"
898
+ value="left"
899
+ checked={formik.values.authPagesLayout === "left"}
900
+ onChange={(e) => formik.setFieldValue("authPagesLayout", e.value)}
901
+ />
902
+ <label htmlFor="authPagesLayout-left" className="ml-2">Left</label>
903
+ </div>
904
+ <div className="flex align-items-center">
905
+ <RadioButton
906
+ inputId="authPagesLayout-center"
907
+ name="authPagesLayout"
908
+ value="center"
909
+ checked={formik.values.authPagesLayout === "center"}
910
+ onChange={(e) => formik.setFieldValue("authPagesLayout", e.value)}
911
+ />
912
+ <label htmlFor="authPagesLayout-center" className="ml-2">Center</label>
913
+ </div>
914
+ <div className="flex align-items-center">
915
+ <RadioButton
916
+ inputId="authPagesLayout-right"
917
+ name="authPagesLayout"
918
+ value="right"
919
+ checked={formik.values.authPagesLayout === "right"}
920
+ onChange={(e) => formik.setFieldValue("authPagesLayout", e.value)}
921
+ />
922
+ <label htmlFor="authPagesLayout-right" className="ml-2">Right</label>
923
+ </div>
924
+ </div>
925
+ <p className="mt-3 text-sm font-bold">Note : {positionMap[formik.values.authPagesLayout as 'left' | 'center' | 'right']}</p>
926
+ </div>
927
+ </div>
928
+ {formik.values.authPagesLayout === "center" && <></>}
929
+ <div className='formgrid grid'>
930
+ <div className='col-12 lg:col-10 xl:col-8'>
931
+ <div className="formgrid grid">
932
+ <div className="col-12 md:col-8 lg:col-6">
933
+ <p className='font-bold ' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>{formik.values.authPagesLayout === "center" ? "Background" : "Banner"} Image</p>
934
+ {formik.values.authPagesLayout === "left" &&
935
+ <div>
936
+ <div {...getAuthScreenLeftBackgroundImageRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
937
+ <input {...getAuthScreenLeftBackgroundImageInputProps()} />
938
+ {/* {isAuthScreenLeftBackgroundImageDragActive && */}
939
+ <SettingDropzoneActivePlaceholder note={"Recommended: 724×724px | Aspect ratio: 1:1"} />
940
+ {/* } */}
941
+ </div>
942
+ <div className="mt-2">
943
+ {(() => {
944
+ const logoSrc = (AuthScreenLeftBackgroundImage as any).src || AuthScreenLeftBackgroundImage;
945
+
946
+ let src = authScreenLeftBackgroundImagePreview
947
+ ? authScreenLeftBackgroundImagePreview
948
+ : formik.values.authScreenLeftBackgroundImage
949
+ ? formik.values.authScreenLeftBackgroundImage
950
+ : logoSrc
951
+
952
+ const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
953
+
954
+ if (!isBlobOrAbsolute && !src.startsWith("/")) {
955
+ src = `${process.env.API_URL}/${src}`;
956
+ }
957
+ return (
958
+ <SolidUploadedImage src={src} height={400} width={400} maxHeight={400} />
959
+ );
960
+ })()}
961
+ </div>
962
+ {formik.values.authScreenLeftBackgroundImage && (
963
+ <SettingsImageRemoveButton onClick={removeAuthScreenLeftBackgroundImage} />
964
+ )}
965
+ </div>
966
+ }
967
+ {formik.values.authPagesLayout === "right" &&
968
+ <div>
969
+ <div {...getAuthScreenRightBackgroundImageRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
970
+ <input {...getAuthScreenRightBackgroundImageInputProps()} />
971
+ {/* {isAuthScreenRightBackgroundImageDragActive && */}
972
+ <SettingDropzoneActivePlaceholder note={"Recommended: 724×724px | Aspect ratio: 1:1"} />
973
+ {/* } */}
974
+ </div>
975
+ <div className="mt-2">
976
+ {(() => {
977
+ const logoSrc = (AuthScreenRightBackgroundImage as any).src || AuthScreenRightBackgroundImage;
978
+
979
+ let src = authScreenRightBackgroundImagePreview
980
+ ? authScreenRightBackgroundImagePreview
981
+ : formik.values.authScreenRightBackgroundImage
982
+ ? formik.values.authScreenRightBackgroundImage
983
+ : logoSrc
984
+
985
+ const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
986
+
987
+ if (!isBlobOrAbsolute && !src.startsWith("/")) {
988
+ src = `${process.env.API_URL}/${src}`;
989
+ }
990
+ return (
991
+ <SolidUploadedImage src={src} height={400} width={400} maxHeight={400} />
992
+ );
993
+ })()}
994
+ </div>
995
+ {formik.values.authScreenRightBackgroundImage && (
996
+ <SettingsImageRemoveButton onClick={removeAuthScreenRightBackgroundImage} />
997
+ )}
998
+ </div>
999
+ }
1000
+ {formik.values.authPagesLayout === "center" &&
1001
+ <div>
1002
+ <div {...getAuthScreenCenterBackgroundImageRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
1003
+ <input {...getAuthScreenCenterBackgroundImageInputProps()} />
1004
+ <SettingDropzoneActivePlaceholder note={"Recommended: 1440px × 724px | Aspect ratio: 2:1"} />
1005
+ </div>
1006
+ <div className="mt-2">
1007
+ {(() => {
1008
+ const logoSrc = (AuthScreenCenterBackgroundImage as any).src || AuthScreenCenterBackgroundImage;
1009
+
1010
+ let src = authScreenCenterBackgroundImagePreview
1011
+ ? authScreenCenterBackgroundImagePreview
1012
+ : formik.values.authScreenCenterBackgroundImage
1013
+ ? formik.values.authScreenCenterBackgroundImage
1014
+ : logoSrc
1015
+
1016
+ const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
1017
+
1018
+ if (!isBlobOrAbsolute && !src.startsWith("/")) {
1019
+ src = `${process.env.API_URL}/${src}`;
1020
+ }
1021
+ return (
1022
+ <SolidUploadedImage src={src} height={300} width={600} maxHeight={300} />
1023
+ );
1024
+ })()}
1025
+ </div>
1026
+ {formik.values.authScreenCenterBackgroundImage && (
1027
+ <SettingsImageRemoveButton onClick={removeAuthScreenCenterBackgroundImage} />
1028
+ )}
1029
+ </div>
1030
+ }
1031
+ </div>
1032
+ </div>
1033
+ </div>
1034
+ </div>
1035
+ <div className='mt-2 lg:mt-4' style={{ borderBottom: '1px dashed #D8E2EA' }}></div>
1036
+ {solidSettingsData?.data?.enableDarkMode === true &&
1037
+ <>
1038
+ <p className='font-bold mt-3 lg:mt-4' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Authentication Screen Theme</p>
1039
+ <div className='formgrid grid'>
1040
+ <div className='col-12 lg:col-10 xl:col-8'>
1041
+ <div className="flex align-items-center gap-3">
1042
+ <div className="flex align-items-center">
1043
+ <RadioButton
1044
+ inputId="theme-light"
1045
+ name="authPagesTheme"
1046
+ value="light"
1047
+ checked={formik.values.authPagesTheme === "light"}
1048
+ onChange={(e) => formik.setFieldValue("authPagesTheme", e.value)}
1049
+ />
1050
+ <label htmlFor="theme-light" className="ml-2">Solid Light</label>
1051
+ </div>
1052
+ <div className="flex align-items-center">
1053
+ <RadioButton
1054
+ inputId="theme-dark"
1055
+ name="authPagesTheme"
1056
+ value="dark"
1057
+ checked={formik.values.authPagesTheme === "dark"}
1058
+ onChange={(e) => formik.setFieldValue("authPagesTheme", e.value)}
1059
+ />
1060
+ <label htmlFor="theme-dark" className="ml-2">Solid Dark</label>
1061
+ </div>
1062
+ </div>
1063
+ </div>
1064
+ </div>
1065
+ </>
1066
+ }
1067
+ </>
1068
+ }
1069
+
1070
+ {pathname.includes("misc-settings") &&
1071
+ <>
1072
+ <p className='font-bold' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Misc Details</p>
1073
+ <div className='formgrid grid'>
1074
+ <div className='col-12 lg:col-10 xl:col-8'>
1075
+ <div className="formgrid grid">
1076
+ <div className="col-12 md:col-6 pb-3 md:pb-0">
1077
+ <div className="formgrid grid align-items-center">
1078
+ <div className="col-10 sm:col-9 lg:col-5 ">
1079
+ <label className="form-field-label">Use queue for sending emails</label>
1080
+ </div>
1081
+ <div className="col-2 sm:col-3 lg:col-7">
1082
+ <InputSwitch
1083
+ name="shouldQueueEmails"
1084
+ checked={formik.values.shouldQueueEmails}
1085
+ onChange={(e) => formik.setFieldValue("shouldQueueEmails", e.value)}
1086
+ />
1087
+ </div>
1088
+ </div>
1089
+ </div>
1090
+ <div className="col-12 md:col-5 pb-2">
1091
+ <div className="formgrid grid align-items-center">
1092
+ <div className="col-10 sm:col-9 lg:col-5">
1093
+ <label className="form-field-label">Use queue for sending SMS</label>
1094
+ </div>
1095
+ <div className="col-2 sm:col-3 lg:col-7">
1096
+ <InputSwitch
1097
+ name="shouldQueueSms"
1098
+ checked={formik.values.shouldQueueSms}
1099
+ onChange={(e) => formik.setFieldValue("shouldQueueSms", e.value)}
1100
+ />
1101
+ </div>
1102
+ </div>
1103
+ </div>
1104
+ </div>
1105
+ </div>
1106
+ </div>
1107
+ <Divider />
1108
+ <p className='font-bold' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Contact Support</p>
1109
+ <div className='formgrid grid'>
1110
+ <div className="col-12 lg:col-10 xl:col-8">
1111
+ <div className='formgrid grid'>
1112
+ <div className="col-12 md:col-6 pb-3 md:pb-0">
1113
+ <div className="formgrid grid align-items-center">
1114
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
1115
+ <label className="form-field-label">Contact Support Email</label>
1116
+ </div>
1117
+ <div className="col-12 md:col-7">
1118
+ <InputText
1119
+ type="text"
1120
+ id="contactSupportEmail"
1121
+ name="contactSupportEmail"
1122
+ onChange={formik.handleChange}
1123
+ value={formik.values.contactSupportEmail}
1124
+ className='w-full'
1125
+ />
1126
+ </div>
1127
+ </div>
1128
+ </div>
1129
+ <div className="col-12 md:col-6">
1130
+ <div className="formgrid grid align-items-center">
1131
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
1132
+ <label className="form-field-label">Display Name</label>
1133
+ </div>
1134
+ <div className="col-12 md:col-7">
1135
+ <InputText
1136
+ type="text"
1137
+ id="contactSupportDisplayName"
1138
+ name="contactSupportDisplayName"
1139
+ onChange={formik.handleChange}
1140
+ value={formik.values.contactSupportDisplayName}
1141
+ className='w-full'
1142
+ />
1143
+ </div>
1144
+ </div>
1145
+ </div>
1146
+ </div>
1147
+ </div>
1148
+ </div>
1149
+ </>
1150
+ }
1151
+ {pathname.includes("ai-settings") &&
1152
+ <>
1153
+ <p className='font-bold' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Ai Details</p>
1154
+ <div className='formgrid grid'>
1155
+ <div className='col-12 lg:col-10 xl:col-8'>
1156
+ <div className="formgrid grid">
1157
+ <div className="col-12 md:col-10 lg:col-6 mt-3 md:mt-4">
1158
+ <div className="formgrid grid align-items-center">
1159
+ <div className="col-12 md:col-3 pb-2 md:pb-0">
1160
+ <label className="form-field-label">Default Provider</label>
1161
+ </div>
1162
+ <div className="col-12 md:col-9">
1163
+ <Dropdown
1164
+ className='w-full'
1165
+ value={formik.values.solidXGenAiCodeBuilderConfig.defaultProvider}
1166
+ options={[
1167
+ { label: "OpenAI", value: "openai" },
1168
+ { label: "Anthropic", value: "anthropic" },
1169
+ ]}
1170
+ onChange={(e) => handleProviderSelect(e.value)}
1171
+ placeholder="Select Provider"
1172
+ />
1173
+ </div>
1174
+ </div>
1175
+ </div>
1176
+ {/* <div className="col-6 mt-4">
1177
+ <div className="formgrid grid align-items-center">
1178
+ <div className="col-5">
1179
+ <label className="form-field-label">Model Name</label>
1180
+ </div>
1181
+ <div className="col-7">
1182
+ <InputText
1183
+ type="text"
1184
+ id="llModelName"
1185
+ name="llModelName"
1186
+ onChange={formik.handleChange}
1187
+ value={formik.values.llModelName}
1188
+ className='w-full'
1189
+ />
1190
+ </div>
1191
+ </div>
1192
+ </div> */}
1193
+ </div>
1194
+ </div>
1195
+ </div>
1196
+ <Divider />
1197
+ <div className='grid'>
1198
+ <div className='col-12 md:col-6'>
1199
+ {formik.values.solidXGenAiCodeBuilderConfig.defaultProvider && (
1200
+ <>
1201
+ {formik.values.solidXGenAiCodeBuilderConfig.defaultProvider === "openai" && (
1202
+ <OpenAiProviderComponent
1203
+ profile={currentProfile}
1204
+ onUpdate={handleProfileUpdate}
1205
+ />
1206
+ )}
1207
+ {formik.values.solidXGenAiCodeBuilderConfig.defaultProvider === "anthropic" && (
1208
+ <AnthropicProviderComponent
1209
+ profile={currentProfile}
1210
+ onUpdate={handleProfileUpdate}
1211
+ />
1212
+ )}
1213
+ </>
1214
+ )}
1215
+ </div>
1216
+ </div>
1217
+ </>
1218
+ }
1219
+ </div>
1220
+ </form>
1221
+ </div>
1222
+ </div>
1223
+ </div>
1224
+ )
1225
+ }