├── .dockerignore ├── .gitguardian.yaml ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ ├── feature_request.md │ └── question.md ├── scripts │ └── push_docs.sh └── workflows │ ├── CI-jest.yml │ ├── artifacts_cleanup.yml │ ├── backend-tests.yml │ ├── e2e-tests.yml │ ├── label-new-issue.yml │ ├── license-check.yml │ ├── oss-sync.yml │ ├── pylint.yml │ └── release.yml ├── .gitignore ├── AGPL_LICENSE ├── CONTRIBUTING.rst ├── Dockerfile ├── LICENSE ├── README.md ├── backend ├── .gitignore ├── .licenserc_fix.yaml ├── .pylintrc ├── README.md ├── VERSION ├── addon-requirements.txt ├── alembic.ini ├── assets │ └── .keep ├── backend.dockerfile ├── client │ ├── MANIFEST.in │ ├── README.md │ ├── deepchecks_client │ │ ├── __init__.py │ │ ├── _shared_docs.py │ │ ├── core │ │ │ ├── AmazonRootCA1.cer │ │ │ ├── __init__.py │ │ │ ├── api.py │ │ │ ├── client.py │ │ │ └── utils.py │ │ └── tabular │ │ │ ├── __init__.py │ │ │ ├── client.py │ │ │ └── utils.py │ ├── examples │ │ └── usage.py │ ├── requirements.txt │ └── setup.py ├── deepchecks_monitoring │ ├── __init__.py │ ├── api │ │ ├── __init__.py │ │ └── v1 │ │ │ ├── __init__.py │ │ │ ├── alert.py │ │ │ ├── alert_rule.py │ │ │ ├── alert_webhooks.py │ │ │ ├── check.py │ │ │ ├── configuration.py │ │ │ ├── dashboard.py │ │ │ ├── data_ingestion_alert.py │ │ │ ├── data_ingestion_alert_rule.py │ │ │ ├── data_input.py │ │ │ ├── e2e_support_api.py │ │ │ ├── global_api │ │ │ ├── __init__.py │ │ │ ├── auth.py │ │ │ ├── global_router.py │ │ │ ├── helathcheck.py │ │ │ ├── organization.py │ │ │ └── users.py │ │ │ ├── model.py │ │ │ ├── model_version.py │ │ │ ├── monitor.py │ │ │ ├── onboarding.py │ │ │ └── router.py │ ├── app.py │ ├── bgtasks │ │ ├── __init__.py │ │ ├── alert_task.py │ │ ├── delete_db_table_task.py │ │ ├── mixpanel_system_state_event.py │ │ ├── model_data_ingestion_alerter.py │ │ ├── model_version_cache_invalidation.py │ │ ├── model_version_topic_delete.py │ │ ├── scheduler.py │ │ ├── tasks_queuer.py │ │ └── tasks_runner.py │ ├── cli.py │ ├── config.py │ ├── dependencies.py │ ├── ee │ │ ├── LICENSE │ │ ├── __init__.py │ │ ├── api │ │ │ ├── __init__.py │ │ │ └── v1 │ │ │ │ ├── __init__.py │ │ │ │ ├── data_sources.py │ │ │ │ ├── members.py │ │ │ │ ├── routers.py │ │ │ │ └── slack.py │ │ ├── bgtasks │ │ │ ├── __init__.py │ │ │ └── object_storage_ingestor.py │ │ ├── config.py │ │ ├── features_control_cloud.py │ │ ├── features_control_on_prem.py │ │ ├── integrations │ │ │ ├── __init__.py │ │ │ └── slack.py │ │ ├── middlewares.py │ │ ├── notifications.py │ │ └── resources.py │ ├── exceptions.py │ ├── features_control.py │ ├── integrations │ │ ├── __init__.py │ │ └── email.py │ ├── logic │ │ ├── __init__.py │ │ ├── cache_functions.py │ │ ├── check_logic.py │ │ ├── data_ingestion.py │ │ ├── kafka_consumer.py │ │ ├── keys.py │ │ ├── model_logic.py │ │ ├── monitor_alert_logic.py │ │ ├── parallel_check_executor.py │ │ ├── statistics.py │ │ └── suite_logic.py │ ├── middlewares.py │ ├── monitoring_utils.py │ ├── notifications.py │ ├── public_migrations │ │ ├── README │ │ ├── env.py │ │ ├── script.py.mako │ │ └── versions │ │ │ ├── 0ef236ebd237_added_sub_id.py │ │ │ ├── 1dbc6ac5ef4c_add_global_tasks.py │ │ │ ├── 24d099ef6949_sign_in_flow.py │ │ │ ├── 28d04e840199_add_organization_tier.py │ │ │ ├── 2dfbd6158e0d_added_stripe.py │ │ │ ├── 47d7576c286e_added_name_for_user_email_unique_.py │ │ │ ├── 54e5bc18581b_create_initial_models.py │ │ │ ├── 57a5a7543c41_user_roles.py │ │ │ ├── 5b54c70f2bd8_added_billing_table.py │ │ │ ├── 6257d437094a_moved_slack_tables.py │ │ │ ├── 68b5e008984d_move_slack_tables_from_orgs_schemas_to_.py │ │ │ ├── 6dc7e5b8a608_fix_role_order.py │ │ │ ├── 758b53d8f12c_rename_api_token.py │ │ │ ├── 8237ac7f9358_add_invitation_delete_cascade.py │ │ │ ├── 8721da4eab91_add_slack.py │ │ │ ├── aa3745061b7d_renamed_alertseverity_mid_to_medium.py │ │ │ ├── ba6a4e4c3661_removed_organization_slug_field.py │ │ │ ├── c8ae6833c7cf_added_user_eula_field.py │ │ │ ├── cda57fb776ef_org_non_unique.py │ │ │ ├── d8aad956e10c_added_tasks_table.py │ │ │ ├── e5fb1db23096_remove_tier_type.py │ │ │ └── ed50dfb877d1_removed_tasks_invalidation_table.py │ ├── public_models │ │ ├── __init__.py │ │ ├── base.py │ │ ├── billing.py │ │ ├── invitation.py │ │ ├── organization.py │ │ ├── role.py │ │ ├── task.py │ │ └── user.py │ ├── resources.py │ ├── schema_migrations │ │ ├── __init__.py │ │ ├── env.py │ │ ├── script.py.mako │ │ └── versions │ │ │ ├── 021d60e962f4_fix_webhookkind_enum.py │ │ │ ├── 06711abb0d6e_added_event_table.py │ │ │ ├── 0d2eb31dab85_monitors_schemas_update.py │ │ │ ├── 0e37ca889b28_added_indexes_for_ingestionerror_.py │ │ │ ├── 10bbb2fd4aac_refactor_model_version_schema_columns.py │ │ │ ├── 14daeddd99d6_remove_monitors_table_deletion_triggers.py │ │ │ ├── 1b0028e8c1e1_model_members.py │ │ │ ├── 1c09de380fe6_rename_last_process_column.py │ │ │ ├── 21e565825df9_rename_non_features_to_additional_data_.py │ │ │ ├── 224e3cab5cfc_alertrule_added_constrains.py │ │ │ ├── 254559c8d23d_old_tasks_removal_trigger.py │ │ │ ├── 294d2b30b20b_added_metadatamixin.py │ │ │ ├── 29e9ef85d8fd_frequency_enumeration.py │ │ │ ├── 2aff25ef5915_add_logged_time.py │ │ │ ├── 320b2ed2c803_add_balance_classes.py │ │ │ ├── 3ad1774b9ba0_added_indexes.py │ │ │ ├── 4041ff3eab58_standardise_alerts_times.py │ │ │ ├── 47b0e3008c9d_added_multi_oprator.py │ │ │ ├── 48ecb1727677_add_start_end_times_to_model.py │ │ │ ├── 4b323d8c6edd_added_label_map.py │ │ │ ├── 4ba6a640c364_added_webhooks_table.py │ │ │ ├── 4cd3c6e0688d_add_ingestion_error.py │ │ │ ├── 53ef59cd095c_add_alert_rule_start_time.py │ │ │ ├── 5595c044948b_update_alerts_end_time.py │ │ │ ├── 59e285f86ad1_added_alert_value.py │ │ │ ├── 5a3eb258120c_changed_alert_rule_constraint.py │ │ │ ├── 6b5bc12a5659_changed_monitor_frequency_constraint.py │ │ │ ├── 70ea0f70dca5_ingestion_errors_model_id.py │ │ │ ├── 74de0ab443f4_remove_task_table.py │ │ │ ├── 7a58ef90ea7c_add_trigger_on_model_version_delete.py │ │ │ ├── 7c9e3307dffc_tasks_table.py │ │ │ ├── 7efcef46aef9_add_model_version_times.py │ │ │ ├── 7fc188dbba95_alert_rule_scheduling_start.py │ │ │ ├── 8a9bc6d69ca3_moved_slack_tables.py │ │ │ ├── 95d7fe3b963b_add_resolved_field_to_alert.py │ │ │ ├── 9981564b113b_l2_to_l3.py │ │ │ ├── 99feb5aaeab6_notify_mail_column.py │ │ │ ├── 9b75d4bf2ee1_model_data_ingestion_alert.py │ │ │ ├── 9f485bd47729_added_modelnote_entity.py │ │ │ ├── __init__.py │ │ │ ├── a04f0f00b5f0_updated_filter_way_and_added_model_task_.py │ │ │ ├── a1d70019e14d_alert_name_to_id.py │ │ │ ├── a6ac6c689b56_update_monitor_filters.py │ │ │ ├── a8341cc95913_remove_vision_task_type.py │ │ │ ├── ad67b0cf252f_rename_alerts_and_events.py │ │ │ ├── ae5aec6f986a_update_model_version_last_update_time.py │ │ │ ├── b75212c5da00_added_modified_cascade.py │ │ │ ├── b85e265f38ee_moved_alert_rule_to_monitor.py │ │ │ ├── ba2e7acc66c2_added_model_timezone.py │ │ │ ├── bfca690f5a74_renamed_alerts_name_mid_to_medium.py │ │ │ ├── c06a732efcc4_added_monitor_table.py │ │ │ ├── c3a1c066eefc_add_obj_store_properties.py │ │ │ ├── c5d2ffb432e7_move_scheduling_logic_to_monitor.py │ │ │ ├── cc61786f5880_labels_refactor.py │ │ │ ├── d18e5a487cfe_add_classes_to_model_version.py │ │ │ ├── d2fd35a0db92_monitoring_table_schema_fix.py │ │ │ ├── d568613130f0_remove_schedule_start_column.py │ │ │ ├── dcab2cc8515b_added_modelversion_private_reference_.py │ │ │ ├── e0ec67ddf099_updated_task_type.py │ │ │ ├── e45cd02bc493_added_dashboard.py │ │ │ ├── e8a5d4213c45_tables_fix.py │ │ │ ├── e8cb07203dd5_data_ingestion_alert.py │ │ │ ├── f2ec131ea7a5_add_is_active_to_alert_rule.py │ │ │ ├── f3774099d232_cache_invalidation_and_ingestion_errors.py │ │ │ └── fb9160d139d5_create_initial_models.py │ ├── schema_models │ │ ├── __init__.py │ │ ├── alert.py │ │ ├── alert_rule.py │ │ ├── alert_webhook.py │ │ ├── base.py │ │ ├── check.py │ │ ├── column_type.py │ │ ├── dashboard.py │ │ ├── data_ingestion_alert.py │ │ ├── data_ingestion_alert_rule.py │ │ ├── data_sources.py │ │ ├── ingestion_errors.py │ │ ├── model.py │ │ ├── model_memeber.py │ │ ├── model_version.py │ │ ├── monitor.py │ │ ├── permission_mixin.py │ │ ├── pydantic_type.py │ │ ├── slack.py │ │ └── task_type.py │ ├── templates │ │ ├── __init__.py │ │ └── email │ │ │ ├── alert.html │ │ │ ├── alert.mjml │ │ │ ├── assets │ │ │ ├── Slack.png │ │ │ ├── Slack.svg │ │ │ ├── alert_icon.png │ │ │ ├── alert_icon.svg │ │ │ ├── github.png │ │ │ ├── github.svg │ │ │ ├── invite_img.png │ │ │ ├── invite_img.svg │ │ │ ├── logo.png │ │ │ └── logo.svg │ │ │ ├── invite.html │ │ │ ├── invite.mjml │ │ │ └── new_alert.html │ └── utils │ │ ├── __init__.py │ │ ├── alerts.py │ │ ├── auth.py │ │ ├── database.py │ │ ├── mixpanel.py │ │ ├── notebook_resources │ │ ├── run_single_check.md │ │ └── run_train_test_check.md │ │ ├── notebook_util.py │ │ ├── other.py │ │ ├── redis_util.py │ │ ├── text.py │ │ └── typing.py ├── dev-requirements.txt ├── dev_utils │ ├── __init__.py │ └── run_task_directly.py ├── docker-compose-development.yml ├── load_tests │ └── locustfile.py ├── makefile ├── pytest.ini ├── requirements.txt ├── setup.py ├── spelling-allowlist.txt ├── tests │ ├── __init__.py │ ├── api │ │ ├── __init__.py │ │ ├── test_access_restrictions.py │ │ ├── test_alert_rules.py │ │ ├── test_alert_webhooks.py │ │ ├── test_alerts.py │ │ ├── test_check.py │ │ ├── test_dashboards.py │ │ ├── test_data_input.py │ │ ├── test_data_sources.py │ │ ├── test_model_version.py │ │ ├── test_models.py │ │ ├── test_monitor.py │ │ ├── test_onboarding.py │ │ ├── test_organization_api.py │ │ ├── test_slack_integration.py │ │ ├── test_suite_execution.py │ │ └── test_users_api.py │ ├── common.py │ ├── conftest.py │ ├── logic │ │ ├── __init__.py │ │ ├── test_cache_functions.py │ │ └── test_statistics.py │ ├── sdk │ │ ├── __init__.py │ │ ├── core │ │ │ ├── __init__.py │ │ │ ├── test_api.py │ │ │ ├── test_data_retrieval.py │ │ │ ├── test_model.py │ │ │ └── test_model_version.py │ │ └── tabular │ │ │ ├── __init__.py │ │ │ ├── test_log_data.py │ │ │ ├── test_model.py │ │ │ ├── test_model_version.py │ │ │ ├── test_quick_create.py │ │ │ └── test_upload_reference.py │ ├── test_schema.yaml │ ├── unittests │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_alert_notificator.py │ │ ├── test_alert_webhooks.py │ │ ├── test_alerts_scheduler.py │ │ ├── test_database_utils.py │ │ ├── test_email_sender.py │ │ ├── test_model_data_ingestion_alerts.py │ │ ├── test_monitor_alert_rules_executor.py │ │ ├── test_queuer_runner.py │ │ └── test_user_creation.py │ └── utils.py └── tox.ini ├── bin ├── casbin_conf │ ├── app.conf.tmpl │ └── init_data │ │ └── init_data.json.tmpl ├── init-test-db.sh ├── pg_multiple_databases │ └── create-multiple-postgresql-databases.sh ├── start-alert-scheduler.sh ├── start-task-queuer.sh ├── start-task-runner.sh ├── start-test.sh └── start.sh ├── deploy-oss.sh ├── deploy ├── docker-compose.yml ├── local_certs │ ├── CA │ │ └── rootCA.pem │ ├── certs │ │ ├── localhost.crt │ │ └── localhost.key │ ├── localhost.csr │ └── localhost.ext └── oss-conf.env ├── dev-requirements.txt ├── docs ├── Makefile ├── make.bat ├── requirements.txt └── source │ ├── _static │ ├── css │ │ └── custom.css │ ├── favicons │ │ ├── apple-touch-icon.png │ │ ├── favicon.ico │ │ └── favicon.png │ └── images │ │ ├── examples │ │ ├── lending │ │ │ ├── alert.gif │ │ │ ├── analysis.gif │ │ │ └── dashboard.gif │ │ └── rent │ │ │ ├── alert.gif │ │ │ ├── alert_rule.gif │ │ │ ├── analysis_rmse.gif │ │ │ └── dashboard.jpg │ │ ├── general │ │ ├── deepchecks-logo-with-white-wide-back.png │ │ ├── deepchecks-monitoring-logo.svg │ │ ├── deepchecks_continuous_validation_light.png │ │ ├── deepchecks_logo.svg │ │ ├── sphx_glr_deepchecks_icon.png │ │ └── testing_phases_in_pipeline.png │ │ ├── installation │ │ └── deepchecks_oss_login.png │ │ ├── quickstart │ │ ├── dashboard_w_defaults.png │ │ ├── get_api_token.png │ │ ├── models_screen.png │ │ └── vision_dashboard_w_defaults.png │ │ ├── sphinx_thumbnails │ │ ├── examples │ │ │ ├── manhattan.png │ │ │ └── money.png │ │ └── quickstarts │ │ │ ├── prepare-data-guide-book.png │ │ │ └── tabular-quickstart-rocket.png │ │ ├── user-guide │ │ ├── general │ │ │ ├── assign_models.png │ │ │ ├── assign_users.png │ │ │ ├── edit_user.png │ │ │ └── invite_users.png │ │ ├── models_screen.png │ │ └── user_interface │ │ │ ├── 4.1_single_model_view.png │ │ │ ├── 4.2_model_and_alerts_menu.png │ │ │ ├── 4_multi_model_view.png │ │ │ ├── 5.2.1_multi_alerts_view.png │ │ │ ├── 5.2.2_Research_view.png │ │ │ ├── 5.2.3_Checks_view.png │ │ │ ├── 6_Analysis.png │ │ │ ├── 6_Analysis_data_comparison.png │ │ │ ├── 6_Analysis_download.png │ │ │ ├── 6_Analysis_drilldown.png │ │ │ ├── 6_Analysis_filters_1.png │ │ │ ├── 6_Analysis_filters_2.png │ │ │ ├── 6_Analysis_test_suite.png │ │ │ ├── 8.1.1_example_of_email_notification.png │ │ │ ├── 8.1.1_selection_of_alert_severity_for_email_notifications.png │ │ │ ├── 8.1.2_example_of_slack_message.png │ │ │ ├── 8.1.2_selection_of_alert_severity_for_slack_notifications.png │ │ │ ├── 8.1.2_slack_app_authorization.png │ │ │ ├── 8.1.2_slack_app_installation.png │ │ │ ├── 8.1.2_slack_app_installation_result.png │ │ │ ├── 8.1.3_selection_of_alert_severity_for_webhook.png │ │ │ ├── 8.1.3_webhook_creation.png │ │ │ └── 8.1.3_webhook_creation_form.png │ │ └── welcome │ │ ├── 2303_monitoring_screens.png │ │ ├── ci_tile.png │ │ ├── monitoring-app-ui.gif │ │ ├── monitoring_tile.png │ │ ├── testing_phases_in_pipeline_with_tiles.png │ │ └── testing_tile.png │ ├── _templates │ ├── autosummary │ │ ├── base.rst │ │ ├── class.rst │ │ └── module.rst │ └── layout.html │ ├── api │ ├── deepchecks_client.core.rst │ ├── deepchecks_client.tabular.rst │ └── index.rst │ ├── conf.py │ ├── getting-started │ ├── deploy_configuration.rst │ ├── deploy_self_host_open_source.rst │ ├── environment_setup.rst │ ├── index.rst │ └── welcome.rst │ ├── index.rst │ └── user-guide │ ├── demos │ ├── README.rst │ ├── plot_lending_defaults.py │ └── plot_rent_prediction.py │ ├── general │ ├── aggregation_methods.rst │ ├── concepts.rst │ ├── custom_checks.rst │ ├── deploying_on_ec2.rst │ ├── faq.rst │ ├── scorers.rst │ └── workspace_settings.rst │ ├── index.rst │ ├── tabular │ ├── quickstarts │ │ ├── README.txt │ │ ├── plot_prepare_your_data.py │ │ └── plot_quickstart.py │ ├── tabular_production.rst │ └── tabular_setup.rst │ └── user_interface │ ├── alerts.rst │ ├── analysis.rst │ ├── configuration.rst │ ├── dashboard.rst │ └── integrations.rst ├── e2e ├── .development.env ├── README.md ├── cypress.config.ts ├── cypress │ ├── e2e │ │ ├── alert_rules_screen.cy.ts │ │ ├── alert_screen.cy.ts │ │ ├── analysis_screen_advanced.cy.ts │ │ ├── analysis_screen_drilldown.cy.ts │ │ ├── connected_models_screen.cy.ts │ │ ├── dashboard.cy.ts │ │ └── infra.cy.ts │ └── support │ │ ├── commands.ts │ │ ├── e2e.ts │ │ └── index.d.ts ├── docker-compose.yml ├── package.json └── tsconfig.json ├── frontend ├── .env.development ├── .env.production ├── .eslintrc.js ├── .gitignore ├── .nvmrc ├── .prettierrc ├── README.MD ├── orval.config.js ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── manifest.json │ ├── robots.txt │ └── symbol-transparent.png ├── src │ ├── App.tsx │ ├── api │ │ └── generated.ts │ ├── assets │ │ ├── alerts │ │ │ ├── graphicsActiveAlert.svg │ │ │ └── graphicsAlert.svg │ │ ├── bg │ │ │ ├── app-example.gif │ │ │ ├── backgrounds.ts │ │ │ ├── loginScreenImage.svg │ │ │ └── noResultsImage.svg │ │ ├── err │ │ │ └── not-found.webp │ │ ├── icon │ │ │ ├── Link.svg │ │ │ ├── NLPModel.svg │ │ │ ├── arow.svg │ │ │ ├── arrowDropDown.svg │ │ │ ├── bell.svg │ │ │ ├── calendar.svg │ │ │ ├── chart.tsx │ │ │ ├── check.svg │ │ │ ├── checks.svg │ │ │ ├── clear.svg │ │ │ ├── close.svg │ │ │ ├── collapseArrowLeft.svg │ │ │ ├── collapseArrowRight.svg │ │ │ ├── credit-card.svg │ │ │ ├── download.svg │ │ │ ├── edit.svg │ │ │ ├── email.svg │ │ │ ├── exclamationMarkRhombus.svg │ │ │ ├── fastForward.svg │ │ │ ├── fileUpload.svg │ │ │ ├── graphLegendCurrent.svg │ │ │ ├── graphLegendPrevious.svg │ │ │ ├── graphReport.svg │ │ │ ├── icon.js │ │ │ ├── info.svg │ │ │ ├── infoIcon.svg │ │ │ ├── infoIconFilled.svg │ │ │ ├── loading-suite.svg │ │ │ ├── markedMail.svg │ │ │ ├── nativePlus.svg │ │ │ ├── noDataToShowIcon.svg │ │ │ ├── notebook.svg │ │ │ ├── profileImg.jpg │ │ │ ├── red-warning.svg │ │ │ ├── research.svg │ │ │ ├── rewind.svg │ │ │ ├── rotate.svg │ │ │ ├── search.svg │ │ │ ├── severity │ │ │ │ ├── critical.svg │ │ │ │ ├── high.svg │ │ │ │ ├── low.svg │ │ │ │ └── medium.svg │ │ │ ├── slack.svg │ │ │ ├── sort.svg │ │ │ ├── tableChart.svg │ │ │ ├── trash.svg │ │ │ ├── undo.svg │ │ │ ├── visualModel.svg │ │ │ └── warning.svg │ │ ├── integrations │ │ │ ├── mail.svg │ │ │ ├── purple-webhook.svg │ │ │ ├── s3.svg │ │ │ ├── slack.svg │ │ │ └── webhook.svg │ │ ├── logo │ │ │ ├── colored.svg │ │ │ ├── index.js │ │ │ ├── logo.svg │ │ │ └── logoin1280.svg │ │ └── onBoarding │ │ │ ├── demo.svg │ │ │ └── user.svg │ ├── components │ │ ├── APIKey │ │ │ ├── APIKey.styles.tsx │ │ │ ├── APIKey.tsx │ │ │ ├── apikey.constants.ts │ │ │ └── index.ts │ │ ├── ActiveColumnsFilters │ │ │ ├── ActiveColumnsFilters.tsx │ │ │ ├── ActiveColumnsFilters.utils.ts │ │ │ ├── ColumnChip.tsx │ │ │ └── index.ts │ │ ├── Alerts │ │ │ ├── AlertCount.tsx │ │ │ ├── AlertRuleConfig │ │ │ │ ├── AlertRuleConfigItem.style.tsx │ │ │ │ ├── AlertRuleConfigItem.tsx │ │ │ │ ├── alertRuleConfig.constants.ts │ │ │ │ ├── components │ │ │ │ │ ├── AlertCount │ │ │ │ │ │ ├── AlertCount.style.tsx │ │ │ │ │ │ ├── AlertCount.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── DeleteAlertRule │ │ │ │ │ │ ├── DeleteAlertRule.style.tsx │ │ │ │ │ │ ├── DeleteAlertRule.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── AlertRuleDialog │ │ │ │ ├── AlertRuleDialog.styles.tsx │ │ │ │ ├── AlertRuleDialog.tsx │ │ │ │ ├── AlertRuleDialog.type.ts │ │ │ │ ├── AlertRuleDialogContext.tsx │ │ │ │ ├── alertRuleDialog.constants.ts │ │ │ │ └── components │ │ │ │ │ ├── AlertRuleDialogContent.tsx │ │ │ │ │ ├── DataRuleDialogStepOne.tsx │ │ │ │ │ ├── RuleDialogStepOne.tsx │ │ │ │ │ ├── RuleDialogStepThree.tsx │ │ │ │ │ └── RuleDialogStepTwo.tsx │ │ │ ├── AlertRulesItem │ │ │ │ ├── AlertsRulesItem.style.tsx │ │ │ │ ├── AlertsRulesItem.tsx │ │ │ │ └── index.ts │ │ │ ├── AlertSnackbar │ │ │ │ └── AlertSnackbar.tsx │ │ │ ├── AlertsDrawer │ │ │ │ ├── AlertsDrawer.tsx │ │ │ │ ├── components │ │ │ │ │ ├── AlertBadge.tsx │ │ │ │ │ ├── AlertsDrawerDiagram.tsx │ │ │ │ │ ├── AlertsDrawerHeader.tsx │ │ │ │ │ └── AlertsDrillDownToAnalysis │ │ │ │ │ │ ├── AlertsDrillDownToAnalysis.tsx │ │ │ │ │ │ ├── AlertsDrillDownToAnalysisHeader.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── AlertsHeader.tsx │ │ │ └── AlertsSnackbar.tsx │ │ ├── Analysis │ │ │ ├── AnalysisFilters │ │ │ │ ├── AnalysisFilters.helpers.ts │ │ │ │ ├── AnalysisFilters.tsx │ │ │ │ ├── components │ │ │ │ │ ├── CategoricalFilter.tsx │ │ │ │ │ ├── DropDownFilter.tsx │ │ │ │ │ ├── DropdownEndAdornment.tsx │ │ │ │ │ └── NumericFilter.tsx │ │ │ │ └── index.ts │ │ │ ├── AnalysisHeader │ │ │ │ ├── AnalysisHeader.style.tsx │ │ │ │ ├── AnalysisHeader.tsx │ │ │ │ ├── components │ │ │ │ │ ├── AnalysisHeaderOptions.tsx │ │ │ │ │ ├── FixedAnalysisHeader.tsx │ │ │ │ │ ├── ModelIcon.tsx │ │ │ │ │ └── ModelSelect.tsx │ │ │ │ └── index.ts │ │ │ └── AnalysisItem │ │ │ │ ├── AnalysisItem.tsx │ │ │ │ ├── AnalysisItem.types.ts │ │ │ │ ├── components │ │ │ │ ├── AnalysisChartItem.tsx │ │ │ │ └── AnalysisChartItemWithFilters │ │ │ │ │ ├── AnalysisChartItemWithFilters.tsx │ │ │ │ │ ├── AnalysisItemSelect │ │ │ │ │ ├── AnalysisItemSelect.style.ts │ │ │ │ │ ├── AnalysisItemSelect.types.ts │ │ │ │ │ ├── MultiSelect.tsx │ │ │ │ │ ├── SingleSelect.tsx │ │ │ │ │ └── components │ │ │ │ │ │ ├── ClearButton.tsx │ │ │ │ │ │ ├── InputLabel.tsx │ │ │ │ │ │ └── ResetSelectionButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ └── helpers │ │ │ │ ├── getReference.ts │ │ │ │ ├── manipulateAnalysisItem.ts │ │ │ │ └── showDatasets.ts │ │ ├── AnalysisDrillDown │ │ │ ├── AnalysisDrillDown.helpers.ts │ │ │ ├── AnalysisDrillDown.tsx │ │ │ ├── AnalysisDrillDown.types.ts │ │ │ ├── AnalysisDrillDownInfo │ │ │ │ ├── AnalysisDrillDownInfo.tsx │ │ │ │ ├── AnalysisDrillDownInfoItem.tsx │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── CustomDrawer │ │ │ ├── CustomDrawer.tsx │ │ │ ├── CustomDrawerHeader.tsx │ │ │ └── index.ts │ │ ├── Dashboard │ │ │ ├── Dashboard.types.ts │ │ │ ├── DataIngestion │ │ │ │ ├── DataIngestion.style.tsx │ │ │ │ ├── DataIngestion.tsx │ │ │ │ └── index.ts │ │ │ ├── ModelList │ │ │ │ ├── ModelList.style.tsx │ │ │ │ ├── ModelList.tsx │ │ │ │ ├── components │ │ │ │ │ ├── AlertsCountWidget.tsx │ │ │ │ │ └── ModelItem │ │ │ │ │ │ ├── ModelItem.style.tsx │ │ │ │ │ │ ├── ModelItem.tsx │ │ │ │ │ │ ├── NoDataError │ │ │ │ │ │ ├── NoDataError.styles.tsx │ │ │ │ │ │ ├── NoDataError.tsx │ │ │ │ │ │ └── NoDataErrorPopper.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── MonitorDialog │ │ │ │ ├── MonitorDialog.tsx │ │ │ │ ├── components │ │ │ │ │ ├── ActiveAlertsModal.tsx │ │ │ │ │ ├── CreateAlertForm │ │ │ │ │ │ ├── CreateAlertForm.helpers.ts │ │ │ │ │ │ ├── CreateAlertForm.tsx │ │ │ │ │ │ ├── SelectCondition.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── MonitorDialogGraph.tsx │ │ │ │ │ └── MonitorForm │ │ │ │ │ │ ├── MonitorForm.helpers.ts │ │ │ │ │ │ ├── MonitorForm.tsx │ │ │ │ │ │ ├── MonitorForm.types.ts │ │ │ │ │ │ ├── components │ │ │ │ │ │ ├── MonitorFormAdvancedSection.tsx │ │ │ │ │ │ ├── MonitorFormStepOne.tsx │ │ │ │ │ │ ├── MonitorFormStepTwo.tsx │ │ │ │ │ │ └── MonitorFormSteps.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── monitorDialog.constants.ts │ │ │ ├── MonitorList │ │ │ │ ├── MonitorList.tsx │ │ │ │ ├── components │ │ │ │ │ ├── DeleteMonitor │ │ │ │ │ │ ├── DeleteMonitor.style.tsx │ │ │ │ │ │ ├── DeleteMonitor.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── GraphicsSection │ │ │ │ │ │ ├── GraphicsSection.style.tsx │ │ │ │ │ │ ├── GraphicsSection.tsx │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── MonitorAlertRuleWidget │ │ │ │ │ │ │ │ ├── MonitorAlertRuleWidget.helpers.ts │ │ │ │ │ │ │ │ ├── MonitorAlertRuleWidget.style.tsx │ │ │ │ │ │ │ │ ├── MonitorAlertRuleWidget.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── MonitorInfoLink.tsx │ │ │ │ │ │ │ ├── MonitorInfoTooltipBody.tsx │ │ │ │ │ │ │ ├── MonitorInfoWidget.tsx │ │ │ │ │ │ │ └── RootMenu.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Monitor.tsx │ │ │ │ │ └── MonitorsGroup.tsx │ │ │ │ └── index.ts │ │ │ ├── MonitorListHeader │ │ │ │ └── MonitorListHeader.tsx │ │ │ └── dashboard.constants.ts │ │ ├── DiagramLine │ │ │ ├── DiagramAlertCountWidget │ │ │ │ └── DiagramAlertCountWidget.tsx │ │ │ ├── DiagramLine.helpers.ts │ │ │ ├── DiagramLine.tsx │ │ │ ├── DiagramLine.types.ts │ │ │ ├── DiagramTutorialTooltip │ │ │ │ └── DiagramTutorialTooltip.tsx │ │ │ ├── LegendsList │ │ │ │ ├── LegendsList.tsx │ │ │ │ └── components │ │ │ │ │ ├── HorizontalScrolling │ │ │ │ │ ├── HorizontalScrolling.tsx │ │ │ │ │ ├── HorizontalScrollingIconButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ │ └── LegendItem.tsx │ │ │ ├── NoData │ │ │ │ └── NoDataToShow.tsx │ │ │ └── diagramLine.constants.ts │ │ ├── DropdownArrowComponent.tsx │ │ ├── FiltersSort │ │ │ ├── FiltersSort.tsx │ │ │ └── components │ │ │ │ ├── FiltersResetButton.tsx │ │ │ │ └── FiltersSortButton.tsx │ │ ├── InfoLink.tsx │ │ ├── Integrations │ │ │ ├── Data │ │ │ │ ├── Data.tsx │ │ │ │ ├── components │ │ │ │ │ └── S3Dialog.tsx │ │ │ │ └── helpers │ │ │ │ │ └── s3RegionsList.ts │ │ │ ├── Integrations.tsx │ │ │ ├── Notifications │ │ │ │ ├── Notifications.tsx │ │ │ │ └── components │ │ │ │ │ ├── AlertNotifications.tsx │ │ │ │ │ ├── ConnectSlack.tsx │ │ │ │ │ ├── ConnectWebhook.tsx │ │ │ │ │ └── WebhookDialog.tsx │ │ │ └── integrations.constants.ts │ │ ├── Layout │ │ │ ├── Layout.tsx │ │ │ └── Sidebar │ │ │ │ ├── Sidebar.tsx │ │ │ │ ├── components │ │ │ │ ├── AnalysisSubMenu │ │ │ │ │ ├── AnalysisSubMenu.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SidebarMenuItem │ │ │ │ │ ├── SidebarMenuItem.tsx │ │ │ │ │ └── index.ts │ │ │ │ └── UserInfo │ │ │ │ │ ├── UserInfo.tsx │ │ │ │ │ ├── components │ │ │ │ │ └── ReportModal │ │ │ │ │ │ ├── ReportModal.style.tsx │ │ │ │ │ │ ├── ReportModal.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ ├── ModelInfoItem │ │ │ ├── ModelInfoItem.style.tsx │ │ │ ├── ModelInfoItem.tsx │ │ │ ├── components │ │ │ │ ├── FooterItem.tsx │ │ │ │ ├── ModalItemViewDetails │ │ │ │ │ ├── ModalItemViewDetails.style.tsx │ │ │ │ │ ├── ModalItemViewDetails.tsx │ │ │ │ │ ├── ModelDetails │ │ │ │ │ │ ├── ModelDetails.style.ts │ │ │ │ │ │ ├── ModelDetails.tsx │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── ModelLogs │ │ │ │ │ │ │ │ ├── ModelLogs.tsx │ │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ │ ├── ModelLogsFilters.tsx │ │ │ │ │ │ │ │ │ └── SingleLog.tsx │ │ │ │ │ │ │ └── ModelNotes │ │ │ │ │ │ │ │ ├── ModelNotes.tsx │ │ │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ │ ├── CreateNote.tsx │ │ │ │ │ │ │ │ ├── NotesList.tsx │ │ │ │ │ │ │ │ └── SingleNote.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── ModelInfoBadge.tsx │ │ │ └── index.ts │ │ ├── NestedMenu.tsx │ │ ├── NoResults.tsx │ │ ├── NotFound │ │ │ ├── NotFound.styles.tsx │ │ │ ├── NotFound.tsx │ │ │ └── notFound.constants.ts │ │ ├── OnBoarding │ │ │ ├── OnBoarding.styles.tsx │ │ │ ├── OnBoarding.tsx │ │ │ ├── components │ │ │ │ ├── ColabLink.tsx │ │ │ │ ├── DownloadNotebook.tsx │ │ │ │ ├── DownloadScript.tsx │ │ │ │ ├── FirstOnBoarding.tsx │ │ │ │ ├── GenerateToken.tsx │ │ │ │ └── snippets │ │ │ │ │ ├── Onboarding_Demo_Data.json │ │ │ │ │ └── Onboarding_Your_Data.json │ │ │ └── onBoarding.constants.ts │ │ ├── RangePicker.tsx │ │ ├── RangePickerInput.tsx │ │ ├── SegmentsDrillDown │ │ │ ├── SegmentsDrillDown.helpers.ts │ │ │ ├── SegmentsDrillDown.tsx │ │ │ ├── components │ │ │ │ ├── CheckPerSegment.tsx │ │ │ │ ├── GraphLayout.tsx │ │ │ │ ├── NoGraphDataToShow.tsx │ │ │ │ └── SegmentTests.tsx │ │ │ └── index.ts │ │ ├── Select │ │ │ ├── CustomStyledSelect.tsx │ │ │ ├── SelectCheck.tsx │ │ │ ├── SelectColumn.tsx │ │ │ ├── SelectCondition.tsx │ │ │ ├── SelectFrequency.tsx │ │ │ ├── SelectModelColumn.tsx │ │ │ ├── SelectPrimary.tsx │ │ │ ├── SelectSeverity.tsx │ │ │ └── SelectTimeframe.tsx │ │ ├── Subcategory.tsx │ │ ├── Submenu.tsx │ │ ├── SuiteView │ │ │ ├── RunDownloadSuite │ │ │ │ ├── DownloadSuiteDropdown.tsx │ │ │ │ ├── RunDownloadSuite.tsx │ │ │ │ └── index.ts │ │ │ ├── SuiteView.styles.tsx │ │ │ ├── SuiteViewHeader.tsx │ │ │ ├── SuiteViewLoading.tsx │ │ │ └── helpers │ │ │ │ └── suiteViewPage.constants.ts │ │ ├── TabPanel.tsx │ │ ├── TooltipInputWrapper.tsx │ │ ├── WorkspaceSettings │ │ │ ├── WorkspaceSettings.helpers.ts │ │ │ ├── WorkspaceSettings.styles.tsx │ │ │ ├── WorkspaceSettings.tsx │ │ │ ├── components │ │ │ │ ├── DialogListItem.tsx │ │ │ │ ├── Members │ │ │ │ │ ├── Members.tsx │ │ │ │ │ ├── Members.type.ts │ │ │ │ │ ├── components │ │ │ │ │ │ ├── AssignModels.tsx │ │ │ │ │ │ ├── DeleteWorkspace.tsx │ │ │ │ │ │ ├── DeleteWorkspaceDialog.tsx │ │ │ │ │ │ ├── EditMember.tsx │ │ │ │ │ │ ├── InviteMember.tsx │ │ │ │ │ │ ├── MembersActionDialogContentLayout.tsx │ │ │ │ │ │ ├── MembersHeader.tsx │ │ │ │ │ │ ├── MembersListActionDialog.tsx │ │ │ │ │ │ ├── MembersTable │ │ │ │ │ │ │ ├── MembersTable.tsx │ │ │ │ │ │ │ ├── MembersTableHead.tsx │ │ │ │ │ │ │ └── MembersTableRow.tsx │ │ │ │ │ │ ├── RemoveMember.tsx │ │ │ │ │ │ └── RemoveSelectedMembers.tsx │ │ │ │ │ └── members.constants.ts │ │ │ │ ├── ModelsTab │ │ │ │ │ ├── ModelsTab.tsx │ │ │ │ │ ├── components │ │ │ │ │ │ ├── AssignMembersToModelDialog.tsx │ │ │ │ │ │ ├── ModelsTabHeader.tsx │ │ │ │ │ │ └── ModelsTabTable │ │ │ │ │ │ │ ├── ModelsTabTable.tsx │ │ │ │ │ │ │ ├── ModelsTabTableHead.tsx │ │ │ │ │ │ │ └── ModelsTabTableRow.tsx │ │ │ │ │ └── modelsTab.constants.ts │ │ │ │ └── PermissionError │ │ │ │ │ └── NotAdminDialog.tsx │ │ │ └── useOrganizationMembers.tsx │ │ ├── base │ │ │ ├── Button │ │ │ │ ├── Button.styles.tsx │ │ │ │ ├── MUIBaseButton.tsx │ │ │ │ ├── ShareButton.tsx │ │ │ │ └── SwitchButton.tsx │ │ │ ├── Container │ │ │ │ └── Container.styles.tsx │ │ │ ├── DatePicker │ │ │ │ ├── DatePicker.style.ts │ │ │ │ └── DatePicker.tsx │ │ │ ├── DateRange │ │ │ │ ├── DateRange.style.tsx │ │ │ │ ├── DateRange.tsx │ │ │ │ └── index.ts │ │ │ ├── Dialog │ │ │ │ └── ActionDialog │ │ │ │ │ ├── ActionDialog.styles.tsx │ │ │ │ │ ├── ActionDialog.tsx │ │ │ │ │ ├── ActionDialogHeader.tsx │ │ │ │ │ └── DeleteActionDialog.tsx │ │ │ ├── Input │ │ │ │ ├── DropdownTextField.tsx │ │ │ │ ├── Input.styles.tsx │ │ │ │ └── SearchField.tsx │ │ │ ├── InputDropdown │ │ │ │ ├── ControlledBaseDropdown.tsx │ │ │ │ ├── InputDropdown.styles.tsx │ │ │ │ └── InputDropdown.tsx │ │ │ ├── Loader │ │ │ │ └── Loader.tsx │ │ │ ├── MarkedSelect │ │ │ │ ├── ControlledMarkedSelect.tsx │ │ │ │ ├── MarkedSelect.tsx │ │ │ │ └── index.ts │ │ │ ├── RangePicker │ │ │ │ ├── RangePicker.style.tsx │ │ │ │ ├── RangePicker.tsx │ │ │ │ └── index.ts │ │ │ ├── Skeleton │ │ │ │ └── Skeleton.tsx │ │ │ ├── Text │ │ │ │ └── Header.styles.tsx │ │ │ └── Tooltip │ │ │ │ └── Tooltip.tsx │ │ └── lib │ │ │ ├── assets │ │ │ ├── chart │ │ │ │ ├── select-all-checkbox-unchecked.svg │ │ │ │ └── select-all-checkbox.svg │ │ │ ├── css │ │ │ │ └── fonts.css │ │ │ ├── logo │ │ │ │ ├── full-logo.svg │ │ │ │ ├── logo.svg │ │ │ │ └── monitoring.svg │ │ │ └── severity │ │ │ │ ├── critical.svg │ │ │ │ ├── high.svg │ │ │ │ ├── low.svg │ │ │ │ ├── medium.svg │ │ │ │ └── purple.svg │ │ │ ├── components │ │ │ ├── Button │ │ │ │ ├── Button.tsx │ │ │ │ ├── Checkbox │ │ │ │ │ └── Checkbox.tsx │ │ │ │ ├── Radio │ │ │ │ │ └── Radio.tsx │ │ │ │ ├── Select │ │ │ │ │ └── Select.tsx │ │ │ │ ├── Slider │ │ │ │ │ └── Slider.tsx │ │ │ │ ├── Thumbs │ │ │ │ │ └── Thumbs.tsx │ │ │ │ └── Toggle │ │ │ │ │ └── Toggle.tsx │ │ │ ├── Container │ │ │ │ ├── Accordion │ │ │ │ │ └── Accordion.tsx │ │ │ │ ├── CodeSnippet │ │ │ │ │ └── CodeSnippet.tsx │ │ │ │ ├── Container.tsx │ │ │ │ ├── PercentageContainer │ │ │ │ │ └── PercentageContainer.tsx │ │ │ │ └── ToolTip │ │ │ │ │ ├── ToolTip.styles.tsx │ │ │ │ │ └── ToolTip.tsx │ │ │ ├── DateTimePicker │ │ │ │ ├── DateTimePicker.styles.tsx │ │ │ │ ├── DateTimePicker.tsx │ │ │ │ ├── DateTimePicker.utils.ts │ │ │ │ └── DropdownArrowComponent.tsx │ │ │ ├── Dialog │ │ │ │ ├── DeletionDialog │ │ │ │ │ └── DeletionDialog.tsx │ │ │ │ ├── Dialog.tsx │ │ │ │ └── DialogBase.tsx │ │ │ ├── DistributionChart │ │ │ │ ├── DistributionChart.helpers.ts │ │ │ │ ├── DistributionChart.styles.tsx │ │ │ │ └── DistributionChart.tsx │ │ │ ├── DoughnutChart │ │ │ │ ├── DoughnutChart.helpers.ts │ │ │ │ ├── DoughnutChart.styles.tsx │ │ │ │ └── DoughnutChart.tsx │ │ │ ├── Dropdown │ │ │ │ ├── Dropdown.helpers.tsx │ │ │ │ ├── Dropdown.styles.tsx │ │ │ │ ├── Dropdown.tsx │ │ │ │ ├── DropdownItem.tsx │ │ │ │ └── OutlinedDropdown │ │ │ │ │ └── OutlinedDropdown.tsx │ │ │ ├── Image │ │ │ │ └── Image.tsx │ │ │ ├── Input │ │ │ │ └── Input.tsx │ │ │ ├── Loader │ │ │ │ └── Loader.tsx │ │ │ ├── Logo │ │ │ │ └── Logo.tsx │ │ │ ├── NavLink │ │ │ │ └── NavLink.tsx │ │ │ ├── Notification │ │ │ │ └── Notification.tsx │ │ │ ├── Severity │ │ │ │ └── Severity.tsx │ │ │ ├── Skeleton │ │ │ │ └── Skeleton.tsx │ │ │ └── Text │ │ │ │ ├── HighlightedText │ │ │ │ └── HighlightedText.tsx │ │ │ │ └── Text.tsx │ │ │ ├── index.tsx │ │ │ └── theme │ │ │ ├── ThemeProvider.tsx │ │ │ ├── breakpoints.ts │ │ │ ├── index.tsx │ │ │ ├── palette.ts │ │ │ └── typography.ts │ ├── helpers │ │ ├── base │ │ │ ├── alertFilters.ts │ │ │ ├── conditionOperator.ts │ │ │ ├── diagramLine.ts │ │ │ ├── groupParamsByKey.ts │ │ │ ├── monitorFields.helpers.ts │ │ │ ├── permissionControl.tsx │ │ │ ├── setGraphOptions.ts │ │ │ ├── severityColor.ts │ │ │ ├── termsAndConditions.ts │ │ │ └── time.tsx │ │ ├── context │ │ │ ├── AnalysisProvider.tsx │ │ │ ├── GlobalProvider.tsx │ │ │ └── InitializationProvider.tsx │ │ ├── hooks │ │ │ ├── useAlertMonitorData.ts │ │ │ ├── useConfig.ts │ │ │ ├── useDataIngestion.tsx │ │ │ ├── useDebounce.ts │ │ │ ├── useElementOnScreen.ts │ │ │ ├── useListSearchField.tsx │ │ │ ├── useModels.tsx │ │ │ ├── useOnboarding.ts │ │ │ ├── useRunCheckLookback.ts │ │ │ ├── useRunMonitorLookback.tsx │ │ │ ├── useScrollBar.ts │ │ │ ├── useStatsTime.tsx │ │ │ ├── useUser.tsx │ │ │ └── windowResize.ts │ │ ├── routes │ │ │ └── index.tsx │ │ ├── services │ │ │ ├── customAxios.ts │ │ │ ├── logger.ts │ │ │ ├── mixPanel.ts │ │ │ └── userService.ts │ │ ├── types │ │ │ ├── alert.ts │ │ │ ├── check.ts │ │ │ ├── index.ts │ │ │ ├── model.ts │ │ │ ├── monitor.ts │ │ │ ├── oldPalette.ts │ │ │ └── resError.ts │ │ └── utils │ │ │ ├── arrDictConverter.ts │ │ │ ├── capitalizeFirstChar.ts │ │ │ ├── checkUtil.ts │ │ │ ├── featuresUtils.ts │ │ │ ├── frequency.ts │ │ │ ├── getParams.ts │ │ │ ├── localStorage.ts │ │ │ ├── mapToOptionsList.ts │ │ │ ├── parseDataForChart.ts │ │ │ ├── processFrequency.ts │ │ │ ├── truncateString.ts │ │ │ └── validateEmail.ts │ ├── index.tsx │ ├── pages │ │ ├── APIKeyPage.tsx │ │ ├── AlertRulesPage.tsx │ │ ├── AlertsPage.tsx │ │ ├── AnalysisPage.tsx │ │ ├── CompleteDetailsPage.tsx │ │ ├── DashboardPage.tsx │ │ ├── IntegrationsPage.tsx │ │ ├── LicenseAgreementPage.tsx │ │ ├── ModelsPage.tsx │ │ ├── NotFoundPage.tsx │ │ ├── OnBoardingPage.tsx │ │ ├── SuiteViewPage.tsx │ │ └── WorkspaceSettingsPage.tsx │ └── react-app-env.d.ts ├── tsconfig.json └── yarn.lock ├── liccheck.ini ├── makefile └── security_scan.sh /.dockerignore: -------------------------------------------------------------------------------- 1 | backend/.venv 2 | backend/.env 3 | backend/.pytest_cache 4 | backend/deepchecks_monitoring.egg-info 5 | node_modules 6 | security_scan.sh -------------------------------------------------------------------------------- /.gitguardian.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | secret: 4 | # Ignore security incidents with the SHA256 of the occurrence obtained at output or the secret itself 5 | ignored-matches: 6 | - name: oss_conf_oauth_client_secret 7 | match: 7ff1f39cca2ff23fe8105ad02bd1d090793d9421 8 | - name: oss_conf_auth_jwt_secret 9 | match: 5qM4Te0knu65k1gG9UGOoba6KVag4HRD 10 | - name: e2e_test_api_token 11 | match: ZTJlLXRlc3RpbmdAZGVlcGNoZWNrcy5jb20=.ASB8rB13J5i_4Nma7zZfIA 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG] " 5 | labels: 'bug' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Environment (please complete the following information):** 27 | - OS: 28 | - Python Version: 29 | - Deepchecks Version: 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: Deepchecks Slack Community Group 4 | url: https://join.slack.com/t/deepcheckscommunity/shared_invite/zt-y28sjt1v-PBT50S3uoyWui_Deg5L_jg 5 | about: Please ask and answer questions here. 6 | - name: Deepchecks Package 7 | url: https://github.com/deepchecks/deepchecks 8 | about: The main Deepchecks GitHub repository 9 | - name: Deepchecks Docs 10 | url: https://docs.deepchecks.com/ 11 | about: Please view the full documentation here. 12 | 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[FEAT]" 5 | labels: suggestion 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | name: Submit Question 2 | description: Ask a general question about deepchecks 3 | title: "QST: " 4 | labels: [question] 5 | 6 | body: 7 | - type: textarea 8 | id: question 9 | attributes: 10 | label: Question about deepchecks monitoring 11 | placeholder: | 12 | ```python 13 | # Your code here, if applicable 14 | 15 | ``` 16 | -------------------------------------------------------------------------------- /.github/workflows/artifacts_cleanup.yml: -------------------------------------------------------------------------------- 1 | name: "nightly artifacts cleanup" 2 | on: 3 | schedule: 4 | - cron: "0 1 * * *" # every night at 1 am UTC 5 | workflow_dispatch: 6 | 7 | jobs: 8 | delete-artifacts: 9 | runs-on: ubuntu-latest 10 | if: "!github.event.pull_request.draft" 11 | steps: 12 | - uses: kolpav/purge-artifacts-action@v1 13 | with: 14 | token: ${{ secrets.GITHUB_TOKEN }} 15 | expire-in: 1day # Set this to 0 to delete all artifacts 16 | -------------------------------------------------------------------------------- /.github/workflows/label-new-issue.yml: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | # 11 | name: Labels Blank issues 12 | 13 | on: 14 | issues: 15 | types: [opened] 16 | 17 | jobs: 18 | label-blank-issues: 19 | runs-on: ubuntu-latest 20 | if: "!github.event.pull_request.draft" 21 | steps: 22 | - uses: andymckay/labeler@1.0.4 23 | with: 24 | add-labels: "monitoring, linear" 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2021-2023 Deepchecks 2 | 3 | Portions of this software are licensed as follows: 4 | 5 | * The sub-library under the sub-directory named "**/ee/", if exists, 6 | is licensed under the license defined in "**/ee/LICENSE". 7 | * All third party components incorporated into the Deepchecks Software 8 | are licensed under the original license provided by the owner of the 9 | applicable component. 10 | * Content outside of the above mentioned directories or restrictions above, 11 | is available under the AGPL license as set forth in "AGPL_LICENSE". -------------------------------------------------------------------------------- /backend/VERSION: -------------------------------------------------------------------------------- 1 | 0.19.3 2 | -------------------------------------------------------------------------------- /backend/addon-requirements.txt: -------------------------------------------------------------------------------- 1 | deepchecks_addons@git+https://${DEEPCHECKS_CI_TOKEN}@github.com/deepchecks/deepchecks-custom-addon.git@d41bce91d72065d57c5b50a172dd9e21704c383b -------------------------------------------------------------------------------- /backend/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/backend/assets/.keep -------------------------------------------------------------------------------- /backend/client/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.md 2 | include deepchecks_client/core/AmazonRootCA1.cer -------------------------------------------------------------------------------- /backend/client/README.md: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /backend/client/deepchecks_client/core/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | # 11 | """Module defining the core client functionality.""" 12 | from deepchecks_client.core.utils import ColumnType, DataFilter, OperatorsEnum, TaskType 13 | 14 | __all__ = ['ColumnType', 'TaskType', 'DataFilter', 'OperatorsEnum'] 15 | -------------------------------------------------------------------------------- /backend/client/deepchecks_client/tabular/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | # 11 | """Module defining the tabular client functionality.""" 12 | from deepchecks.tabular.utils.task_type import TaskType as DeepchecksTaskType 13 | from deepchecks_client.tabular.utils import create_schema, read_schema 14 | 15 | __all__ = ['create_schema', 'read_schema'] 16 | -------------------------------------------------------------------------------- /backend/client/requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | pandas 3 | deepchecks 4 | httpx>=0.23.0 5 | pendulum==2.1.2 6 | fastjsonschema==2.16.2 7 | termcolor 8 | PyYAML 9 | importlib_metadata; python_version < '3.8' 10 | pip-system-certs>=3.1 11 | typing_extensions>=4.11.0,<5 12 | rfc3339-validator==0.1.4 # Used to validate date-time format in jsonschema 13 | packaging==23.0 -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | """Root module for the deepchecks_monitoring package.""" 11 | from importlib.metadata import version 12 | 13 | __all__ = [] 14 | __version__ = version("deepchecks_monitoring") 15 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/api/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | 11 | """Module defining the API of the app.""" 12 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/api/v1/global_api/__init__.py: -------------------------------------------------------------------------------- 1 | """Represent the module for global APIs.""" 2 | from . import auth, helathcheck, organization, users 3 | from .global_router import router as global_router 4 | 5 | __all__ = ['auth', 'helathcheck', 'organization', 'users', 'global_router'] 6 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/api/v1/global_api/global_router.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | """Module defining the Router for V1 API.""" 11 | from fastapi import APIRouter 12 | 13 | __all__ = ['router'] 14 | 15 | 16 | router = APIRouter(prefix='/api/v1') 17 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/api/v1/global_api/helathcheck.py: -------------------------------------------------------------------------------- 1 | """Module representing the endpoints for the health check.""" 2 | from fastapi import Response 3 | 4 | from .global_router import router 5 | 6 | 7 | @router.get('/health-check') 8 | async def health_check(): 9 | """Health check endpoint. 10 | 11 | Returns 12 | ------- 13 | Response: A 200 OK response. 14 | """ 15 | return Response(content='ok') 16 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/api/v1/router.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | """Module defining the Router for V1 API.""" 11 | from fastapi import APIRouter 12 | 13 | from deepchecks_monitoring import __version__ 14 | 15 | __all__ = ['router'] 16 | 17 | 18 | router = APIRouter(prefix='/api/v1') 19 | 20 | 21 | @router.get('/say-hello') 22 | async def hello_world() -> str: 23 | return 'Hello world' 24 | 25 | 26 | @router.get('/backend-version') 27 | async def retrieve_backend_version(): 28 | return {'version': __version__} 29 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/bgtasks/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | # 11 | """Package dedicated to background tasks.""" 12 | __all__ = [] 13 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2023 Deepchecks 2 | 3 | The sub-library in this directory (“**/ee/”) is licensed under the 4 | Terms & Conditions found at https://deepchecks.com/terms-and-conditions/. 5 | 6 | 7 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/__init__.py: -------------------------------------------------------------------------------- 1 | from . import api, bgtasks, config, integrations, middlewares, notifications, resources 2 | 3 | __all__ = [] 4 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/api/__init__.py: -------------------------------------------------------------------------------- 1 | from . import v1 2 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/api/v1/__init__.py: -------------------------------------------------------------------------------- 1 | from . import data_sources, members, slack 2 | from .routers import cloud_router, ee_router 3 | 4 | __all__ = ['cloud_router', 'ee_router', 'slack', 'data_sources', 'members'] 5 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/api/v1/routers.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter 2 | 3 | ee_router = APIRouter(prefix='/api/v1') 4 | cloud_router = APIRouter(prefix='/api/v1') 5 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/bgtasks/__init__.py: -------------------------------------------------------------------------------- 1 | from .object_storage_ingestor import ObjectStorageIngestor 2 | 3 | __all__ = ['ObjectStorageIngestor'] 4 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/features_control_on_prem.py: -------------------------------------------------------------------------------- 1 | from deepchecks_monitoring.features_control import FeaturesControl 2 | 3 | 4 | class OnPremFeaturesControl(FeaturesControl): 5 | """Feature controls class for on prem version. 6 | TODO: implement license check :( 7 | """ 8 | 9 | async def get_allowed_models(self, session) -> None: 10 | return None 11 | 12 | @property 13 | def update_roles(self) -> bool: 14 | return True 15 | 16 | @property 17 | def model_assignment(self) -> bool: 18 | return True 19 | 20 | @property 21 | def signup_enabled(self) -> bool: 22 | return True 23 | 24 | @property 25 | def onboarding_enabled(self) -> bool: 26 | return True 27 | 28 | @property 29 | def slack_enabled(self) -> bool: 30 | return True 31 | 32 | @property 33 | def rows_per_minute(self) -> int: 34 | return 500_000 35 | 36 | @property 37 | def multi_tenant(self) -> bool: 38 | return False 39 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/ee/integrations/__init__.py: -------------------------------------------------------------------------------- 1 | from . import slack 2 | 3 | __all__ = [] 4 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/integrations/__init__.py: -------------------------------------------------------------------------------- 1 | from . import email 2 | 3 | __all__ = [] 4 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/logic/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | 11 | """Module defining the logic of the app.""" 12 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_migrations/README: -------------------------------------------------------------------------------- 1 | Generic single-database configuration. -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_migrations/script.py.mako: -------------------------------------------------------------------------------- 1 | """${message} 2 | 3 | Revision ID: ${up_revision} 4 | Revises: ${down_revision | comma,n} 5 | Create Date: ${create_date} 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | ${imports if imports else ""} 11 | 12 | # revision identifiers, used by Alembic. 13 | revision = ${repr(up_revision)} 14 | down_revision = ${repr(down_revision)} 15 | branch_labels = ${repr(branch_labels)} 16 | depends_on = ${repr(depends_on)} 17 | 18 | 19 | def upgrade() -> None: 20 | ${upgrades if upgrades else "pass"} 21 | 22 | 23 | def downgrade() -> None: 24 | ${downgrades if downgrades else "pass"} 25 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_migrations/versions/0ef236ebd237_added_sub_id.py: -------------------------------------------------------------------------------- 1 | """added_sub_id 2 | 3 | Revision ID: 0ef236ebd237 4 | Revises: 5b54c70f2bd8 5 | Create Date: 2023-03-02 13:47:42.746075 6 | 7 | """ 8 | import sqlalchemy as sa 9 | from alembic import op 10 | 11 | # revision identifiers, used by Alembic. 12 | revision = '0ef236ebd237' 13 | down_revision = '5b54c70f2bd8' 14 | branch_labels = None 15 | depends_on = None 16 | 17 | 18 | def upgrade() -> None: 19 | # ### commands auto generated by Alembic - please adjust! ### 20 | op.add_column('billing', sa.Column('subscription_id', sa.String(length=100), nullable=True)) 21 | # ### end Alembic commands ### 22 | 23 | 24 | def downgrade() -> None: 25 | # ### commands auto generated by Alembic - please adjust! ### 26 | op.drop_column('billing', 'subscription_id') 27 | # ### end Alembic commands ### 28 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_migrations/versions/2dfbd6158e0d_added_stripe.py: -------------------------------------------------------------------------------- 1 | """added_stripe 2 | 3 | Revision ID: 2dfbd6158e0d 4 | Revises: 1dbc6ac5ef4c 5 | Create Date: 2023-02-26 13:54:07.312154 6 | 7 | """ 8 | import sqlalchemy as sa 9 | from alembic import op 10 | 11 | # revision identifiers, used by Alembic. 12 | revision = '2dfbd6158e0d' 13 | down_revision = '1dbc6ac5ef4c' 14 | branch_labels = None 15 | depends_on = None 16 | 17 | 18 | def upgrade() -> None: 19 | # ### commands auto generated by Alembic - please adjust! ### 20 | op.add_column('organizations', sa.Column('stripe_customer_id', sa.String(length=100), nullable=True)) 21 | # ### end Alembic commands ### 22 | 23 | 24 | def downgrade() -> None: 25 | # ### commands auto generated by Alembic - please adjust! ### 26 | op.drop_column('organizations', 'stripe_customer_id') 27 | # ### end Alembic commands ### 28 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_migrations/versions/758b53d8f12c_rename_api_token.py: -------------------------------------------------------------------------------- 1 | """rename-api-token 2 | 3 | Revision ID: 758b53d8f12c 4 | Revises: ba6a4e4c3661 5 | Create Date: 2022-10-24 14:56:16.245321 6 | 7 | """ 8 | import sqlalchemy as sa 9 | from alembic import op 10 | 11 | # revision identifiers, used by Alembic. 12 | revision = '758b53d8f12c' 13 | down_revision = 'ba6a4e4c3661' 14 | branch_labels = None 15 | depends_on = None 16 | 17 | 18 | def upgrade() -> None: 19 | # ### commands auto generated by Alembic - please adjust! ### 20 | op.add_column('users', sa.Column('api_secret_hash', sa.String(), nullable=True)) 21 | op.drop_column('users', 'api_token') 22 | # ### end Alembic commands ### 23 | 24 | 25 | def downgrade() -> None: 26 | # ### commands auto generated by Alembic - please adjust! ### 27 | op.add_column('users', sa.Column('api_token', sa.VARCHAR(), autoincrement=False, nullable=True)) 28 | op.drop_column('users', 'api_secret_hash') 29 | # ### end Alembic commands ### 30 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_migrations/versions/8237ac7f9358_add_invitation_delete_cascade.py: -------------------------------------------------------------------------------- 1 | """add invitation delete cascade 2 | 3 | Revision ID: 8237ac7f9358 4 | Revises: 758b53d8f12c 5 | Create Date: 2022-11-09 13:26:02.379582 6 | 7 | """ 8 | import sqlalchemy as sa 9 | from alembic import op 10 | 11 | # revision identifiers, used by Alembic. 12 | revision = '8237ac7f9358' 13 | down_revision = '758b53d8f12c' 14 | branch_labels = None 15 | depends_on = None 16 | 17 | 18 | def upgrade() -> None: 19 | op.drop_constraint('invitations_organization_id_fkey', 'invitations') 20 | op.create_foreign_key('invitations_organization_id_fkey', 21 | 'invitations', 'organizations', ['organization_id'], ['id'], ondelete='CASCADE') 22 | 23 | 24 | def downgrade() -> None: 25 | op.drop_constraint('invitations_organization_id_fkey', 'invitations') 26 | op.create_foreign_key('invitations_organization_id_fkey', 27 | 'invitations', 'organizations', ['organization_id'], ['id']) 28 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_migrations/versions/c8ae6833c7cf_added_user_eula_field.py: -------------------------------------------------------------------------------- 1 | """added user.eula field 2 | 3 | Revision ID: c8ae6833c7cf 4 | Revises: 6257d437094a 5 | Create Date: 2022-12-01 12:11:56.816167 6 | 7 | """ 8 | import sqlalchemy as sa 9 | from alembic import op 10 | 11 | # revision identifiers, used by Alembic. 12 | revision = 'c8ae6833c7cf' 13 | down_revision = '6257d437094a' 14 | branch_labels = None 15 | depends_on = None 16 | 17 | 18 | def upgrade() -> None: 19 | # ### commands auto generated by Alembic - please adjust! ### 20 | op.add_column('users', sa.Column('eula', sa.Boolean(), server_default=sa.text('FALSE'), nullable=False)) 21 | # ### end Alembic commands ### 22 | 23 | 24 | def downgrade() -> None: 25 | # ### commands auto generated by Alembic - please adjust! ### 26 | op.drop_column('users', 'eula') 27 | # ### end Alembic commands ### 28 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/public_models/base.py: -------------------------------------------------------------------------------- 1 | """Represent the base public db models.""" 2 | import typing as t 3 | 4 | from sqlalchemy import MetaData 5 | from sqlalchemy.orm import declarative_base 6 | 7 | from deepchecks_monitoring.schema_models import BaseClass 8 | 9 | __all__ = ["Base"] 10 | 11 | Base = t.cast(t.Any, declarative_base(cls=BaseClass, metadata=MetaData(schema="public"))) 12 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/schema_migrations/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | """Represent the schema migrations.""" 11 | __all__ = [] 12 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/schema_migrations/versions/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | __all__ = [] 11 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/schema_models/task_type.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | import enum 11 | 12 | 13 | class TaskType(enum.Enum): 14 | """Enum containing supported task types.""" 15 | 16 | REGRESSION = "regression" 17 | BINARY = "binary" 18 | MULTICLASS = "multiclass" 19 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/__init__.py: -------------------------------------------------------------------------------- 1 | """Represent the email templates module.""" 2 | __all__ = [] 3 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/email/assets/Slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/backend/deepchecks_monitoring/templates/email/assets/Slack.png -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/email/assets/alert_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/backend/deepchecks_monitoring/templates/email/assets/alert_icon.png -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/email/assets/alert_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/email/assets/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/backend/deepchecks_monitoring/templates/email/assets/github.png -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/email/assets/invite_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/backend/deepchecks_monitoring/templates/email/assets/invite_img.png -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/email/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/backend/deepchecks_monitoring/templates/email/assets/logo.png -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/templates/email/new_alert.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Hey! You have a new alert. 9 | 10 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/utils/__init__.py: -------------------------------------------------------------------------------- 1 | """Module representing utilies for the app.""" 2 | -------------------------------------------------------------------------------- /backend/deepchecks_monitoring/utils/typing.py: -------------------------------------------------------------------------------- 1 | """Typing utils.""" 2 | # pylint: disable=unused-import 3 | import typing as t 4 | 5 | if t.TYPE_CHECKING: 6 | from datetime import datetime 7 | 8 | from pendulum.datetime import DateTime as PendulumDateTime 9 | 10 | __all__ = ["as_pendulum_datetime", "as_datetime"] 11 | 12 | 13 | def as_pendulum_datetime(value) -> "PendulumDateTime": 14 | return t.cast("PendulumDateTime", value) 15 | 16 | 17 | def as_datetime(value) -> "datetime": 18 | return t.cast("datetime", value) 19 | -------------------------------------------------------------------------------- /backend/dev-requirements.txt: -------------------------------------------------------------------------------- 1 | coveralls==3.3.1 2 | deepdiff==5.8.1 3 | flake8==4.0.1 4 | flake8-eradicate==1.2.1 5 | flake8-rst==0.8.0 6 | flake8-spellcheck==0.28.0 7 | isort==5.10.1 8 | pydocstyle==6.1.1 9 | pyhamcrest==2.0.4 10 | pylint==2.13.5 11 | pytest==7.1.2 12 | pytest-asyncio==0.18.3 13 | pytest-cov==3.0.0 14 | randomname==0.1.5 15 | requests==2.28.1 16 | supervisor==4.2.4 17 | testing.postgresql==1.3.0 18 | tox==3.25.1 19 | #deepchecks[vision]@git+https://github.com/deepchecks/deepchecks.git@main 20 | faker 21 | pyOpenSSL 22 | aiosmtpd 23 | fakeredis[lua]==2.9.2 -------------------------------------------------------------------------------- /backend/dev_utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/backend/dev_utils/__init__.py -------------------------------------------------------------------------------- /backend/pytest.ini: -------------------------------------------------------------------------------- 1 | ; ---------------------------------------------------------------------------- 2 | ; Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | ; 4 | ; This file is part of Deepchecks. 5 | ; Deepchecks is distributed under the terms of the GNU Affero General 6 | ; Public License (version 3 or later). 7 | ; You should have received a copy of the GNU Affero General Public License 8 | ; along with Deepchecks. If not, see . 9 | ; ---------------------------------------------------------------------------- 10 | [pytest] 11 | asyncio_mode=strict 12 | python_files = tests.py test_*.py *_tests.py -------------------------------------------------------------------------------- /backend/requirements.txt: -------------------------------------------------------------------------------- 1 | boto3==1.26.4 2 | fastapi==0.115.0 3 | aiohttp~=3.9.2 4 | sqlalchemy[asyncio]==1.4.39 5 | dynaconf~=3.2.0 6 | pydantic[dotenv,email]~=1.10.9 7 | pendulum==2.1.2 8 | fastjsonschema==2.19.1 9 | asyncpg==0.27.0 10 | alembic==1.8.0 11 | click==8.1.3 12 | psycopg2==2.9.3 13 | orjson~=3.9.15 14 | python-multipart==0.0.12 # bugs with pypi version 15 | jinja2==3.1.3 16 | aiokafka==0.11.0 17 | confluent-kafka==2.3.0 18 | kafka-python==2.0.2 19 | uvloop==0.17.0 20 | nbformat>=5.4.0,<6 21 | deepchecks@git+https://github.com/deepchecks/deepchecks.git@8c15865aaebc7f73faeb0939d07fa982d646b2c4 22 | redis[hiredis]~=4.6.0 23 | pandas~=2.1.0 24 | pyjwt[crypto]==2.4.0 25 | Authlib~=1.0.1 26 | httpx==0.28.1 27 | itsdangerous~=2.1.2 28 | randomname~=0.1.5 29 | furl==2.1.3 30 | slack-sdk==3.18.1 31 | bcrypt==4.0.1 32 | pyinstrument==4.6.1 33 | watchtower==3.0.0 34 | jupytext~=1.16.0 35 | uvicorn==0.30.1 36 | ddtrace>=1.0,<2 37 | python-json-logger~=2.0.7 38 | mixpanel==4.10.0 39 | typing_extensions~=4.12.0 40 | tenacity~=8.5.0 41 | pyarrow==14.0.2 42 | plotly>=5.13.1,<6 -------------------------------------------------------------------------------- /backend/tests/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | 11 | -------------------------------------------------------------------------------- /backend/tests/api/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | 11 | -------------------------------------------------------------------------------- /backend/tests/logic/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | -------------------------------------------------------------------------------- /backend/tests/sdk/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | 11 | -------------------------------------------------------------------------------- /backend/tests/sdk/core/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | -------------------------------------------------------------------------------- /backend/tests/sdk/tabular/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | 11 | -------------------------------------------------------------------------------- /backend/tests/test_schema.yaml: -------------------------------------------------------------------------------- 1 | # Automatically inferred schema. 2 | # Some inferred types may be incorrect, please check carefully as it cannot be changed. 3 | # Possible values are: "numeric", "integer", "categorical", "datetime", "boolean", "text", "array_float", "array_float_2d". 4 | # Please note that "integer" type cannot receive float types, so if it may be needed in the future change the type to "numeric". 5 | # None values are inserted if we failed to infer, please update the values manually. 6 | additional_data: 7 | bool_feature: boolean 8 | index_col: integer 9 | features: 10 | binary_feature: categorical 11 | fake_bool_feature: categorical 12 | -------------------------------------------------------------------------------- /backend/tests/unittests/__init__.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | -------------------------------------------------------------------------------- /backend/tests/unittests/conftest.py: -------------------------------------------------------------------------------- 1 | # ---------------------------------------------------------------------------- 2 | # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com) 3 | # 4 | # This file is part of Deepchecks. 5 | # Deepchecks is distributed under the terms of the GNU Affero General 6 | # Public License (version 3 or later). 7 | # You should have received a copy of the GNU Affero General Public License 8 | # along with Deepchecks. If not, see . 9 | # ---------------------------------------------------------------------------- 10 | # 11 | -------------------------------------------------------------------------------- /backend/tests/unittests/test_email_sender.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from deepchecks_monitoring.integrations.email import EmailSender 4 | 5 | 6 | @pytest.mark.asyncio 7 | async def test_email_sender(smtp_server, settings): 8 | email_sender = EmailSender(settings) 9 | 10 | email_sender.send( 11 | subject="Hello world", 12 | template_name="alert", 13 | recipients=["bar@testing.com"], 14 | template_context={} 15 | ) 16 | 17 | assert len(smtp_server.handler.mailbox) == 1 18 | 19 | email = smtp_server.handler.mailbox[0] 20 | assert email["From"] == "Deepchecks App " 21 | assert email["To"] == "bar@testing.com" 22 | assert email["Subject"] == "Hello world" 23 | -------------------------------------------------------------------------------- /bin/casbin_conf/app.conf.tmpl: -------------------------------------------------------------------------------- 1 | appname = deepchecks 2 | httpport = 4545 3 | runmode = dev 4 | copyrequestbody = true 5 | driverName = postgres 6 | dataSourceName = "user=user password=password host=db port=5432 sslmode=disable dbname=casdoor" 7 | dbName = 8 | tableNamePrefix = 9 | showSql = false 10 | redisEndpoint = 11 | defaultStorageProvider = 12 | isCloudIntranet = false 13 | authState = "casdoor" 14 | socks5Proxy = "127.0.0.1:10808" 15 | verificationCodeTimeout = 10 16 | initScore = 2000 17 | logPostOnly = true 18 | origin = https://$DOMAIN:8443 19 | staticBaseUrl = "https://cdn.casbin.org" 20 | isDemoMode = false 21 | batchSize = 100 22 | ldapServerPort = 389 23 | languages = en,zh,es,fr,de,ja,ko,ru,vi 24 | logConfig = {"filename": "logs/casdoor.log", "maxdays":99999, "perm":"0770"} -------------------------------------------------------------------------------- /bin/init-test-db.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd /code/backend 3 | python deepchecks_monitoring/cli.py initdb 4 | python deepchecks_monitoring/cli.py generate-user --random=false 5 | -------------------------------------------------------------------------------- /bin/pg_multiple_databases/create-multiple-postgresql-databases.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -u 5 | 6 | function create_user_and_database() { 7 | local database=$1 8 | echo " Creating user and database '$database'" 9 | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL 10 | CREATE USER $database; 11 | CREATE DATABASE $database; 12 | GRANT ALL PRIVILEGES ON DATABASE $database TO $database; 13 | EOSQL 14 | } 15 | 16 | if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then 17 | echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES" 18 | for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do 19 | create_user_and_database $db 20 | done 21 | echo "Multiple databases created" 22 | fi -------------------------------------------------------------------------------- /bin/start-alert-scheduler.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | RUN="python -m deepchecks_monitoring.bgtasks.scheduler" 3 | if [[ -v DD_ENV ]]; then 4 | RUN="ddtrace-run ${RUN}" 5 | fi 6 | eval "${RUN}" 7 | -------------------------------------------------------------------------------- /bin/start-task-queuer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | RUN="python -m deepchecks_monitoring.bgtasks.tasks_queuer" 3 | if [[ -v DD_ENV ]]; then 4 | RUN="ddtrace-run ${RUN}" 5 | fi 6 | eval "${RUN}" 7 | -------------------------------------------------------------------------------- /bin/start-task-runner.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | RUN="python -m deepchecks_monitoring.bgtasks.tasks_runner" 3 | if [[ -v DD_ENV ]]; then 4 | RUN="ddtrace-run ${RUN}" 5 | fi 6 | eval "${RUN}" 7 | -------------------------------------------------------------------------------- /bin/start-test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd /code/backend 3 | python deepchecks_monitoring/cli.py initdb 4 | python deepchecks_monitoring/cli.py upgrade-organizations-schemas --orgid=all 5 | uvicorn --factory deepchecks_monitoring.app:create_application --host 0.0.0.0 --workers 4 --log-level warning \ 6 | --proxy-headers --forwarded-allow-ips '*' 7 | -------------------------------------------------------------------------------- /bin/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd /code/backend && alembic --name public upgrade head 3 | python /code/backend/deepchecks_monitoring/cli.py upgrade-organizations-schemas --orgid=all 4 | 5 | if [[ -v INIT_LOCAL_RAY_INSTANCE ]]; then 6 | RAY_memory_monitor_refresh_ms=0 ray start --port=6399 --head 7 | fi 8 | 9 | STARTAPP="uvicorn --factory deepchecks_monitoring.app:create_application --host 0.0.0.0 --workers 4 --log-level debug --proxy-headers --forwarded-allow-ips '*'" 10 | 11 | if [[ -v DD_ENV ]]; then 12 | STARTAPP="ddtrace-run ${STARTAPP}" 13 | fi 14 | 15 | exec ${STARTAPP} 16 | -------------------------------------------------------------------------------- /deploy/local_certs/CA/rootCA.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICljCCAX4CCQCoCN8L65tB+zANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJJ 3 | TDAeFw0yMzAzMjIyMDM4MjFaFw0yODAzMjAyMDM4MjFaMA0xCzAJBgNVBAYTAklM 4 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1DUhw/bJkcGmDw2bqipI 5 | Np9qKOQ28mZWCHRy0rQos7q2Ge35JM+sABP/5BmP+EgHnEJsYZUcvIm0r/WtiRVw 6 | dWZwdMnNX39ix1d8UmJr0RZN8uVgZz0zYOSo+fTRaZkxqF6XmrnTjrp4CR3LVS5q 7 | f+KRPbM1JjYSTkU5XeraapHFFMplV0XvlmD4GN09P3B5KFN7ND6xULDmqMaMsNL/ 8 | 03Y4HKvJMoEpv+eFaG8B9mcHI6hXv7CNFIXVjrxk7VG6fhlUdqB3P7G2naY3zTa4 9 | E+nfDrGnTvPvOv5ii0gJj4LARcS5tVJRRG19pKaNxkpJ7iE0L0HJEloJE3WqFn48 10 | 8wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBIUNZE6YTfoCcf+N193odm1mb+Jzl0 11 | Xa9kST2Ieve3r7DcvpWNd6Y67N4ta2yC8/O3qc2oD+K2IkEA4ZzD+e8pIcsm5AgE 12 | PQ4qp027mfkzjENRMxGzSIu6ZlZ380OIzcjOdTA3QelTf8syoRI/3vjKprjhnvjO 13 | ZDF2xfBekX53j3rzJUlJtOcHn6YsVYckeNKjsLd2DcdEuUlGRZM/oi/wa+ZjmJ+h 14 | vjb+SSrhGKdZS/f/sxvhQBeCQipKykxxybBbTCGDD6ZCnXI4TD7XtOM7nXm1K/9X 15 | aSAYsJfmPFQtD7OYZR87IueA9NAWcUo0Qp21wvfe325p7+wOLEm7ITwX 16 | -----END CERTIFICATE----- 17 | -------------------------------------------------------------------------------- /deploy/local_certs/localhost.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIICUjCCAToCAQAwDTELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IB 3 | DwAwggEKAoIBAQDB2ZeBOrvo34S2niJ7jSsQpQuvrBrRMhHhDywLIZr0bRG1qBgh 4 | y1ZmjHDb5Zp8IkpQc5BqpXqs3QzxSjemqgXTmI0pV/8arn5d6p7h9qgztpW4nQu+ 5 | xAvalpqEKfYMlj8/9NwmkoCy9y2OnpXKIfIKX0rFhIcKipflrTrRpK9g9ZNzUQY6 6 | rYzhOUZTExUTmbKltj96Hx9707whWCQGQMrdN9IaoUB5DlCsrpffMzHe4N/ceQWj 7 | CxwPIk+ZrABfo7DGc9jvzLyi97fsU+q4CbwsB4UxlU5fe8MwjnQOYKs7Uyvm3Kyq 8 | 6KZKKWbtu8rcSPfdfAnnnTd2IzafSY0B+f65AgMBAAGgADANBgkqhkiG9w0BAQsF 9 | AAOCAQEApIT+/3OwlgK06kzmAHaFw/8Drtva3Mr8fZxYTwmHlJAhps6/TBRtfuMv 10 | N9TFKNwQdpQ/xNVScTRgt6qnOOBCr66Yn/gA6Hh8vocSr798rMaonUUjEngHO0Cr 11 | nBQLVDoFEfao/B/+mkTKLx2BLItv8J/1IIjApHtjSgGf0RkHM1y2tCY3RH37oR2K 12 | /2F3ijFj/8Z9pYoKNApaamFqMSQekS33Un+wZNJZYswhzhJSDS3pad+mu5ATlYSU 13 | lAGNgNC4beT9feWudRBK//ZJlZMIxyU1p65voWsUM5vfDejFjqqZ0KZpFeKpmucK 14 | dd8dB82QMiXuRy1kUKBGyx72Zucy3g== 15 | -----END CERTIFICATE REQUEST----- 16 | -------------------------------------------------------------------------------- /deploy/local_certs/localhost.ext: -------------------------------------------------------------------------------- 1 | 2 | authorityKeyIdentifier=keyid,issuer 3 | basicConstraints=CA:FALSE 4 | keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment 5 | subjectAltName = @alt_names 6 | 7 | [alt_names] 8 | DNS.1 = localhost 9 | 10 | -------------------------------------------------------------------------------- /deploy/oss-conf.env: -------------------------------------------------------------------------------- 1 | INIT_LOCAL_RAY_INSTANCE=True 2 | TOTAL_NUMBER_OF_CHECK_EXECUTOR_ACTORS=4 3 | DEPLOYMENT_URL=https://$DOMAIN 4 | oauth_url=https://$DOMAIN:8443 5 | oauth_client_id=ba6ce982162fb0d58e0e 6 | oauth_client_secret=7ff1f39cca2ff23fe8105ad02bd1d090793d9421 7 | DATABASE_URI=postgresql://user:password@db:5432/deepchecks 8 | ASYNC_DATABASE_URI=postgresql+asyncpg://user:password@db:5432/deepchecks 9 | ACCESS_TOKEN_EXPIRE_MINUTES=10 10 | ASSETS_FOLDER=/code/frontend/dist 11 | AUTH_JWT_SECRET=5qM4Te0knu65k1gG9UGOoba6KVag4HRD 12 | DEBUG_MODE=False 13 | kafka_host=kafka:9092 14 | kafka_security_protocol=PLAINTEXT 15 | kafka_sasl_mechanism=PLAIN 16 | kafka_username= 17 | kafka_password= 18 | kafka_replication_factor=1 19 | kafka_max_metadata_age=1000 20 | redis_uri=redis://redis/0 21 | email_smtp_host= 22 | email_smtp_port=25 23 | email_smtp_username= 24 | email_smtp_password= 25 | -------------------------------------------------------------------------------- /dev-requirements.txt: -------------------------------------------------------------------------------- 1 | pytest 2 | pytest-asyncio 3 | testing.postgresql 4 | uvicorn 5 | pylint==2.13.5 6 | pydocstyle 7 | flake8 8 | flake8-spellcheck 9 | flake8-eradicate 10 | flake8-rst 11 | isort 12 | pytest-cov 13 | pyhamcrest 14 | coveralls 15 | tox 16 | httpx 17 | faker 18 | pyOpenSSL 19 | supervisor -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | 13 | %SPHINXBUILD% >NUL 2>NUL 14 | if errorlevel 9009 ( 15 | echo. 16 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 17 | echo.installed, then set the SPHINXBUILD environment variable to point 18 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 19 | echo.may add the Sphinx directory to PATH. 20 | echo. 21 | echo.If you don't have Sphinx installed, grab it from 22 | echo.https://www.sphinx-doc.org/ 23 | exit /b 1 24 | ) 25 | 26 | if "%1" == "" goto help 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | sphinx==4.5.0 2 | pydata-sphinx-theme>=0.7.2,<0.9.0 3 | sphinx-copybutton>=0.4.0 4 | sphinx-gallery>=0.10.1,<=0.14.0 5 | sphinxcontrib-applehelp>=1.0.2,<1.0.8 6 | sphinxcontrib-devhelp>=1.0.2,<1.0.6 7 | sphinxcontrib-htmlhelp>=2.0.0,<2.0.5 8 | sphinxcontrib-jsmath==1.0.1 9 | sphinxcontrib-qthelp>=1.0.3,<1.0.7 10 | sphinxcontrib-serializinghtml>=1.1.5,<1.1.10 11 | readthedocs-sphinx-search 12 | numpydoc>=1.1.0 13 | pypandoc>=1.7.2 14 | docutils 15 | sphinx_toolbox 16 | sphinx-reredirects>=0.0.1 17 | sphinx-design>=0.3.0 18 | catboost==1.2 19 | jinja2==3.1.3 -------------------------------------------------------------------------------- /docs/source/_static/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /docs/source/_static/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/favicons/favicon.ico -------------------------------------------------------------------------------- /docs/source/_static/favicons/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/favicons/favicon.png -------------------------------------------------------------------------------- /docs/source/_static/images/examples/lending/alert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/examples/lending/alert.gif -------------------------------------------------------------------------------- /docs/source/_static/images/examples/lending/analysis.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/examples/lending/analysis.gif -------------------------------------------------------------------------------- /docs/source/_static/images/examples/lending/dashboard.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/examples/lending/dashboard.gif -------------------------------------------------------------------------------- /docs/source/_static/images/examples/rent/alert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/examples/rent/alert.gif -------------------------------------------------------------------------------- /docs/source/_static/images/examples/rent/alert_rule.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/examples/rent/alert_rule.gif -------------------------------------------------------------------------------- /docs/source/_static/images/examples/rent/analysis_rmse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/examples/rent/analysis_rmse.gif -------------------------------------------------------------------------------- /docs/source/_static/images/examples/rent/dashboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/examples/rent/dashboard.jpg -------------------------------------------------------------------------------- /docs/source/_static/images/general/deepchecks-logo-with-white-wide-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/general/deepchecks-logo-with-white-wide-back.png -------------------------------------------------------------------------------- /docs/source/_static/images/general/deepchecks_continuous_validation_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/general/deepchecks_continuous_validation_light.png -------------------------------------------------------------------------------- /docs/source/_static/images/general/sphx_glr_deepchecks_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/general/sphx_glr_deepchecks_icon.png -------------------------------------------------------------------------------- /docs/source/_static/images/general/testing_phases_in_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/general/testing_phases_in_pipeline.png -------------------------------------------------------------------------------- /docs/source/_static/images/installation/deepchecks_oss_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/installation/deepchecks_oss_login.png -------------------------------------------------------------------------------- /docs/source/_static/images/quickstart/dashboard_w_defaults.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/quickstart/dashboard_w_defaults.png -------------------------------------------------------------------------------- /docs/source/_static/images/quickstart/get_api_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/quickstart/get_api_token.png -------------------------------------------------------------------------------- /docs/source/_static/images/quickstart/models_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/quickstart/models_screen.png -------------------------------------------------------------------------------- /docs/source/_static/images/quickstart/vision_dashboard_w_defaults.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/quickstart/vision_dashboard_w_defaults.png -------------------------------------------------------------------------------- /docs/source/_static/images/sphinx_thumbnails/examples/manhattan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/sphinx_thumbnails/examples/manhattan.png -------------------------------------------------------------------------------- /docs/source/_static/images/sphinx_thumbnails/examples/money.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/sphinx_thumbnails/examples/money.png -------------------------------------------------------------------------------- /docs/source/_static/images/sphinx_thumbnails/quickstarts/prepare-data-guide-book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/sphinx_thumbnails/quickstarts/prepare-data-guide-book.png -------------------------------------------------------------------------------- /docs/source/_static/images/sphinx_thumbnails/quickstarts/tabular-quickstart-rocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/sphinx_thumbnails/quickstarts/tabular-quickstart-rocket.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/general/assign_models.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/general/assign_models.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/general/assign_users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/general/assign_users.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/general/edit_user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/general/edit_user.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/general/invite_users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/general/invite_users.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/models_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/models_screen.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/4.1_single_model_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/4.1_single_model_view.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/4.2_model_and_alerts_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/4.2_model_and_alerts_menu.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/4_multi_model_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/4_multi_model_view.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/5.2.1_multi_alerts_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/5.2.1_multi_alerts_view.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/5.2.2_Research_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/5.2.2_Research_view.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/5.2.3_Checks_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/5.2.3_Checks_view.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/6_Analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/6_Analysis.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/6_Analysis_data_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/6_Analysis_data_comparison.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/6_Analysis_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/6_Analysis_download.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/6_Analysis_drilldown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/6_Analysis_drilldown.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/6_Analysis_filters_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/6_Analysis_filters_1.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/6_Analysis_filters_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/6_Analysis_filters_2.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/6_Analysis_test_suite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/6_Analysis_test_suite.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.1_example_of_email_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.1_example_of_email_notification.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.1_selection_of_alert_severity_for_email_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.1_selection_of_alert_severity_for_email_notifications.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.2_example_of_slack_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.2_example_of_slack_message.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.2_selection_of_alert_severity_for_slack_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.2_selection_of_alert_severity_for_slack_notifications.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.2_slack_app_authorization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.2_slack_app_authorization.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.2_slack_app_installation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.2_slack_app_installation.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.2_slack_app_installation_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.2_slack_app_installation_result.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.3_selection_of_alert_severity_for_webhook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.3_selection_of_alert_severity_for_webhook.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.3_webhook_creation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.3_webhook_creation.png -------------------------------------------------------------------------------- /docs/source/_static/images/user-guide/user_interface/8.1.3_webhook_creation_form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/user-guide/user_interface/8.1.3_webhook_creation_form.png -------------------------------------------------------------------------------- /docs/source/_static/images/welcome/2303_monitoring_screens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/welcome/2303_monitoring_screens.png -------------------------------------------------------------------------------- /docs/source/_static/images/welcome/ci_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/welcome/ci_tile.png -------------------------------------------------------------------------------- /docs/source/_static/images/welcome/monitoring-app-ui.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/welcome/monitoring-app-ui.gif -------------------------------------------------------------------------------- /docs/source/_static/images/welcome/monitoring_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/welcome/monitoring_tile.png -------------------------------------------------------------------------------- /docs/source/_static/images/welcome/testing_phases_in_pipeline_with_tiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/welcome/testing_phases_in_pipeline_with_tiles.png -------------------------------------------------------------------------------- /docs/source/_static/images/welcome/testing_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/docs/source/_static/images/welcome/testing_tile.png -------------------------------------------------------------------------------- /docs/source/_templates/autosummary/base.rst: -------------------------------------------------------------------------------- 1 | {{ objname | escape | underline }} 2 | 3 | .. currentmodule:: {{ module }} 4 | 5 | .. auto{{ objtype }}:: {{ objname }} 6 | -------------------------------------------------------------------------------- /docs/source/_templates/autosummary/class.rst: -------------------------------------------------------------------------------- 1 | {% block header %} 2 | {{ name | escape | underline }} 3 | {% endblock header%} 4 | 5 | {% block content %} 6 | .. currentmodule:: {{ module }} 7 | 8 | .. autoclass:: {{ objname }} 9 | :special-members: __init__ 10 | 11 | {% block attributes %} 12 | {% if attributes %} 13 | .. rubric:: {{ _('Attributes') }} 14 | 15 | .. autosummary:: 16 | :toctree: 17 | {% for item in attributes %} 18 | {% if item.0 != item.upper().0 %} 19 | {{ name }}.{{ item }} 20 | {% endif %} 21 | {% endfor %} 22 | {% endif %} 23 | {% endblock attributes %} 24 | 25 | {% block methods %} 26 | {% if methods %} 27 | .. rubric:: {{ _('Methods') }} 28 | 29 | .. autosummary:: 30 | :toctree: 31 | {% for item in methods %} 32 | {% if item != "__init__" %} 33 | {{ name }}.{{ item }} 34 | {% endif %} 35 | {%- endfor %} 36 | {% endif %} 37 | {% endblock methods %} 38 | 39 | {% endblock content %} 40 | 41 | {% block footer %} 42 | {% endblock %} -------------------------------------------------------------------------------- /docs/source/api/deepchecks_client.core.rst: -------------------------------------------------------------------------------- 1 | deepchecks.core 2 | =============== 3 | 4 | .. py:module:: deepchecks_client.core 5 | 6 | .. automodule:: deepchecks_client.core 7 | 8 | .. currentmodule:: deepchecks_client.core 9 | 10 | .. rubric:: Modules 11 | 12 | .. autosummary:: 13 | :caption: Modules 14 | :toctree: generated 15 | 16 | client 17 | api 18 | utils -------------------------------------------------------------------------------- /docs/source/api/deepchecks_client.tabular.rst: -------------------------------------------------------------------------------- 1 | deepchecks.tabular 2 | ================== 3 | 4 | .. py:module:: deepchecks_client.tabular 5 | 6 | .. automodule:: deepchecks_client.tabular 7 | 8 | .. currentmodule:: deepchecks_client.tabular 9 | 10 | .. rubric:: Modules 11 | 12 | .. autosummary:: 13 | :caption: Modules 14 | :toctree: generated 15 | 16 | client 17 | utils -------------------------------------------------------------------------------- /docs/source/api/index.rst: -------------------------------------------------------------------------------- 1 | API Reference 2 | ============= 3 | 4 | Here you can see the api reference. 5 | 6 | .. toctree:: 7 | :caption: API Reference 8 | :hidden: 9 | 10 | deepchecks_client.core 11 | deepchecks_client.tabular 12 | 13 | .. currentmodule:: deepchecks_client 14 | 15 | .. autosummary:: 16 | 17 | core 18 | tabular 19 | 20 | .. autosummary:: 21 | :caption: Classes 22 | :toctree: generated 23 | 24 | DeepchecksClient -------------------------------------------------------------------------------- /docs/source/getting-started/index.rst: -------------------------------------------------------------------------------- 1 | ================= 2 | Getting Started 3 | ================= 4 | 5 | .. toctree:: 6 | :hidden: 7 | :maxdepth: 3 8 | 9 | welcome 10 | deploy_self_host_open_source 11 | environment_setup -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | ================================== 2 | Welcome to Deepchecks Monitoring! 3 | ================================== 4 | 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | getting-started/index 10 | 11 | user-guide/index 12 | 13 | api/index 14 | -------------------------------------------------------------------------------- /docs/source/user-guide/demos/README.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _demos: 3 | 4 | Demos 5 | ===== 6 | 7 | These demos are end-to-end examples of how you can use Deepchecks to detect problems with your models and data and 8 | investigate them. They all start by showing how the relevant data can be sent to Deepchecks, and then proceed to 9 | demonstrate how the various dashboards, alerts and other screens can be used to review potential problems and 10 | discover their root causes. 11 | 12 | To make the best use of these demos, you may want to explore the demo case that most resembles your own use-case. You 13 | can also skip right to the end of each demo if you're only interested in using the system screens. 14 | -------------------------------------------------------------------------------- /docs/source/user-guide/general/custom_checks.rst: -------------------------------------------------------------------------------- 1 | ======================== 2 | Custom checks & metricts 3 | ======================== 4 | For general information about custom checks please refer to the :doc:`docs `. 5 | The support for custom checks and metrics is not automated currently -------------------------------------------------------------------------------- /docs/source/user-guide/tabular/quickstarts/README.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _tabular_quickstarts: 3 | 4 | Tabular Quickstarts 5 | ========================= 6 | 7 | Here you can find quickstarts for easily onboarding your first model and data to deepchecks. 8 | The :ref:`Get Deepchecks Monitoring Up and Running ` is your go-to guide for the quickest 9 | way to understand the basic concepts and send your own data to the system. 10 | 11 | If you want a more detailed guide covering the data preparation, creating a data scheme, 12 | uploading reference data, etc., check out the :ref:`Preparing Your Tabular Data for Deepchecks Monitoring ` 13 | guide. -------------------------------------------------------------------------------- /e2e/.development.env: -------------------------------------------------------------------------------- 1 | oauth_url=https://deepchecks-monitoring.eu.auth0.com 2 | OAUTH_CLIENT_ID= 3 | OAUTH_CLIENT_SECRET= 4 | email_smtp_host=email-smtp.eu-west-1.amazonaws.com 5 | email_smtp_port=25 6 | email_smtp_username= 7 | email_smtp_password= 8 | DATABASE_URI=postgresql://deepchecks:deepchecks@db:5432/deepchecks 9 | ASYNC_DATABASE_URI=postgresql+asyncpg://deepchecks:deepchecks@db:5432/deepchecks 10 | DEPLOYMENT_URL=https://127.0.0.1:8000 11 | SLACK_CLIENT_ID= 12 | SLACK_CLIENT_SECRET= 13 | SLACK_SCOPES=chat:write,incoming-webhook 14 | ASSETS_FOLDER=/code/frontend/dist 15 | AUTH_JWT_SECRET=5qM4Te0knu65k1gG9UGOoba6KVag4HRD 16 | DEBUG_MODE=True 17 | kafka_host=kafka:9092 18 | kafka_security_protocol=PLAINTEXT 19 | kafka_sasl_mechanism=PLAIN 20 | kafka_username= 21 | kafka_password= 22 | kafka_replication_factor=1 23 | kafka_max_metadata_age=1000 24 | redis_uri=redis://redis/0 25 | IS_CLOUD=True 26 | scheduler_sleep_seconds=1 27 | queuer_run_interval=1 -------------------------------------------------------------------------------- /e2e/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "cypress"; 2 | 3 | export default defineConfig({ 4 | viewportWidth: 1920, 5 | viewportHeight: 1080, 6 | e2e: { 7 | setupNodeEvents(on, config) { 8 | // implement node event listeners here 9 | }, 10 | experimentalSessionAndOrigin: true, 11 | chromeWebSecurity: false, 12 | // baseUrl: "https://staging-v2.deepchecks.com", 13 | defaultCommandTimeout: 20000, 14 | responseTimeout: 45000, 15 | baseUrl: "http://127.0.0.1:8000" 16 | }, 17 | env: { 18 | auth0_username: "e2e-testing@deepchecks.com", 19 | auth0_password: "&fNo#fnEb7ZFm2kd", 20 | user_full_name: "Mr. Bot", 21 | organization_name: "test org", 22 | second_username: "gabbay-bot@deepchecks.com", 23 | second_password: "KukiF0rever!" 24 | } 25 | }); 26 | -------------------------------------------------------------------------------- /e2e/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/e2e.ts is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | 22 | beforeEach(() => { 23 | cy.resetState() 24 | }) -------------------------------------------------------------------------------- /e2e/cypress/support/index.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace Cypress { 2 | interface Chainable { 3 | createModelAndVersion(arg1, arg2, arg3, arg4): Promise; 4 | addMonitor(arg): void; 5 | addAlertRule(arg): void; 6 | addPerformanceCheck(arg): Promise; 7 | addDataToVersion(arg1, arg2?, arg3?, arg4?): Promise; 8 | addReferenceToVersion(arg): void; 9 | login(arg1, arg2): void; 10 | createModelAndVersion(arg1, arg2, arg3): Promise; 11 | addNullsCheck(arg): void; 12 | addCheck(arg1, arg2?): Promise; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /e2e/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "cypress": "^10.11.0" 4 | }, 5 | "dependencies": { 6 | "typescript": "^4.8.3" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES6", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noEmit": true, 21 | "jsx": "react-jsx", 22 | "baseUrl": "./src" 23 | }, 24 | "include": [ 25 | "cypress", 26 | "cypress.config.ts" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /frontend/.env.development: -------------------------------------------------------------------------------- 1 | REACT_APP_BASE_API=http://127.0.0.1:8000 2 | # REACT_APP_BASE_API=https://staging-v2.deepchecks.com 3 | REACT_APP_MIXPANEL_ID=TEST_TOKEN 4 | REACT_APP_DATADOG_ID="" 5 | REACT_APP_DATADOG_TOKEN="" -------------------------------------------------------------------------------- /frontend/.env.production: -------------------------------------------------------------------------------- 1 | REACT_APP_NODE_ENV=production 2 | REACT_APP_BASE_API="" 3 | REACT_APP_MIXPANEL_ID=2d6c91b382a9fb587aeabbd67c207d38 4 | REACT_APP_DATADOG_ID="866ddc30-59d3-4d7a-bff3-bb792c963c5e" 5 | REACT_APP_DATADOG_TOKEN="" -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | 25 | /.idea/ 26 | ./vscode -------------------------------------------------------------------------------- /frontend/.nvmrc: -------------------------------------------------------------------------------- 1 | v20.10.0 -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": true, 7 | "trailingComma": "none", 8 | "bracketSpacing": true, 9 | "jsxBracketSameLine": false, 10 | "arrowParens": "avoid" 11 | } 12 | -------------------------------------------------------------------------------- /frontend/orval.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'orval'; 2 | 3 | export default defineConfig({ 4 | api: { 5 | output: { 6 | mode: 'single', 7 | target: './src/api/generated.ts', 8 | client: 'react-query', 9 | prettier: true, 10 | override: { 11 | mutator: { 12 | path: './src/helpers/services/customAxios.ts', 13 | name: 'customInstance' 14 | } 15 | } 16 | }, 17 | input: { 18 | target: `${process.env.REACT_APP_BASE_API}/api/v1/openapi.json` 19 | }, 20 | hooks: { 21 | afterAllFilesWrite: 'eslint --fix ./src/api/generated.ts' 22 | } 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Deepchecks Monitoring 15 | 16 | 17 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Deepchecks Monitoring", 3 | "name": "Deepchecks Monitoring", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "symbol-transparent.png", 12 | "type": "image/png", 13 | "sizes": "any" 14 | } 15 | ], 16 | "start_url": ".", 17 | "display": "standalone", 18 | "theme_color": "#000000", 19 | "background_color": "#ffffff" 20 | } 21 | -------------------------------------------------------------------------------- /frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /frontend/public/symbol-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/frontend/public/symbol-transparent.png -------------------------------------------------------------------------------- /frontend/src/assets/bg/app-example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/frontend/src/assets/bg/app-example.gif -------------------------------------------------------------------------------- /frontend/src/assets/bg/backgrounds.ts: -------------------------------------------------------------------------------- 1 | import { ReactComponent as NoResultsImage } from './noResultsImage.svg'; 2 | import { ReactComponent as LoginScreenImage } from './loginScreenImage.svg'; 3 | 4 | export { NoResultsImage, LoginScreenImage }; 5 | -------------------------------------------------------------------------------- /frontend/src/assets/err/not-found.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/frontend/src/assets/err/not-found.webp -------------------------------------------------------------------------------- /frontend/src/assets/icon/Link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/arow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/arrowDropDown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/bell.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/clear.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/collapseArrowLeft.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/collapseArrowRight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/email.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/fastForward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/fileUpload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/graphLegendCurrent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/graphLegendPrevious.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/graphReport.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/infoIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/infoIconFilled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/markedMail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/nativePlus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/profileImg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepchecks/monitoring/c9ce7977c5af5c993cd35e75e615e9ea31462008/frontend/src/assets/icon/profileImg.jpg -------------------------------------------------------------------------------- /frontend/src/assets/icon/research.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/rewind.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/rotate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/severity/critical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/severity/high.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/severity/low.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/severity/medium.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/sort.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/tableChart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/undo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icon/visualModel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/assets/integrations/mail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/assets/logo/index.js: -------------------------------------------------------------------------------- 1 | import { ReactComponent as Logo } from './logo.svg'; 2 | import { ReactComponent as Logoin1280 } from './logoin1280.svg'; 3 | import { ReactComponent as ColoredLogo } from './colored.svg'; 4 | 5 | export { Logo, Logoin1280, ColoredLogo }; 6 | -------------------------------------------------------------------------------- /frontend/src/components/APIKey/APIKey.styles.tsx: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material'; 2 | 3 | import { StyledContainer, StyledText } from 'components/lib'; 4 | 5 | const StyledApiKeyContainer = styled(StyledContainer)(({ theme }) => ({ 6 | display: 'flex', 7 | flexDirection: 'row', 8 | alignItems: 'center', 9 | width: '100%', 10 | maxWidth: '900px', 11 | padding: '20px', 12 | borderRadius: '16px', 13 | border: `1px solid ${theme.palette.grey.light}` 14 | })); 15 | 16 | const StyledApiKey = styled(StyledText)({ 17 | fontWeight: 700, 18 | fontSize: '24px', 19 | lineHeight: '140%', 20 | display: 'flex', 21 | flexGrow: 1, 22 | wordBreak: 'break-all' 23 | }); 24 | 25 | export { StyledApiKey, StyledApiKeyContainer }; 26 | -------------------------------------------------------------------------------- /frontend/src/components/APIKey/apikey.constants.ts: -------------------------------------------------------------------------------- 1 | export const constants = { 2 | text: 'The API key will allow you to insert, update and access the data through the Deepchecks SDK. Please refer to the documentation ', 3 | link: '', 4 | copy: 'Copy', 5 | regenerate: 'Regenerate', 6 | copied: 'Copied to clipboard' 7 | }; 8 | -------------------------------------------------------------------------------- /frontend/src/components/APIKey/index.ts: -------------------------------------------------------------------------------- 1 | export { APIKey } from './APIKey'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/ActiveColumnsFilters/ActiveColumnsFilters.utils.ts: -------------------------------------------------------------------------------- 1 | export const MAX_CHARACTERS = 60; 2 | 3 | export function buildFiltersChipLabel(key: string, value: [number, number]) { 4 | return `${key}: ${Number.isInteger(value[0]) ? value[0] : parseFloat(value[0].toFixed(3))} - ${ 5 | Number.isInteger(value[1]) ? value[1] : parseFloat(value[1].toFixed(3)) 6 | }`; 7 | } 8 | 9 | export function cutFiltersChipLabel(key: string, labelsString: string) { 10 | return `${key}: ${labelsString.slice(0, MAX_CHARACTERS)}...`; 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/components/ActiveColumnsFilters/ColumnChip.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Chip, ChipProps, styled } from '@mui/material'; 4 | 5 | import { theme } from 'components/lib/theme'; 6 | 7 | export const ColumnChip = (props: ChipProps) => ; 8 | 9 | const StyledChip = styled(Chip)({ 10 | fontSize: '14px', 11 | color: theme.palette.text.primary, 12 | background: theme.palette.grey.light, 13 | height: '36px', 14 | padding: '8px 14px 8px 16px', 15 | borderRadius: '10px', 16 | 17 | '.MuiChip-label': { 18 | fontWeight: 600, 19 | padding: '0 6px 0 0' 20 | }, 21 | 22 | '.MuiChip-deleteIcon': { 23 | color: theme.palette.info.main, 24 | 25 | '&:hover': { 26 | color: theme.palette.info.main, 27 | opacity: 0.5 28 | } 29 | }, 30 | 31 | '.MuiSvgIcon-root': { 32 | margin: 0 33 | } 34 | }); 35 | -------------------------------------------------------------------------------- /frontend/src/components/ActiveColumnsFilters/index.ts: -------------------------------------------------------------------------------- 1 | export { ActiveColumnsFilters } from './ActiveColumnsFilters'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleConfig/alertRuleConfig.constants.ts: -------------------------------------------------------------------------------- 1 | export const constants = { 2 | header: { 3 | titleString: 'Alert', 4 | createdBy: 'Created by: ', 5 | createdByDate: 'Created by date: ' 6 | }, 7 | conditionTitle: 'Condition:', 8 | frequencyTitle: 'Check Frequency:', 9 | frequencyOnce: 'Once', 10 | alertTitle: 'Alert #:', 11 | recentAlertTitle: 'Recent Alert:', 12 | editButton: 'Edit rule', 13 | deleteButton: 'Delete rule', 14 | deleteAlertRule: { 15 | title: 'Delete alert rule', 16 | submit: 'Yes, continue', 17 | messageStart: 'You are about to permanently delete ', 18 | name: (name: string | undefined) => name || 'current', 19 | messageEnd: ' alert, are you sure?' 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleConfig/components/AlertCount/AlertCount.style.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Stack, Typography, styled } from '@mui/material'; 2 | 3 | interface StyledContainerProps { 4 | color: string; 5 | } 6 | 7 | const StyledContainer = styled(Stack, { 8 | shouldForwardProp: prop => prop !== 'color' 9 | })(({ color }) => ({ 10 | alignItems: 'center', 11 | textAlign: 'center', 12 | backgroundColor: color, 13 | borderRadius: '10px 0px 0px 0px' 14 | })); 15 | 16 | const StyledIconBox = styled(Box)({ 17 | padding: '19.5px 18px 0', 18 | height: '45.5px' 19 | }); 20 | 21 | const StyledTypography = styled(Typography)(({ theme }) => ({ 22 | color: theme.palette.common.white, 23 | fontSize: 10, 24 | lineHeight: '12px', 25 | letterSpacing: '0.4px', 26 | marginTop: '10px' 27 | })); 28 | 29 | export { StyledContainer, StyledIconBox, StyledTypography }; 30 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleConfig/components/AlertCount/index.ts: -------------------------------------------------------------------------------- 1 | export { AlertCount } from './AlertCount'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleConfig/components/DeleteAlertRule/DeleteAlertRule.style.tsx: -------------------------------------------------------------------------------- 1 | import { Typography, Box, styled } from '@mui/material'; 2 | 3 | const StyledHeaderContainer = styled(Box)({ 4 | margin: '16px 0 50px 0' 5 | }); 6 | 7 | const StyledTypography = styled(Typography)({ 8 | fontSize: '16px', 9 | textAlign: 'left' 10 | }); 11 | 12 | export { StyledHeaderContainer, StyledTypography }; 13 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleConfig/components/DeleteAlertRule/index.ts: -------------------------------------------------------------------------------- 1 | export { DeleteAlertRule } from './DeleteAlertRule'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleConfig/index.ts: -------------------------------------------------------------------------------- 1 | export { AlertRuleConfigItem } from './AlertRuleConfigItem'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleDialog/AlertRuleDialog.type.ts: -------------------------------------------------------------------------------- 1 | export interface AlertRuleStepBaseProps { 2 | setNextButtonDisabled: React.Dispatch>; 3 | } 4 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRuleDialog/alertRuleDialog.constants.ts: -------------------------------------------------------------------------------- 1 | export const constants = { 2 | dialogHeader: (title: string | undefined) => (title ? `Edit Alert: ${title}` : 'Create New Alert'), 3 | buttons: { 4 | back: (isFirst: boolean) => (isFirst ? 'Cancel' : 'Back'), 5 | next: (isNext: boolean) => (isNext ? 'Save' : 'Next') 6 | }, 7 | content: { 8 | stepTitles: { 9 | basic: 'Basic Info', 10 | monitor: 'Monitor Data', 11 | rule: 'Rule' 12 | } 13 | }, 14 | stepOne: { 15 | nameLabel: 'Alert rule name' 16 | }, 17 | stepTwo: { 18 | aggregationPlaceholder: 'Aggregation window', 19 | frequency: { 20 | tooltipTitle: 'The frequency of sampling the monitor data', 21 | label: 'Frequency' 22 | }, 23 | checkBoxLabel: 'Show in dashboard' 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertRulesItem/index.ts: -------------------------------------------------------------------------------- 1 | export { AlertsRulesItem } from './AlertsRulesItem'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertSnackbar/AlertSnackbar.tsx: -------------------------------------------------------------------------------- 1 | import React, { forwardRef } from 'react'; 2 | import { Alert as MuiAlert, AlertProps, Snackbar, SnackbarProps } from '@mui/material'; 3 | 4 | /* eslint-disable react/display-name */ 5 | const Alert = forwardRef(({ children, ...props }, ref) => ( 6 | 7 | {children} 8 | 9 | )); 10 | 11 | type AlertSnackbarProps = SnackbarProps & AlertProps; 12 | 13 | export function AlertSnackbar({ children, severity, ...props }: AlertSnackbarProps) { 14 | return ( 15 | 16 | {children} 17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertsDrawer/components/AlertsDrillDownToAnalysis/index.ts: -------------------------------------------------------------------------------- 1 | export { AlertsDrillDownToAnalysis } from './AlertsDrillDownToAnalysis'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertsDrawer/index.ts: -------------------------------------------------------------------------------- 1 | export { AlertsDrawer } from './AlertsDrawer'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Alerts/AlertsSnackbar.tsx: -------------------------------------------------------------------------------- 1 | import React, { forwardRef } from 'react'; 2 | import { Alert as MuiAlert, AlertProps, Snackbar, SnackbarProps } from '@mui/material'; 3 | 4 | type AlertsSnackbarProps = SnackbarProps & AlertProps; 5 | 6 | const Alert = forwardRef(({ children, ...props }, ref) => ( 7 | 8 | {children} 9 | 10 | )); 11 | 12 | Alert.displayName = 'Alert'; 13 | 14 | export const AlertsSnackbar = ({ children, severity, ...props }: AlertsSnackbarProps) => ( 15 | 16 | {children} 17 | 18 | ); 19 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisFilters/components/DropdownEndAdornment.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { styled, Typography, InputAdornment } from '@mui/material'; 4 | 5 | import { DropdownArrowComponent } from 'components/DropdownArrowComponent'; 6 | 7 | import { theme } from 'components/lib/theme'; 8 | 9 | interface DropdownEndAdornmentProps { 10 | filtersLength: number; 11 | isDropdownOpen: boolean; 12 | } 13 | 14 | export const DropdownEndAdornment = ({ filtersLength, isDropdownOpen }: DropdownEndAdornmentProps) => ( 15 | 16 | {!!filtersLength && ({filtersLength})} 17 | 18 | 19 | ); 20 | 21 | const StyledFiltersCount = styled(Typography)({ 22 | color: theme.palette.primary.main 23 | }); 24 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisFilters/index.ts: -------------------------------------------------------------------------------- 1 | export { AnalysisFilters } from './AnalysisFilters'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisHeader/components/ModelIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { TableChart, VisualModel, NLPModel } from 'assets/icon/icon'; 4 | 5 | type ModelIconType = 'Tabular' | 'Visual' | 'NLP' | boolean; 6 | 7 | const ModelIcon = (type: ModelIconType, width: number, height: number) => { 8 | switch (type) { 9 | case 'Tabular': 10 | return ; 11 | 12 | case 'Visual': 13 | return ; 14 | 15 | case 'NLP': 16 | return ; 17 | 18 | default: 19 | return ; 20 | } 21 | }; 22 | 23 | export default ModelIcon; 24 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisHeader/index.ts: -------------------------------------------------------------------------------- 1 | export { AnalysisHeader } from './AnalysisHeader'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisItem/components/AnalysisChartItemWithFilters/AnalysisItemSelect/AnalysisItemSelect.types.ts: -------------------------------------------------------------------------------- 1 | import { CheckConfigSchemaParams, MonitorValueConf } from 'api/generated'; 2 | import { CheckFilterTypes, FilteredValues } from 'helpers/utils/checkUtil'; 3 | import { SetStateType } from 'helpers/types'; 4 | 5 | export type SelectSize = 'small' | 'medium'; 6 | 7 | export interface AnalysisItemSelectProps { 8 | label: string; 9 | data?: MonitorValueConf[]; 10 | size?: SelectSize; 11 | type: CheckFilterTypes; 12 | isMostWorstActive: boolean; 13 | isDriftCheck?: boolean; 14 | setIsMostWorstActive: SetStateType; 15 | filteredValues: FilteredValues; 16 | setFilteredValues: SetStateType; 17 | checkParams: CheckConfigSchemaParams; 18 | } 19 | 20 | export type MultiSelectValuesType = string[]; 21 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisItem/components/AnalysisChartItemWithFilters/AnalysisItemSelect/components/ClearButton.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { IconButtonProps } from '@mui/material'; 4 | 5 | import { CloseIcon } from 'assets/icon/icon'; 6 | 7 | import { StyledRoundedSelectCloseButton } from '../AnalysisItemSelect.style'; 8 | 9 | interface ClearButtonProps extends IconButtonProps { 10 | inputCheck: number | string; 11 | } 12 | 13 | const ClearButton = ({ inputCheck, onClick }: ClearButtonProps) => { 14 | const isActive = 15 | (typeof inputCheck === 'number' && inputCheck > 0) || (typeof inputCheck === 'string' && inputCheck !== ''); 16 | 17 | return ( 18 | 19 | 20 | 21 | ); 22 | }; 23 | 24 | export default ClearButton; 25 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisItem/components/AnalysisChartItemWithFilters/AnalysisItemSelect/components/InputLabel.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Typography } from '@mui/material'; 4 | 5 | import { StyledRoundedSelectInputLabel } from '../AnalysisItemSelect.style'; 6 | import { SelectSize } from '../AnalysisItemSelect.types'; 7 | 8 | interface InputLabelProps { 9 | id: string; 10 | label: string; 11 | size: SelectSize; 12 | } 13 | 14 | const sizeMap = { 15 | small: 'small', 16 | medium: 'normal' 17 | } as const; 18 | 19 | const InputLabel = ({ id, label, size }: InputLabelProps) => ( 20 | 21 | 22 | {label} 23 | 24 | 25 | ); 26 | 27 | export default InputLabel; 28 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisItem/components/AnalysisChartItemWithFilters/AnalysisItemSelect/components/ResetSelectionButton.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Box, ButtonProps } from '@mui/material'; 4 | 5 | import { StyledResetSelectionButton } from '../AnalysisItemSelect.style'; 6 | 7 | interface ResetSelectionButtonProps extends ButtonProps { 8 | isAnythingSelected: number; 9 | } 10 | 11 | const ResetSelectionButton = ({ isAnythingSelected, onClick }: ResetSelectionButtonProps) => 12 | isAnythingSelected ? ( 13 | 14 | Reset Selection 15 | 16 | ) : ( 17 | 18 | ); 19 | 20 | export default ResetSelectionButton; 21 | -------------------------------------------------------------------------------- /frontend/src/components/Analysis/AnalysisItem/components/AnalysisChartItemWithFilters/index.ts: -------------------------------------------------------------------------------- 1 | export { AnalysisChartItemWithFilters } from './AnalysisChartItemWithFilters'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/AnalysisDrillDown/AnalysisDrillDown.types.ts: -------------------------------------------------------------------------------- 1 | import { CheckSchema, MonitorCheckConfSchema } from 'api/generated'; 2 | import { DrawerProps } from '@mui/material'; 3 | import { CheckType } from 'helpers/types/check'; 4 | 5 | export interface ClassOrFeature { 6 | type: string; 7 | value: string; 8 | } 9 | 10 | export interface AnalysisDrillDownProps extends DrawerProps { 11 | modelName: string; 12 | frequency?: number; 13 | datasetName: string | null; 14 | check: CheckSchema | null; 15 | modelVersionId: number | null; 16 | timeLabel: number | null; 17 | additionalKwargs: MonitorCheckConfSchema | null; 18 | onCloseIconClick: () => void; 19 | type: CheckType; 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/components/AnalysisDrillDown/AnalysisDrillDownInfo/AnalysisDrillDownInfoItem.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { styled, Typography, Box, BoxProps } from '@mui/material'; 4 | 5 | interface AnalysisDrillDownInfoItemProps extends BoxProps { 6 | title: string; 7 | value: string; 8 | } 9 | 10 | export const AnalysisDrillDownInfoItem = ({ title, value, ...props }: AnalysisDrillDownInfoItemProps) => ( 11 | 12 | {title} 13 | {value} 14 | 15 | ); 16 | 17 | const StyledItemName = styled(Typography)({ 18 | fontSize: '12px', 19 | marginBottom: '4px' 20 | }); 21 | 22 | const StyledItemValue = styled(Typography)({ 23 | fontWeight: 600, 24 | fontSize: '14px', 25 | lineHeight: '175%' 26 | }); 27 | -------------------------------------------------------------------------------- /frontend/src/components/AnalysisDrillDown/AnalysisDrillDownInfo/index.ts: -------------------------------------------------------------------------------- 1 | export { AnalysisDrillDownInfo } from './AnalysisDrillDownInfo'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/AnalysisDrillDown/index.ts: -------------------------------------------------------------------------------- 1 | export { AnalysisDrillDown } from './AnalysisDrillDown'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/CustomDrawer/CustomDrawer.tsx: -------------------------------------------------------------------------------- 1 | import React, { PropsWithChildren } from 'react'; 2 | 3 | import { Drawer, DrawerProps, styled } from '@mui/material'; 4 | 5 | import { Loader } from 'components/base/Loader/Loader'; 6 | 7 | interface CustomDrawerProps extends DrawerProps { 8 | loading?: boolean; 9 | padding?: string; 10 | } 11 | 12 | export const CustomDrawer = ({ loading, children, ...props }: PropsWithChildren) => ( 13 | 14 | {loading ? : children} 15 | 16 | ); 17 | 18 | interface StyledDrawerProps { 19 | padding?: string; 20 | } 21 | 22 | export const StyledDrawer = styled(Drawer, { shouldForwardProp: prop => prop !== 'padding' })( 23 | ({ padding }) => ({ 24 | '& .MuiPaper-root': { 25 | width: 1090, 26 | height: '100%', 27 | padding, 28 | 29 | '@media (max-width: 1090px)': { 30 | width: '100vw' 31 | } 32 | } 33 | }) 34 | ); 35 | -------------------------------------------------------------------------------- /frontend/src/components/CustomDrawer/CustomDrawerHeader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { styled, IconButton, Typography, Stack, StackProps } from '@mui/material'; 4 | 5 | import { CloseIcon } from 'assets/icon/icon'; 6 | 7 | interface CustomDrawerHeaderProps extends StackProps { 8 | title: string; 9 | onClick: () => void; 10 | } 11 | 12 | export const CustomDrawerHeader = ({ title, onClick, ...props }: CustomDrawerHeaderProps) => ( 13 | 14 | {title} 15 | 16 | 17 | 18 | 19 | ); 20 | 21 | const StyledContainer = styled(Stack)({ 22 | flexDirection: 'row', 23 | alignItems: 'center', 24 | justifyContent: 'space-between' 25 | }); 26 | -------------------------------------------------------------------------------- /frontend/src/components/CustomDrawer/index.ts: -------------------------------------------------------------------------------- 1 | export { CustomDrawer } from './CustomDrawer'; 2 | export { CustomDrawerHeader } from './CustomDrawerHeader'; 3 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/Dashboard.types.ts: -------------------------------------------------------------------------------- 1 | export enum DialogNames { 2 | CreateAlert = 'Create New Alert', 3 | CreateMonitor = 'Create Monitor', 4 | EditMonitor = 'Edit Monitor' 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/DataIngestion/index.ts: -------------------------------------------------------------------------------- 1 | export { DataIngestion } from './DataIngestion'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/ModelList/components/AlertsCountWidget.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Stack } from '@mui/material'; 4 | 5 | import { AlertCount, SEVERITY } from 'components/Alerts/AlertCount'; 6 | import { SelectedModelAlerts } from '../ModelList'; 7 | 8 | interface AlertsCountWidgetProps { 9 | selectedModelAlerts: SelectedModelAlerts | null; 10 | } 11 | 12 | export const AlertsCountWidget = ({ selectedModelAlerts }: AlertsCountWidgetProps) => { 13 | return ( 14 | 15 | 16 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/ModelList/components/ModelItem/NoDataError/NoDataError.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Tooltip } from '@mui/material'; 3 | import { theme } from 'components/lib/theme'; 4 | 5 | const NoDataErrorToolTip = styled(Tooltip)` 6 | margin: 0 16px 0 auto; 7 | `; 8 | 9 | const NoDataLoaderContained = styled.div` 10 | width: 40px; 11 | height: 40px; 12 | `; 13 | 14 | const NoDataErrorImg = styled.img` 15 | width: 24px; 16 | `; 17 | 18 | const NoDataErrorPopperTextBox = styled.span` 19 | color: ${theme.palette.common.white}; 20 | `; 21 | 22 | const NoDataErrorPopperLink = styled.a` 23 | text-decoration: none; 24 | color: ${theme.palette.primary.main}; 25 | `; 26 | 27 | export { NoDataErrorToolTip, NoDataErrorImg, NoDataErrorPopperTextBox, NoDataErrorPopperLink, NoDataLoaderContained }; 28 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/ModelList/components/ModelItem/NoDataError/NoDataErrorPopper.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { constants } from 'components/Dashboard/dashboard.constants'; 4 | import { NoDataErrorPopperLink, NoDataErrorPopperTextBox } from './NoDataError.styles'; 5 | 6 | const { popperText, popperLink, popperLinkText } = constants.modelList.modelItem.noDataErrorToolTipText; 7 | 8 | const NoDataErrorPopper = () => ( 9 | 10 | {popperText} 11 | 12 | {popperLinkText} 13 | 14 | 15 | ); 16 | 17 | export default NoDataErrorPopper; 18 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/ModelList/components/ModelItem/index.ts: -------------------------------------------------------------------------------- 1 | export { ModelItem } from './ModelItem'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/ModelList/index.ts: -------------------------------------------------------------------------------- 1 | export { ModelList } from './ModelList'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorDialog/components/ActiveAlertsModal.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { DialogProps } from '@mui/material/Dialog'; 4 | 5 | import { StyledDialog, StyledText } from 'components/lib'; 6 | 7 | import { constants } from '../monitorDialog.constants'; 8 | 9 | interface ActiveAlertsModalProps extends DialogProps { 10 | setActiveAlertsModalOpen: (value: React.SetStateAction) => void; 11 | handleActiveAlertResolve: () => void; 12 | } 13 | 14 | const { message, submitButtonLabel, title } = constants.activeAlertsModal; 15 | 16 | export const ActiveAlertsModal = ({ 17 | setActiveAlertsModalOpen, 18 | handleActiveAlertResolve, 19 | ...props 20 | }: ActiveAlertsModalProps) => ( 21 | setActiveAlertsModalOpen(false)} 24 | submitButtonLabel={submitButtonLabel} 25 | submitButtonAction={handleActiveAlertResolve} 26 | {...props} 27 | > 28 | 29 | 30 | ); 31 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorDialog/components/CreateAlertForm/index.ts: -------------------------------------------------------------------------------- 1 | export { CreateAlertForm } from './CreateAlertForm'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorDialog/components/MonitorForm/MonitorForm.helpers.ts: -------------------------------------------------------------------------------- 1 | import { SelectValues } from 'helpers/types'; 2 | import { timeValues } from 'helpers/base/time'; 3 | 4 | export function getLookBack(frequency: SelectValues) { 5 | switch (frequency) { 6 | case timeValues.hour: 7 | return timeValues.week; 8 | 9 | case timeValues.day: 10 | return timeValues.month; 11 | 12 | case timeValues.week: 13 | return timeValues.threeMonths; 14 | 15 | case timeValues.month: 16 | return timeValues.year; 17 | 18 | default: 19 | return timeValues.month; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorDialog/components/MonitorForm/components/MonitorFormSteps.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { StepLabel, Stepper, Step, Box } from '@mui/material'; 4 | 5 | import { constants } from '../../../monitorDialog.constants'; 6 | 7 | interface MonitorFormStepsProps { 8 | activeStep: number; 9 | } 10 | 11 | const { basicInfo, monitorData } = constants.monitorForm.steps; 12 | const STEPS = [basicInfo, monitorData]; 13 | 14 | export const MonitorFormSteps = ({ activeStep }: MonitorFormStepsProps) => ( 15 | ({ 17 | position: 'sticky', 18 | top: 0, 19 | zIndex: 999, 20 | width: 1, 21 | padding: '15px 0', 22 | backgroundColor: theme.palette.common.white 23 | })} 24 | > 25 | 26 | {STEPS.map(label => ( 27 | 28 | {label} 29 | 30 | ))} 31 | 32 | 33 | ); 34 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorDialog/components/MonitorForm/index.ts: -------------------------------------------------------------------------------- 1 | export { MonitorForm } from './MonitorForm'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorDialog/index.ts: -------------------------------------------------------------------------------- 1 | export { MonitorDialog } from './MonitorDialog'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorList/components/DeleteMonitor/DeleteMonitor.style.tsx: -------------------------------------------------------------------------------- 1 | import { Button, styled, Stack, Typography } from '@mui/material'; 2 | 3 | export const StyledContainer = styled(Stack)({ 4 | width: '500px', 5 | padding: '19px 18px 30px 30px' 6 | }); 7 | 8 | export const StyledHeading = styled(Typography)({ 9 | fontWeight: 700, 10 | flexGrow: 1 11 | }); 12 | 13 | export const StyledText = styled(Typography)({ 14 | maxWidth: '423px', 15 | padding: '36.5px 0 61.5px' 16 | }); 17 | 18 | export const StyledActionButton = styled(Button)({ 19 | ':first-of-type': { 20 | marginRight: '20px' 21 | }, 22 | 23 | fontSize: '14px', 24 | fontWeight: 500, 25 | lineHeight: '22px', 26 | letterSpacing: '1px', 27 | padding: '0 14px' 28 | }); 29 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorList/components/DeleteMonitor/index.ts: -------------------------------------------------------------------------------- 1 | export { DeleteMonitor } from './DeleteMonitor'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorList/components/GraphicsSection/components/MonitorAlertRuleWidget/MonitorAlertRuleWidget.style.tsx: -------------------------------------------------------------------------------- 1 | import { Typography, styled } from '@mui/material'; 2 | import { FlexRowContainer } from 'components/base/Container/Container.styles'; 3 | 4 | const StyledContainer = styled(FlexRowContainer)({ 5 | marginTop: 'auto', 6 | paddingTop: '16px' 7 | }); 8 | 9 | const StyledTypography = styled(Typography)({ 10 | marginLeft: '5px', 11 | fontSize: '14px' 12 | }); 13 | 14 | interface ColorOptions { 15 | color: string; 16 | } 17 | 18 | const StyledSeverity = styled(Typography, { 19 | shouldForwardProp: prop => prop !== 'color' 20 | })(({ color }) => ({ 21 | display: 'inline-block', 22 | fontWeight: 600, 23 | color, 24 | fontSize: '14px' 25 | })) as typeof Typography; 26 | 27 | export { StyledContainer, StyledTypography, StyledSeverity }; 28 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorList/components/GraphicsSection/components/MonitorAlertRuleWidget/index.ts: -------------------------------------------------------------------------------- 1 | export { MonitorAlertRuleWidget } from './MonitorAlertRuleWidget'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorList/components/GraphicsSection/index.ts: -------------------------------------------------------------------------------- 1 | export { GraphicsSection } from './GraphicsSection'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorList/index.ts: -------------------------------------------------------------------------------- 1 | export { MonitorList } from './MonitorList'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/MonitorListHeader/MonitorListHeader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { StyledButton, StyledContainer, StyledText } from 'components/lib'; 4 | 5 | import { NativePlus } from 'assets/icon/icon'; 6 | 7 | import { DialogNames } from '../Dashboard.types'; 8 | 9 | interface MonitorListHeaderProps { 10 | onClick: (monitorName: DialogNames) => void; 11 | } 12 | 13 | export const MonitorListHeader = ({ onClick }: MonitorListHeaderProps) => { 14 | const handleClick = () => onClick(DialogNames.CreateMonitor); 15 | 16 | return ( 17 | 18 | 19 | } width="170px" /> 20 | 21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /frontend/src/components/DiagramLine/LegendsList/components/HorizontalScrolling/index.ts: -------------------------------------------------------------------------------- 1 | export { HorizontalScrolling as default } from './HorizontalScrolling'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/DiagramLine/NoData/NoDataToShow.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Box, styled, Typography, BoxProps } from '@mui/material'; 4 | 5 | import { NoDataToShowIcon } from 'assets/icon/icon'; 6 | 7 | import { theme } from 'components/lib/theme'; 8 | 9 | interface NoDataToShowProps extends BoxProps { 10 | title: string; 11 | } 12 | 13 | export const NoDataToShow = ({ title, ...props }: NoDataToShowProps) => ( 14 | 15 | 16 | {title} 17 | 18 | ); 19 | 20 | const StyledTypography = styled(Typography)({ 21 | color: theme.palette.grey[300], 22 | fontSize: '26px', 23 | transform: 'translateY(-50px)', 24 | textAlign: 'center', 25 | width: '100%', 26 | 27 | '@media (max-width: 1536px)': { 28 | fontSize: '20px' 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /frontend/src/components/DiagramLine/diagramLine.constants.ts: -------------------------------------------------------------------------------- 1 | export const constants = { 2 | noDataMessage: 'No data for this monitor configuration' 3 | }; 4 | -------------------------------------------------------------------------------- /frontend/src/components/DropdownArrowComponent.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; 4 | import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp'; 5 | 6 | interface DropdownArrowComponentProps { 7 | isDropdownOpen: boolean; 8 | } 9 | 10 | export const DropdownArrowComponent = ({ isDropdownOpen }: DropdownArrowComponentProps) => 11 | isDropdownOpen ? : ; 12 | -------------------------------------------------------------------------------- /frontend/src/components/FiltersSort/components/FiltersSortButton.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Button } from '@mui/material'; 4 | 5 | import { Sort } from '../../../assets/icon/icon'; 6 | 7 | interface FiltersSortButtonProps { 8 | label?: string; 9 | isLoading: boolean; 10 | handleOpenSortMenu: (event: React.MouseEvent) => void; 11 | } 12 | 13 | const FiltersSortButton = ({ handleOpenSortMenu, isLoading, label = 'Sort' }: FiltersSortButtonProps) => ( 14 | 17 | ); 18 | 19 | export default FiltersSortButton; 20 | -------------------------------------------------------------------------------- /frontend/src/components/Layout/Sidebar/components/AnalysisSubMenu/index.ts: -------------------------------------------------------------------------------- 1 | export { AnalysisSubMenu } from './AnalysisSubMenu'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Layout/Sidebar/components/SidebarMenuItem/index.ts: -------------------------------------------------------------------------------- 1 | export { SidebarMenuItem } from './SidebarMenuItem'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Layout/Sidebar/components/UserInfo/components/ReportModal/ReportModal.style.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Modal, styled, TextField, Typography } from '@mui/material'; 2 | 3 | export const StyledModal = styled(Modal)({ 4 | display: 'flex', 5 | alignItems: 'center', 6 | justifyContent: 'center' 7 | }); 8 | 9 | export const StyledDescription = styled(Typography)({ 10 | fontWeight: '400', 11 | fontSize: '16px', 12 | marginBottom: 0 13 | }); 14 | 15 | export const StyledForm = styled(Box)({ 16 | display: 'flex', 17 | flexDirection: 'column' 18 | }); 19 | 20 | export const StyledTextField = styled(TextField)({ 21 | '& fieldset': { 22 | borderRadius: '3px 3px 0 0' 23 | } 24 | }); 25 | 26 | export const StyledUploadArea = styled(Box)({ 27 | display: 'flex', 28 | alignItems: 'center', 29 | width: '100%', 30 | height: '40px', 31 | borderRadius: '0 0 3px 3px', 32 | border: 'solid 1px #bbb', 33 | borderTop: 'none' 34 | }); 35 | -------------------------------------------------------------------------------- /frontend/src/components/Layout/Sidebar/components/UserInfo/components/ReportModal/index.ts: -------------------------------------------------------------------------------- 1 | export { ReportModal } from './ReportModal'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Layout/Sidebar/components/UserInfo/index.ts: -------------------------------------------------------------------------------- 1 | export { UserInfo } from './UserInfo'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Layout/Sidebar/index.ts: -------------------------------------------------------------------------------- 1 | export { Sidebar } from './Sidebar'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/components/FooterItem.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Typography, StackProps } from '@mui/material'; 4 | 5 | import { StyledFooterItem } from '../ModelInfoItem.style'; 6 | 7 | interface FooterItemProps extends StackProps { 8 | value: number | undefined; 9 | title: string; 10 | } 11 | 12 | export const FooterItem = ({ value, title, ...props }: FooterItemProps) => ( 13 | 14 | {value || 0} 15 | {title} 16 | 17 | ); 18 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/components/ModalItemViewDetails/ModalItemViewDetails.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { StyledModal, StyledModalCloseButton, StyledModalContent } from './ModalItemViewDetails.style'; 3 | import { CloseIcon } from 'assets/icon/icon'; 4 | import { ConnectedModelSchema } from 'api/generated'; 5 | import { ModelDetails } from './ModelDetails'; 6 | 7 | interface ModalItemDetailsProps { 8 | open: boolean; 9 | onClose: () => void; 10 | model: ConnectedModelSchema; 11 | } 12 | 13 | export const ModalItemViewDetails = ({ open, onClose, model }: ModalItemDetailsProps) => ( 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | ); 23 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/components/ModalItemViewDetails/ModelDetails/components/ModelNotes/components/NotesList.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Box, styled } from '@mui/material'; 3 | import { ModelNoteSchema } from 'api/generated'; 4 | import { SingleNote } from './SingleNote'; 5 | 6 | interface NotesListProps { 7 | notes: ModelNoteSchema[]; 8 | onDeleteNote: (noteId: string) => void; 9 | } 10 | 11 | export const NotesList = ({ notes, onDeleteNote }: NotesListProps) => ( 12 | 13 | {notes.map(note => ( 14 | 15 | ))} 16 | 17 | ); 18 | 19 | const StyledList = styled(Box)({ 20 | height: '100%', 21 | width: '65%', 22 | padding: '12px 32px 0 0', 23 | overflowY: 'auto', 24 | margin: 0 25 | }); 26 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/components/ModalItemViewDetails/ModelDetails/components/ModelNotes/index.ts: -------------------------------------------------------------------------------- 1 | export { ModelNotes } from './ModelNotes'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/components/ModalItemViewDetails/ModelDetails/index.ts: -------------------------------------------------------------------------------- 1 | export { ModelDetails } from './ModelDetails'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/components/ModalItemViewDetails/index.ts: -------------------------------------------------------------------------------- 1 | export { ModalItemViewDetails } from './ModalItemViewDetails'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/components/ModelInfoBadge.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Typography, StackProps } from '@mui/material'; 4 | 5 | import { StyledModelInfoBadge } from '../ModelInfoItem.style'; 6 | 7 | interface ModelInfoBadgeProps extends StackProps { 8 | value: number | undefined; 9 | title: string; 10 | } 11 | 12 | export const ModelInfoBadge = ({ value, title, ...props }: ModelInfoBadgeProps) => ( 13 | 14 | {value || 0} 15 | {title} 16 | 17 | ); 18 | -------------------------------------------------------------------------------- /frontend/src/components/ModelInfoItem/index.ts: -------------------------------------------------------------------------------- 1 | export { ModelInfoItem } from './ModelInfoItem'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/NotFound/NotFound.styles.tsx: -------------------------------------------------------------------------------- 1 | import { FlexColumnContainer } from 'components/base/Container/Container.styles'; 2 | import { StyledH1 } from 'components/base/Text/Header.styles'; 3 | import styled from 'styled-components'; 4 | import { theme } from 'components/lib/theme'; 5 | 6 | const NotFoundContainer = styled(FlexColumnContainer)` 7 | width: 100vw; 8 | height: 100vh; 9 | background: ${theme.palette.common.white}; 10 | `; 11 | 12 | const NotFoundImg = styled.img` 13 | margin: 10vh auto 0; 14 | width: 50vw; 15 | height: 50vh; 16 | `; 17 | 18 | const NotFoundTitle = styled(StyledH1)` 19 | text-decoration: none; 20 | color: ${theme.palette.primary.dark}; 21 | font-weight: 900; 22 | font-size: 3rem; 23 | margin: 24px auto; 24 | `; 25 | 26 | const NotFoundDescription = styled.p` 27 | text-decoration: none; 28 | color: ${theme.palette.primary.main}; 29 | font-size: 1.25rem; 30 | margin: 16px 0 28px; 31 | `; 32 | 33 | export { NotFoundContainer, NotFoundImg, NotFoundDescription, NotFoundTitle }; 34 | -------------------------------------------------------------------------------- /frontend/src/components/NotFound/NotFound.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Button } from '@mui/material'; 3 | 4 | import { NotFoundContainer, NotFoundImg, NotFoundDescription, NotFoundTitle } from './NotFound.styles'; 5 | 6 | import imgLogo from 'assets/err/not-found.webp'; 7 | 8 | import { constants } from './notFound.constants'; 9 | 10 | const NotFound = () => ( 11 | 12 | 13 | {constants.title} 14 | {constants.description} 15 | 16 | 17 | ); 18 | 19 | export default NotFound; 20 | -------------------------------------------------------------------------------- /frontend/src/components/NotFound/notFound.constants.ts: -------------------------------------------------------------------------------- 1 | export const constants = { 2 | title: 'Page Not Found', 3 | imgAlt: '404', 4 | description: "We couldn't find the content you were looking for...", 5 | button: { 6 | link: '/', 7 | label: 'Back to Dashboard' 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /frontend/src/components/RangePickerInput.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { TextField, TextFieldProps } from '@mui/material'; 3 | import deepmerge from 'deepmerge'; 4 | 5 | export type RangePickerInputProps = TextFieldProps & { 6 | min?: number; 7 | max?: number; 8 | step?: number; 9 | }; 10 | 11 | const RangePickerInput = ({ min, max, step, inputProps, ...props }: RangePickerInputProps) => ( 12 | (inputProps, { 17 | min, 18 | max, 19 | step 20 | })} 21 | /> 22 | ); 23 | 24 | export default RangePickerInput; 25 | -------------------------------------------------------------------------------- /frontend/src/components/SegmentsDrillDown/components/GraphLayout.tsx: -------------------------------------------------------------------------------- 1 | import React, { PropsWithChildren } from 'react'; 2 | 3 | import { styled, Box, Typography, BoxProps } from '@mui/material'; 4 | 5 | interface GraphLayoutProps extends BoxProps { 6 | checkPerSegment?: boolean; 7 | title?: string; 8 | } 9 | 10 | export const GraphLayout = ({ title, checkPerSegment, children, ...props }: PropsWithChildren) => ( 11 | 12 | {title} 13 | {children} 14 | 15 | ); 16 | 17 | const StyledContainer = styled(Box)({ 18 | padding: '20px 40px', 19 | borderRadius: '16px', 20 | boxShadow: '0px 0px 25px 2px rgba(0, 0, 0, 0.09)', 21 | background: 'white' 22 | }); 23 | 24 | const StyledTitle = styled(Typography)({ 25 | fontWeight: 500, 26 | fontSize: '18px', 27 | lineHeight: '160%', 28 | letterSpacing: '0.15px' 29 | }); 30 | -------------------------------------------------------------------------------- /frontend/src/components/SegmentsDrillDown/components/NoGraphDataToShow.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { styled, Typography } from '@mui/material'; 4 | 5 | import { GraphLayout } from './GraphLayout'; 6 | 7 | export const NoGraphDataToShow = () => ( 8 | 9 | No data to show 10 | 11 | ); 12 | 13 | const StyledNoDataMessage = styled(Typography)(({ theme }) => ({ 14 | fontSize: '20px', 15 | textAlign: 'center', 16 | color: theme.palette.text.disabled 17 | })); 18 | -------------------------------------------------------------------------------- /frontend/src/components/SegmentsDrillDown/index.ts: -------------------------------------------------------------------------------- 1 | export { SegmentsDrillDown } from './SegmentsDrillDown'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/Select/CustomStyledSelect.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | import { Select, styled, SelectProps } from '@mui/material'; 4 | 5 | import { theme } from 'components/lib/theme'; 6 | 7 | interface CustomStyledSelectProps extends SelectProps { 8 | children: ReactNode; 9 | } 10 | 11 | export const CustomStyledSelect = ({ children, ...props }: CustomStyledSelectProps) => ( 12 | {children} 13 | ); 14 | 15 | export const StyledSelect = styled(Select)({ 16 | fontWeight: 600, 17 | minWidth: 150, 18 | color: theme.palette.text.primary, 19 | borderRadius: '10px', 20 | 21 | '@media (max-width: 1536px)': { 22 | fontSize: '13px' 23 | }, 24 | 25 | '& .MuiOutlinedInput-notchedOutline': { 26 | border: `1px solid ${theme.palette.grey[200]}` 27 | } 28 | }); 29 | -------------------------------------------------------------------------------- /frontend/src/components/Select/SelectTimeframe.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { SelectPrimary, SelectPrimaryProps, SelectPrimaryItem } from './SelectPrimary'; 3 | import useStatsTime, { labelPrefix } from '../../helpers/hooks/useStatsTime'; 4 | 5 | interface SelectTimeframeProps extends Omit { 6 | label?: SelectPrimaryProps['label']; 7 | prefix?: string; 8 | } 9 | 10 | export const SelectTimeframe = ({ label = 'Timeframe', prefix = labelPrefix, ...props }: SelectTimeframeProps) => { 11 | const [, , _times] = useStatsTime(); 12 | 13 | const times = _times.map(({ label, ...time }) => ({ ...time, label: label.replace(labelPrefix, prefix) })); 14 | 15 | return ( 16 | 17 | {times.map(({ label, value }) => ( 18 | 19 | {label} 20 | 21 | ))} 22 | 23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /frontend/src/components/Subcategory.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | import { Box, BoxProps, styled } from '@mui/material'; 4 | 5 | interface SubcategoryProps extends BoxProps { 6 | children: ReactNode; 7 | } 8 | 9 | export function Subcategory({ children, ...otherProps }: SubcategoryProps) { 10 | return ( 11 | 12 | 13 | {children} 14 | 15 | ); 16 | } 17 | 18 | const StyledSubCategory = styled(Box)(({ theme }) => ({ 19 | height: '52px', 20 | margin: '24px 24px 0 0', 21 | borderLeft: `2px solid ${theme.palette.primary.main}` 22 | })); 23 | 24 | const StyledChildrenContainer = styled(Box)({ 25 | width: '100%', 26 | marginTop: '24px' 27 | }); 28 | -------------------------------------------------------------------------------- /frontend/src/components/Submenu.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | import { List, Paper } from '@mui/material'; 3 | 4 | interface SubmenuProps { 5 | children: ReactNode; 6 | position?: 'left' | 'right'; 7 | open: boolean; 8 | } 9 | 10 | export const Submenu = ({ children, open, position = 'left' }: SubmenuProps) => { 11 | if (!open) { 12 | return null; 13 | } 14 | 15 | const style = position === 'left' ? { marginLeft: 'calc(-100% - 10px)' } : { marginleft: '10px' }; 16 | 17 | return ( 18 | 27 | 32 | {children} 33 | 34 | 35 | ); 36 | }; 37 | -------------------------------------------------------------------------------- /frontend/src/components/SuiteView/RunDownloadSuite/index.ts: -------------------------------------------------------------------------------- 1 | export { RunDownloadSuite } from './RunDownloadSuite'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/SuiteView/SuiteViewLoading.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import loadingImg from '../../assets/icon/loading-suite.svg'; 4 | 5 | import { StyledImage, StyledText } from 'components/lib'; 6 | import { SuiteViewLoadingBar, SuiteViewLoadingContainer } from './SuiteView.styles'; 7 | 8 | import { constants } from 'components/SuiteView/helpers/suiteViewPage.constants'; 9 | 10 | const SuiteViewLoading = () => ( 11 | 12 | 13 | 14 | 15 | 16 | 17 | ); 18 | 19 | export default SuiteViewLoading; 20 | -------------------------------------------------------------------------------- /frontend/src/components/SuiteView/helpers/suiteViewPage.constants.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | 3 | export const constants = { 4 | loadingHeader: 'Almost there...', 5 | loadingDescription: 'Running the full test suite is in progress', 6 | loadingImgAlt: 'loading suite img', 7 | suiteViewHeaderTitle: (modelVersionId: number) => `Test suite for model: ${modelVersionId}`, 8 | suiteViewHeaderDate: (startDate: string, endDate: string) => 9 | `${dayjs(startDate).format('lll')} - ${dayjs(endDate).format('lll')}`, 10 | suiteViewHeaderCategory: 'category2:', 11 | suiteViewHeaderCart: 'cart_to_p_hist:' 12 | }; 13 | -------------------------------------------------------------------------------- /frontend/src/components/TabPanel.tsx: -------------------------------------------------------------------------------- 1 | import React, { PropsWithChildren } from 'react'; 2 | 3 | import { Box } from '@mui/material'; 4 | 5 | interface TabPanelProps { 6 | index: number; 7 | value: number; 8 | } 9 | 10 | export const TabPanel = ({ children, value, index, ...props }: PropsWithChildren) => ( 11 | 14 | ); 15 | -------------------------------------------------------------------------------- /frontend/src/components/WorkspaceSettings/WorkspaceSettings.helpers.ts: -------------------------------------------------------------------------------- 1 | type Selected = readonly number[]; 2 | 3 | export const selectMultiple = ( 4 | event: React.MouseEvent, 5 | id: number, 6 | selected: Selected, 7 | setSelected: React.Dispatch> 8 | ) => { 9 | const selectedIndex = selected.indexOf(id); 10 | let newSelected: readonly number[] = []; 11 | 12 | if (selectedIndex === -1) { 13 | newSelected = newSelected.concat(selected, id); 14 | } else if (selectedIndex === 0) { 15 | newSelected = newSelected.concat(selected.slice(1)); 16 | } else if (selectedIndex === selected.length - 1) { 17 | newSelected = newSelected.concat(selected.slice(0, -1)); 18 | } else if (selectedIndex > 0) { 19 | newSelected = newSelected.concat(selected.slice(0, selectedIndex), selected.slice(selectedIndex + 1)); 20 | } 21 | 22 | setSelected(newSelected); 23 | }; 24 | 25 | export const isSelected = (id: number, selected: Selected) => selected.indexOf(id) !== -1; 26 | -------------------------------------------------------------------------------- /frontend/src/components/WorkspaceSettings/components/Members/Members.type.ts: -------------------------------------------------------------------------------- 1 | import { MemberSchema } from 'api/generated'; 2 | 3 | export interface MembersActionDialog { 4 | open: boolean; 5 | closeDialog: () => void; 6 | } 7 | 8 | export interface MembersActionDialogWithRefetch extends MembersActionDialog { 9 | refetchMembers: () => void; 10 | } 11 | 12 | export interface MembersActionDialogWithMember extends MembersActionDialogWithRefetch { 13 | member: MemberSchema; 14 | } 15 | 16 | export enum MembersActionDialogOptions { 17 | invite = 'invite', 18 | edit = 'edit', 19 | remove = 'remove', 20 | removeSelected = 'removeSelected', 21 | assignModels = 'assignModels', 22 | deleteWorkspace = 'deleteWorkspace' 23 | } 24 | -------------------------------------------------------------------------------- /frontend/src/components/WorkspaceSettings/components/Members/components/MembersActionDialogContentLayout.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Stack, StackProps } from '@mui/material'; 4 | 5 | interface MembersActionDialogContentLayoutProps extends StackProps { 6 | children: React.ReactNode; 7 | } 8 | 9 | export const MembersActionDialogContentLayout = ({ 10 | children, 11 | ...otherProps 12 | }: MembersActionDialogContentLayoutProps) => ( 13 | 14 | {children} 15 | 16 | ); 17 | -------------------------------------------------------------------------------- /frontend/src/components/WorkspaceSettings/components/ModelsTab/components/ModelsTabTable/ModelsTabTableHead.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import TableHead, { TableHeadProps } from '@mui/material/TableHead'; 4 | 5 | import { StyledTableRow, StyledTableCellBold } from '../../../../WorkspaceSettings.styles'; 6 | 7 | import { constants } from '../../modelsTab.constants'; 8 | 9 | const { actions, members, name } = constants.table; 10 | 11 | export const ModelsTabTableHead = ({ ...props }: TableHeadProps) => ( 12 | 13 | 14 | {name} 15 | {members} 16 | 17 | {actions} 18 | 19 | 20 | 21 | ); 22 | -------------------------------------------------------------------------------- /frontend/src/components/WorkspaceSettings/components/ModelsTab/modelsTab.constants.ts: -------------------------------------------------------------------------------- 1 | export const constants = { 2 | searchFieldPlaceholder: 'Search Models...', 3 | table: { 4 | ariaLabel: 'workspace settings models table', 5 | name: 'Model name', 6 | members: 'Members', 7 | actions: 'Actions' 8 | }, 9 | editMembers: 'Edit members', 10 | dialog: { 11 | inputPlaceholder: 'Search members...', 12 | submitButtonLabel: 'Save' 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /frontend/src/components/WorkspaceSettings/components/PermissionError/NotAdminDialog.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { useNavigate } from 'react-router-dom'; 3 | 4 | import { DeletionDialog } from 'components/lib/components/Dialog/DeletionDialog/DeletionDialog'; 5 | 6 | const constants = { 7 | notAdminTitle: 'Access Forbidden', 8 | notAdminBtnLabel: 'Return', 9 | notAdminText: 'Your user does not have admin rights,\n please contact your admin to get permissions' 10 | }; 11 | 12 | const NotAdminDialog = () => { 13 | const navigate = useNavigate(); 14 | 15 | return ( 16 | navigate('/')} 20 | submitButtonLabel={constants.notAdminBtnLabel} 21 | closeDialog={() => navigate('/')} 22 | messageStart={constants.notAdminText} 23 | /> 24 | ); 25 | }; 26 | 27 | export default NotAdminDialog; 28 | -------------------------------------------------------------------------------- /frontend/src/components/WorkspaceSettings/useOrganizationMembers.tsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | 3 | import { useRetrieveOrganizationMembersApiV1OrganizationMembersGet } from 'api/generated'; 4 | 5 | export const useOrganizationMembers = () => { 6 | const { 7 | data: organizationMembers = [], 8 | isLoading: isOrganizationMembersLoading, 9 | refetch 10 | } = useRetrieveOrganizationMembersApiV1OrganizationMembersGet(); 11 | 12 | useEffect(() => { 13 | organizationMembers.length && setOrganizationMembersList(organizationMembers); 14 | }, [organizationMembers]); 15 | 16 | const [organizationMembersList, setOrganizationMembersList] = useState(organizationMembers); 17 | 18 | const refetchOrganizationMembers = () => refetch(); 19 | 20 | return { 21 | isOrganizationMembersLoading, 22 | refetchOrganizationMembers, 23 | organizationMembersList, 24 | setOrganizationMembersList 25 | }; 26 | }; 27 | -------------------------------------------------------------------------------- /frontend/src/components/base/Button/Button.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Button } from '@mui/material'; 3 | import { theme } from 'components/lib/theme'; 4 | 5 | interface ButtonProps { 6 | fontSize?: string; 7 | margin?: string; 8 | } 9 | 10 | const WhiteGrayButton = styled(Button)` 11 | && { 12 | background: ${theme.palette.grey[300]}; 13 | color: ${theme.palette.grey[300]}; 14 | margin: ${p => p.margin}; 15 | font-size: ${p => p.fontSize}; 16 | border: none; 17 | box-shadow: none; 18 | justify-content: center; 19 | 20 | :hover { 21 | background: ${theme.palette.grey[300]}; 22 | color: ${theme.palette.grey[300]}; 23 | box-shadow: none; 24 | } 25 | } 26 | `; 27 | 28 | export { WhiteGrayButton }; 29 | -------------------------------------------------------------------------------- /frontend/src/components/base/Button/MUIBaseButton.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import Button, { ButtonProps } from '@mui/material/Button'; 4 | 5 | interface MUIBaseButtonProps extends ButtonProps { 6 | children: React.ReactNode; 7 | } 8 | 9 | export const MUIBaseButton = ({ children, sx, ...props }: MUIBaseButtonProps) => ( 10 | 20 | ); 21 | -------------------------------------------------------------------------------- /frontend/src/components/base/DatePicker/DatePicker.style.ts: -------------------------------------------------------------------------------- 1 | import { Theme } from '@mui/material'; 2 | 3 | export const DesktopDatePickerStyle = { 4 | '& button': { 5 | backgroundColor: 'transparent', 6 | '& svg': { 7 | color: (theme: Theme) => theme.palette.text.primary 8 | } 9 | }, 10 | '& .MuiOutlinedInput-root button:hover': { 11 | background: 'rgba(157, 96, 251, 0.04)' 12 | } 13 | }; 14 | 15 | export const InputStyle = { 16 | width: 160, 17 | '& button': { 18 | backgroundColor: 'transparent', 19 | borderRadius: '50%', 20 | padding: '4px', 21 | '& svg': { 22 | color: (theme: Theme) => theme.palette.text.primary 23 | } 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /frontend/src/components/base/DatePicker/DatePicker.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { DesktopDatePicker } from '@mui/x-date-pickers'; 3 | import { Calendar } from '../../../assets/icon/icon'; 4 | import { DesktopDatePickerStyle, InputStyle } from './DatePicker.style'; 5 | 6 | // TODO - This Implementation relevant to @mui/x-date-pickers version ^5.0.0-beta.7, need to be replaced with the new one 7 | export function DatePicker({ ...props }: any) { 8 | return ( 9 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/components/base/DateRange/DateRange.style.tsx: -------------------------------------------------------------------------------- 1 | import { Box, styled } from '@mui/material'; 2 | import { theme } from 'components/lib/theme'; 3 | 4 | export const StyledButtonContainer = styled(Box)({ 5 | padding: '10px 0', 6 | display: 'flex', 7 | justifyContent: 'center', 8 | alignItems: 'center', 9 | borderTop: theme.palette.grey.light 10 | }); 11 | -------------------------------------------------------------------------------- /frontend/src/components/base/DateRange/index.ts: -------------------------------------------------------------------------------- 1 | export { DateRange } from './DateRange'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/base/Dialog/ActionDialog/ActionDialogHeader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { RowAutoGap } from '../../Container/Container.styles'; 4 | import { StyledH2 } from '../../Text/Header.styles'; 5 | import { StyledDialogCloseIconButton } from './ActionDialog.styles'; 6 | 7 | import { CloseIcon } from 'assets/icon/icon'; 8 | 9 | interface ActionDialogHeaderProps { 10 | title: string; 11 | onClose: () => void; 12 | } 13 | 14 | export const ActionDialogHeader = ({ title, onClose }: ActionDialogHeaderProps) => ( 15 | 16 | {title} 17 | 18 | 19 | 20 | 21 | ); 22 | -------------------------------------------------------------------------------- /frontend/src/components/base/Dialog/ActionDialog/DeleteActionDialog.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Typography, Box } from '@mui/material'; 4 | 5 | import ActionDialog, { ActionDialogProps } from 'components/base/Dialog/ActionDialog/ActionDialog'; 6 | 7 | interface DeleteActionDialogProps extends ActionDialogProps { 8 | messageStart: string; 9 | itemNameToDelete: string; 10 | messageEnd: string; 11 | } 12 | 13 | export const DeleteActionDialog = ({ 14 | messageStart, 15 | itemNameToDelete, 16 | messageEnd, 17 | ...props 18 | }: DeleteActionDialogProps) => ( 19 | 20 | 21 | 22 | {messageStart} 23 | 24 | {itemNameToDelete} 25 | 26 | {messageEnd} 27 | 28 | 29 | 30 | ); 31 | -------------------------------------------------------------------------------- /frontend/src/components/base/Input/Input.styles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Input } from '@mui/material'; 3 | import { theme } from 'components/lib/theme'; 4 | 5 | const StyledTextInput = styled(Input)` 6 | font-size: 1rem; 7 | width: 100%; 8 | border-radius: 16px; 9 | border: 1px solid ${theme.palette.grey[300]}; 10 | gap: 12px; 11 | padding: 8px 12px; 12 | `; 13 | 14 | export { StyledTextInput }; 15 | -------------------------------------------------------------------------------- /frontend/src/components/base/InputDropdown/InputDropdown.styles.tsx: -------------------------------------------------------------------------------- 1 | import { TextField, Typography, styled, Select, IconButton } from '@mui/material'; 2 | 3 | export const StyledLabel = styled(Typography)({ 4 | fontWeight: 600, 5 | textAlign: 'left', 6 | marginBottom: '8px' 7 | }); 8 | 9 | export const StyledTextfield = styled(TextField)({ 10 | '.MuiInputBase-root': { 11 | height: '52px', 12 | borderRadius: '5px' 13 | } 14 | }); 15 | 16 | export const StyledSelect = styled(Select)({ 17 | height: '52px', 18 | borderRadius: '5px' 19 | }); 20 | 21 | interface StyledIconButtonProps { 22 | active: boolean; 23 | } 24 | 25 | export const StyledIconButton = styled(IconButton, { 26 | shouldForwardProp: prop => prop !== 'active' 27 | })(({ active }) => ({ 28 | visibility: active ? 'visible' : 'hidden', 29 | display: active ? 'auto' : 'none', 30 | transform: 'translateX(-5px)', 31 | transition: 'opacity 0.3s', 32 | 33 | '&:hover': { 34 | background: 'transparent', 35 | opacity: 0.5 36 | } 37 | })); 38 | -------------------------------------------------------------------------------- /frontend/src/components/base/Loader/Loader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import CircularProgress from '@mui/material/CircularProgress'; 3 | import Box from '@mui/material/Box'; 4 | import { SxProps } from '@mui/system'; 5 | 6 | export type LoaderProps = { 7 | sx?: SxProps; 8 | }; 9 | 10 | export const Loader = ({ sx = {} }: LoaderProps) => ( 11 | 21 | 22 | 23 | ); 24 | -------------------------------------------------------------------------------- /frontend/src/components/base/MarkedSelect/index.ts: -------------------------------------------------------------------------------- 1 | export { MarkedSelect } from './MarkedSelect'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/base/RangePicker/RangePicker.style.tsx: -------------------------------------------------------------------------------- 1 | import { Stack, styled, Typography, TextField } from '@mui/material'; 2 | 3 | export const StyledInputsWrapper = styled(Stack)({ 4 | flexDirection: 'row', 5 | justifyContent: 'space-between', 6 | alignItems: 'center' 7 | }); 8 | 9 | export const StyledTextField = styled(TextField)({ 10 | '& .MuiOutlinedInput-input': { 11 | padding: '4px 8px', 12 | width: 85 13 | } 14 | }); 15 | 16 | export const StyledLabel = styled(Typography)(({ theme }) => ({ 17 | fontSize: 12, 18 | lineHeight: 1.57, 19 | letterSpacing: '0.1px', 20 | marginBottom: '10px', 21 | color: theme.palette.text.disabled 22 | })); 23 | -------------------------------------------------------------------------------- /frontend/src/components/base/RangePicker/index.ts: -------------------------------------------------------------------------------- 1 | export { RangePicker } from './RangePicker'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/base/Tooltip/Tooltip.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { styled } from '@mui/material/styles'; 3 | import Tooltip, { TooltipProps, tooltipClasses } from '@mui/material/Tooltip'; 4 | 5 | export const NoMaxWidthTooltip = styled(({ className, ...props }: TooltipProps) => ( 6 | 7 | ))({ 8 | [`& .${tooltipClasses.tooltip}`]: { 9 | maxWidth: 'none' 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/chart/select-all-checkbox-unchecked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/chart/select-all-checkbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/css/fonts.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Manrope:wght@500;700;800&family=Plus+Jakarta+Sans:wght@700&display=swap'); 2 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/severity/critical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/severity/high.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/severity/low.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/severity/medium.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/components/lib/assets/severity/purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/Container/CodeSnippet/CodeSnippet.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Prism } from 'react-syntax-highlighter'; 4 | import { materialDark } from 'react-syntax-highlighter/dist/cjs/styles/prism'; 5 | 6 | export interface CodeSnippetProps { 7 | code: string; 8 | width?: string; 9 | margin?: string; 10 | maxWidth?: string; 11 | } 12 | 13 | export const CodeSnippet = ({ code, maxWidth = '770px', width = '100%', margin = '24px 0 18px' }: CodeSnippetProps) => ( 14 | 29 | {code} 30 | 31 | ); 32 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/Container/ToolTip/ToolTip.styles.tsx: -------------------------------------------------------------------------------- 1 | import { Stack, styled } from '@mui/material'; 2 | 3 | export const StyledDescriptionsContainer = styled(Stack)({ 4 | marginBottom: '6px', 5 | alignItems: 'center' 6 | }); 7 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/DateTimePicker/DateTimePicker.utils.ts: -------------------------------------------------------------------------------- 1 | import dayjs, { Dayjs } from 'dayjs'; 2 | 3 | export function convertDate(date: Date | Dayjs | null) { 4 | return dayjs(date).format('llll'); 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/DateTimePicker/DropdownArrowComponent.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; 4 | import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp'; 5 | 6 | interface DropdownArrowComponentProps { 7 | isDropdownOpen: boolean; 8 | } 9 | 10 | export const DropdownArrowComponent = ({ isDropdownOpen }: DropdownArrowComponentProps) => 11 | isDropdownOpen ? : ; 12 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/Dialog/DeletionDialog/DeletionDialog.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | import { Dialog, DialogProps } from '../Dialog'; 4 | import { Text } from '../../Text/Text'; 5 | 6 | interface DeletionDialogProps extends DialogProps { 7 | messageStart?: string; 8 | itemToDelete?: string | number; 9 | messageEnd?: string; 10 | loading?: boolean; 11 | children?: ReactNode | ReactNode[]; 12 | } 13 | 14 | export const DeletionDialog = ({ 15 | messageStart, 16 | messageEnd, 17 | itemToDelete, 18 | loading, 19 | children, 20 | ...otherProps 21 | }: DeletionDialogProps) => { 22 | return ( 23 | 24 | 29 | {messageStart} {itemToDelete} {messageEnd} 30 | 31 | } 32 | /> 33 | {children} 34 | 35 | ); 36 | }; 37 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/Dialog/DialogBase.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { DialogProps, Dialog, DialogContent } from '@mui/material'; 4 | 5 | export const DialogBase = (props: DialogProps) => { 6 | const { open, children, sx, ...otherProps } = props; 7 | 8 | const handleKeyDown = (event: React.KeyboardEvent) => { 9 | if (event.key === 'Escape' && otherProps?.onClose) { 10 | otherProps?.onClose(event, 'escapeKeyDown'); 11 | } 12 | }; 13 | 14 | return ( 15 | 21 | {children} 22 | 23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/DistributionChart/DistributionChart.styles.tsx: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material'; 2 | import { Text } from '../Text/Text'; 3 | 4 | export const StyledTitleText = styled(Text)(({ theme }) => ({ 5 | display: 'flex', 6 | justifyContent: 'center', 7 | height: '20px', 8 | color: theme.palette.grey[600] 9 | })); 10 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/DoughnutChart/DoughnutChart.styles.tsx: -------------------------------------------------------------------------------- 1 | import { Box, styled } from '@mui/material'; 2 | 3 | export const StyledScoresBox = styled(Box)(({ theme }) => ({ 4 | display: 'flex', 5 | flexDirection: 'row', 6 | gap: '34px', 7 | justifyContent: 'center', 8 | margin: '16px auto', 9 | textAlign: 'center', 10 | 11 | '.MuiTypography-root': { color: theme.palette.grey[300] } 12 | })); 13 | 14 | export const StyledDoughnutChartContainer = styled(Box)({ 15 | position: 'relative' 16 | }); 17 | 18 | export const doughnutChartImageStyle: React.CSSProperties = { 19 | position: 'absolute', 20 | left: '0px', 21 | top: '200px', 22 | zIndex: '-1', 23 | cursor: 'pointer' 24 | }; 25 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/Loader/Loader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SxProps } from '@mui/system'; 4 | import CircularProgress from '@mui/material/CircularProgress'; 5 | import Box from '@mui/material/Box'; 6 | 7 | export type LoaderProps = { 8 | sx?: SxProps; 9 | }; 10 | 11 | export const Loader = ({ sx }: LoaderProps) => ( 12 | 22 | 23 | 24 | ); 25 | -------------------------------------------------------------------------------- /frontend/src/components/lib/components/Logo/Logo.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export interface LogoProps { 4 | withLabel?: boolean; 5 | margin?: string; 6 | width?: string; 7 | } 8 | 9 | export const Logo = (props: LogoProps) => { 10 | const { withLabel, margin = '8px' } = props; 11 | 12 | const logoWithoutLabel = require('../../assets/logo/logo.svg').default; 13 | const logoWithLabel = require('../../assets/logo/monitoring.svg').default; 14 | 15 | const imgWidth = withLabel ? '200px' : '40px'; 16 | 17 | const logoToUse = () => { 18 | switch (withLabel) { 19 | case true: 20 | return logoWithLabel; 21 | default: 22 | return logoWithoutLabel; 23 | } 24 | }; 25 | 26 | return logo; 27 | }; 28 | -------------------------------------------------------------------------------- /frontend/src/components/lib/theme/ThemeProvider.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | import { CssBaseline } from '@mui/material'; 4 | import { ThemeProvider as MUIThemeProvider } from '@mui/material/styles'; 5 | import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; 6 | import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; 7 | 8 | import { darkTheme, theme } from '.'; 9 | 10 | interface Props { 11 | children: ReactNode | ReactNode[]; 12 | darkMode?: boolean; 13 | } 14 | 15 | export const ThemeProvider = ({ children, darkMode }: Props) => { 16 | return ( 17 | 18 | 19 | {children} 20 | 21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /frontend/src/components/lib/theme/breakpoints.ts: -------------------------------------------------------------------------------- 1 | import { BreakpointsOptions } from '@mui/material'; 2 | 3 | export const breakpointOptions: BreakpointsOptions = { 4 | values: { 5 | xs: 600, 6 | sm: 900, 7 | md: 1200, 8 | lg: 1536, 9 | xl: 1900 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /frontend/src/components/lib/theme/index.tsx: -------------------------------------------------------------------------------- 1 | import { createTheme, Theme } from '@mui/material'; 2 | 3 | import { typographyOptions } from './typography'; 4 | import { darkModePalette, paletteOptions } from './palette'; 5 | import { breakpointOptions } from './breakpoints'; 6 | 7 | const theme: Theme = createTheme({ 8 | palette: paletteOptions, 9 | breakpoints: breakpointOptions, 10 | typography: typographyOptions 11 | }); 12 | 13 | const darkTheme: Theme = createTheme({ 14 | palette: darkModePalette, 15 | breakpoints: breakpointOptions, 16 | typography: typographyOptions 17 | }); 18 | 19 | export { theme, darkTheme }; 20 | -------------------------------------------------------------------------------- /frontend/src/helpers/base/alertFilters.ts: -------------------------------------------------------------------------------- 1 | import { handleSetParams } from 'helpers/utils/getParams'; 2 | 3 | export function getAlertFilters() { 4 | const urlSearchParams = new URLSearchParams(window.location.search); 5 | const params = Object.fromEntries(urlSearchParams.entries()); 6 | const modelId = +params?.modelId; 7 | const severity = params?.severity; 8 | const alertFilters = { models: [] as number[], severity: [] as string[] }; 9 | if (severity) alertFilters['severity'] = [severity]; 10 | if (modelId) alertFilters['models'] = [modelId]; 11 | return alertFilters; 12 | } 13 | 14 | export function resetAlertFilters(setAlertFilters: any) { 15 | setAlertFilters({ models: [], severity: [] }); 16 | handleSetParams('modelId'); 17 | handleSetParams('severity'); 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/helpers/base/conditionOperator.ts: -------------------------------------------------------------------------------- 1 | export const OperatorsEnumMap = { 2 | greater_than_equals: '>=', 3 | greater_than: '>', 4 | less_than_equals: '<=', 5 | less_than: '<', 6 | in: 'in', 7 | equals: '==', 8 | not_equals: '!=' 9 | } as const; 10 | -------------------------------------------------------------------------------- /frontend/src/helpers/base/groupParamsByKey.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-param-reassign */ 2 | export const groupParamsByKey = (params: URLSearchParams) => 3 | [...params.entries()].reduce((acc, tuple) => { 4 | const [key, val] = tuple; 5 | 6 | if (Object.prototype.hasOwnProperty.call(acc, key)) { 7 | if (Array.isArray(acc[key])) { 8 | acc[key] = [...acc[key], val]; 9 | } else { 10 | acc[key] = [acc[key] as string, val]; 11 | } 12 | } else { 13 | acc[key] = val; 14 | } 15 | 16 | return acc; 17 | }, {} as Record); 18 | -------------------------------------------------------------------------------- /frontend/src/helpers/base/severityColor.ts: -------------------------------------------------------------------------------- 1 | import { AlertSeverity } from 'api/generated'; 2 | import { theme } from 'components/lib/theme'; 3 | 4 | const { low, medium, high, critical } = AlertSeverity; 5 | 6 | export function severityColor(severity: AlertSeverity) { 7 | switch (severity) { 8 | case low: 9 | return theme.palette.severity.low; 10 | 11 | case medium: 12 | return theme.palette.severity.medium; 13 | 14 | case high: 15 | return theme.palette.severity.high; 16 | 17 | case critical: 18 | return theme.palette.severity.critical; 19 | 20 | default: 21 | return theme.palette.severity.critical; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /frontend/src/helpers/base/time.tsx: -------------------------------------------------------------------------------- 1 | export const timeValues = { 2 | hour: 60 * 60, 3 | day: 60 * 60 * 24, 4 | week: 60 * 60 * 24 * 7, 5 | month: 60 * 60 * 24 * 30, 6 | threeMonths: 60 * 60 * 24 * 30 * 3, 7 | year: 60 * 60 * 24 * 30 * 12 8 | }; 9 | 10 | export const timeMap = { 11 | day: timeValues.day * 1000, 12 | week: timeValues.week * 1000, 13 | month: timeValues.month * 1000, 14 | year: timeValues.year * 1000 15 | }; 16 | 17 | export const ONE_MINUTE = 60000; 18 | export const THIRTY_SECONDS = 30000; 19 | -------------------------------------------------------------------------------- /frontend/src/helpers/context/GlobalProvider.tsx: -------------------------------------------------------------------------------- 1 | import React, { createContext, FC, useContext } from 'react'; 2 | 3 | import { PathInfo, pathsInfo } from 'helpers/routes'; 4 | 5 | export interface IContext { 6 | dashboard_id: number; 7 | models?: []; 8 | monitors?: []; 9 | currMonitor?: null; 10 | isLoggedIn: boolean; 11 | pathsInfo: PathInfo[]; 12 | flags: { [key: string]: boolean }; 13 | } 14 | 15 | const initialValue: IContext = { 16 | dashboard_id: 1, 17 | isLoggedIn: false, 18 | pathsInfo: [], 19 | flags: {} 20 | }; 21 | 22 | export const GlobalStateContext = createContext(initialValue); 23 | 24 | export const GlobalStateProvider: FC<{ children: JSX.Element }> = ({ children }) => ( 25 | 31 | {children} 32 | 33 | ); 34 | 35 | const useGlobalState = () => useContext(GlobalStateContext); 36 | export default useGlobalState; 37 | -------------------------------------------------------------------------------- /frontend/src/helpers/hooks/useDebounce.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | 3 | export function useDebounce(value: T, delay = 500): T { 4 | const [debouncedValue, setDebouncedValue] = useState(value); 5 | 6 | useEffect(() => { 7 | const handler = setTimeout(() => { 8 | setDebouncedValue(value); 9 | }, delay); 10 | 11 | return () => { 12 | clearTimeout(handler); 13 | }; 14 | }, [value, delay]); 15 | 16 | return debouncedValue; 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/helpers/hooks/useElementOnScreen.ts: -------------------------------------------------------------------------------- 1 | import { useRef, useState, useEffect } from 'react'; 2 | 3 | const defaultObserverOptions: IntersectionObserverInit = { 4 | root: null, 5 | rootMargin: '0px', 6 | threshold: 0 7 | }; 8 | 9 | export const useElementOnScreen = (options = defaultObserverOptions) => { 10 | const [isVisible, setIsVisible] = useState(false); 11 | 12 | const observedContainerRef = useRef(null); 13 | 14 | const callback = (entries: IntersectionObserverEntry[]) => { 15 | const [entry] = entries; 16 | if (entry.isIntersecting) setIsVisible(true); 17 | }; 18 | 19 | useEffect(() => { 20 | const observer = new IntersectionObserver(callback, options); 21 | const currentRef = observedContainerRef.current; 22 | 23 | if (currentRef) observer.observe(currentRef); 24 | 25 | return () => { 26 | if (currentRef) observer.unobserve(currentRef); 27 | }; 28 | }, [observedContainerRef, options]); 29 | 30 | return { observedContainerRef, isVisible }; 31 | }; 32 | -------------------------------------------------------------------------------- /frontend/src/helpers/hooks/useListSearchField.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | 3 | export function useListSearchField( 4 | initialList: T[], 5 | setList: React.Dispatch>, 6 | searchBy: keyof T 7 | ) { 8 | const [searchFieldValue, setSearchFieldValue] = useState(''); 9 | 10 | const handleSearchFieldChange = (event: React.ChangeEvent) => { 11 | const { value } = event.target; 12 | 13 | setSearchFieldValue(value); 14 | setList( 15 | initialList.filter(model => 16 | (model[searchBy] as unknown as string)?.toLowerCase().includes(value.trim().toLowerCase()) 17 | ) 18 | ); 19 | }; 20 | 21 | const resetSearchField = () => { 22 | setSearchFieldValue(''); 23 | setList(initialList); 24 | }; 25 | 26 | return { searchFieldValue, handleSearchFieldChange, resetSearchField }; 27 | } 28 | -------------------------------------------------------------------------------- /frontend/src/helpers/hooks/useRunCheckLookback.ts: -------------------------------------------------------------------------------- 1 | import { useRunStandaloneCheckPerWindowInRangeApiV1ChecksCheckIdRunLookbackPost } from 'api/generated'; 2 | 3 | import { parseDataForBarChart, parseDataForLineChart } from 'helpers/utils/parseDataForChart'; 4 | 5 | export const useRunCheckLookback = (type: 'line' | 'bar' = 'line') => { 6 | const checkRun = useRunStandaloneCheckPerWindowInRangeApiV1ChecksCheckIdRunLookbackPost(); 7 | 8 | const chartData = () => { 9 | if (checkRun && checkRun.data) { 10 | if (type === 'line') { 11 | return parseDataForLineChart(checkRun.data); 12 | } 13 | 14 | if (type === 'bar') { 15 | return parseDataForBarChart(checkRun.data); 16 | } 17 | } 18 | 19 | return { datasets: [], labels: [] }; 20 | }; 21 | 22 | return { chartData, ...checkRun }; 23 | }; 24 | -------------------------------------------------------------------------------- /frontend/src/helpers/hooks/useRunMonitorLookback.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useRunMonitorLookbackApiV1MonitorsMonitorIdRunPost, ModelManagmentSchema } from 'api/generated'; 3 | 4 | const useRunMonitorLookback = (monitorId: number | null, currentModel: ModelManagmentSchema | null) => { 5 | const { mutateAsync } = useRunMonitorLookbackApiV1MonitorsMonitorIdRunPost(); 6 | 7 | useEffect(() => { 8 | if (!currentModel || !monitorId) return; 9 | 10 | const end_time = currentModel.latest_time ? new Date(currentModel.latest_time * 1000).toISOString() : ''; 11 | mutateAsync({ monitorId, data: { end_time } }); 12 | }, [currentModel, monitorId, mutateAsync]); 13 | }; 14 | 15 | export default useRunMonitorLookback; 16 | -------------------------------------------------------------------------------- /frontend/src/helpers/hooks/windowResize.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | 3 | function useWindowResize() { 4 | const [windowResize, setWindowResize] = useState(window.innerWidth); 5 | useEffect(() => { 6 | const handleResize = () => setWindowResize(window.innerWidth); 7 | window.addEventListener('resize', handleResize); 8 | return () => { 9 | window.removeEventListener('resize', handleResize); 10 | }; 11 | }, [windowResize]); 12 | 13 | return windowResize; 14 | } 15 | 16 | export default useWindowResize; 17 | -------------------------------------------------------------------------------- /frontend/src/helpers/services/logger.ts: -------------------------------------------------------------------------------- 1 | import pino from 'pino'; 2 | 3 | const logger = (() => 4 | pino({ 5 | level: 'silent', 6 | browser: { 7 | asObject: true, 8 | transmit: { 9 | level: 'debug', 10 | send: async (level: pino.Level, logEvent: pino.LogEvent) => { 11 | const { messages } = logEvent; 12 | const translatedLevel = level === 'fatal' ? 'error' : level; 13 | const isDebug = window.location.host.includes('local'); 14 | 15 | if (isDebug) { 16 | console[translatedLevel](...messages); 17 | } 18 | } 19 | } 20 | } 21 | }))(); 22 | 23 | export default logger; 24 | -------------------------------------------------------------------------------- /frontend/src/helpers/services/mixPanel.ts: -------------------------------------------------------------------------------- 1 | import mixpanel from 'mixpanel-browser'; 2 | 3 | import { getStorageItem, storageKeys } from 'helpers/utils/localStorage'; 4 | 5 | export const reportEvent = (eventName: string, eventData?: { [param: string]: any }) => { 6 | const superProperties = getStorageItem(storageKeys.user); 7 | 8 | mixpanel.track(eventName, { ...eventData, ...superProperties }); 9 | }; 10 | 11 | export const events = { 12 | onBoarding: { 13 | onboarding: 'onboarding' 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /frontend/src/helpers/types/alert.ts: -------------------------------------------------------------------------------- 1 | import { ID } from '.'; 2 | 3 | export type Criticality = 'low' | 'medium' | 'high' | 'critical'; 4 | 5 | export type SortBy = 'severity:asc' | 'severity:sesc' | 'alert-window: asc' | 'alert-window:desc'; 6 | 7 | export interface Alert { 8 | id: ID; 9 | alert_rule_id: ID; 10 | failed_values: { 11 | [key: string]: string[]; 12 | }; 13 | start_time: Date | string; 14 | end_time: Date | string; 15 | resolved: boolean; 16 | created_at: Date | string; 17 | } 18 | 19 | export interface AlertRule { 20 | id: ID; 21 | name: string; 22 | monitor_id: ID; 23 | repeat_every: number; 24 | condition: { 25 | operator: 'greater_than_equals'; 26 | value: 0; 27 | }; 28 | alert_severity: Criticality; 29 | alerts_count: 0; 30 | } 31 | 32 | export interface AlertRulesParams { 33 | start?: Date | string; 34 | end?: Date | string; 35 | models?: number; 36 | severity?: Criticality; 37 | sortby?: SortBy; 38 | } 39 | 40 | export type AlertsCount = { 41 | [key in Criticality]: number; 42 | }; 43 | -------------------------------------------------------------------------------- /frontend/src/helpers/types/check.ts: -------------------------------------------------------------------------------- 1 | import { ID, Filter } from '.'; 2 | 3 | export interface Check { 4 | config: { 5 | class_name: string; 6 | module_name: string; 7 | params: object; 8 | }; 9 | model_id: number; 10 | id: ID; 11 | name?: string; 12 | } 13 | 14 | export interface RunCheckRequest { 15 | start_time: Date | string; 16 | end_time: Date | string; 17 | filter?: { 18 | filters: Filter[]; 19 | }; 20 | } 21 | 22 | export enum CheckTypeOptions { 23 | Feature = 'Feature', 24 | Class = 'Class' 25 | } 26 | 27 | export type CheckType = CheckTypeOptions.Feature | CheckTypeOptions.Class | null; 28 | -------------------------------------------------------------------------------- /frontend/src/helpers/types/index.ts: -------------------------------------------------------------------------------- 1 | export type ID = number | string; 2 | 3 | export interface Filter { 4 | column: string; 5 | operator: string; 6 | value: string | number; 7 | } 8 | 9 | export interface ChartResponse { 10 | output: { 11 | [key: string]: { [key: string]: number | null }[]; 12 | }; 13 | time_labels: string[]; 14 | } 15 | 16 | export type GraphData = (number | null)[] | string[] | { x: string; y: number }[] | { x: number; y: number }[]; 17 | 18 | export type WindowTimeout = ReturnType; 19 | export type WindowInterval = ReturnType; 20 | 21 | export type SetStateType = React.Dispatch>; 22 | 23 | export type SelectValues = string | number | undefined; 24 | -------------------------------------------------------------------------------- /frontend/src/helpers/types/monitor.ts: -------------------------------------------------------------------------------- 1 | import { ID, Filter } from '.'; 2 | 3 | export interface Monitor { 4 | id: ID; 5 | name: string; 6 | check: { 7 | config: { 8 | class_name: string; 9 | module_name: string; 10 | params: { 11 | reduce: string; 12 | }; 13 | }; 14 | model_id: number; 15 | id: number; 16 | name: string; 17 | }; 18 | lookback: number; 19 | description?: string; 20 | dashboard_id: number; 21 | data_filters: { 22 | filters: Filter[]; 23 | }; 24 | } 25 | 26 | export interface MonitorRequest { 27 | name: string; 28 | lookback: number; 29 | description?: string; 30 | data_filter?: { 31 | filters: Filter[]; 32 | }; 33 | dashboard_id?: number; 34 | } 35 | 36 | export interface DashboardType { 37 | id: ID; 38 | name: string; 39 | monitors: Monitor[]; 40 | } 41 | -------------------------------------------------------------------------------- /frontend/src/helpers/types/resError.ts: -------------------------------------------------------------------------------- 1 | export interface resError { 2 | error_message: string; 3 | additional_information?: { [key: string]: any }; 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/helpers/utils/arrDictConverter.ts: -------------------------------------------------------------------------------- 1 | export const convertDictionaryToArray = (dictionary: Record): any[] => { 2 | const headers: any[] = []; 3 | for (const [name, value] of Object.entries(dictionary)) { 4 | name !== '' && headers.push({ name, value }); 5 | } 6 | return headers; 7 | }; 8 | 9 | export const convertArrayToDictionary = (headers: any): Record => { 10 | const dictionary: Record = {}; 11 | headers.forEach((header: any) => { 12 | const { name, value } = header; 13 | dictionary[name] = value; 14 | }); 15 | return dictionary; 16 | }; 17 | -------------------------------------------------------------------------------- /frontend/src/helpers/utils/capitalizeFirstChar.ts: -------------------------------------------------------------------------------- 1 | export function capitalizeFirstChar(str: string) { 2 | return str.charAt(0).toUpperCase() + str.slice(1); 3 | } 4 | -------------------------------------------------------------------------------- /frontend/src/helpers/utils/frequency.ts: -------------------------------------------------------------------------------- 1 | import { Frequency } from 'api/generated'; 2 | 3 | export const frequencyValues = { 4 | HOUR: 3600, 5 | DAY: 86400, 6 | WEEK: 604800, 7 | MONTH: 2592000 8 | }; 9 | 10 | export const FrequencyMap = { 11 | [Frequency.HOUR]: 3600, 12 | [Frequency.DAY]: 86400, 13 | [Frequency.WEEK]: 604800, 14 | [Frequency.MONTH]: 2592000 15 | } as const; 16 | 17 | export const FrequencyNumberMap = { 18 | 3600: Frequency.HOUR, 19 | 86400: Frequency.DAY, 20 | 604800: Frequency.WEEK, 21 | 2592000: Frequency.MONTH 22 | } as const; 23 | 24 | export interface FrequencyNumberType { 25 | type: 3600 | 86400 | 604800 | 2592000; 26 | } 27 | -------------------------------------------------------------------------------- /frontend/src/helpers/utils/localStorage.ts: -------------------------------------------------------------------------------- 1 | export const storageKeys = { 2 | dataIngestionTimeFilter: 'data_ingestion_time_filter', 3 | analysisFrequency: 'analysis_frequency', 4 | analysisPeriod: 'analysis_period', 5 | environment: 'environment', 6 | user: 'user', 7 | loggedIn: 'logged_in', 8 | is_onboarding: 'is_onboarding' 9 | }; 10 | 11 | export const getStorageItem = (key: string) => { 12 | const item = localStorage.getItem(key); 13 | return item ? JSON.parse(item) : null; 14 | }; 15 | 16 | export const setStorageItem = (key: string, value: T) => { 17 | localStorage.setItem(key, JSON.stringify(value)); 18 | }; 19 | 20 | export const removeStorageItem = (key: string) => { 21 | localStorage.removeItem(key); 22 | }; 23 | -------------------------------------------------------------------------------- /frontend/src/helpers/utils/mapToOptionsList.ts: -------------------------------------------------------------------------------- 1 | import { sentenceCase } from 'change-case'; 2 | 3 | const mapToOptionsList = (map: Record, valuesToFilter?: string[] | undefined) => 4 | Object.entries(map) 5 | .filter(([label]) => !valuesToFilter || !valuesToFilter.includes(label)) 6 | .map(([label, value]) => ({ 7 | label: sentenceCase(label), 8 | value 9 | })); 10 | 11 | export default mapToOptionsList; 12 | -------------------------------------------------------------------------------- /frontend/src/helpers/utils/truncateString.ts: -------------------------------------------------------------------------------- 1 | export function truncateString(str: string, limit: number) { 2 | return str.slice(0, limit) + '...'; 3 | } 4 | -------------------------------------------------------------------------------- /frontend/src/helpers/utils/validateEmail.ts: -------------------------------------------------------------------------------- 1 | // taken from: https://stackoverflow.com/questions/46155/how-can-i-validate-an-email-address-in-javascript 2 | export const validateEmail = (email: string) => 3 | /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test( 4 | email 5 | ); 6 | -------------------------------------------------------------------------------- /frontend/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | 4 | import App from './App'; 5 | 6 | const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); 7 | 8 | root.render(); 9 | -------------------------------------------------------------------------------- /frontend/src/pages/APIKeyPage.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { APIKey } from 'components/APIKey'; 4 | import { StyledText } from 'components/lib'; 5 | 6 | export const APIKeyPage = function () { 7 | return ( 8 | <> 9 | 10 | 11 | 12 | ); 13 | }; 14 | 15 | export default APIKeyPage; 16 | -------------------------------------------------------------------------------- /frontend/src/pages/IntegrationsPage.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import Integrations from 'components/Integrations/Integrations'; 4 | 5 | const IntegrationsPage = () => ; 6 | 7 | export default IntegrationsPage; 8 | -------------------------------------------------------------------------------- /frontend/src/pages/NotFoundPage.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import NotFound from 'components/NotFound/NotFound'; 4 | 5 | const NotFoundPage = () => ; 6 | 7 | export default NotFoundPage; 8 | -------------------------------------------------------------------------------- /frontend/src/pages/OnBoardingPage.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import FirstOnBoarding from 'components/OnBoarding/components/FirstOnBoarding'; 4 | 5 | const OnBoardingPage = () => { 6 | return ; 7 | }; 8 | 9 | export default OnBoardingPage; 10 | -------------------------------------------------------------------------------- /frontend/src/pages/WorkspaceSettingsPage.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import WorkspaceSettings from 'components/WorkspaceSettings/WorkspaceSettings'; 4 | 5 | const WorkspaceSettingsPage = () => ; 6 | 7 | export default WorkspaceSettingsPage; 8 | -------------------------------------------------------------------------------- /frontend/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES6", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx", 18 | "baseUrl": "./src" 19 | }, 20 | "include": ["src"] 21 | } 22 | -------------------------------------------------------------------------------- /security_scan.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | brew list aquasecurity/trivy/trivy || brew install aquasecurity/trivy/trivy 3 | docker build -t deepchecks/mon . 4 | trivy image --scanners vuln --severity CRITICAL,HIGH,MEDIUM --ignore-unfixed deepchecks/mon --------------------------------------------------------------------------------