@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.
- package/dist/components/Svg/DevDocs.tsx +9 -0
- package/dist/components/Svg/DocsSvg.tsx +9 -0
- package/dist/components/Svg/ExcelSvg.tsx +15 -0
- package/dist/components/Svg/FieldSvg.tsx +9 -0
- package/dist/components/Svg/FileSvg.tsx +18 -0
- package/dist/components/Svg/HomePageModuleSvg.tsx +179 -0
- package/dist/components/Svg/ModelSvg.tsx +9 -0
- package/dist/components/Svg/ModuleSvg.tsx +9 -0
- package/dist/components/Svg/PDFSvg.tsx +15 -0
- package/dist/components/Svg/RightArrowSvg.tsx +9 -0
- package/dist/components/Svg/SettingsSvg.tsx +9 -0
- package/dist/components/auth/AuthLayout.tsx +223 -0
- package/dist/components/auth/ForgotPasswordThankYou.tsx +33 -0
- package/dist/components/auth/GoogleAuthChecking.tsx +63 -0
- package/dist/components/auth/SolidChangeForcePassword.tsx +222 -0
- package/dist/components/auth/SolidForgotPassword.tsx +127 -0
- package/dist/components/auth/SolidInitialLoginOtp.tsx +271 -0
- package/dist/components/auth/SolidInitiateRegisterOtp.tsx +218 -0
- package/dist/components/auth/SolidLogin.d.ts.map +1 -1
- package/dist/components/auth/SolidLogin.js +14 -8
- package/dist/components/auth/SolidLogin.js.map +1 -1
- package/dist/components/auth/SolidLogin.tsx +428 -0
- package/dist/components/auth/SolidOTPVerify.tsx +133 -0
- package/dist/components/auth/SolidRegister.tsx +454 -0
- package/dist/components/auth/SolidResetPassword.tsx +194 -0
- package/dist/components/common/AuthBanner.tsx +41 -0
- package/dist/components/common/AutoCompleteField.tsx +79 -0
- package/dist/components/common/BackButton.tsx +72 -0
- package/dist/components/common/CancelButton.tsx +61 -0
- package/dist/components/common/CodeEditor.tsx +38 -0
- package/dist/components/common/CreateButton.tsx +17 -0
- package/dist/components/common/DownloadProgressToast.tsx +55 -0
- package/dist/components/common/DropzonePlaceholder.tsx +31 -0
- package/dist/components/common/DropzoneUpload.tsx +11 -0
- package/dist/components/common/FileReaderExt.tsx +20 -0
- package/dist/components/common/GeneralSettings.tsx +1225 -0
- package/dist/components/common/HeaderDynamicTitles.tsx +13 -0
- package/dist/components/common/MarkdownViewer.tsx +84 -0
- package/dist/components/common/MultipleSelectAutoCompleteField.tsx +64 -0
- package/dist/components/common/NotFound.tsx +22 -0
- package/dist/components/common/SingleSelectAutoCompleteField.tsx +73 -0
- package/dist/components/common/SocialMediaLogin.tsx +53 -0
- package/dist/components/common/SolidAdmin.tsx +6 -0
- package/dist/components/common/SolidBreadcrumb.tsx +129 -0
- package/dist/components/common/SolidExport.tsx +563 -0
- package/dist/components/common/SolidExportStepper.tsx +135 -0
- package/dist/components/common/SolidFieldTooltip.tsx +23 -0
- package/dist/components/common/SolidFormHeader.tsx +25 -0
- package/dist/components/common/SolidFormStepper.tsx +350 -0
- package/dist/components/common/SolidModuleHome.tsx +128 -0
- package/dist/components/common/SolidPopupContainer.tsx +37 -0
- package/dist/components/common/SolidSettings/LlmSettings/AnthropicProviderComponent.tsx +45 -0
- package/dist/components/common/SolidSettings/LlmSettings/OpenAiProviderComponent.tsx +45 -0
- package/dist/components/common/SolidSettings/SettingDropzoneActivePlaceholder.tsx +20 -0
- package/dist/components/common/SolidSettings/SettingsImageRemoveButton.tsx +15 -0
- package/dist/components/common/SolidSettings/SolidUploadedImage.tsx +16 -0
- package/dist/components/common/SolidThemeLink.tsx +6 -0
- package/dist/components/common/SolidThemeProvider.tsx +44 -0
- package/dist/components/common/StepperArrows/ActiveArrowStep.tsx +18 -0
- package/dist/components/common/StepperArrows/ActiveBeforeStepArrow.tsx +18 -0
- package/dist/components/common/StepperArrows/InactiveStepArrow.tsx +19 -0
- package/dist/components/common/error.tsx +30 -0
- package/dist/components/common/useHandleFormCustomButtonClick.ts +40 -0
- package/dist/components/common/useHandleListCustomButtonClick.ts +42 -0
- package/dist/components/core/chatter/SolidChatter.tsx +248 -0
- package/dist/components/core/chatter/SolidChatterAuditMessage.tsx +35 -0
- package/dist/components/core/chatter/SolidChatterCustomMessage.tsx +46 -0
- package/dist/components/core/chatter/SolidChatterDateDivider.tsx +16 -0
- package/dist/components/core/chatter/SolidChatterHeader.tsx +218 -0
- package/dist/components/core/chatter/SolidChatterMessageBox.tsx +163 -0
- package/dist/components/core/chatter/SolidMessageComposer.tsx +146 -0
- package/dist/components/core/common/AvatarWidget.tsx +55 -0
- package/dist/components/core/common/DateFieldViewComponent.tsx +36 -0
- package/dist/components/core/common/FilterComponent.tsx +458 -0
- package/dist/components/core/common/LoadDynamicJsxComponent.tsx +70 -0
- package/dist/components/core/common/PDFViewer.tsx +117 -0
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx +89 -0
- package/dist/components/core/common/SolidAccountSettings/SolidChangePassword.tsx +188 -0
- package/dist/components/core/common/SolidAccountSettings/SolidNotifications.tsx +139 -0
- package/dist/components/core/common/SolidAccountSettings/SolidPersonalInfo.tsx +311 -0
- package/dist/components/core/common/SolidCreateButton.tsx +48 -0
- package/dist/components/core/common/SolidGenericImport/DocumentSvg.tsx +15 -0
- package/dist/components/core/common/SolidGenericImport/SolidGenericImport.tsx +64 -0
- package/dist/components/core/common/SolidGenericImport/SolidImportDropzone.tsx +125 -0
- package/dist/components/core/common/SolidGenericImport/SolidImportInstructions.tsx +122 -0
- package/dist/components/core/common/SolidGenericImport/SolidImportStepper.tsx +217 -0
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.tsx +205 -0
- package/dist/components/core/common/SolidGenericImport/SolidImportTransactionStatus.tsx +158 -0
- package/dist/components/core/common/SolidGenericImport/SolidImportWrapper.tsx +29 -0
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +1470 -0
- package/dist/components/core/common/SolidLayoutViews.tsx +87 -0
- package/dist/components/core/common/SolidListViewOptions.tsx +31 -0
- package/dist/components/core/common/SolidLoaders/SolidCircularLoader.tsx +7 -0
- package/dist/components/core/common/SolidPasswordHelperText.tsx +34 -0
- package/dist/components/core/common/SolidSaveCustomFilterForm.tsx +75 -0
- package/dist/components/core/common/SolidSearchBox.tsx +17 -0
- package/dist/components/core/common/SolidViewLayoutManager.ts +421 -0
- package/dist/components/core/common/SolidXAiIframe.tsx +77 -0
- package/dist/components/core/dashboard/SolidDashboard.tsx +332 -0
- package/dist/components/core/dashboard/SolidDashboardBody.tsx +117 -0
- package/dist/components/core/dashboard/SolidDashboardFilterRequired.tsx +28 -0
- package/dist/components/core/dashboard/SolidDashboardHeader.tsx +10 -0
- package/dist/components/core/dashboard/SolidDashboardLoading.tsx +55 -0
- package/dist/components/core/dashboard/SolidDashboardNotAvailable.tsx +32 -0
- package/dist/components/core/dashboard/SolidDashboardRenderError.tsx +29 -0
- package/dist/components/core/dashboard/SolidDashboardVariable.tsx +256 -0
- package/dist/components/core/dashboard/SolidQuestionRenderer.tsx +78 -0
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.tsx +18 -0
- package/dist/components/core/dashboard/chart-renderers/PrimeReactDatatableRenderer.tsx +54 -0
- package/dist/components/core/dashboard/chart-renderers/init-chartjs.ts +25 -0
- package/dist/components/core/dashboard/dashboard-utils.ts +39 -0
- package/dist/components/core/extension/solid-core/CustomIcon/StatusIcon.tsx +17 -0
- package/dist/components/core/extension/solid-core/dashboardQuestion/ChartFormPreviewWidget.tsx +36 -0
- package/dist/components/core/extension/solid-core/emailTemplate/emailFormTypeChangeHandler.ts +18 -0
- package/dist/components/core/extension/solid-core/emailTemplate/emailFormTypeLoad.ts +18 -0
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +114 -0
- package/dist/components/core/extension/solid-core/modelMetadata/list/GenerateModelCodeRowAction.tsx +213 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/DeleteModuleRowAction.tsx +138 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/GenerateModuleCodeRowAction.tsx +209 -0
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +131 -0
- package/dist/components/core/field/FieldListViewData.tsx +313 -0
- package/dist/components/core/filter/SolidBooleanFilterElement.tsx +30 -0
- package/dist/components/core/filter/SolidFilterFields.tsx +131 -0
- package/dist/components/core/filter/SolidManyToManyFilterElement.tsx +64 -0
- package/dist/components/core/filter/SolidManyToOneFilterElement.tsx +61 -0
- package/dist/components/core/filter/SolidSelectionDynamicFilterElement.tsx +50 -0
- package/dist/components/core/filter/SolidSelectionStaticFilterElement.tsx +32 -0
- package/dist/components/core/filter/SolidVarInputsFilterElement.tsx +209 -0
- package/dist/components/core/filter/fields/SolidBigintField.tsx +9 -0
- package/dist/components/core/filter/fields/SolidBooleanField.tsx +68 -0
- package/dist/components/core/filter/fields/SolidComputedField.tsx +23 -0
- package/dist/components/core/filter/fields/SolidDateField.tsx +63 -0
- package/dist/components/core/filter/fields/SolidDatetimeField.tsx +54 -0
- package/dist/components/core/filter/fields/SolidDecimalField.tsx +9 -0
- package/dist/components/core/filter/fields/SolidExternalIdField.tsx +52 -0
- package/dist/components/core/filter/fields/SolidFloatField.tsx +9 -0
- package/dist/components/core/filter/fields/SolidIdField.tsx +46 -0
- package/dist/components/core/filter/fields/SolidIntField.tsx +61 -0
- package/dist/components/core/filter/fields/SolidLongTextField.tsx +9 -0
- package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +60 -0
- package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +62 -0
- package/dist/components/core/filter/fields/SolidRelationField.tsx +17 -0
- package/dist/components/core/filter/fields/SolidRichTextField.tsx +9 -0
- package/dist/components/core/filter/fields/SolidSelectionDynamicField.tsx +52 -0
- package/dist/components/core/filter/fields/SolidSelectionStaticField.tsx +54 -0
- package/dist/components/core/filter/fields/SolidShortTextField.tsx +60 -0
- package/dist/components/core/filter/fields/SolidTimeField.tsx +48 -0
- package/dist/components/core/filter/fields/SolidUuidField.tsx +51 -0
- package/dist/components/core/filter/fields/relations/SolidRelationManyToManyField.tsx +62 -0
- package/dist/components/core/filter/fields/relations/SolidRelationManyToOneField.tsx +84 -0
- package/dist/components/core/form/SolidFormActionHeader.tsx +497 -0
- package/dist/components/core/form/SolidFormFieldRender.tsx +53 -0
- package/dist/components/core/form/SolidFormFieldRenderExtension.tsx +26 -0
- package/dist/components/core/form/SolidFormFooter.tsx +162 -0
- package/dist/components/core/form/SolidFormLayouts.tsx +104 -0
- package/dist/components/core/form/SolidFormUserViewLayout.tsx +84 -0
- package/dist/components/core/form/SolidFormView.tsx +1856 -0
- package/dist/components/core/form/SolidFormViewContextMenuHeaderButton.tsx +52 -0
- package/dist/components/core/form/SolidFormViewNormalHeaderButton.tsx +52 -0
- package/dist/components/core/form/SolidFormViewShimmerLoading.tsx +109 -0
- package/dist/components/core/form/fields/ISolidField.tsx +71 -0
- package/dist/components/core/form/fields/SolidBooleanField.tsx +434 -0
- package/dist/components/core/form/fields/SolidDateField.tsx +247 -0
- package/dist/components/core/form/fields/SolidDateTimeField.tsx +229 -0
- package/dist/components/core/form/fields/SolidDecimalField.tsx +171 -0
- package/dist/components/core/form/fields/SolidEmailField.tsx +176 -0
- package/dist/components/core/form/fields/SolidIntegerField.tsx +282 -0
- package/dist/components/core/form/fields/SolidJsonField.tsx +185 -0
- package/dist/components/core/form/fields/SolidLongTextField.tsx +618 -0
- package/dist/components/core/form/fields/SolidMediaMultipleField.tsx +663 -0
- package/dist/components/core/form/fields/SolidMediaSingleField.tsx +547 -0
- package/dist/components/core/form/fields/SolidPasswordField.tsx +390 -0
- package/dist/components/core/form/fields/SolidRelationField.tsx +56 -0
- package/dist/components/core/form/fields/SolidRichTextField.tsx +188 -0
- package/dist/components/core/form/fields/SolidSelectionDynamicField.tsx +340 -0
- package/dist/components/core/form/fields/SolidSelectionStaticField.tsx +462 -0
- package/dist/components/core/form/fields/SolidShortTextField.tsx +399 -0
- package/dist/components/core/form/fields/SolidTimeField.tsx +245 -0
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +453 -0
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +1036 -0
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +627 -0
- package/dist/components/core/form/fields/relations/widgets/helpers/InlineRelationEntityDialog.tsx +38 -0
- package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts +64 -0
- package/dist/components/core/form/fields/widgets/SolidAiInteractionMessageFieldFormWidget.tsx +135 -0
- package/dist/components/core/form/fields/widgets/SolidAiInteractionMetadataFieldFormWidget.tsx +144 -0
- package/dist/components/core/form/fields/widgets/SolidIconEditWidget.tsx +265 -0
- package/dist/components/core/form/fields/widgets/SolidIconViewWidget.tsx +32 -0
- package/dist/components/core/form/fields/widgets/SolidRelationFieldAvatarFormWidget.tsx +50 -0
- package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx +222 -0
- package/dist/components/core/form/fields/widgets/SolidShortTextFieldAvatarWidget.tsx +70 -0
- package/dist/components/core/form/widgets/CustomHtml.tsx +20 -0
- package/dist/components/core/kanban/KanbanBoard.tsx +150 -0
- package/dist/components/core/kanban/KanbanCard.tsx +279 -0
- package/dist/components/core/kanban/KanbanColumn.tsx +139 -0
- package/dist/components/core/kanban/KanbanUserViewLayout.tsx +84 -0
- package/dist/components/core/kanban/SolidKanbanView.tsx +894 -0
- package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +154 -0
- package/dist/components/core/kanban/SolidKanbanViewFields.tsx +164 -0
- package/dist/components/core/kanban/SolidManyToOneFilterElement.tsx +59 -0
- package/dist/components/core/kanban/SolidSelectionDynamicFilterElement.tsx +50 -0
- package/dist/components/core/kanban/SolidSelectionStaticFilterElement.tsx +32 -0
- package/dist/components/core/kanban/SolidVarInputsFilterElement.tsx +184 -0
- package/dist/components/core/kanban/kanban-fields/SolidBigintKanbanField.tsx +9 -0
- package/dist/components/core/kanban/kanban-fields/SolidBooleanKanbanField.tsx +16 -0
- package/dist/components/core/kanban/kanban-fields/SolidComputedKanbanField.tsx +23 -0
- package/dist/components/core/kanban/kanban-fields/SolidDateKanbanField.tsx +14 -0
- package/dist/components/core/kanban/kanban-fields/SolidDatetimeKanbanField.tsx +13 -0
- package/dist/components/core/kanban/kanban-fields/SolidDecimalKanbanField.tsx +9 -0
- package/dist/components/core/kanban/kanban-fields/SolidExternalIdKanbanField.tsx +12 -0
- package/dist/components/core/kanban/kanban-fields/SolidFloatKanbanField.tsx +9 -0
- package/dist/components/core/kanban/kanban-fields/SolidIdKanbanField.tsx +14 -0
- package/dist/components/core/kanban/kanban-fields/SolidIntKanbanField.tsx +20 -0
- package/dist/components/core/kanban/kanban-fields/SolidLongTextKanbanField.tsx +9 -0
- package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.tsx +140 -0
- package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +164 -0
- package/dist/components/core/kanban/kanban-fields/SolidRelationKanbanField.tsx +13 -0
- package/dist/components/core/kanban/kanban-fields/SolidRichTextKanbanField.tsx +9 -0
- package/dist/components/core/kanban/kanban-fields/SolidSelectionDynamicKanbanField.tsx +14 -0
- package/dist/components/core/kanban/kanban-fields/SolidSelectionStaticKanbanField.tsx +14 -0
- package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +121 -0
- package/dist/components/core/kanban/kanban-fields/SolidTimeKanbanField.tsx +12 -0
- package/dist/components/core/kanban/kanban-fields/SolidUuidKanbanField.tsx +13 -0
- package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.tsx +16 -0
- package/dist/components/core/list/ListViewRowActionPopup.tsx +41 -0
- package/dist/components/core/list/SolidColumnSelector/SolidListColumnSelector.tsx +242 -0
- package/dist/components/core/list/SolidEmptyListViewPlaceholder.tsx +111 -0
- package/dist/components/core/list/SolidListView.tsx +2007 -0
- package/dist/components/core/list/SolidListViewColumn.tsx +165 -0
- package/dist/components/core/list/SolidListViewConfigure.tsx +339 -0
- package/dist/components/core/list/SolidListViewHeaderButton.tsx +31 -0
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +30 -0
- package/dist/components/core/list/SolidListViewRowButtonContextMenu.tsx +41 -0
- package/dist/components/core/list/SolidListViewShimmerLoading.tsx +78 -0
- package/dist/components/core/list/SolidListingHeader.tsx +42 -0
- package/dist/components/core/list/SolidManyToOneFilterElement.tsx +60 -0
- package/dist/components/core/list/SolidSelectionDynamicFilterElement.tsx +50 -0
- package/dist/components/core/list/SolidSelectionStaticFilterElement.tsx +32 -0
- package/dist/components/core/list/SolidTableRowCell.tsx +35 -0
- package/dist/components/core/list/SolidVarInputsFilterElement.tsx +184 -0
- package/dist/components/core/list/columns/SolidBigintColumn.tsx +9 -0
- package/dist/components/core/list/columns/SolidBooleanColumn.tsx +90 -0
- package/dist/components/core/list/columns/SolidComputedColumn.tsx +27 -0
- package/dist/components/core/list/columns/SolidDateColumn.tsx +90 -0
- package/dist/components/core/list/columns/SolidDatetimeColumn.tsx +79 -0
- package/dist/components/core/list/columns/SolidDecimalColumn.tsx +9 -0
- package/dist/components/core/list/columns/SolidExternalIdColumn.tsx +80 -0
- package/dist/components/core/list/columns/SolidFloatColumn.tsx +9 -0
- package/dist/components/core/list/columns/SolidIdColumn.tsx +79 -0
- package/dist/components/core/list/columns/SolidIntColumn.tsx +87 -0
- package/dist/components/core/list/columns/SolidLongTextColumn.tsx +9 -0
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +301 -0
- package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +170 -0
- package/dist/components/core/list/columns/SolidRelationColumn.tsx +21 -0
- package/dist/components/core/list/columns/SolidRichTextColumn.tsx +9 -0
- package/dist/components/core/list/columns/SolidSelectionDynamicColumn.tsx +80 -0
- package/dist/components/core/list/columns/SolidSelectionStaticColumn.tsx +81 -0
- package/dist/components/core/list/columns/SolidShortTextColumn.tsx +160 -0
- package/dist/components/core/list/columns/SolidTimeColumn.tsx +78 -0
- package/dist/components/core/list/columns/SolidUuidColumn.tsx +79 -0
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.tsx +106 -0
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +117 -0
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.tsx +110 -0
- package/dist/components/core/list/widgets/SolidManyToManyRelationAvatarListWidget.tsx +30 -0
- package/dist/components/core/list/widgets/SolidManyToOneRelationAvatarListWidget.tsx +30 -0
- package/dist/components/core/list/widgets/SolidShortTextAvatarWidget.tsx +70 -0
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.tsx +21 -0
- package/dist/components/core/locales/SolidChatterLocaleTabView.tsx +91 -0
- package/dist/components/core/locales/SolidLocale.tsx +127 -0
- package/dist/components/core/model/CreateModel.tsx +495 -0
- package/dist/components/core/model/FieldMetaData.tsx +263 -0
- package/dist/components/core/model/FieldMetaDataForm.tsx +3509 -0
- package/dist/components/core/model/FieldSelector.tsx +62 -0
- package/dist/components/core/model/ModelListViewData.tsx +384 -0
- package/dist/components/core/model/ModelMetaData.tsx +921 -0
- package/dist/components/core/module/CreateModule.tsx +617 -0
- package/dist/components/core/module/ModuleListViewData.tsx +431 -0
- package/dist/components/core/solid-ai/SolidAiMainWrapper.tsx +8 -0
- package/dist/components/core/solid-ai/SolidXAIIcon.tsx +37 -0
- package/dist/components/core/users/CreateUser.tsx +467 -0
- package/dist/components/core/users/CreateUserRole.tsx +212 -0
- package/dist/components/core/users/UserListView.tsx +376 -0
- package/dist/components/layout/AdminLayout.tsx +57 -0
- package/dist/components/layout/AdminSidebar.tsx +65 -0
- package/dist/components/layout/AppConfig.tsx +104 -0
- package/dist/components/layout/AppSidebar.tsx +232 -0
- package/dist/components/layout/ButtonLoader.tsx +7 -0
- package/dist/components/layout/CustomPagination.tsx +55 -0
- package/dist/components/layout/DashboardHeader.tsx +89 -0
- package/dist/components/layout/FilterMenu.tsx +122 -0
- package/dist/components/layout/Footer.tsx +13 -0
- package/dist/components/layout/GlobalSearch.tsx +37 -0
- package/dist/components/layout/Header.tsx +8 -0
- package/dist/components/layout/Layout.tsx +205 -0
- package/dist/components/layout/ListingHeader.tsx +204 -0
- package/dist/components/layout/Loader.tsx +16 -0
- package/dist/components/layout/UserSidebar.tsx +53 -0
- package/dist/components/layout/context/layoutcontext.tsx +52 -0
- package/dist/components/layout/navbar-one.tsx +258 -0
- package/dist/components/layout/navbar-two-menu.tsx +72 -0
- package/dist/components/layout/navbar-two.tsx +37 -0
- package/dist/components/layout/user-profile-menu.tsx +213 -0
- package/dist/components/layout/user-profile.tsx +7 -0
- package/dist/components/modelsComponents/filterIcon.tsx +9 -0
- package/dist/constants/error-messages.ts +238 -0
- package/dist/declarations.d.ts +22 -0
- package/dist/helpers/AppTitle.tsx +12 -0
- package/dist/helpers/ToastContainer.tsx +94 -0
- package/dist/helpers/autoCompleteVirtualScroll.ts +41 -0
- package/dist/helpers/countries.tsx +260 -0
- package/dist/helpers/downloadFileWithProgress.ts +91 -0
- package/dist/helpers/downloadMediaFile.tsx +21 -0
- package/dist/helpers/getAcceptedFileTypes.tsx +22 -0
- package/dist/helpers/getRandomColors.tsx +68 -0
- package/dist/helpers/helpers.ts +61 -0
- package/dist/helpers/hydrateRelationRules.ts +120 -0
- package/dist/helpers/permissions.ts +7 -0
- package/dist/helpers/registry.ts +337 -0
- package/dist/helpers/resendOtpHelper.tsx +5 -0
- package/dist/helpers/revalidate.ts +7 -0
- package/dist/helpers/rolesHelper.ts +17 -0
- package/dist/helpers/solidIcons.tsx +1831 -0
- package/dist/helpers/updatePasswordField.ts +41 -0
- package/dist/index.ts +421 -0
- package/dist/nextAuth/authProviders.d.ts.map +1 -1
- package/dist/nextAuth/authProviders.js +6 -5
- package/dist/nextAuth/authProviders.js.map +1 -1
- package/dist/nextAuth/authProviders.tsx +232 -0
- package/dist/nextAuth/handleLogout.tsx +39 -0
- package/dist/nextAuth/refreshAccessToken.tsx +28 -0
- package/dist/redux/api/aiInteractionApi.ts +59 -0
- package/dist/redux/api/authApi.ts +131 -0
- package/dist/redux/api/dashboardApi.ts +56 -0
- package/dist/redux/api/dashboardQuestionApi.ts +17 -0
- package/dist/redux/api/exportTemplateApi.tsx +59 -0
- package/dist/redux/api/fetchBaseQuery.tsx +118 -0
- package/dist/redux/api/fieldApi.ts +86 -0
- package/dist/redux/api/importTransactionApi.tsx +69 -0
- package/dist/redux/api/mediaApi.ts +55 -0
- package/dist/redux/api/mediaStorageProviderApi.ts +55 -0
- package/dist/redux/api/modelApi.ts +80 -0
- package/dist/redux/api/moduleApi.ts +72 -0
- package/dist/redux/api/permissionApi.ts +32 -0
- package/dist/redux/api/pincodeApi.tsx +56 -0
- package/dist/redux/api/roleApi.ts +58 -0
- package/dist/redux/api/solidActionApi.ts +66 -0
- package/dist/redux/api/solidChatterMessageApi.ts +25 -0
- package/dist/redux/api/solidEntityApi.tsx +164 -0
- package/dist/redux/api/solidMenuApi.ts +71 -0
- package/dist/redux/api/solidServiceApi.ts +31 -0
- package/dist/redux/api/solidSettingsApi.tsx +83 -0
- package/dist/redux/api/solidViewApi.ts +73 -0
- package/dist/redux/api/stateApi.tsx +56 -0
- package/dist/redux/api/testApi.ts +21 -0
- package/dist/redux/api/userApi.ts +135 -0
- package/dist/redux/features/authSlice.ts +19 -0
- package/dist/redux/features/dataViewSlice.ts +26 -0
- package/dist/redux/features/navbarSlice.ts +21 -0
- package/dist/redux/features/popupSlice.ts +37 -0
- package/dist/redux/features/settingsSlice.ts +60 -0
- package/dist/redux/features/themeSlice.ts +17 -0
- package/dist/redux/features/userSlice.ts +28 -0
- package/dist/redux/hooks/useSolidPopup.ts +20 -0
- package/dist/redux/store/defaultStoreConfig.ts +62 -0
- package/dist/styles.ts +4 -0
- package/dist/types/handlebars.d.ts +4 -0
- package/dist/types/index.d.ts +76 -0
- package/dist/types/layout.d.ts +94 -0
- package/dist/types/next-auth.d.ts +0 -0
- package/dist/types/next.d.ts +46 -0
- package/dist/types/solid-core.d.ts +320 -0
- package/package.json +1 -1
- package/src/components/auth/SolidLogin.tsx +26 -13
- package/src/nextAuth/authProviders.tsx +9 -5
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
2
|
+
|
|
3
|
+
interface SolidXAiIframeProps {
|
|
4
|
+
url: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const SolidXAiIframe: React.FC<SolidXAiIframeProps> = ({ url }) => {
|
|
8
|
+
const [reachable, setReachable] = useState<boolean | null>(null);
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const handler = (event:any) => {
|
|
13
|
+
if (event.data?.action === "REFRESH_PARENT") {
|
|
14
|
+
window.location.reload();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
window.addEventListener("message", handler);
|
|
19
|
+
return () => window.removeEventListener("message", handler);
|
|
20
|
+
}, []);
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const checkServer = async () => {
|
|
26
|
+
try {
|
|
27
|
+
// Try to fetch the page HEAD (fast, no content)
|
|
28
|
+
const res = await fetch(url, { method: "HEAD" });
|
|
29
|
+
|
|
30
|
+
if (res.ok) {
|
|
31
|
+
setReachable(true);
|
|
32
|
+
} else {
|
|
33
|
+
setReachable(false);
|
|
34
|
+
}
|
|
35
|
+
} catch (err) {
|
|
36
|
+
setReachable(false);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
checkServer();
|
|
41
|
+
}, [url]);
|
|
42
|
+
|
|
43
|
+
// Loading state
|
|
44
|
+
if (reachable === null) {
|
|
45
|
+
return (
|
|
46
|
+
<div className="flex items-center justify-center h-full text-gray-600">
|
|
47
|
+
Checking SolidX AI server...
|
|
48
|
+
</div>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Error state
|
|
53
|
+
if (reachable === false) {
|
|
54
|
+
return (
|
|
55
|
+
<div className="flex items-center justify-center align-items-center h-full text-center p-4 overflow-x-auto ">
|
|
56
|
+
<h3>Mcp Server not reachable. <br></br>
|
|
57
|
+
<span className="opacity-60 mt-2">
|
|
58
|
+
<strong>{url}</strong>
|
|
59
|
+
</span>
|
|
60
|
+
</h3>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
// SUCCESS → load iframe
|
|
65
|
+
return (
|
|
66
|
+
<iframe
|
|
67
|
+
src={url}
|
|
68
|
+
style={{
|
|
69
|
+
width: "100%",
|
|
70
|
+
height: "100%",
|
|
71
|
+
border: "none",
|
|
72
|
+
}}
|
|
73
|
+
allow="clipboard-write; clipboard-read"
|
|
74
|
+
title="SolidX AI JSON Viewer"
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
};
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { DashboardResponse, useGetDashboardQuery } from '../../../redux/api/dashboardApi';
|
|
3
|
+
import { SqlExpression } from '../../../types/solid-core';
|
|
4
|
+
import { Button } from 'primereact/button';
|
|
5
|
+
import { Tooltip } from "primereact/tooltip";
|
|
6
|
+
import qs from 'qs';
|
|
7
|
+
import { Dispatch, SetStateAction, useEffect, useState } from 'react';
|
|
8
|
+
import { SolidXAIIcon } from '../solid-ai/SolidXAIIcon';
|
|
9
|
+
import styles from './SolidDashboard.module.css';
|
|
10
|
+
import SolidDashboardBody from './SolidDashboardBody';
|
|
11
|
+
import SolidDashboardVariable from './SolidDashboardVariable';
|
|
12
|
+
import { SolidAiMainWrapper } from '../solid-ai/SolidAiMainWrapper';
|
|
13
|
+
import { SolidDashboardFilterRequired } from './SolidDashboardFilterRequired';
|
|
14
|
+
import { SolidDashboardLoading } from './SolidDashboardLoading';
|
|
15
|
+
import { SolidDashboardRenderError } from './SolidDashboardRenderError';
|
|
16
|
+
import { useDispatch, useSelector } from "react-redux";
|
|
17
|
+
import { showNavbar, toggleNavbar } from "../../../redux/features/navbarSlice";
|
|
18
|
+
import SolidDashboardNotAvailable from './SolidDashboardNotAvailable';
|
|
19
|
+
import { useLazyGetMcpUrlQuery, useLazyGetSolidSettingsQuery } from '../../../redux/api/solidSettingsApi';
|
|
20
|
+
|
|
21
|
+
export enum DashboardVariableType {
|
|
22
|
+
DATE = 'date',
|
|
23
|
+
SELECTION_STATIC = 'selectionStatic',
|
|
24
|
+
SELECTION_DYNAMIC = 'selectionDynamic',
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
enum SOURCE_TYPE {
|
|
28
|
+
SQL = 'sql',
|
|
29
|
+
PROVIDER = 'provider',
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface DashboardVariableRecord {
|
|
33
|
+
id: number;
|
|
34
|
+
variableName: string;
|
|
35
|
+
variableType: DashboardVariableType;
|
|
36
|
+
selectionStaticValues?: string[];
|
|
37
|
+
selectionDynamicSourceType?: SOURCE_TYPE;
|
|
38
|
+
selectionDynamicProviderName?: string;
|
|
39
|
+
selectionDynamicSQL?: string;
|
|
40
|
+
isMultiSelect?: boolean;
|
|
41
|
+
defaultValue?: string;
|
|
42
|
+
defaultOperator?: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function handleDashboardData(
|
|
46
|
+
data: DashboardResponse,
|
|
47
|
+
setDashboardVariables: Dispatch<SetStateAction<DashboardVariableRecord[]>>,
|
|
48
|
+
setQuestions: Dispatch<SetStateAction<any[]>>,
|
|
49
|
+
) {
|
|
50
|
+
const { records, meta } = data;
|
|
51
|
+
if (records && records.length > 0) {
|
|
52
|
+
// Set the layout options for the dashboard body
|
|
53
|
+
const dashboardData = records[0]; // Assuming we want the first dashboard
|
|
54
|
+
|
|
55
|
+
// Set the dashboard variables
|
|
56
|
+
setDashboardVariables(dashboardData.dashboardVariables || []);
|
|
57
|
+
|
|
58
|
+
// Set the dashboard questions
|
|
59
|
+
setQuestions(dashboardData.questions)
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function getQueryParams(moduleName: string, dashboardId?: number, dashboardName?: string) {
|
|
65
|
+
const filters: any = {
|
|
66
|
+
module: {
|
|
67
|
+
name: {
|
|
68
|
+
$eq: moduleName
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
if (dashboardId !== undefined) {
|
|
74
|
+
filters.id = { $eq: dashboardId };
|
|
75
|
+
} else if (dashboardName !== undefined) {
|
|
76
|
+
filters.name = { $eq: dashboardName };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const query = {
|
|
80
|
+
filters,
|
|
81
|
+
populate: ['dashboardVariables', 'questions']
|
|
82
|
+
};
|
|
83
|
+
const urlQuery = qs.stringify(query, {
|
|
84
|
+
encodeValuesOnly: true,
|
|
85
|
+
});
|
|
86
|
+
return urlQuery;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Render the dashboard body only if:
|
|
90
|
+
// 1. There are dashboard questions
|
|
91
|
+
// AND
|
|
92
|
+
// (
|
|
93
|
+
// 1. There are dashboard variables and all dashboard variable filter rules have been applied i.e (all dashboard variables have been selected)
|
|
94
|
+
//. OR
|
|
95
|
+
// 2. There are no dashboard variables
|
|
96
|
+
// )
|
|
97
|
+
//
|
|
98
|
+
function isRenderDashboardBody(questions: any[], dashboardVariables: DashboardVariableRecord[], filters: SqlExpression[]) {
|
|
99
|
+
if (questions.length === 0) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (dashboardVariables.length === 0) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Check if all dashboard variables have corresponding filters applied
|
|
108
|
+
const allVariablesFiltered = dashboardVariables.every(variable =>
|
|
109
|
+
filters.some(filter => filter.variableName === variable.variableName)
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
return allVariablesFiltered;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
type SolidDashboardViewProps = {
|
|
116
|
+
moduleName: string;
|
|
117
|
+
dashboardId?: number;
|
|
118
|
+
dashboardName?: string;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const SolidDashboard = (params: SolidDashboardViewProps) => {
|
|
122
|
+
const { data, isLoading, error } = useGetDashboardQuery(getQueryParams(params.moduleName, params.dashboardId, params.dashboardName)) // FIXME : error handling should be done properly
|
|
123
|
+
// Define a state called layoutOption and pass it after destructing the widgetOptions and dashboardOptions from layoutOption
|
|
124
|
+
// TODO [HP]: Shouldn't the type of this state variable be something different? Why are we muddling this with layout but calling it body props?
|
|
125
|
+
// TODO [HP]: Body props should be clearly made up of Gridstack layout options, the questions that make up the body & the filter[] which is an array of SqlExpressions
|
|
126
|
+
// TODO [HP]: This is fully CONFUSED
|
|
127
|
+
// const [layoutOption, setLayoutOption] = useState<SolidDashboardBodyProps>({
|
|
128
|
+
// filters: [],
|
|
129
|
+
// questions: [],
|
|
130
|
+
// });
|
|
131
|
+
|
|
132
|
+
// TODO [HP]: replace dashboardVariableFilterRules with filters everywhere...
|
|
133
|
+
// const [dashboardVariableFilterRules, setDashboardVariableFilterRules] = useState<ISolidDashboardVariableFilterRule[]>([]);
|
|
134
|
+
const dispatch = useDispatch();
|
|
135
|
+
const visibleNavbar = useSelector((state: any) => state.navbarState?.visibleNavbar);
|
|
136
|
+
const [filters, setFilters] = useState<SqlExpression[]>([]);
|
|
137
|
+
const [isOpenSolidXAiPanel, setIsOpenSolidXAiPanel] = useState(false);
|
|
138
|
+
const [chatterWidth, setChatterWidth] = useState(380);
|
|
139
|
+
const [isResizing, setIsResizing] = useState(false);
|
|
140
|
+
const [questions, setQuestions] = useState<any[]>([]);
|
|
141
|
+
const [dashboardVariables, setDashboardVariables] = useState<DashboardVariableRecord[]>([]);
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
// Invoke the dashboard api to fetch the dashboard data
|
|
146
|
+
// console.log('Dashboard Data testing:', isLoading, data, error);
|
|
147
|
+
if (!isLoading && data) {
|
|
148
|
+
// Assuming data contains the layout options
|
|
149
|
+
handleDashboardData(data, setDashboardVariables, setQuestions);
|
|
150
|
+
}
|
|
151
|
+
}, [isLoading, data]);
|
|
152
|
+
|
|
153
|
+
useEffect(() => {
|
|
154
|
+
const storedOpen = localStorage.getItem('d_solidxai_open');
|
|
155
|
+
const storedWidth = localStorage.getItem('d_solidxai_width');
|
|
156
|
+
|
|
157
|
+
if (storedOpen !== null) {
|
|
158
|
+
setIsOpenSolidXAiPanel(storedOpen === 'true');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (storedWidth !== null) {
|
|
162
|
+
const width = parseInt(storedWidth, 10);
|
|
163
|
+
if (!isNaN(width)) {
|
|
164
|
+
setChatterWidth(width);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}, []);
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (isResizing) {
|
|
172
|
+
const handleMouseMove = (e: MouseEvent) => {
|
|
173
|
+
const newWidth = window.innerWidth - e.clientX;
|
|
174
|
+
const clampedWidth = Math.max(280, Math.min(newWidth, 700));
|
|
175
|
+
setChatterWidth(clampedWidth);
|
|
176
|
+
localStorage.setItem('d_solidxai_width', clampedWidth.toString());
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const handleMouseUp = () => {
|
|
180
|
+
setIsResizing(false);
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
window.addEventListener('mousemove', handleMouseMove);
|
|
184
|
+
window.addEventListener('mouseup', handleMouseUp);
|
|
185
|
+
|
|
186
|
+
return () => {
|
|
187
|
+
window.removeEventListener('mousemove', handleMouseMove);
|
|
188
|
+
window.removeEventListener('mouseup', handleMouseUp);
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}, [isResizing]);
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
const handleOpen = () => {
|
|
195
|
+
setIsOpenSolidXAiPanel(true);
|
|
196
|
+
localStorage.setItem('d_solidxai_open', 'true');
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const handleClose = () => {
|
|
200
|
+
setIsOpenSolidXAiPanel(false);
|
|
201
|
+
localStorage.setItem('d_solidxai_open', 'false');
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const toggleBothSidebars = () => {
|
|
205
|
+
if (visibleNavbar) {
|
|
206
|
+
dispatch(toggleNavbar()); // close both
|
|
207
|
+
} else {
|
|
208
|
+
dispatch(showNavbar()); // open both
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
const [mcpUrl, setMcpUrl] = useState<string | null>(null);
|
|
215
|
+
const [getMcpUrl] = useLazyGetMcpUrlQuery();
|
|
216
|
+
|
|
217
|
+
const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();
|
|
218
|
+
useEffect(() => {
|
|
219
|
+
trigger("") // Fetch settings on mount
|
|
220
|
+
}, [])
|
|
221
|
+
|
|
222
|
+
useEffect(() => {
|
|
223
|
+
if (solidSettingsData?.data?.mcpEnabled && solidSettingsData?.data?.mcpServerUrl) {
|
|
224
|
+
enableSolidXAiPanel();
|
|
225
|
+
}
|
|
226
|
+
}, [solidSettingsData]);
|
|
227
|
+
|
|
228
|
+
const enableSolidXAiPanel = async () => {
|
|
229
|
+
try {
|
|
230
|
+
const queryData = {
|
|
231
|
+
showHeader: "true",
|
|
232
|
+
inListView: "true"
|
|
233
|
+
};
|
|
234
|
+
const queryString = qs.stringify({ ...queryData }, { encodeValuesOnly: true });
|
|
235
|
+
const response = await getMcpUrl(queryString).unwrap();
|
|
236
|
+
console.log("response", response);
|
|
237
|
+
if (response && response?.data?.mcpUrl) {
|
|
238
|
+
setMcpUrl(response?.data?.mcpUrl);
|
|
239
|
+
}
|
|
240
|
+
} catch (error) {
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
return (
|
|
247
|
+
<div className={`h-screen surface-0 flex`}>
|
|
248
|
+
<div className={`h-full flex-grow-1 ${styles.SolidDashboardPageContentWrapper}`}>
|
|
249
|
+
{isLoading && <SolidDashboardLoading />}
|
|
250
|
+
{error && <SolidDashboardRenderError />}
|
|
251
|
+
{!isLoading && !error && data && data.records.length === 0 && (
|
|
252
|
+
<SolidDashboardNotAvailable />
|
|
253
|
+
)}
|
|
254
|
+
{!isLoading && !error && data && data.records.length > 0 && (
|
|
255
|
+
<>
|
|
256
|
+
<div className="page-header" style={{ borderBottom: '1px solid var(--primary-light-color)' }}>
|
|
257
|
+
<div className='flex align-items-center gap-2'>
|
|
258
|
+
<div className="apps-icon block md:hidden cursor-pointer" onClick={toggleBothSidebars}>
|
|
259
|
+
<i className="pi pi-th-large"></i>
|
|
260
|
+
</div>
|
|
261
|
+
<p className={`view-title solid-text-wrapper flex align-items-center gap-1 ${styles.SolidDashboardTitle}`}>
|
|
262
|
+
{data?.records[0]?.displayName ? data?.records[0]?.displayName : data?.records[0]?.name}
|
|
263
|
+
{data?.records[0]?.description &&
|
|
264
|
+
<>
|
|
265
|
+
<Tooltip className='solid-field-tooltip' target=".solid-field-tooltip-icon" />
|
|
266
|
+
<i className="pi pi-info-circle solid-field-tooltip-icon"
|
|
267
|
+
data-pr-tooltip={data?.records[0]?.description}
|
|
268
|
+
data-pr-position={'right'}
|
|
269
|
+
/>
|
|
270
|
+
</>
|
|
271
|
+
}
|
|
272
|
+
</p>
|
|
273
|
+
</div>
|
|
274
|
+
{dashboardVariables && dashboardVariables.length > 0 && <SolidDashboardVariable dashboardVariables={dashboardVariables} filters={filters} setFilters={setFilters} />}
|
|
275
|
+
</div>
|
|
276
|
+
{!isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardFilterRequired />}
|
|
277
|
+
{isRenderDashboardBody(questions, dashboardVariables, filters) && <SolidDashboardBody questions={questions} filters={filters} />}
|
|
278
|
+
</>
|
|
279
|
+
)}
|
|
280
|
+
</div>
|
|
281
|
+
{mcpUrl && (
|
|
282
|
+
<div className={`chatter-section ${isOpenSolidXAiPanel === false ? 'collapsed' : 'open'}`} style={{ width: chatterWidth }}>
|
|
283
|
+
{isOpenSolidXAiPanel && (
|
|
284
|
+
<div
|
|
285
|
+
style={{
|
|
286
|
+
width: 5,
|
|
287
|
+
cursor: 'col-resize',
|
|
288
|
+
position: 'absolute',
|
|
289
|
+
left: 0,
|
|
290
|
+
top: 0,
|
|
291
|
+
bottom: 0,
|
|
292
|
+
height: '100%',
|
|
293
|
+
zIndex: 9,
|
|
294
|
+
}}
|
|
295
|
+
onMouseDown={() => setIsResizing(true)}
|
|
296
|
+
/>
|
|
297
|
+
)}
|
|
298
|
+
{isOpenSolidXAiPanel &&
|
|
299
|
+
<Button
|
|
300
|
+
icon="pi pi-angle-double-right"
|
|
301
|
+
size="small"
|
|
302
|
+
text
|
|
303
|
+
className="chatter-collapse-btn"
|
|
304
|
+
style={{ width: 30, height: 30, aspectRatio: '1/1' }}
|
|
305
|
+
onClick={handleClose}
|
|
306
|
+
/>
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
{isOpenSolidXAiPanel === false ?
|
|
310
|
+
<div className="flex flex-column gap-2 justify-content-center p-2">
|
|
311
|
+
<div className="chatter-collapsed-content" onClick={handleOpen}>
|
|
312
|
+
<div className="flex gap-2"> <SolidXAIIcon /> SolidX AI </div>
|
|
313
|
+
</div>
|
|
314
|
+
<Button
|
|
315
|
+
icon="pi pi-chevron-left"
|
|
316
|
+
size="small"
|
|
317
|
+
className="px-0"
|
|
318
|
+
style={{ width: 30 }}
|
|
319
|
+
onClick={handleOpen}
|
|
320
|
+
/>
|
|
321
|
+
</div>
|
|
322
|
+
:
|
|
323
|
+
<SolidAiMainWrapper mcpUrl={mcpUrl} />
|
|
324
|
+
}
|
|
325
|
+
</div>
|
|
326
|
+
)}
|
|
327
|
+
|
|
328
|
+
</div>
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
export default SolidDashboard;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import 'gridstack/dist/gridstack.min.css';
|
|
3
|
+
import { GridStackOptions, GridStackWidget } from 'gridstack';
|
|
4
|
+
import styles from './SolidDashboard.module.css'
|
|
5
|
+
import { SolidQuestionRenderer } from './SolidQuestionRenderer';
|
|
6
|
+
import { SqlExpression } from '../../../types/solid-core';
|
|
7
|
+
import PrimeReactDatatableRenderer from './chart-renderers/PrimeReactDatatableRenderer';
|
|
8
|
+
import { useGetDashboardQuestionDataByIdQuery } from '../../../redux/api/dashboardQuestionApi';
|
|
9
|
+
import qs from 'qs';
|
|
10
|
+
import { ProgressSpinner } from 'primereact/progressspinner';
|
|
11
|
+
|
|
12
|
+
export interface SolidDashboardBodyProps {
|
|
13
|
+
dashboardOptions?: GridStackOptions;
|
|
14
|
+
widgetOptions?: GridStackWidget[];
|
|
15
|
+
// Replace `any` with a proper `Question` type when available
|
|
16
|
+
questions: any[];
|
|
17
|
+
filters: SqlExpression[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const SolidDashboardBody = ({ questions, filters = [] }: SolidDashboardBodyProps) => {
|
|
21
|
+
// const gridRef = useRef<HTMLDivElement>(null);
|
|
22
|
+
|
|
23
|
+
// useEffect(() => {
|
|
24
|
+
// if (!gridRef.current) return;
|
|
25
|
+
|
|
26
|
+
// // Initialize Gridstack on the specific ref
|
|
27
|
+
// const grid = GridStack.init(dashboardOptions || {}, gridRef.current);
|
|
28
|
+
|
|
29
|
+
// // Load widgets if provided
|
|
30
|
+
// if (widgetOptions && widgetOptions.length > 0) {
|
|
31
|
+
// grid.load(
|
|
32
|
+
// widgetOptions.map((widget) => ({
|
|
33
|
+
// ...widget,
|
|
34
|
+
// content: `${widget.content ?? 'Widget'}`,
|
|
35
|
+
// }))
|
|
36
|
+
// );
|
|
37
|
+
// }
|
|
38
|
+
|
|
39
|
+
// // Cleanup on unmount
|
|
40
|
+
// return () => {
|
|
41
|
+
// grid.destroy(false);
|
|
42
|
+
// };
|
|
43
|
+
// }, [dashboardOptions, widgetOptions]);
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
// Fallback sequencing
|
|
47
|
+
const questionsWithDefaultIndex = questions.map((q, index) => ({
|
|
48
|
+
...q,
|
|
49
|
+
defaultIndex: index + 1,
|
|
50
|
+
}));
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
const sortedQuestions = [...questionsWithDefaultIndex].sort((a, b) => {
|
|
54
|
+
const aSeq = a.sequenceNumber ?? a.defaultIndex;
|
|
55
|
+
const bSeq = b.sequenceNumber ?? b.defaultIndex;
|
|
56
|
+
return aSeq - bSeq;
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
<div className={`p-4 overflow-y-auto ${styles.SolidDashboardContentWrapper}`}>
|
|
62
|
+
{/* <div className="grid-stack" ref={gridRef}></div> */}
|
|
63
|
+
<div className='grid'>
|
|
64
|
+
{/* {questions && questions.map((question: any) => {
|
|
65
|
+
return (
|
|
66
|
+
<div className='col-4 p-3'>
|
|
67
|
+
<SolidQuestionRenderer question={question} filters={filters} key={question.id} isPreview={false} />
|
|
68
|
+
</div>
|
|
69
|
+
)
|
|
70
|
+
})} */}
|
|
71
|
+
{sortedQuestions
|
|
72
|
+
.filter((question: any) => question.visualisedAs !== 'prime-datatable')
|
|
73
|
+
.map((question: any) => (
|
|
74
|
+
<div className="col-4 p-3" key={question.id}>
|
|
75
|
+
<SolidQuestionRenderer
|
|
76
|
+
question={question}
|
|
77
|
+
filters={filters}
|
|
78
|
+
isPreview={false}
|
|
79
|
+
/>
|
|
80
|
+
</div>
|
|
81
|
+
))}
|
|
82
|
+
|
|
83
|
+
{sortedQuestions
|
|
84
|
+
.filter((question: any) => question.visualisedAs === 'prime-datatable')
|
|
85
|
+
.map((question: any) => {
|
|
86
|
+
const queryParams = qs.stringify({ isPreview: false, filters }, { arrayFormat: 'brackets' });
|
|
87
|
+
|
|
88
|
+
const { data: questionData, isLoading } = useGetDashboardQuestionDataByIdQuery({
|
|
89
|
+
id: question.id,
|
|
90
|
+
qs: queryParams,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
if (isLoading) return <ProgressSpinner />;
|
|
94
|
+
const textAlign = question?.textAlign ?? 'start'
|
|
95
|
+
|
|
96
|
+
return (
|
|
97
|
+
<div className="col-12 p-3" key={question.id}>
|
|
98
|
+
<div className={`${styles.SolidChartCardWrapper} p-4`} style={{ maxHeight: '40vh', overflowY: 'scroll' }}>
|
|
99
|
+
<div className={`font-medium text-${textAlign} ${styles.SolidChartTitle}`}>{question.name}</div>
|
|
100
|
+
<div className={`mt-2 font-bold text-3xl text-${textAlign} ${styles.SolidChartTitle}`}>{questionData.data.kpi}</div>
|
|
101
|
+
<div className='mt-3'>
|
|
102
|
+
|
|
103
|
+
<PrimeReactDatatableRenderer
|
|
104
|
+
options={JSON.parse(question?.chartOptions)}
|
|
105
|
+
visualizationData={questionData?.data?.visualizationData}
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
)
|
|
111
|
+
})}
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export default SolidDashboardBody;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export const SolidDashboardFilterRequired = () => {
|
|
3
|
+
return (
|
|
4
|
+
<div className="flex align-items-center justify-content-center" style={{ minHeight: '400px', padding: '2rem' }}>
|
|
5
|
+
<div className="flex flex-column align-items-center gap-3 text-center" style={{ maxWidth: '500px' }}>
|
|
6
|
+
<div
|
|
7
|
+
className="flex align-items-center justify-content-center border-circle"
|
|
8
|
+
style={{
|
|
9
|
+
width: '80px',
|
|
10
|
+
height: '80px',
|
|
11
|
+
backgroundColor: 'var(--blue-50)',
|
|
12
|
+
color: 'var(--blue-500)'
|
|
13
|
+
}}
|
|
14
|
+
>
|
|
15
|
+
<i className="pi pi-filter" style={{ color: "var(--primary-color)", fontSize: '2.5rem' }} />
|
|
16
|
+
</div>
|
|
17
|
+
<div>
|
|
18
|
+
<div className="flex flex-column gap-2">
|
|
19
|
+
<h3 className="m-0" style={{ color: 'var(--text-color)', fontSize: '1.25rem', fontWeight: 600 }}>Filters Required</h3>
|
|
20
|
+
<p className="m-0" style={{ color: 'var(--text-color-secondary)', fontSize: '0.95rem', lineHeight: '1.5' }}>
|
|
21
|
+
Please select the required filters to render your dashboard.
|
|
22
|
+
</p>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const SolidDashboardHeader = () => {
|
|
3
|
+
return (
|
|
4
|
+
<div className="flex flex-col items-center justify-center h-screen">
|
|
5
|
+
<h1 className="text-2xl font-bold mb-4">Solid Dashboard Header</h1>
|
|
6
|
+
<p className="text-lg">This is a placeholder for the Solid Dashboard Header component.</p>
|
|
7
|
+
</div>
|
|
8
|
+
);
|
|
9
|
+
}
|
|
10
|
+
export default SolidDashboardHeader;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client'"
|
|
2
|
+
import { Skeleton } from 'primereact/skeleton'
|
|
3
|
+
|
|
4
|
+
export const SolidDashboardLoading = () => {
|
|
5
|
+
return (
|
|
6
|
+
<div className="grid p-4">
|
|
7
|
+
|
|
8
|
+
{/* ROW 1 — Responsive KPI Cards */}
|
|
9
|
+
<div className="col-12 sm:col-12 md:col-6 lg:col-6 xl:col-4">
|
|
10
|
+
<div className="surface-card p-3 border-round shadow-1">
|
|
11
|
+
<Skeleton width="40%" height="1.4rem" className="mb-2" />
|
|
12
|
+
<Skeleton width="70%" height="2rem" />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div className="col-12 sm:col-12 md:col-6 lg:col-6 xl:col-4">
|
|
17
|
+
<div className="surface-card p-3 border-round shadow-1">
|
|
18
|
+
<Skeleton width="40%" height="1.4rem" className="mb-2" />
|
|
19
|
+
<Skeleton width="70%" height="2rem" />
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div className="col-12 sm:col-12 md:col-6 lg:col-6 xl:col-4">
|
|
24
|
+
<div className="surface-card p-3 border-round shadow-1">
|
|
25
|
+
<Skeleton width="40%" height="1.4rem" className="mb-2" />
|
|
26
|
+
<Skeleton width="70%" height="2rem" />
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
{/* ROW 2 — Responsive Charts: 2 cards on desktop, but collapses */}
|
|
31
|
+
<div className="col-12 sm:col-12 md:col-6 lg:col-6 xl:col-4">
|
|
32
|
+
<div className="surface-card p-3 border-round shadow-1">
|
|
33
|
+
<Skeleton width="30%" height="1.4rem" className="mb-3" />
|
|
34
|
+
<Skeleton width="100%" height="14rem" />
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div className="col-12 sm:col-12 md:col-12 lg:col-12 xl:col-8">
|
|
39
|
+
<div className="surface-card p-3 border-round shadow-1">
|
|
40
|
+
<Skeleton width="30%" height="1.4rem" className="mb-3" />
|
|
41
|
+
<Skeleton width="100%" height="14rem" />
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
{/* ROW 3 — Full width always */}
|
|
46
|
+
<div className="col-12">
|
|
47
|
+
<div className="surface-card p-3 border-round shadow-1">
|
|
48
|
+
<Skeleton width="30%" height="1.4rem" className="mb-3" />
|
|
49
|
+
<Skeleton width="100%" height="16rem" />
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
)
|
|
55
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
const SolidDashboardNotAvailable = () => {
|
|
4
|
+
return (
|
|
5
|
+
<div className="flex align-items-center justify-content-center" style={{ minHeight: '400px', padding: '2rem' }}>
|
|
6
|
+
<div className="flex flex-column align-items-center gap-3 text-center" style={{ maxWidth: '500px' }}>
|
|
7
|
+
<div
|
|
8
|
+
className="flex align-items-center justify-content-center border-circle"
|
|
9
|
+
style={{
|
|
10
|
+
width: '80px',
|
|
11
|
+
height: '80px',
|
|
12
|
+
backgroundColor: 'var(--blue-50)',
|
|
13
|
+
color: 'var(--blue-500)'
|
|
14
|
+
}}
|
|
15
|
+
>
|
|
16
|
+
<i className="pi pi-chart-bar" style={{ fontSize: '2.5rem' }}></i>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<div className="flex flex-column gap-2">
|
|
20
|
+
<h3 className="m-0" style={{ color: 'var(--text-color)', fontSize: '1.25rem', fontWeight: 600 }}>
|
|
21
|
+
Dashboard Not Available
|
|
22
|
+
</h3>
|
|
23
|
+
<p className="m-0" style={{ color: 'var(--text-color-secondary)', fontSize: '0.95rem', lineHeight: '1.5' }}>
|
|
24
|
+
This dashboard has not been configured yet or does not exist. Please check the dashboard settings or contact your administrator.
|
|
25
|
+
</p>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default SolidDashboardNotAvailable;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
export const SolidDashboardRenderError = () => {
|
|
4
|
+
return (
|
|
5
|
+
<div className="flex align-items-center justify-content-center" style={{ minHeight: '400px', padding: '2rem' }}>
|
|
6
|
+
<div className="flex flex-column align-items-center gap-3 text-center" style={{ maxWidth: '500px' }}>
|
|
7
|
+
<div
|
|
8
|
+
className="flex align-items-center justify-content-center border-circle"
|
|
9
|
+
style={{
|
|
10
|
+
width: '80px',
|
|
11
|
+
height: '80px',
|
|
12
|
+
backgroundColor: 'var(--red-50)',
|
|
13
|
+
color: 'var(--red-500)'
|
|
14
|
+
}}
|
|
15
|
+
>
|
|
16
|
+
<i className="pi pi-exclamation-triangle"
|
|
17
|
+
style={{ fontSize: '2.5rem' }} />
|
|
18
|
+
</div>
|
|
19
|
+
<div className="flex flex-column gap-2">
|
|
20
|
+
<h3 className="m-0" style={{ color: 'var(--text-color)', fontSize: '1.25rem', fontWeight: 600 }}>Error in Loading Dashboard</h3>
|
|
21
|
+
|
|
22
|
+
<p className="m-0" style={{ color: 'var(--text-color-secondary)', fontSize: '0.95rem', lineHeight: '1.5' }}>
|
|
23
|
+
Failed to load dashboard. Please try again.
|
|
24
|
+
</p>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
)
|
|
29
|
+
}
|