├── .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 |
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 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/arow.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/arrowDropDown.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/bell.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/calendar.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/check.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/clear.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/close.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/collapseArrowLeft.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/collapseArrowRight.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/download.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/email.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/fastForward.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/fileUpload.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/graphLegendCurrent.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/graphLegendPrevious.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/graphReport.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/info.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/infoIcon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/infoIconFilled.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/markedMail.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/nativePlus.svg:
--------------------------------------------------------------------------------
1 |
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 |
7 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/rewind.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/rotate.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/search.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/severity/critical.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/severity/high.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/severity/low.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/severity/medium.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/sort.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/tableChart.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/trash.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/undo.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/frontend/src/assets/icon/visualModel.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/frontend/src/assets/integrations/mail.svg:
--------------------------------------------------------------------------------
1 |
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 | } onClick={handleOpenSortMenu} disabled={isLoading} sx={{ minHeight: 30 }}>
15 | {label}
16 |
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 |
12 | {value === index && {children}}
13 |
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 |
6 |
--------------------------------------------------------------------------------
/frontend/src/components/lib/assets/chart/select-all-checkbox.svg:
--------------------------------------------------------------------------------
1 |
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 |
7 |
--------------------------------------------------------------------------------
/frontend/src/components/lib/assets/severity/high.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/frontend/src/components/lib/assets/severity/low.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/frontend/src/components/lib/assets/severity/medium.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/frontend/src/components/lib/assets/severity/purple.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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
;
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
--------------------------------------------------------------------------------